]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - opcodes/i386-dis.c
x86: drop (explicit) BFD64 dependency from disassembler
[thirdparty/binutils-gdb.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2023 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 typedef struct instr_info instr_info;
43
44 static bool dofloat (instr_info *, int);
45 static int putop (instr_info *, const char *, int);
46 static void oappend_with_style (instr_info *, const char *,
47 enum disassembler_style);
48 static void oappend (instr_info *, const char *);
49 static void append_seg (instr_info *);
50 static bool get32s (instr_info *, bfd_signed_vma *);
51 static bool get16 (instr_info *, int *);
52 static void set_op (instr_info *, bfd_vma, bool);
53
54 static bool OP_E (instr_info *, int, int);
55 static bool OP_E_memory (instr_info *, int, int);
56 static bool OP_indirE (instr_info *, int, int);
57 static bool OP_G (instr_info *, int, int);
58 static bool OP_ST (instr_info *, int, int);
59 static bool OP_STi (instr_info *, int, int);
60 static bool OP_Skip_MODRM (instr_info *, int, int);
61 static bool OP_REG (instr_info *, int, int);
62 static bool OP_IMREG (instr_info *, int, int);
63 static bool OP_I (instr_info *, int, int);
64 static bool OP_I64 (instr_info *, int, int);
65 static bool OP_sI (instr_info *, int, int);
66 static bool OP_J (instr_info *, int, int);
67 static bool OP_SEG (instr_info *, int, int);
68 static bool OP_DIR (instr_info *, int, int);
69 static bool OP_OFF (instr_info *, int, int);
70 static bool OP_OFF64 (instr_info *, int, int);
71 static bool OP_ESreg (instr_info *, int, int);
72 static bool OP_DSreg (instr_info *, int, int);
73 static bool OP_C (instr_info *, int, int);
74 static bool OP_D (instr_info *, int, int);
75 static bool OP_T (instr_info *, int, int);
76 static bool OP_MMX (instr_info *, int, int);
77 static bool OP_XMM (instr_info *, int, int);
78 static bool OP_EM (instr_info *, int, int);
79 static bool OP_EX (instr_info *, int, int);
80 static bool OP_EMC (instr_info *, int,int);
81 static bool OP_MXC (instr_info *, int,int);
82 static bool OP_MS (instr_info *, int, int);
83 static bool OP_XS (instr_info *, int, int);
84 static bool OP_M (instr_info *, int, int);
85 static bool OP_VEX (instr_info *, int, int);
86 static bool OP_VexR (instr_info *, int, int);
87 static bool OP_VexW (instr_info *, int, int);
88 static bool OP_Rounding (instr_info *, int, int);
89 static bool OP_REG_VexI4 (instr_info *, int, int);
90 static bool OP_VexI4 (instr_info *, int, int);
91 static bool OP_0f07 (instr_info *, int, int);
92 static bool OP_Monitor (instr_info *, int, int);
93 static bool OP_Mwait (instr_info *, int, int);
94
95 static bool BadOp (instr_info *);
96
97 static bool PCLMUL_Fixup (instr_info *, int, int);
98 static bool VPCMP_Fixup (instr_info *, int, int);
99 static bool VPCOM_Fixup (instr_info *, int, int);
100 static bool NOP_Fixup (instr_info *, int, int);
101 static bool OP_3DNowSuffix (instr_info *, int, int);
102 static bool CMP_Fixup (instr_info *, int, int);
103 static bool REP_Fixup (instr_info *, int, int);
104 static bool SEP_Fixup (instr_info *, int, int);
105 static bool BND_Fixup (instr_info *, int, int);
106 static bool NOTRACK_Fixup (instr_info *, int, int);
107 static bool HLE_Fixup1 (instr_info *, int, int);
108 static bool HLE_Fixup2 (instr_info *, int, int);
109 static bool HLE_Fixup3 (instr_info *, int, int);
110 static bool CMPXCHG8B_Fixup (instr_info *, int, int);
111 static bool XMM_Fixup (instr_info *, int, int);
112 static bool FXSAVE_Fixup (instr_info *, int, int);
113 static bool MOVSXD_Fixup (instr_info *, int, int);
114 static bool DistinctDest_Fixup (instr_info *, int, int);
115 static bool PREFETCHI_Fixup (instr_info *, int, int);
116
117 static void ATTRIBUTE_PRINTF_3 i386_dis_printf (const instr_info *,
118 enum disassembler_style,
119 const char *, ...);
120 static const char *prefix_name (const instr_info *, int, int);
121
122 /* This character is used to encode style information within the output
123 buffers. See oappend_insert_style for more details. */
124 #define STYLE_MARKER_CHAR '\002'
125
126 /* The maximum operand buffer size. */
127 #define MAX_OPERAND_BUFFER_SIZE 128
128
129 struct dis_private {
130 /* Points to first byte not fetched. */
131 bfd_byte *max_fetched;
132 bfd_byte the_buffer[MAX_MNEM_SIZE];
133 bfd_vma insn_start;
134 int orig_sizeflag;
135 };
136
137 enum address_mode
138 {
139 mode_16bit,
140 mode_32bit,
141 mode_64bit
142 };
143
144 enum x86_64_isa
145 {
146 amd64 = 1,
147 intel64
148 };
149
150 struct instr_info
151 {
152 enum address_mode address_mode;
153
154 /* Flags for the prefixes for the current instruction. See below. */
155 int prefixes;
156
157 /* REX prefix the current instruction. See below. */
158 unsigned char rex;
159 /* Bits of REX we've already used. */
160 unsigned char rex_used;
161
162 bool need_modrm;
163 bool need_vex;
164 bool has_sib;
165
166 /* Flags for ins->prefixes which we somehow handled when printing the
167 current instruction. */
168 int used_prefixes;
169
170 /* Flags for EVEX bits which we somehow handled when printing the
171 current instruction. */
172 int evex_used;
173
174 char obuf[MAX_OPERAND_BUFFER_SIZE];
175 char *obufp;
176 char *mnemonicendp;
177 unsigned char *start_codep;
178 unsigned char *insn_codep;
179 unsigned char *codep;
180 unsigned char *end_codep;
181 signed char last_lock_prefix;
182 signed char last_repz_prefix;
183 signed char last_repnz_prefix;
184 signed char last_data_prefix;
185 signed char last_addr_prefix;
186 signed char last_rex_prefix;
187 signed char last_seg_prefix;
188 signed char fwait_prefix;
189 /* The active segment register prefix. */
190 unsigned char active_seg_prefix;
191
192 #define MAX_CODE_LENGTH 15
193 /* We can up to 14 ins->prefixes since the maximum instruction length is
194 15bytes. */
195 unsigned char all_prefixes[MAX_CODE_LENGTH - 1];
196 disassemble_info *info;
197
198 struct
199 {
200 int mod;
201 int reg;
202 int rm;
203 }
204 modrm;
205
206 struct
207 {
208 int scale;
209 int index;
210 int base;
211 }
212 sib;
213
214 struct
215 {
216 int register_specifier;
217 int length;
218 int prefix;
219 int mask_register_specifier;
220 int ll;
221 bool w;
222 bool evex;
223 bool r;
224 bool v;
225 bool zeroing;
226 bool b;
227 bool no_broadcast;
228 }
229 vex;
230
231 /* Remember if the current op is a jump instruction. */
232 bool op_is_jump;
233
234 bool two_source_ops;
235
236 unsigned char op_ad;
237 signed char op_index[MAX_OPERANDS];
238 bool op_riprel[MAX_OPERANDS];
239 char *op_out[MAX_OPERANDS];
240 bfd_vma op_address[MAX_OPERANDS];
241 bfd_vma start_pc;
242
243 /* On the 386's of 1988, the maximum length of an instruction is 15 bytes.
244 * (see topic "Redundant ins->prefixes" in the "Differences from 8086"
245 * section of the "Virtual 8086 Mode" chapter.)
246 * 'pc' should be the address of this instruction, it will
247 * be used to print the target address if this is a relative jump or call
248 * The function returns the length of this instruction in bytes.
249 */
250 char intel_syntax;
251 bool intel_mnemonic;
252 char open_char;
253 char close_char;
254 char separator_char;
255 char scale_char;
256
257 enum x86_64_isa isa64;
258 };
259
260 /* Mark parts used in the REX prefix. When we are testing for
261 empty prefix (for 8bit register REX extension), just mask it
262 out. Otherwise test for REX bit is excuse for existence of REX
263 only in case value is nonzero. */
264 #define USED_REX(value) \
265 { \
266 if (value) \
267 { \
268 if ((ins->rex & value)) \
269 ins->rex_used |= (value) | REX_OPCODE; \
270 } \
271 else \
272 ins->rex_used |= REX_OPCODE; \
273 }
274
275
276 #define EVEX_b_used 1
277 #define EVEX_len_used 2
278
279 /* Flags stored in PREFIXES. */
280 #define PREFIX_REPZ 1
281 #define PREFIX_REPNZ 2
282 #define PREFIX_CS 4
283 #define PREFIX_SS 8
284 #define PREFIX_DS 0x10
285 #define PREFIX_ES 0x20
286 #define PREFIX_FS 0x40
287 #define PREFIX_GS 0x80
288 #define PREFIX_LOCK 0x100
289 #define PREFIX_DATA 0x200
290 #define PREFIX_ADDR 0x400
291 #define PREFIX_FWAIT 0x800
292
293 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
294 to ADDR (exclusive) are valid. Returns true for success, false
295 on error. */
296 static bool
297 fetch_code (struct disassemble_info *info, bfd_byte *until)
298 {
299 int status = -1;
300 struct dis_private *priv = info->private_data;
301 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
302
303 if (until <= priv->max_fetched)
304 return true;
305
306 if (until <= priv->the_buffer + MAX_MNEM_SIZE)
307 status = (*info->read_memory_func) (start,
308 priv->max_fetched,
309 until - priv->max_fetched,
310 info);
311 if (status != 0)
312 {
313 /* If we did manage to read at least one byte, then
314 print_insn_i386 will do something sensible. Otherwise, print
315 an error. We do that here because this is where we know
316 STATUS. */
317 if (priv->max_fetched == priv->the_buffer)
318 (*info->memory_error_func) (status, start, info);
319 return false;
320 }
321
322 priv->max_fetched = until;
323 return true;
324 }
325
326 static bool
327 fetch_modrm (instr_info *ins)
328 {
329 if (!fetch_code (ins->info, ins->codep + 1))
330 return false;
331
332 ins->modrm.mod = (*ins->codep >> 6) & 3;
333 ins->modrm.reg = (*ins->codep >> 3) & 7;
334 ins->modrm.rm = *ins->codep & 7;
335
336 return true;
337 }
338
339 static int
340 fetch_error (const instr_info *ins)
341 {
342 /* Getting here means we tried for data but didn't get it. That
343 means we have an incomplete instruction of some sort. Just
344 print the first byte as a prefix or a .byte pseudo-op. */
345 const struct dis_private *priv = ins->info->private_data;
346 const char *name = NULL;
347
348 if (ins->codep <= priv->the_buffer)
349 return -1;
350
351 if (ins->prefixes || ins->fwait_prefix >= 0 || (ins->rex & REX_OPCODE))
352 name = prefix_name (ins, priv->the_buffer[0], priv->orig_sizeflag);
353 if (name != NULL)
354 i386_dis_printf (ins, dis_style_mnemonic, "%s", name);
355 else
356 {
357 /* Just print the first byte as a .byte instruction. */
358 i386_dis_printf (ins, dis_style_assembler_directive, ".byte ");
359 i386_dis_printf (ins, dis_style_immediate, "%#x",
360 (unsigned int) priv->the_buffer[0]);
361 }
362
363 return 1;
364 }
365
366 /* Possible values for prefix requirement. */
367 #define PREFIX_IGNORED_SHIFT 16
368 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
369 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
370 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
371 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
372 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
373
374 /* Opcode prefixes. */
375 #define PREFIX_OPCODE (PREFIX_REPZ \
376 | PREFIX_REPNZ \
377 | PREFIX_DATA)
378
379 /* Prefixes ignored. */
380 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
381 | PREFIX_IGNORED_REPNZ \
382 | PREFIX_IGNORED_DATA)
383
384 #define XX { NULL, 0 }
385 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
386
387 #define Eb { OP_E, b_mode }
388 #define Ebnd { OP_E, bnd_mode }
389 #define EbS { OP_E, b_swap_mode }
390 #define EbndS { OP_E, bnd_swap_mode }
391 #define Ev { OP_E, v_mode }
392 #define Eva { OP_E, va_mode }
393 #define Ev_bnd { OP_E, v_bnd_mode }
394 #define EvS { OP_E, v_swap_mode }
395 #define Ed { OP_E, d_mode }
396 #define Edq { OP_E, dq_mode }
397 #define Edb { OP_E, db_mode }
398 #define Edw { OP_E, dw_mode }
399 #define Eq { OP_E, q_mode }
400 #define indirEv { OP_indirE, indir_v_mode }
401 #define indirEp { OP_indirE, f_mode }
402 #define stackEv { OP_E, stack_v_mode }
403 #define Em { OP_E, m_mode }
404 #define Ew { OP_E, w_mode }
405 #define M { OP_M, 0 } /* lea, lgdt, etc. */
406 #define Ma { OP_M, a_mode }
407 #define Mb { OP_M, b_mode }
408 #define Md { OP_M, d_mode }
409 #define Mdq { OP_M, dq_mode }
410 #define Mo { OP_M, o_mode }
411 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
412 #define Mq { OP_M, q_mode }
413 #define Mv { OP_M, v_mode }
414 #define Mv_bnd { OP_M, v_bndmk_mode }
415 #define Mw { OP_M, w_mode }
416 #define Mx { OP_M, x_mode }
417 #define Mxmm { OP_M, xmm_mode }
418 #define Gb { OP_G, b_mode }
419 #define Gbnd { OP_G, bnd_mode }
420 #define Gv { OP_G, v_mode }
421 #define Gd { OP_G, d_mode }
422 #define Gdq { OP_G, dq_mode }
423 #define Gm { OP_G, m_mode }
424 #define Gva { OP_G, va_mode }
425 #define Gw { OP_G, w_mode }
426 #define Ib { OP_I, b_mode }
427 #define sIb { OP_sI, b_mode } /* sign extened byte */
428 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
429 #define Iv { OP_I, v_mode }
430 #define sIv { OP_sI, v_mode }
431 #define Iv64 { OP_I64, v_mode }
432 #define Id { OP_I, d_mode }
433 #define Iw { OP_I, w_mode }
434 #define I1 { OP_I, const_1_mode }
435 #define Jb { OP_J, b_mode }
436 #define Jv { OP_J, v_mode }
437 #define Jdqw { OP_J, dqw_mode }
438 #define Cm { OP_C, m_mode }
439 #define Dm { OP_D, m_mode }
440 #define Td { OP_T, d_mode }
441 #define Skip_MODRM { OP_Skip_MODRM, 0 }
442
443 #define RMeAX { OP_REG, eAX_reg }
444 #define RMeBX { OP_REG, eBX_reg }
445 #define RMeCX { OP_REG, eCX_reg }
446 #define RMeDX { OP_REG, eDX_reg }
447 #define RMeSP { OP_REG, eSP_reg }
448 #define RMeBP { OP_REG, eBP_reg }
449 #define RMeSI { OP_REG, eSI_reg }
450 #define RMeDI { OP_REG, eDI_reg }
451 #define RMrAX { OP_REG, rAX_reg }
452 #define RMrBX { OP_REG, rBX_reg }
453 #define RMrCX { OP_REG, rCX_reg }
454 #define RMrDX { OP_REG, rDX_reg }
455 #define RMrSP { OP_REG, rSP_reg }
456 #define RMrBP { OP_REG, rBP_reg }
457 #define RMrSI { OP_REG, rSI_reg }
458 #define RMrDI { OP_REG, rDI_reg }
459 #define RMAL { OP_REG, al_reg }
460 #define RMCL { OP_REG, cl_reg }
461 #define RMDL { OP_REG, dl_reg }
462 #define RMBL { OP_REG, bl_reg }
463 #define RMAH { OP_REG, ah_reg }
464 #define RMCH { OP_REG, ch_reg }
465 #define RMDH { OP_REG, dh_reg }
466 #define RMBH { OP_REG, bh_reg }
467 #define RMAX { OP_REG, ax_reg }
468 #define RMDX { OP_REG, dx_reg }
469
470 #define eAX { OP_IMREG, eAX_reg }
471 #define AL { OP_IMREG, al_reg }
472 #define CL { OP_IMREG, cl_reg }
473 #define zAX { OP_IMREG, z_mode_ax_reg }
474 #define indirDX { OP_IMREG, indir_dx_reg }
475
476 #define Sw { OP_SEG, w_mode }
477 #define Sv { OP_SEG, v_mode }
478 #define Ap { OP_DIR, 0 }
479 #define Ob { OP_OFF64, b_mode }
480 #define Ov { OP_OFF64, v_mode }
481 #define Xb { OP_DSreg, eSI_reg }
482 #define Xv { OP_DSreg, eSI_reg }
483 #define Xz { OP_DSreg, eSI_reg }
484 #define Yb { OP_ESreg, eDI_reg }
485 #define Yv { OP_ESreg, eDI_reg }
486 #define DSBX { OP_DSreg, eBX_reg }
487
488 #define es { OP_REG, es_reg }
489 #define ss { OP_REG, ss_reg }
490 #define cs { OP_REG, cs_reg }
491 #define ds { OP_REG, ds_reg }
492 #define fs { OP_REG, fs_reg }
493 #define gs { OP_REG, gs_reg }
494
495 #define MX { OP_MMX, 0 }
496 #define XM { OP_XMM, 0 }
497 #define XMScalar { OP_XMM, scalar_mode }
498 #define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode }
499 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
500 #define XMM { OP_XMM, xmm_mode }
501 #define TMM { OP_XMM, tmm_mode }
502 #define XMxmmq { OP_XMM, xmmq_mode }
503 #define EM { OP_EM, v_mode }
504 #define EMS { OP_EM, v_swap_mode }
505 #define EMd { OP_EM, d_mode }
506 #define EMx { OP_EM, x_mode }
507 #define EXbwUnit { OP_EX, bw_unit_mode }
508 #define EXb { OP_EX, b_mode }
509 #define EXw { OP_EX, w_mode }
510 #define EXd { OP_EX, d_mode }
511 #define EXdS { OP_EX, d_swap_mode }
512 #define EXwS { OP_EX, w_swap_mode }
513 #define EXq { OP_EX, q_mode }
514 #define EXqS { OP_EX, q_swap_mode }
515 #define EXdq { OP_EX, dq_mode }
516 #define EXx { OP_EX, x_mode }
517 #define EXxh { OP_EX, xh_mode }
518 #define EXxS { OP_EX, x_swap_mode }
519 #define EXxmm { OP_EX, xmm_mode }
520 #define EXymm { OP_EX, ymm_mode }
521 #define EXtmm { OP_EX, tmm_mode }
522 #define EXxmmq { OP_EX, xmmq_mode }
523 #define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode }
524 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
525 #define EXxmmdw { OP_EX, xmmdw_mode }
526 #define EXxmmqd { OP_EX, xmmqd_mode }
527 #define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode }
528 #define EXymmq { OP_EX, ymmq_mode }
529 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
530 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
531 #define MS { OP_MS, v_mode }
532 #define XS { OP_XS, v_mode }
533 #define EMCq { OP_EMC, q_mode }
534 #define MXC { OP_MXC, 0 }
535 #define OPSUF { OP_3DNowSuffix, 0 }
536 #define SEP { SEP_Fixup, 0 }
537 #define CMP { CMP_Fixup, 0 }
538 #define XMM0 { XMM_Fixup, 0 }
539 #define FXSAVE { FXSAVE_Fixup, 0 }
540
541 #define Vex { OP_VEX, x_mode }
542 #define VexW { OP_VexW, x_mode }
543 #define VexScalar { OP_VEX, scalar_mode }
544 #define VexScalarR { OP_VexR, scalar_mode }
545 #define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode }
546 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
547 #define VexGdq { OP_VEX, dq_mode }
548 #define VexTmm { OP_VEX, tmm_mode }
549 #define XMVexI4 { OP_REG_VexI4, x_mode }
550 #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
551 #define VexI4 { OP_VexI4, 0 }
552 #define PCLMUL { PCLMUL_Fixup, 0 }
553 #define VPCMP { VPCMP_Fixup, 0 }
554 #define VPCOM { VPCOM_Fixup, 0 }
555
556 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
557 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
558 #define EXxEVexS { OP_Rounding, evex_sae_mode }
559
560 #define MaskG { OP_G, mask_mode }
561 #define MaskE { OP_E, mask_mode }
562 #define MaskBDE { OP_E, mask_bd_mode }
563 #define MaskVex { OP_VEX, mask_mode }
564
565 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
566 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
567
568 #define MVexSIBMEM { OP_M, vex_sibmem_mode }
569
570 /* Used handle "rep" prefix for string instructions. */
571 #define Xbr { REP_Fixup, eSI_reg }
572 #define Xvr { REP_Fixup, eSI_reg }
573 #define Ybr { REP_Fixup, eDI_reg }
574 #define Yvr { REP_Fixup, eDI_reg }
575 #define Yzr { REP_Fixup, eDI_reg }
576 #define indirDXr { REP_Fixup, indir_dx_reg }
577 #define ALr { REP_Fixup, al_reg }
578 #define eAXr { REP_Fixup, eAX_reg }
579
580 /* Used handle HLE prefix for lockable instructions. */
581 #define Ebh1 { HLE_Fixup1, b_mode }
582 #define Evh1 { HLE_Fixup1, v_mode }
583 #define Ebh2 { HLE_Fixup2, b_mode }
584 #define Evh2 { HLE_Fixup2, v_mode }
585 #define Ebh3 { HLE_Fixup3, b_mode }
586 #define Evh3 { HLE_Fixup3, v_mode }
587
588 #define BND { BND_Fixup, 0 }
589 #define NOTRACK { NOTRACK_Fixup, 0 }
590
591 #define cond_jump_flag { NULL, cond_jump_mode }
592 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
593
594 /* bits in sizeflag */
595 #define SUFFIX_ALWAYS 4
596 #define AFLAG 2
597 #define DFLAG 1
598
599 enum
600 {
601 /* byte operand */
602 b_mode = 1,
603 /* byte operand with operand swapped */
604 b_swap_mode,
605 /* byte operand, sign extend like 'T' suffix */
606 b_T_mode,
607 /* operand size depends on prefixes */
608 v_mode,
609 /* operand size depends on prefixes with operand swapped */
610 v_swap_mode,
611 /* operand size depends on address prefix */
612 va_mode,
613 /* word operand */
614 w_mode,
615 /* double word operand */
616 d_mode,
617 /* word operand with operand swapped */
618 w_swap_mode,
619 /* double word operand with operand swapped */
620 d_swap_mode,
621 /* quad word operand */
622 q_mode,
623 /* quad word operand with operand swapped */
624 q_swap_mode,
625 /* ten-byte operand */
626 t_mode,
627 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
628 broadcast enabled. */
629 x_mode,
630 /* Similar to x_mode, but with different EVEX mem shifts. */
631 evex_x_gscat_mode,
632 /* Similar to x_mode, but with yet different EVEX mem shifts. */
633 bw_unit_mode,
634 /* Similar to x_mode, but with disabled broadcast. */
635 evex_x_nobcst_mode,
636 /* Similar to x_mode, but with operands swapped and disabled broadcast
637 in EVEX. */
638 x_swap_mode,
639 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
640 broadcast of 16bit enabled. */
641 xh_mode,
642 /* 16-byte XMM operand */
643 xmm_mode,
644 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
645 memory operand (depending on vector length). Broadcast isn't
646 allowed. */
647 xmmq_mode,
648 /* Same as xmmq_mode, but broadcast is allowed. */
649 evex_half_bcst_xmmq_mode,
650 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
651 memory operand (depending on vector length). 16bit broadcast. */
652 evex_half_bcst_xmmqh_mode,
653 /* 16-byte XMM, word, double word or quad word operand. */
654 xmmdw_mode,
655 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
656 xmmqd_mode,
657 /* 16-byte XMM, double word, quad word operand or xmm word operand.
658 16bit broadcast. */
659 evex_half_bcst_xmmqdh_mode,
660 /* 32-byte YMM operand */
661 ymm_mode,
662 /* quad word, ymmword or zmmword memory operand. */
663 ymmq_mode,
664 /* TMM operand */
665 tmm_mode,
666 /* d_mode in 32bit, q_mode in 64bit mode. */
667 m_mode,
668 /* pair of v_mode operands */
669 a_mode,
670 cond_jump_mode,
671 loop_jcxz_mode,
672 movsxd_mode,
673 v_bnd_mode,
674 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
675 v_bndmk_mode,
676 /* operand size depends on REX.W / VEX.W. */
677 dq_mode,
678 /* Displacements like v_mode without considering Intel64 ISA. */
679 dqw_mode,
680 /* bounds operand */
681 bnd_mode,
682 /* bounds operand with operand swapped */
683 bnd_swap_mode,
684 /* 4- or 6-byte pointer operand */
685 f_mode,
686 const_1_mode,
687 /* v_mode for indirect branch opcodes. */
688 indir_v_mode,
689 /* v_mode for stack-related opcodes. */
690 stack_v_mode,
691 /* non-quad operand size depends on prefixes */
692 z_mode,
693 /* 16-byte operand */
694 o_mode,
695 /* registers like d_mode, memory like b_mode. */
696 db_mode,
697 /* registers like d_mode, memory like w_mode. */
698 dw_mode,
699
700 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
701 vex_vsib_d_w_dq_mode,
702 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
703 vex_vsib_q_w_dq_mode,
704 /* mandatory non-vector SIB. */
705 vex_sibmem_mode,
706
707 /* scalar, ignore vector length. */
708 scalar_mode,
709
710 /* Static rounding. */
711 evex_rounding_mode,
712 /* Static rounding, 64-bit mode only. */
713 evex_rounding_64_mode,
714 /* Supress all exceptions. */
715 evex_sae_mode,
716
717 /* Mask register operand. */
718 mask_mode,
719 /* Mask register operand. */
720 mask_bd_mode,
721
722 es_reg,
723 cs_reg,
724 ss_reg,
725 ds_reg,
726 fs_reg,
727 gs_reg,
728
729 eAX_reg,
730 eCX_reg,
731 eDX_reg,
732 eBX_reg,
733 eSP_reg,
734 eBP_reg,
735 eSI_reg,
736 eDI_reg,
737
738 al_reg,
739 cl_reg,
740 dl_reg,
741 bl_reg,
742 ah_reg,
743 ch_reg,
744 dh_reg,
745 bh_reg,
746
747 ax_reg,
748 cx_reg,
749 dx_reg,
750 bx_reg,
751 sp_reg,
752 bp_reg,
753 si_reg,
754 di_reg,
755
756 rAX_reg,
757 rCX_reg,
758 rDX_reg,
759 rBX_reg,
760 rSP_reg,
761 rBP_reg,
762 rSI_reg,
763 rDI_reg,
764
765 z_mode_ax_reg,
766 indir_dx_reg
767 };
768
769 enum
770 {
771 FLOATCODE = 1,
772 USE_REG_TABLE,
773 USE_MOD_TABLE,
774 USE_RM_TABLE,
775 USE_PREFIX_TABLE,
776 USE_X86_64_TABLE,
777 USE_3BYTE_TABLE,
778 USE_XOP_8F_TABLE,
779 USE_VEX_C4_TABLE,
780 USE_VEX_C5_TABLE,
781 USE_VEX_LEN_TABLE,
782 USE_VEX_W_TABLE,
783 USE_EVEX_TABLE,
784 USE_EVEX_LEN_TABLE
785 };
786
787 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
788
789 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
790 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
791 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
792 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
793 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
794 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
795 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
796 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
797 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
798 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
799 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
800 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
801 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
802 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
803 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
804 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
805
806 enum
807 {
808 REG_80 = 0,
809 REG_81,
810 REG_83,
811 REG_8F,
812 REG_C0,
813 REG_C1,
814 REG_C6,
815 REG_C7,
816 REG_D0,
817 REG_D1,
818 REG_D2,
819 REG_D3,
820 REG_F6,
821 REG_F7,
822 REG_FE,
823 REG_FF,
824 REG_0F00,
825 REG_0F01,
826 REG_0F0D,
827 REG_0F18,
828 REG_0F1C_P_0_MOD_0,
829 REG_0F1E_P_1_MOD_3,
830 REG_0F38D8_PREFIX_1,
831 REG_0F3A0F_PREFIX_1_MOD_3,
832 REG_0F71_MOD_0,
833 REG_0F72_MOD_0,
834 REG_0F73_MOD_0,
835 REG_0FA6,
836 REG_0FA7,
837 REG_0FAE,
838 REG_0FBA,
839 REG_0FC7,
840 REG_VEX_0F71_M_0,
841 REG_VEX_0F72_M_0,
842 REG_VEX_0F73_M_0,
843 REG_VEX_0FAE,
844 REG_VEX_0F3849_X86_64_P_0_W_0_M_1,
845 REG_VEX_0F38F3_L_0,
846
847 REG_XOP_09_01_L_0,
848 REG_XOP_09_02_L_0,
849 REG_XOP_09_12_M_1_L_0,
850 REG_XOP_0A_12_L_0,
851
852 REG_EVEX_0F71,
853 REG_EVEX_0F72,
854 REG_EVEX_0F73,
855 REG_EVEX_0F38C6_M_0_L_2,
856 REG_EVEX_0F38C7_M_0_L_2
857 };
858
859 enum
860 {
861 MOD_62_32BIT = 0,
862 MOD_8D,
863 MOD_C4_32BIT,
864 MOD_C5_32BIT,
865 MOD_C6_REG_7,
866 MOD_C7_REG_7,
867 MOD_FF_REG_3,
868 MOD_FF_REG_5,
869 MOD_0F01_REG_0,
870 MOD_0F01_REG_1,
871 MOD_0F01_REG_2,
872 MOD_0F01_REG_3,
873 MOD_0F01_REG_5,
874 MOD_0F01_REG_7,
875 MOD_0F02,
876 MOD_0F03,
877 MOD_0F12_PREFIX_0,
878 MOD_0F12_PREFIX_2,
879 MOD_0F13,
880 MOD_0F16_PREFIX_0,
881 MOD_0F16_PREFIX_2,
882 MOD_0F17,
883 MOD_0F18_REG_0,
884 MOD_0F18_REG_1,
885 MOD_0F18_REG_2,
886 MOD_0F18_REG_3,
887 MOD_0F18_REG_6,
888 MOD_0F18_REG_7,
889 MOD_0F1A_PREFIX_0,
890 MOD_0F1B_PREFIX_0,
891 MOD_0F1B_PREFIX_1,
892 MOD_0F1C_PREFIX_0,
893 MOD_0F1E_PREFIX_1,
894 MOD_0F2B_PREFIX_0,
895 MOD_0F2B_PREFIX_1,
896 MOD_0F2B_PREFIX_2,
897 MOD_0F2B_PREFIX_3,
898 MOD_0F50,
899 MOD_0F71,
900 MOD_0F72,
901 MOD_0F73,
902 MOD_0FAE_REG_0,
903 MOD_0FAE_REG_1,
904 MOD_0FAE_REG_2,
905 MOD_0FAE_REG_3,
906 MOD_0FAE_REG_4,
907 MOD_0FAE_REG_5,
908 MOD_0FAE_REG_6,
909 MOD_0FAE_REG_7,
910 MOD_0FB2,
911 MOD_0FB4,
912 MOD_0FB5,
913 MOD_0FC3,
914 MOD_0FC7_REG_3,
915 MOD_0FC7_REG_4,
916 MOD_0FC7_REG_5,
917 MOD_0FC7_REG_6,
918 MOD_0FC7_REG_7,
919 MOD_0FD7,
920 MOD_0FE7_PREFIX_2,
921 MOD_0FF0_PREFIX_3,
922 MOD_0F382A,
923 MOD_0F38DC_PREFIX_1,
924 MOD_0F38DD_PREFIX_1,
925 MOD_0F38DE_PREFIX_1,
926 MOD_0F38DF_PREFIX_1,
927 MOD_0F38F5,
928 MOD_0F38F6_PREFIX_0,
929 MOD_0F38F8_PREFIX_1,
930 MOD_0F38F8_PREFIX_2,
931 MOD_0F38F8_PREFIX_3,
932 MOD_0F38F9,
933 MOD_0F38FA_PREFIX_1,
934 MOD_0F38FB_PREFIX_1,
935 MOD_0F3A0F_PREFIX_1,
936
937 MOD_VEX_0F12_PREFIX_0,
938 MOD_VEX_0F12_PREFIX_2,
939 MOD_VEX_0F13,
940 MOD_VEX_0F16_PREFIX_0,
941 MOD_VEX_0F16_PREFIX_2,
942 MOD_VEX_0F17,
943 MOD_VEX_0F2B,
944 MOD_VEX_0F41_L_1,
945 MOD_VEX_0F42_L_1,
946 MOD_VEX_0F44_L_0,
947 MOD_VEX_0F45_L_1,
948 MOD_VEX_0F46_L_1,
949 MOD_VEX_0F47_L_1,
950 MOD_VEX_0F4A_L_1,
951 MOD_VEX_0F4B_L_1,
952 MOD_VEX_0F50,
953 MOD_VEX_0F71,
954 MOD_VEX_0F72,
955 MOD_VEX_0F73,
956 MOD_VEX_0F91_L_0,
957 MOD_VEX_0F92_L_0,
958 MOD_VEX_0F93_L_0,
959 MOD_VEX_0F98_L_0,
960 MOD_VEX_0F99_L_0,
961 MOD_VEX_0FAE_REG_2,
962 MOD_VEX_0FAE_REG_3,
963 MOD_VEX_0FD7,
964 MOD_VEX_0FE7,
965 MOD_VEX_0FF0_PREFIX_3,
966 MOD_VEX_0F381A,
967 MOD_VEX_0F382A,
968 MOD_VEX_0F382C,
969 MOD_VEX_0F382D,
970 MOD_VEX_0F382E,
971 MOD_VEX_0F382F,
972 MOD_VEX_0F3849_X86_64_P_0_W_0,
973 MOD_VEX_0F3849_X86_64_P_2_W_0,
974 MOD_VEX_0F3849_X86_64_P_3_W_0,
975 MOD_VEX_0F384B_X86_64_P_1_W_0,
976 MOD_VEX_0F384B_X86_64_P_2_W_0,
977 MOD_VEX_0F384B_X86_64_P_3_W_0,
978 MOD_VEX_0F385A,
979 MOD_VEX_0F385C_X86_64_P_1_W_0,
980 MOD_VEX_0F385C_X86_64_P_3_W_0,
981 MOD_VEX_0F385E_X86_64_P_0_W_0,
982 MOD_VEX_0F385E_X86_64_P_1_W_0,
983 MOD_VEX_0F385E_X86_64_P_2_W_0,
984 MOD_VEX_0F385E_X86_64_P_3_W_0,
985 MOD_VEX_0F386C_X86_64_W_0,
986 MOD_VEX_0F388C,
987 MOD_VEX_0F388E,
988 MOD_VEX_0F3A30_L_0,
989 MOD_VEX_0F3A31_L_0,
990 MOD_VEX_0F3A32_L_0,
991 MOD_VEX_0F3A33_L_0,
992
993 MOD_XOP_09_12,
994
995 MOD_EVEX_0F381A,
996 MOD_EVEX_0F381B,
997 MOD_EVEX_0F3828_P_1,
998 MOD_EVEX_0F382A_P_1_W_1,
999 MOD_EVEX_0F3838_P_1,
1000 MOD_EVEX_0F383A_P_1_W_0,
1001 MOD_EVEX_0F385A,
1002 MOD_EVEX_0F385B,
1003 MOD_EVEX_0F387A_W_0,
1004 MOD_EVEX_0F387B_W_0,
1005 MOD_EVEX_0F387C,
1006 MOD_EVEX_0F38C6,
1007 MOD_EVEX_0F38C7,
1008 };
1009
1010 enum
1011 {
1012 RM_C6_REG_7 = 0,
1013 RM_C7_REG_7,
1014 RM_0F01_REG_0,
1015 RM_0F01_REG_1,
1016 RM_0F01_REG_2,
1017 RM_0F01_REG_3,
1018 RM_0F01_REG_5_MOD_3,
1019 RM_0F01_REG_7_MOD_3,
1020 RM_0F1E_P_1_MOD_3_REG_7,
1021 RM_0FAE_REG_6_MOD_3_P_0,
1022 RM_0FAE_REG_7_MOD_3,
1023 RM_0F3A0F_P_1_MOD_3_REG_0,
1024
1025 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
1026 };
1027
1028 enum
1029 {
1030 PREFIX_90 = 0,
1031 PREFIX_0F01_REG_0_MOD_3_RM_6,
1032 PREFIX_0F01_REG_1_RM_4,
1033 PREFIX_0F01_REG_1_RM_5,
1034 PREFIX_0F01_REG_1_RM_6,
1035 PREFIX_0F01_REG_1_RM_7,
1036 PREFIX_0F01_REG_3_RM_1,
1037 PREFIX_0F01_REG_5_MOD_0,
1038 PREFIX_0F01_REG_5_MOD_3_RM_0,
1039 PREFIX_0F01_REG_5_MOD_3_RM_1,
1040 PREFIX_0F01_REG_5_MOD_3_RM_2,
1041 PREFIX_0F01_REG_5_MOD_3_RM_4,
1042 PREFIX_0F01_REG_5_MOD_3_RM_5,
1043 PREFIX_0F01_REG_5_MOD_3_RM_6,
1044 PREFIX_0F01_REG_5_MOD_3_RM_7,
1045 PREFIX_0F01_REG_7_MOD_3_RM_2,
1046 PREFIX_0F01_REG_7_MOD_3_RM_5,
1047 PREFIX_0F01_REG_7_MOD_3_RM_6,
1048 PREFIX_0F01_REG_7_MOD_3_RM_7,
1049 PREFIX_0F09,
1050 PREFIX_0F10,
1051 PREFIX_0F11,
1052 PREFIX_0F12,
1053 PREFIX_0F16,
1054 PREFIX_0F18_REG_6_MOD_0_X86_64,
1055 PREFIX_0F18_REG_7_MOD_0_X86_64,
1056 PREFIX_0F1A,
1057 PREFIX_0F1B,
1058 PREFIX_0F1C,
1059 PREFIX_0F1E,
1060 PREFIX_0F2A,
1061 PREFIX_0F2B,
1062 PREFIX_0F2C,
1063 PREFIX_0F2D,
1064 PREFIX_0F2E,
1065 PREFIX_0F2F,
1066 PREFIX_0F51,
1067 PREFIX_0F52,
1068 PREFIX_0F53,
1069 PREFIX_0F58,
1070 PREFIX_0F59,
1071 PREFIX_0F5A,
1072 PREFIX_0F5B,
1073 PREFIX_0F5C,
1074 PREFIX_0F5D,
1075 PREFIX_0F5E,
1076 PREFIX_0F5F,
1077 PREFIX_0F60,
1078 PREFIX_0F61,
1079 PREFIX_0F62,
1080 PREFIX_0F6F,
1081 PREFIX_0F70,
1082 PREFIX_0F78,
1083 PREFIX_0F79,
1084 PREFIX_0F7C,
1085 PREFIX_0F7D,
1086 PREFIX_0F7E,
1087 PREFIX_0F7F,
1088 PREFIX_0FAE_REG_0_MOD_3,
1089 PREFIX_0FAE_REG_1_MOD_3,
1090 PREFIX_0FAE_REG_2_MOD_3,
1091 PREFIX_0FAE_REG_3_MOD_3,
1092 PREFIX_0FAE_REG_4_MOD_0,
1093 PREFIX_0FAE_REG_4_MOD_3,
1094 PREFIX_0FAE_REG_5_MOD_3,
1095 PREFIX_0FAE_REG_6_MOD_0,
1096 PREFIX_0FAE_REG_6_MOD_3,
1097 PREFIX_0FAE_REG_7_MOD_0,
1098 PREFIX_0FB8,
1099 PREFIX_0FBC,
1100 PREFIX_0FBD,
1101 PREFIX_0FC2,
1102 PREFIX_0FC7_REG_6_MOD_0,
1103 PREFIX_0FC7_REG_6_MOD_3,
1104 PREFIX_0FC7_REG_7_MOD_3,
1105 PREFIX_0FD0,
1106 PREFIX_0FD6,
1107 PREFIX_0FE6,
1108 PREFIX_0FE7,
1109 PREFIX_0FF0,
1110 PREFIX_0FF7,
1111 PREFIX_0F38D8,
1112 PREFIX_0F38DC,
1113 PREFIX_0F38DD,
1114 PREFIX_0F38DE,
1115 PREFIX_0F38DF,
1116 PREFIX_0F38F0,
1117 PREFIX_0F38F1,
1118 PREFIX_0F38F6,
1119 PREFIX_0F38F8,
1120 PREFIX_0F38FA,
1121 PREFIX_0F38FB,
1122 PREFIX_0F38FC,
1123 PREFIX_0F3A0F,
1124 PREFIX_VEX_0F10,
1125 PREFIX_VEX_0F11,
1126 PREFIX_VEX_0F12,
1127 PREFIX_VEX_0F16,
1128 PREFIX_VEX_0F2A,
1129 PREFIX_VEX_0F2C,
1130 PREFIX_VEX_0F2D,
1131 PREFIX_VEX_0F2E,
1132 PREFIX_VEX_0F2F,
1133 PREFIX_VEX_0F41_L_1_M_1_W_0,
1134 PREFIX_VEX_0F41_L_1_M_1_W_1,
1135 PREFIX_VEX_0F42_L_1_M_1_W_0,
1136 PREFIX_VEX_0F42_L_1_M_1_W_1,
1137 PREFIX_VEX_0F44_L_0_M_1_W_0,
1138 PREFIX_VEX_0F44_L_0_M_1_W_1,
1139 PREFIX_VEX_0F45_L_1_M_1_W_0,
1140 PREFIX_VEX_0F45_L_1_M_1_W_1,
1141 PREFIX_VEX_0F46_L_1_M_1_W_0,
1142 PREFIX_VEX_0F46_L_1_M_1_W_1,
1143 PREFIX_VEX_0F47_L_1_M_1_W_0,
1144 PREFIX_VEX_0F47_L_1_M_1_W_1,
1145 PREFIX_VEX_0F4A_L_1_M_1_W_0,
1146 PREFIX_VEX_0F4A_L_1_M_1_W_1,
1147 PREFIX_VEX_0F4B_L_1_M_1_W_0,
1148 PREFIX_VEX_0F4B_L_1_M_1_W_1,
1149 PREFIX_VEX_0F51,
1150 PREFIX_VEX_0F52,
1151 PREFIX_VEX_0F53,
1152 PREFIX_VEX_0F58,
1153 PREFIX_VEX_0F59,
1154 PREFIX_VEX_0F5A,
1155 PREFIX_VEX_0F5B,
1156 PREFIX_VEX_0F5C,
1157 PREFIX_VEX_0F5D,
1158 PREFIX_VEX_0F5E,
1159 PREFIX_VEX_0F5F,
1160 PREFIX_VEX_0F6F,
1161 PREFIX_VEX_0F70,
1162 PREFIX_VEX_0F7C,
1163 PREFIX_VEX_0F7D,
1164 PREFIX_VEX_0F7E,
1165 PREFIX_VEX_0F7F,
1166 PREFIX_VEX_0F90_L_0_W_0,
1167 PREFIX_VEX_0F90_L_0_W_1,
1168 PREFIX_VEX_0F91_L_0_M_0_W_0,
1169 PREFIX_VEX_0F91_L_0_M_0_W_1,
1170 PREFIX_VEX_0F92_L_0_M_1_W_0,
1171 PREFIX_VEX_0F92_L_0_M_1_W_1,
1172 PREFIX_VEX_0F93_L_0_M_1_W_0,
1173 PREFIX_VEX_0F93_L_0_M_1_W_1,
1174 PREFIX_VEX_0F98_L_0_M_1_W_0,
1175 PREFIX_VEX_0F98_L_0_M_1_W_1,
1176 PREFIX_VEX_0F99_L_0_M_1_W_0,
1177 PREFIX_VEX_0F99_L_0_M_1_W_1,
1178 PREFIX_VEX_0FC2,
1179 PREFIX_VEX_0FD0,
1180 PREFIX_VEX_0FE6,
1181 PREFIX_VEX_0FF0,
1182 PREFIX_VEX_0F3849_X86_64,
1183 PREFIX_VEX_0F384B_X86_64,
1184 PREFIX_VEX_0F3850_W_0,
1185 PREFIX_VEX_0F3851_W_0,
1186 PREFIX_VEX_0F385C_X86_64,
1187 PREFIX_VEX_0F385E_X86_64,
1188 PREFIX_VEX_0F386C_X86_64_W_0_M_1_L_0,
1189 PREFIX_VEX_0F3872,
1190 PREFIX_VEX_0F38B0_W_0,
1191 PREFIX_VEX_0F38B1_W_0,
1192 PREFIX_VEX_0F38F5_L_0,
1193 PREFIX_VEX_0F38F6_L_0,
1194 PREFIX_VEX_0F38F7_L_0,
1195 PREFIX_VEX_0F3AF0_L_0,
1196
1197 PREFIX_EVEX_0F5B,
1198 PREFIX_EVEX_0F6F,
1199 PREFIX_EVEX_0F70,
1200 PREFIX_EVEX_0F78,
1201 PREFIX_EVEX_0F79,
1202 PREFIX_EVEX_0F7A,
1203 PREFIX_EVEX_0F7B,
1204 PREFIX_EVEX_0F7E,
1205 PREFIX_EVEX_0F7F,
1206 PREFIX_EVEX_0FC2,
1207 PREFIX_EVEX_0FE6,
1208 PREFIX_EVEX_0F3810,
1209 PREFIX_EVEX_0F3811,
1210 PREFIX_EVEX_0F3812,
1211 PREFIX_EVEX_0F3813,
1212 PREFIX_EVEX_0F3814,
1213 PREFIX_EVEX_0F3815,
1214 PREFIX_EVEX_0F3820,
1215 PREFIX_EVEX_0F3821,
1216 PREFIX_EVEX_0F3822,
1217 PREFIX_EVEX_0F3823,
1218 PREFIX_EVEX_0F3824,
1219 PREFIX_EVEX_0F3825,
1220 PREFIX_EVEX_0F3826,
1221 PREFIX_EVEX_0F3827,
1222 PREFIX_EVEX_0F3828,
1223 PREFIX_EVEX_0F3829,
1224 PREFIX_EVEX_0F382A,
1225 PREFIX_EVEX_0F3830,
1226 PREFIX_EVEX_0F3831,
1227 PREFIX_EVEX_0F3832,
1228 PREFIX_EVEX_0F3833,
1229 PREFIX_EVEX_0F3834,
1230 PREFIX_EVEX_0F3835,
1231 PREFIX_EVEX_0F3838,
1232 PREFIX_EVEX_0F3839,
1233 PREFIX_EVEX_0F383A,
1234 PREFIX_EVEX_0F3852,
1235 PREFIX_EVEX_0F3853,
1236 PREFIX_EVEX_0F3868,
1237 PREFIX_EVEX_0F3872,
1238 PREFIX_EVEX_0F389A,
1239 PREFIX_EVEX_0F389B,
1240 PREFIX_EVEX_0F38AA,
1241 PREFIX_EVEX_0F38AB,
1242
1243 PREFIX_EVEX_0F3A08,
1244 PREFIX_EVEX_0F3A0A,
1245 PREFIX_EVEX_0F3A26,
1246 PREFIX_EVEX_0F3A27,
1247 PREFIX_EVEX_0F3A56,
1248 PREFIX_EVEX_0F3A57,
1249 PREFIX_EVEX_0F3A66,
1250 PREFIX_EVEX_0F3A67,
1251 PREFIX_EVEX_0F3AC2,
1252
1253 PREFIX_EVEX_MAP5_10,
1254 PREFIX_EVEX_MAP5_11,
1255 PREFIX_EVEX_MAP5_1D,
1256 PREFIX_EVEX_MAP5_2A,
1257 PREFIX_EVEX_MAP5_2C,
1258 PREFIX_EVEX_MAP5_2D,
1259 PREFIX_EVEX_MAP5_2E,
1260 PREFIX_EVEX_MAP5_2F,
1261 PREFIX_EVEX_MAP5_51,
1262 PREFIX_EVEX_MAP5_58,
1263 PREFIX_EVEX_MAP5_59,
1264 PREFIX_EVEX_MAP5_5A,
1265 PREFIX_EVEX_MAP5_5B,
1266 PREFIX_EVEX_MAP5_5C,
1267 PREFIX_EVEX_MAP5_5D,
1268 PREFIX_EVEX_MAP5_5E,
1269 PREFIX_EVEX_MAP5_5F,
1270 PREFIX_EVEX_MAP5_78,
1271 PREFIX_EVEX_MAP5_79,
1272 PREFIX_EVEX_MAP5_7A,
1273 PREFIX_EVEX_MAP5_7B,
1274 PREFIX_EVEX_MAP5_7C,
1275 PREFIX_EVEX_MAP5_7D,
1276
1277 PREFIX_EVEX_MAP6_13,
1278 PREFIX_EVEX_MAP6_56,
1279 PREFIX_EVEX_MAP6_57,
1280 PREFIX_EVEX_MAP6_D6,
1281 PREFIX_EVEX_MAP6_D7,
1282 };
1283
1284 enum
1285 {
1286 X86_64_06 = 0,
1287 X86_64_07,
1288 X86_64_0E,
1289 X86_64_16,
1290 X86_64_17,
1291 X86_64_1E,
1292 X86_64_1F,
1293 X86_64_27,
1294 X86_64_2F,
1295 X86_64_37,
1296 X86_64_3F,
1297 X86_64_60,
1298 X86_64_61,
1299 X86_64_62,
1300 X86_64_63,
1301 X86_64_6D,
1302 X86_64_6F,
1303 X86_64_82,
1304 X86_64_9A,
1305 X86_64_C2,
1306 X86_64_C3,
1307 X86_64_C4,
1308 X86_64_C5,
1309 X86_64_CE,
1310 X86_64_D4,
1311 X86_64_D5,
1312 X86_64_E8,
1313 X86_64_E9,
1314 X86_64_EA,
1315 X86_64_0F01_REG_0,
1316 X86_64_0F01_REG_0_MOD_3_RM_6_P_1,
1317 X86_64_0F01_REG_0_MOD_3_RM_6_P_3,
1318 X86_64_0F01_REG_1,
1319 X86_64_0F01_REG_1_RM_5_PREFIX_2,
1320 X86_64_0F01_REG_1_RM_6_PREFIX_2,
1321 X86_64_0F01_REG_1_RM_7_PREFIX_2,
1322 X86_64_0F01_REG_2,
1323 X86_64_0F01_REG_3,
1324 X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1,
1325 X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1,
1326 X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1,
1327 X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1,
1328 X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1,
1329 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1,
1330 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3,
1331 X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1,
1332 X86_64_0F18_REG_6_MOD_0,
1333 X86_64_0F18_REG_7_MOD_0,
1334 X86_64_0F24,
1335 X86_64_0F26,
1336 X86_64_0FC7_REG_6_MOD_3_PREFIX_1,
1337
1338 X86_64_VEX_0F3849,
1339 X86_64_VEX_0F384B,
1340 X86_64_VEX_0F385C,
1341 X86_64_VEX_0F385E,
1342 X86_64_VEX_0F386C,
1343 X86_64_VEX_0F38E0,
1344 X86_64_VEX_0F38E1,
1345 X86_64_VEX_0F38E2,
1346 X86_64_VEX_0F38E3,
1347 X86_64_VEX_0F38E4,
1348 X86_64_VEX_0F38E5,
1349 X86_64_VEX_0F38E6,
1350 X86_64_VEX_0F38E7,
1351 X86_64_VEX_0F38E8,
1352 X86_64_VEX_0F38E9,
1353 X86_64_VEX_0F38EA,
1354 X86_64_VEX_0F38EB,
1355 X86_64_VEX_0F38EC,
1356 X86_64_VEX_0F38ED,
1357 X86_64_VEX_0F38EE,
1358 X86_64_VEX_0F38EF,
1359 };
1360
1361 enum
1362 {
1363 THREE_BYTE_0F38 = 0,
1364 THREE_BYTE_0F3A
1365 };
1366
1367 enum
1368 {
1369 XOP_08 = 0,
1370 XOP_09,
1371 XOP_0A
1372 };
1373
1374 enum
1375 {
1376 VEX_0F = 0,
1377 VEX_0F38,
1378 VEX_0F3A
1379 };
1380
1381 enum
1382 {
1383 EVEX_0F = 0,
1384 EVEX_0F38,
1385 EVEX_0F3A,
1386 EVEX_MAP5,
1387 EVEX_MAP6,
1388 };
1389
1390 enum
1391 {
1392 VEX_LEN_0F12_P_0_M_0 = 0,
1393 VEX_LEN_0F12_P_0_M_1,
1394 #define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
1395 VEX_LEN_0F13_M_0,
1396 VEX_LEN_0F16_P_0_M_0,
1397 VEX_LEN_0F16_P_0_M_1,
1398 #define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
1399 VEX_LEN_0F17_M_0,
1400 VEX_LEN_0F41,
1401 VEX_LEN_0F42,
1402 VEX_LEN_0F44,
1403 VEX_LEN_0F45,
1404 VEX_LEN_0F46,
1405 VEX_LEN_0F47,
1406 VEX_LEN_0F4A,
1407 VEX_LEN_0F4B,
1408 VEX_LEN_0F6E,
1409 VEX_LEN_0F77,
1410 VEX_LEN_0F7E_P_1,
1411 VEX_LEN_0F7E_P_2,
1412 VEX_LEN_0F90,
1413 VEX_LEN_0F91,
1414 VEX_LEN_0F92,
1415 VEX_LEN_0F93,
1416 VEX_LEN_0F98,
1417 VEX_LEN_0F99,
1418 VEX_LEN_0FAE_R_2_M_0,
1419 VEX_LEN_0FAE_R_3_M_0,
1420 VEX_LEN_0FC4,
1421 VEX_LEN_0FC5,
1422 VEX_LEN_0FD6,
1423 VEX_LEN_0FF7,
1424 VEX_LEN_0F3816,
1425 VEX_LEN_0F3819,
1426 VEX_LEN_0F381A_M_0,
1427 VEX_LEN_0F3836,
1428 VEX_LEN_0F3841,
1429 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0,
1430 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0,
1431 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0,
1432 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0,
1433 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0,
1434 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0,
1435 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0,
1436 VEX_LEN_0F385A_M_0,
1437 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0,
1438 VEX_LEN_0F385C_X86_64_P_3_W_0_M_0,
1439 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0,
1440 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0,
1441 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0,
1442 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0,
1443 VEX_LEN_0F386C_X86_64_W_0_M_1,
1444 VEX_LEN_0F38DB,
1445 VEX_LEN_0F38F2,
1446 VEX_LEN_0F38F3,
1447 VEX_LEN_0F38F5,
1448 VEX_LEN_0F38F6,
1449 VEX_LEN_0F38F7,
1450 VEX_LEN_0F3A00,
1451 VEX_LEN_0F3A01,
1452 VEX_LEN_0F3A06,
1453 VEX_LEN_0F3A14,
1454 VEX_LEN_0F3A15,
1455 VEX_LEN_0F3A16,
1456 VEX_LEN_0F3A17,
1457 VEX_LEN_0F3A18,
1458 VEX_LEN_0F3A19,
1459 VEX_LEN_0F3A20,
1460 VEX_LEN_0F3A21,
1461 VEX_LEN_0F3A22,
1462 VEX_LEN_0F3A30,
1463 VEX_LEN_0F3A31,
1464 VEX_LEN_0F3A32,
1465 VEX_LEN_0F3A33,
1466 VEX_LEN_0F3A38,
1467 VEX_LEN_0F3A39,
1468 VEX_LEN_0F3A41,
1469 VEX_LEN_0F3A46,
1470 VEX_LEN_0F3A60,
1471 VEX_LEN_0F3A61,
1472 VEX_LEN_0F3A62,
1473 VEX_LEN_0F3A63,
1474 VEX_LEN_0F3ADF,
1475 VEX_LEN_0F3AF0,
1476 VEX_LEN_0FXOP_08_85,
1477 VEX_LEN_0FXOP_08_86,
1478 VEX_LEN_0FXOP_08_87,
1479 VEX_LEN_0FXOP_08_8E,
1480 VEX_LEN_0FXOP_08_8F,
1481 VEX_LEN_0FXOP_08_95,
1482 VEX_LEN_0FXOP_08_96,
1483 VEX_LEN_0FXOP_08_97,
1484 VEX_LEN_0FXOP_08_9E,
1485 VEX_LEN_0FXOP_08_9F,
1486 VEX_LEN_0FXOP_08_A3,
1487 VEX_LEN_0FXOP_08_A6,
1488 VEX_LEN_0FXOP_08_B6,
1489 VEX_LEN_0FXOP_08_C0,
1490 VEX_LEN_0FXOP_08_C1,
1491 VEX_LEN_0FXOP_08_C2,
1492 VEX_LEN_0FXOP_08_C3,
1493 VEX_LEN_0FXOP_08_CC,
1494 VEX_LEN_0FXOP_08_CD,
1495 VEX_LEN_0FXOP_08_CE,
1496 VEX_LEN_0FXOP_08_CF,
1497 VEX_LEN_0FXOP_08_EC,
1498 VEX_LEN_0FXOP_08_ED,
1499 VEX_LEN_0FXOP_08_EE,
1500 VEX_LEN_0FXOP_08_EF,
1501 VEX_LEN_0FXOP_09_01,
1502 VEX_LEN_0FXOP_09_02,
1503 VEX_LEN_0FXOP_09_12_M_1,
1504 VEX_LEN_0FXOP_09_82_W_0,
1505 VEX_LEN_0FXOP_09_83_W_0,
1506 VEX_LEN_0FXOP_09_90,
1507 VEX_LEN_0FXOP_09_91,
1508 VEX_LEN_0FXOP_09_92,
1509 VEX_LEN_0FXOP_09_93,
1510 VEX_LEN_0FXOP_09_94,
1511 VEX_LEN_0FXOP_09_95,
1512 VEX_LEN_0FXOP_09_96,
1513 VEX_LEN_0FXOP_09_97,
1514 VEX_LEN_0FXOP_09_98,
1515 VEX_LEN_0FXOP_09_99,
1516 VEX_LEN_0FXOP_09_9A,
1517 VEX_LEN_0FXOP_09_9B,
1518 VEX_LEN_0FXOP_09_C1,
1519 VEX_LEN_0FXOP_09_C2,
1520 VEX_LEN_0FXOP_09_C3,
1521 VEX_LEN_0FXOP_09_C6,
1522 VEX_LEN_0FXOP_09_C7,
1523 VEX_LEN_0FXOP_09_CB,
1524 VEX_LEN_0FXOP_09_D1,
1525 VEX_LEN_0FXOP_09_D2,
1526 VEX_LEN_0FXOP_09_D3,
1527 VEX_LEN_0FXOP_09_D6,
1528 VEX_LEN_0FXOP_09_D7,
1529 VEX_LEN_0FXOP_09_DB,
1530 VEX_LEN_0FXOP_09_E1,
1531 VEX_LEN_0FXOP_09_E2,
1532 VEX_LEN_0FXOP_09_E3,
1533 VEX_LEN_0FXOP_0A_12,
1534 };
1535
1536 enum
1537 {
1538 EVEX_LEN_0F3816 = 0,
1539 EVEX_LEN_0F3819,
1540 EVEX_LEN_0F381A_M_0,
1541 EVEX_LEN_0F381B_M_0,
1542 EVEX_LEN_0F3836,
1543 EVEX_LEN_0F385A_M_0,
1544 EVEX_LEN_0F385B_M_0,
1545 EVEX_LEN_0F38C6_M_0,
1546 EVEX_LEN_0F38C7_M_0,
1547 EVEX_LEN_0F3A00,
1548 EVEX_LEN_0F3A01,
1549 EVEX_LEN_0F3A18,
1550 EVEX_LEN_0F3A19,
1551 EVEX_LEN_0F3A1A,
1552 EVEX_LEN_0F3A1B,
1553 EVEX_LEN_0F3A23,
1554 EVEX_LEN_0F3A38,
1555 EVEX_LEN_0F3A39,
1556 EVEX_LEN_0F3A3A,
1557 EVEX_LEN_0F3A3B,
1558 EVEX_LEN_0F3A43
1559 };
1560
1561 enum
1562 {
1563 VEX_W_0F41_L_1_M_1 = 0,
1564 VEX_W_0F42_L_1_M_1,
1565 VEX_W_0F44_L_0_M_1,
1566 VEX_W_0F45_L_1_M_1,
1567 VEX_W_0F46_L_1_M_1,
1568 VEX_W_0F47_L_1_M_1,
1569 VEX_W_0F4A_L_1_M_1,
1570 VEX_W_0F4B_L_1_M_1,
1571 VEX_W_0F90_L_0,
1572 VEX_W_0F91_L_0_M_0,
1573 VEX_W_0F92_L_0_M_1,
1574 VEX_W_0F93_L_0_M_1,
1575 VEX_W_0F98_L_0_M_1,
1576 VEX_W_0F99_L_0_M_1,
1577 VEX_W_0F380C,
1578 VEX_W_0F380D,
1579 VEX_W_0F380E,
1580 VEX_W_0F380F,
1581 VEX_W_0F3813,
1582 VEX_W_0F3816_L_1,
1583 VEX_W_0F3818,
1584 VEX_W_0F3819_L_1,
1585 VEX_W_0F381A_M_0_L_1,
1586 VEX_W_0F382C_M_0,
1587 VEX_W_0F382D_M_0,
1588 VEX_W_0F382E_M_0,
1589 VEX_W_0F382F_M_0,
1590 VEX_W_0F3836,
1591 VEX_W_0F3846,
1592 VEX_W_0F3849_X86_64_P_0,
1593 VEX_W_0F3849_X86_64_P_2,
1594 VEX_W_0F3849_X86_64_P_3,
1595 VEX_W_0F384B_X86_64_P_1,
1596 VEX_W_0F384B_X86_64_P_2,
1597 VEX_W_0F384B_X86_64_P_3,
1598 VEX_W_0F3850,
1599 VEX_W_0F3851,
1600 VEX_W_0F3852,
1601 VEX_W_0F3853,
1602 VEX_W_0F3858,
1603 VEX_W_0F3859,
1604 VEX_W_0F385A_M_0_L_0,
1605 VEX_W_0F385C_X86_64_P_1,
1606 VEX_W_0F385C_X86_64_P_3,
1607 VEX_W_0F385E_X86_64_P_0,
1608 VEX_W_0F385E_X86_64_P_1,
1609 VEX_W_0F385E_X86_64_P_2,
1610 VEX_W_0F385E_X86_64_P_3,
1611 VEX_W_0F386C_X86_64,
1612 VEX_W_0F3872_P_1,
1613 VEX_W_0F3878,
1614 VEX_W_0F3879,
1615 VEX_W_0F38B0,
1616 VEX_W_0F38B1,
1617 VEX_W_0F38B4,
1618 VEX_W_0F38B5,
1619 VEX_W_0F38CF,
1620 VEX_W_0F3A00_L_1,
1621 VEX_W_0F3A01_L_1,
1622 VEX_W_0F3A02,
1623 VEX_W_0F3A04,
1624 VEX_W_0F3A05,
1625 VEX_W_0F3A06_L_1,
1626 VEX_W_0F3A18_L_1,
1627 VEX_W_0F3A19_L_1,
1628 VEX_W_0F3A1D,
1629 VEX_W_0F3A38_L_1,
1630 VEX_W_0F3A39_L_1,
1631 VEX_W_0F3A46_L_1,
1632 VEX_W_0F3A4A,
1633 VEX_W_0F3A4B,
1634 VEX_W_0F3A4C,
1635 VEX_W_0F3ACE,
1636 VEX_W_0F3ACF,
1637
1638 VEX_W_0FXOP_08_85_L_0,
1639 VEX_W_0FXOP_08_86_L_0,
1640 VEX_W_0FXOP_08_87_L_0,
1641 VEX_W_0FXOP_08_8E_L_0,
1642 VEX_W_0FXOP_08_8F_L_0,
1643 VEX_W_0FXOP_08_95_L_0,
1644 VEX_W_0FXOP_08_96_L_0,
1645 VEX_W_0FXOP_08_97_L_0,
1646 VEX_W_0FXOP_08_9E_L_0,
1647 VEX_W_0FXOP_08_9F_L_0,
1648 VEX_W_0FXOP_08_A6_L_0,
1649 VEX_W_0FXOP_08_B6_L_0,
1650 VEX_W_0FXOP_08_C0_L_0,
1651 VEX_W_0FXOP_08_C1_L_0,
1652 VEX_W_0FXOP_08_C2_L_0,
1653 VEX_W_0FXOP_08_C3_L_0,
1654 VEX_W_0FXOP_08_CC_L_0,
1655 VEX_W_0FXOP_08_CD_L_0,
1656 VEX_W_0FXOP_08_CE_L_0,
1657 VEX_W_0FXOP_08_CF_L_0,
1658 VEX_W_0FXOP_08_EC_L_0,
1659 VEX_W_0FXOP_08_ED_L_0,
1660 VEX_W_0FXOP_08_EE_L_0,
1661 VEX_W_0FXOP_08_EF_L_0,
1662
1663 VEX_W_0FXOP_09_80,
1664 VEX_W_0FXOP_09_81,
1665 VEX_W_0FXOP_09_82,
1666 VEX_W_0FXOP_09_83,
1667 VEX_W_0FXOP_09_C1_L_0,
1668 VEX_W_0FXOP_09_C2_L_0,
1669 VEX_W_0FXOP_09_C3_L_0,
1670 VEX_W_0FXOP_09_C6_L_0,
1671 VEX_W_0FXOP_09_C7_L_0,
1672 VEX_W_0FXOP_09_CB_L_0,
1673 VEX_W_0FXOP_09_D1_L_0,
1674 VEX_W_0FXOP_09_D2_L_0,
1675 VEX_W_0FXOP_09_D3_L_0,
1676 VEX_W_0FXOP_09_D6_L_0,
1677 VEX_W_0FXOP_09_D7_L_0,
1678 VEX_W_0FXOP_09_DB_L_0,
1679 VEX_W_0FXOP_09_E1_L_0,
1680 VEX_W_0FXOP_09_E2_L_0,
1681 VEX_W_0FXOP_09_E3_L_0,
1682
1683 EVEX_W_0F5B_P_0,
1684 EVEX_W_0F62,
1685 EVEX_W_0F66,
1686 EVEX_W_0F6A,
1687 EVEX_W_0F6B,
1688 EVEX_W_0F6C,
1689 EVEX_W_0F6D,
1690 EVEX_W_0F6F_P_1,
1691 EVEX_W_0F6F_P_2,
1692 EVEX_W_0F6F_P_3,
1693 EVEX_W_0F70_P_2,
1694 EVEX_W_0F72_R_2,
1695 EVEX_W_0F72_R_6,
1696 EVEX_W_0F73_R_2,
1697 EVEX_W_0F73_R_6,
1698 EVEX_W_0F76,
1699 EVEX_W_0F78_P_0,
1700 EVEX_W_0F78_P_2,
1701 EVEX_W_0F79_P_0,
1702 EVEX_W_0F79_P_2,
1703 EVEX_W_0F7A_P_1,
1704 EVEX_W_0F7A_P_2,
1705 EVEX_W_0F7A_P_3,
1706 EVEX_W_0F7B_P_2,
1707 EVEX_W_0F7E_P_1,
1708 EVEX_W_0F7F_P_1,
1709 EVEX_W_0F7F_P_2,
1710 EVEX_W_0F7F_P_3,
1711 EVEX_W_0FD2,
1712 EVEX_W_0FD3,
1713 EVEX_W_0FD4,
1714 EVEX_W_0FD6,
1715 EVEX_W_0FE6_P_1,
1716 EVEX_W_0FE7,
1717 EVEX_W_0FF2,
1718 EVEX_W_0FF3,
1719 EVEX_W_0FF4,
1720 EVEX_W_0FFA,
1721 EVEX_W_0FFB,
1722 EVEX_W_0FFE,
1723
1724 EVEX_W_0F3810_P_1,
1725 EVEX_W_0F3810_P_2,
1726 EVEX_W_0F3811_P_1,
1727 EVEX_W_0F3811_P_2,
1728 EVEX_W_0F3812_P_1,
1729 EVEX_W_0F3812_P_2,
1730 EVEX_W_0F3813_P_1,
1731 EVEX_W_0F3814_P_1,
1732 EVEX_W_0F3815_P_1,
1733 EVEX_W_0F3819_L_n,
1734 EVEX_W_0F381A_M_0_L_n,
1735 EVEX_W_0F381B_M_0_L_2,
1736 EVEX_W_0F381E,
1737 EVEX_W_0F381F,
1738 EVEX_W_0F3820_P_1,
1739 EVEX_W_0F3821_P_1,
1740 EVEX_W_0F3822_P_1,
1741 EVEX_W_0F3823_P_1,
1742 EVEX_W_0F3824_P_1,
1743 EVEX_W_0F3825_P_1,
1744 EVEX_W_0F3825_P_2,
1745 EVEX_W_0F3828_P_2,
1746 EVEX_W_0F3829_P_2,
1747 EVEX_W_0F382A_P_1,
1748 EVEX_W_0F382A_P_2,
1749 EVEX_W_0F382B,
1750 EVEX_W_0F3830_P_1,
1751 EVEX_W_0F3831_P_1,
1752 EVEX_W_0F3832_P_1,
1753 EVEX_W_0F3833_P_1,
1754 EVEX_W_0F3834_P_1,
1755 EVEX_W_0F3835_P_1,
1756 EVEX_W_0F3835_P_2,
1757 EVEX_W_0F3837,
1758 EVEX_W_0F383A_P_1,
1759 EVEX_W_0F3859,
1760 EVEX_W_0F385A_M_0_L_n,
1761 EVEX_W_0F385B_M_0_L_2,
1762 EVEX_W_0F3870,
1763 EVEX_W_0F3872_P_2,
1764 EVEX_W_0F387A,
1765 EVEX_W_0F387B,
1766 EVEX_W_0F3883,
1767
1768 EVEX_W_0F3A18_L_n,
1769 EVEX_W_0F3A19_L_n,
1770 EVEX_W_0F3A1A_L_2,
1771 EVEX_W_0F3A1B_L_2,
1772 EVEX_W_0F3A21,
1773 EVEX_W_0F3A23_L_n,
1774 EVEX_W_0F3A38_L_n,
1775 EVEX_W_0F3A39_L_n,
1776 EVEX_W_0F3A3A_L_2,
1777 EVEX_W_0F3A3B_L_2,
1778 EVEX_W_0F3A42,
1779 EVEX_W_0F3A43_L_n,
1780 EVEX_W_0F3A70,
1781 EVEX_W_0F3A72,
1782
1783 EVEX_W_MAP5_5B_P_0,
1784 EVEX_W_MAP5_7A_P_3,
1785 };
1786
1787 typedef bool (*op_rtn) (instr_info *ins, int bytemode, int sizeflag);
1788
1789 struct dis386 {
1790 const char *name;
1791 struct
1792 {
1793 op_rtn rtn;
1794 int bytemode;
1795 } op[MAX_OPERANDS];
1796 unsigned int prefix_requirement;
1797 };
1798
1799 /* Upper case letters in the instruction names here are macros.
1800 'A' => print 'b' if no register operands or suffix_always is true
1801 'B' => print 'b' if suffix_always is true
1802 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1803 size prefix
1804 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1805 suffix_always is true
1806 'E' => print 'e' if 32-bit form of jcxz
1807 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1808 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1809 'H' => print ",pt" or ",pn" branch hint
1810 'I' unused.
1811 'J' unused.
1812 'K' => print 'd' or 'q' if rex prefix is present.
1813 'L' unused.
1814 'M' => print 'r' if intel_mnemonic is false.
1815 'N' => print 'n' if instruction has no wait "prefix"
1816 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1817 'P' => behave as 'T' except with register operand outside of suffix_always
1818 mode
1819 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1820 is true
1821 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1822 'S' => print 'w', 'l' or 'q' if suffix_always is true
1823 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1824 prefix or if suffix_always is true.
1825 'U' unused.
1826 'V' unused.
1827 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1828 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1829 'Y' unused.
1830 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1831 '!' => change condition from true to false or from false to true.
1832 '%' => add 1 upper case letter to the macro.
1833 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1834 prefix or suffix_always is true (lcall/ljmp).
1835 '@' => in 64bit mode for Intel64 ISA or if instruction
1836 has no operand sizing prefix, print 'q' if suffix_always is true or
1837 nothing otherwise; behave as 'P' in all other cases
1838
1839 2 upper case letter macros:
1840 "XY" => print 'x' or 'y' if suffix_always is true or no register
1841 operands and no broadcast.
1842 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1843 register operands and no broadcast.
1844 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1845 "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
1846 "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
1847 "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
1848 "XV" => print "{vex} " pseudo prefix
1849 "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is
1850 is used by an EVEX-encoded (AVX512VL) instruction.
1851 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1852 being false, or no operand at all in 64bit mode, or if suffix_always
1853 is true.
1854 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1855 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1856 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1857 "DQ" => print 'd' or 'q' depending on the VEX.W bit
1858 "BW" => print 'b' or 'w' depending on the VEX.W bit
1859 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1860 an operand size prefix, or suffix_always is true. print
1861 'q' if rex prefix is present.
1862
1863 Many of the above letters print nothing in Intel mode. See "putop"
1864 for the details.
1865
1866 Braces '{' and '}', and vertical bars '|', indicate alternative
1867 mnemonic strings for AT&T and Intel. */
1868
1869 static const struct dis386 dis386[] = {
1870 /* 00 */
1871 { "addB", { Ebh1, Gb }, 0 },
1872 { "addS", { Evh1, Gv }, 0 },
1873 { "addB", { Gb, EbS }, 0 },
1874 { "addS", { Gv, EvS }, 0 },
1875 { "addB", { AL, Ib }, 0 },
1876 { "addS", { eAX, Iv }, 0 },
1877 { X86_64_TABLE (X86_64_06) },
1878 { X86_64_TABLE (X86_64_07) },
1879 /* 08 */
1880 { "orB", { Ebh1, Gb }, 0 },
1881 { "orS", { Evh1, Gv }, 0 },
1882 { "orB", { Gb, EbS }, 0 },
1883 { "orS", { Gv, EvS }, 0 },
1884 { "orB", { AL, Ib }, 0 },
1885 { "orS", { eAX, Iv }, 0 },
1886 { X86_64_TABLE (X86_64_0E) },
1887 { Bad_Opcode }, /* 0x0f extended opcode escape */
1888 /* 10 */
1889 { "adcB", { Ebh1, Gb }, 0 },
1890 { "adcS", { Evh1, Gv }, 0 },
1891 { "adcB", { Gb, EbS }, 0 },
1892 { "adcS", { Gv, EvS }, 0 },
1893 { "adcB", { AL, Ib }, 0 },
1894 { "adcS", { eAX, Iv }, 0 },
1895 { X86_64_TABLE (X86_64_16) },
1896 { X86_64_TABLE (X86_64_17) },
1897 /* 18 */
1898 { "sbbB", { Ebh1, Gb }, 0 },
1899 { "sbbS", { Evh1, Gv }, 0 },
1900 { "sbbB", { Gb, EbS }, 0 },
1901 { "sbbS", { Gv, EvS }, 0 },
1902 { "sbbB", { AL, Ib }, 0 },
1903 { "sbbS", { eAX, Iv }, 0 },
1904 { X86_64_TABLE (X86_64_1E) },
1905 { X86_64_TABLE (X86_64_1F) },
1906 /* 20 */
1907 { "andB", { Ebh1, Gb }, 0 },
1908 { "andS", { Evh1, Gv }, 0 },
1909 { "andB", { Gb, EbS }, 0 },
1910 { "andS", { Gv, EvS }, 0 },
1911 { "andB", { AL, Ib }, 0 },
1912 { "andS", { eAX, Iv }, 0 },
1913 { Bad_Opcode }, /* SEG ES prefix */
1914 { X86_64_TABLE (X86_64_27) },
1915 /* 28 */
1916 { "subB", { Ebh1, Gb }, 0 },
1917 { "subS", { Evh1, Gv }, 0 },
1918 { "subB", { Gb, EbS }, 0 },
1919 { "subS", { Gv, EvS }, 0 },
1920 { "subB", { AL, Ib }, 0 },
1921 { "subS", { eAX, Iv }, 0 },
1922 { Bad_Opcode }, /* SEG CS prefix */
1923 { X86_64_TABLE (X86_64_2F) },
1924 /* 30 */
1925 { "xorB", { Ebh1, Gb }, 0 },
1926 { "xorS", { Evh1, Gv }, 0 },
1927 { "xorB", { Gb, EbS }, 0 },
1928 { "xorS", { Gv, EvS }, 0 },
1929 { "xorB", { AL, Ib }, 0 },
1930 { "xorS", { eAX, Iv }, 0 },
1931 { Bad_Opcode }, /* SEG SS prefix */
1932 { X86_64_TABLE (X86_64_37) },
1933 /* 38 */
1934 { "cmpB", { Eb, Gb }, 0 },
1935 { "cmpS", { Ev, Gv }, 0 },
1936 { "cmpB", { Gb, EbS }, 0 },
1937 { "cmpS", { Gv, EvS }, 0 },
1938 { "cmpB", { AL, Ib }, 0 },
1939 { "cmpS", { eAX, Iv }, 0 },
1940 { Bad_Opcode }, /* SEG DS prefix */
1941 { X86_64_TABLE (X86_64_3F) },
1942 /* 40 */
1943 { "inc{S|}", { RMeAX }, 0 },
1944 { "inc{S|}", { RMeCX }, 0 },
1945 { "inc{S|}", { RMeDX }, 0 },
1946 { "inc{S|}", { RMeBX }, 0 },
1947 { "inc{S|}", { RMeSP }, 0 },
1948 { "inc{S|}", { RMeBP }, 0 },
1949 { "inc{S|}", { RMeSI }, 0 },
1950 { "inc{S|}", { RMeDI }, 0 },
1951 /* 48 */
1952 { "dec{S|}", { RMeAX }, 0 },
1953 { "dec{S|}", { RMeCX }, 0 },
1954 { "dec{S|}", { RMeDX }, 0 },
1955 { "dec{S|}", { RMeBX }, 0 },
1956 { "dec{S|}", { RMeSP }, 0 },
1957 { "dec{S|}", { RMeBP }, 0 },
1958 { "dec{S|}", { RMeSI }, 0 },
1959 { "dec{S|}", { RMeDI }, 0 },
1960 /* 50 */
1961 { "push{!P|}", { RMrAX }, 0 },
1962 { "push{!P|}", { RMrCX }, 0 },
1963 { "push{!P|}", { RMrDX }, 0 },
1964 { "push{!P|}", { RMrBX }, 0 },
1965 { "push{!P|}", { RMrSP }, 0 },
1966 { "push{!P|}", { RMrBP }, 0 },
1967 { "push{!P|}", { RMrSI }, 0 },
1968 { "push{!P|}", { RMrDI }, 0 },
1969 /* 58 */
1970 { "pop{!P|}", { RMrAX }, 0 },
1971 { "pop{!P|}", { RMrCX }, 0 },
1972 { "pop{!P|}", { RMrDX }, 0 },
1973 { "pop{!P|}", { RMrBX }, 0 },
1974 { "pop{!P|}", { RMrSP }, 0 },
1975 { "pop{!P|}", { RMrBP }, 0 },
1976 { "pop{!P|}", { RMrSI }, 0 },
1977 { "pop{!P|}", { RMrDI }, 0 },
1978 /* 60 */
1979 { X86_64_TABLE (X86_64_60) },
1980 { X86_64_TABLE (X86_64_61) },
1981 { X86_64_TABLE (X86_64_62) },
1982 { X86_64_TABLE (X86_64_63) },
1983 { Bad_Opcode }, /* seg fs */
1984 { Bad_Opcode }, /* seg gs */
1985 { Bad_Opcode }, /* op size prefix */
1986 { Bad_Opcode }, /* adr size prefix */
1987 /* 68 */
1988 { "pushP", { sIv }, 0 },
1989 { "imulS", { Gv, Ev, Iv }, 0 },
1990 { "pushP", { sIbT }, 0 },
1991 { "imulS", { Gv, Ev, sIb }, 0 },
1992 { "ins{b|}", { Ybr, indirDX }, 0 },
1993 { X86_64_TABLE (X86_64_6D) },
1994 { "outs{b|}", { indirDXr, Xb }, 0 },
1995 { X86_64_TABLE (X86_64_6F) },
1996 /* 70 */
1997 { "joH", { Jb, BND, cond_jump_flag }, 0 },
1998 { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
1999 { "jbH", { Jb, BND, cond_jump_flag }, 0 },
2000 { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
2001 { "jeH", { Jb, BND, cond_jump_flag }, 0 },
2002 { "jneH", { Jb, BND, cond_jump_flag }, 0 },
2003 { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
2004 { "jaH", { Jb, BND, cond_jump_flag }, 0 },
2005 /* 78 */
2006 { "jsH", { Jb, BND, cond_jump_flag }, 0 },
2007 { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
2008 { "jpH", { Jb, BND, cond_jump_flag }, 0 },
2009 { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
2010 { "jlH", { Jb, BND, cond_jump_flag }, 0 },
2011 { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
2012 { "jleH", { Jb, BND, cond_jump_flag }, 0 },
2013 { "jgH", { Jb, BND, cond_jump_flag }, 0 },
2014 /* 80 */
2015 { REG_TABLE (REG_80) },
2016 { REG_TABLE (REG_81) },
2017 { X86_64_TABLE (X86_64_82) },
2018 { REG_TABLE (REG_83) },
2019 { "testB", { Eb, Gb }, 0 },
2020 { "testS", { Ev, Gv }, 0 },
2021 { "xchgB", { Ebh2, Gb }, 0 },
2022 { "xchgS", { Evh2, Gv }, 0 },
2023 /* 88 */
2024 { "movB", { Ebh3, Gb }, 0 },
2025 { "movS", { Evh3, Gv }, 0 },
2026 { "movB", { Gb, EbS }, 0 },
2027 { "movS", { Gv, EvS }, 0 },
2028 { "movD", { Sv, Sw }, 0 },
2029 { MOD_TABLE (MOD_8D) },
2030 { "movD", { Sw, Sv }, 0 },
2031 { REG_TABLE (REG_8F) },
2032 /* 90 */
2033 { PREFIX_TABLE (PREFIX_90) },
2034 { "xchgS", { RMeCX, eAX }, 0 },
2035 { "xchgS", { RMeDX, eAX }, 0 },
2036 { "xchgS", { RMeBX, eAX }, 0 },
2037 { "xchgS", { RMeSP, eAX }, 0 },
2038 { "xchgS", { RMeBP, eAX }, 0 },
2039 { "xchgS", { RMeSI, eAX }, 0 },
2040 { "xchgS", { RMeDI, eAX }, 0 },
2041 /* 98 */
2042 { "cW{t|}R", { XX }, 0 },
2043 { "cR{t|}O", { XX }, 0 },
2044 { X86_64_TABLE (X86_64_9A) },
2045 { Bad_Opcode }, /* fwait */
2046 { "pushfP", { XX }, 0 },
2047 { "popfP", { XX }, 0 },
2048 { "sahf", { XX }, 0 },
2049 { "lahf", { XX }, 0 },
2050 /* a0 */
2051 { "mov%LB", { AL, Ob }, 0 },
2052 { "mov%LS", { eAX, Ov }, 0 },
2053 { "mov%LB", { Ob, AL }, 0 },
2054 { "mov%LS", { Ov, eAX }, 0 },
2055 { "movs{b|}", { Ybr, Xb }, 0 },
2056 { "movs{R|}", { Yvr, Xv }, 0 },
2057 { "cmps{b|}", { Xb, Yb }, 0 },
2058 { "cmps{R|}", { Xv, Yv }, 0 },
2059 /* a8 */
2060 { "testB", { AL, Ib }, 0 },
2061 { "testS", { eAX, Iv }, 0 },
2062 { "stosB", { Ybr, AL }, 0 },
2063 { "stosS", { Yvr, eAX }, 0 },
2064 { "lodsB", { ALr, Xb }, 0 },
2065 { "lodsS", { eAXr, Xv }, 0 },
2066 { "scasB", { AL, Yb }, 0 },
2067 { "scasS", { eAX, Yv }, 0 },
2068 /* b0 */
2069 { "movB", { RMAL, Ib }, 0 },
2070 { "movB", { RMCL, Ib }, 0 },
2071 { "movB", { RMDL, Ib }, 0 },
2072 { "movB", { RMBL, Ib }, 0 },
2073 { "movB", { RMAH, Ib }, 0 },
2074 { "movB", { RMCH, Ib }, 0 },
2075 { "movB", { RMDH, Ib }, 0 },
2076 { "movB", { RMBH, Ib }, 0 },
2077 /* b8 */
2078 { "mov%LV", { RMeAX, Iv64 }, 0 },
2079 { "mov%LV", { RMeCX, Iv64 }, 0 },
2080 { "mov%LV", { RMeDX, Iv64 }, 0 },
2081 { "mov%LV", { RMeBX, Iv64 }, 0 },
2082 { "mov%LV", { RMeSP, Iv64 }, 0 },
2083 { "mov%LV", { RMeBP, Iv64 }, 0 },
2084 { "mov%LV", { RMeSI, Iv64 }, 0 },
2085 { "mov%LV", { RMeDI, Iv64 }, 0 },
2086 /* c0 */
2087 { REG_TABLE (REG_C0) },
2088 { REG_TABLE (REG_C1) },
2089 { X86_64_TABLE (X86_64_C2) },
2090 { X86_64_TABLE (X86_64_C3) },
2091 { X86_64_TABLE (X86_64_C4) },
2092 { X86_64_TABLE (X86_64_C5) },
2093 { REG_TABLE (REG_C6) },
2094 { REG_TABLE (REG_C7) },
2095 /* c8 */
2096 { "enterP", { Iw, Ib }, 0 },
2097 { "leaveP", { XX }, 0 },
2098 { "{l|}ret{|f}%LP", { Iw }, 0 },
2099 { "{l|}ret{|f}%LP", { XX }, 0 },
2100 { "int3", { XX }, 0 },
2101 { "int", { Ib }, 0 },
2102 { X86_64_TABLE (X86_64_CE) },
2103 { "iret%LP", { XX }, 0 },
2104 /* d0 */
2105 { REG_TABLE (REG_D0) },
2106 { REG_TABLE (REG_D1) },
2107 { REG_TABLE (REG_D2) },
2108 { REG_TABLE (REG_D3) },
2109 { X86_64_TABLE (X86_64_D4) },
2110 { X86_64_TABLE (X86_64_D5) },
2111 { Bad_Opcode },
2112 { "xlat", { DSBX }, 0 },
2113 /* d8 */
2114 { FLOAT },
2115 { FLOAT },
2116 { FLOAT },
2117 { FLOAT },
2118 { FLOAT },
2119 { FLOAT },
2120 { FLOAT },
2121 { FLOAT },
2122 /* e0 */
2123 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
2124 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
2125 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
2126 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
2127 { "inB", { AL, Ib }, 0 },
2128 { "inG", { zAX, Ib }, 0 },
2129 { "outB", { Ib, AL }, 0 },
2130 { "outG", { Ib, zAX }, 0 },
2131 /* e8 */
2132 { X86_64_TABLE (X86_64_E8) },
2133 { X86_64_TABLE (X86_64_E9) },
2134 { X86_64_TABLE (X86_64_EA) },
2135 { "jmp", { Jb, BND }, 0 },
2136 { "inB", { AL, indirDX }, 0 },
2137 { "inG", { zAX, indirDX }, 0 },
2138 { "outB", { indirDX, AL }, 0 },
2139 { "outG", { indirDX, zAX }, 0 },
2140 /* f0 */
2141 { Bad_Opcode }, /* lock prefix */
2142 { "int1", { XX }, 0 },
2143 { Bad_Opcode }, /* repne */
2144 { Bad_Opcode }, /* repz */
2145 { "hlt", { XX }, 0 },
2146 { "cmc", { XX }, 0 },
2147 { REG_TABLE (REG_F6) },
2148 { REG_TABLE (REG_F7) },
2149 /* f8 */
2150 { "clc", { XX }, 0 },
2151 { "stc", { XX }, 0 },
2152 { "cli", { XX }, 0 },
2153 { "sti", { XX }, 0 },
2154 { "cld", { XX }, 0 },
2155 { "std", { XX }, 0 },
2156 { REG_TABLE (REG_FE) },
2157 { REG_TABLE (REG_FF) },
2158 };
2159
2160 static const struct dis386 dis386_twobyte[] = {
2161 /* 00 */
2162 { REG_TABLE (REG_0F00 ) },
2163 { REG_TABLE (REG_0F01 ) },
2164 { MOD_TABLE (MOD_0F02) },
2165 { MOD_TABLE (MOD_0F03) },
2166 { Bad_Opcode },
2167 { "syscall", { XX }, 0 },
2168 { "clts", { XX }, 0 },
2169 { "sysret%LQ", { XX }, 0 },
2170 /* 08 */
2171 { "invd", { XX }, 0 },
2172 { PREFIX_TABLE (PREFIX_0F09) },
2173 { Bad_Opcode },
2174 { "ud2", { XX }, 0 },
2175 { Bad_Opcode },
2176 { REG_TABLE (REG_0F0D) },
2177 { "femms", { XX }, 0 },
2178 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
2179 /* 10 */
2180 { PREFIX_TABLE (PREFIX_0F10) },
2181 { PREFIX_TABLE (PREFIX_0F11) },
2182 { PREFIX_TABLE (PREFIX_0F12) },
2183 { MOD_TABLE (MOD_0F13) },
2184 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2185 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
2186 { PREFIX_TABLE (PREFIX_0F16) },
2187 { MOD_TABLE (MOD_0F17) },
2188 /* 18 */
2189 { REG_TABLE (REG_0F18) },
2190 { "nopQ", { Ev }, 0 },
2191 { PREFIX_TABLE (PREFIX_0F1A) },
2192 { PREFIX_TABLE (PREFIX_0F1B) },
2193 { PREFIX_TABLE (PREFIX_0F1C) },
2194 { "nopQ", { Ev }, 0 },
2195 { PREFIX_TABLE (PREFIX_0F1E) },
2196 { "nopQ", { Ev }, 0 },
2197 /* 20 */
2198 { "movZ", { Em, Cm }, 0 },
2199 { "movZ", { Em, Dm }, 0 },
2200 { "movZ", { Cm, Em }, 0 },
2201 { "movZ", { Dm, Em }, 0 },
2202 { X86_64_TABLE (X86_64_0F24) },
2203 { Bad_Opcode },
2204 { X86_64_TABLE (X86_64_0F26) },
2205 { Bad_Opcode },
2206 /* 28 */
2207 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2208 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
2209 { PREFIX_TABLE (PREFIX_0F2A) },
2210 { PREFIX_TABLE (PREFIX_0F2B) },
2211 { PREFIX_TABLE (PREFIX_0F2C) },
2212 { PREFIX_TABLE (PREFIX_0F2D) },
2213 { PREFIX_TABLE (PREFIX_0F2E) },
2214 { PREFIX_TABLE (PREFIX_0F2F) },
2215 /* 30 */
2216 { "wrmsr", { XX }, 0 },
2217 { "rdtsc", { XX }, 0 },
2218 { "rdmsr", { XX }, 0 },
2219 { "rdpmc", { XX }, 0 },
2220 { "sysenter", { SEP }, 0 },
2221 { "sysexit%LQ", { SEP }, 0 },
2222 { Bad_Opcode },
2223 { "getsec", { XX }, 0 },
2224 /* 38 */
2225 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2226 { Bad_Opcode },
2227 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2228 { Bad_Opcode },
2229 { Bad_Opcode },
2230 { Bad_Opcode },
2231 { Bad_Opcode },
2232 { Bad_Opcode },
2233 /* 40 */
2234 { "cmovoS", { Gv, Ev }, 0 },
2235 { "cmovnoS", { Gv, Ev }, 0 },
2236 { "cmovbS", { Gv, Ev }, 0 },
2237 { "cmovaeS", { Gv, Ev }, 0 },
2238 { "cmoveS", { Gv, Ev }, 0 },
2239 { "cmovneS", { Gv, Ev }, 0 },
2240 { "cmovbeS", { Gv, Ev }, 0 },
2241 { "cmovaS", { Gv, Ev }, 0 },
2242 /* 48 */
2243 { "cmovsS", { Gv, Ev }, 0 },
2244 { "cmovnsS", { Gv, Ev }, 0 },
2245 { "cmovpS", { Gv, Ev }, 0 },
2246 { "cmovnpS", { Gv, Ev }, 0 },
2247 { "cmovlS", { Gv, Ev }, 0 },
2248 { "cmovgeS", { Gv, Ev }, 0 },
2249 { "cmovleS", { Gv, Ev }, 0 },
2250 { "cmovgS", { Gv, Ev }, 0 },
2251 /* 50 */
2252 { MOD_TABLE (MOD_0F50) },
2253 { PREFIX_TABLE (PREFIX_0F51) },
2254 { PREFIX_TABLE (PREFIX_0F52) },
2255 { PREFIX_TABLE (PREFIX_0F53) },
2256 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2257 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2258 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2259 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
2260 /* 58 */
2261 { PREFIX_TABLE (PREFIX_0F58) },
2262 { PREFIX_TABLE (PREFIX_0F59) },
2263 { PREFIX_TABLE (PREFIX_0F5A) },
2264 { PREFIX_TABLE (PREFIX_0F5B) },
2265 { PREFIX_TABLE (PREFIX_0F5C) },
2266 { PREFIX_TABLE (PREFIX_0F5D) },
2267 { PREFIX_TABLE (PREFIX_0F5E) },
2268 { PREFIX_TABLE (PREFIX_0F5F) },
2269 /* 60 */
2270 { PREFIX_TABLE (PREFIX_0F60) },
2271 { PREFIX_TABLE (PREFIX_0F61) },
2272 { PREFIX_TABLE (PREFIX_0F62) },
2273 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2274 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2275 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2276 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2277 { "packuswb", { MX, EM }, PREFIX_OPCODE },
2278 /* 68 */
2279 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2280 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2281 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2282 { "packssdw", { MX, EM }, PREFIX_OPCODE },
2283 { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2284 { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
2285 { "movK", { MX, Edq }, PREFIX_OPCODE },
2286 { PREFIX_TABLE (PREFIX_0F6F) },
2287 /* 70 */
2288 { PREFIX_TABLE (PREFIX_0F70) },
2289 { MOD_TABLE (MOD_0F71) },
2290 { MOD_TABLE (MOD_0F72) },
2291 { MOD_TABLE (MOD_0F73) },
2292 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2293 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2294 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2295 { "emms", { XX }, PREFIX_OPCODE },
2296 /* 78 */
2297 { PREFIX_TABLE (PREFIX_0F78) },
2298 { PREFIX_TABLE (PREFIX_0F79) },
2299 { Bad_Opcode },
2300 { Bad_Opcode },
2301 { PREFIX_TABLE (PREFIX_0F7C) },
2302 { PREFIX_TABLE (PREFIX_0F7D) },
2303 { PREFIX_TABLE (PREFIX_0F7E) },
2304 { PREFIX_TABLE (PREFIX_0F7F) },
2305 /* 80 */
2306 { "joH", { Jv, BND, cond_jump_flag }, 0 },
2307 { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
2308 { "jbH", { Jv, BND, cond_jump_flag }, 0 },
2309 { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
2310 { "jeH", { Jv, BND, cond_jump_flag }, 0 },
2311 { "jneH", { Jv, BND, cond_jump_flag }, 0 },
2312 { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
2313 { "jaH", { Jv, BND, cond_jump_flag }, 0 },
2314 /* 88 */
2315 { "jsH", { Jv, BND, cond_jump_flag }, 0 },
2316 { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
2317 { "jpH", { Jv, BND, cond_jump_flag }, 0 },
2318 { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
2319 { "jlH", { Jv, BND, cond_jump_flag }, 0 },
2320 { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
2321 { "jleH", { Jv, BND, cond_jump_flag }, 0 },
2322 { "jgH", { Jv, BND, cond_jump_flag }, 0 },
2323 /* 90 */
2324 { "seto", { Eb }, 0 },
2325 { "setno", { Eb }, 0 },
2326 { "setb", { Eb }, 0 },
2327 { "setae", { Eb }, 0 },
2328 { "sete", { Eb }, 0 },
2329 { "setne", { Eb }, 0 },
2330 { "setbe", { Eb }, 0 },
2331 { "seta", { Eb }, 0 },
2332 /* 98 */
2333 { "sets", { Eb }, 0 },
2334 { "setns", { Eb }, 0 },
2335 { "setp", { Eb }, 0 },
2336 { "setnp", { Eb }, 0 },
2337 { "setl", { Eb }, 0 },
2338 { "setge", { Eb }, 0 },
2339 { "setle", { Eb }, 0 },
2340 { "setg", { Eb }, 0 },
2341 /* a0 */
2342 { "pushP", { fs }, 0 },
2343 { "popP", { fs }, 0 },
2344 { "cpuid", { XX }, 0 },
2345 { "btS", { Ev, Gv }, 0 },
2346 { "shldS", { Ev, Gv, Ib }, 0 },
2347 { "shldS", { Ev, Gv, CL }, 0 },
2348 { REG_TABLE (REG_0FA6) },
2349 { REG_TABLE (REG_0FA7) },
2350 /* a8 */
2351 { "pushP", { gs }, 0 },
2352 { "popP", { gs }, 0 },
2353 { "rsm", { XX }, 0 },
2354 { "btsS", { Evh1, Gv }, 0 },
2355 { "shrdS", { Ev, Gv, Ib }, 0 },
2356 { "shrdS", { Ev, Gv, CL }, 0 },
2357 { REG_TABLE (REG_0FAE) },
2358 { "imulS", { Gv, Ev }, 0 },
2359 /* b0 */
2360 { "cmpxchgB", { Ebh1, Gb }, 0 },
2361 { "cmpxchgS", { Evh1, Gv }, 0 },
2362 { MOD_TABLE (MOD_0FB2) },
2363 { "btrS", { Evh1, Gv }, 0 },
2364 { MOD_TABLE (MOD_0FB4) },
2365 { MOD_TABLE (MOD_0FB5) },
2366 { "movz{bR|x}", { Gv, Eb }, 0 },
2367 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2368 /* b8 */
2369 { PREFIX_TABLE (PREFIX_0FB8) },
2370 { "ud1S", { Gv, Ev }, 0 },
2371 { REG_TABLE (REG_0FBA) },
2372 { "btcS", { Evh1, Gv }, 0 },
2373 { PREFIX_TABLE (PREFIX_0FBC) },
2374 { PREFIX_TABLE (PREFIX_0FBD) },
2375 { "movs{bR|x}", { Gv, Eb }, 0 },
2376 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2377 /* c0 */
2378 { "xaddB", { Ebh1, Gb }, 0 },
2379 { "xaddS", { Evh1, Gv }, 0 },
2380 { PREFIX_TABLE (PREFIX_0FC2) },
2381 { MOD_TABLE (MOD_0FC3) },
2382 { "pinsrw", { MX, Edw, Ib }, PREFIX_OPCODE },
2383 { "pextrw", { Gd, MS, Ib }, PREFIX_OPCODE },
2384 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
2385 { REG_TABLE (REG_0FC7) },
2386 /* c8 */
2387 { "bswap", { RMeAX }, 0 },
2388 { "bswap", { RMeCX }, 0 },
2389 { "bswap", { RMeDX }, 0 },
2390 { "bswap", { RMeBX }, 0 },
2391 { "bswap", { RMeSP }, 0 },
2392 { "bswap", { RMeBP }, 0 },
2393 { "bswap", { RMeSI }, 0 },
2394 { "bswap", { RMeDI }, 0 },
2395 /* d0 */
2396 { PREFIX_TABLE (PREFIX_0FD0) },
2397 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2398 { "psrld", { MX, EM }, PREFIX_OPCODE },
2399 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2400 { "paddq", { MX, EM }, PREFIX_OPCODE },
2401 { "pmullw", { MX, EM }, PREFIX_OPCODE },
2402 { PREFIX_TABLE (PREFIX_0FD6) },
2403 { MOD_TABLE (MOD_0FD7) },
2404 /* d8 */
2405 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2406 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2407 { "pminub", { MX, EM }, PREFIX_OPCODE },
2408 { "pand", { MX, EM }, PREFIX_OPCODE },
2409 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2410 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2411 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2412 { "pandn", { MX, EM }, PREFIX_OPCODE },
2413 /* e0 */
2414 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2415 { "psraw", { MX, EM }, PREFIX_OPCODE },
2416 { "psrad", { MX, EM }, PREFIX_OPCODE },
2417 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2418 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2419 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
2420 { PREFIX_TABLE (PREFIX_0FE6) },
2421 { PREFIX_TABLE (PREFIX_0FE7) },
2422 /* e8 */
2423 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2424 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2425 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2426 { "por", { MX, EM }, PREFIX_OPCODE },
2427 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2428 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2429 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2430 { "pxor", { MX, EM }, PREFIX_OPCODE },
2431 /* f0 */
2432 { PREFIX_TABLE (PREFIX_0FF0) },
2433 { "psllw", { MX, EM }, PREFIX_OPCODE },
2434 { "pslld", { MX, EM }, PREFIX_OPCODE },
2435 { "psllq", { MX, EM }, PREFIX_OPCODE },
2436 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2437 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2438 { "psadbw", { MX, EM }, PREFIX_OPCODE },
2439 { PREFIX_TABLE (PREFIX_0FF7) },
2440 /* f8 */
2441 { "psubb", { MX, EM }, PREFIX_OPCODE },
2442 { "psubw", { MX, EM }, PREFIX_OPCODE },
2443 { "psubd", { MX, EM }, PREFIX_OPCODE },
2444 { "psubq", { MX, EM }, PREFIX_OPCODE },
2445 { "paddb", { MX, EM }, PREFIX_OPCODE },
2446 { "paddw", { MX, EM }, PREFIX_OPCODE },
2447 { "paddd", { MX, EM }, PREFIX_OPCODE },
2448 { "ud0S", { Gv, Ev }, 0 },
2449 };
2450
2451 static const bool onebyte_has_modrm[256] = {
2452 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2453 /* ------------------------------- */
2454 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2455 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2456 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2457 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2458 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2459 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2460 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2461 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2462 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2463 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2464 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2465 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2466 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2467 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2468 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2469 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2470 /* ------------------------------- */
2471 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2472 };
2473
2474 static const bool twobyte_has_modrm[256] = {
2475 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2476 /* ------------------------------- */
2477 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2478 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2479 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2480 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2481 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2482 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2483 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2484 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2485 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2486 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2487 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2488 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2489 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2490 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2491 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2492 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2493 /* ------------------------------- */
2494 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2495 };
2496
2497
2498 struct op
2499 {
2500 const char *name;
2501 unsigned int len;
2502 };
2503
2504 /* If we are accessing mod/rm/reg without need_modrm set, then the
2505 values are stale. Hitting this abort likely indicates that you
2506 need to update onebyte_has_modrm or twobyte_has_modrm. */
2507 #define MODRM_CHECK if (!ins->need_modrm) abort ()
2508
2509 static const char intel_index16[][6] = {
2510 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2511 };
2512
2513 static const char att_names64[][8] = {
2514 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2515 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2516 };
2517 static const char att_names32[][8] = {
2518 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2519 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2520 };
2521 static const char att_names16[][8] = {
2522 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2523 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2524 };
2525 static const char att_names8[][8] = {
2526 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2527 };
2528 static const char att_names8rex[][8] = {
2529 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2530 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2531 };
2532 static const char att_names_seg[][4] = {
2533 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2534 };
2535 static const char att_index64[] = "%riz";
2536 static const char att_index32[] = "%eiz";
2537 static const char att_index16[][8] = {
2538 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2539 };
2540
2541 static const char att_names_mm[][8] = {
2542 "%mm0", "%mm1", "%mm2", "%mm3",
2543 "%mm4", "%mm5", "%mm6", "%mm7"
2544 };
2545
2546 static const char att_names_bnd[][8] = {
2547 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2548 };
2549
2550 static const char att_names_xmm[][8] = {
2551 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2552 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2553 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2554 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2555 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2556 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2557 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2558 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2559 };
2560
2561 static const char att_names_ymm[][8] = {
2562 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2563 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2564 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2565 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2566 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2567 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2568 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2569 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2570 };
2571
2572 static const char att_names_zmm[][8] = {
2573 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2574 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2575 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2576 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2577 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2578 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2579 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2580 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2581 };
2582
2583 static const char att_names_tmm[][8] = {
2584 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2585 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2586 };
2587
2588 static const char att_names_mask[][8] = {
2589 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2590 };
2591
2592 static const char *const names_rounding[] =
2593 {
2594 "{rn-",
2595 "{rd-",
2596 "{ru-",
2597 "{rz-"
2598 };
2599
2600 static const struct dis386 reg_table[][8] = {
2601 /* REG_80 */
2602 {
2603 { "addA", { Ebh1, Ib }, 0 },
2604 { "orA", { Ebh1, Ib }, 0 },
2605 { "adcA", { Ebh1, Ib }, 0 },
2606 { "sbbA", { Ebh1, Ib }, 0 },
2607 { "andA", { Ebh1, Ib }, 0 },
2608 { "subA", { Ebh1, Ib }, 0 },
2609 { "xorA", { Ebh1, Ib }, 0 },
2610 { "cmpA", { Eb, Ib }, 0 },
2611 },
2612 /* REG_81 */
2613 {
2614 { "addQ", { Evh1, Iv }, 0 },
2615 { "orQ", { Evh1, Iv }, 0 },
2616 { "adcQ", { Evh1, Iv }, 0 },
2617 { "sbbQ", { Evh1, Iv }, 0 },
2618 { "andQ", { Evh1, Iv }, 0 },
2619 { "subQ", { Evh1, Iv }, 0 },
2620 { "xorQ", { Evh1, Iv }, 0 },
2621 { "cmpQ", { Ev, Iv }, 0 },
2622 },
2623 /* REG_83 */
2624 {
2625 { "addQ", { Evh1, sIb }, 0 },
2626 { "orQ", { Evh1, sIb }, 0 },
2627 { "adcQ", { Evh1, sIb }, 0 },
2628 { "sbbQ", { Evh1, sIb }, 0 },
2629 { "andQ", { Evh1, sIb }, 0 },
2630 { "subQ", { Evh1, sIb }, 0 },
2631 { "xorQ", { Evh1, sIb }, 0 },
2632 { "cmpQ", { Ev, sIb }, 0 },
2633 },
2634 /* REG_8F */
2635 {
2636 { "pop{P|}", { stackEv }, 0 },
2637 { XOP_8F_TABLE (XOP_09) },
2638 { Bad_Opcode },
2639 { Bad_Opcode },
2640 { Bad_Opcode },
2641 { XOP_8F_TABLE (XOP_09) },
2642 },
2643 /* REG_C0 */
2644 {
2645 { "rolA", { Eb, Ib }, 0 },
2646 { "rorA", { Eb, Ib }, 0 },
2647 { "rclA", { Eb, Ib }, 0 },
2648 { "rcrA", { Eb, Ib }, 0 },
2649 { "shlA", { Eb, Ib }, 0 },
2650 { "shrA", { Eb, Ib }, 0 },
2651 { "shlA", { Eb, Ib }, 0 },
2652 { "sarA", { Eb, Ib }, 0 },
2653 },
2654 /* REG_C1 */
2655 {
2656 { "rolQ", { Ev, Ib }, 0 },
2657 { "rorQ", { Ev, Ib }, 0 },
2658 { "rclQ", { Ev, Ib }, 0 },
2659 { "rcrQ", { Ev, Ib }, 0 },
2660 { "shlQ", { Ev, Ib }, 0 },
2661 { "shrQ", { Ev, Ib }, 0 },
2662 { "shlQ", { Ev, Ib }, 0 },
2663 { "sarQ", { Ev, Ib }, 0 },
2664 },
2665 /* REG_C6 */
2666 {
2667 { "movA", { Ebh3, Ib }, 0 },
2668 { Bad_Opcode },
2669 { Bad_Opcode },
2670 { Bad_Opcode },
2671 { Bad_Opcode },
2672 { Bad_Opcode },
2673 { Bad_Opcode },
2674 { MOD_TABLE (MOD_C6_REG_7) },
2675 },
2676 /* REG_C7 */
2677 {
2678 { "movQ", { Evh3, Iv }, 0 },
2679 { Bad_Opcode },
2680 { Bad_Opcode },
2681 { Bad_Opcode },
2682 { Bad_Opcode },
2683 { Bad_Opcode },
2684 { Bad_Opcode },
2685 { MOD_TABLE (MOD_C7_REG_7) },
2686 },
2687 /* REG_D0 */
2688 {
2689 { "rolA", { Eb, I1 }, 0 },
2690 { "rorA", { Eb, I1 }, 0 },
2691 { "rclA", { Eb, I1 }, 0 },
2692 { "rcrA", { Eb, I1 }, 0 },
2693 { "shlA", { Eb, I1 }, 0 },
2694 { "shrA", { Eb, I1 }, 0 },
2695 { "shlA", { Eb, I1 }, 0 },
2696 { "sarA", { Eb, I1 }, 0 },
2697 },
2698 /* REG_D1 */
2699 {
2700 { "rolQ", { Ev, I1 }, 0 },
2701 { "rorQ", { Ev, I1 }, 0 },
2702 { "rclQ", { Ev, I1 }, 0 },
2703 { "rcrQ", { Ev, I1 }, 0 },
2704 { "shlQ", { Ev, I1 }, 0 },
2705 { "shrQ", { Ev, I1 }, 0 },
2706 { "shlQ", { Ev, I1 }, 0 },
2707 { "sarQ", { Ev, I1 }, 0 },
2708 },
2709 /* REG_D2 */
2710 {
2711 { "rolA", { Eb, CL }, 0 },
2712 { "rorA", { Eb, CL }, 0 },
2713 { "rclA", { Eb, CL }, 0 },
2714 { "rcrA", { Eb, CL }, 0 },
2715 { "shlA", { Eb, CL }, 0 },
2716 { "shrA", { Eb, CL }, 0 },
2717 { "shlA", { Eb, CL }, 0 },
2718 { "sarA", { Eb, CL }, 0 },
2719 },
2720 /* REG_D3 */
2721 {
2722 { "rolQ", { Ev, CL }, 0 },
2723 { "rorQ", { Ev, CL }, 0 },
2724 { "rclQ", { Ev, CL }, 0 },
2725 { "rcrQ", { Ev, CL }, 0 },
2726 { "shlQ", { Ev, CL }, 0 },
2727 { "shrQ", { Ev, CL }, 0 },
2728 { "shlQ", { Ev, CL }, 0 },
2729 { "sarQ", { Ev, CL }, 0 },
2730 },
2731 /* REG_F6 */
2732 {
2733 { "testA", { Eb, Ib }, 0 },
2734 { "testA", { Eb, Ib }, 0 },
2735 { "notA", { Ebh1 }, 0 },
2736 { "negA", { Ebh1 }, 0 },
2737 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
2738 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
2739 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
2740 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
2741 },
2742 /* REG_F7 */
2743 {
2744 { "testQ", { Ev, Iv }, 0 },
2745 { "testQ", { Ev, Iv }, 0 },
2746 { "notQ", { Evh1 }, 0 },
2747 { "negQ", { Evh1 }, 0 },
2748 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
2749 { "imulQ", { Ev }, 0 },
2750 { "divQ", { Ev }, 0 },
2751 { "idivQ", { Ev }, 0 },
2752 },
2753 /* REG_FE */
2754 {
2755 { "incA", { Ebh1 }, 0 },
2756 { "decA", { Ebh1 }, 0 },
2757 },
2758 /* REG_FF */
2759 {
2760 { "incQ", { Evh1 }, 0 },
2761 { "decQ", { Evh1 }, 0 },
2762 { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
2763 { MOD_TABLE (MOD_FF_REG_3) },
2764 { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
2765 { MOD_TABLE (MOD_FF_REG_5) },
2766 { "push{P|}", { stackEv }, 0 },
2767 { Bad_Opcode },
2768 },
2769 /* REG_0F00 */
2770 {
2771 { "sldtD", { Sv }, 0 },
2772 { "strD", { Sv }, 0 },
2773 { "lldt", { Ew }, 0 },
2774 { "ltr", { Ew }, 0 },
2775 { "verr", { Ew }, 0 },
2776 { "verw", { Ew }, 0 },
2777 { Bad_Opcode },
2778 { Bad_Opcode },
2779 },
2780 /* REG_0F01 */
2781 {
2782 { MOD_TABLE (MOD_0F01_REG_0) },
2783 { MOD_TABLE (MOD_0F01_REG_1) },
2784 { MOD_TABLE (MOD_0F01_REG_2) },
2785 { MOD_TABLE (MOD_0F01_REG_3) },
2786 { "smswD", { Sv }, 0 },
2787 { MOD_TABLE (MOD_0F01_REG_5) },
2788 { "lmsw", { Ew }, 0 },
2789 { MOD_TABLE (MOD_0F01_REG_7) },
2790 },
2791 /* REG_0F0D */
2792 {
2793 { "prefetch", { Mb }, 0 },
2794 { "prefetchw", { Mb }, 0 },
2795 { "prefetchwt1", { Mb }, 0 },
2796 { "prefetch", { Mb }, 0 },
2797 { "prefetch", { Mb }, 0 },
2798 { "prefetch", { Mb }, 0 },
2799 { "prefetch", { Mb }, 0 },
2800 { "prefetch", { Mb }, 0 },
2801 },
2802 /* REG_0F18 */
2803 {
2804 { MOD_TABLE (MOD_0F18_REG_0) },
2805 { MOD_TABLE (MOD_0F18_REG_1) },
2806 { MOD_TABLE (MOD_0F18_REG_2) },
2807 { MOD_TABLE (MOD_0F18_REG_3) },
2808 { "nopQ", { Ev }, 0 },
2809 { "nopQ", { Ev }, 0 },
2810 { MOD_TABLE (MOD_0F18_REG_6) },
2811 { MOD_TABLE (MOD_0F18_REG_7) },
2812 },
2813 /* REG_0F1C_P_0_MOD_0 */
2814 {
2815 { "cldemote", { Mb }, 0 },
2816 { "nopQ", { Ev }, 0 },
2817 { "nopQ", { Ev }, 0 },
2818 { "nopQ", { Ev }, 0 },
2819 { "nopQ", { Ev }, 0 },
2820 { "nopQ", { Ev }, 0 },
2821 { "nopQ", { Ev }, 0 },
2822 { "nopQ", { Ev }, 0 },
2823 },
2824 /* REG_0F1E_P_1_MOD_3 */
2825 {
2826 { "nopQ", { Ev }, PREFIX_IGNORED },
2827 { "rdsspK", { Edq }, 0 },
2828 { "nopQ", { Ev }, PREFIX_IGNORED },
2829 { "nopQ", { Ev }, PREFIX_IGNORED },
2830 { "nopQ", { Ev }, PREFIX_IGNORED },
2831 { "nopQ", { Ev }, PREFIX_IGNORED },
2832 { "nopQ", { Ev }, PREFIX_IGNORED },
2833 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
2834 },
2835 /* REG_0F38D8_PREFIX_1 */
2836 {
2837 { "aesencwide128kl", { M }, 0 },
2838 { "aesdecwide128kl", { M }, 0 },
2839 { "aesencwide256kl", { M }, 0 },
2840 { "aesdecwide256kl", { M }, 0 },
2841 },
2842 /* REG_0F3A0F_PREFIX_1_MOD_3 */
2843 {
2844 { RM_TABLE (RM_0F3A0F_P_1_MOD_3_REG_0) },
2845 },
2846 /* REG_0F71_MOD_0 */
2847 {
2848 { Bad_Opcode },
2849 { Bad_Opcode },
2850 { "psrlw", { MS, Ib }, PREFIX_OPCODE },
2851 { Bad_Opcode },
2852 { "psraw", { MS, Ib }, PREFIX_OPCODE },
2853 { Bad_Opcode },
2854 { "psllw", { MS, Ib }, PREFIX_OPCODE },
2855 },
2856 /* REG_0F72_MOD_0 */
2857 {
2858 { Bad_Opcode },
2859 { Bad_Opcode },
2860 { "psrld", { MS, Ib }, PREFIX_OPCODE },
2861 { Bad_Opcode },
2862 { "psrad", { MS, Ib }, PREFIX_OPCODE },
2863 { Bad_Opcode },
2864 { "pslld", { MS, Ib }, PREFIX_OPCODE },
2865 },
2866 /* REG_0F73_MOD_0 */
2867 {
2868 { Bad_Opcode },
2869 { Bad_Opcode },
2870 { "psrlq", { MS, Ib }, PREFIX_OPCODE },
2871 { "psrldq", { XS, Ib }, PREFIX_DATA },
2872 { Bad_Opcode },
2873 { Bad_Opcode },
2874 { "psllq", { MS, Ib }, PREFIX_OPCODE },
2875 { "pslldq", { XS, Ib }, PREFIX_DATA },
2876 },
2877 /* REG_0FA6 */
2878 {
2879 { "montmul", { { OP_0f07, 0 } }, 0 },
2880 { "xsha1", { { OP_0f07, 0 } }, 0 },
2881 { "xsha256", { { OP_0f07, 0 } }, 0 },
2882 },
2883 /* REG_0FA7 */
2884 {
2885 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
2886 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
2887 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
2888 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
2889 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
2890 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
2891 },
2892 /* REG_0FAE */
2893 {
2894 { MOD_TABLE (MOD_0FAE_REG_0) },
2895 { MOD_TABLE (MOD_0FAE_REG_1) },
2896 { MOD_TABLE (MOD_0FAE_REG_2) },
2897 { MOD_TABLE (MOD_0FAE_REG_3) },
2898 { MOD_TABLE (MOD_0FAE_REG_4) },
2899 { MOD_TABLE (MOD_0FAE_REG_5) },
2900 { MOD_TABLE (MOD_0FAE_REG_6) },
2901 { MOD_TABLE (MOD_0FAE_REG_7) },
2902 },
2903 /* REG_0FBA */
2904 {
2905 { Bad_Opcode },
2906 { Bad_Opcode },
2907 { Bad_Opcode },
2908 { Bad_Opcode },
2909 { "btQ", { Ev, Ib }, 0 },
2910 { "btsQ", { Evh1, Ib }, 0 },
2911 { "btrQ", { Evh1, Ib }, 0 },
2912 { "btcQ", { Evh1, Ib }, 0 },
2913 },
2914 /* REG_0FC7 */
2915 {
2916 { Bad_Opcode },
2917 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
2918 { Bad_Opcode },
2919 { MOD_TABLE (MOD_0FC7_REG_3) },
2920 { MOD_TABLE (MOD_0FC7_REG_4) },
2921 { MOD_TABLE (MOD_0FC7_REG_5) },
2922 { MOD_TABLE (MOD_0FC7_REG_6) },
2923 { MOD_TABLE (MOD_0FC7_REG_7) },
2924 },
2925 /* REG_VEX_0F71_M_0 */
2926 {
2927 { Bad_Opcode },
2928 { Bad_Opcode },
2929 { "vpsrlw", { Vex, XS, Ib }, PREFIX_DATA },
2930 { Bad_Opcode },
2931 { "vpsraw", { Vex, XS, Ib }, PREFIX_DATA },
2932 { Bad_Opcode },
2933 { "vpsllw", { Vex, XS, Ib }, PREFIX_DATA },
2934 },
2935 /* REG_VEX_0F72_M_0 */
2936 {
2937 { Bad_Opcode },
2938 { Bad_Opcode },
2939 { "vpsrld", { Vex, XS, Ib }, PREFIX_DATA },
2940 { Bad_Opcode },
2941 { "vpsrad", { Vex, XS, Ib }, PREFIX_DATA },
2942 { Bad_Opcode },
2943 { "vpslld", { Vex, XS, Ib }, PREFIX_DATA },
2944 },
2945 /* REG_VEX_0F73_M_0 */
2946 {
2947 { Bad_Opcode },
2948 { Bad_Opcode },
2949 { "vpsrlq", { Vex, XS, Ib }, PREFIX_DATA },
2950 { "vpsrldq", { Vex, XS, Ib }, PREFIX_DATA },
2951 { Bad_Opcode },
2952 { Bad_Opcode },
2953 { "vpsllq", { Vex, XS, Ib }, PREFIX_DATA },
2954 { "vpslldq", { Vex, XS, Ib }, PREFIX_DATA },
2955 },
2956 /* REG_VEX_0FAE */
2957 {
2958 { Bad_Opcode },
2959 { Bad_Opcode },
2960 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
2961 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
2962 },
2963 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
2964 {
2965 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0) },
2966 },
2967 /* REG_VEX_0F38F3_L_0 */
2968 {
2969 { Bad_Opcode },
2970 { "blsrS", { VexGdq, Edq }, PREFIX_OPCODE },
2971 { "blsmskS", { VexGdq, Edq }, PREFIX_OPCODE },
2972 { "blsiS", { VexGdq, Edq }, PREFIX_OPCODE },
2973 },
2974 /* REG_XOP_09_01_L_0 */
2975 {
2976 { Bad_Opcode },
2977 { "blcfill", { VexGdq, Edq }, 0 },
2978 { "blsfill", { VexGdq, Edq }, 0 },
2979 { "blcs", { VexGdq, Edq }, 0 },
2980 { "tzmsk", { VexGdq, Edq }, 0 },
2981 { "blcic", { VexGdq, Edq }, 0 },
2982 { "blsic", { VexGdq, Edq }, 0 },
2983 { "t1mskc", { VexGdq, Edq }, 0 },
2984 },
2985 /* REG_XOP_09_02_L_0 */
2986 {
2987 { Bad_Opcode },
2988 { "blcmsk", { VexGdq, Edq }, 0 },
2989 { Bad_Opcode },
2990 { Bad_Opcode },
2991 { Bad_Opcode },
2992 { Bad_Opcode },
2993 { "blci", { VexGdq, Edq }, 0 },
2994 },
2995 /* REG_XOP_09_12_M_1_L_0 */
2996 {
2997 { "llwpcb", { Edq }, 0 },
2998 { "slwpcb", { Edq }, 0 },
2999 },
3000 /* REG_XOP_0A_12_L_0 */
3001 {
3002 { "lwpins", { VexGdq, Ed, Id }, 0 },
3003 { "lwpval", { VexGdq, Ed, Id }, 0 },
3004 },
3005
3006 #include "i386-dis-evex-reg.h"
3007 };
3008
3009 static const struct dis386 prefix_table[][4] = {
3010 /* PREFIX_90 */
3011 {
3012 { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
3013 { "pause", { XX }, 0 },
3014 { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
3015 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3016 },
3017
3018 /* PREFIX_0F01_REG_0_MOD_3_RM_6 */
3019 {
3020 { "wrmsrns", { Skip_MODRM }, 0 },
3021 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_1) },
3022 { Bad_Opcode },
3023 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_3) },
3024 },
3025
3026 /* PREFIX_0F01_REG_1_RM_4 */
3027 {
3028 { Bad_Opcode },
3029 { Bad_Opcode },
3030 { "tdcall", { Skip_MODRM }, 0 },
3031 { Bad_Opcode },
3032 },
3033
3034 /* PREFIX_0F01_REG_1_RM_5 */
3035 {
3036 { Bad_Opcode },
3037 { Bad_Opcode },
3038 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2) },
3039 { Bad_Opcode },
3040 },
3041
3042 /* PREFIX_0F01_REG_1_RM_6 */
3043 {
3044 { Bad_Opcode },
3045 { Bad_Opcode },
3046 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2) },
3047 { Bad_Opcode },
3048 },
3049
3050 /* PREFIX_0F01_REG_1_RM_7 */
3051 {
3052 { "encls", { Skip_MODRM }, 0 },
3053 { Bad_Opcode },
3054 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2) },
3055 { Bad_Opcode },
3056 },
3057
3058 /* PREFIX_0F01_REG_3_RM_1 */
3059 {
3060 { "vmmcall", { Skip_MODRM }, 0 },
3061 { "vmgexit", { Skip_MODRM }, 0 },
3062 { Bad_Opcode },
3063 { "vmgexit", { Skip_MODRM }, 0 },
3064 },
3065
3066 /* PREFIX_0F01_REG_5_MOD_0 */
3067 {
3068 { Bad_Opcode },
3069 { "rstorssp", { Mq }, PREFIX_OPCODE },
3070 },
3071
3072 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3073 {
3074 { "serialize", { Skip_MODRM }, PREFIX_OPCODE },
3075 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
3076 { Bad_Opcode },
3077 { "xsusldtrk", { Skip_MODRM }, PREFIX_OPCODE },
3078 },
3079
3080 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3081 {
3082 { Bad_Opcode },
3083 { Bad_Opcode },
3084 { Bad_Opcode },
3085 { "xresldtrk", { Skip_MODRM }, PREFIX_OPCODE },
3086 },
3087
3088 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3089 {
3090 { Bad_Opcode },
3091 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
3092 },
3093
3094 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3095 {
3096 { Bad_Opcode },
3097 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1) },
3098 },
3099
3100 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3101 {
3102 { Bad_Opcode },
3103 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1) },
3104 },
3105
3106 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3107 {
3108 { "rdpkru", { Skip_MODRM }, 0 },
3109 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1) },
3110 },
3111
3112 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3113 {
3114 { "wrpkru", { Skip_MODRM }, 0 },
3115 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1) },
3116 },
3117
3118 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3119 {
3120 { "monitorx", { { OP_Monitor, 0 } }, 0 },
3121 { "mcommit", { Skip_MODRM }, 0 },
3122 },
3123
3124 /* PREFIX_0F01_REG_7_MOD_3_RM_5 */
3125 {
3126 { "rdpru", { Skip_MODRM }, 0 },
3127 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1) },
3128 },
3129
3130 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3131 {
3132 { "invlpgb", { Skip_MODRM }, 0 },
3133 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1) },
3134 { Bad_Opcode },
3135 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3) },
3136 },
3137
3138 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3139 {
3140 { "tlbsync", { Skip_MODRM }, 0 },
3141 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1) },
3142 { Bad_Opcode },
3143 { "pvalidate", { Skip_MODRM }, 0 },
3144 },
3145
3146 /* PREFIX_0F09 */
3147 {
3148 { "wbinvd", { XX }, 0 },
3149 { "wbnoinvd", { XX }, 0 },
3150 },
3151
3152 /* PREFIX_0F10 */
3153 {
3154 { "movups", { XM, EXx }, PREFIX_OPCODE },
3155 { "movss", { XM, EXd }, PREFIX_OPCODE },
3156 { "movupd", { XM, EXx }, PREFIX_OPCODE },
3157 { "movsd", { XM, EXq }, PREFIX_OPCODE },
3158 },
3159
3160 /* PREFIX_0F11 */
3161 {
3162 { "movups", { EXxS, XM }, PREFIX_OPCODE },
3163 { "movss", { EXdS, XM }, PREFIX_OPCODE },
3164 { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3165 { "movsd", { EXqS, XM }, PREFIX_OPCODE },
3166 },
3167
3168 /* PREFIX_0F12 */
3169 {
3170 { MOD_TABLE (MOD_0F12_PREFIX_0) },
3171 { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3172 { MOD_TABLE (MOD_0F12_PREFIX_2) },
3173 { "movddup", { XM, EXq }, PREFIX_OPCODE },
3174 },
3175
3176 /* PREFIX_0F16 */
3177 {
3178 { MOD_TABLE (MOD_0F16_PREFIX_0) },
3179 { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3180 { MOD_TABLE (MOD_0F16_PREFIX_2) },
3181 },
3182
3183 /* PREFIX_0F18_REG_6_MOD_0_X86_64 */
3184 {
3185 { "prefetchit1", { { PREFETCHI_Fixup, b_mode } }, 0 },
3186 { "nopQ", { Ev }, 0 },
3187 { "nopQ", { Ev }, 0 },
3188 { "nopQ", { Ev }, 0 },
3189 },
3190
3191 /* PREFIX_0F18_REG_7_MOD_0_X86_64 */
3192 {
3193 { "prefetchit0", { { PREFETCHI_Fixup, b_mode } }, 0 },
3194 { "nopQ", { Ev }, 0 },
3195 { "nopQ", { Ev }, 0 },
3196 { "nopQ", { Ev }, 0 },
3197 },
3198
3199 /* PREFIX_0F1A */
3200 {
3201 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3202 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3203 { "bndmov", { Gbnd, Ebnd }, 0 },
3204 { "bndcu", { Gbnd, Ev_bnd }, 0 },
3205 },
3206
3207 /* PREFIX_0F1B */
3208 {
3209 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3210 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3211 { "bndmov", { EbndS, Gbnd }, 0 },
3212 { "bndcn", { Gbnd, Ev_bnd }, 0 },
3213 },
3214
3215 /* PREFIX_0F1C */
3216 {
3217 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3218 { "nopQ", { Ev }, PREFIX_IGNORED },
3219 { "nopQ", { Ev }, 0 },
3220 { "nopQ", { Ev }, PREFIX_IGNORED },
3221 },
3222
3223 /* PREFIX_0F1E */
3224 {
3225 { "nopQ", { Ev }, 0 },
3226 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3227 { "nopQ", { Ev }, 0 },
3228 { NULL, { XX }, PREFIX_IGNORED },
3229 },
3230
3231 /* PREFIX_0F2A */
3232 {
3233 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3234 { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
3235 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3236 { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
3237 },
3238
3239 /* PREFIX_0F2B */
3240 {
3241 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3242 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3243 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3244 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3245 },
3246
3247 /* PREFIX_0F2C */
3248 {
3249 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3250 { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
3251 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3252 { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3253 },
3254
3255 /* PREFIX_0F2D */
3256 {
3257 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3258 { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
3259 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3260 { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3261 },
3262
3263 /* PREFIX_0F2E */
3264 {
3265 { "ucomiss",{ XM, EXd }, 0 },
3266 { Bad_Opcode },
3267 { "ucomisd",{ XM, EXq }, 0 },
3268 },
3269
3270 /* PREFIX_0F2F */
3271 {
3272 { "comiss", { XM, EXd }, 0 },
3273 { Bad_Opcode },
3274 { "comisd", { XM, EXq }, 0 },
3275 },
3276
3277 /* PREFIX_0F51 */
3278 {
3279 { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3280 { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3281 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3282 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3283 },
3284
3285 /* PREFIX_0F52 */
3286 {
3287 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3288 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3289 },
3290
3291 /* PREFIX_0F53 */
3292 {
3293 { "rcpps", { XM, EXx }, PREFIX_OPCODE },
3294 { "rcpss", { XM, EXd }, PREFIX_OPCODE },
3295 },
3296
3297 /* PREFIX_0F58 */
3298 {
3299 { "addps", { XM, EXx }, PREFIX_OPCODE },
3300 { "addss", { XM, EXd }, PREFIX_OPCODE },
3301 { "addpd", { XM, EXx }, PREFIX_OPCODE },
3302 { "addsd", { XM, EXq }, PREFIX_OPCODE },
3303 },
3304
3305 /* PREFIX_0F59 */
3306 {
3307 { "mulps", { XM, EXx }, PREFIX_OPCODE },
3308 { "mulss", { XM, EXd }, PREFIX_OPCODE },
3309 { "mulpd", { XM, EXx }, PREFIX_OPCODE },
3310 { "mulsd", { XM, EXq }, PREFIX_OPCODE },
3311 },
3312
3313 /* PREFIX_0F5A */
3314 {
3315 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3316 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3317 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3318 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3319 },
3320
3321 /* PREFIX_0F5B */
3322 {
3323 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3324 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3325 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3326 },
3327
3328 /* PREFIX_0F5C */
3329 {
3330 { "subps", { XM, EXx }, PREFIX_OPCODE },
3331 { "subss", { XM, EXd }, PREFIX_OPCODE },
3332 { "subpd", { XM, EXx }, PREFIX_OPCODE },
3333 { "subsd", { XM, EXq }, PREFIX_OPCODE },
3334 },
3335
3336 /* PREFIX_0F5D */
3337 {
3338 { "minps", { XM, EXx }, PREFIX_OPCODE },
3339 { "minss", { XM, EXd }, PREFIX_OPCODE },
3340 { "minpd", { XM, EXx }, PREFIX_OPCODE },
3341 { "minsd", { XM, EXq }, PREFIX_OPCODE },
3342 },
3343
3344 /* PREFIX_0F5E */
3345 {
3346 { "divps", { XM, EXx }, PREFIX_OPCODE },
3347 { "divss", { XM, EXd }, PREFIX_OPCODE },
3348 { "divpd", { XM, EXx }, PREFIX_OPCODE },
3349 { "divsd", { XM, EXq }, PREFIX_OPCODE },
3350 },
3351
3352 /* PREFIX_0F5F */
3353 {
3354 { "maxps", { XM, EXx }, PREFIX_OPCODE },
3355 { "maxss", { XM, EXd }, PREFIX_OPCODE },
3356 { "maxpd", { XM, EXx }, PREFIX_OPCODE },
3357 { "maxsd", { XM, EXq }, PREFIX_OPCODE },
3358 },
3359
3360 /* PREFIX_0F60 */
3361 {
3362 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3363 { Bad_Opcode },
3364 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3365 },
3366
3367 /* PREFIX_0F61 */
3368 {
3369 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3370 { Bad_Opcode },
3371 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3372 },
3373
3374 /* PREFIX_0F62 */
3375 {
3376 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3377 { Bad_Opcode },
3378 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3379 },
3380
3381 /* PREFIX_0F6F */
3382 {
3383 { "movq", { MX, EM }, PREFIX_OPCODE },
3384 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3385 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3386 },
3387
3388 /* PREFIX_0F70 */
3389 {
3390 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3391 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3392 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3393 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3394 },
3395
3396 /* PREFIX_0F78 */
3397 {
3398 {"vmread", { Em, Gm }, 0 },
3399 { Bad_Opcode },
3400 {"extrq", { XS, Ib, Ib }, 0 },
3401 {"insertq", { XM, XS, Ib, Ib }, 0 },
3402 },
3403
3404 /* PREFIX_0F79 */
3405 {
3406 {"vmwrite", { Gm, Em }, 0 },
3407 { Bad_Opcode },
3408 {"extrq", { XM, XS }, 0 },
3409 {"insertq", { XM, XS }, 0 },
3410 },
3411
3412 /* PREFIX_0F7C */
3413 {
3414 { Bad_Opcode },
3415 { Bad_Opcode },
3416 { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3417 { "haddps", { XM, EXx }, PREFIX_OPCODE },
3418 },
3419
3420 /* PREFIX_0F7D */
3421 {
3422 { Bad_Opcode },
3423 { Bad_Opcode },
3424 { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3425 { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3426 },
3427
3428 /* PREFIX_0F7E */
3429 {
3430 { "movK", { Edq, MX }, PREFIX_OPCODE },
3431 { "movq", { XM, EXq }, PREFIX_OPCODE },
3432 { "movK", { Edq, XM }, PREFIX_OPCODE },
3433 },
3434
3435 /* PREFIX_0F7F */
3436 {
3437 { "movq", { EMS, MX }, PREFIX_OPCODE },
3438 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3439 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3440 },
3441
3442 /* PREFIX_0FAE_REG_0_MOD_3 */
3443 {
3444 { Bad_Opcode },
3445 { "rdfsbase", { Ev }, 0 },
3446 },
3447
3448 /* PREFIX_0FAE_REG_1_MOD_3 */
3449 {
3450 { Bad_Opcode },
3451 { "rdgsbase", { Ev }, 0 },
3452 },
3453
3454 /* PREFIX_0FAE_REG_2_MOD_3 */
3455 {
3456 { Bad_Opcode },
3457 { "wrfsbase", { Ev }, 0 },
3458 },
3459
3460 /* PREFIX_0FAE_REG_3_MOD_3 */
3461 {
3462 { Bad_Opcode },
3463 { "wrgsbase", { Ev }, 0 },
3464 },
3465
3466 /* PREFIX_0FAE_REG_4_MOD_0 */
3467 {
3468 { "xsave", { FXSAVE }, 0 },
3469 { "ptwrite{%LQ|}", { Edq }, 0 },
3470 },
3471
3472 /* PREFIX_0FAE_REG_4_MOD_3 */
3473 {
3474 { Bad_Opcode },
3475 { "ptwrite{%LQ|}", { Edq }, 0 },
3476 },
3477
3478 /* PREFIX_0FAE_REG_5_MOD_3 */
3479 {
3480 { "lfence", { Skip_MODRM }, 0 },
3481 { "incsspK", { Edq }, PREFIX_OPCODE },
3482 },
3483
3484 /* PREFIX_0FAE_REG_6_MOD_0 */
3485 {
3486 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
3487 { "clrssbsy", { Mq }, PREFIX_OPCODE },
3488 { "clwb", { Mb }, PREFIX_OPCODE },
3489 },
3490
3491 /* PREFIX_0FAE_REG_6_MOD_3 */
3492 {
3493 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
3494 { "umonitor", { Eva }, PREFIX_OPCODE },
3495 { "tpause", { Edq }, PREFIX_OPCODE },
3496 { "umwait", { Edq }, PREFIX_OPCODE },
3497 },
3498
3499 /* PREFIX_0FAE_REG_7_MOD_0 */
3500 {
3501 { "clflush", { Mb }, 0 },
3502 { Bad_Opcode },
3503 { "clflushopt", { Mb }, 0 },
3504 },
3505
3506 /* PREFIX_0FB8 */
3507 {
3508 { Bad_Opcode },
3509 { "popcntS", { Gv, Ev }, 0 },
3510 },
3511
3512 /* PREFIX_0FBC */
3513 {
3514 { "bsfS", { Gv, Ev }, 0 },
3515 { "tzcntS", { Gv, Ev }, 0 },
3516 { "bsfS", { Gv, Ev }, 0 },
3517 },
3518
3519 /* PREFIX_0FBD */
3520 {
3521 { "bsrS", { Gv, Ev }, 0 },
3522 { "lzcntS", { Gv, Ev }, 0 },
3523 { "bsrS", { Gv, Ev }, 0 },
3524 },
3525
3526 /* PREFIX_0FC2 */
3527 {
3528 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
3529 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
3530 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
3531 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
3532 },
3533
3534 /* PREFIX_0FC7_REG_6_MOD_0 */
3535 {
3536 { "vmptrld",{ Mq }, 0 },
3537 { "vmxon", { Mq }, 0 },
3538 { "vmclear",{ Mq }, 0 },
3539 },
3540
3541 /* PREFIX_0FC7_REG_6_MOD_3 */
3542 {
3543 { "rdrand", { Ev }, 0 },
3544 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1) },
3545 { "rdrand", { Ev }, 0 }
3546 },
3547
3548 /* PREFIX_0FC7_REG_7_MOD_3 */
3549 {
3550 { "rdseed", { Ev }, 0 },
3551 { "rdpid", { Em }, 0 },
3552 { "rdseed", { Ev }, 0 },
3553 },
3554
3555 /* PREFIX_0FD0 */
3556 {
3557 { Bad_Opcode },
3558 { Bad_Opcode },
3559 { "addsubpd", { XM, EXx }, 0 },
3560 { "addsubps", { XM, EXx }, 0 },
3561 },
3562
3563 /* PREFIX_0FD6 */
3564 {
3565 { Bad_Opcode },
3566 { "movq2dq",{ XM, MS }, 0 },
3567 { "movq", { EXqS, XM }, 0 },
3568 { "movdq2q",{ MX, XS }, 0 },
3569 },
3570
3571 /* PREFIX_0FE6 */
3572 {
3573 { Bad_Opcode },
3574 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
3575 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
3576 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
3577 },
3578
3579 /* PREFIX_0FE7 */
3580 {
3581 { "movntq", { Mq, MX }, PREFIX_OPCODE },
3582 { Bad_Opcode },
3583 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
3584 },
3585
3586 /* PREFIX_0FF0 */
3587 {
3588 { Bad_Opcode },
3589 { Bad_Opcode },
3590 { Bad_Opcode },
3591 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
3592 },
3593
3594 /* PREFIX_0FF7 */
3595 {
3596 { "maskmovq", { MX, MS }, PREFIX_OPCODE },
3597 { Bad_Opcode },
3598 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
3599 },
3600
3601 /* PREFIX_0F38D8 */
3602 {
3603 { Bad_Opcode },
3604 { REG_TABLE (REG_0F38D8_PREFIX_1) },
3605 },
3606
3607 /* PREFIX_0F38DC */
3608 {
3609 { Bad_Opcode },
3610 { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
3611 { "aesenc", { XM, EXx }, 0 },
3612 },
3613
3614 /* PREFIX_0F38DD */
3615 {
3616 { Bad_Opcode },
3617 { MOD_TABLE (MOD_0F38DD_PREFIX_1) },
3618 { "aesenclast", { XM, EXx }, 0 },
3619 },
3620
3621 /* PREFIX_0F38DE */
3622 {
3623 { Bad_Opcode },
3624 { MOD_TABLE (MOD_0F38DE_PREFIX_1) },
3625 { "aesdec", { XM, EXx }, 0 },
3626 },
3627
3628 /* PREFIX_0F38DF */
3629 {
3630 { Bad_Opcode },
3631 { MOD_TABLE (MOD_0F38DF_PREFIX_1) },
3632 { "aesdeclast", { XM, EXx }, 0 },
3633 },
3634
3635 /* PREFIX_0F38F0 */
3636 {
3637 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3638 { Bad_Opcode },
3639 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3640 { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
3641 },
3642
3643 /* PREFIX_0F38F1 */
3644 {
3645 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3646 { Bad_Opcode },
3647 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3648 { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
3649 },
3650
3651 /* PREFIX_0F38F6 */
3652 {
3653 { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
3654 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
3655 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
3656 { Bad_Opcode },
3657 },
3658
3659 /* PREFIX_0F38F8 */
3660 {
3661 { Bad_Opcode },
3662 { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
3663 { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
3664 { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
3665 },
3666 /* PREFIX_0F38FA */
3667 {
3668 { Bad_Opcode },
3669 { MOD_TABLE (MOD_0F38FA_PREFIX_1) },
3670 },
3671
3672 /* PREFIX_0F38FB */
3673 {
3674 { Bad_Opcode },
3675 { MOD_TABLE (MOD_0F38FB_PREFIX_1) },
3676 },
3677
3678 /* PREFIX_0F38FC */
3679 {
3680 { "aadd", { Mdq, Gdq }, 0 },
3681 { "axor", { Mdq, Gdq }, 0 },
3682 { "aand", { Mdq, Gdq }, 0 },
3683 { "aor", { Mdq, Gdq }, 0 },
3684 },
3685
3686 /* PREFIX_0F3A0F */
3687 {
3688 { Bad_Opcode },
3689 { MOD_TABLE (MOD_0F3A0F_PREFIX_1)},
3690 },
3691
3692 /* PREFIX_VEX_0F10 */
3693 {
3694 { "%XEvmovupX", { XM, EXEvexXNoBcst }, 0 },
3695 { "%XEvmovs%XS", { XMScalar, VexScalarR, EXd }, 0 },
3696 { "%XEvmovupX", { XM, EXEvexXNoBcst }, 0 },
3697 { "%XEvmovs%XD", { XMScalar, VexScalarR, EXq }, 0 },
3698 },
3699
3700 /* PREFIX_VEX_0F11 */
3701 {
3702 { "%XEvmovupX", { EXxS, XM }, 0 },
3703 { "%XEvmovs%XS", { EXdS, VexScalarR, XMScalar }, 0 },
3704 { "%XEvmovupX", { EXxS, XM }, 0 },
3705 { "%XEvmovs%XD", { EXqS, VexScalarR, XMScalar }, 0 },
3706 },
3707
3708 /* PREFIX_VEX_0F12 */
3709 {
3710 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
3711 { "%XEvmov%XSldup", { XM, EXEvexXNoBcst }, 0 },
3712 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2) },
3713 { "%XEvmov%XDdup", { XM, EXymmq }, 0 },
3714 },
3715
3716 /* PREFIX_VEX_0F16 */
3717 {
3718 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
3719 { "%XEvmov%XShdup", { XM, EXEvexXNoBcst }, 0 },
3720 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2) },
3721 },
3722
3723 /* PREFIX_VEX_0F2A */
3724 {
3725 { Bad_Opcode },
3726 { "%XEvcvtsi2ss{%LQ|}", { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
3727 { Bad_Opcode },
3728 { "%XEvcvtsi2sd{%LQ|}", { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
3729 },
3730
3731 /* PREFIX_VEX_0F2C */
3732 {
3733 { Bad_Opcode },
3734 { "%XEvcvttss2si", { Gdq, EXd, EXxEVexS }, 0 },
3735 { Bad_Opcode },
3736 { "%XEvcvttsd2si", { Gdq, EXq, EXxEVexS }, 0 },
3737 },
3738
3739 /* PREFIX_VEX_0F2D */
3740 {
3741 { Bad_Opcode },
3742 { "%XEvcvtss2si", { Gdq, EXd, EXxEVexR }, 0 },
3743 { Bad_Opcode },
3744 { "%XEvcvtsd2si", { Gdq, EXq, EXxEVexR }, 0 },
3745 },
3746
3747 /* PREFIX_VEX_0F2E */
3748 {
3749 { "%XEvucomisX", { XMScalar, EXd, EXxEVexS }, 0 },
3750 { Bad_Opcode },
3751 { "%XEvucomisX", { XMScalar, EXq, EXxEVexS }, 0 },
3752 },
3753
3754 /* PREFIX_VEX_0F2F */
3755 {
3756 { "%XEvcomisX", { XMScalar, EXd, EXxEVexS }, 0 },
3757 { Bad_Opcode },
3758 { "%XEvcomisX", { XMScalar, EXq, EXxEVexS }, 0 },
3759 },
3760
3761 /* PREFIX_VEX_0F41_L_1_M_1_W_0 */
3762 {
3763 { "kandw", { MaskG, MaskVex, MaskE }, 0 },
3764 { Bad_Opcode },
3765 { "kandb", { MaskG, MaskVex, MaskE }, 0 },
3766 },
3767
3768 /* PREFIX_VEX_0F41_L_1_M_1_W_1 */
3769 {
3770 { "kandq", { MaskG, MaskVex, MaskE }, 0 },
3771 { Bad_Opcode },
3772 { "kandd", { MaskG, MaskVex, MaskE }, 0 },
3773 },
3774
3775 /* PREFIX_VEX_0F42_L_1_M_1_W_0 */
3776 {
3777 { "kandnw", { MaskG, MaskVex, MaskE }, 0 },
3778 { Bad_Opcode },
3779 { "kandnb", { MaskG, MaskVex, MaskE }, 0 },
3780 },
3781
3782 /* PREFIX_VEX_0F42_L_1_M_1_W_1 */
3783 {
3784 { "kandnq", { MaskG, MaskVex, MaskE }, 0 },
3785 { Bad_Opcode },
3786 { "kandnd", { MaskG, MaskVex, MaskE }, 0 },
3787 },
3788
3789 /* PREFIX_VEX_0F44_L_0_M_1_W_0 */
3790 {
3791 { "knotw", { MaskG, MaskE }, 0 },
3792 { Bad_Opcode },
3793 { "knotb", { MaskG, MaskE }, 0 },
3794 },
3795
3796 /* PREFIX_VEX_0F44_L_0_M_1_W_1 */
3797 {
3798 { "knotq", { MaskG, MaskE }, 0 },
3799 { Bad_Opcode },
3800 { "knotd", { MaskG, MaskE }, 0 },
3801 },
3802
3803 /* PREFIX_VEX_0F45_L_1_M_1_W_0 */
3804 {
3805 { "korw", { MaskG, MaskVex, MaskE }, 0 },
3806 { Bad_Opcode },
3807 { "korb", { MaskG, MaskVex, MaskE }, 0 },
3808 },
3809
3810 /* PREFIX_VEX_0F45_L_1_M_1_W_1 */
3811 {
3812 { "korq", { MaskG, MaskVex, MaskE }, 0 },
3813 { Bad_Opcode },
3814 { "kord", { MaskG, MaskVex, MaskE }, 0 },
3815 },
3816
3817 /* PREFIX_VEX_0F46_L_1_M_1_W_0 */
3818 {
3819 { "kxnorw", { MaskG, MaskVex, MaskE }, 0 },
3820 { Bad_Opcode },
3821 { "kxnorb", { MaskG, MaskVex, MaskE }, 0 },
3822 },
3823
3824 /* PREFIX_VEX_0F46_L_1_M_1_W_1 */
3825 {
3826 { "kxnorq", { MaskG, MaskVex, MaskE }, 0 },
3827 { Bad_Opcode },
3828 { "kxnord", { MaskG, MaskVex, MaskE }, 0 },
3829 },
3830
3831 /* PREFIX_VEX_0F47_L_1_M_1_W_0 */
3832 {
3833 { "kxorw", { MaskG, MaskVex, MaskE }, 0 },
3834 { Bad_Opcode },
3835 { "kxorb", { MaskG, MaskVex, MaskE }, 0 },
3836 },
3837
3838 /* PREFIX_VEX_0F47_L_1_M_1_W_1 */
3839 {
3840 { "kxorq", { MaskG, MaskVex, MaskE }, 0 },
3841 { Bad_Opcode },
3842 { "kxord", { MaskG, MaskVex, MaskE }, 0 },
3843 },
3844
3845 /* PREFIX_VEX_0F4A_L_1_M_1_W_0 */
3846 {
3847 { "kaddw", { MaskG, MaskVex, MaskE }, 0 },
3848 { Bad_Opcode },
3849 { "kaddb", { MaskG, MaskVex, MaskE }, 0 },
3850 },
3851
3852 /* PREFIX_VEX_0F4A_L_1_M_1_W_1 */
3853 {
3854 { "kaddq", { MaskG, MaskVex, MaskE }, 0 },
3855 { Bad_Opcode },
3856 { "kaddd", { MaskG, MaskVex, MaskE }, 0 },
3857 },
3858
3859 /* PREFIX_VEX_0F4B_L_1_M_1_W_0 */
3860 {
3861 { "kunpckwd", { MaskG, MaskVex, MaskE }, 0 },
3862 { Bad_Opcode },
3863 { "kunpckbw", { MaskG, MaskVex, MaskE }, 0 },
3864 },
3865
3866 /* PREFIX_VEX_0F4B_L_1_M_1_W_1 */
3867 {
3868 { "kunpckdq", { MaskG, MaskVex, MaskE }, 0 },
3869 },
3870
3871 /* PREFIX_VEX_0F51 */
3872 {
3873 { "%XEvsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3874 { "%XEvsqrts%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3875 { "%XEvsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3876 { "%XEvsqrts%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3877 },
3878
3879 /* PREFIX_VEX_0F52 */
3880 {
3881 { "vrsqrtps", { XM, EXx }, 0 },
3882 { "vrsqrtss", { XMScalar, VexScalar, EXd }, 0 },
3883 },
3884
3885 /* PREFIX_VEX_0F53 */
3886 {
3887 { "vrcpps", { XM, EXx }, 0 },
3888 { "vrcpss", { XMScalar, VexScalar, EXd }, 0 },
3889 },
3890
3891 /* PREFIX_VEX_0F58 */
3892 {
3893 { "%XEvaddpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3894 { "%XEvadds%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3895 { "%XEvaddpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3896 { "%XEvadds%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3897 },
3898
3899 /* PREFIX_VEX_0F59 */
3900 {
3901 { "%XEvmulpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3902 { "%XEvmuls%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3903 { "%XEvmulpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3904 { "%XEvmuls%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3905 },
3906
3907 /* PREFIX_VEX_0F5A */
3908 {
3909 { "%XEvcvtp%XS2pd", { XM, EXEvexHalfBcstXmmq, EXxEVexS }, 0 },
3910 { "%XEvcvts%XS2sd", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3911 { "%XEvcvtp%XD2ps%XY", { XMxmmq, EXx, EXxEVexR }, 0 },
3912 { "%XEvcvts%XD2ss", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3913 },
3914
3915 /* PREFIX_VEX_0F5B */
3916 {
3917 { "vcvtdq2ps", { XM, EXx }, 0 },
3918 { "vcvttps2dq", { XM, EXx }, 0 },
3919 { "vcvtps2dq", { XM, EXx }, 0 },
3920 },
3921
3922 /* PREFIX_VEX_0F5C */
3923 {
3924 { "%XEvsubpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3925 { "%XEvsubs%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3926 { "%XEvsubpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3927 { "%XEvsubs%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3928 },
3929
3930 /* PREFIX_VEX_0F5D */
3931 {
3932 { "%XEvminpX", { XM, Vex, EXx, EXxEVexS }, 0 },
3933 { "%XEvmins%XS", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3934 { "%XEvminpX", { XM, Vex, EXx, EXxEVexS }, 0 },
3935 { "%XEvmins%XD", { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3936 },
3937
3938 /* PREFIX_VEX_0F5E */
3939 {
3940 { "%XEvdivpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3941 { "%XEvdivs%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3942 { "%XEvdivpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3943 { "%XEvdivs%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3944 },
3945
3946 /* PREFIX_VEX_0F5F */
3947 {
3948 { "%XEvmaxpX", { XM, Vex, EXx, EXxEVexS }, 0 },
3949 { "%XEvmaxs%XS", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3950 { "%XEvmaxpX", { XM, Vex, EXx, EXxEVexS }, 0 },
3951 { "%XEvmaxs%XD", { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3952 },
3953
3954 /* PREFIX_VEX_0F6F */
3955 {
3956 { Bad_Opcode },
3957 { "vmovdqu", { XM, EXx }, 0 },
3958 { "vmovdqa", { XM, EXx }, 0 },
3959 },
3960
3961 /* PREFIX_VEX_0F70 */
3962 {
3963 { Bad_Opcode },
3964 { "vpshufhw", { XM, EXx, Ib }, 0 },
3965 { "vpshufd", { XM, EXx, Ib }, 0 },
3966 { "vpshuflw", { XM, EXx, Ib }, 0 },
3967 },
3968
3969 /* PREFIX_VEX_0F7C */
3970 {
3971 { Bad_Opcode },
3972 { Bad_Opcode },
3973 { "vhaddpd", { XM, Vex, EXx }, 0 },
3974 { "vhaddps", { XM, Vex, EXx }, 0 },
3975 },
3976
3977 /* PREFIX_VEX_0F7D */
3978 {
3979 { Bad_Opcode },
3980 { Bad_Opcode },
3981 { "vhsubpd", { XM, Vex, EXx }, 0 },
3982 { "vhsubps", { XM, Vex, EXx }, 0 },
3983 },
3984
3985 /* PREFIX_VEX_0F7E */
3986 {
3987 { Bad_Opcode },
3988 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
3989 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
3990 },
3991
3992 /* PREFIX_VEX_0F7F */
3993 {
3994 { Bad_Opcode },
3995 { "vmovdqu", { EXxS, XM }, 0 },
3996 { "vmovdqa", { EXxS, XM }, 0 },
3997 },
3998
3999 /* PREFIX_VEX_0F90_L_0_W_0 */
4000 {
4001 { "kmovw", { MaskG, MaskE }, 0 },
4002 { Bad_Opcode },
4003 { "kmovb", { MaskG, MaskBDE }, 0 },
4004 },
4005
4006 /* PREFIX_VEX_0F90_L_0_W_1 */
4007 {
4008 { "kmovq", { MaskG, MaskE }, 0 },
4009 { Bad_Opcode },
4010 { "kmovd", { MaskG, MaskBDE }, 0 },
4011 },
4012
4013 /* PREFIX_VEX_0F91_L_0_M_0_W_0 */
4014 {
4015 { "kmovw", { Ew, MaskG }, 0 },
4016 { Bad_Opcode },
4017 { "kmovb", { Eb, MaskG }, 0 },
4018 },
4019
4020 /* PREFIX_VEX_0F91_L_0_M_0_W_1 */
4021 {
4022 { "kmovq", { Eq, MaskG }, 0 },
4023 { Bad_Opcode },
4024 { "kmovd", { Ed, MaskG }, 0 },
4025 },
4026
4027 /* PREFIX_VEX_0F92_L_0_M_1_W_0 */
4028 {
4029 { "kmovw", { MaskG, Edq }, 0 },
4030 { Bad_Opcode },
4031 { "kmovb", { MaskG, Edq }, 0 },
4032 { "kmovd", { MaskG, Edq }, 0 },
4033 },
4034
4035 /* PREFIX_VEX_0F92_L_0_M_1_W_1 */
4036 {
4037 { Bad_Opcode },
4038 { Bad_Opcode },
4039 { Bad_Opcode },
4040 { "kmovK", { MaskG, Edq }, 0 },
4041 },
4042
4043 /* PREFIX_VEX_0F93_L_0_M_1_W_0 */
4044 {
4045 { "kmovw", { Gdq, MaskE }, 0 },
4046 { Bad_Opcode },
4047 { "kmovb", { Gdq, MaskE }, 0 },
4048 { "kmovd", { Gdq, MaskE }, 0 },
4049 },
4050
4051 /* PREFIX_VEX_0F93_L_0_M_1_W_1 */
4052 {
4053 { Bad_Opcode },
4054 { Bad_Opcode },
4055 { Bad_Opcode },
4056 { "kmovK", { Gdq, MaskE }, 0 },
4057 },
4058
4059 /* PREFIX_VEX_0F98_L_0_M_1_W_0 */
4060 {
4061 { "kortestw", { MaskG, MaskE }, 0 },
4062 { Bad_Opcode },
4063 { "kortestb", { MaskG, MaskE }, 0 },
4064 },
4065
4066 /* PREFIX_VEX_0F98_L_0_M_1_W_1 */
4067 {
4068 { "kortestq", { MaskG, MaskE }, 0 },
4069 { Bad_Opcode },
4070 { "kortestd", { MaskG, MaskE }, 0 },
4071 },
4072
4073 /* PREFIX_VEX_0F99_L_0_M_1_W_0 */
4074 {
4075 { "ktestw", { MaskG, MaskE }, 0 },
4076 { Bad_Opcode },
4077 { "ktestb", { MaskG, MaskE }, 0 },
4078 },
4079
4080 /* PREFIX_VEX_0F99_L_0_M_1_W_1 */
4081 {
4082 { "ktestq", { MaskG, MaskE }, 0 },
4083 { Bad_Opcode },
4084 { "ktestd", { MaskG, MaskE }, 0 },
4085 },
4086
4087 /* PREFIX_VEX_0FC2 */
4088 {
4089 { "vcmpps", { XM, Vex, EXx, CMP }, 0 },
4090 { "vcmpss", { XMScalar, VexScalar, EXd, CMP }, 0 },
4091 { "vcmppd", { XM, Vex, EXx, CMP }, 0 },
4092 { "vcmpsd", { XMScalar, VexScalar, EXq, CMP }, 0 },
4093 },
4094
4095 /* PREFIX_VEX_0FD0 */
4096 {
4097 { Bad_Opcode },
4098 { Bad_Opcode },
4099 { "vaddsubpd", { XM, Vex, EXx }, 0 },
4100 { "vaddsubps", { XM, Vex, EXx }, 0 },
4101 },
4102
4103 /* PREFIX_VEX_0FE6 */
4104 {
4105 { Bad_Opcode },
4106 { "vcvtdq2pd", { XM, EXxmmq }, 0 },
4107 { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
4108 { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
4109 },
4110
4111 /* PREFIX_VEX_0FF0 */
4112 {
4113 { Bad_Opcode },
4114 { Bad_Opcode },
4115 { Bad_Opcode },
4116 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
4117 },
4118
4119 /* PREFIX_VEX_0F3849_X86_64 */
4120 {
4121 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0) },
4122 { Bad_Opcode },
4123 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2) },
4124 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3) },
4125 },
4126
4127 /* PREFIX_VEX_0F384B_X86_64 */
4128 {
4129 { Bad_Opcode },
4130 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1) },
4131 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2) },
4132 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3) },
4133 },
4134
4135 /* PREFIX_VEX_0F3850_W_0 */
4136 {
4137 { "vpdpbuud", { XM, Vex, EXx }, 0 },
4138 { "vpdpbsud", { XM, Vex, EXx }, 0 },
4139 { "%XVvpdpbusd", { XM, Vex, EXx }, 0 },
4140 { "vpdpbssd", { XM, Vex, EXx }, 0 },
4141 },
4142
4143 /* PREFIX_VEX_0F3851_W_0 */
4144 {
4145 { "vpdpbuuds", { XM, Vex, EXx }, 0 },
4146 { "vpdpbsuds", { XM, Vex, EXx }, 0 },
4147 { "%XVvpdpbusds", { XM, Vex, EXx }, 0 },
4148 { "vpdpbssds", { XM, Vex, EXx }, 0 },
4149 },
4150 /* PREFIX_VEX_0F385C_X86_64 */
4151 {
4152 { Bad_Opcode },
4153 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1) },
4154 { Bad_Opcode },
4155 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_3) },
4156 },
4157
4158 /* PREFIX_VEX_0F385E_X86_64 */
4159 {
4160 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0) },
4161 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1) },
4162 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2) },
4163 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3) },
4164 },
4165
4166 /* PREFIX_VEX_0F386C_X86_64_W_0_M_1_L_0 */
4167 {
4168 { "tcmmrlfp16ps", { TMM, EXtmm, VexTmm }, 0 },
4169 { Bad_Opcode },
4170 { "tcmmimfp16ps", { TMM, EXtmm, VexTmm }, 0 },
4171 },
4172
4173 /* PREFIX_VEX_0F3872 */
4174 {
4175 { Bad_Opcode },
4176 { VEX_W_TABLE (VEX_W_0F3872_P_1) },
4177 },
4178
4179 /* PREFIX_VEX_0F38B0_W_0 */
4180 {
4181 { "vcvtneoph2ps", { XM, Mx }, 0 },
4182 { "vcvtneebf162ps", { XM, Mx }, 0 },
4183 { "vcvtneeph2ps", { XM, Mx }, 0 },
4184 { "vcvtneobf162ps", { XM, Mx }, 0 },
4185 },
4186
4187 /* PREFIX_VEX_0F38B1_W_0 */
4188 {
4189 { Bad_Opcode },
4190 { "vbcstnebf162ps", { XM, Mw }, 0 },
4191 { "vbcstnesh2ps", { XM, Mw }, 0 },
4192 },
4193
4194 /* PREFIX_VEX_0F38F5_L_0 */
4195 {
4196 { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
4197 { "pextS", { Gdq, VexGdq, Edq }, 0 },
4198 { Bad_Opcode },
4199 { "pdepS", { Gdq, VexGdq, Edq }, 0 },
4200 },
4201
4202 /* PREFIX_VEX_0F38F6_L_0 */
4203 {
4204 { Bad_Opcode },
4205 { Bad_Opcode },
4206 { Bad_Opcode },
4207 { "mulxS", { Gdq, VexGdq, Edq }, 0 },
4208 },
4209
4210 /* PREFIX_VEX_0F38F7_L_0 */
4211 {
4212 { "bextrS", { Gdq, Edq, VexGdq }, 0 },
4213 { "sarxS", { Gdq, Edq, VexGdq }, 0 },
4214 { "shlxS", { Gdq, Edq, VexGdq }, 0 },
4215 { "shrxS", { Gdq, Edq, VexGdq }, 0 },
4216 },
4217
4218 /* PREFIX_VEX_0F3AF0_L_0 */
4219 {
4220 { Bad_Opcode },
4221 { Bad_Opcode },
4222 { Bad_Opcode },
4223 { "rorxS", { Gdq, Edq, Ib }, 0 },
4224 },
4225
4226 #include "i386-dis-evex-prefix.h"
4227 };
4228
4229 static const struct dis386 x86_64_table[][2] = {
4230 /* X86_64_06 */
4231 {
4232 { "pushP", { es }, 0 },
4233 },
4234
4235 /* X86_64_07 */
4236 {
4237 { "popP", { es }, 0 },
4238 },
4239
4240 /* X86_64_0E */
4241 {
4242 { "pushP", { cs }, 0 },
4243 },
4244
4245 /* X86_64_16 */
4246 {
4247 { "pushP", { ss }, 0 },
4248 },
4249
4250 /* X86_64_17 */
4251 {
4252 { "popP", { ss }, 0 },
4253 },
4254
4255 /* X86_64_1E */
4256 {
4257 { "pushP", { ds }, 0 },
4258 },
4259
4260 /* X86_64_1F */
4261 {
4262 { "popP", { ds }, 0 },
4263 },
4264
4265 /* X86_64_27 */
4266 {
4267 { "daa", { XX }, 0 },
4268 },
4269
4270 /* X86_64_2F */
4271 {
4272 { "das", { XX }, 0 },
4273 },
4274
4275 /* X86_64_37 */
4276 {
4277 { "aaa", { XX }, 0 },
4278 },
4279
4280 /* X86_64_3F */
4281 {
4282 { "aas", { XX }, 0 },
4283 },
4284
4285 /* X86_64_60 */
4286 {
4287 { "pushaP", { XX }, 0 },
4288 },
4289
4290 /* X86_64_61 */
4291 {
4292 { "popaP", { XX }, 0 },
4293 },
4294
4295 /* X86_64_62 */
4296 {
4297 { MOD_TABLE (MOD_62_32BIT) },
4298 { EVEX_TABLE (EVEX_0F) },
4299 },
4300
4301 /* X86_64_63 */
4302 {
4303 { "arpl", { Ew, Gw }, 0 },
4304 { "movs", { Gv, { MOVSXD_Fixup, movsxd_mode } }, 0 },
4305 },
4306
4307 /* X86_64_6D */
4308 {
4309 { "ins{R|}", { Yzr, indirDX }, 0 },
4310 { "ins{G|}", { Yzr, indirDX }, 0 },
4311 },
4312
4313 /* X86_64_6F */
4314 {
4315 { "outs{R|}", { indirDXr, Xz }, 0 },
4316 { "outs{G|}", { indirDXr, Xz }, 0 },
4317 },
4318
4319 /* X86_64_82 */
4320 {
4321 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
4322 { REG_TABLE (REG_80) },
4323 },
4324
4325 /* X86_64_9A */
4326 {
4327 { "{l|}call{P|}", { Ap }, 0 },
4328 },
4329
4330 /* X86_64_C2 */
4331 {
4332 { "retP", { Iw, BND }, 0 },
4333 { "ret@", { Iw, BND }, 0 },
4334 },
4335
4336 /* X86_64_C3 */
4337 {
4338 { "retP", { BND }, 0 },
4339 { "ret@", { BND }, 0 },
4340 },
4341
4342 /* X86_64_C4 */
4343 {
4344 { MOD_TABLE (MOD_C4_32BIT) },
4345 { VEX_C4_TABLE (VEX_0F) },
4346 },
4347
4348 /* X86_64_C5 */
4349 {
4350 { MOD_TABLE (MOD_C5_32BIT) },
4351 { VEX_C5_TABLE (VEX_0F) },
4352 },
4353
4354 /* X86_64_CE */
4355 {
4356 { "into", { XX }, 0 },
4357 },
4358
4359 /* X86_64_D4 */
4360 {
4361 { "aam", { Ib }, 0 },
4362 },
4363
4364 /* X86_64_D5 */
4365 {
4366 { "aad", { Ib }, 0 },
4367 },
4368
4369 /* X86_64_E8 */
4370 {
4371 { "callP", { Jv, BND }, 0 },
4372 { "call@", { Jv, BND }, 0 }
4373 },
4374
4375 /* X86_64_E9 */
4376 {
4377 { "jmpP", { Jv, BND }, 0 },
4378 { "jmp@", { Jv, BND }, 0 }
4379 },
4380
4381 /* X86_64_EA */
4382 {
4383 { "{l|}jmp{P|}", { Ap }, 0 },
4384 },
4385
4386 /* X86_64_0F01_REG_0 */
4387 {
4388 { "sgdt{Q|Q}", { M }, 0 },
4389 { "sgdt", { M }, 0 },
4390 },
4391
4392 /* X86_64_0F01_REG_0_MOD_3_RM_6_P_1 */
4393 {
4394 { Bad_Opcode },
4395 { "wrmsrlist", { Skip_MODRM }, 0 },
4396 },
4397
4398 /* X86_64_0F01_REG_0_MOD_3_RM_6_P_3 */
4399 {
4400 { Bad_Opcode },
4401 { "rdmsrlist", { Skip_MODRM }, 0 },
4402 },
4403
4404 /* X86_64_0F01_REG_1 */
4405 {
4406 { "sidt{Q|Q}", { M }, 0 },
4407 { "sidt", { M }, 0 },
4408 },
4409
4410 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4411 {
4412 { Bad_Opcode },
4413 { "seamret", { Skip_MODRM }, 0 },
4414 },
4415
4416 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4417 {
4418 { Bad_Opcode },
4419 { "seamops", { Skip_MODRM }, 0 },
4420 },
4421
4422 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4423 {
4424 { Bad_Opcode },
4425 { "seamcall", { Skip_MODRM }, 0 },
4426 },
4427
4428 /* X86_64_0F01_REG_2 */
4429 {
4430 { "lgdt{Q|Q}", { M }, 0 },
4431 { "lgdt", { M }, 0 },
4432 },
4433
4434 /* X86_64_0F01_REG_3 */
4435 {
4436 { "lidt{Q|Q}", { M }, 0 },
4437 { "lidt", { M }, 0 },
4438 },
4439
4440 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4441 {
4442 { Bad_Opcode },
4443 { "uiret", { Skip_MODRM }, 0 },
4444 },
4445
4446 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4447 {
4448 { Bad_Opcode },
4449 { "testui", { Skip_MODRM }, 0 },
4450 },
4451
4452 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4453 {
4454 { Bad_Opcode },
4455 { "clui", { Skip_MODRM }, 0 },
4456 },
4457
4458 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4459 {
4460 { Bad_Opcode },
4461 { "stui", { Skip_MODRM }, 0 },
4462 },
4463
4464 /* X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1 */
4465 {
4466 { Bad_Opcode },
4467 { "rmpquery", { Skip_MODRM }, 0 },
4468 },
4469
4470 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4471 {
4472 { Bad_Opcode },
4473 { "rmpadjust", { Skip_MODRM }, 0 },
4474 },
4475
4476 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4477 {
4478 { Bad_Opcode },
4479 { "rmpupdate", { Skip_MODRM }, 0 },
4480 },
4481
4482 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4483 {
4484 { Bad_Opcode },
4485 { "psmash", { Skip_MODRM }, 0 },
4486 },
4487
4488 /* X86_64_0F18_REG_6_MOD_0 */
4489 {
4490 { "nopQ", { Ev }, 0 },
4491 { PREFIX_TABLE (PREFIX_0F18_REG_6_MOD_0_X86_64) },
4492 },
4493
4494 /* X86_64_0F18_REG_7_MOD_0 */
4495 {
4496 { "nopQ", { Ev }, 0 },
4497 { PREFIX_TABLE (PREFIX_0F18_REG_7_MOD_0_X86_64) },
4498 },
4499
4500 {
4501 /* X86_64_0F24 */
4502 { "movZ", { Em, Td }, 0 },
4503 },
4504
4505 {
4506 /* X86_64_0F26 */
4507 { "movZ", { Td, Em }, 0 },
4508 },
4509
4510 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4511 {
4512 { Bad_Opcode },
4513 { "senduipi", { Eq }, 0 },
4514 },
4515
4516 /* X86_64_VEX_0F3849 */
4517 {
4518 { Bad_Opcode },
4519 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64) },
4520 },
4521
4522 /* X86_64_VEX_0F384B */
4523 {
4524 { Bad_Opcode },
4525 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64) },
4526 },
4527
4528 /* X86_64_VEX_0F385C */
4529 {
4530 { Bad_Opcode },
4531 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64) },
4532 },
4533
4534 /* X86_64_VEX_0F385E */
4535 {
4536 { Bad_Opcode },
4537 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64) },
4538 },
4539
4540 /* X86_64_VEX_0F386C */
4541 {
4542 { Bad_Opcode },
4543 { VEX_W_TABLE (VEX_W_0F386C_X86_64) },
4544 },
4545
4546 /* X86_64_VEX_0F38E0 */
4547 {
4548 { Bad_Opcode },
4549 { "cmpoxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4550 },
4551
4552 /* X86_64_VEX_0F38E1 */
4553 {
4554 { Bad_Opcode },
4555 { "cmpnoxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4556 },
4557
4558 /* X86_64_VEX_0F38E2 */
4559 {
4560 { Bad_Opcode },
4561 { "cmpbxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4562 },
4563
4564 /* X86_64_VEX_0F38E3 */
4565 {
4566 { Bad_Opcode },
4567 { "cmpnbxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4568 },
4569
4570 /* X86_64_VEX_0F38E4 */
4571 {
4572 { Bad_Opcode },
4573 { "cmpzxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4574 },
4575
4576 /* X86_64_VEX_0F38E5 */
4577 {
4578 { Bad_Opcode },
4579 { "cmpnzxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4580 },
4581
4582 /* X86_64_VEX_0F38E6 */
4583 {
4584 { Bad_Opcode },
4585 { "cmpbexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4586 },
4587
4588 /* X86_64_VEX_0F38E7 */
4589 {
4590 { Bad_Opcode },
4591 { "cmpnbexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4592 },
4593
4594 /* X86_64_VEX_0F38E8 */
4595 {
4596 { Bad_Opcode },
4597 { "cmpsxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4598 },
4599
4600 /* X86_64_VEX_0F38E9 */
4601 {
4602 { Bad_Opcode },
4603 { "cmpnsxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4604 },
4605
4606 /* X86_64_VEX_0F38EA */
4607 {
4608 { Bad_Opcode },
4609 { "cmppxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4610 },
4611
4612 /* X86_64_VEX_0F38EB */
4613 {
4614 { Bad_Opcode },
4615 { "cmpnpxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4616 },
4617
4618 /* X86_64_VEX_0F38EC */
4619 {
4620 { Bad_Opcode },
4621 { "cmplxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4622 },
4623
4624 /* X86_64_VEX_0F38ED */
4625 {
4626 { Bad_Opcode },
4627 { "cmpnlxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4628 },
4629
4630 /* X86_64_VEX_0F38EE */
4631 {
4632 { Bad_Opcode },
4633 { "cmplexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4634 },
4635
4636 /* X86_64_VEX_0F38EF */
4637 {
4638 { Bad_Opcode },
4639 { "cmpnlexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4640 },
4641 };
4642
4643 static const struct dis386 three_byte_table[][256] = {
4644
4645 /* THREE_BYTE_0F38 */
4646 {
4647 /* 00 */
4648 { "pshufb", { MX, EM }, PREFIX_OPCODE },
4649 { "phaddw", { MX, EM }, PREFIX_OPCODE },
4650 { "phaddd", { MX, EM }, PREFIX_OPCODE },
4651 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
4652 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
4653 { "phsubw", { MX, EM }, PREFIX_OPCODE },
4654 { "phsubd", { MX, EM }, PREFIX_OPCODE },
4655 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
4656 /* 08 */
4657 { "psignb", { MX, EM }, PREFIX_OPCODE },
4658 { "psignw", { MX, EM }, PREFIX_OPCODE },
4659 { "psignd", { MX, EM }, PREFIX_OPCODE },
4660 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
4661 { Bad_Opcode },
4662 { Bad_Opcode },
4663 { Bad_Opcode },
4664 { Bad_Opcode },
4665 /* 10 */
4666 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
4667 { Bad_Opcode },
4668 { Bad_Opcode },
4669 { Bad_Opcode },
4670 { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4671 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
4672 { Bad_Opcode },
4673 { "ptest", { XM, EXx }, PREFIX_DATA },
4674 /* 18 */
4675 { Bad_Opcode },
4676 { Bad_Opcode },
4677 { Bad_Opcode },
4678 { Bad_Opcode },
4679 { "pabsb", { MX, EM }, PREFIX_OPCODE },
4680 { "pabsw", { MX, EM }, PREFIX_OPCODE },
4681 { "pabsd", { MX, EM }, PREFIX_OPCODE },
4682 { Bad_Opcode },
4683 /* 20 */
4684 { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4685 { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4686 { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4687 { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4688 { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4689 { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
4690 { Bad_Opcode },
4691 { Bad_Opcode },
4692 /* 28 */
4693 { "pmuldq", { XM, EXx }, PREFIX_DATA },
4694 { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4695 { MOD_TABLE (MOD_0F382A) },
4696 { "packusdw", { XM, EXx }, PREFIX_DATA },
4697 { Bad_Opcode },
4698 { Bad_Opcode },
4699 { Bad_Opcode },
4700 { Bad_Opcode },
4701 /* 30 */
4702 { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4703 { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4704 { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4705 { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4706 { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4707 { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4708 { Bad_Opcode },
4709 { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
4710 /* 38 */
4711 { "pminsb", { XM, EXx }, PREFIX_DATA },
4712 { "pminsd", { XM, EXx }, PREFIX_DATA },
4713 { "pminuw", { XM, EXx }, PREFIX_DATA },
4714 { "pminud", { XM, EXx }, PREFIX_DATA },
4715 { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4716 { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4717 { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4718 { "pmaxud", { XM, EXx }, PREFIX_DATA },
4719 /* 40 */
4720 { "pmulld", { XM, EXx }, PREFIX_DATA },
4721 { "phminposuw", { XM, EXx }, PREFIX_DATA },
4722 { Bad_Opcode },
4723 { Bad_Opcode },
4724 { Bad_Opcode },
4725 { Bad_Opcode },
4726 { Bad_Opcode },
4727 { Bad_Opcode },
4728 /* 48 */
4729 { Bad_Opcode },
4730 { Bad_Opcode },
4731 { Bad_Opcode },
4732 { Bad_Opcode },
4733 { Bad_Opcode },
4734 { Bad_Opcode },
4735 { Bad_Opcode },
4736 { Bad_Opcode },
4737 /* 50 */
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 /* 58 */
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 /* 60 */
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 /* 68 */
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 /* 70 */
4774 { Bad_Opcode },
4775 { Bad_Opcode },
4776 { Bad_Opcode },
4777 { Bad_Opcode },
4778 { Bad_Opcode },
4779 { Bad_Opcode },
4780 { Bad_Opcode },
4781 { Bad_Opcode },
4782 /* 78 */
4783 { Bad_Opcode },
4784 { Bad_Opcode },
4785 { Bad_Opcode },
4786 { Bad_Opcode },
4787 { Bad_Opcode },
4788 { Bad_Opcode },
4789 { Bad_Opcode },
4790 { Bad_Opcode },
4791 /* 80 */
4792 { "invept", { Gm, Mo }, PREFIX_DATA },
4793 { "invvpid", { Gm, Mo }, PREFIX_DATA },
4794 { "invpcid", { Gm, M }, PREFIX_DATA },
4795 { Bad_Opcode },
4796 { Bad_Opcode },
4797 { Bad_Opcode },
4798 { Bad_Opcode },
4799 { Bad_Opcode },
4800 /* 88 */
4801 { Bad_Opcode },
4802 { Bad_Opcode },
4803 { Bad_Opcode },
4804 { Bad_Opcode },
4805 { Bad_Opcode },
4806 { Bad_Opcode },
4807 { Bad_Opcode },
4808 { Bad_Opcode },
4809 /* 90 */
4810 { Bad_Opcode },
4811 { Bad_Opcode },
4812 { Bad_Opcode },
4813 { Bad_Opcode },
4814 { Bad_Opcode },
4815 { Bad_Opcode },
4816 { Bad_Opcode },
4817 { Bad_Opcode },
4818 /* 98 */
4819 { Bad_Opcode },
4820 { Bad_Opcode },
4821 { Bad_Opcode },
4822 { Bad_Opcode },
4823 { Bad_Opcode },
4824 { Bad_Opcode },
4825 { Bad_Opcode },
4826 { Bad_Opcode },
4827 /* a0 */
4828 { Bad_Opcode },
4829 { Bad_Opcode },
4830 { Bad_Opcode },
4831 { Bad_Opcode },
4832 { Bad_Opcode },
4833 { Bad_Opcode },
4834 { Bad_Opcode },
4835 { Bad_Opcode },
4836 /* a8 */
4837 { Bad_Opcode },
4838 { Bad_Opcode },
4839 { Bad_Opcode },
4840 { Bad_Opcode },
4841 { Bad_Opcode },
4842 { Bad_Opcode },
4843 { Bad_Opcode },
4844 { Bad_Opcode },
4845 /* b0 */
4846 { Bad_Opcode },
4847 { Bad_Opcode },
4848 { Bad_Opcode },
4849 { Bad_Opcode },
4850 { Bad_Opcode },
4851 { Bad_Opcode },
4852 { Bad_Opcode },
4853 { Bad_Opcode },
4854 /* b8 */
4855 { Bad_Opcode },
4856 { Bad_Opcode },
4857 { Bad_Opcode },
4858 { Bad_Opcode },
4859 { Bad_Opcode },
4860 { Bad_Opcode },
4861 { Bad_Opcode },
4862 { Bad_Opcode },
4863 /* c0 */
4864 { Bad_Opcode },
4865 { Bad_Opcode },
4866 { Bad_Opcode },
4867 { Bad_Opcode },
4868 { Bad_Opcode },
4869 { Bad_Opcode },
4870 { Bad_Opcode },
4871 { Bad_Opcode },
4872 /* c8 */
4873 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4874 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4875 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4876 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4877 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4878 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4879 { Bad_Opcode },
4880 { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
4881 /* d0 */
4882 { Bad_Opcode },
4883 { Bad_Opcode },
4884 { Bad_Opcode },
4885 { Bad_Opcode },
4886 { Bad_Opcode },
4887 { Bad_Opcode },
4888 { Bad_Opcode },
4889 { Bad_Opcode },
4890 /* d8 */
4891 { PREFIX_TABLE (PREFIX_0F38D8) },
4892 { Bad_Opcode },
4893 { Bad_Opcode },
4894 { "aesimc", { XM, EXx }, PREFIX_DATA },
4895 { PREFIX_TABLE (PREFIX_0F38DC) },
4896 { PREFIX_TABLE (PREFIX_0F38DD) },
4897 { PREFIX_TABLE (PREFIX_0F38DE) },
4898 { PREFIX_TABLE (PREFIX_0F38DF) },
4899 /* e0 */
4900 { Bad_Opcode },
4901 { Bad_Opcode },
4902 { Bad_Opcode },
4903 { Bad_Opcode },
4904 { Bad_Opcode },
4905 { Bad_Opcode },
4906 { Bad_Opcode },
4907 { Bad_Opcode },
4908 /* e8 */
4909 { Bad_Opcode },
4910 { Bad_Opcode },
4911 { Bad_Opcode },
4912 { Bad_Opcode },
4913 { Bad_Opcode },
4914 { Bad_Opcode },
4915 { Bad_Opcode },
4916 { Bad_Opcode },
4917 /* f0 */
4918 { PREFIX_TABLE (PREFIX_0F38F0) },
4919 { PREFIX_TABLE (PREFIX_0F38F1) },
4920 { Bad_Opcode },
4921 { Bad_Opcode },
4922 { Bad_Opcode },
4923 { MOD_TABLE (MOD_0F38F5) },
4924 { PREFIX_TABLE (PREFIX_0F38F6) },
4925 { Bad_Opcode },
4926 /* f8 */
4927 { PREFIX_TABLE (PREFIX_0F38F8) },
4928 { MOD_TABLE (MOD_0F38F9) },
4929 { PREFIX_TABLE (PREFIX_0F38FA) },
4930 { PREFIX_TABLE (PREFIX_0F38FB) },
4931 { PREFIX_TABLE (PREFIX_0F38FC) },
4932 { Bad_Opcode },
4933 { Bad_Opcode },
4934 { Bad_Opcode },
4935 },
4936 /* THREE_BYTE_0F3A */
4937 {
4938 /* 00 */
4939 { Bad_Opcode },
4940 { Bad_Opcode },
4941 { Bad_Opcode },
4942 { Bad_Opcode },
4943 { Bad_Opcode },
4944 { Bad_Opcode },
4945 { Bad_Opcode },
4946 { Bad_Opcode },
4947 /* 08 */
4948 { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
4949 { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
4950 { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
4951 { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
4952 { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
4953 { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
4954 { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
4955 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
4956 /* 10 */
4957 { Bad_Opcode },
4958 { Bad_Opcode },
4959 { Bad_Opcode },
4960 { Bad_Opcode },
4961 { "pextrb", { Edb, XM, Ib }, PREFIX_DATA },
4962 { "pextrw", { Edw, XM, Ib }, PREFIX_DATA },
4963 { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
4964 { "extractps", { Ed, XM, Ib }, PREFIX_DATA },
4965 /* 18 */
4966 { Bad_Opcode },
4967 { Bad_Opcode },
4968 { Bad_Opcode },
4969 { Bad_Opcode },
4970 { Bad_Opcode },
4971 { Bad_Opcode },
4972 { Bad_Opcode },
4973 { Bad_Opcode },
4974 /* 20 */
4975 { "pinsrb", { XM, Edb, Ib }, PREFIX_DATA },
4976 { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
4977 { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
4978 { Bad_Opcode },
4979 { Bad_Opcode },
4980 { Bad_Opcode },
4981 { Bad_Opcode },
4982 { Bad_Opcode },
4983 /* 28 */
4984 { Bad_Opcode },
4985 { Bad_Opcode },
4986 { Bad_Opcode },
4987 { Bad_Opcode },
4988 { Bad_Opcode },
4989 { Bad_Opcode },
4990 { Bad_Opcode },
4991 { Bad_Opcode },
4992 /* 30 */
4993 { Bad_Opcode },
4994 { Bad_Opcode },
4995 { Bad_Opcode },
4996 { Bad_Opcode },
4997 { Bad_Opcode },
4998 { Bad_Opcode },
4999 { Bad_Opcode },
5000 { Bad_Opcode },
5001 /* 38 */
5002 { Bad_Opcode },
5003 { Bad_Opcode },
5004 { Bad_Opcode },
5005 { Bad_Opcode },
5006 { Bad_Opcode },
5007 { Bad_Opcode },
5008 { Bad_Opcode },
5009 { Bad_Opcode },
5010 /* 40 */
5011 { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
5012 { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
5013 { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
5014 { Bad_Opcode },
5015 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
5016 { Bad_Opcode },
5017 { Bad_Opcode },
5018 { Bad_Opcode },
5019 /* 48 */
5020 { Bad_Opcode },
5021 { Bad_Opcode },
5022 { Bad_Opcode },
5023 { Bad_Opcode },
5024 { Bad_Opcode },
5025 { Bad_Opcode },
5026 { Bad_Opcode },
5027 { Bad_Opcode },
5028 /* 50 */
5029 { Bad_Opcode },
5030 { Bad_Opcode },
5031 { Bad_Opcode },
5032 { Bad_Opcode },
5033 { Bad_Opcode },
5034 { Bad_Opcode },
5035 { Bad_Opcode },
5036 { Bad_Opcode },
5037 /* 58 */
5038 { Bad_Opcode },
5039 { Bad_Opcode },
5040 { Bad_Opcode },
5041 { Bad_Opcode },
5042 { Bad_Opcode },
5043 { Bad_Opcode },
5044 { Bad_Opcode },
5045 { Bad_Opcode },
5046 /* 60 */
5047 { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
5048 { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
5049 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
5050 { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
5051 { Bad_Opcode },
5052 { Bad_Opcode },
5053 { Bad_Opcode },
5054 { Bad_Opcode },
5055 /* 68 */
5056 { Bad_Opcode },
5057 { Bad_Opcode },
5058 { Bad_Opcode },
5059 { Bad_Opcode },
5060 { Bad_Opcode },
5061 { Bad_Opcode },
5062 { Bad_Opcode },
5063 { Bad_Opcode },
5064 /* 70 */
5065 { Bad_Opcode },
5066 { Bad_Opcode },
5067 { Bad_Opcode },
5068 { Bad_Opcode },
5069 { Bad_Opcode },
5070 { Bad_Opcode },
5071 { Bad_Opcode },
5072 { Bad_Opcode },
5073 /* 78 */
5074 { Bad_Opcode },
5075 { Bad_Opcode },
5076 { Bad_Opcode },
5077 { Bad_Opcode },
5078 { Bad_Opcode },
5079 { Bad_Opcode },
5080 { Bad_Opcode },
5081 { Bad_Opcode },
5082 /* 80 */
5083 { Bad_Opcode },
5084 { Bad_Opcode },
5085 { Bad_Opcode },
5086 { Bad_Opcode },
5087 { Bad_Opcode },
5088 { Bad_Opcode },
5089 { Bad_Opcode },
5090 { Bad_Opcode },
5091 /* 88 */
5092 { Bad_Opcode },
5093 { Bad_Opcode },
5094 { Bad_Opcode },
5095 { Bad_Opcode },
5096 { Bad_Opcode },
5097 { Bad_Opcode },
5098 { Bad_Opcode },
5099 { Bad_Opcode },
5100 /* 90 */
5101 { Bad_Opcode },
5102 { Bad_Opcode },
5103 { Bad_Opcode },
5104 { Bad_Opcode },
5105 { Bad_Opcode },
5106 { Bad_Opcode },
5107 { Bad_Opcode },
5108 { Bad_Opcode },
5109 /* 98 */
5110 { Bad_Opcode },
5111 { Bad_Opcode },
5112 { Bad_Opcode },
5113 { Bad_Opcode },
5114 { Bad_Opcode },
5115 { Bad_Opcode },
5116 { Bad_Opcode },
5117 { Bad_Opcode },
5118 /* a0 */
5119 { Bad_Opcode },
5120 { Bad_Opcode },
5121 { Bad_Opcode },
5122 { Bad_Opcode },
5123 { Bad_Opcode },
5124 { Bad_Opcode },
5125 { Bad_Opcode },
5126 { Bad_Opcode },
5127 /* a8 */
5128 { Bad_Opcode },
5129 { Bad_Opcode },
5130 { Bad_Opcode },
5131 { Bad_Opcode },
5132 { Bad_Opcode },
5133 { Bad_Opcode },
5134 { Bad_Opcode },
5135 { Bad_Opcode },
5136 /* b0 */
5137 { Bad_Opcode },
5138 { Bad_Opcode },
5139 { Bad_Opcode },
5140 { Bad_Opcode },
5141 { Bad_Opcode },
5142 { Bad_Opcode },
5143 { Bad_Opcode },
5144 { Bad_Opcode },
5145 /* b8 */
5146 { Bad_Opcode },
5147 { Bad_Opcode },
5148 { Bad_Opcode },
5149 { Bad_Opcode },
5150 { Bad_Opcode },
5151 { Bad_Opcode },
5152 { Bad_Opcode },
5153 { Bad_Opcode },
5154 /* c0 */
5155 { Bad_Opcode },
5156 { Bad_Opcode },
5157 { Bad_Opcode },
5158 { Bad_Opcode },
5159 { Bad_Opcode },
5160 { Bad_Opcode },
5161 { Bad_Opcode },
5162 { Bad_Opcode },
5163 /* c8 */
5164 { Bad_Opcode },
5165 { Bad_Opcode },
5166 { Bad_Opcode },
5167 { Bad_Opcode },
5168 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
5169 { Bad_Opcode },
5170 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5171 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5172 /* d0 */
5173 { Bad_Opcode },
5174 { Bad_Opcode },
5175 { Bad_Opcode },
5176 { Bad_Opcode },
5177 { Bad_Opcode },
5178 { Bad_Opcode },
5179 { Bad_Opcode },
5180 { Bad_Opcode },
5181 /* d8 */
5182 { Bad_Opcode },
5183 { Bad_Opcode },
5184 { Bad_Opcode },
5185 { Bad_Opcode },
5186 { Bad_Opcode },
5187 { Bad_Opcode },
5188 { Bad_Opcode },
5189 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
5190 /* e0 */
5191 { Bad_Opcode },
5192 { Bad_Opcode },
5193 { Bad_Opcode },
5194 { Bad_Opcode },
5195 { Bad_Opcode },
5196 { Bad_Opcode },
5197 { Bad_Opcode },
5198 { Bad_Opcode },
5199 /* e8 */
5200 { Bad_Opcode },
5201 { Bad_Opcode },
5202 { Bad_Opcode },
5203 { Bad_Opcode },
5204 { Bad_Opcode },
5205 { Bad_Opcode },
5206 { Bad_Opcode },
5207 { Bad_Opcode },
5208 /* f0 */
5209 { PREFIX_TABLE (PREFIX_0F3A0F) },
5210 { Bad_Opcode },
5211 { Bad_Opcode },
5212 { Bad_Opcode },
5213 { Bad_Opcode },
5214 { Bad_Opcode },
5215 { Bad_Opcode },
5216 { Bad_Opcode },
5217 /* f8 */
5218 { Bad_Opcode },
5219 { Bad_Opcode },
5220 { Bad_Opcode },
5221 { Bad_Opcode },
5222 { Bad_Opcode },
5223 { Bad_Opcode },
5224 { Bad_Opcode },
5225 { Bad_Opcode },
5226 },
5227 };
5228
5229 static const struct dis386 xop_table[][256] = {
5230 /* XOP_08 */
5231 {
5232 /* 00 */
5233 { Bad_Opcode },
5234 { Bad_Opcode },
5235 { Bad_Opcode },
5236 { Bad_Opcode },
5237 { Bad_Opcode },
5238 { Bad_Opcode },
5239 { Bad_Opcode },
5240 { Bad_Opcode },
5241 /* 08 */
5242 { Bad_Opcode },
5243 { Bad_Opcode },
5244 { Bad_Opcode },
5245 { Bad_Opcode },
5246 { Bad_Opcode },
5247 { Bad_Opcode },
5248 { Bad_Opcode },
5249 { Bad_Opcode },
5250 /* 10 */
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 /* 18 */
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 /* 20 */
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 /* 28 */
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 /* 30 */
5287 { Bad_Opcode },
5288 { Bad_Opcode },
5289 { Bad_Opcode },
5290 { Bad_Opcode },
5291 { Bad_Opcode },
5292 { Bad_Opcode },
5293 { Bad_Opcode },
5294 { Bad_Opcode },
5295 /* 38 */
5296 { Bad_Opcode },
5297 { Bad_Opcode },
5298 { Bad_Opcode },
5299 { Bad_Opcode },
5300 { Bad_Opcode },
5301 { Bad_Opcode },
5302 { Bad_Opcode },
5303 { Bad_Opcode },
5304 /* 40 */
5305 { Bad_Opcode },
5306 { Bad_Opcode },
5307 { Bad_Opcode },
5308 { Bad_Opcode },
5309 { Bad_Opcode },
5310 { Bad_Opcode },
5311 { Bad_Opcode },
5312 { Bad_Opcode },
5313 /* 48 */
5314 { Bad_Opcode },
5315 { Bad_Opcode },
5316 { Bad_Opcode },
5317 { Bad_Opcode },
5318 { Bad_Opcode },
5319 { Bad_Opcode },
5320 { Bad_Opcode },
5321 { Bad_Opcode },
5322 /* 50 */
5323 { Bad_Opcode },
5324 { Bad_Opcode },
5325 { Bad_Opcode },
5326 { Bad_Opcode },
5327 { Bad_Opcode },
5328 { Bad_Opcode },
5329 { Bad_Opcode },
5330 { Bad_Opcode },
5331 /* 58 */
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 /* 60 */
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 /* 68 */
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 /* 70 */
5359 { Bad_Opcode },
5360 { Bad_Opcode },
5361 { Bad_Opcode },
5362 { Bad_Opcode },
5363 { Bad_Opcode },
5364 { Bad_Opcode },
5365 { Bad_Opcode },
5366 { Bad_Opcode },
5367 /* 78 */
5368 { Bad_Opcode },
5369 { Bad_Opcode },
5370 { Bad_Opcode },
5371 { Bad_Opcode },
5372 { Bad_Opcode },
5373 { Bad_Opcode },
5374 { Bad_Opcode },
5375 { Bad_Opcode },
5376 /* 80 */
5377 { Bad_Opcode },
5378 { Bad_Opcode },
5379 { Bad_Opcode },
5380 { Bad_Opcode },
5381 { Bad_Opcode },
5382 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85) },
5383 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86) },
5384 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87) },
5385 /* 88 */
5386 { Bad_Opcode },
5387 { Bad_Opcode },
5388 { Bad_Opcode },
5389 { Bad_Opcode },
5390 { Bad_Opcode },
5391 { Bad_Opcode },
5392 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E) },
5393 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F) },
5394 /* 90 */
5395 { Bad_Opcode },
5396 { Bad_Opcode },
5397 { Bad_Opcode },
5398 { Bad_Opcode },
5399 { Bad_Opcode },
5400 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95) },
5401 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96) },
5402 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97) },
5403 /* 98 */
5404 { Bad_Opcode },
5405 { Bad_Opcode },
5406 { Bad_Opcode },
5407 { Bad_Opcode },
5408 { Bad_Opcode },
5409 { Bad_Opcode },
5410 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E) },
5411 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F) },
5412 /* a0 */
5413 { Bad_Opcode },
5414 { Bad_Opcode },
5415 { "vpcmov", { XM, Vex, EXx, XMVexI4 }, 0 },
5416 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3) },
5417 { Bad_Opcode },
5418 { Bad_Opcode },
5419 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6) },
5420 { Bad_Opcode },
5421 /* a8 */
5422 { Bad_Opcode },
5423 { Bad_Opcode },
5424 { Bad_Opcode },
5425 { Bad_Opcode },
5426 { Bad_Opcode },
5427 { Bad_Opcode },
5428 { Bad_Opcode },
5429 { Bad_Opcode },
5430 /* b0 */
5431 { Bad_Opcode },
5432 { Bad_Opcode },
5433 { Bad_Opcode },
5434 { Bad_Opcode },
5435 { Bad_Opcode },
5436 { Bad_Opcode },
5437 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6) },
5438 { Bad_Opcode },
5439 /* b8 */
5440 { Bad_Opcode },
5441 { Bad_Opcode },
5442 { Bad_Opcode },
5443 { Bad_Opcode },
5444 { Bad_Opcode },
5445 { Bad_Opcode },
5446 { Bad_Opcode },
5447 { Bad_Opcode },
5448 /* c0 */
5449 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0) },
5450 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1) },
5451 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2) },
5452 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3) },
5453 { Bad_Opcode },
5454 { Bad_Opcode },
5455 { Bad_Opcode },
5456 { Bad_Opcode },
5457 /* c8 */
5458 { Bad_Opcode },
5459 { Bad_Opcode },
5460 { Bad_Opcode },
5461 { Bad_Opcode },
5462 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
5463 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
5464 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
5465 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
5466 /* d0 */
5467 { Bad_Opcode },
5468 { Bad_Opcode },
5469 { Bad_Opcode },
5470 { Bad_Opcode },
5471 { Bad_Opcode },
5472 { Bad_Opcode },
5473 { Bad_Opcode },
5474 { Bad_Opcode },
5475 /* d8 */
5476 { Bad_Opcode },
5477 { Bad_Opcode },
5478 { Bad_Opcode },
5479 { Bad_Opcode },
5480 { Bad_Opcode },
5481 { Bad_Opcode },
5482 { Bad_Opcode },
5483 { Bad_Opcode },
5484 /* e0 */
5485 { Bad_Opcode },
5486 { Bad_Opcode },
5487 { Bad_Opcode },
5488 { Bad_Opcode },
5489 { Bad_Opcode },
5490 { Bad_Opcode },
5491 { Bad_Opcode },
5492 { Bad_Opcode },
5493 /* e8 */
5494 { Bad_Opcode },
5495 { Bad_Opcode },
5496 { Bad_Opcode },
5497 { Bad_Opcode },
5498 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
5499 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
5500 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
5501 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
5502 /* f0 */
5503 { Bad_Opcode },
5504 { Bad_Opcode },
5505 { Bad_Opcode },
5506 { Bad_Opcode },
5507 { Bad_Opcode },
5508 { Bad_Opcode },
5509 { Bad_Opcode },
5510 { Bad_Opcode },
5511 /* f8 */
5512 { Bad_Opcode },
5513 { Bad_Opcode },
5514 { Bad_Opcode },
5515 { Bad_Opcode },
5516 { Bad_Opcode },
5517 { Bad_Opcode },
5518 { Bad_Opcode },
5519 { Bad_Opcode },
5520 },
5521 /* XOP_09 */
5522 {
5523 /* 00 */
5524 { Bad_Opcode },
5525 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01) },
5526 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02) },
5527 { Bad_Opcode },
5528 { Bad_Opcode },
5529 { Bad_Opcode },
5530 { Bad_Opcode },
5531 { Bad_Opcode },
5532 /* 08 */
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 /* 10 */
5542 { Bad_Opcode },
5543 { Bad_Opcode },
5544 { MOD_TABLE (MOD_XOP_09_12) },
5545 { Bad_Opcode },
5546 { Bad_Opcode },
5547 { Bad_Opcode },
5548 { Bad_Opcode },
5549 { Bad_Opcode },
5550 /* 18 */
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 /* 20 */
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 /* 28 */
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 /* 30 */
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 /* 38 */
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 /* 40 */
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 /* 48 */
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 /* 50 */
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 /* 58 */
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 /* 60 */
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 /* 68 */
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 /* 70 */
5650 { Bad_Opcode },
5651 { Bad_Opcode },
5652 { Bad_Opcode },
5653 { Bad_Opcode },
5654 { Bad_Opcode },
5655 { Bad_Opcode },
5656 { Bad_Opcode },
5657 { Bad_Opcode },
5658 /* 78 */
5659 { Bad_Opcode },
5660 { Bad_Opcode },
5661 { Bad_Opcode },
5662 { Bad_Opcode },
5663 { Bad_Opcode },
5664 { Bad_Opcode },
5665 { Bad_Opcode },
5666 { Bad_Opcode },
5667 /* 80 */
5668 { VEX_W_TABLE (VEX_W_0FXOP_09_80) },
5669 { VEX_W_TABLE (VEX_W_0FXOP_09_81) },
5670 { VEX_W_TABLE (VEX_W_0FXOP_09_82) },
5671 { VEX_W_TABLE (VEX_W_0FXOP_09_83) },
5672 { Bad_Opcode },
5673 { Bad_Opcode },
5674 { Bad_Opcode },
5675 { Bad_Opcode },
5676 /* 88 */
5677 { Bad_Opcode },
5678 { Bad_Opcode },
5679 { Bad_Opcode },
5680 { Bad_Opcode },
5681 { Bad_Opcode },
5682 { Bad_Opcode },
5683 { Bad_Opcode },
5684 { Bad_Opcode },
5685 /* 90 */
5686 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90) },
5687 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91) },
5688 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92) },
5689 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93) },
5690 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94) },
5691 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95) },
5692 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96) },
5693 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97) },
5694 /* 98 */
5695 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98) },
5696 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99) },
5697 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A) },
5698 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B) },
5699 { Bad_Opcode },
5700 { Bad_Opcode },
5701 { Bad_Opcode },
5702 { Bad_Opcode },
5703 /* a0 */
5704 { Bad_Opcode },
5705 { Bad_Opcode },
5706 { Bad_Opcode },
5707 { Bad_Opcode },
5708 { Bad_Opcode },
5709 { Bad_Opcode },
5710 { Bad_Opcode },
5711 { Bad_Opcode },
5712 /* a8 */
5713 { Bad_Opcode },
5714 { Bad_Opcode },
5715 { Bad_Opcode },
5716 { Bad_Opcode },
5717 { Bad_Opcode },
5718 { Bad_Opcode },
5719 { Bad_Opcode },
5720 { Bad_Opcode },
5721 /* b0 */
5722 { Bad_Opcode },
5723 { Bad_Opcode },
5724 { Bad_Opcode },
5725 { Bad_Opcode },
5726 { Bad_Opcode },
5727 { Bad_Opcode },
5728 { Bad_Opcode },
5729 { Bad_Opcode },
5730 /* b8 */
5731 { Bad_Opcode },
5732 { Bad_Opcode },
5733 { Bad_Opcode },
5734 { Bad_Opcode },
5735 { Bad_Opcode },
5736 { Bad_Opcode },
5737 { Bad_Opcode },
5738 { Bad_Opcode },
5739 /* c0 */
5740 { Bad_Opcode },
5741 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1) },
5742 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2) },
5743 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3) },
5744 { Bad_Opcode },
5745 { Bad_Opcode },
5746 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6) },
5747 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7) },
5748 /* c8 */
5749 { Bad_Opcode },
5750 { Bad_Opcode },
5751 { Bad_Opcode },
5752 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB) },
5753 { Bad_Opcode },
5754 { Bad_Opcode },
5755 { Bad_Opcode },
5756 { Bad_Opcode },
5757 /* d0 */
5758 { Bad_Opcode },
5759 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1) },
5760 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2) },
5761 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3) },
5762 { Bad_Opcode },
5763 { Bad_Opcode },
5764 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6) },
5765 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7) },
5766 /* d8 */
5767 { Bad_Opcode },
5768 { Bad_Opcode },
5769 { Bad_Opcode },
5770 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB) },
5771 { Bad_Opcode },
5772 { Bad_Opcode },
5773 { Bad_Opcode },
5774 { Bad_Opcode },
5775 /* e0 */
5776 { Bad_Opcode },
5777 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1) },
5778 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2) },
5779 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3) },
5780 { Bad_Opcode },
5781 { Bad_Opcode },
5782 { Bad_Opcode },
5783 { Bad_Opcode },
5784 /* e8 */
5785 { Bad_Opcode },
5786 { Bad_Opcode },
5787 { Bad_Opcode },
5788 { Bad_Opcode },
5789 { Bad_Opcode },
5790 { Bad_Opcode },
5791 { Bad_Opcode },
5792 { Bad_Opcode },
5793 /* f0 */
5794 { Bad_Opcode },
5795 { Bad_Opcode },
5796 { Bad_Opcode },
5797 { Bad_Opcode },
5798 { Bad_Opcode },
5799 { Bad_Opcode },
5800 { Bad_Opcode },
5801 { Bad_Opcode },
5802 /* f8 */
5803 { Bad_Opcode },
5804 { Bad_Opcode },
5805 { Bad_Opcode },
5806 { Bad_Opcode },
5807 { Bad_Opcode },
5808 { Bad_Opcode },
5809 { Bad_Opcode },
5810 { Bad_Opcode },
5811 },
5812 /* XOP_0A */
5813 {
5814 /* 00 */
5815 { Bad_Opcode },
5816 { Bad_Opcode },
5817 { Bad_Opcode },
5818 { Bad_Opcode },
5819 { Bad_Opcode },
5820 { Bad_Opcode },
5821 { Bad_Opcode },
5822 { Bad_Opcode },
5823 /* 08 */
5824 { Bad_Opcode },
5825 { Bad_Opcode },
5826 { Bad_Opcode },
5827 { Bad_Opcode },
5828 { Bad_Opcode },
5829 { Bad_Opcode },
5830 { Bad_Opcode },
5831 { Bad_Opcode },
5832 /* 10 */
5833 { "bextrS", { Gdq, Edq, Id }, 0 },
5834 { Bad_Opcode },
5835 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12) },
5836 { Bad_Opcode },
5837 { Bad_Opcode },
5838 { Bad_Opcode },
5839 { Bad_Opcode },
5840 { Bad_Opcode },
5841 /* 18 */
5842 { Bad_Opcode },
5843 { Bad_Opcode },
5844 { Bad_Opcode },
5845 { Bad_Opcode },
5846 { Bad_Opcode },
5847 { Bad_Opcode },
5848 { Bad_Opcode },
5849 { Bad_Opcode },
5850 /* 20 */
5851 { Bad_Opcode },
5852 { Bad_Opcode },
5853 { Bad_Opcode },
5854 { Bad_Opcode },
5855 { Bad_Opcode },
5856 { Bad_Opcode },
5857 { Bad_Opcode },
5858 { Bad_Opcode },
5859 /* 28 */
5860 { Bad_Opcode },
5861 { Bad_Opcode },
5862 { Bad_Opcode },
5863 { Bad_Opcode },
5864 { Bad_Opcode },
5865 { Bad_Opcode },
5866 { Bad_Opcode },
5867 { Bad_Opcode },
5868 /* 30 */
5869 { Bad_Opcode },
5870 { Bad_Opcode },
5871 { Bad_Opcode },
5872 { Bad_Opcode },
5873 { Bad_Opcode },
5874 { Bad_Opcode },
5875 { Bad_Opcode },
5876 { Bad_Opcode },
5877 /* 38 */
5878 { Bad_Opcode },
5879 { Bad_Opcode },
5880 { Bad_Opcode },
5881 { Bad_Opcode },
5882 { Bad_Opcode },
5883 { Bad_Opcode },
5884 { Bad_Opcode },
5885 { Bad_Opcode },
5886 /* 40 */
5887 { Bad_Opcode },
5888 { Bad_Opcode },
5889 { Bad_Opcode },
5890 { Bad_Opcode },
5891 { Bad_Opcode },
5892 { Bad_Opcode },
5893 { Bad_Opcode },
5894 { Bad_Opcode },
5895 /* 48 */
5896 { Bad_Opcode },
5897 { Bad_Opcode },
5898 { Bad_Opcode },
5899 { Bad_Opcode },
5900 { Bad_Opcode },
5901 { Bad_Opcode },
5902 { Bad_Opcode },
5903 { Bad_Opcode },
5904 /* 50 */
5905 { Bad_Opcode },
5906 { Bad_Opcode },
5907 { Bad_Opcode },
5908 { Bad_Opcode },
5909 { Bad_Opcode },
5910 { Bad_Opcode },
5911 { Bad_Opcode },
5912 { Bad_Opcode },
5913 /* 58 */
5914 { Bad_Opcode },
5915 { Bad_Opcode },
5916 { Bad_Opcode },
5917 { Bad_Opcode },
5918 { Bad_Opcode },
5919 { Bad_Opcode },
5920 { Bad_Opcode },
5921 { Bad_Opcode },
5922 /* 60 */
5923 { Bad_Opcode },
5924 { Bad_Opcode },
5925 { Bad_Opcode },
5926 { Bad_Opcode },
5927 { Bad_Opcode },
5928 { Bad_Opcode },
5929 { Bad_Opcode },
5930 { Bad_Opcode },
5931 /* 68 */
5932 { Bad_Opcode },
5933 { Bad_Opcode },
5934 { Bad_Opcode },
5935 { Bad_Opcode },
5936 { Bad_Opcode },
5937 { Bad_Opcode },
5938 { Bad_Opcode },
5939 { Bad_Opcode },
5940 /* 70 */
5941 { Bad_Opcode },
5942 { Bad_Opcode },
5943 { Bad_Opcode },
5944 { Bad_Opcode },
5945 { Bad_Opcode },
5946 { Bad_Opcode },
5947 { Bad_Opcode },
5948 { Bad_Opcode },
5949 /* 78 */
5950 { Bad_Opcode },
5951 { Bad_Opcode },
5952 { Bad_Opcode },
5953 { Bad_Opcode },
5954 { Bad_Opcode },
5955 { Bad_Opcode },
5956 { Bad_Opcode },
5957 { Bad_Opcode },
5958 /* 80 */
5959 { Bad_Opcode },
5960 { Bad_Opcode },
5961 { Bad_Opcode },
5962 { Bad_Opcode },
5963 { Bad_Opcode },
5964 { Bad_Opcode },
5965 { Bad_Opcode },
5966 { Bad_Opcode },
5967 /* 88 */
5968 { Bad_Opcode },
5969 { Bad_Opcode },
5970 { Bad_Opcode },
5971 { Bad_Opcode },
5972 { Bad_Opcode },
5973 { Bad_Opcode },
5974 { Bad_Opcode },
5975 { Bad_Opcode },
5976 /* 90 */
5977 { Bad_Opcode },
5978 { Bad_Opcode },
5979 { Bad_Opcode },
5980 { Bad_Opcode },
5981 { Bad_Opcode },
5982 { Bad_Opcode },
5983 { Bad_Opcode },
5984 { Bad_Opcode },
5985 /* 98 */
5986 { Bad_Opcode },
5987 { Bad_Opcode },
5988 { Bad_Opcode },
5989 { Bad_Opcode },
5990 { Bad_Opcode },
5991 { Bad_Opcode },
5992 { Bad_Opcode },
5993 { Bad_Opcode },
5994 /* a0 */
5995 { Bad_Opcode },
5996 { Bad_Opcode },
5997 { Bad_Opcode },
5998 { Bad_Opcode },
5999 { Bad_Opcode },
6000 { Bad_Opcode },
6001 { Bad_Opcode },
6002 { Bad_Opcode },
6003 /* a8 */
6004 { Bad_Opcode },
6005 { Bad_Opcode },
6006 { Bad_Opcode },
6007 { Bad_Opcode },
6008 { Bad_Opcode },
6009 { Bad_Opcode },
6010 { Bad_Opcode },
6011 { Bad_Opcode },
6012 /* b0 */
6013 { Bad_Opcode },
6014 { Bad_Opcode },
6015 { Bad_Opcode },
6016 { Bad_Opcode },
6017 { Bad_Opcode },
6018 { Bad_Opcode },
6019 { Bad_Opcode },
6020 { Bad_Opcode },
6021 /* b8 */
6022 { Bad_Opcode },
6023 { Bad_Opcode },
6024 { Bad_Opcode },
6025 { Bad_Opcode },
6026 { Bad_Opcode },
6027 { Bad_Opcode },
6028 { Bad_Opcode },
6029 { Bad_Opcode },
6030 /* c0 */
6031 { Bad_Opcode },
6032 { Bad_Opcode },
6033 { Bad_Opcode },
6034 { Bad_Opcode },
6035 { Bad_Opcode },
6036 { Bad_Opcode },
6037 { Bad_Opcode },
6038 { Bad_Opcode },
6039 /* c8 */
6040 { Bad_Opcode },
6041 { Bad_Opcode },
6042 { Bad_Opcode },
6043 { Bad_Opcode },
6044 { Bad_Opcode },
6045 { Bad_Opcode },
6046 { Bad_Opcode },
6047 { Bad_Opcode },
6048 /* d0 */
6049 { Bad_Opcode },
6050 { Bad_Opcode },
6051 { Bad_Opcode },
6052 { Bad_Opcode },
6053 { Bad_Opcode },
6054 { Bad_Opcode },
6055 { Bad_Opcode },
6056 { Bad_Opcode },
6057 /* d8 */
6058 { Bad_Opcode },
6059 { Bad_Opcode },
6060 { Bad_Opcode },
6061 { Bad_Opcode },
6062 { Bad_Opcode },
6063 { Bad_Opcode },
6064 { Bad_Opcode },
6065 { Bad_Opcode },
6066 /* e0 */
6067 { Bad_Opcode },
6068 { Bad_Opcode },
6069 { Bad_Opcode },
6070 { Bad_Opcode },
6071 { Bad_Opcode },
6072 { Bad_Opcode },
6073 { Bad_Opcode },
6074 { Bad_Opcode },
6075 /* e8 */
6076 { Bad_Opcode },
6077 { Bad_Opcode },
6078 { Bad_Opcode },
6079 { Bad_Opcode },
6080 { Bad_Opcode },
6081 { Bad_Opcode },
6082 { Bad_Opcode },
6083 { Bad_Opcode },
6084 /* f0 */
6085 { Bad_Opcode },
6086 { Bad_Opcode },
6087 { Bad_Opcode },
6088 { Bad_Opcode },
6089 { Bad_Opcode },
6090 { Bad_Opcode },
6091 { Bad_Opcode },
6092 { Bad_Opcode },
6093 /* f8 */
6094 { Bad_Opcode },
6095 { Bad_Opcode },
6096 { Bad_Opcode },
6097 { Bad_Opcode },
6098 { Bad_Opcode },
6099 { Bad_Opcode },
6100 { Bad_Opcode },
6101 { Bad_Opcode },
6102 },
6103 };
6104
6105 static const struct dis386 vex_table[][256] = {
6106 /* VEX_0F */
6107 {
6108 /* 00 */
6109 { Bad_Opcode },
6110 { Bad_Opcode },
6111 { Bad_Opcode },
6112 { Bad_Opcode },
6113 { Bad_Opcode },
6114 { Bad_Opcode },
6115 { Bad_Opcode },
6116 { Bad_Opcode },
6117 /* 08 */
6118 { Bad_Opcode },
6119 { Bad_Opcode },
6120 { Bad_Opcode },
6121 { Bad_Opcode },
6122 { Bad_Opcode },
6123 { Bad_Opcode },
6124 { Bad_Opcode },
6125 { Bad_Opcode },
6126 /* 10 */
6127 { PREFIX_TABLE (PREFIX_VEX_0F10) },
6128 { PREFIX_TABLE (PREFIX_VEX_0F11) },
6129 { PREFIX_TABLE (PREFIX_VEX_0F12) },
6130 { MOD_TABLE (MOD_VEX_0F13) },
6131 { "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6132 { "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6133 { PREFIX_TABLE (PREFIX_VEX_0F16) },
6134 { MOD_TABLE (MOD_VEX_0F17) },
6135 /* 18 */
6136 { Bad_Opcode },
6137 { Bad_Opcode },
6138 { Bad_Opcode },
6139 { Bad_Opcode },
6140 { Bad_Opcode },
6141 { Bad_Opcode },
6142 { Bad_Opcode },
6143 { Bad_Opcode },
6144 /* 20 */
6145 { Bad_Opcode },
6146 { Bad_Opcode },
6147 { Bad_Opcode },
6148 { Bad_Opcode },
6149 { Bad_Opcode },
6150 { Bad_Opcode },
6151 { Bad_Opcode },
6152 { Bad_Opcode },
6153 /* 28 */
6154 { "vmovapX", { XM, EXx }, PREFIX_OPCODE },
6155 { "vmovapX", { EXxS, XM }, PREFIX_OPCODE },
6156 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
6157 { MOD_TABLE (MOD_VEX_0F2B) },
6158 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
6159 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
6160 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
6161 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
6162 /* 30 */
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 /* 38 */
6172 { Bad_Opcode },
6173 { Bad_Opcode },
6174 { Bad_Opcode },
6175 { Bad_Opcode },
6176 { Bad_Opcode },
6177 { Bad_Opcode },
6178 { Bad_Opcode },
6179 { Bad_Opcode },
6180 /* 40 */
6181 { Bad_Opcode },
6182 { VEX_LEN_TABLE (VEX_LEN_0F41) },
6183 { VEX_LEN_TABLE (VEX_LEN_0F42) },
6184 { Bad_Opcode },
6185 { VEX_LEN_TABLE (VEX_LEN_0F44) },
6186 { VEX_LEN_TABLE (VEX_LEN_0F45) },
6187 { VEX_LEN_TABLE (VEX_LEN_0F46) },
6188 { VEX_LEN_TABLE (VEX_LEN_0F47) },
6189 /* 48 */
6190 { Bad_Opcode },
6191 { Bad_Opcode },
6192 { VEX_LEN_TABLE (VEX_LEN_0F4A) },
6193 { VEX_LEN_TABLE (VEX_LEN_0F4B) },
6194 { Bad_Opcode },
6195 { Bad_Opcode },
6196 { Bad_Opcode },
6197 { Bad_Opcode },
6198 /* 50 */
6199 { MOD_TABLE (MOD_VEX_0F50) },
6200 { PREFIX_TABLE (PREFIX_VEX_0F51) },
6201 { PREFIX_TABLE (PREFIX_VEX_0F52) },
6202 { PREFIX_TABLE (PREFIX_VEX_0F53) },
6203 { "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6204 { "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6205 { "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6206 { "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6207 /* 58 */
6208 { PREFIX_TABLE (PREFIX_VEX_0F58) },
6209 { PREFIX_TABLE (PREFIX_VEX_0F59) },
6210 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
6211 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
6212 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
6213 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
6214 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
6215 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
6216 /* 60 */
6217 { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
6218 { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
6219 { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
6220 { "vpacksswb", { XM, Vex, EXx }, PREFIX_DATA },
6221 { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
6222 { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
6223 { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
6224 { "vpackuswb", { XM, Vex, EXx }, PREFIX_DATA },
6225 /* 68 */
6226 { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
6227 { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
6228 { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
6229 { "vpackssdw", { XM, Vex, EXx }, PREFIX_DATA },
6230 { "vpunpcklqdq", { XM, Vex, EXx }, PREFIX_DATA },
6231 { "vpunpckhqdq", { XM, Vex, EXx }, PREFIX_DATA },
6232 { VEX_LEN_TABLE (VEX_LEN_0F6E) },
6233 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
6234 /* 70 */
6235 { PREFIX_TABLE (PREFIX_VEX_0F70) },
6236 { MOD_TABLE (MOD_VEX_0F71) },
6237 { MOD_TABLE (MOD_VEX_0F72) },
6238 { MOD_TABLE (MOD_VEX_0F73) },
6239 { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
6240 { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
6241 { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
6242 { VEX_LEN_TABLE (VEX_LEN_0F77) },
6243 /* 78 */
6244 { Bad_Opcode },
6245 { Bad_Opcode },
6246 { Bad_Opcode },
6247 { Bad_Opcode },
6248 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
6249 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
6250 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
6251 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
6252 /* 80 */
6253 { Bad_Opcode },
6254 { Bad_Opcode },
6255 { Bad_Opcode },
6256 { Bad_Opcode },
6257 { Bad_Opcode },
6258 { Bad_Opcode },
6259 { Bad_Opcode },
6260 { Bad_Opcode },
6261 /* 88 */
6262 { Bad_Opcode },
6263 { Bad_Opcode },
6264 { Bad_Opcode },
6265 { Bad_Opcode },
6266 { Bad_Opcode },
6267 { Bad_Opcode },
6268 { Bad_Opcode },
6269 { Bad_Opcode },
6270 /* 90 */
6271 { VEX_LEN_TABLE (VEX_LEN_0F90) },
6272 { VEX_LEN_TABLE (VEX_LEN_0F91) },
6273 { VEX_LEN_TABLE (VEX_LEN_0F92) },
6274 { VEX_LEN_TABLE (VEX_LEN_0F93) },
6275 { Bad_Opcode },
6276 { Bad_Opcode },
6277 { Bad_Opcode },
6278 { Bad_Opcode },
6279 /* 98 */
6280 { VEX_LEN_TABLE (VEX_LEN_0F98) },
6281 { VEX_LEN_TABLE (VEX_LEN_0F99) },
6282 { Bad_Opcode },
6283 { Bad_Opcode },
6284 { Bad_Opcode },
6285 { Bad_Opcode },
6286 { Bad_Opcode },
6287 { Bad_Opcode },
6288 /* a0 */
6289 { Bad_Opcode },
6290 { Bad_Opcode },
6291 { Bad_Opcode },
6292 { Bad_Opcode },
6293 { Bad_Opcode },
6294 { Bad_Opcode },
6295 { Bad_Opcode },
6296 { Bad_Opcode },
6297 /* a8 */
6298 { Bad_Opcode },
6299 { Bad_Opcode },
6300 { Bad_Opcode },
6301 { Bad_Opcode },
6302 { Bad_Opcode },
6303 { Bad_Opcode },
6304 { REG_TABLE (REG_VEX_0FAE) },
6305 { Bad_Opcode },
6306 /* b0 */
6307 { Bad_Opcode },
6308 { Bad_Opcode },
6309 { Bad_Opcode },
6310 { Bad_Opcode },
6311 { Bad_Opcode },
6312 { Bad_Opcode },
6313 { Bad_Opcode },
6314 { Bad_Opcode },
6315 /* b8 */
6316 { Bad_Opcode },
6317 { Bad_Opcode },
6318 { Bad_Opcode },
6319 { Bad_Opcode },
6320 { Bad_Opcode },
6321 { Bad_Opcode },
6322 { Bad_Opcode },
6323 { Bad_Opcode },
6324 /* c0 */
6325 { Bad_Opcode },
6326 { Bad_Opcode },
6327 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
6328 { Bad_Opcode },
6329 { VEX_LEN_TABLE (VEX_LEN_0FC4) },
6330 { VEX_LEN_TABLE (VEX_LEN_0FC5) },
6331 { "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
6332 { Bad_Opcode },
6333 /* c8 */
6334 { Bad_Opcode },
6335 { Bad_Opcode },
6336 { Bad_Opcode },
6337 { Bad_Opcode },
6338 { Bad_Opcode },
6339 { Bad_Opcode },
6340 { Bad_Opcode },
6341 { Bad_Opcode },
6342 /* d0 */
6343 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
6344 { "vpsrlw", { XM, Vex, EXxmm }, PREFIX_DATA },
6345 { "vpsrld", { XM, Vex, EXxmm }, PREFIX_DATA },
6346 { "vpsrlq", { XM, Vex, EXxmm }, PREFIX_DATA },
6347 { "vpaddq", { XM, Vex, EXx }, PREFIX_DATA },
6348 { "vpmullw", { XM, Vex, EXx }, PREFIX_DATA },
6349 { VEX_LEN_TABLE (VEX_LEN_0FD6) },
6350 { MOD_TABLE (MOD_VEX_0FD7) },
6351 /* d8 */
6352 { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
6353 { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
6354 { "vpminub", { XM, Vex, EXx }, PREFIX_DATA },
6355 { "vpand", { XM, Vex, EXx }, PREFIX_DATA },
6356 { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
6357 { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
6358 { "vpmaxub", { XM, Vex, EXx }, PREFIX_DATA },
6359 { "vpandn", { XM, Vex, EXx }, PREFIX_DATA },
6360 /* e0 */
6361 { "vpavgb", { XM, Vex, EXx }, PREFIX_DATA },
6362 { "vpsraw", { XM, Vex, EXxmm }, PREFIX_DATA },
6363 { "vpsrad", { XM, Vex, EXxmm }, PREFIX_DATA },
6364 { "vpavgw", { XM, Vex, EXx }, PREFIX_DATA },
6365 { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
6366 { "vpmulhw", { XM, Vex, EXx }, PREFIX_DATA },
6367 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
6368 { MOD_TABLE (MOD_VEX_0FE7) },
6369 /* e8 */
6370 { "vpsubsb", { XM, Vex, EXx }, PREFIX_DATA },
6371 { "vpsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6372 { "vpminsw", { XM, Vex, EXx }, PREFIX_DATA },
6373 { "vpor", { XM, Vex, EXx }, PREFIX_DATA },
6374 { "vpaddsb", { XM, Vex, EXx }, PREFIX_DATA },
6375 { "vpaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6376 { "vpmaxsw", { XM, Vex, EXx }, PREFIX_DATA },
6377 { "vpxor", { XM, Vex, EXx }, PREFIX_DATA },
6378 /* f0 */
6379 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
6380 { "vpsllw", { XM, Vex, EXxmm }, PREFIX_DATA },
6381 { "vpslld", { XM, Vex, EXxmm }, PREFIX_DATA },
6382 { "vpsllq", { XM, Vex, EXxmm }, PREFIX_DATA },
6383 { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
6384 { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
6385 { "vpsadbw", { XM, Vex, EXx }, PREFIX_DATA },
6386 { VEX_LEN_TABLE (VEX_LEN_0FF7) },
6387 /* f8 */
6388 { "vpsubb", { XM, Vex, EXx }, PREFIX_DATA },
6389 { "vpsubw", { XM, Vex, EXx }, PREFIX_DATA },
6390 { "vpsubd", { XM, Vex, EXx }, PREFIX_DATA },
6391 { "vpsubq", { XM, Vex, EXx }, PREFIX_DATA },
6392 { "vpaddb", { XM, Vex, EXx }, PREFIX_DATA },
6393 { "vpaddw", { XM, Vex, EXx }, PREFIX_DATA },
6394 { "vpaddd", { XM, Vex, EXx }, PREFIX_DATA },
6395 { Bad_Opcode },
6396 },
6397 /* VEX_0F38 */
6398 {
6399 /* 00 */
6400 { "vpshufb", { XM, Vex, EXx }, PREFIX_DATA },
6401 { "vphaddw", { XM, Vex, EXx }, PREFIX_DATA },
6402 { "vphaddd", { XM, Vex, EXx }, PREFIX_DATA },
6403 { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6404 { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
6405 { "vphsubw", { XM, Vex, EXx }, PREFIX_DATA },
6406 { "vphsubd", { XM, Vex, EXx }, PREFIX_DATA },
6407 { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6408 /* 08 */
6409 { "vpsignb", { XM, Vex, EXx }, PREFIX_DATA },
6410 { "vpsignw", { XM, Vex, EXx }, PREFIX_DATA },
6411 { "vpsignd", { XM, Vex, EXx }, PREFIX_DATA },
6412 { "vpmulhrsw", { XM, Vex, EXx }, PREFIX_DATA },
6413 { VEX_W_TABLE (VEX_W_0F380C) },
6414 { VEX_W_TABLE (VEX_W_0F380D) },
6415 { VEX_W_TABLE (VEX_W_0F380E) },
6416 { VEX_W_TABLE (VEX_W_0F380F) },
6417 /* 10 */
6418 { Bad_Opcode },
6419 { Bad_Opcode },
6420 { Bad_Opcode },
6421 { VEX_W_TABLE (VEX_W_0F3813) },
6422 { Bad_Opcode },
6423 { Bad_Opcode },
6424 { VEX_LEN_TABLE (VEX_LEN_0F3816) },
6425 { "vptest", { XM, EXx }, PREFIX_DATA },
6426 /* 18 */
6427 { VEX_W_TABLE (VEX_W_0F3818) },
6428 { VEX_LEN_TABLE (VEX_LEN_0F3819) },
6429 { MOD_TABLE (MOD_VEX_0F381A) },
6430 { Bad_Opcode },
6431 { "vpabsb", { XM, EXx }, PREFIX_DATA },
6432 { "vpabsw", { XM, EXx }, PREFIX_DATA },
6433 { "vpabsd", { XM, EXx }, PREFIX_DATA },
6434 { Bad_Opcode },
6435 /* 20 */
6436 { "vpmovsxbw", { XM, EXxmmq }, PREFIX_DATA },
6437 { "vpmovsxbd", { XM, EXxmmqd }, PREFIX_DATA },
6438 { "vpmovsxbq", { XM, EXxmmdw }, PREFIX_DATA },
6439 { "vpmovsxwd", { XM, EXxmmq }, PREFIX_DATA },
6440 { "vpmovsxwq", { XM, EXxmmqd }, PREFIX_DATA },
6441 { "vpmovsxdq", { XM, EXxmmq }, PREFIX_DATA },
6442 { Bad_Opcode },
6443 { Bad_Opcode },
6444 /* 28 */
6445 { "vpmuldq", { XM, Vex, EXx }, PREFIX_DATA },
6446 { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
6447 { MOD_TABLE (MOD_VEX_0F382A) },
6448 { "vpackusdw", { XM, Vex, EXx }, PREFIX_DATA },
6449 { MOD_TABLE (MOD_VEX_0F382C) },
6450 { MOD_TABLE (MOD_VEX_0F382D) },
6451 { MOD_TABLE (MOD_VEX_0F382E) },
6452 { MOD_TABLE (MOD_VEX_0F382F) },
6453 /* 30 */
6454 { "vpmovzxbw", { XM, EXxmmq }, PREFIX_DATA },
6455 { "vpmovzxbd", { XM, EXxmmqd }, PREFIX_DATA },
6456 { "vpmovzxbq", { XM, EXxmmdw }, PREFIX_DATA },
6457 { "vpmovzxwd", { XM, EXxmmq }, PREFIX_DATA },
6458 { "vpmovzxwq", { XM, EXxmmqd }, PREFIX_DATA },
6459 { "vpmovzxdq", { XM, EXxmmq }, PREFIX_DATA },
6460 { VEX_LEN_TABLE (VEX_LEN_0F3836) },
6461 { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
6462 /* 38 */
6463 { "vpminsb", { XM, Vex, EXx }, PREFIX_DATA },
6464 { "vpminsd", { XM, Vex, EXx }, PREFIX_DATA },
6465 { "vpminuw", { XM, Vex, EXx }, PREFIX_DATA },
6466 { "vpminud", { XM, Vex, EXx }, PREFIX_DATA },
6467 { "vpmaxsb", { XM, Vex, EXx }, PREFIX_DATA },
6468 { "vpmaxsd", { XM, Vex, EXx }, PREFIX_DATA },
6469 { "vpmaxuw", { XM, Vex, EXx }, PREFIX_DATA },
6470 { "vpmaxud", { XM, Vex, EXx }, PREFIX_DATA },
6471 /* 40 */
6472 { "vpmulld", { XM, Vex, EXx }, PREFIX_DATA },
6473 { VEX_LEN_TABLE (VEX_LEN_0F3841) },
6474 { Bad_Opcode },
6475 { Bad_Opcode },
6476 { Bad_Opcode },
6477 { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6478 { VEX_W_TABLE (VEX_W_0F3846) },
6479 { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6480 /* 48 */
6481 { Bad_Opcode },
6482 { X86_64_TABLE (X86_64_VEX_0F3849) },
6483 { Bad_Opcode },
6484 { X86_64_TABLE (X86_64_VEX_0F384B) },
6485 { Bad_Opcode },
6486 { Bad_Opcode },
6487 { Bad_Opcode },
6488 { Bad_Opcode },
6489 /* 50 */
6490 { VEX_W_TABLE (VEX_W_0F3850) },
6491 { VEX_W_TABLE (VEX_W_0F3851) },
6492 { VEX_W_TABLE (VEX_W_0F3852) },
6493 { VEX_W_TABLE (VEX_W_0F3853) },
6494 { Bad_Opcode },
6495 { Bad_Opcode },
6496 { Bad_Opcode },
6497 { Bad_Opcode },
6498 /* 58 */
6499 { VEX_W_TABLE (VEX_W_0F3858) },
6500 { VEX_W_TABLE (VEX_W_0F3859) },
6501 { MOD_TABLE (MOD_VEX_0F385A) },
6502 { Bad_Opcode },
6503 { X86_64_TABLE (X86_64_VEX_0F385C) },
6504 { Bad_Opcode },
6505 { X86_64_TABLE (X86_64_VEX_0F385E) },
6506 { Bad_Opcode },
6507 /* 60 */
6508 { Bad_Opcode },
6509 { Bad_Opcode },
6510 { Bad_Opcode },
6511 { Bad_Opcode },
6512 { Bad_Opcode },
6513 { Bad_Opcode },
6514 { Bad_Opcode },
6515 { Bad_Opcode },
6516 /* 68 */
6517 { Bad_Opcode },
6518 { Bad_Opcode },
6519 { Bad_Opcode },
6520 { Bad_Opcode },
6521 { X86_64_TABLE (X86_64_VEX_0F386C) },
6522 { Bad_Opcode },
6523 { Bad_Opcode },
6524 { Bad_Opcode },
6525 /* 70 */
6526 { Bad_Opcode },
6527 { Bad_Opcode },
6528 { PREFIX_TABLE (PREFIX_VEX_0F3872) },
6529 { Bad_Opcode },
6530 { Bad_Opcode },
6531 { Bad_Opcode },
6532 { Bad_Opcode },
6533 { Bad_Opcode },
6534 /* 78 */
6535 { VEX_W_TABLE (VEX_W_0F3878) },
6536 { VEX_W_TABLE (VEX_W_0F3879) },
6537 { Bad_Opcode },
6538 { Bad_Opcode },
6539 { Bad_Opcode },
6540 { Bad_Opcode },
6541 { Bad_Opcode },
6542 { Bad_Opcode },
6543 /* 80 */
6544 { Bad_Opcode },
6545 { Bad_Opcode },
6546 { Bad_Opcode },
6547 { Bad_Opcode },
6548 { Bad_Opcode },
6549 { Bad_Opcode },
6550 { Bad_Opcode },
6551 { Bad_Opcode },
6552 /* 88 */
6553 { Bad_Opcode },
6554 { Bad_Opcode },
6555 { Bad_Opcode },
6556 { Bad_Opcode },
6557 { MOD_TABLE (MOD_VEX_0F388C) },
6558 { Bad_Opcode },
6559 { MOD_TABLE (MOD_VEX_0F388E) },
6560 { Bad_Opcode },
6561 /* 90 */
6562 { "vpgatherd%DQ", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6563 { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6564 { "vgatherdp%XW", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6565 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6566 { Bad_Opcode },
6567 { Bad_Opcode },
6568 { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6569 { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6570 /* 98 */
6571 { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6572 { "vfmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6573 { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6574 { "vfmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6575 { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6576 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6577 { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6578 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6579 /* a0 */
6580 { Bad_Opcode },
6581 { Bad_Opcode },
6582 { Bad_Opcode },
6583 { Bad_Opcode },
6584 { Bad_Opcode },
6585 { Bad_Opcode },
6586 { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6587 { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6588 /* a8 */
6589 { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6590 { "vfmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6591 { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6592 { "vfmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6593 { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6594 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6595 { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6596 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6597 /* b0 */
6598 { VEX_W_TABLE (VEX_W_0F38B0) },
6599 { VEX_W_TABLE (VEX_W_0F38B1) },
6600 { Bad_Opcode },
6601 { Bad_Opcode },
6602 { VEX_W_TABLE (VEX_W_0F38B4) },
6603 { VEX_W_TABLE (VEX_W_0F38B5) },
6604 { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6605 { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6606 /* b8 */
6607 { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6608 { "vfmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6609 { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6610 { "vfmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6611 { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6612 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6613 { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6614 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6615 /* c0 */
6616 { Bad_Opcode },
6617 { Bad_Opcode },
6618 { Bad_Opcode },
6619 { Bad_Opcode },
6620 { Bad_Opcode },
6621 { Bad_Opcode },
6622 { Bad_Opcode },
6623 { Bad_Opcode },
6624 /* c8 */
6625 { Bad_Opcode },
6626 { Bad_Opcode },
6627 { Bad_Opcode },
6628 { Bad_Opcode },
6629 { Bad_Opcode },
6630 { Bad_Opcode },
6631 { Bad_Opcode },
6632 { VEX_W_TABLE (VEX_W_0F38CF) },
6633 /* d0 */
6634 { Bad_Opcode },
6635 { Bad_Opcode },
6636 { Bad_Opcode },
6637 { Bad_Opcode },
6638 { Bad_Opcode },
6639 { Bad_Opcode },
6640 { Bad_Opcode },
6641 { Bad_Opcode },
6642 /* d8 */
6643 { Bad_Opcode },
6644 { Bad_Opcode },
6645 { Bad_Opcode },
6646 { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6647 { "vaesenc", { XM, Vex, EXx }, PREFIX_DATA },
6648 { "vaesenclast", { XM, Vex, EXx }, PREFIX_DATA },
6649 { "vaesdec", { XM, Vex, EXx }, PREFIX_DATA },
6650 { "vaesdeclast", { XM, Vex, EXx }, PREFIX_DATA },
6651 /* e0 */
6652 { X86_64_TABLE (X86_64_VEX_0F38E0) },
6653 { X86_64_TABLE (X86_64_VEX_0F38E1) },
6654 { X86_64_TABLE (X86_64_VEX_0F38E2) },
6655 { X86_64_TABLE (X86_64_VEX_0F38E3) },
6656 { X86_64_TABLE (X86_64_VEX_0F38E4) },
6657 { X86_64_TABLE (X86_64_VEX_0F38E5) },
6658 { X86_64_TABLE (X86_64_VEX_0F38E6) },
6659 { X86_64_TABLE (X86_64_VEX_0F38E7) },
6660 /* e8 */
6661 { X86_64_TABLE (X86_64_VEX_0F38E8) },
6662 { X86_64_TABLE (X86_64_VEX_0F38E9) },
6663 { X86_64_TABLE (X86_64_VEX_0F38EA) },
6664 { X86_64_TABLE (X86_64_VEX_0F38EB) },
6665 { X86_64_TABLE (X86_64_VEX_0F38EC) },
6666 { X86_64_TABLE (X86_64_VEX_0F38ED) },
6667 { X86_64_TABLE (X86_64_VEX_0F38EE) },
6668 { X86_64_TABLE (X86_64_VEX_0F38EF) },
6669 /* f0 */
6670 { Bad_Opcode },
6671 { Bad_Opcode },
6672 { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
6673 { VEX_LEN_TABLE (VEX_LEN_0F38F3) },
6674 { Bad_Opcode },
6675 { VEX_LEN_TABLE (VEX_LEN_0F38F5) },
6676 { VEX_LEN_TABLE (VEX_LEN_0F38F6) },
6677 { VEX_LEN_TABLE (VEX_LEN_0F38F7) },
6678 /* f8 */
6679 { Bad_Opcode },
6680 { Bad_Opcode },
6681 { Bad_Opcode },
6682 { Bad_Opcode },
6683 { Bad_Opcode },
6684 { Bad_Opcode },
6685 { Bad_Opcode },
6686 { Bad_Opcode },
6687 },
6688 /* VEX_0F3A */
6689 {
6690 /* 00 */
6691 { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6692 { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6693 { VEX_W_TABLE (VEX_W_0F3A02) },
6694 { Bad_Opcode },
6695 { VEX_W_TABLE (VEX_W_0F3A04) },
6696 { VEX_W_TABLE (VEX_W_0F3A05) },
6697 { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
6698 { Bad_Opcode },
6699 /* 08 */
6700 { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6701 { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6702 { "vroundss", { XMScalar, VexScalar, EXd, Ib }, PREFIX_DATA },
6703 { "vroundsd", { XMScalar, VexScalar, EXq, Ib }, PREFIX_DATA },
6704 { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6705 { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6706 { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6707 { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6708 /* 10 */
6709 { Bad_Opcode },
6710 { Bad_Opcode },
6711 { Bad_Opcode },
6712 { Bad_Opcode },
6713 { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6714 { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6715 { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6716 { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
6717 /* 18 */
6718 { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6719 { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
6720 { Bad_Opcode },
6721 { Bad_Opcode },
6722 { Bad_Opcode },
6723 { VEX_W_TABLE (VEX_W_0F3A1D) },
6724 { Bad_Opcode },
6725 { Bad_Opcode },
6726 /* 20 */
6727 { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6728 { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6729 { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
6730 { Bad_Opcode },
6731 { Bad_Opcode },
6732 { Bad_Opcode },
6733 { Bad_Opcode },
6734 { Bad_Opcode },
6735 /* 28 */
6736 { Bad_Opcode },
6737 { Bad_Opcode },
6738 { Bad_Opcode },
6739 { Bad_Opcode },
6740 { Bad_Opcode },
6741 { Bad_Opcode },
6742 { Bad_Opcode },
6743 { Bad_Opcode },
6744 /* 30 */
6745 { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
6746 { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
6747 { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
6748 { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
6749 { Bad_Opcode },
6750 { Bad_Opcode },
6751 { Bad_Opcode },
6752 { Bad_Opcode },
6753 /* 38 */
6754 { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
6755 { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
6756 { Bad_Opcode },
6757 { Bad_Opcode },
6758 { Bad_Opcode },
6759 { Bad_Opcode },
6760 { Bad_Opcode },
6761 { Bad_Opcode },
6762 /* 40 */
6763 { "vdpps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6764 { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
6765 { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6766 { Bad_Opcode },
6767 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
6768 { Bad_Opcode },
6769 { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
6770 { Bad_Opcode },
6771 /* 48 */
6772 { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6773 { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6774 { VEX_W_TABLE (VEX_W_0F3A4A) },
6775 { VEX_W_TABLE (VEX_W_0F3A4B) },
6776 { VEX_W_TABLE (VEX_W_0F3A4C) },
6777 { Bad_Opcode },
6778 { Bad_Opcode },
6779 { Bad_Opcode },
6780 /* 50 */
6781 { Bad_Opcode },
6782 { Bad_Opcode },
6783 { Bad_Opcode },
6784 { Bad_Opcode },
6785 { Bad_Opcode },
6786 { Bad_Opcode },
6787 { Bad_Opcode },
6788 { Bad_Opcode },
6789 /* 58 */
6790 { Bad_Opcode },
6791 { Bad_Opcode },
6792 { Bad_Opcode },
6793 { Bad_Opcode },
6794 { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6795 { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6796 { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6797 { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6798 /* 60 */
6799 { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
6800 { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
6801 { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
6802 { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
6803 { Bad_Opcode },
6804 { Bad_Opcode },
6805 { Bad_Opcode },
6806 { Bad_Opcode },
6807 /* 68 */
6808 { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6809 { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6810 { "vfmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6811 { "vfmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6812 { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6813 { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6814 { "vfmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6815 { "vfmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6816 /* 70 */
6817 { Bad_Opcode },
6818 { Bad_Opcode },
6819 { Bad_Opcode },
6820 { Bad_Opcode },
6821 { Bad_Opcode },
6822 { Bad_Opcode },
6823 { Bad_Opcode },
6824 { Bad_Opcode },
6825 /* 78 */
6826 { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6827 { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6828 { "vfnmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6829 { "vfnmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6830 { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6831 { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6832 { "vfnmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6833 { "vfnmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6834 /* 80 */
6835 { Bad_Opcode },
6836 { Bad_Opcode },
6837 { Bad_Opcode },
6838 { Bad_Opcode },
6839 { Bad_Opcode },
6840 { Bad_Opcode },
6841 { Bad_Opcode },
6842 { Bad_Opcode },
6843 /* 88 */
6844 { Bad_Opcode },
6845 { Bad_Opcode },
6846 { Bad_Opcode },
6847 { Bad_Opcode },
6848 { Bad_Opcode },
6849 { Bad_Opcode },
6850 { Bad_Opcode },
6851 { Bad_Opcode },
6852 /* 90 */
6853 { Bad_Opcode },
6854 { Bad_Opcode },
6855 { Bad_Opcode },
6856 { Bad_Opcode },
6857 { Bad_Opcode },
6858 { Bad_Opcode },
6859 { Bad_Opcode },
6860 { Bad_Opcode },
6861 /* 98 */
6862 { Bad_Opcode },
6863 { Bad_Opcode },
6864 { Bad_Opcode },
6865 { Bad_Opcode },
6866 { Bad_Opcode },
6867 { Bad_Opcode },
6868 { Bad_Opcode },
6869 { Bad_Opcode },
6870 /* a0 */
6871 { Bad_Opcode },
6872 { Bad_Opcode },
6873 { Bad_Opcode },
6874 { Bad_Opcode },
6875 { Bad_Opcode },
6876 { Bad_Opcode },
6877 { Bad_Opcode },
6878 { Bad_Opcode },
6879 /* a8 */
6880 { Bad_Opcode },
6881 { Bad_Opcode },
6882 { Bad_Opcode },
6883 { Bad_Opcode },
6884 { Bad_Opcode },
6885 { Bad_Opcode },
6886 { Bad_Opcode },
6887 { Bad_Opcode },
6888 /* b0 */
6889 { Bad_Opcode },
6890 { Bad_Opcode },
6891 { Bad_Opcode },
6892 { Bad_Opcode },
6893 { Bad_Opcode },
6894 { Bad_Opcode },
6895 { Bad_Opcode },
6896 { Bad_Opcode },
6897 /* b8 */
6898 { Bad_Opcode },
6899 { Bad_Opcode },
6900 { Bad_Opcode },
6901 { Bad_Opcode },
6902 { Bad_Opcode },
6903 { Bad_Opcode },
6904 { Bad_Opcode },
6905 { Bad_Opcode },
6906 /* c0 */
6907 { Bad_Opcode },
6908 { Bad_Opcode },
6909 { Bad_Opcode },
6910 { Bad_Opcode },
6911 { Bad_Opcode },
6912 { Bad_Opcode },
6913 { Bad_Opcode },
6914 { Bad_Opcode },
6915 /* c8 */
6916 { Bad_Opcode },
6917 { Bad_Opcode },
6918 { Bad_Opcode },
6919 { Bad_Opcode },
6920 { Bad_Opcode },
6921 { Bad_Opcode },
6922 { VEX_W_TABLE (VEX_W_0F3ACE) },
6923 { VEX_W_TABLE (VEX_W_0F3ACF) },
6924 /* d0 */
6925 { Bad_Opcode },
6926 { Bad_Opcode },
6927 { Bad_Opcode },
6928 { Bad_Opcode },
6929 { Bad_Opcode },
6930 { Bad_Opcode },
6931 { Bad_Opcode },
6932 { Bad_Opcode },
6933 /* d8 */
6934 { Bad_Opcode },
6935 { Bad_Opcode },
6936 { Bad_Opcode },
6937 { Bad_Opcode },
6938 { Bad_Opcode },
6939 { Bad_Opcode },
6940 { Bad_Opcode },
6941 { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
6942 /* e0 */
6943 { Bad_Opcode },
6944 { Bad_Opcode },
6945 { Bad_Opcode },
6946 { Bad_Opcode },
6947 { Bad_Opcode },
6948 { Bad_Opcode },
6949 { Bad_Opcode },
6950 { Bad_Opcode },
6951 /* e8 */
6952 { Bad_Opcode },
6953 { Bad_Opcode },
6954 { Bad_Opcode },
6955 { Bad_Opcode },
6956 { Bad_Opcode },
6957 { Bad_Opcode },
6958 { Bad_Opcode },
6959 { Bad_Opcode },
6960 /* f0 */
6961 { VEX_LEN_TABLE (VEX_LEN_0F3AF0) },
6962 { Bad_Opcode },
6963 { Bad_Opcode },
6964 { Bad_Opcode },
6965 { Bad_Opcode },
6966 { Bad_Opcode },
6967 { Bad_Opcode },
6968 { Bad_Opcode },
6969 /* f8 */
6970 { Bad_Opcode },
6971 { Bad_Opcode },
6972 { Bad_Opcode },
6973 { Bad_Opcode },
6974 { Bad_Opcode },
6975 { Bad_Opcode },
6976 { Bad_Opcode },
6977 { Bad_Opcode },
6978 },
6979 };
6980
6981 #include "i386-dis-evex.h"
6982
6983 static const struct dis386 vex_len_table[][2] = {
6984 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
6985 {
6986 { "%XEvmovlpX", { XM, Vex, EXq }, 0 },
6987 },
6988
6989 /* VEX_LEN_0F12_P_0_M_1 */
6990 {
6991 { "%XEvmovhlp%XS", { XM, Vex, EXq }, 0 },
6992 },
6993
6994 /* VEX_LEN_0F13_M_0 */
6995 {
6996 { "%XEvmovlpX", { EXq, XM }, PREFIX_OPCODE },
6997 },
6998
6999 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
7000 {
7001 { "%XEvmovhpX", { XM, Vex, EXq }, 0 },
7002 },
7003
7004 /* VEX_LEN_0F16_P_0_M_1 */
7005 {
7006 { "%XEvmovlhp%XS", { XM, Vex, EXq }, 0 },
7007 },
7008
7009 /* VEX_LEN_0F17_M_0 */
7010 {
7011 { "%XEvmovhpX", { EXq, XM }, PREFIX_OPCODE },
7012 },
7013
7014 /* VEX_LEN_0F41 */
7015 {
7016 { Bad_Opcode },
7017 { MOD_TABLE (MOD_VEX_0F41_L_1) },
7018 },
7019
7020 /* VEX_LEN_0F42 */
7021 {
7022 { Bad_Opcode },
7023 { MOD_TABLE (MOD_VEX_0F42_L_1) },
7024 },
7025
7026 /* VEX_LEN_0F44 */
7027 {
7028 { MOD_TABLE (MOD_VEX_0F44_L_0) },
7029 },
7030
7031 /* VEX_LEN_0F45 */
7032 {
7033 { Bad_Opcode },
7034 { MOD_TABLE (MOD_VEX_0F45_L_1) },
7035 },
7036
7037 /* VEX_LEN_0F46 */
7038 {
7039 { Bad_Opcode },
7040 { MOD_TABLE (MOD_VEX_0F46_L_1) },
7041 },
7042
7043 /* VEX_LEN_0F47 */
7044 {
7045 { Bad_Opcode },
7046 { MOD_TABLE (MOD_VEX_0F47_L_1) },
7047 },
7048
7049 /* VEX_LEN_0F4A */
7050 {
7051 { Bad_Opcode },
7052 { MOD_TABLE (MOD_VEX_0F4A_L_1) },
7053 },
7054
7055 /* VEX_LEN_0F4B */
7056 {
7057 { Bad_Opcode },
7058 { MOD_TABLE (MOD_VEX_0F4B_L_1) },
7059 },
7060
7061 /* VEX_LEN_0F6E */
7062 {
7063 { "%XEvmovK", { XMScalar, Edq }, PREFIX_DATA },
7064 },
7065
7066 /* VEX_LEN_0F77 */
7067 {
7068 { "vzeroupper", { XX }, 0 },
7069 { "vzeroall", { XX }, 0 },
7070 },
7071
7072 /* VEX_LEN_0F7E_P_1 */
7073 {
7074 { "%XEvmovq", { XMScalar, EXq }, 0 },
7075 },
7076
7077 /* VEX_LEN_0F7E_P_2 */
7078 {
7079 { "%XEvmovK", { Edq, XMScalar }, 0 },
7080 },
7081
7082 /* VEX_LEN_0F90 */
7083 {
7084 { VEX_W_TABLE (VEX_W_0F90_L_0) },
7085 },
7086
7087 /* VEX_LEN_0F91 */
7088 {
7089 { MOD_TABLE (MOD_VEX_0F91_L_0) },
7090 },
7091
7092 /* VEX_LEN_0F92 */
7093 {
7094 { MOD_TABLE (MOD_VEX_0F92_L_0) },
7095 },
7096
7097 /* VEX_LEN_0F93 */
7098 {
7099 { MOD_TABLE (MOD_VEX_0F93_L_0) },
7100 },
7101
7102 /* VEX_LEN_0F98 */
7103 {
7104 { MOD_TABLE (MOD_VEX_0F98_L_0) },
7105 },
7106
7107 /* VEX_LEN_0F99 */
7108 {
7109 { MOD_TABLE (MOD_VEX_0F99_L_0) },
7110 },
7111
7112 /* VEX_LEN_0FAE_R_2_M_0 */
7113 {
7114 { "vldmxcsr", { Md }, 0 },
7115 },
7116
7117 /* VEX_LEN_0FAE_R_3_M_0 */
7118 {
7119 { "vstmxcsr", { Md }, 0 },
7120 },
7121
7122 /* VEX_LEN_0FC4 */
7123 {
7124 { "%XEvpinsrw", { XM, Vex, Edw, Ib }, PREFIX_DATA },
7125 },
7126
7127 /* VEX_LEN_0FC5 */
7128 {
7129 { "%XEvpextrw", { Gd, XS, Ib }, PREFIX_DATA },
7130 },
7131
7132 /* VEX_LEN_0FD6 */
7133 {
7134 { "%XEvmovq", { EXqS, XMScalar }, PREFIX_DATA },
7135 },
7136
7137 /* VEX_LEN_0FF7 */
7138 {
7139 { "vmaskmovdqu", { XM, XS }, PREFIX_DATA },
7140 },
7141
7142 /* VEX_LEN_0F3816 */
7143 {
7144 { Bad_Opcode },
7145 { VEX_W_TABLE (VEX_W_0F3816_L_1) },
7146 },
7147
7148 /* VEX_LEN_0F3819 */
7149 {
7150 { Bad_Opcode },
7151 { VEX_W_TABLE (VEX_W_0F3819_L_1) },
7152 },
7153
7154 /* VEX_LEN_0F381A_M_0 */
7155 {
7156 { Bad_Opcode },
7157 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1) },
7158 },
7159
7160 /* VEX_LEN_0F3836 */
7161 {
7162 { Bad_Opcode },
7163 { VEX_W_TABLE (VEX_W_0F3836) },
7164 },
7165
7166 /* VEX_LEN_0F3841 */
7167 {
7168 { "vphminposuw", { XM, EXx }, PREFIX_DATA },
7169 },
7170
7171 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
7172 {
7173 { "ldtilecfg", { M }, 0 },
7174 },
7175
7176 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
7177 {
7178 { "tilerelease", { Skip_MODRM }, 0 },
7179 },
7180
7181 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
7182 {
7183 { "sttilecfg", { M }, 0 },
7184 },
7185
7186 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
7187 {
7188 { "tilezero", { TMM, Skip_MODRM }, 0 },
7189 },
7190
7191 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
7192 {
7193 { "tilestored", { MVexSIBMEM, TMM }, 0 },
7194 },
7195 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
7196 {
7197 { "tileloaddt1", { TMM, MVexSIBMEM }, 0 },
7198 },
7199
7200 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
7201 {
7202 { "tileloadd", { TMM, MVexSIBMEM }, 0 },
7203 },
7204
7205 /* VEX_LEN_0F385A_M_0 */
7206 {
7207 { Bad_Opcode },
7208 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0) },
7209 },
7210
7211 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
7212 {
7213 { "tdpbf16ps", { TMM, EXtmm, VexTmm }, 0 },
7214 },
7215
7216 /* VEX_LEN_0F385C_X86_64_P_3_W_0_M_0 */
7217 {
7218 { "tdpfp16ps", { TMM, EXtmm, VexTmm }, 0 },
7219 },
7220
7221 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
7222 {
7223 { "tdpbuud", {TMM, EXtmm, VexTmm }, 0 },
7224 },
7225
7226 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
7227 {
7228 { "tdpbsud", {TMM, EXtmm, VexTmm }, 0 },
7229 },
7230
7231 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
7232 {
7233 { "tdpbusd", {TMM, EXtmm, VexTmm }, 0 },
7234 },
7235
7236 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
7237 {
7238 { "tdpbssd", {TMM, EXtmm, VexTmm }, 0 },
7239 },
7240
7241 /* VEX_LEN_0F386C_X86_64_W_0_M_1 */
7242 {
7243 { PREFIX_TABLE (PREFIX_VEX_0F386C_X86_64_W_0_M_1_L_0) },
7244 },
7245
7246 /* VEX_LEN_0F38DB */
7247 {
7248 { "vaesimc", { XM, EXx }, PREFIX_DATA },
7249 },
7250
7251 /* VEX_LEN_0F38F2 */
7252 {
7253 { "andnS", { Gdq, VexGdq, Edq }, PREFIX_OPCODE },
7254 },
7255
7256 /* VEX_LEN_0F38F3 */
7257 {
7258 { REG_TABLE(REG_VEX_0F38F3_L_0) },
7259 },
7260
7261 /* VEX_LEN_0F38F5 */
7262 {
7263 { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0) },
7264 },
7265
7266 /* VEX_LEN_0F38F6 */
7267 {
7268 { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0) },
7269 },
7270
7271 /* VEX_LEN_0F38F7 */
7272 {
7273 { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0) },
7274 },
7275
7276 /* VEX_LEN_0F3A00 */
7277 {
7278 { Bad_Opcode },
7279 { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
7280 },
7281
7282 /* VEX_LEN_0F3A01 */
7283 {
7284 { Bad_Opcode },
7285 { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
7286 },
7287
7288 /* VEX_LEN_0F3A06 */
7289 {
7290 { Bad_Opcode },
7291 { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
7292 },
7293
7294 /* VEX_LEN_0F3A14 */
7295 {
7296 { "%XEvpextrb", { Edb, XM, Ib }, PREFIX_DATA },
7297 },
7298
7299 /* VEX_LEN_0F3A15 */
7300 {
7301 { "%XEvpextrw", { Edw, XM, Ib }, PREFIX_DATA },
7302 },
7303
7304 /* VEX_LEN_0F3A16 */
7305 {
7306 { "%XEvpextrK", { Edq, XM, Ib }, PREFIX_DATA },
7307 },
7308
7309 /* VEX_LEN_0F3A17 */
7310 {
7311 { "%XEvextractps", { Ed, XM, Ib }, PREFIX_DATA },
7312 },
7313
7314 /* VEX_LEN_0F3A18 */
7315 {
7316 { Bad_Opcode },
7317 { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
7318 },
7319
7320 /* VEX_LEN_0F3A19 */
7321 {
7322 { Bad_Opcode },
7323 { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
7324 },
7325
7326 /* VEX_LEN_0F3A20 */
7327 {
7328 { "%XEvpinsrb", { XM, Vex, Edb, Ib }, PREFIX_DATA },
7329 },
7330
7331 /* VEX_LEN_0F3A21 */
7332 {
7333 { "%XEvinsertps", { XM, Vex, EXd, Ib }, PREFIX_DATA },
7334 },
7335
7336 /* VEX_LEN_0F3A22 */
7337 {
7338 { "%XEvpinsrK", { XM, Vex, Edq, Ib }, PREFIX_DATA },
7339 },
7340
7341 /* VEX_LEN_0F3A30 */
7342 {
7343 { MOD_TABLE (MOD_VEX_0F3A30_L_0) },
7344 },
7345
7346 /* VEX_LEN_0F3A31 */
7347 {
7348 { MOD_TABLE (MOD_VEX_0F3A31_L_0) },
7349 },
7350
7351 /* VEX_LEN_0F3A32 */
7352 {
7353 { MOD_TABLE (MOD_VEX_0F3A32_L_0) },
7354 },
7355
7356 /* VEX_LEN_0F3A33 */
7357 {
7358 { MOD_TABLE (MOD_VEX_0F3A33_L_0) },
7359 },
7360
7361 /* VEX_LEN_0F3A38 */
7362 {
7363 { Bad_Opcode },
7364 { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
7365 },
7366
7367 /* VEX_LEN_0F3A39 */
7368 {
7369 { Bad_Opcode },
7370 { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
7371 },
7372
7373 /* VEX_LEN_0F3A41 */
7374 {
7375 { "vdppd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7376 },
7377
7378 /* VEX_LEN_0F3A46 */
7379 {
7380 { Bad_Opcode },
7381 { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
7382 },
7383
7384 /* VEX_LEN_0F3A60 */
7385 {
7386 { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7387 },
7388
7389 /* VEX_LEN_0F3A61 */
7390 {
7391 { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7392 },
7393
7394 /* VEX_LEN_0F3A62 */
7395 {
7396 { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
7397 },
7398
7399 /* VEX_LEN_0F3A63 */
7400 {
7401 { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
7402 },
7403
7404 /* VEX_LEN_0F3ADF */
7405 {
7406 { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
7407 },
7408
7409 /* VEX_LEN_0F3AF0 */
7410 {
7411 { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) },
7412 },
7413
7414 /* VEX_LEN_0FXOP_08_85 */
7415 {
7416 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0) },
7417 },
7418
7419 /* VEX_LEN_0FXOP_08_86 */
7420 {
7421 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0) },
7422 },
7423
7424 /* VEX_LEN_0FXOP_08_87 */
7425 {
7426 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0) },
7427 },
7428
7429 /* VEX_LEN_0FXOP_08_8E */
7430 {
7431 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0) },
7432 },
7433
7434 /* VEX_LEN_0FXOP_08_8F */
7435 {
7436 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0) },
7437 },
7438
7439 /* VEX_LEN_0FXOP_08_95 */
7440 {
7441 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0) },
7442 },
7443
7444 /* VEX_LEN_0FXOP_08_96 */
7445 {
7446 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0) },
7447 },
7448
7449 /* VEX_LEN_0FXOP_08_97 */
7450 {
7451 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0) },
7452 },
7453
7454 /* VEX_LEN_0FXOP_08_9E */
7455 {
7456 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0) },
7457 },
7458
7459 /* VEX_LEN_0FXOP_08_9F */
7460 {
7461 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0) },
7462 },
7463
7464 /* VEX_LEN_0FXOP_08_A3 */
7465 {
7466 { "vpperm", { XM, Vex, EXx, XMVexI4 }, 0 },
7467 },
7468
7469 /* VEX_LEN_0FXOP_08_A6 */
7470 {
7471 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0) },
7472 },
7473
7474 /* VEX_LEN_0FXOP_08_B6 */
7475 {
7476 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0) },
7477 },
7478
7479 /* VEX_LEN_0FXOP_08_C0 */
7480 {
7481 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0) },
7482 },
7483
7484 /* VEX_LEN_0FXOP_08_C1 */
7485 {
7486 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0) },
7487 },
7488
7489 /* VEX_LEN_0FXOP_08_C2 */
7490 {
7491 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0) },
7492 },
7493
7494 /* VEX_LEN_0FXOP_08_C3 */
7495 {
7496 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0) },
7497 },
7498
7499 /* VEX_LEN_0FXOP_08_CC */
7500 {
7501 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0) },
7502 },
7503
7504 /* VEX_LEN_0FXOP_08_CD */
7505 {
7506 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0) },
7507 },
7508
7509 /* VEX_LEN_0FXOP_08_CE */
7510 {
7511 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0) },
7512 },
7513
7514 /* VEX_LEN_0FXOP_08_CF */
7515 {
7516 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0) },
7517 },
7518
7519 /* VEX_LEN_0FXOP_08_EC */
7520 {
7521 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0) },
7522 },
7523
7524 /* VEX_LEN_0FXOP_08_ED */
7525 {
7526 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0) },
7527 },
7528
7529 /* VEX_LEN_0FXOP_08_EE */
7530 {
7531 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0) },
7532 },
7533
7534 /* VEX_LEN_0FXOP_08_EF */
7535 {
7536 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0) },
7537 },
7538
7539 /* VEX_LEN_0FXOP_09_01 */
7540 {
7541 { REG_TABLE (REG_XOP_09_01_L_0) },
7542 },
7543
7544 /* VEX_LEN_0FXOP_09_02 */
7545 {
7546 { REG_TABLE (REG_XOP_09_02_L_0) },
7547 },
7548
7549 /* VEX_LEN_0FXOP_09_12_M_1 */
7550 {
7551 { REG_TABLE (REG_XOP_09_12_M_1_L_0) },
7552 },
7553
7554 /* VEX_LEN_0FXOP_09_82_W_0 */
7555 {
7556 { "vfrczss", { XM, EXd }, 0 },
7557 },
7558
7559 /* VEX_LEN_0FXOP_09_83_W_0 */
7560 {
7561 { "vfrczsd", { XM, EXq }, 0 },
7562 },
7563
7564 /* VEX_LEN_0FXOP_09_90 */
7565 {
7566 { "vprotb", { XM, EXx, VexW }, 0 },
7567 },
7568
7569 /* VEX_LEN_0FXOP_09_91 */
7570 {
7571 { "vprotw", { XM, EXx, VexW }, 0 },
7572 },
7573
7574 /* VEX_LEN_0FXOP_09_92 */
7575 {
7576 { "vprotd", { XM, EXx, VexW }, 0 },
7577 },
7578
7579 /* VEX_LEN_0FXOP_09_93 */
7580 {
7581 { "vprotq", { XM, EXx, VexW }, 0 },
7582 },
7583
7584 /* VEX_LEN_0FXOP_09_94 */
7585 {
7586 { "vpshlb", { XM, EXx, VexW }, 0 },
7587 },
7588
7589 /* VEX_LEN_0FXOP_09_95 */
7590 {
7591 { "vpshlw", { XM, EXx, VexW }, 0 },
7592 },
7593
7594 /* VEX_LEN_0FXOP_09_96 */
7595 {
7596 { "vpshld", { XM, EXx, VexW }, 0 },
7597 },
7598
7599 /* VEX_LEN_0FXOP_09_97 */
7600 {
7601 { "vpshlq", { XM, EXx, VexW }, 0 },
7602 },
7603
7604 /* VEX_LEN_0FXOP_09_98 */
7605 {
7606 { "vpshab", { XM, EXx, VexW }, 0 },
7607 },
7608
7609 /* VEX_LEN_0FXOP_09_99 */
7610 {
7611 { "vpshaw", { XM, EXx, VexW }, 0 },
7612 },
7613
7614 /* VEX_LEN_0FXOP_09_9A */
7615 {
7616 { "vpshad", { XM, EXx, VexW }, 0 },
7617 },
7618
7619 /* VEX_LEN_0FXOP_09_9B */
7620 {
7621 { "vpshaq", { XM, EXx, VexW }, 0 },
7622 },
7623
7624 /* VEX_LEN_0FXOP_09_C1 */
7625 {
7626 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0) },
7627 },
7628
7629 /* VEX_LEN_0FXOP_09_C2 */
7630 {
7631 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0) },
7632 },
7633
7634 /* VEX_LEN_0FXOP_09_C3 */
7635 {
7636 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0) },
7637 },
7638
7639 /* VEX_LEN_0FXOP_09_C6 */
7640 {
7641 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0) },
7642 },
7643
7644 /* VEX_LEN_0FXOP_09_C7 */
7645 {
7646 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0) },
7647 },
7648
7649 /* VEX_LEN_0FXOP_09_CB */
7650 {
7651 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0) },
7652 },
7653
7654 /* VEX_LEN_0FXOP_09_D1 */
7655 {
7656 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0) },
7657 },
7658
7659 /* VEX_LEN_0FXOP_09_D2 */
7660 {
7661 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0) },
7662 },
7663
7664 /* VEX_LEN_0FXOP_09_D3 */
7665 {
7666 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0) },
7667 },
7668
7669 /* VEX_LEN_0FXOP_09_D6 */
7670 {
7671 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0) },
7672 },
7673
7674 /* VEX_LEN_0FXOP_09_D7 */
7675 {
7676 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0) },
7677 },
7678
7679 /* VEX_LEN_0FXOP_09_DB */
7680 {
7681 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0) },
7682 },
7683
7684 /* VEX_LEN_0FXOP_09_E1 */
7685 {
7686 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0) },
7687 },
7688
7689 /* VEX_LEN_0FXOP_09_E2 */
7690 {
7691 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0) },
7692 },
7693
7694 /* VEX_LEN_0FXOP_09_E3 */
7695 {
7696 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0) },
7697 },
7698
7699 /* VEX_LEN_0FXOP_0A_12 */
7700 {
7701 { REG_TABLE (REG_XOP_0A_12_L_0) },
7702 },
7703 };
7704
7705 #include "i386-dis-evex-len.h"
7706
7707 static const struct dis386 vex_w_table[][2] = {
7708 {
7709 /* VEX_W_0F41_L_1_M_1 */
7710 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_0) },
7711 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_1) },
7712 },
7713 {
7714 /* VEX_W_0F42_L_1_M_1 */
7715 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_0) },
7716 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_1) },
7717 },
7718 {
7719 /* VEX_W_0F44_L_0_M_1 */
7720 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_0) },
7721 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_1) },
7722 },
7723 {
7724 /* VEX_W_0F45_L_1_M_1 */
7725 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_0) },
7726 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_1) },
7727 },
7728 {
7729 /* VEX_W_0F46_L_1_M_1 */
7730 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_0) },
7731 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_1) },
7732 },
7733 {
7734 /* VEX_W_0F47_L_1_M_1 */
7735 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_0) },
7736 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_1) },
7737 },
7738 {
7739 /* VEX_W_0F4A_L_1_M_1 */
7740 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_0) },
7741 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_1) },
7742 },
7743 {
7744 /* VEX_W_0F4B_L_1_M_1 */
7745 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_0) },
7746 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_1) },
7747 },
7748 {
7749 /* VEX_W_0F90_L_0 */
7750 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0) },
7751 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1) },
7752 },
7753 {
7754 /* VEX_W_0F91_L_0_M_0 */
7755 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_0) },
7756 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_1) },
7757 },
7758 {
7759 /* VEX_W_0F92_L_0_M_1 */
7760 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_0) },
7761 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_1) },
7762 },
7763 {
7764 /* VEX_W_0F93_L_0_M_1 */
7765 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_0) },
7766 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_1) },
7767 },
7768 {
7769 /* VEX_W_0F98_L_0_M_1 */
7770 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_0) },
7771 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_1) },
7772 },
7773 {
7774 /* VEX_W_0F99_L_0_M_1 */
7775 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_0) },
7776 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_1) },
7777 },
7778 {
7779 /* VEX_W_0F380C */
7780 { "%XEvpermilps", { XM, Vex, EXx }, PREFIX_DATA },
7781 },
7782 {
7783 /* VEX_W_0F380D */
7784 { "vpermilpd", { XM, Vex, EXx }, PREFIX_DATA },
7785 },
7786 {
7787 /* VEX_W_0F380E */
7788 { "vtestps", { XM, EXx }, PREFIX_DATA },
7789 },
7790 {
7791 /* VEX_W_0F380F */
7792 { "vtestpd", { XM, EXx }, PREFIX_DATA },
7793 },
7794 {
7795 /* VEX_W_0F3813 */
7796 { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
7797 },
7798 {
7799 /* VEX_W_0F3816_L_1 */
7800 { "vpermps", { XM, Vex, EXx }, PREFIX_DATA },
7801 },
7802 {
7803 /* VEX_W_0F3818 */
7804 { "%XEvbroadcastss", { XM, EXd }, PREFIX_DATA },
7805 },
7806 {
7807 /* VEX_W_0F3819_L_1 */
7808 { "vbroadcastsd", { XM, EXq }, PREFIX_DATA },
7809 },
7810 {
7811 /* VEX_W_0F381A_M_0_L_1 */
7812 { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
7813 },
7814 {
7815 /* VEX_W_0F382C_M_0 */
7816 { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
7817 },
7818 {
7819 /* VEX_W_0F382D_M_0 */
7820 { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
7821 },
7822 {
7823 /* VEX_W_0F382E_M_0 */
7824 { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
7825 },
7826 {
7827 /* VEX_W_0F382F_M_0 */
7828 { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
7829 },
7830 {
7831 /* VEX_W_0F3836 */
7832 { "vpermd", { XM, Vex, EXx }, PREFIX_DATA },
7833 },
7834 {
7835 /* VEX_W_0F3846 */
7836 { "vpsravd", { XM, Vex, EXx }, PREFIX_DATA },
7837 },
7838 {
7839 /* VEX_W_0F3849_X86_64_P_0 */
7840 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0) },
7841 },
7842 {
7843 /* VEX_W_0F3849_X86_64_P_2 */
7844 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0) },
7845 },
7846 {
7847 /* VEX_W_0F3849_X86_64_P_3 */
7848 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0) },
7849 },
7850 {
7851 /* VEX_W_0F384B_X86_64_P_1 */
7852 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0) },
7853 },
7854 {
7855 /* VEX_W_0F384B_X86_64_P_2 */
7856 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0) },
7857 },
7858 {
7859 /* VEX_W_0F384B_X86_64_P_3 */
7860 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0) },
7861 },
7862 {
7863 /* VEX_W_0F3850 */
7864 { PREFIX_TABLE (PREFIX_VEX_0F3850_W_0) },
7865 },
7866 {
7867 /* VEX_W_0F3851 */
7868 { PREFIX_TABLE (PREFIX_VEX_0F3851_W_0) },
7869 },
7870 {
7871 /* VEX_W_0F3852 */
7872 { "%XVvpdpwssd", { XM, Vex, EXx }, PREFIX_DATA },
7873 },
7874 {
7875 /* VEX_W_0F3853 */
7876 { "%XVvpdpwssds", { XM, Vex, EXx }, PREFIX_DATA },
7877 },
7878 {
7879 /* VEX_W_0F3858 */
7880 { "%XEvpbroadcastd", { XM, EXd }, PREFIX_DATA },
7881 },
7882 {
7883 /* VEX_W_0F3859 */
7884 { "vpbroadcastq", { XM, EXq }, PREFIX_DATA },
7885 },
7886 {
7887 /* VEX_W_0F385A_M_0_L_0 */
7888 { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
7889 },
7890 {
7891 /* VEX_W_0F385C_X86_64_P_1 */
7892 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0) },
7893 },
7894 {
7895 /* VEX_W_0F385C_X86_64_P_3 */
7896 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_3_W_0) },
7897 },
7898 {
7899 /* VEX_W_0F385E_X86_64_P_0 */
7900 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0) },
7901 },
7902 {
7903 /* VEX_W_0F385E_X86_64_P_1 */
7904 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0) },
7905 },
7906 {
7907 /* VEX_W_0F385E_X86_64_P_2 */
7908 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0) },
7909 },
7910 {
7911 /* VEX_W_0F385E_X86_64_P_3 */
7912 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0) },
7913 },
7914 {
7915 /* VEX_W_0F386C_X86_64 */
7916 { MOD_TABLE (MOD_VEX_0F386C_X86_64_W_0) },
7917 },
7918 {
7919 /* VEX_W_0F3872_P_1 */
7920 { "%XVvcvtneps2bf16%XY", { XMM, EXx }, 0 },
7921 },
7922 {
7923 /* VEX_W_0F3878 */
7924 { "%XEvpbroadcastb", { XM, EXb }, PREFIX_DATA },
7925 },
7926 {
7927 /* VEX_W_0F3879 */
7928 { "%XEvpbroadcastw", { XM, EXw }, PREFIX_DATA },
7929 },
7930 {
7931 /* VEX_W_0F38B0 */
7932 { PREFIX_TABLE (PREFIX_VEX_0F38B0_W_0) },
7933 },
7934 {
7935 /* VEX_W_0F38B1 */
7936 { PREFIX_TABLE (PREFIX_VEX_0F38B1_W_0) },
7937 },
7938 {
7939 /* VEX_W_0F38B4 */
7940 { Bad_Opcode },
7941 { "%XVvpmadd52luq", { XM, Vex, EXx }, PREFIX_DATA },
7942 },
7943 {
7944 /* VEX_W_0F38B5 */
7945 { Bad_Opcode },
7946 { "%XVvpmadd52huq", { XM, Vex, EXx }, PREFIX_DATA },
7947 },
7948 {
7949 /* VEX_W_0F38CF */
7950 { "%XEvgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
7951 },
7952 {
7953 /* VEX_W_0F3A00_L_1 */
7954 { Bad_Opcode },
7955 { "%XEvpermq", { XM, EXx, Ib }, PREFIX_DATA },
7956 },
7957 {
7958 /* VEX_W_0F3A01_L_1 */
7959 { Bad_Opcode },
7960 { "%XEvpermpd", { XM, EXx, Ib }, PREFIX_DATA },
7961 },
7962 {
7963 /* VEX_W_0F3A02 */
7964 { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7965 },
7966 {
7967 /* VEX_W_0F3A04 */
7968 { "%XEvpermilps", { XM, EXx, Ib }, PREFIX_DATA },
7969 },
7970 {
7971 /* VEX_W_0F3A05 */
7972 { "vpermilpd", { XM, EXx, Ib }, PREFIX_DATA },
7973 },
7974 {
7975 /* VEX_W_0F3A06_L_1 */
7976 { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7977 },
7978 {
7979 /* VEX_W_0F3A18_L_1 */
7980 { "vinsertf128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
7981 },
7982 {
7983 /* VEX_W_0F3A19_L_1 */
7984 { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
7985 },
7986 {
7987 /* VEX_W_0F3A1D */
7988 { "%XEvcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
7989 },
7990 {
7991 /* VEX_W_0F3A38_L_1 */
7992 { "vinserti128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
7993 },
7994 {
7995 /* VEX_W_0F3A39_L_1 */
7996 { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
7997 },
7998 {
7999 /* VEX_W_0F3A46_L_1 */
8000 { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8001 },
8002 {
8003 /* VEX_W_0F3A4A */
8004 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8005 },
8006 {
8007 /* VEX_W_0F3A4B */
8008 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8009 },
8010 {
8011 /* VEX_W_0F3A4C */
8012 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
8013 },
8014 {
8015 /* VEX_W_0F3ACE */
8016 { Bad_Opcode },
8017 { "%XEvgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8018 },
8019 {
8020 /* VEX_W_0F3ACF */
8021 { Bad_Opcode },
8022 { "%XEvgf2p8affineinvqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
8023 },
8024 /* VEX_W_0FXOP_08_85_L_0 */
8025 {
8026 { "vpmacssww", { XM, Vex, EXx, XMVexI4 }, 0 },
8027 },
8028 /* VEX_W_0FXOP_08_86_L_0 */
8029 {
8030 { "vpmacsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
8031 },
8032 /* VEX_W_0FXOP_08_87_L_0 */
8033 {
8034 { "vpmacssdql", { XM, Vex, EXx, XMVexI4 }, 0 },
8035 },
8036 /* VEX_W_0FXOP_08_8E_L_0 */
8037 {
8038 { "vpmacssdd", { XM, Vex, EXx, XMVexI4 }, 0 },
8039 },
8040 /* VEX_W_0FXOP_08_8F_L_0 */
8041 {
8042 { "vpmacssdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
8043 },
8044 /* VEX_W_0FXOP_08_95_L_0 */
8045 {
8046 { "vpmacsww", { XM, Vex, EXx, XMVexI4 }, 0 },
8047 },
8048 /* VEX_W_0FXOP_08_96_L_0 */
8049 {
8050 { "vpmacswd", { XM, Vex, EXx, XMVexI4 }, 0 },
8051 },
8052 /* VEX_W_0FXOP_08_97_L_0 */
8053 {
8054 { "vpmacsdql", { XM, Vex, EXx, XMVexI4 }, 0 },
8055 },
8056 /* VEX_W_0FXOP_08_9E_L_0 */
8057 {
8058 { "vpmacsdd", { XM, Vex, EXx, XMVexI4 }, 0 },
8059 },
8060 /* VEX_W_0FXOP_08_9F_L_0 */
8061 {
8062 { "vpmacsdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
8063 },
8064 /* VEX_W_0FXOP_08_A6_L_0 */
8065 {
8066 { "vpmadcsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
8067 },
8068 /* VEX_W_0FXOP_08_B6_L_0 */
8069 {
8070 { "vpmadcswd", { XM, Vex, EXx, XMVexI4 }, 0 },
8071 },
8072 /* VEX_W_0FXOP_08_C0_L_0 */
8073 {
8074 { "vprotb", { XM, EXx, Ib }, 0 },
8075 },
8076 /* VEX_W_0FXOP_08_C1_L_0 */
8077 {
8078 { "vprotw", { XM, EXx, Ib }, 0 },
8079 },
8080 /* VEX_W_0FXOP_08_C2_L_0 */
8081 {
8082 { "vprotd", { XM, EXx, Ib }, 0 },
8083 },
8084 /* VEX_W_0FXOP_08_C3_L_0 */
8085 {
8086 { "vprotq", { XM, EXx, Ib }, 0 },
8087 },
8088 /* VEX_W_0FXOP_08_CC_L_0 */
8089 {
8090 { "vpcomb", { XM, Vex, EXx, VPCOM }, 0 },
8091 },
8092 /* VEX_W_0FXOP_08_CD_L_0 */
8093 {
8094 { "vpcomw", { XM, Vex, EXx, VPCOM }, 0 },
8095 },
8096 /* VEX_W_0FXOP_08_CE_L_0 */
8097 {
8098 { "vpcomd", { XM, Vex, EXx, VPCOM }, 0 },
8099 },
8100 /* VEX_W_0FXOP_08_CF_L_0 */
8101 {
8102 { "vpcomq", { XM, Vex, EXx, VPCOM }, 0 },
8103 },
8104 /* VEX_W_0FXOP_08_EC_L_0 */
8105 {
8106 { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
8107 },
8108 /* VEX_W_0FXOP_08_ED_L_0 */
8109 {
8110 { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
8111 },
8112 /* VEX_W_0FXOP_08_EE_L_0 */
8113 {
8114 { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
8115 },
8116 /* VEX_W_0FXOP_08_EF_L_0 */
8117 {
8118 { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
8119 },
8120 /* VEX_W_0FXOP_09_80 */
8121 {
8122 { "vfrczps", { XM, EXx }, 0 },
8123 },
8124 /* VEX_W_0FXOP_09_81 */
8125 {
8126 { "vfrczpd", { XM, EXx }, 0 },
8127 },
8128 /* VEX_W_0FXOP_09_82 */
8129 {
8130 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0) },
8131 },
8132 /* VEX_W_0FXOP_09_83 */
8133 {
8134 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0) },
8135 },
8136 /* VEX_W_0FXOP_09_C1_L_0 */
8137 {
8138 { "vphaddbw", { XM, EXxmm }, 0 },
8139 },
8140 /* VEX_W_0FXOP_09_C2_L_0 */
8141 {
8142 { "vphaddbd", { XM, EXxmm }, 0 },
8143 },
8144 /* VEX_W_0FXOP_09_C3_L_0 */
8145 {
8146 { "vphaddbq", { XM, EXxmm }, 0 },
8147 },
8148 /* VEX_W_0FXOP_09_C6_L_0 */
8149 {
8150 { "vphaddwd", { XM, EXxmm }, 0 },
8151 },
8152 /* VEX_W_0FXOP_09_C7_L_0 */
8153 {
8154 { "vphaddwq", { XM, EXxmm }, 0 },
8155 },
8156 /* VEX_W_0FXOP_09_CB_L_0 */
8157 {
8158 { "vphadddq", { XM, EXxmm }, 0 },
8159 },
8160 /* VEX_W_0FXOP_09_D1_L_0 */
8161 {
8162 { "vphaddubw", { XM, EXxmm }, 0 },
8163 },
8164 /* VEX_W_0FXOP_09_D2_L_0 */
8165 {
8166 { "vphaddubd", { XM, EXxmm }, 0 },
8167 },
8168 /* VEX_W_0FXOP_09_D3_L_0 */
8169 {
8170 { "vphaddubq", { XM, EXxmm }, 0 },
8171 },
8172 /* VEX_W_0FXOP_09_D6_L_0 */
8173 {
8174 { "vphadduwd", { XM, EXxmm }, 0 },
8175 },
8176 /* VEX_W_0FXOP_09_D7_L_0 */
8177 {
8178 { "vphadduwq", { XM, EXxmm }, 0 },
8179 },
8180 /* VEX_W_0FXOP_09_DB_L_0 */
8181 {
8182 { "vphaddudq", { XM, EXxmm }, 0 },
8183 },
8184 /* VEX_W_0FXOP_09_E1_L_0 */
8185 {
8186 { "vphsubbw", { XM, EXxmm }, 0 },
8187 },
8188 /* VEX_W_0FXOP_09_E2_L_0 */
8189 {
8190 { "vphsubwd", { XM, EXxmm }, 0 },
8191 },
8192 /* VEX_W_0FXOP_09_E3_L_0 */
8193 {
8194 { "vphsubdq", { XM, EXxmm }, 0 },
8195 },
8196
8197 #include "i386-dis-evex-w.h"
8198 };
8199
8200 static const struct dis386 mod_table[][2] = {
8201 {
8202 /* MOD_62_32BIT */
8203 { "bound{S|}", { Gv, Ma }, 0 },
8204 { EVEX_TABLE (EVEX_0F) },
8205 },
8206 {
8207 /* MOD_8D */
8208 { "leaS", { Gv, M }, 0 },
8209 },
8210 {
8211 /* MOD_C4_32BIT */
8212 { "lesS", { Gv, Mp }, 0 },
8213 { VEX_C4_TABLE (VEX_0F) },
8214 },
8215 {
8216 /* MOD_C5_32BIT */
8217 { "ldsS", { Gv, Mp }, 0 },
8218 { VEX_C5_TABLE (VEX_0F) },
8219 },
8220 {
8221 /* MOD_C6_REG_7 */
8222 { Bad_Opcode },
8223 { RM_TABLE (RM_C6_REG_7) },
8224 },
8225 {
8226 /* MOD_C7_REG_7 */
8227 { Bad_Opcode },
8228 { RM_TABLE (RM_C7_REG_7) },
8229 },
8230 {
8231 /* MOD_FF_REG_3 */
8232 { "{l|}call^", { indirEp }, 0 },
8233 },
8234 {
8235 /* MOD_FF_REG_5 */
8236 { "{l|}jmp^", { indirEp }, 0 },
8237 },
8238 {
8239 /* MOD_0F01_REG_0 */
8240 { X86_64_TABLE (X86_64_0F01_REG_0) },
8241 { RM_TABLE (RM_0F01_REG_0) },
8242 },
8243 {
8244 /* MOD_0F01_REG_1 */
8245 { X86_64_TABLE (X86_64_0F01_REG_1) },
8246 { RM_TABLE (RM_0F01_REG_1) },
8247 },
8248 {
8249 /* MOD_0F01_REG_2 */
8250 { X86_64_TABLE (X86_64_0F01_REG_2) },
8251 { RM_TABLE (RM_0F01_REG_2) },
8252 },
8253 {
8254 /* MOD_0F01_REG_3 */
8255 { X86_64_TABLE (X86_64_0F01_REG_3) },
8256 { RM_TABLE (RM_0F01_REG_3) },
8257 },
8258 {
8259 /* MOD_0F01_REG_5 */
8260 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
8261 { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8262 },
8263 {
8264 /* MOD_0F01_REG_7 */
8265 { "invlpg", { Mb }, 0 },
8266 { RM_TABLE (RM_0F01_REG_7_MOD_3) },
8267 },
8268 {
8269 /* MOD_0F02 */
8270 { "larS", { Gv, Mw }, 0 },
8271 { "larS", { Gv, Ev }, 0 },
8272 },
8273 {
8274 /* MOD_0F03 */
8275 { "lslS", { Gv, Mw }, 0 },
8276 { "lslS", { Gv, Ev }, 0 },
8277 },
8278 {
8279 /* MOD_0F12_PREFIX_0 */
8280 { "movlpX", { XM, EXq }, 0 },
8281 { "movhlps", { XM, EXq }, 0 },
8282 },
8283 {
8284 /* MOD_0F12_PREFIX_2 */
8285 { "movlpX", { XM, EXq }, 0 },
8286 },
8287 {
8288 /* MOD_0F13 */
8289 { "movlpX", { EXq, XM }, PREFIX_OPCODE },
8290 },
8291 {
8292 /* MOD_0F16_PREFIX_0 */
8293 { "movhpX", { XM, EXq }, 0 },
8294 { "movlhps", { XM, EXq }, 0 },
8295 },
8296 {
8297 /* MOD_0F16_PREFIX_2 */
8298 { "movhpX", { XM, EXq }, 0 },
8299 },
8300 {
8301 /* MOD_0F17 */
8302 { "movhpX", { EXq, XM }, PREFIX_OPCODE },
8303 },
8304 {
8305 /* MOD_0F18_REG_0 */
8306 { "prefetchnta", { Mb }, 0 },
8307 { "nopQ", { Ev }, 0 },
8308 },
8309 {
8310 /* MOD_0F18_REG_1 */
8311 { "prefetcht0", { Mb }, 0 },
8312 { "nopQ", { Ev }, 0 },
8313 },
8314 {
8315 /* MOD_0F18_REG_2 */
8316 { "prefetcht1", { Mb }, 0 },
8317 { "nopQ", { Ev }, 0 },
8318 },
8319 {
8320 /* MOD_0F18_REG_3 */
8321 { "prefetcht2", { Mb }, 0 },
8322 { "nopQ", { Ev }, 0 },
8323 },
8324 {
8325 /* MOD_0F18_REG_6 */
8326 { X86_64_TABLE (X86_64_0F18_REG_6_MOD_0) },
8327 { "nopQ", { Ev }, 0 },
8328 },
8329 {
8330 /* MOD_0F18_REG_7 */
8331 { X86_64_TABLE (X86_64_0F18_REG_7_MOD_0) },
8332 { "nopQ", { Ev }, 0 },
8333 },
8334 {
8335 /* MOD_0F1A_PREFIX_0 */
8336 { "bndldx", { Gbnd, Mv_bnd }, 0 },
8337 { "nopQ", { Ev }, 0 },
8338 },
8339 {
8340 /* MOD_0F1B_PREFIX_0 */
8341 { "bndstx", { Mv_bnd, Gbnd }, 0 },
8342 { "nopQ", { Ev }, 0 },
8343 },
8344 {
8345 /* MOD_0F1B_PREFIX_1 */
8346 { "bndmk", { Gbnd, Mv_bnd }, 0 },
8347 { "nopQ", { Ev }, PREFIX_IGNORED },
8348 },
8349 {
8350 /* MOD_0F1C_PREFIX_0 */
8351 { REG_TABLE (REG_0F1C_P_0_MOD_0) },
8352 { "nopQ", { Ev }, 0 },
8353 },
8354 {
8355 /* MOD_0F1E_PREFIX_1 */
8356 { "nopQ", { Ev }, PREFIX_IGNORED },
8357 { REG_TABLE (REG_0F1E_P_1_MOD_3) },
8358 },
8359 {
8360 /* MOD_0F2B_PREFIX_0 */
8361 {"movntps", { Mx, XM }, PREFIX_OPCODE },
8362 },
8363 {
8364 /* MOD_0F2B_PREFIX_1 */
8365 {"movntss", { Md, XM }, PREFIX_OPCODE },
8366 },
8367 {
8368 /* MOD_0F2B_PREFIX_2 */
8369 {"movntpd", { Mx, XM }, PREFIX_OPCODE },
8370 },
8371 {
8372 /* MOD_0F2B_PREFIX_3 */
8373 {"movntsd", { Mq, XM }, PREFIX_OPCODE },
8374 },
8375 {
8376 /* MOD_0F50 */
8377 { Bad_Opcode },
8378 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
8379 },
8380 {
8381 /* MOD_0F71 */
8382 { Bad_Opcode },
8383 { REG_TABLE (REG_0F71_MOD_0) },
8384 },
8385 {
8386 /* MOD_0F72 */
8387 { Bad_Opcode },
8388 { REG_TABLE (REG_0F72_MOD_0) },
8389 },
8390 {
8391 /* MOD_0F73 */
8392 { Bad_Opcode },
8393 { REG_TABLE (REG_0F73_MOD_0) },
8394 },
8395 {
8396 /* MOD_0FAE_REG_0 */
8397 { "fxsave", { FXSAVE }, 0 },
8398 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
8399 },
8400 {
8401 /* MOD_0FAE_REG_1 */
8402 { "fxrstor", { FXSAVE }, 0 },
8403 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
8404 },
8405 {
8406 /* MOD_0FAE_REG_2 */
8407 { "ldmxcsr", { Md }, 0 },
8408 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
8409 },
8410 {
8411 /* MOD_0FAE_REG_3 */
8412 { "stmxcsr", { Md }, 0 },
8413 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
8414 },
8415 {
8416 /* MOD_0FAE_REG_4 */
8417 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8418 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
8419 },
8420 {
8421 /* MOD_0FAE_REG_5 */
8422 { "xrstor", { FXSAVE }, PREFIX_OPCODE },
8423 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
8424 },
8425 {
8426 /* MOD_0FAE_REG_6 */
8427 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8428 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
8429 },
8430 {
8431 /* MOD_0FAE_REG_7 */
8432 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8433 { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
8434 },
8435 {
8436 /* MOD_0FB2 */
8437 { "lssS", { Gv, Mp }, 0 },
8438 },
8439 {
8440 /* MOD_0FB4 */
8441 { "lfsS", { Gv, Mp }, 0 },
8442 },
8443 {
8444 /* MOD_0FB5 */
8445 { "lgsS", { Gv, Mp }, 0 },
8446 },
8447 {
8448 /* MOD_0FC3 */
8449 { "movntiS", { Edq, Gdq }, PREFIX_OPCODE },
8450 },
8451 {
8452 /* MOD_0FC7_REG_3 */
8453 { "xrstors", { FXSAVE }, 0 },
8454 },
8455 {
8456 /* MOD_0FC7_REG_4 */
8457 { "xsavec", { FXSAVE }, 0 },
8458 },
8459 {
8460 /* MOD_0FC7_REG_5 */
8461 { "xsaves", { FXSAVE }, 0 },
8462 },
8463 {
8464 /* MOD_0FC7_REG_6 */
8465 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8466 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
8467 },
8468 {
8469 /* MOD_0FC7_REG_7 */
8470 { "vmptrst", { Mq }, 0 },
8471 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
8472 },
8473 {
8474 /* MOD_0FD7 */
8475 { Bad_Opcode },
8476 { "pmovmskb", { Gdq, MS }, 0 },
8477 },
8478 {
8479 /* MOD_0FE7_PREFIX_2 */
8480 { "movntdq", { Mx, XM }, 0 },
8481 },
8482 {
8483 /* MOD_0FF0_PREFIX_3 */
8484 { "lddqu", { XM, M }, 0 },
8485 },
8486 {
8487 /* MOD_0F382A */
8488 { "movntdqa", { XM, Mx }, PREFIX_DATA },
8489 },
8490 {
8491 /* MOD_0F38DC_PREFIX_1 */
8492 { "aesenc128kl", { XM, M }, 0 },
8493 { "loadiwkey", { XM, EXx }, 0 },
8494 },
8495 {
8496 /* MOD_0F38DD_PREFIX_1 */
8497 { "aesdec128kl", { XM, M }, 0 },
8498 },
8499 {
8500 /* MOD_0F38DE_PREFIX_1 */
8501 { "aesenc256kl", { XM, M }, 0 },
8502 },
8503 {
8504 /* MOD_0F38DF_PREFIX_1 */
8505 { "aesdec256kl", { XM, M }, 0 },
8506 },
8507 {
8508 /* MOD_0F38F5 */
8509 { "wrussK", { M, Gdq }, PREFIX_DATA },
8510 },
8511 {
8512 /* MOD_0F38F6_PREFIX_0 */
8513 { "wrssK", { M, Gdq }, PREFIX_OPCODE },
8514 },
8515 {
8516 /* MOD_0F38F8_PREFIX_1 */
8517 { "enqcmds", { Gva, M }, PREFIX_OPCODE },
8518 },
8519 {
8520 /* MOD_0F38F8_PREFIX_2 */
8521 { "movdir64b", { Gva, M }, PREFIX_OPCODE },
8522 },
8523 {
8524 /* MOD_0F38F8_PREFIX_3 */
8525 { "enqcmd", { Gva, M }, PREFIX_OPCODE },
8526 },
8527 {
8528 /* MOD_0F38F9 */
8529 { "movdiri", { Edq, Gdq }, PREFIX_OPCODE },
8530 },
8531 {
8532 /* MOD_0F38FA_PREFIX_1 */
8533 { Bad_Opcode },
8534 { "encodekey128", { Gd, Ed }, 0 },
8535 },
8536 {
8537 /* MOD_0F38FB_PREFIX_1 */
8538 { Bad_Opcode },
8539 { "encodekey256", { Gd, Ed }, 0 },
8540 },
8541 {
8542 /* MOD_0F3A0F_PREFIX_1 */
8543 { Bad_Opcode },
8544 { REG_TABLE (REG_0F3A0F_PREFIX_1_MOD_3) },
8545 },
8546 {
8547 /* MOD_VEX_0F12_PREFIX_0 */
8548 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
8549 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
8550 },
8551 {
8552 /* MOD_VEX_0F12_PREFIX_2 */
8553 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0) },
8554 },
8555 {
8556 /* MOD_VEX_0F13 */
8557 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
8558 },
8559 {
8560 /* MOD_VEX_0F16_PREFIX_0 */
8561 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
8562 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
8563 },
8564 {
8565 /* MOD_VEX_0F16_PREFIX_2 */
8566 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0) },
8567 },
8568 {
8569 /* MOD_VEX_0F17 */
8570 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
8571 },
8572 {
8573 /* MOD_VEX_0F2B */
8574 { "%XEvmovntpX", { Mx, XM }, PREFIX_OPCODE },
8575 },
8576 {
8577 /* MOD_VEX_0F41_L_1 */
8578 { Bad_Opcode },
8579 { VEX_W_TABLE (VEX_W_0F41_L_1_M_1) },
8580 },
8581 {
8582 /* MOD_VEX_0F42_L_1 */
8583 { Bad_Opcode },
8584 { VEX_W_TABLE (VEX_W_0F42_L_1_M_1) },
8585 },
8586 {
8587 /* MOD_VEX_0F44_L_0 */
8588 { Bad_Opcode },
8589 { VEX_W_TABLE (VEX_W_0F44_L_0_M_1) },
8590 },
8591 {
8592 /* MOD_VEX_0F45_L_1 */
8593 { Bad_Opcode },
8594 { VEX_W_TABLE (VEX_W_0F45_L_1_M_1) },
8595 },
8596 {
8597 /* MOD_VEX_0F46_L_1 */
8598 { Bad_Opcode },
8599 { VEX_W_TABLE (VEX_W_0F46_L_1_M_1) },
8600 },
8601 {
8602 /* MOD_VEX_0F47_L_1 */
8603 { Bad_Opcode },
8604 { VEX_W_TABLE (VEX_W_0F47_L_1_M_1) },
8605 },
8606 {
8607 /* MOD_VEX_0F4A_L_1 */
8608 { Bad_Opcode },
8609 { VEX_W_TABLE (VEX_W_0F4A_L_1_M_1) },
8610 },
8611 {
8612 /* MOD_VEX_0F4B_L_1 */
8613 { Bad_Opcode },
8614 { VEX_W_TABLE (VEX_W_0F4B_L_1_M_1) },
8615 },
8616 {
8617 /* MOD_VEX_0F50 */
8618 { Bad_Opcode },
8619 { "vmovmskpX", { Gdq, XS }, PREFIX_OPCODE },
8620 },
8621 {
8622 /* MOD_VEX_0F71 */
8623 { Bad_Opcode },
8624 { REG_TABLE (REG_VEX_0F71_M_0) },
8625 },
8626 {
8627 /* MOD_VEX_0F72 */
8628 { Bad_Opcode },
8629 { REG_TABLE (REG_VEX_0F72_M_0) },
8630 },
8631 {
8632 /* MOD_VEX_0F73 */
8633 { Bad_Opcode },
8634 { REG_TABLE (REG_VEX_0F73_M_0) },
8635 },
8636 {
8637 /* MOD_VEX_0F91_L_0 */
8638 { VEX_W_TABLE (VEX_W_0F91_L_0_M_0) },
8639 },
8640 {
8641 /* MOD_VEX_0F92_L_0 */
8642 { Bad_Opcode },
8643 { VEX_W_TABLE (VEX_W_0F92_L_0_M_1) },
8644 },
8645 {
8646 /* MOD_VEX_0F93_L_0 */
8647 { Bad_Opcode },
8648 { VEX_W_TABLE (VEX_W_0F93_L_0_M_1) },
8649 },
8650 {
8651 /* MOD_VEX_0F98_L_0 */
8652 { Bad_Opcode },
8653 { VEX_W_TABLE (VEX_W_0F98_L_0_M_1) },
8654 },
8655 {
8656 /* MOD_VEX_0F99_L_0 */
8657 { Bad_Opcode },
8658 { VEX_W_TABLE (VEX_W_0F99_L_0_M_1) },
8659 },
8660 {
8661 /* MOD_VEX_0FAE_REG_2 */
8662 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
8663 },
8664 {
8665 /* MOD_VEX_0FAE_REG_3 */
8666 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
8667 },
8668 {
8669 /* MOD_VEX_0FD7 */
8670 { Bad_Opcode },
8671 { "vpmovmskb", { Gdq, XS }, PREFIX_DATA },
8672 },
8673 {
8674 /* MOD_VEX_0FE7 */
8675 { "vmovntdq", { Mx, XM }, PREFIX_DATA },
8676 },
8677 {
8678 /* MOD_VEX_0FF0_PREFIX_3 */
8679 { "vlddqu", { XM, M }, 0 },
8680 },
8681 {
8682 /* MOD_VEX_0F381A */
8683 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0) },
8684 },
8685 {
8686 /* MOD_VEX_0F382A */
8687 { "vmovntdqa", { XM, Mx }, PREFIX_DATA },
8688 },
8689 {
8690 /* MOD_VEX_0F382C */
8691 { VEX_W_TABLE (VEX_W_0F382C_M_0) },
8692 },
8693 {
8694 /* MOD_VEX_0F382D */
8695 { VEX_W_TABLE (VEX_W_0F382D_M_0) },
8696 },
8697 {
8698 /* MOD_VEX_0F382E */
8699 { VEX_W_TABLE (VEX_W_0F382E_M_0) },
8700 },
8701 {
8702 /* MOD_VEX_0F382F */
8703 { VEX_W_TABLE (VEX_W_0F382F_M_0) },
8704 },
8705 {
8706 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8707 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0) },
8708 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1) },
8709 },
8710 {
8711 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8712 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0) },
8713 },
8714 {
8715 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8716 { Bad_Opcode },
8717 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0) },
8718 },
8719 {
8720 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8721 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0) },
8722 },
8723 {
8724 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8725 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0) },
8726 },
8727 {
8728 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8729 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0) },
8730 },
8731 {
8732 /* MOD_VEX_0F385A */
8733 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0) },
8734 },
8735 {
8736 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8737 { Bad_Opcode },
8738 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0) },
8739 },
8740 {
8741 /* MOD_VEX_0F385C_X86_64_P_3_W_0 */
8742 { Bad_Opcode },
8743 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_3_W_0_M_0) },
8744 },
8745 {
8746 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8747 { Bad_Opcode },
8748 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0) },
8749 },
8750 {
8751 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8752 { Bad_Opcode },
8753 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0) },
8754 },
8755 {
8756 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8757 { Bad_Opcode },
8758 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0) },
8759 },
8760 {
8761 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8762 { Bad_Opcode },
8763 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0) },
8764 },
8765 {
8766 /* MOD_VEX_0F386C_X86_64_W_0 */
8767 { Bad_Opcode },
8768 { VEX_LEN_TABLE (VEX_LEN_0F386C_X86_64_W_0_M_1) },
8769 },
8770 {
8771 /* MOD_VEX_0F388C */
8772 { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
8773 },
8774 {
8775 /* MOD_VEX_0F388E */
8776 { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
8777 },
8778 {
8779 /* MOD_VEX_0F3A30_L_0 */
8780 { Bad_Opcode },
8781 { "kshiftr%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
8782 },
8783 {
8784 /* MOD_VEX_0F3A31_L_0 */
8785 { Bad_Opcode },
8786 { "kshiftr%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
8787 },
8788 {
8789 /* MOD_VEX_0F3A32_L_0 */
8790 { Bad_Opcode },
8791 { "kshiftl%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
8792 },
8793 {
8794 /* MOD_VEX_0F3A33_L_0 */
8795 { Bad_Opcode },
8796 { "kshiftl%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
8797 },
8798 {
8799 /* MOD_XOP_09_12 */
8800 { Bad_Opcode },
8801 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1) },
8802 },
8803
8804 #include "i386-dis-evex-mod.h"
8805 };
8806
8807 static const struct dis386 rm_table[][8] = {
8808 {
8809 /* RM_C6_REG_7 */
8810 { "xabort", { Skip_MODRM, Ib }, 0 },
8811 },
8812 {
8813 /* RM_C7_REG_7 */
8814 { "xbeginT", { Skip_MODRM, Jdqw }, 0 },
8815 },
8816 {
8817 /* RM_0F01_REG_0 */
8818 { "enclv", { Skip_MODRM }, 0 },
8819 { "vmcall", { Skip_MODRM }, 0 },
8820 { "vmlaunch", { Skip_MODRM }, 0 },
8821 { "vmresume", { Skip_MODRM }, 0 },
8822 { "vmxoff", { Skip_MODRM }, 0 },
8823 { "pconfig", { Skip_MODRM }, 0 },
8824 { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_6) },
8825 },
8826 {
8827 /* RM_0F01_REG_1 */
8828 { "monitor", { { OP_Monitor, 0 } }, 0 },
8829 { "mwait", { { OP_Mwait, 0 } }, 0 },
8830 { "clac", { Skip_MODRM }, 0 },
8831 { "stac", { Skip_MODRM }, 0 },
8832 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4) },
8833 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5) },
8834 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6) },
8835 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7) },
8836 },
8837 {
8838 /* RM_0F01_REG_2 */
8839 { "xgetbv", { Skip_MODRM }, 0 },
8840 { "xsetbv", { Skip_MODRM }, 0 },
8841 { Bad_Opcode },
8842 { Bad_Opcode },
8843 { "vmfunc", { Skip_MODRM }, 0 },
8844 { "xend", { Skip_MODRM }, 0 },
8845 { "xtest", { Skip_MODRM }, 0 },
8846 { "enclu", { Skip_MODRM }, 0 },
8847 },
8848 {
8849 /* RM_0F01_REG_3 */
8850 { "vmrun", { Skip_MODRM }, 0 },
8851 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
8852 { "vmload", { Skip_MODRM }, 0 },
8853 { "vmsave", { Skip_MODRM }, 0 },
8854 { "stgi", { Skip_MODRM }, 0 },
8855 { "clgi", { Skip_MODRM }, 0 },
8856 { "skinit", { Skip_MODRM }, 0 },
8857 { "invlpga", { Skip_MODRM }, 0 },
8858 },
8859 {
8860 /* RM_0F01_REG_5_MOD_3 */
8861 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
8862 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
8863 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8864 { Bad_Opcode },
8865 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4) },
8866 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5) },
8867 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6) },
8868 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7) },
8869 },
8870 {
8871 /* RM_0F01_REG_7_MOD_3 */
8872 { "swapgs", { Skip_MODRM }, 0 },
8873 { "rdtscp", { Skip_MODRM }, 0 },
8874 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
8875 { "mwaitx", { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
8876 { "clzero", { Skip_MODRM }, 0 },
8877 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_5) },
8878 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6) },
8879 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7) },
8880 },
8881 {
8882 /* RM_0F1E_P_1_MOD_3_REG_7 */
8883 { "nopQ", { Ev }, PREFIX_IGNORED },
8884 { "nopQ", { Ev }, PREFIX_IGNORED },
8885 { "endbr64", { Skip_MODRM }, 0 },
8886 { "endbr32", { Skip_MODRM }, 0 },
8887 { "nopQ", { Ev }, PREFIX_IGNORED },
8888 { "nopQ", { Ev }, PREFIX_IGNORED },
8889 { "nopQ", { Ev }, PREFIX_IGNORED },
8890 { "nopQ", { Ev }, PREFIX_IGNORED },
8891 },
8892 {
8893 /* RM_0FAE_REG_6_MOD_3 */
8894 { "mfence", { Skip_MODRM }, 0 },
8895 },
8896 {
8897 /* RM_0FAE_REG_7_MOD_3 */
8898 { "sfence", { Skip_MODRM }, 0 },
8899 },
8900 {
8901 /* RM_0F3A0F_P_1_MOD_3_REG_0 */
8902 { "hreset", { Skip_MODRM, Ib }, 0 },
8903 },
8904 {
8905 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8906 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0) },
8907 },
8908 };
8909
8910 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8911
8912 /* The values used here must be non-zero, fit in 'unsigned char', and not be
8913 in conflict with actual prefix opcodes. */
8914 #define REP_PREFIX 0x01
8915 #define XACQUIRE_PREFIX 0x02
8916 #define XRELEASE_PREFIX 0x03
8917 #define BND_PREFIX 0x04
8918 #define NOTRACK_PREFIX 0x05
8919
8920 static enum {
8921 ckp_okay,
8922 ckp_bogus,
8923 ckp_fetch_error,
8924 }
8925 ckprefix (instr_info *ins)
8926 {
8927 int newrex, i, length;
8928
8929 i = 0;
8930 length = 0;
8931 /* The maximum instruction length is 15bytes. */
8932 while (length < MAX_CODE_LENGTH - 1)
8933 {
8934 if (!fetch_code (ins->info, ins->codep + 1))
8935 return ckp_fetch_error;
8936 newrex = 0;
8937 switch (*ins->codep)
8938 {
8939 /* REX prefixes family. */
8940 case 0x40:
8941 case 0x41:
8942 case 0x42:
8943 case 0x43:
8944 case 0x44:
8945 case 0x45:
8946 case 0x46:
8947 case 0x47:
8948 case 0x48:
8949 case 0x49:
8950 case 0x4a:
8951 case 0x4b:
8952 case 0x4c:
8953 case 0x4d:
8954 case 0x4e:
8955 case 0x4f:
8956 if (ins->address_mode == mode_64bit)
8957 newrex = *ins->codep;
8958 else
8959 return ckp_okay;
8960 ins->last_rex_prefix = i;
8961 break;
8962 case 0xf3:
8963 ins->prefixes |= PREFIX_REPZ;
8964 ins->last_repz_prefix = i;
8965 break;
8966 case 0xf2:
8967 ins->prefixes |= PREFIX_REPNZ;
8968 ins->last_repnz_prefix = i;
8969 break;
8970 case 0xf0:
8971 ins->prefixes |= PREFIX_LOCK;
8972 ins->last_lock_prefix = i;
8973 break;
8974 case 0x2e:
8975 ins->prefixes |= PREFIX_CS;
8976 ins->last_seg_prefix = i;
8977 if (ins->address_mode != mode_64bit)
8978 ins->active_seg_prefix = PREFIX_CS;
8979 break;
8980 case 0x36:
8981 ins->prefixes |= PREFIX_SS;
8982 ins->last_seg_prefix = i;
8983 if (ins->address_mode != mode_64bit)
8984 ins->active_seg_prefix = PREFIX_SS;
8985 break;
8986 case 0x3e:
8987 ins->prefixes |= PREFIX_DS;
8988 ins->last_seg_prefix = i;
8989 if (ins->address_mode != mode_64bit)
8990 ins->active_seg_prefix = PREFIX_DS;
8991 break;
8992 case 0x26:
8993 ins->prefixes |= PREFIX_ES;
8994 ins->last_seg_prefix = i;
8995 if (ins->address_mode != mode_64bit)
8996 ins->active_seg_prefix = PREFIX_ES;
8997 break;
8998 case 0x64:
8999 ins->prefixes |= PREFIX_FS;
9000 ins->last_seg_prefix = i;
9001 ins->active_seg_prefix = PREFIX_FS;
9002 break;
9003 case 0x65:
9004 ins->prefixes |= PREFIX_GS;
9005 ins->last_seg_prefix = i;
9006 ins->active_seg_prefix = PREFIX_GS;
9007 break;
9008 case 0x66:
9009 ins->prefixes |= PREFIX_DATA;
9010 ins->last_data_prefix = i;
9011 break;
9012 case 0x67:
9013 ins->prefixes |= PREFIX_ADDR;
9014 ins->last_addr_prefix = i;
9015 break;
9016 case FWAIT_OPCODE:
9017 /* fwait is really an instruction. If there are prefixes
9018 before the fwait, they belong to the fwait, *not* to the
9019 following instruction. */
9020 ins->fwait_prefix = i;
9021 if (ins->prefixes || ins->rex)
9022 {
9023 ins->prefixes |= PREFIX_FWAIT;
9024 ins->codep++;
9025 /* This ensures that the previous REX prefixes are noticed
9026 as unused prefixes, as in the return case below. */
9027 return ins->rex ? ckp_bogus : ckp_okay;
9028 }
9029 ins->prefixes = PREFIX_FWAIT;
9030 break;
9031 default:
9032 return ckp_okay;
9033 }
9034 /* Rex is ignored when followed by another prefix. */
9035 if (ins->rex)
9036 return ckp_bogus;
9037 if (*ins->codep != FWAIT_OPCODE)
9038 ins->all_prefixes[i++] = *ins->codep;
9039 ins->rex = newrex;
9040 ins->codep++;
9041 length++;
9042 }
9043 return ckp_bogus;
9044 }
9045
9046 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
9047 prefix byte. */
9048
9049 static const char *
9050 prefix_name (const instr_info *ins, int pref, int sizeflag)
9051 {
9052 static const char *rexes [16] =
9053 {
9054 "rex", /* 0x40 */
9055 "rex.B", /* 0x41 */
9056 "rex.X", /* 0x42 */
9057 "rex.XB", /* 0x43 */
9058 "rex.R", /* 0x44 */
9059 "rex.RB", /* 0x45 */
9060 "rex.RX", /* 0x46 */
9061 "rex.RXB", /* 0x47 */
9062 "rex.W", /* 0x48 */
9063 "rex.WB", /* 0x49 */
9064 "rex.WX", /* 0x4a */
9065 "rex.WXB", /* 0x4b */
9066 "rex.WR", /* 0x4c */
9067 "rex.WRB", /* 0x4d */
9068 "rex.WRX", /* 0x4e */
9069 "rex.WRXB", /* 0x4f */
9070 };
9071
9072 switch (pref)
9073 {
9074 /* REX prefixes family. */
9075 case 0x40:
9076 case 0x41:
9077 case 0x42:
9078 case 0x43:
9079 case 0x44:
9080 case 0x45:
9081 case 0x46:
9082 case 0x47:
9083 case 0x48:
9084 case 0x49:
9085 case 0x4a:
9086 case 0x4b:
9087 case 0x4c:
9088 case 0x4d:
9089 case 0x4e:
9090 case 0x4f:
9091 return rexes [pref - 0x40];
9092 case 0xf3:
9093 return "repz";
9094 case 0xf2:
9095 return "repnz";
9096 case 0xf0:
9097 return "lock";
9098 case 0x2e:
9099 return "cs";
9100 case 0x36:
9101 return "ss";
9102 case 0x3e:
9103 return "ds";
9104 case 0x26:
9105 return "es";
9106 case 0x64:
9107 return "fs";
9108 case 0x65:
9109 return "gs";
9110 case 0x66:
9111 return (sizeflag & DFLAG) ? "data16" : "data32";
9112 case 0x67:
9113 if (ins->address_mode == mode_64bit)
9114 return (sizeflag & AFLAG) ? "addr32" : "addr64";
9115 else
9116 return (sizeflag & AFLAG) ? "addr16" : "addr32";
9117 case FWAIT_OPCODE:
9118 return "fwait";
9119 case REP_PREFIX:
9120 return "rep";
9121 case XACQUIRE_PREFIX:
9122 return "xacquire";
9123 case XRELEASE_PREFIX:
9124 return "xrelease";
9125 case BND_PREFIX:
9126 return "bnd";
9127 case NOTRACK_PREFIX:
9128 return "notrack";
9129 default:
9130 return NULL;
9131 }
9132 }
9133
9134 void
9135 print_i386_disassembler_options (FILE *stream)
9136 {
9137 fprintf (stream, _("\n\
9138 The following i386/x86-64 specific disassembler options are supported for use\n\
9139 with the -M switch (multiple options should be separated by commas):\n"));
9140
9141 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9142 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9143 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9144 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9145 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9146 fprintf (stream, _(" att-mnemonic\n"
9147 " Display instruction in AT&T mnemonic\n"));
9148 fprintf (stream, _(" intel-mnemonic\n"
9149 " Display instruction in Intel mnemonic\n"));
9150 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9151 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9152 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9153 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9154 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9155 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
9156 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
9157 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
9158 }
9159
9160 /* Bad opcode. */
9161 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
9162
9163 /* Fetch error indicator. */
9164 static const struct dis386 err_opcode = { NULL, { XX }, 0 };
9165
9166 /* Get a pointer to struct dis386 with a valid name. */
9167
9168 static const struct dis386 *
9169 get_valid_dis386 (const struct dis386 *dp, instr_info *ins)
9170 {
9171 int vindex, vex_table_index;
9172
9173 if (dp->name != NULL)
9174 return dp;
9175
9176 switch (dp->op[0].bytemode)
9177 {
9178 case USE_REG_TABLE:
9179 dp = &reg_table[dp->op[1].bytemode][ins->modrm.reg];
9180 break;
9181
9182 case USE_MOD_TABLE:
9183 vindex = ins->modrm.mod == 0x3 ? 1 : 0;
9184 dp = &mod_table[dp->op[1].bytemode][vindex];
9185 break;
9186
9187 case USE_RM_TABLE:
9188 dp = &rm_table[dp->op[1].bytemode][ins->modrm.rm];
9189 break;
9190
9191 case USE_PREFIX_TABLE:
9192 if (ins->need_vex)
9193 {
9194 /* The prefix in VEX is implicit. */
9195 switch (ins->vex.prefix)
9196 {
9197 case 0:
9198 vindex = 0;
9199 break;
9200 case REPE_PREFIX_OPCODE:
9201 vindex = 1;
9202 break;
9203 case DATA_PREFIX_OPCODE:
9204 vindex = 2;
9205 break;
9206 case REPNE_PREFIX_OPCODE:
9207 vindex = 3;
9208 break;
9209 default:
9210 abort ();
9211 break;
9212 }
9213 }
9214 else
9215 {
9216 int last_prefix = -1;
9217 int prefix = 0;
9218 vindex = 0;
9219 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9220 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9221 last one wins. */
9222 if ((ins->prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
9223 {
9224 if (ins->last_repz_prefix > ins->last_repnz_prefix)
9225 {
9226 vindex = 1;
9227 prefix = PREFIX_REPZ;
9228 last_prefix = ins->last_repz_prefix;
9229 }
9230 else
9231 {
9232 vindex = 3;
9233 prefix = PREFIX_REPNZ;
9234 last_prefix = ins->last_repnz_prefix;
9235 }
9236
9237 /* Check if prefix should be ignored. */
9238 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
9239 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
9240 & prefix) != 0
9241 && !prefix_table[dp->op[1].bytemode][vindex].name)
9242 vindex = 0;
9243 }
9244
9245 if (vindex == 0 && (ins->prefixes & PREFIX_DATA) != 0)
9246 {
9247 vindex = 2;
9248 prefix = PREFIX_DATA;
9249 last_prefix = ins->last_data_prefix;
9250 }
9251
9252 if (vindex != 0)
9253 {
9254 ins->used_prefixes |= prefix;
9255 ins->all_prefixes[last_prefix] = 0;
9256 }
9257 }
9258 dp = &prefix_table[dp->op[1].bytemode][vindex];
9259 break;
9260
9261 case USE_X86_64_TABLE:
9262 vindex = ins->address_mode == mode_64bit ? 1 : 0;
9263 dp = &x86_64_table[dp->op[1].bytemode][vindex];
9264 break;
9265
9266 case USE_3BYTE_TABLE:
9267 if (!fetch_code (ins->info, ins->codep + 2))
9268 return &err_opcode;
9269 vindex = *ins->codep++;
9270 dp = &three_byte_table[dp->op[1].bytemode][vindex];
9271 ins->end_codep = ins->codep;
9272 if (!fetch_modrm (ins))
9273 return &err_opcode;
9274 break;
9275
9276 case USE_VEX_LEN_TABLE:
9277 if (!ins->need_vex)
9278 abort ();
9279
9280 switch (ins->vex.length)
9281 {
9282 case 128:
9283 vindex = 0;
9284 break;
9285 case 512:
9286 /* This allows re-using in particular table entries where only
9287 128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid. */
9288 if (ins->vex.evex)
9289 {
9290 case 256:
9291 vindex = 1;
9292 break;
9293 }
9294 /* Fall through. */
9295 default:
9296 abort ();
9297 break;
9298 }
9299
9300 dp = &vex_len_table[dp->op[1].bytemode][vindex];
9301 break;
9302
9303 case USE_EVEX_LEN_TABLE:
9304 if (!ins->vex.evex)
9305 abort ();
9306
9307 switch (ins->vex.length)
9308 {
9309 case 128:
9310 vindex = 0;
9311 break;
9312 case 256:
9313 vindex = 1;
9314 break;
9315 case 512:
9316 vindex = 2;
9317 break;
9318 default:
9319 abort ();
9320 break;
9321 }
9322
9323 dp = &evex_len_table[dp->op[1].bytemode][vindex];
9324 break;
9325
9326 case USE_XOP_8F_TABLE:
9327 if (!fetch_code (ins->info, ins->codep + 3))
9328 return &err_opcode;
9329 ins->rex = ~(*ins->codep >> 5) & 0x7;
9330
9331 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9332 switch ((*ins->codep & 0x1f))
9333 {
9334 default:
9335 dp = &bad_opcode;
9336 return dp;
9337 case 0x8:
9338 vex_table_index = XOP_08;
9339 break;
9340 case 0x9:
9341 vex_table_index = XOP_09;
9342 break;
9343 case 0xa:
9344 vex_table_index = XOP_0A;
9345 break;
9346 }
9347 ins->codep++;
9348 ins->vex.w = *ins->codep & 0x80;
9349 if (ins->vex.w && ins->address_mode == mode_64bit)
9350 ins->rex |= REX_W;
9351
9352 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9353 if (ins->address_mode != mode_64bit)
9354 {
9355 /* In 16/32-bit mode REX_B is silently ignored. */
9356 ins->rex &= ~REX_B;
9357 }
9358
9359 ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9360 switch ((*ins->codep & 0x3))
9361 {
9362 case 0:
9363 break;
9364 case 1:
9365 ins->vex.prefix = DATA_PREFIX_OPCODE;
9366 break;
9367 case 2:
9368 ins->vex.prefix = REPE_PREFIX_OPCODE;
9369 break;
9370 case 3:
9371 ins->vex.prefix = REPNE_PREFIX_OPCODE;
9372 break;
9373 }
9374 ins->need_vex = true;
9375 ins->codep++;
9376 vindex = *ins->codep++;
9377 dp = &xop_table[vex_table_index][vindex];
9378
9379 ins->end_codep = ins->codep;
9380 if (!fetch_modrm (ins))
9381 return &err_opcode;
9382
9383 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9384 having to decode the bits for every otherwise valid encoding. */
9385 if (ins->vex.prefix)
9386 return &bad_opcode;
9387 break;
9388
9389 case USE_VEX_C4_TABLE:
9390 /* VEX prefix. */
9391 if (!fetch_code (ins->info, ins->codep + 3))
9392 return &err_opcode;
9393 ins->rex = ~(*ins->codep >> 5) & 0x7;
9394 switch ((*ins->codep & 0x1f))
9395 {
9396 default:
9397 dp = &bad_opcode;
9398 return dp;
9399 case 0x1:
9400 vex_table_index = VEX_0F;
9401 break;
9402 case 0x2:
9403 vex_table_index = VEX_0F38;
9404 break;
9405 case 0x3:
9406 vex_table_index = VEX_0F3A;
9407 break;
9408 }
9409 ins->codep++;
9410 ins->vex.w = *ins->codep & 0x80;
9411 if (ins->address_mode == mode_64bit)
9412 {
9413 if (ins->vex.w)
9414 ins->rex |= REX_W;
9415 }
9416 else
9417 {
9418 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9419 is ignored, other REX bits are 0 and the highest bit in
9420 VEX.vvvv is also ignored (but we mustn't clear it here). */
9421 ins->rex = 0;
9422 }
9423 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9424 ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9425 switch ((*ins->codep & 0x3))
9426 {
9427 case 0:
9428 break;
9429 case 1:
9430 ins->vex.prefix = DATA_PREFIX_OPCODE;
9431 break;
9432 case 2:
9433 ins->vex.prefix = REPE_PREFIX_OPCODE;
9434 break;
9435 case 3:
9436 ins->vex.prefix = REPNE_PREFIX_OPCODE;
9437 break;
9438 }
9439 ins->need_vex = true;
9440 ins->codep++;
9441 vindex = *ins->codep++;
9442 dp = &vex_table[vex_table_index][vindex];
9443 ins->end_codep = ins->codep;
9444 /* There is no MODRM byte for VEX0F 77. */
9445 if ((vex_table_index != VEX_0F || vindex != 0x77)
9446 && !fetch_modrm (ins))
9447 return &err_opcode;
9448 break;
9449
9450 case USE_VEX_C5_TABLE:
9451 /* VEX prefix. */
9452 if (!fetch_code (ins->info, ins->codep + 2))
9453 return &err_opcode;
9454 ins->rex = (*ins->codep & 0x80) ? 0 : REX_R;
9455
9456 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9457 VEX.vvvv is 1. */
9458 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9459 ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9460 switch ((*ins->codep & 0x3))
9461 {
9462 case 0:
9463 break;
9464 case 1:
9465 ins->vex.prefix = DATA_PREFIX_OPCODE;
9466 break;
9467 case 2:
9468 ins->vex.prefix = REPE_PREFIX_OPCODE;
9469 break;
9470 case 3:
9471 ins->vex.prefix = REPNE_PREFIX_OPCODE;
9472 break;
9473 }
9474 ins->need_vex = true;
9475 ins->codep++;
9476 vindex = *ins->codep++;
9477 dp = &vex_table[dp->op[1].bytemode][vindex];
9478 ins->end_codep = ins->codep;
9479 /* There is no MODRM byte for VEX 77. */
9480 if (vindex != 0x77 && !fetch_modrm (ins))
9481 return &err_opcode;
9482 break;
9483
9484 case USE_VEX_W_TABLE:
9485 if (!ins->need_vex)
9486 abort ();
9487
9488 dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w];
9489 break;
9490
9491 case USE_EVEX_TABLE:
9492 ins->two_source_ops = false;
9493 /* EVEX prefix. */
9494 ins->vex.evex = true;
9495 if (!fetch_code (ins->info, ins->codep + 4))
9496 return &err_opcode;
9497 /* The first byte after 0x62. */
9498 ins->rex = ~(*ins->codep >> 5) & 0x7;
9499 ins->vex.r = *ins->codep & 0x10;
9500 switch ((*ins->codep & 0xf))
9501 {
9502 default:
9503 return &bad_opcode;
9504 case 0x1:
9505 vex_table_index = EVEX_0F;
9506 break;
9507 case 0x2:
9508 vex_table_index = EVEX_0F38;
9509 break;
9510 case 0x3:
9511 vex_table_index = EVEX_0F3A;
9512 break;
9513 case 0x5:
9514 vex_table_index = EVEX_MAP5;
9515 break;
9516 case 0x6:
9517 vex_table_index = EVEX_MAP6;
9518 break;
9519 }
9520
9521 /* The second byte after 0x62. */
9522 ins->codep++;
9523 ins->vex.w = *ins->codep & 0x80;
9524 if (ins->vex.w && ins->address_mode == mode_64bit)
9525 ins->rex |= REX_W;
9526
9527 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9528
9529 /* The U bit. */
9530 if (!(*ins->codep & 0x4))
9531 return &bad_opcode;
9532
9533 switch ((*ins->codep & 0x3))
9534 {
9535 case 0:
9536 break;
9537 case 1:
9538 ins->vex.prefix = DATA_PREFIX_OPCODE;
9539 break;
9540 case 2:
9541 ins->vex.prefix = REPE_PREFIX_OPCODE;
9542 break;
9543 case 3:
9544 ins->vex.prefix = REPNE_PREFIX_OPCODE;
9545 break;
9546 }
9547
9548 /* The third byte after 0x62. */
9549 ins->codep++;
9550
9551 /* Remember the static rounding bits. */
9552 ins->vex.ll = (*ins->codep >> 5) & 3;
9553 ins->vex.b = *ins->codep & 0x10;
9554
9555 ins->vex.v = *ins->codep & 0x8;
9556 ins->vex.mask_register_specifier = *ins->codep & 0x7;
9557 ins->vex.zeroing = *ins->codep & 0x80;
9558
9559 if (ins->address_mode != mode_64bit)
9560 {
9561 /* In 16/32-bit mode silently ignore following bits. */
9562 ins->rex &= ~REX_B;
9563 ins->vex.r = true;
9564 }
9565
9566 ins->need_vex = true;
9567 ins->codep++;
9568 vindex = *ins->codep++;
9569 dp = &evex_table[vex_table_index][vindex];
9570 ins->end_codep = ins->codep;
9571 if (!fetch_modrm (ins))
9572 return &err_opcode;
9573
9574 /* Set vector length. */
9575 if (ins->modrm.mod == 3 && ins->vex.b)
9576 ins->vex.length = 512;
9577 else
9578 {
9579 switch (ins->vex.ll)
9580 {
9581 case 0x0:
9582 ins->vex.length = 128;
9583 break;
9584 case 0x1:
9585 ins->vex.length = 256;
9586 break;
9587 case 0x2:
9588 ins->vex.length = 512;
9589 break;
9590 default:
9591 return &bad_opcode;
9592 }
9593 }
9594 break;
9595
9596 case 0:
9597 dp = &bad_opcode;
9598 break;
9599
9600 default:
9601 abort ();
9602 }
9603
9604 if (dp->name != NULL)
9605 return dp;
9606 else
9607 return get_valid_dis386 (dp, ins);
9608 }
9609
9610 static bool
9611 get_sib (instr_info *ins, int sizeflag)
9612 {
9613 /* If modrm.mod == 3, operand must be register. */
9614 if (ins->need_modrm
9615 && ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
9616 && ins->modrm.mod != 3
9617 && ins->modrm.rm == 4)
9618 {
9619 if (!fetch_code (ins->info, ins->codep + 2))
9620 return false;
9621 ins->sib.index = (ins->codep[1] >> 3) & 7;
9622 ins->sib.scale = (ins->codep[1] >> 6) & 3;
9623 ins->sib.base = ins->codep[1] & 7;
9624 ins->has_sib = true;
9625 }
9626 else
9627 ins->has_sib = false;
9628
9629 return true;
9630 }
9631
9632 /* Like oappend (below), but S is a string starting with '%'. In
9633 Intel syntax, the '%' is elided. */
9634
9635 static void
9636 oappend_register (instr_info *ins, const char *s)
9637 {
9638 oappend_with_style (ins, s + ins->intel_syntax, dis_style_register);
9639 }
9640
9641 /* Wrap around a call to INS->info->fprintf_styled_func, printing FMT.
9642 STYLE is the default style to use in the fprintf_styled_func calls,
9643 however, FMT might include embedded style markers (see oappend_style),
9644 these embedded markers are not printed, but instead change the style
9645 used in the next fprintf_styled_func call. */
9646
9647 static void ATTRIBUTE_PRINTF_3
9648 i386_dis_printf (const instr_info *ins, enum disassembler_style style,
9649 const char *fmt, ...)
9650 {
9651 va_list ap;
9652 enum disassembler_style curr_style = style;
9653 const char *start, *curr;
9654 char staging_area[40];
9655
9656 va_start (ap, fmt);
9657 /* In particular print_insn()'s processing of op_txt[] can hand rather long
9658 strings here. Bypass vsnprintf() in such cases to avoid capacity issues
9659 with the staging area. */
9660 if (strcmp (fmt, "%s"))
9661 {
9662 int res = vsnprintf (staging_area, sizeof (staging_area), fmt, ap);
9663
9664 va_end (ap);
9665
9666 if (res < 0)
9667 return;
9668
9669 if ((size_t) res >= sizeof (staging_area))
9670 abort ();
9671
9672 start = curr = staging_area;
9673 }
9674 else
9675 {
9676 start = curr = va_arg (ap, const char *);
9677 va_end (ap);
9678 }
9679
9680 do
9681 {
9682 if (*curr == '\0'
9683 || (*curr == STYLE_MARKER_CHAR
9684 && ISXDIGIT (*(curr + 1))
9685 && *(curr + 2) == STYLE_MARKER_CHAR))
9686 {
9687 /* Output content between our START position and CURR. */
9688 int len = curr - start;
9689 int n = (*ins->info->fprintf_styled_func) (ins->info->stream,
9690 curr_style,
9691 "%.*s", len, start);
9692 if (n < 0)
9693 break;
9694
9695 if (*curr == '\0')
9696 break;
9697
9698 /* Skip over the initial STYLE_MARKER_CHAR. */
9699 ++curr;
9700
9701 /* Update the CURR_STYLE. As there are less than 16 styles, it
9702 is possible, that if the input is corrupted in some way, that
9703 we might set CURR_STYLE to an invalid value. Don't worry
9704 though, we check for this situation. */
9705 if (*curr >= '0' && *curr <= '9')
9706 curr_style = (enum disassembler_style) (*curr - '0');
9707 else if (*curr >= 'a' && *curr <= 'f')
9708 curr_style = (enum disassembler_style) (*curr - 'a' + 10);
9709 else
9710 curr_style = dis_style_text;
9711
9712 /* Check for an invalid style having been selected. This should
9713 never happen, but it doesn't hurt to be a little paranoid. */
9714 if (curr_style > dis_style_comment_start)
9715 curr_style = dis_style_text;
9716
9717 /* Skip the hex character, and the closing STYLE_MARKER_CHAR. */
9718 curr += 2;
9719
9720 /* Reset the START to after the style marker. */
9721 start = curr;
9722 }
9723 else
9724 ++curr;
9725 }
9726 while (true);
9727 }
9728
9729 static int
9730 print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax)
9731 {
9732 const struct dis386 *dp;
9733 int i;
9734 char *op_txt[MAX_OPERANDS];
9735 int needcomma;
9736 bool intel_swap_2_3;
9737 int sizeflag, orig_sizeflag;
9738 const char *p;
9739 struct dis_private priv;
9740 int prefix_length;
9741 int op_count;
9742 instr_info ins = {
9743 .info = info,
9744 .intel_syntax = intel_syntax >= 0
9745 ? intel_syntax
9746 : (info->mach & bfd_mach_i386_intel_syntax) != 0,
9747 .intel_mnemonic = !SYSV386_COMPAT,
9748 .op_index[0 ... MAX_OPERANDS - 1] = -1,
9749 .start_pc = pc,
9750 .start_codep = priv.the_buffer,
9751 .codep = priv.the_buffer,
9752 .obufp = ins.obuf,
9753 .last_lock_prefix = -1,
9754 .last_repz_prefix = -1,
9755 .last_repnz_prefix = -1,
9756 .last_data_prefix = -1,
9757 .last_addr_prefix = -1,
9758 .last_rex_prefix = -1,
9759 .last_seg_prefix = -1,
9760 .fwait_prefix = -1,
9761 };
9762 char op_out[MAX_OPERANDS][MAX_OPERAND_BUFFER_SIZE];
9763
9764 priv.orig_sizeflag = AFLAG | DFLAG;
9765 if ((info->mach & bfd_mach_i386_i386) != 0)
9766 ins.address_mode = mode_32bit;
9767 else if (info->mach == bfd_mach_i386_i8086)
9768 {
9769 ins.address_mode = mode_16bit;
9770 priv.orig_sizeflag = 0;
9771 }
9772 else
9773 ins.address_mode = mode_64bit;
9774
9775 for (p = info->disassembler_options; p != NULL;)
9776 {
9777 if (startswith (p, "amd64"))
9778 ins.isa64 = amd64;
9779 else if (startswith (p, "intel64"))
9780 ins.isa64 = intel64;
9781 else if (startswith (p, "x86-64"))
9782 {
9783 ins.address_mode = mode_64bit;
9784 priv.orig_sizeflag |= AFLAG | DFLAG;
9785 }
9786 else if (startswith (p, "i386"))
9787 {
9788 ins.address_mode = mode_32bit;
9789 priv.orig_sizeflag |= AFLAG | DFLAG;
9790 }
9791 else if (startswith (p, "i8086"))
9792 {
9793 ins.address_mode = mode_16bit;
9794 priv.orig_sizeflag &= ~(AFLAG | DFLAG);
9795 }
9796 else if (startswith (p, "intel"))
9797 {
9798 ins.intel_syntax = 1;
9799 if (startswith (p + 5, "-mnemonic"))
9800 ins.intel_mnemonic = true;
9801 }
9802 else if (startswith (p, "att"))
9803 {
9804 ins.intel_syntax = 0;
9805 if (startswith (p + 3, "-mnemonic"))
9806 ins.intel_mnemonic = false;
9807 }
9808 else if (startswith (p, "addr"))
9809 {
9810 if (ins.address_mode == mode_64bit)
9811 {
9812 if (p[4] == '3' && p[5] == '2')
9813 priv.orig_sizeflag &= ~AFLAG;
9814 else if (p[4] == '6' && p[5] == '4')
9815 priv.orig_sizeflag |= AFLAG;
9816 }
9817 else
9818 {
9819 if (p[4] == '1' && p[5] == '6')
9820 priv.orig_sizeflag &= ~AFLAG;
9821 else if (p[4] == '3' && p[5] == '2')
9822 priv.orig_sizeflag |= AFLAG;
9823 }
9824 }
9825 else if (startswith (p, "data"))
9826 {
9827 if (p[4] == '1' && p[5] == '6')
9828 priv.orig_sizeflag &= ~DFLAG;
9829 else if (p[4] == '3' && p[5] == '2')
9830 priv.orig_sizeflag |= DFLAG;
9831 }
9832 else if (startswith (p, "suffix"))
9833 priv.orig_sizeflag |= SUFFIX_ALWAYS;
9834
9835 p = strchr (p, ',');
9836 if (p != NULL)
9837 p++;
9838 }
9839
9840 if (ins.address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9841 {
9842 i386_dis_printf (&ins, dis_style_text, _("64-bit address is disabled"));
9843 return -1;
9844 }
9845
9846 if (ins.intel_syntax)
9847 {
9848 ins.open_char = '[';
9849 ins.close_char = ']';
9850 ins.separator_char = '+';
9851 ins.scale_char = '*';
9852 }
9853 else
9854 {
9855 ins.open_char = '(';
9856 ins.close_char = ')';
9857 ins.separator_char = ',';
9858 ins.scale_char = ',';
9859 }
9860
9861 /* The output looks better if we put 7 bytes on a line, since that
9862 puts most long word instructions on a single line. */
9863 info->bytes_per_line = 7;
9864
9865 info->private_data = &priv;
9866 priv.max_fetched = priv.the_buffer;
9867 priv.insn_start = pc;
9868
9869 for (i = 0; i < MAX_OPERANDS; ++i)
9870 {
9871 op_out[i][0] = 0;
9872 ins.op_out[i] = op_out[i];
9873 }
9874
9875 sizeflag = priv.orig_sizeflag;
9876
9877 switch (ckprefix (&ins))
9878 {
9879 case ckp_okay:
9880 break;
9881
9882 case ckp_bogus:
9883 /* Too many prefixes or unused REX prefixes. */
9884 for (i = 0;
9885 i < (int) ARRAY_SIZE (ins.all_prefixes) && ins.all_prefixes[i];
9886 i++)
9887 i386_dis_printf (&ins, dis_style_mnemonic, "%s%s",
9888 (i == 0 ? "" : " "),
9889 prefix_name (&ins, ins.all_prefixes[i], sizeflag));
9890 return i;
9891
9892 case ckp_fetch_error:
9893 return fetch_error (&ins);
9894 }
9895
9896 ins.insn_codep = ins.codep;
9897
9898 if (!fetch_code (info, ins.codep + 1))
9899 return fetch_error (&ins);
9900
9901 ins.two_source_ops = (*ins.codep == 0x62) || (*ins.codep == 0xc8);
9902
9903 if (((ins.prefixes & PREFIX_FWAIT)
9904 && ((*ins.codep < 0xd8) || (*ins.codep > 0xdf))))
9905 {
9906 /* Handle ins.prefixes before fwait. */
9907 for (i = 0; i < ins.fwait_prefix && ins.all_prefixes[i];
9908 i++)
9909 i386_dis_printf (&ins, dis_style_mnemonic, "%s ",
9910 prefix_name (&ins, ins.all_prefixes[i], sizeflag));
9911 i386_dis_printf (&ins, dis_style_mnemonic, "fwait");
9912 return i + 1;
9913 }
9914
9915 if (*ins.codep == 0x0f)
9916 {
9917 unsigned char threebyte;
9918
9919 ins.codep++;
9920 if (!fetch_code (info, ins.codep + 1))
9921 return fetch_error (&ins);
9922 threebyte = *ins.codep;
9923 dp = &dis386_twobyte[threebyte];
9924 ins.need_modrm = twobyte_has_modrm[threebyte];
9925 ins.codep++;
9926 }
9927 else
9928 {
9929 dp = &dis386[*ins.codep];
9930 ins.need_modrm = onebyte_has_modrm[*ins.codep];
9931 ins.codep++;
9932 }
9933
9934 /* Save sizeflag for printing the extra ins.prefixes later before updating
9935 it for mnemonic and operand processing. The prefix names depend
9936 only on the address mode. */
9937 orig_sizeflag = sizeflag;
9938 if (ins.prefixes & PREFIX_ADDR)
9939 sizeflag ^= AFLAG;
9940 if ((ins.prefixes & PREFIX_DATA))
9941 sizeflag ^= DFLAG;
9942
9943 ins.end_codep = ins.codep;
9944 if (ins.need_modrm && !fetch_modrm (&ins))
9945 return fetch_error (&ins);
9946
9947 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
9948 {
9949 if (!get_sib (&ins, sizeflag)
9950 || !dofloat (&ins, sizeflag))
9951 return fetch_error (&ins);
9952 }
9953 else
9954 {
9955 dp = get_valid_dis386 (dp, &ins);
9956 if (dp == &err_opcode)
9957 return fetch_error (&ins);
9958 if (dp != NULL && putop (&ins, dp->name, sizeflag) == 0)
9959 {
9960 if (!get_sib (&ins, sizeflag))
9961 return fetch_error (&ins);
9962 for (i = 0; i < MAX_OPERANDS; ++i)
9963 {
9964 ins.obufp = ins.op_out[i];
9965 ins.op_ad = MAX_OPERANDS - 1 - i;
9966 if (dp->op[i].rtn
9967 && !dp->op[i].rtn (&ins, dp->op[i].bytemode, sizeflag))
9968 return fetch_error (&ins);
9969 /* For EVEX instruction after the last operand masking
9970 should be printed. */
9971 if (i == 0 && ins.vex.evex)
9972 {
9973 /* Don't print {%k0}. */
9974 if (ins.vex.mask_register_specifier)
9975 {
9976 const char *reg_name
9977 = att_names_mask[ins.vex.mask_register_specifier];
9978
9979 oappend (&ins, "{");
9980 oappend_register (&ins, reg_name);
9981 oappend (&ins, "}");
9982 }
9983 if (ins.vex.zeroing)
9984 oappend (&ins, "{z}");
9985
9986 /* S/G insns require a mask and don't allow
9987 zeroing-masking. */
9988 if ((dp->op[0].bytemode == vex_vsib_d_w_dq_mode
9989 || dp->op[0].bytemode == vex_vsib_q_w_dq_mode)
9990 && (ins.vex.mask_register_specifier == 0
9991 || ins.vex.zeroing))
9992 oappend (&ins, "/(bad)");
9993 }
9994 }
9995
9996 /* Check whether rounding control was enabled for an insn not
9997 supporting it. */
9998 if (ins.modrm.mod == 3 && ins.vex.b
9999 && !(ins.evex_used & EVEX_b_used))
10000 {
10001 for (i = 0; i < MAX_OPERANDS; ++i)
10002 {
10003 ins.obufp = ins.op_out[i];
10004 if (*ins.obufp)
10005 continue;
10006 oappend (&ins, names_rounding[ins.vex.ll]);
10007 oappend (&ins, "bad}");
10008 break;
10009 }
10010 }
10011 }
10012 }
10013
10014 /* Clear instruction information. */
10015 info->insn_info_valid = 0;
10016 info->branch_delay_insns = 0;
10017 info->data_size = 0;
10018 info->insn_type = dis_noninsn;
10019 info->target = 0;
10020 info->target2 = 0;
10021
10022 /* Reset jump operation indicator. */
10023 ins.op_is_jump = false;
10024 {
10025 int jump_detection = 0;
10026
10027 /* Extract flags. */
10028 for (i = 0; i < MAX_OPERANDS; ++i)
10029 {
10030 if ((dp->op[i].rtn == OP_J)
10031 || (dp->op[i].rtn == OP_indirE))
10032 jump_detection |= 1;
10033 else if ((dp->op[i].rtn == BND_Fixup)
10034 || (!dp->op[i].rtn && !dp->op[i].bytemode))
10035 jump_detection |= 2;
10036 else if ((dp->op[i].bytemode == cond_jump_mode)
10037 || (dp->op[i].bytemode == loop_jcxz_mode))
10038 jump_detection |= 4;
10039 }
10040
10041 /* Determine if this is a jump or branch. */
10042 if ((jump_detection & 0x3) == 0x3)
10043 {
10044 ins.op_is_jump = true;
10045 if (jump_detection & 0x4)
10046 info->insn_type = dis_condbranch;
10047 else
10048 info->insn_type = (dp->name && !strncmp (dp->name, "call", 4))
10049 ? dis_jsr : dis_branch;
10050 }
10051 }
10052
10053 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
10054 are all 0s in inverted form. */
10055 if (ins.need_vex && ins.vex.register_specifier != 0)
10056 {
10057 i386_dis_printf (&ins, dis_style_text, "(bad)");
10058 return ins.end_codep - priv.the_buffer;
10059 }
10060
10061 /* If EVEX.z is set, there must be an actual mask register in use. */
10062 if (ins.vex.zeroing && ins.vex.mask_register_specifier == 0)
10063 {
10064 i386_dis_printf (&ins, dis_style_text, "(bad)");
10065 return ins.end_codep - priv.the_buffer;
10066 }
10067
10068 switch (dp->prefix_requirement)
10069 {
10070 case PREFIX_DATA:
10071 /* If only the data prefix is marked as mandatory, its absence renders
10072 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
10073 if (ins.need_vex ? !ins.vex.prefix : !(ins.prefixes & PREFIX_DATA))
10074 {
10075 i386_dis_printf (&ins, dis_style_text, "(bad)");
10076 return ins.end_codep - priv.the_buffer;
10077 }
10078 ins.used_prefixes |= PREFIX_DATA;
10079 /* Fall through. */
10080 case PREFIX_OPCODE:
10081 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
10082 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
10083 used by putop and MMX/SSE operand and may be overridden by the
10084 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
10085 separately. */
10086 if (((ins.need_vex
10087 ? ins.vex.prefix == REPE_PREFIX_OPCODE
10088 || ins.vex.prefix == REPNE_PREFIX_OPCODE
10089 : (ins.prefixes
10090 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
10091 && (ins.used_prefixes
10092 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
10093 || (((ins.need_vex
10094 ? ins.vex.prefix == DATA_PREFIX_OPCODE
10095 : ((ins.prefixes
10096 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
10097 == PREFIX_DATA))
10098 && (ins.used_prefixes & PREFIX_DATA) == 0))
10099 || (ins.vex.evex && dp->prefix_requirement != PREFIX_DATA
10100 && !ins.vex.w != !(ins.used_prefixes & PREFIX_DATA)))
10101 {
10102 i386_dis_printf (&ins, dis_style_text, "(bad)");
10103 return ins.end_codep - priv.the_buffer;
10104 }
10105 break;
10106
10107 case PREFIX_IGNORED:
10108 /* Zap data size and rep prefixes from used_prefixes and reinstate their
10109 origins in all_prefixes. */
10110 ins.used_prefixes &= ~PREFIX_OPCODE;
10111 if (ins.last_data_prefix >= 0)
10112 ins.all_prefixes[ins.last_data_prefix] = 0x66;
10113 if (ins.last_repz_prefix >= 0)
10114 ins.all_prefixes[ins.last_repz_prefix] = 0xf3;
10115 if (ins.last_repnz_prefix >= 0)
10116 ins.all_prefixes[ins.last_repnz_prefix] = 0xf2;
10117 break;
10118 }
10119
10120 /* Check if the REX prefix is used. */
10121 if ((ins.rex ^ ins.rex_used) == 0
10122 && !ins.need_vex && ins.last_rex_prefix >= 0)
10123 ins.all_prefixes[ins.last_rex_prefix] = 0;
10124
10125 /* Check if the SEG prefix is used. */
10126 if ((ins.prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10127 | PREFIX_FS | PREFIX_GS)) != 0
10128 && (ins.used_prefixes & ins.active_seg_prefix) != 0)
10129 ins.all_prefixes[ins.last_seg_prefix] = 0;
10130
10131 /* Check if the ADDR prefix is used. */
10132 if ((ins.prefixes & PREFIX_ADDR) != 0
10133 && (ins.used_prefixes & PREFIX_ADDR) != 0)
10134 ins.all_prefixes[ins.last_addr_prefix] = 0;
10135
10136 /* Check if the DATA prefix is used. */
10137 if ((ins.prefixes & PREFIX_DATA) != 0
10138 && (ins.used_prefixes & PREFIX_DATA) != 0
10139 && !ins.need_vex)
10140 ins.all_prefixes[ins.last_data_prefix] = 0;
10141
10142 /* Print the extra ins.prefixes. */
10143 prefix_length = 0;
10144 for (i = 0; i < (int) ARRAY_SIZE (ins.all_prefixes); i++)
10145 if (ins.all_prefixes[i])
10146 {
10147 const char *name;
10148 name = prefix_name (&ins, ins.all_prefixes[i], orig_sizeflag);
10149 if (name == NULL)
10150 abort ();
10151 prefix_length += strlen (name) + 1;
10152 i386_dis_printf (&ins, dis_style_mnemonic, "%s ", name);
10153 }
10154
10155 /* Check maximum code length. */
10156 if ((ins.codep - ins.start_codep) > MAX_CODE_LENGTH)
10157 {
10158 i386_dis_printf (&ins, dis_style_text, "(bad)");
10159 return MAX_CODE_LENGTH;
10160 }
10161
10162 /* Calculate the number of operands this instruction has. */
10163 op_count = 0;
10164 for (i = 0; i < MAX_OPERANDS; ++i)
10165 if (*ins.op_out[i] != '\0')
10166 ++op_count;
10167
10168 /* Calculate the number of spaces to print after the mnemonic. */
10169 ins.obufp = ins.mnemonicendp;
10170 if (op_count > 0)
10171 {
10172 i = strlen (ins.obuf) + prefix_length;
10173 if (i < 7)
10174 i = 7 - i;
10175 else
10176 i = 1;
10177 }
10178 else
10179 i = 0;
10180
10181 /* Print the instruction mnemonic along with any trailing whitespace. */
10182 i386_dis_printf (&ins, dis_style_mnemonic, "%s%*s", ins.obuf, i, "");
10183
10184 /* The enter and bound instructions are printed with operands in the same
10185 order as the intel book; everything else is printed in reverse order. */
10186 intel_swap_2_3 = false;
10187 if (ins.intel_syntax || ins.two_source_ops)
10188 {
10189 for (i = 0; i < MAX_OPERANDS; ++i)
10190 op_txt[i] = ins.op_out[i];
10191
10192 if (ins.intel_syntax && dp && dp->op[2].rtn == OP_Rounding
10193 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
10194 {
10195 op_txt[2] = ins.op_out[3];
10196 op_txt[3] = ins.op_out[2];
10197 intel_swap_2_3 = true;
10198 }
10199
10200 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10201 {
10202 bool riprel;
10203
10204 ins.op_ad = ins.op_index[i];
10205 ins.op_index[i] = ins.op_index[MAX_OPERANDS - 1 - i];
10206 ins.op_index[MAX_OPERANDS - 1 - i] = ins.op_ad;
10207 riprel = ins.op_riprel[i];
10208 ins.op_riprel[i] = ins.op_riprel[MAX_OPERANDS - 1 - i];
10209 ins.op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10210 }
10211 }
10212 else
10213 {
10214 for (i = 0; i < MAX_OPERANDS; ++i)
10215 op_txt[MAX_OPERANDS - 1 - i] = ins.op_out[i];
10216 }
10217
10218 needcomma = 0;
10219 for (i = 0; i < MAX_OPERANDS; ++i)
10220 if (*op_txt[i])
10221 {
10222 /* In Intel syntax embedded rounding / SAE are not separate operands.
10223 Instead they're attached to the prior register operand. Simply
10224 suppress emission of the comma to achieve that effect. */
10225 switch (i & -(ins.intel_syntax && dp))
10226 {
10227 case 2:
10228 if (dp->op[2].rtn == OP_Rounding && !intel_swap_2_3)
10229 needcomma = 0;
10230 break;
10231 case 3:
10232 if (dp->op[3].rtn == OP_Rounding || intel_swap_2_3)
10233 needcomma = 0;
10234 break;
10235 }
10236 if (needcomma)
10237 i386_dis_printf (&ins, dis_style_text, ",");
10238 if (ins.op_index[i] != -1 && !ins.op_riprel[i])
10239 {
10240 bfd_vma target = (bfd_vma) ins.op_address[ins.op_index[i]];
10241
10242 if (ins.op_is_jump)
10243 {
10244 info->insn_info_valid = 1;
10245 info->branch_delay_insns = 0;
10246 info->data_size = 0;
10247 info->target = target;
10248 info->target2 = 0;
10249 }
10250 (*info->print_address_func) (target, info);
10251 }
10252 else
10253 i386_dis_printf (&ins, dis_style_text, "%s", op_txt[i]);
10254 needcomma = 1;
10255 }
10256
10257 for (i = 0; i < MAX_OPERANDS; i++)
10258 if (ins.op_index[i] != -1 && ins.op_riprel[i])
10259 {
10260 i386_dis_printf (&ins, dis_style_comment_start, " # ");
10261 (*info->print_address_func)
10262 ((bfd_vma)(ins.start_pc + (ins.codep - ins.start_codep)
10263 + ins.op_address[ins.op_index[i]]),
10264 info);
10265 break;
10266 }
10267 return ins.codep - priv.the_buffer;
10268 }
10269
10270 /* Here for backwards compatibility. When gdb stops using
10271 print_insn_i386_att and print_insn_i386_intel these functions can
10272 disappear, and print_insn_i386 be merged into print_insn. */
10273 int
10274 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10275 {
10276 return print_insn (pc, info, 0);
10277 }
10278
10279 int
10280 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10281 {
10282 return print_insn (pc, info, 1);
10283 }
10284
10285 int
10286 print_insn_i386 (bfd_vma pc, disassemble_info *info)
10287 {
10288 return print_insn (pc, info, -1);
10289 }
10290
10291 static const char *float_mem[] = {
10292 /* d8 */
10293 "fadd{s|}",
10294 "fmul{s|}",
10295 "fcom{s|}",
10296 "fcomp{s|}",
10297 "fsub{s|}",
10298 "fsubr{s|}",
10299 "fdiv{s|}",
10300 "fdivr{s|}",
10301 /* d9 */
10302 "fld{s|}",
10303 "(bad)",
10304 "fst{s|}",
10305 "fstp{s|}",
10306 "fldenv{C|C}",
10307 "fldcw",
10308 "fNstenv{C|C}",
10309 "fNstcw",
10310 /* da */
10311 "fiadd{l|}",
10312 "fimul{l|}",
10313 "ficom{l|}",
10314 "ficomp{l|}",
10315 "fisub{l|}",
10316 "fisubr{l|}",
10317 "fidiv{l|}",
10318 "fidivr{l|}",
10319 /* db */
10320 "fild{l|}",
10321 "fisttp{l|}",
10322 "fist{l|}",
10323 "fistp{l|}",
10324 "(bad)",
10325 "fld{t|}",
10326 "(bad)",
10327 "fstp{t|}",
10328 /* dc */
10329 "fadd{l|}",
10330 "fmul{l|}",
10331 "fcom{l|}",
10332 "fcomp{l|}",
10333 "fsub{l|}",
10334 "fsubr{l|}",
10335 "fdiv{l|}",
10336 "fdivr{l|}",
10337 /* dd */
10338 "fld{l|}",
10339 "fisttp{ll|}",
10340 "fst{l||}",
10341 "fstp{l|}",
10342 "frstor{C|C}",
10343 "(bad)",
10344 "fNsave{C|C}",
10345 "fNstsw",
10346 /* de */
10347 "fiadd{s|}",
10348 "fimul{s|}",
10349 "ficom{s|}",
10350 "ficomp{s|}",
10351 "fisub{s|}",
10352 "fisubr{s|}",
10353 "fidiv{s|}",
10354 "fidivr{s|}",
10355 /* df */
10356 "fild{s|}",
10357 "fisttp{s|}",
10358 "fist{s|}",
10359 "fistp{s|}",
10360 "fbld",
10361 "fild{ll|}",
10362 "fbstp",
10363 "fistp{ll|}",
10364 };
10365
10366 static const unsigned char float_mem_mode[] = {
10367 /* d8 */
10368 d_mode,
10369 d_mode,
10370 d_mode,
10371 d_mode,
10372 d_mode,
10373 d_mode,
10374 d_mode,
10375 d_mode,
10376 /* d9 */
10377 d_mode,
10378 0,
10379 d_mode,
10380 d_mode,
10381 0,
10382 w_mode,
10383 0,
10384 w_mode,
10385 /* da */
10386 d_mode,
10387 d_mode,
10388 d_mode,
10389 d_mode,
10390 d_mode,
10391 d_mode,
10392 d_mode,
10393 d_mode,
10394 /* db */
10395 d_mode,
10396 d_mode,
10397 d_mode,
10398 d_mode,
10399 0,
10400 t_mode,
10401 0,
10402 t_mode,
10403 /* dc */
10404 q_mode,
10405 q_mode,
10406 q_mode,
10407 q_mode,
10408 q_mode,
10409 q_mode,
10410 q_mode,
10411 q_mode,
10412 /* dd */
10413 q_mode,
10414 q_mode,
10415 q_mode,
10416 q_mode,
10417 0,
10418 0,
10419 0,
10420 w_mode,
10421 /* de */
10422 w_mode,
10423 w_mode,
10424 w_mode,
10425 w_mode,
10426 w_mode,
10427 w_mode,
10428 w_mode,
10429 w_mode,
10430 /* df */
10431 w_mode,
10432 w_mode,
10433 w_mode,
10434 w_mode,
10435 t_mode,
10436 q_mode,
10437 t_mode,
10438 q_mode
10439 };
10440
10441 #define ST { OP_ST, 0 }
10442 #define STi { OP_STi, 0 }
10443
10444 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10445 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10446 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10447 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10448 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10449 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
10450 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10451 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
10452 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10453
10454 static const struct dis386 float_reg[][8] = {
10455 /* d8 */
10456 {
10457 { "fadd", { ST, STi }, 0 },
10458 { "fmul", { ST, STi }, 0 },
10459 { "fcom", { STi }, 0 },
10460 { "fcomp", { STi }, 0 },
10461 { "fsub", { ST, STi }, 0 },
10462 { "fsubr", { ST, STi }, 0 },
10463 { "fdiv", { ST, STi }, 0 },
10464 { "fdivr", { ST, STi }, 0 },
10465 },
10466 /* d9 */
10467 {
10468 { "fld", { STi }, 0 },
10469 { "fxch", { STi }, 0 },
10470 { FGRPd9_2 },
10471 { Bad_Opcode },
10472 { FGRPd9_4 },
10473 { FGRPd9_5 },
10474 { FGRPd9_6 },
10475 { FGRPd9_7 },
10476 },
10477 /* da */
10478 {
10479 { "fcmovb", { ST, STi }, 0 },
10480 { "fcmove", { ST, STi }, 0 },
10481 { "fcmovbe",{ ST, STi }, 0 },
10482 { "fcmovu", { ST, STi }, 0 },
10483 { Bad_Opcode },
10484 { FGRPda_5 },
10485 { Bad_Opcode },
10486 { Bad_Opcode },
10487 },
10488 /* db */
10489 {
10490 { "fcmovnb",{ ST, STi }, 0 },
10491 { "fcmovne",{ ST, STi }, 0 },
10492 { "fcmovnbe",{ ST, STi }, 0 },
10493 { "fcmovnu",{ ST, STi }, 0 },
10494 { FGRPdb_4 },
10495 { "fucomi", { ST, STi }, 0 },
10496 { "fcomi", { ST, STi }, 0 },
10497 { Bad_Opcode },
10498 },
10499 /* dc */
10500 {
10501 { "fadd", { STi, ST }, 0 },
10502 { "fmul", { STi, ST }, 0 },
10503 { Bad_Opcode },
10504 { Bad_Opcode },
10505 { "fsub{!M|r}", { STi, ST }, 0 },
10506 { "fsub{M|}", { STi, ST }, 0 },
10507 { "fdiv{!M|r}", { STi, ST }, 0 },
10508 { "fdiv{M|}", { STi, ST }, 0 },
10509 },
10510 /* dd */
10511 {
10512 { "ffree", { STi }, 0 },
10513 { Bad_Opcode },
10514 { "fst", { STi }, 0 },
10515 { "fstp", { STi }, 0 },
10516 { "fucom", { STi }, 0 },
10517 { "fucomp", { STi }, 0 },
10518 { Bad_Opcode },
10519 { Bad_Opcode },
10520 },
10521 /* de */
10522 {
10523 { "faddp", { STi, ST }, 0 },
10524 { "fmulp", { STi, ST }, 0 },
10525 { Bad_Opcode },
10526 { FGRPde_3 },
10527 { "fsub{!M|r}p", { STi, ST }, 0 },
10528 { "fsub{M|}p", { STi, ST }, 0 },
10529 { "fdiv{!M|r}p", { STi, ST }, 0 },
10530 { "fdiv{M|}p", { STi, ST }, 0 },
10531 },
10532 /* df */
10533 {
10534 { "ffreep", { STi }, 0 },
10535 { Bad_Opcode },
10536 { Bad_Opcode },
10537 { Bad_Opcode },
10538 { FGRPdf_4 },
10539 { "fucomip", { ST, STi }, 0 },
10540 { "fcomip", { ST, STi }, 0 },
10541 { Bad_Opcode },
10542 },
10543 };
10544
10545 static const char *const fgrps[][8] = {
10546 /* Bad opcode 0 */
10547 {
10548 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10549 },
10550
10551 /* d9_2 1 */
10552 {
10553 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10554 },
10555
10556 /* d9_4 2 */
10557 {
10558 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10559 },
10560
10561 /* d9_5 3 */
10562 {
10563 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10564 },
10565
10566 /* d9_6 4 */
10567 {
10568 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10569 },
10570
10571 /* d9_7 5 */
10572 {
10573 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10574 },
10575
10576 /* da_5 6 */
10577 {
10578 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10579 },
10580
10581 /* db_4 7 */
10582 {
10583 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10584 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10585 },
10586
10587 /* de_3 8 */
10588 {
10589 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10590 },
10591
10592 /* df_4 9 */
10593 {
10594 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10595 },
10596 };
10597
10598 static void
10599 swap_operand (instr_info *ins)
10600 {
10601 ins->mnemonicendp[0] = '.';
10602 ins->mnemonicendp[1] = 's';
10603 ins->mnemonicendp[2] = '\0';
10604 ins->mnemonicendp += 2;
10605 }
10606
10607 static bool
10608 OP_Skip_MODRM (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10609 int sizeflag ATTRIBUTE_UNUSED)
10610 {
10611 /* Skip mod/rm byte. */
10612 MODRM_CHECK;
10613 ins->codep++;
10614 return true;
10615 }
10616
10617 static bool
10618 dofloat (instr_info *ins, int sizeflag)
10619 {
10620 const struct dis386 *dp;
10621 unsigned char floatop;
10622
10623 floatop = ins->codep[-1];
10624
10625 if (ins->modrm.mod != 3)
10626 {
10627 int fp_indx = (floatop - 0xd8) * 8 + ins->modrm.reg;
10628
10629 putop (ins, float_mem[fp_indx], sizeflag);
10630 ins->obufp = ins->op_out[0];
10631 ins->op_ad = 2;
10632 return OP_E (ins, float_mem_mode[fp_indx], sizeflag);
10633 }
10634 /* Skip mod/rm byte. */
10635 MODRM_CHECK;
10636 ins->codep++;
10637
10638 dp = &float_reg[floatop - 0xd8][ins->modrm.reg];
10639 if (dp->name == NULL)
10640 {
10641 putop (ins, fgrps[dp->op[0].bytemode][ins->modrm.rm], sizeflag);
10642
10643 /* Instruction fnstsw is only one with strange arg. */
10644 if (floatop == 0xdf && ins->codep[-1] == 0xe0)
10645 strcpy (ins->op_out[0], att_names16[0] + ins->intel_syntax);
10646 }
10647 else
10648 {
10649 putop (ins, dp->name, sizeflag);
10650
10651 ins->obufp = ins->op_out[0];
10652 ins->op_ad = 2;
10653 if (dp->op[0].rtn
10654 && !dp->op[0].rtn (ins, dp->op[0].bytemode, sizeflag))
10655 return false;
10656
10657 ins->obufp = ins->op_out[1];
10658 ins->op_ad = 1;
10659 if (dp->op[1].rtn
10660 && !dp->op[1].rtn (ins, dp->op[1].bytemode, sizeflag))
10661 return false;
10662 }
10663 return true;
10664 }
10665
10666 static bool
10667 OP_ST (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10668 int sizeflag ATTRIBUTE_UNUSED)
10669 {
10670 oappend_register (ins, "%st");
10671 return true;
10672 }
10673
10674 static bool
10675 OP_STi (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10676 int sizeflag ATTRIBUTE_UNUSED)
10677 {
10678 char scratch[8];
10679 int res = snprintf (scratch, ARRAY_SIZE (scratch), "%%st(%d)", ins->modrm.rm);
10680
10681 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
10682 abort ();
10683 oappend_register (ins, scratch);
10684 return true;
10685 }
10686
10687 /* Capital letters in template are macros. */
10688 static int
10689 putop (instr_info *ins, const char *in_template, int sizeflag)
10690 {
10691 const char *p;
10692 int alt = 0;
10693 int cond = 1;
10694 unsigned int l = 0, len = 0;
10695 char last[4];
10696
10697 for (p = in_template; *p; p++)
10698 {
10699 if (len > l)
10700 {
10701 if (l >= sizeof (last) || !ISUPPER (*p))
10702 abort ();
10703 last[l++] = *p;
10704 continue;
10705 }
10706 switch (*p)
10707 {
10708 default:
10709 *ins->obufp++ = *p;
10710 break;
10711 case '%':
10712 len++;
10713 break;
10714 case '!':
10715 cond = 0;
10716 break;
10717 case '{':
10718 if (ins->intel_syntax)
10719 {
10720 while (*++p != '|')
10721 if (*p == '}' || *p == '\0')
10722 abort ();
10723 alt = 1;
10724 }
10725 break;
10726 case '|':
10727 while (*++p != '}')
10728 {
10729 if (*p == '\0')
10730 abort ();
10731 }
10732 break;
10733 case '}':
10734 alt = 0;
10735 break;
10736 case 'A':
10737 if (ins->intel_syntax)
10738 break;
10739 if ((ins->need_modrm && ins->modrm.mod != 3)
10740 || (sizeflag & SUFFIX_ALWAYS))
10741 *ins->obufp++ = 'b';
10742 break;
10743 case 'B':
10744 if (l == 0)
10745 {
10746 case_B:
10747 if (ins->intel_syntax)
10748 break;
10749 if (sizeflag & SUFFIX_ALWAYS)
10750 *ins->obufp++ = 'b';
10751 }
10752 else if (l == 1 && last[0] == 'L')
10753 {
10754 if (ins->address_mode == mode_64bit
10755 && !(ins->prefixes & PREFIX_ADDR))
10756 {
10757 *ins->obufp++ = 'a';
10758 *ins->obufp++ = 'b';
10759 *ins->obufp++ = 's';
10760 }
10761
10762 goto case_B;
10763 }
10764 else
10765 abort ();
10766 break;
10767 case 'C':
10768 if (ins->intel_syntax && !alt)
10769 break;
10770 if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10771 {
10772 if (sizeflag & DFLAG)
10773 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10774 else
10775 *ins->obufp++ = ins->intel_syntax ? 'w' : 's';
10776 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10777 }
10778 break;
10779 case 'D':
10780 if (l == 1)
10781 {
10782 switch (last[0])
10783 {
10784 case 'X':
10785 if (!ins->vex.evex || ins->vex.w)
10786 *ins->obufp++ = 'd';
10787 else
10788 oappend (ins, "{bad}");
10789 break;
10790 default:
10791 abort ();
10792 }
10793 break;
10794 }
10795 if (l)
10796 abort ();
10797 if (ins->intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10798 break;
10799 USED_REX (REX_W);
10800 if (ins->modrm.mod == 3)
10801 {
10802 if (ins->rex & REX_W)
10803 *ins->obufp++ = 'q';
10804 else
10805 {
10806 if (sizeflag & DFLAG)
10807 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10808 else
10809 *ins->obufp++ = 'w';
10810 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10811 }
10812 }
10813 else
10814 *ins->obufp++ = 'w';
10815 break;
10816 case 'E':
10817 if (l == 1)
10818 {
10819 switch (last[0])
10820 {
10821 case 'X':
10822 if (!ins->vex.evex || ins->vex.b || ins->vex.ll >= 2
10823 || !ins->vex.r
10824 || (ins->modrm.mod == 3 && (ins->rex & REX_X))
10825 || !ins->vex.v || ins->vex.mask_register_specifier)
10826 break;
10827 /* AVX512 extends a number of V*D insns to also have V*Q variants,
10828 merely distinguished by EVEX.W. Look for a use of the
10829 respective macro. */
10830 if (ins->vex.w)
10831 {
10832 const char *pct = strchr (p + 1, '%');
10833
10834 if (pct != NULL && pct[1] == 'D' && pct[2] == 'Q')
10835 break;
10836 }
10837 *ins->obufp++ = '{';
10838 *ins->obufp++ = 'e';
10839 *ins->obufp++ = 'v';
10840 *ins->obufp++ = 'e';
10841 *ins->obufp++ = 'x';
10842 *ins->obufp++ = '}';
10843 *ins->obufp++ = ' ';
10844 break;
10845 default:
10846 abort ();
10847 }
10848 break;
10849 }
10850 /* For jcxz/jecxz */
10851 if (ins->address_mode == mode_64bit)
10852 {
10853 if (sizeflag & AFLAG)
10854 *ins->obufp++ = 'r';
10855 else
10856 *ins->obufp++ = 'e';
10857 }
10858 else
10859 if (sizeflag & AFLAG)
10860 *ins->obufp++ = 'e';
10861 ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
10862 break;
10863 case 'F':
10864 if (ins->intel_syntax)
10865 break;
10866 if ((ins->prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
10867 {
10868 if (sizeflag & AFLAG)
10869 *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
10870 else
10871 *ins->obufp++ = ins->address_mode == mode_64bit ? 'l' : 'w';
10872 ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
10873 }
10874 break;
10875 case 'G':
10876 if (ins->intel_syntax || (ins->obufp[-1] != 's'
10877 && !(sizeflag & SUFFIX_ALWAYS)))
10878 break;
10879 if ((ins->rex & REX_W) || (sizeflag & DFLAG))
10880 *ins->obufp++ = 'l';
10881 else
10882 *ins->obufp++ = 'w';
10883 if (!(ins->rex & REX_W))
10884 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10885 break;
10886 case 'H':
10887 if (l == 0)
10888 {
10889 if (ins->intel_syntax)
10890 break;
10891 if ((ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10892 || (ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10893 {
10894 ins->used_prefixes |= ins->prefixes & (PREFIX_CS | PREFIX_DS);
10895 *ins->obufp++ = ',';
10896 *ins->obufp++ = 'p';
10897
10898 /* Set active_seg_prefix even if not set in 64-bit mode
10899 because here it is a valid branch hint. */
10900 if (ins->prefixes & PREFIX_DS)
10901 {
10902 ins->active_seg_prefix = PREFIX_DS;
10903 *ins->obufp++ = 't';
10904 }
10905 else
10906 {
10907 ins->active_seg_prefix = PREFIX_CS;
10908 *ins->obufp++ = 'n';
10909 }
10910 }
10911 }
10912 else if (l == 1 && last[0] == 'X')
10913 {
10914 if (!ins->vex.w)
10915 *ins->obufp++ = 'h';
10916 else
10917 oappend (ins, "{bad}");
10918 }
10919 else
10920 abort ();
10921 break;
10922 case 'K':
10923 USED_REX (REX_W);
10924 if (ins->rex & REX_W)
10925 *ins->obufp++ = 'q';
10926 else
10927 *ins->obufp++ = 'd';
10928 break;
10929 case 'L':
10930 abort ();
10931 case 'M':
10932 if (ins->intel_mnemonic != cond)
10933 *ins->obufp++ = 'r';
10934 break;
10935 case 'N':
10936 if ((ins->prefixes & PREFIX_FWAIT) == 0)
10937 *ins->obufp++ = 'n';
10938 else
10939 ins->used_prefixes |= PREFIX_FWAIT;
10940 break;
10941 case 'O':
10942 USED_REX (REX_W);
10943 if (ins->rex & REX_W)
10944 *ins->obufp++ = 'o';
10945 else if (ins->intel_syntax && (sizeflag & DFLAG))
10946 *ins->obufp++ = 'q';
10947 else
10948 *ins->obufp++ = 'd';
10949 if (!(ins->rex & REX_W))
10950 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10951 break;
10952 case '@':
10953 if (ins->address_mode == mode_64bit
10954 && (ins->isa64 == intel64 || (ins->rex & REX_W)
10955 || !(ins->prefixes & PREFIX_DATA)))
10956 {
10957 if (sizeflag & SUFFIX_ALWAYS)
10958 *ins->obufp++ = 'q';
10959 break;
10960 }
10961 /* Fall through. */
10962 case 'P':
10963 if (l == 0)
10964 {
10965 if ((ins->modrm.mod == 3 || !cond)
10966 && !(sizeflag & SUFFIX_ALWAYS))
10967 break;
10968 /* Fall through. */
10969 case 'T':
10970 if ((!(ins->rex & REX_W) && (ins->prefixes & PREFIX_DATA))
10971 || ((sizeflag & SUFFIX_ALWAYS)
10972 && ins->address_mode != mode_64bit))
10973 {
10974 *ins->obufp++ = (sizeflag & DFLAG)
10975 ? ins->intel_syntax ? 'd' : 'l' : 'w';
10976 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10977 }
10978 else if (sizeflag & SUFFIX_ALWAYS)
10979 *ins->obufp++ = 'q';
10980 }
10981 else if (l == 1 && last[0] == 'L')
10982 {
10983 if ((ins->prefixes & PREFIX_DATA)
10984 || (ins->rex & REX_W)
10985 || (sizeflag & SUFFIX_ALWAYS))
10986 {
10987 USED_REX (REX_W);
10988 if (ins->rex & REX_W)
10989 *ins->obufp++ = 'q';
10990 else
10991 {
10992 if (sizeflag & DFLAG)
10993 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10994 else
10995 *ins->obufp++ = 'w';
10996 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10997 }
10998 }
10999 }
11000 else
11001 abort ();
11002 break;
11003 case 'Q':
11004 if (l == 0)
11005 {
11006 if (ins->intel_syntax && !alt)
11007 break;
11008 USED_REX (REX_W);
11009 if ((ins->need_modrm && ins->modrm.mod != 3)
11010 || (sizeflag & SUFFIX_ALWAYS))
11011 {
11012 if (ins->rex & REX_W)
11013 *ins->obufp++ = 'q';
11014 else
11015 {
11016 if (sizeflag & DFLAG)
11017 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
11018 else
11019 *ins->obufp++ = 'w';
11020 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11021 }
11022 }
11023 }
11024 else if (l == 1 && last[0] == 'D')
11025 *ins->obufp++ = ins->vex.w ? 'q' : 'd';
11026 else if (l == 1 && last[0] == 'L')
11027 {
11028 if (cond ? ins->modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
11029 : ins->address_mode != mode_64bit)
11030 break;
11031 if ((ins->rex & REX_W))
11032 {
11033 USED_REX (REX_W);
11034 *ins->obufp++ = 'q';
11035 }
11036 else if ((ins->address_mode == mode_64bit && cond)
11037 || (sizeflag & SUFFIX_ALWAYS))
11038 *ins->obufp++ = ins->intel_syntax? 'd' : 'l';
11039 }
11040 else
11041 abort ();
11042 break;
11043 case 'R':
11044 USED_REX (REX_W);
11045 if (ins->rex & REX_W)
11046 *ins->obufp++ = 'q';
11047 else if (sizeflag & DFLAG)
11048 {
11049 if (ins->intel_syntax)
11050 *ins->obufp++ = 'd';
11051 else
11052 *ins->obufp++ = 'l';
11053 }
11054 else
11055 *ins->obufp++ = 'w';
11056 if (ins->intel_syntax && !p[1]
11057 && ((ins->rex & REX_W) || (sizeflag & DFLAG)))
11058 *ins->obufp++ = 'e';
11059 if (!(ins->rex & REX_W))
11060 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11061 break;
11062 case 'S':
11063 if (l == 0)
11064 {
11065 case_S:
11066 if (ins->intel_syntax)
11067 break;
11068 if (sizeflag & SUFFIX_ALWAYS)
11069 {
11070 if (ins->rex & REX_W)
11071 *ins->obufp++ = 'q';
11072 else
11073 {
11074 if (sizeflag & DFLAG)
11075 *ins->obufp++ = 'l';
11076 else
11077 *ins->obufp++ = 'w';
11078 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11079 }
11080 }
11081 break;
11082 }
11083 if (l != 1)
11084 abort ();
11085 switch (last[0])
11086 {
11087 case 'L':
11088 if (ins->address_mode == mode_64bit
11089 && !(ins->prefixes & PREFIX_ADDR))
11090 {
11091 *ins->obufp++ = 'a';
11092 *ins->obufp++ = 'b';
11093 *ins->obufp++ = 's';
11094 }
11095
11096 goto case_S;
11097 case 'X':
11098 if (!ins->vex.evex || !ins->vex.w)
11099 *ins->obufp++ = 's';
11100 else
11101 oappend (ins, "{bad}");
11102 break;
11103 default:
11104 abort ();
11105 }
11106 break;
11107 case 'V':
11108 if (l == 0)
11109 abort ();
11110 else if (l == 1)
11111 {
11112 switch (last[0])
11113 {
11114 case 'X':
11115 if (ins->vex.evex)
11116 break;
11117 *ins->obufp++ = '{';
11118 *ins->obufp++ = 'v';
11119 *ins->obufp++ = 'e';
11120 *ins->obufp++ = 'x';
11121 *ins->obufp++ = '}';
11122 *ins->obufp++ = ' ';
11123 break;
11124 case 'L':
11125 if (!(ins->rex & REX_W))
11126 break;
11127 *ins->obufp++ = 'a';
11128 *ins->obufp++ = 'b';
11129 *ins->obufp++ = 's';
11130 break;
11131 default:
11132 abort ();
11133 }
11134 }
11135 else
11136 abort ();
11137 goto case_S;
11138 case 'W':
11139 if (l == 0)
11140 {
11141 /* operand size flag for cwtl, cbtw */
11142 USED_REX (REX_W);
11143 if (ins->rex & REX_W)
11144 {
11145 if (ins->intel_syntax)
11146 *ins->obufp++ = 'd';
11147 else
11148 *ins->obufp++ = 'l';
11149 }
11150 else if (sizeflag & DFLAG)
11151 *ins->obufp++ = 'w';
11152 else
11153 *ins->obufp++ = 'b';
11154 if (!(ins->rex & REX_W))
11155 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11156 }
11157 else if (l == 1)
11158 {
11159 if (!ins->need_vex)
11160 abort ();
11161 if (last[0] == 'X')
11162 *ins->obufp++ = ins->vex.w ? 'd': 's';
11163 else if (last[0] == 'B')
11164 *ins->obufp++ = ins->vex.w ? 'w': 'b';
11165 else
11166 abort ();
11167 }
11168 else
11169 abort ();
11170 break;
11171 case 'X':
11172 if (l != 0)
11173 abort ();
11174 if (ins->need_vex
11175 ? ins->vex.prefix == DATA_PREFIX_OPCODE
11176 : ins->prefixes & PREFIX_DATA)
11177 {
11178 *ins->obufp++ = 'd';
11179 ins->used_prefixes |= PREFIX_DATA;
11180 }
11181 else
11182 *ins->obufp++ = 's';
11183 break;
11184 case 'Y':
11185 if (l == 1 && last[0] == 'X')
11186 {
11187 if (!ins->need_vex)
11188 abort ();
11189 if (ins->intel_syntax
11190 || ((ins->modrm.mod == 3 || ins->vex.b)
11191 && !(sizeflag & SUFFIX_ALWAYS)))
11192 break;
11193 switch (ins->vex.length)
11194 {
11195 case 128:
11196 *ins->obufp++ = 'x';
11197 break;
11198 case 256:
11199 *ins->obufp++ = 'y';
11200 break;
11201 case 512:
11202 if (!ins->vex.evex)
11203 default:
11204 abort ();
11205 }
11206 }
11207 else
11208 abort ();
11209 break;
11210 case 'Z':
11211 if (l == 0)
11212 {
11213 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
11214 ins->modrm.mod = 3;
11215 if (!ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
11216 *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
11217 }
11218 else if (l == 1 && last[0] == 'X')
11219 {
11220 if (!ins->vex.evex)
11221 abort ();
11222 if (ins->intel_syntax
11223 || ((ins->modrm.mod == 3 || ins->vex.b)
11224 && !(sizeflag & SUFFIX_ALWAYS)))
11225 break;
11226 switch (ins->vex.length)
11227 {
11228 case 128:
11229 *ins->obufp++ = 'x';
11230 break;
11231 case 256:
11232 *ins->obufp++ = 'y';
11233 break;
11234 case 512:
11235 *ins->obufp++ = 'z';
11236 break;
11237 default:
11238 abort ();
11239 }
11240 }
11241 else
11242 abort ();
11243 break;
11244 case '^':
11245 if (ins->intel_syntax)
11246 break;
11247 if (ins->isa64 == intel64 && (ins->rex & REX_W))
11248 {
11249 USED_REX (REX_W);
11250 *ins->obufp++ = 'q';
11251 break;
11252 }
11253 if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11254 {
11255 if (sizeflag & DFLAG)
11256 *ins->obufp++ = 'l';
11257 else
11258 *ins->obufp++ = 'w';
11259 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11260 }
11261 break;
11262 }
11263
11264 if (len == l)
11265 len = l = 0;
11266 }
11267 *ins->obufp = 0;
11268 ins->mnemonicendp = ins->obufp;
11269 return 0;
11270 }
11271
11272 /* Add a style marker to *INS->obufp that encodes STYLE. This assumes that
11273 the buffer pointed to by INS->obufp has space. A style marker is made
11274 from the STYLE_MARKER_CHAR followed by STYLE converted to a single hex
11275 digit, followed by another STYLE_MARKER_CHAR. This function assumes
11276 that the number of styles is not greater than 16. */
11277
11278 static void
11279 oappend_insert_style (instr_info *ins, enum disassembler_style style)
11280 {
11281 unsigned num = (unsigned) style;
11282
11283 /* We currently assume that STYLE can be encoded as a single hex
11284 character. If more styles are added then this might start to fail,
11285 and we'll need to expand this code. */
11286 if (num > 0xf)
11287 abort ();
11288
11289 *ins->obufp++ = STYLE_MARKER_CHAR;
11290 *ins->obufp++ = (num < 10 ? ('0' + num)
11291 : ((num < 16) ? ('a' + (num - 10)) : '0'));
11292 *ins->obufp++ = STYLE_MARKER_CHAR;
11293
11294 /* This final null character is not strictly necessary, after inserting a
11295 style marker we should always be inserting some additional content.
11296 However, having the buffer null terminated doesn't cost much, and make
11297 it easier to debug what's going on. Also, if we do ever forget to add
11298 any additional content after this style marker, then the buffer will
11299 still be well formed. */
11300 *ins->obufp = '\0';
11301 }
11302
11303 static void
11304 oappend_with_style (instr_info *ins, const char *s,
11305 enum disassembler_style style)
11306 {
11307 oappend_insert_style (ins, style);
11308 ins->obufp = stpcpy (ins->obufp, s);
11309 }
11310
11311 /* Like oappend_with_style but always with text style. */
11312
11313 static void
11314 oappend (instr_info *ins, const char *s)
11315 {
11316 oappend_with_style (ins, s, dis_style_text);
11317 }
11318
11319 /* Add a single character C to the buffer pointer to by INS->obufp, marking
11320 the style for the character as STYLE. */
11321
11322 static void
11323 oappend_char_with_style (instr_info *ins, const char c,
11324 enum disassembler_style style)
11325 {
11326 oappend_insert_style (ins, style);
11327 *ins->obufp++ = c;
11328 *ins->obufp = '\0';
11329 }
11330
11331 /* Like oappend_char_with_style, but always uses dis_style_text. */
11332
11333 static void
11334 oappend_char (instr_info *ins, const char c)
11335 {
11336 oappend_char_with_style (ins, c, dis_style_text);
11337 }
11338
11339 static void
11340 append_seg (instr_info *ins)
11341 {
11342 /* Only print the active segment register. */
11343 if (!ins->active_seg_prefix)
11344 return;
11345
11346 ins->used_prefixes |= ins->active_seg_prefix;
11347 switch (ins->active_seg_prefix)
11348 {
11349 case PREFIX_CS:
11350 oappend_register (ins, att_names_seg[1]);
11351 break;
11352 case PREFIX_DS:
11353 oappend_register (ins, att_names_seg[3]);
11354 break;
11355 case PREFIX_SS:
11356 oappend_register (ins, att_names_seg[2]);
11357 break;
11358 case PREFIX_ES:
11359 oappend_register (ins, att_names_seg[0]);
11360 break;
11361 case PREFIX_FS:
11362 oappend_register (ins, att_names_seg[4]);
11363 break;
11364 case PREFIX_GS:
11365 oappend_register (ins, att_names_seg[5]);
11366 break;
11367 default:
11368 break;
11369 }
11370 oappend_char (ins, ':');
11371 }
11372
11373 static bool
11374 OP_indirE (instr_info *ins, int bytemode, int sizeflag)
11375 {
11376 if (!ins->intel_syntax)
11377 oappend (ins, "*");
11378 return OP_E (ins, bytemode, sizeflag);
11379 }
11380
11381 static void
11382 print_operand_value (instr_info *ins, bfd_vma disp,
11383 enum disassembler_style style)
11384 {
11385 char tmp[30];
11386
11387 if (ins->address_mode == mode_64bit)
11388 sprintf (tmp, "0x%" PRIx64, (uint64_t) disp);
11389 else
11390 sprintf (tmp, "0x%x", (unsigned int) disp);
11391 oappend_with_style (ins, tmp, style);
11392 }
11393
11394 /* Like oappend, but called for immediate operands. */
11395
11396 static void
11397 oappend_immediate (instr_info *ins, bfd_vma imm)
11398 {
11399 if (!ins->intel_syntax)
11400 oappend_char_with_style (ins, '$', dis_style_immediate);
11401 print_operand_value (ins, imm, dis_style_immediate);
11402 }
11403
11404 /* Put DISP in BUF as signed hex number. */
11405
11406 static void
11407 print_displacement (instr_info *ins, bfd_signed_vma val)
11408 {
11409 char tmp[30];
11410
11411 if (val < 0)
11412 {
11413 oappend_char_with_style (ins, '-', dis_style_address_offset);
11414 val = (bfd_vma) 0 - val;
11415
11416 /* Check for possible overflow. */
11417 if (val < 0)
11418 {
11419 switch (ins->address_mode)
11420 {
11421 case mode_64bit:
11422 oappend_with_style (ins, "0x8000000000000000",
11423 dis_style_address_offset);
11424 break;
11425 case mode_32bit:
11426 oappend_with_style (ins, "0x80000000",
11427 dis_style_address_offset);
11428 break;
11429 case mode_16bit:
11430 oappend_with_style (ins, "0x8000",
11431 dis_style_address_offset);
11432 break;
11433 }
11434 return;
11435 }
11436 }
11437
11438 sprintf (tmp, "0x%" PRIx64, (int64_t) val);
11439 oappend_with_style (ins, tmp, dis_style_address_offset);
11440 }
11441
11442 static void
11443 intel_operand_size (instr_info *ins, int bytemode, int sizeflag)
11444 {
11445 if (ins->vex.b)
11446 {
11447 if (!ins->vex.no_broadcast)
11448 switch (bytemode)
11449 {
11450 case x_mode:
11451 case evex_half_bcst_xmmq_mode:
11452 if (ins->vex.w)
11453 oappend (ins, "QWORD BCST ");
11454 else
11455 oappend (ins, "DWORD BCST ");
11456 break;
11457 case xh_mode:
11458 case evex_half_bcst_xmmqh_mode:
11459 case evex_half_bcst_xmmqdh_mode:
11460 oappend (ins, "WORD BCST ");
11461 break;
11462 default:
11463 ins->vex.no_broadcast = true;
11464 break;
11465 }
11466 return;
11467 }
11468 switch (bytemode)
11469 {
11470 case b_mode:
11471 case b_swap_mode:
11472 case db_mode:
11473 oappend (ins, "BYTE PTR ");
11474 break;
11475 case w_mode:
11476 case w_swap_mode:
11477 case dw_mode:
11478 oappend (ins, "WORD PTR ");
11479 break;
11480 case indir_v_mode:
11481 if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
11482 {
11483 oappend (ins, "QWORD PTR ");
11484 break;
11485 }
11486 /* Fall through. */
11487 case stack_v_mode:
11488 if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
11489 || (ins->rex & REX_W)))
11490 {
11491 oappend (ins, "QWORD PTR ");
11492 break;
11493 }
11494 /* Fall through. */
11495 case v_mode:
11496 case v_swap_mode:
11497 case dq_mode:
11498 USED_REX (REX_W);
11499 if (ins->rex & REX_W)
11500 oappend (ins, "QWORD PTR ");
11501 else if (bytemode == dq_mode)
11502 oappend (ins, "DWORD PTR ");
11503 else
11504 {
11505 if (sizeflag & DFLAG)
11506 oappend (ins, "DWORD PTR ");
11507 else
11508 oappend (ins, "WORD PTR ");
11509 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11510 }
11511 break;
11512 case z_mode:
11513 if ((ins->rex & REX_W) || (sizeflag & DFLAG))
11514 *ins->obufp++ = 'D';
11515 oappend (ins, "WORD PTR ");
11516 if (!(ins->rex & REX_W))
11517 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11518 break;
11519 case a_mode:
11520 if (sizeflag & DFLAG)
11521 oappend (ins, "QWORD PTR ");
11522 else
11523 oappend (ins, "DWORD PTR ");
11524 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11525 break;
11526 case movsxd_mode:
11527 if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
11528 oappend (ins, "WORD PTR ");
11529 else
11530 oappend (ins, "DWORD PTR ");
11531 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11532 break;
11533 case d_mode:
11534 case d_swap_mode:
11535 oappend (ins, "DWORD PTR ");
11536 break;
11537 case q_mode:
11538 case q_swap_mode:
11539 oappend (ins, "QWORD PTR ");
11540 break;
11541 case m_mode:
11542 if (ins->address_mode == mode_64bit)
11543 oappend (ins, "QWORD PTR ");
11544 else
11545 oappend (ins, "DWORD PTR ");
11546 break;
11547 case f_mode:
11548 if (sizeflag & DFLAG)
11549 oappend (ins, "FWORD PTR ");
11550 else
11551 oappend (ins, "DWORD PTR ");
11552 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11553 break;
11554 case t_mode:
11555 oappend (ins, "TBYTE PTR ");
11556 break;
11557 case x_mode:
11558 case xh_mode:
11559 case x_swap_mode:
11560 case evex_x_gscat_mode:
11561 case evex_x_nobcst_mode:
11562 case bw_unit_mode:
11563 if (ins->need_vex)
11564 {
11565 switch (ins->vex.length)
11566 {
11567 case 128:
11568 oappend (ins, "XMMWORD PTR ");
11569 break;
11570 case 256:
11571 oappend (ins, "YMMWORD PTR ");
11572 break;
11573 case 512:
11574 oappend (ins, "ZMMWORD PTR ");
11575 break;
11576 default:
11577 abort ();
11578 }
11579 }
11580 else
11581 oappend (ins, "XMMWORD PTR ");
11582 break;
11583 case xmm_mode:
11584 oappend (ins, "XMMWORD PTR ");
11585 break;
11586 case ymm_mode:
11587 oappend (ins, "YMMWORD PTR ");
11588 break;
11589 case xmmq_mode:
11590 case evex_half_bcst_xmmqh_mode:
11591 case evex_half_bcst_xmmq_mode:
11592 if (!ins->need_vex)
11593 abort ();
11594
11595 switch (ins->vex.length)
11596 {
11597 case 128:
11598 oappend (ins, "QWORD PTR ");
11599 break;
11600 case 256:
11601 oappend (ins, "XMMWORD PTR ");
11602 break;
11603 case 512:
11604 oappend (ins, "YMMWORD PTR ");
11605 break;
11606 default:
11607 abort ();
11608 }
11609 break;
11610 case xmmdw_mode:
11611 if (!ins->need_vex)
11612 abort ();
11613
11614 switch (ins->vex.length)
11615 {
11616 case 128:
11617 oappend (ins, "WORD PTR ");
11618 break;
11619 case 256:
11620 oappend (ins, "DWORD PTR ");
11621 break;
11622 case 512:
11623 oappend (ins, "QWORD PTR ");
11624 break;
11625 default:
11626 abort ();
11627 }
11628 break;
11629 case xmmqd_mode:
11630 case evex_half_bcst_xmmqdh_mode:
11631 if (!ins->need_vex)
11632 abort ();
11633
11634 switch (ins->vex.length)
11635 {
11636 case 128:
11637 oappend (ins, "DWORD PTR ");
11638 break;
11639 case 256:
11640 oappend (ins, "QWORD PTR ");
11641 break;
11642 case 512:
11643 oappend (ins, "XMMWORD PTR ");
11644 break;
11645 default:
11646 abort ();
11647 }
11648 break;
11649 case ymmq_mode:
11650 if (!ins->need_vex)
11651 abort ();
11652
11653 switch (ins->vex.length)
11654 {
11655 case 128:
11656 oappend (ins, "QWORD PTR ");
11657 break;
11658 case 256:
11659 oappend (ins, "YMMWORD PTR ");
11660 break;
11661 case 512:
11662 oappend (ins, "ZMMWORD PTR ");
11663 break;
11664 default:
11665 abort ();
11666 }
11667 break;
11668 case o_mode:
11669 oappend (ins, "OWORD PTR ");
11670 break;
11671 case vex_vsib_d_w_dq_mode:
11672 case vex_vsib_q_w_dq_mode:
11673 if (!ins->need_vex)
11674 abort ();
11675 if (ins->vex.w)
11676 oappend (ins, "QWORD PTR ");
11677 else
11678 oappend (ins, "DWORD PTR ");
11679 break;
11680 case mask_bd_mode:
11681 if (!ins->need_vex || ins->vex.length != 128)
11682 abort ();
11683 if (ins->vex.w)
11684 oappend (ins, "DWORD PTR ");
11685 else
11686 oappend (ins, "BYTE PTR ");
11687 break;
11688 case mask_mode:
11689 if (!ins->need_vex)
11690 abort ();
11691 if (ins->vex.w)
11692 oappend (ins, "QWORD PTR ");
11693 else
11694 oappend (ins, "WORD PTR ");
11695 break;
11696 case v_bnd_mode:
11697 case v_bndmk_mode:
11698 default:
11699 break;
11700 }
11701 }
11702
11703 static void
11704 print_register (instr_info *ins, unsigned int reg, unsigned int rexmask,
11705 int bytemode, int sizeflag)
11706 {
11707 const char (*names)[8];
11708
11709 USED_REX (rexmask);
11710 if (ins->rex & rexmask)
11711 reg += 8;
11712
11713 switch (bytemode)
11714 {
11715 case b_mode:
11716 case b_swap_mode:
11717 if (reg & 4)
11718 USED_REX (0);
11719 if (ins->rex)
11720 names = att_names8rex;
11721 else
11722 names = att_names8;
11723 break;
11724 case w_mode:
11725 names = att_names16;
11726 break;
11727 case d_mode:
11728 case dw_mode:
11729 case db_mode:
11730 names = att_names32;
11731 break;
11732 case q_mode:
11733 names = att_names64;
11734 break;
11735 case m_mode:
11736 case v_bnd_mode:
11737 names = ins->address_mode == mode_64bit ? att_names64 : att_names32;
11738 break;
11739 case bnd_mode:
11740 case bnd_swap_mode:
11741 if (reg > 0x3)
11742 {
11743 oappend (ins, "(bad)");
11744 return;
11745 }
11746 names = att_names_bnd;
11747 break;
11748 case indir_v_mode:
11749 if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
11750 {
11751 names = att_names64;
11752 break;
11753 }
11754 /* Fall through. */
11755 case stack_v_mode:
11756 if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
11757 || (ins->rex & REX_W)))
11758 {
11759 names = att_names64;
11760 break;
11761 }
11762 bytemode = v_mode;
11763 /* Fall through. */
11764 case v_mode:
11765 case v_swap_mode:
11766 case dq_mode:
11767 USED_REX (REX_W);
11768 if (ins->rex & REX_W)
11769 names = att_names64;
11770 else if (bytemode != v_mode && bytemode != v_swap_mode)
11771 names = att_names32;
11772 else
11773 {
11774 if (sizeflag & DFLAG)
11775 names = att_names32;
11776 else
11777 names = att_names16;
11778 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11779 }
11780 break;
11781 case movsxd_mode:
11782 if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
11783 names = att_names16;
11784 else
11785 names = att_names32;
11786 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11787 break;
11788 case va_mode:
11789 names = (ins->address_mode == mode_64bit
11790 ? att_names64 : att_names32);
11791 if (!(ins->prefixes & PREFIX_ADDR))
11792 names = (ins->address_mode == mode_16bit
11793 ? att_names16 : names);
11794 else
11795 {
11796 /* Remove "addr16/addr32". */
11797 ins->all_prefixes[ins->last_addr_prefix] = 0;
11798 names = (ins->address_mode != mode_32bit
11799 ? att_names32 : att_names16);
11800 ins->used_prefixes |= PREFIX_ADDR;
11801 }
11802 break;
11803 case mask_bd_mode:
11804 case mask_mode:
11805 if (reg > 0x7)
11806 {
11807 oappend (ins, "(bad)");
11808 return;
11809 }
11810 names = att_names_mask;
11811 break;
11812 case 0:
11813 return;
11814 default:
11815 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
11816 return;
11817 }
11818 oappend_register (ins, names[reg]);
11819 }
11820
11821 static bool
11822 OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
11823 {
11824 int add = (ins->rex & REX_B) ? 8 : 0;
11825 int riprel = 0;
11826 int shift;
11827
11828 if (ins->vex.evex)
11829 {
11830 switch (bytemode)
11831 {
11832 case dw_mode:
11833 case w_mode:
11834 case w_swap_mode:
11835 shift = 1;
11836 break;
11837 case db_mode:
11838 case b_mode:
11839 shift = 0;
11840 break;
11841 case dq_mode:
11842 if (ins->address_mode != mode_64bit)
11843 {
11844 case d_mode:
11845 case d_swap_mode:
11846 shift = 2;
11847 break;
11848 }
11849 /* fall through */
11850 case vex_vsib_d_w_dq_mode:
11851 case vex_vsib_q_w_dq_mode:
11852 case evex_x_gscat_mode:
11853 shift = ins->vex.w ? 3 : 2;
11854 break;
11855 case xh_mode:
11856 case evex_half_bcst_xmmqh_mode:
11857 case evex_half_bcst_xmmqdh_mode:
11858 if (ins->vex.b)
11859 {
11860 shift = ins->vex.w ? 2 : 1;
11861 break;
11862 }
11863 /* Fall through. */
11864 case x_mode:
11865 case evex_half_bcst_xmmq_mode:
11866 if (ins->vex.b)
11867 {
11868 shift = ins->vex.w ? 3 : 2;
11869 break;
11870 }
11871 /* Fall through. */
11872 case xmmqd_mode:
11873 case xmmdw_mode:
11874 case xmmq_mode:
11875 case ymmq_mode:
11876 case evex_x_nobcst_mode:
11877 case x_swap_mode:
11878 switch (ins->vex.length)
11879 {
11880 case 128:
11881 shift = 4;
11882 break;
11883 case 256:
11884 shift = 5;
11885 break;
11886 case 512:
11887 shift = 6;
11888 break;
11889 default:
11890 abort ();
11891 }
11892 /* Make necessary corrections to shift for modes that need it. */
11893 if (bytemode == xmmq_mode
11894 || bytemode == evex_half_bcst_xmmqh_mode
11895 || bytemode == evex_half_bcst_xmmq_mode
11896 || (bytemode == ymmq_mode && ins->vex.length == 128))
11897 shift -= 1;
11898 else if (bytemode == xmmqd_mode
11899 || bytemode == evex_half_bcst_xmmqdh_mode)
11900 shift -= 2;
11901 else if (bytemode == xmmdw_mode)
11902 shift -= 3;
11903 break;
11904 case ymm_mode:
11905 shift = 5;
11906 break;
11907 case xmm_mode:
11908 shift = 4;
11909 break;
11910 case q_mode:
11911 case q_swap_mode:
11912 shift = 3;
11913 break;
11914 case bw_unit_mode:
11915 shift = ins->vex.w ? 1 : 0;
11916 break;
11917 default:
11918 abort ();
11919 }
11920 }
11921 else
11922 shift = 0;
11923
11924 USED_REX (REX_B);
11925 if (ins->intel_syntax)
11926 intel_operand_size (ins, bytemode, sizeflag);
11927 append_seg (ins);
11928
11929 if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
11930 {
11931 /* 32/64 bit address mode */
11932 bfd_signed_vma disp = 0;
11933 int havedisp;
11934 int havebase;
11935 int needindex;
11936 int needaddr32;
11937 int base, rbase;
11938 int vindex = 0;
11939 int scale = 0;
11940 int addr32flag = !((sizeflag & AFLAG)
11941 || bytemode == v_bnd_mode
11942 || bytemode == v_bndmk_mode
11943 || bytemode == bnd_mode
11944 || bytemode == bnd_swap_mode);
11945 bool check_gather = false;
11946 const char (*indexes)[8] = NULL;
11947
11948 havebase = 1;
11949 base = ins->modrm.rm;
11950
11951 if (base == 4)
11952 {
11953 vindex = ins->sib.index;
11954 USED_REX (REX_X);
11955 if (ins->rex & REX_X)
11956 vindex += 8;
11957 switch (bytemode)
11958 {
11959 case vex_vsib_d_w_dq_mode:
11960 case vex_vsib_q_w_dq_mode:
11961 if (!ins->need_vex)
11962 abort ();
11963 if (ins->vex.evex)
11964 {
11965 if (!ins->vex.v)
11966 vindex += 16;
11967 check_gather = ins->obufp == ins->op_out[1];
11968 }
11969
11970 switch (ins->vex.length)
11971 {
11972 case 128:
11973 indexes = att_names_xmm;
11974 break;
11975 case 256:
11976 if (!ins->vex.w
11977 || bytemode == vex_vsib_q_w_dq_mode)
11978 indexes = att_names_ymm;
11979 else
11980 indexes = att_names_xmm;
11981 break;
11982 case 512:
11983 if (!ins->vex.w
11984 || bytemode == vex_vsib_q_w_dq_mode)
11985 indexes = att_names_zmm;
11986 else
11987 indexes = att_names_ymm;
11988 break;
11989 default:
11990 abort ();
11991 }
11992 break;
11993 default:
11994 if (vindex != 4)
11995 indexes = ins->address_mode == mode_64bit && !addr32flag
11996 ? att_names64 : att_names32;
11997 break;
11998 }
11999 scale = ins->sib.scale;
12000 base = ins->sib.base;
12001 ins->codep++;
12002 }
12003 else
12004 {
12005 /* Check for mandatory SIB. */
12006 if (bytemode == vex_vsib_d_w_dq_mode
12007 || bytemode == vex_vsib_q_w_dq_mode
12008 || bytemode == vex_sibmem_mode)
12009 {
12010 oappend (ins, "(bad)");
12011 return true;
12012 }
12013 }
12014 rbase = base + add;
12015
12016 switch (ins->modrm.mod)
12017 {
12018 case 0:
12019 if (base == 5)
12020 {
12021 havebase = 0;
12022 if (ins->address_mode == mode_64bit && !ins->has_sib)
12023 riprel = 1;
12024 if (!get32s (ins, &disp))
12025 return false;
12026 if (riprel && bytemode == v_bndmk_mode)
12027 {
12028 oappend (ins, "(bad)");
12029 return true;
12030 }
12031 }
12032 break;
12033 case 1:
12034 if (!fetch_code (ins->info, ins->codep + 1))
12035 return false;
12036 disp = *ins->codep++;
12037 if ((disp & 0x80) != 0)
12038 disp -= 0x100;
12039 if (ins->vex.evex && shift > 0)
12040 disp <<= shift;
12041 break;
12042 case 2:
12043 if (!get32s (ins, &disp))
12044 return false;
12045 break;
12046 }
12047
12048 needindex = 0;
12049 needaddr32 = 0;
12050 if (ins->has_sib
12051 && !havebase
12052 && !indexes
12053 && ins->address_mode != mode_16bit)
12054 {
12055 if (ins->address_mode == mode_64bit)
12056 {
12057 if (addr32flag)
12058 {
12059 /* Without base nor index registers, zero-extend the
12060 lower 32-bit displacement to 64 bits. */
12061 disp = (unsigned int) disp;
12062 needindex = 1;
12063 }
12064 needaddr32 = 1;
12065 }
12066 else
12067 {
12068 /* In 32-bit mode, we need index register to tell [offset]
12069 from [eiz*1 + offset]. */
12070 needindex = 1;
12071 }
12072 }
12073
12074 havedisp = (havebase
12075 || needindex
12076 || (ins->has_sib && (indexes || scale != 0)));
12077
12078 if (!ins->intel_syntax)
12079 if (ins->modrm.mod != 0 || base == 5)
12080 {
12081 if (havedisp || riprel)
12082 print_displacement (ins, disp);
12083 else
12084 print_operand_value (ins, disp, dis_style_address_offset);
12085 if (riprel)
12086 {
12087 set_op (ins, disp, true);
12088 oappend_char (ins, '(');
12089 oappend_with_style (ins, !addr32flag ? "%rip" : "%eip",
12090 dis_style_register);
12091 oappend_char (ins, ')');
12092 }
12093 }
12094
12095 if ((havebase || indexes || needindex || needaddr32 || riprel)
12096 && (ins->address_mode != mode_64bit
12097 || ((bytemode != v_bnd_mode)
12098 && (bytemode != v_bndmk_mode)
12099 && (bytemode != bnd_mode)
12100 && (bytemode != bnd_swap_mode))))
12101 ins->used_prefixes |= PREFIX_ADDR;
12102
12103 if (havedisp || (ins->intel_syntax && riprel))
12104 {
12105 oappend_char (ins, ins->open_char);
12106 if (ins->intel_syntax && riprel)
12107 {
12108 set_op (ins, disp, true);
12109 oappend_with_style (ins, !addr32flag ? "rip" : "eip",
12110 dis_style_register);
12111 }
12112 if (havebase)
12113 oappend_register
12114 (ins,
12115 (ins->address_mode == mode_64bit && !addr32flag
12116 ? att_names64 : att_names32)[rbase]);
12117 if (ins->has_sib)
12118 {
12119 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
12120 print index to tell base + index from base. */
12121 if (scale != 0
12122 || needindex
12123 || indexes
12124 || (havebase && base != ESP_REG_NUM))
12125 {
12126 if (!ins->intel_syntax || havebase)
12127 oappend_char (ins, ins->separator_char);
12128 if (indexes)
12129 {
12130 if (ins->address_mode == mode_64bit || vindex < 16)
12131 oappend_register (ins, indexes[vindex]);
12132 else
12133 oappend (ins, "(bad)");
12134 }
12135 else
12136 oappend_register (ins,
12137 ins->address_mode == mode_64bit
12138 && !addr32flag
12139 ? att_index64
12140 : att_index32);
12141
12142 oappend_char (ins, ins->scale_char);
12143 oappend_char_with_style (ins, '0' + (1 << scale),
12144 dis_style_immediate);
12145 }
12146 }
12147 if (ins->intel_syntax
12148 && (disp || ins->modrm.mod != 0 || base == 5))
12149 {
12150 if (!havedisp || disp >= 0)
12151 oappend_char (ins, '+');
12152 if (havedisp)
12153 print_displacement (ins, disp);
12154 else
12155 print_operand_value (ins, disp, dis_style_address_offset);
12156 }
12157
12158 oappend_char (ins, ins->close_char);
12159
12160 if (check_gather)
12161 {
12162 /* Both XMM/YMM/ZMM registers must be distinct. */
12163 int modrm_reg = ins->modrm.reg;
12164
12165 if (ins->rex & REX_R)
12166 modrm_reg += 8;
12167 if (!ins->vex.r)
12168 modrm_reg += 16;
12169 if (vindex == modrm_reg)
12170 oappend (ins, "/(bad)");
12171 }
12172 }
12173 else if (ins->intel_syntax)
12174 {
12175 if (ins->modrm.mod != 0 || base == 5)
12176 {
12177 if (!ins->active_seg_prefix)
12178 {
12179 oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12180 oappend (ins, ":");
12181 }
12182 print_operand_value (ins, disp, dis_style_text);
12183 }
12184 }
12185 }
12186 else if (bytemode == v_bnd_mode
12187 || bytemode == v_bndmk_mode
12188 || bytemode == bnd_mode
12189 || bytemode == bnd_swap_mode
12190 || bytemode == vex_vsib_d_w_dq_mode
12191 || bytemode == vex_vsib_q_w_dq_mode)
12192 {
12193 oappend (ins, "(bad)");
12194 return true;
12195 }
12196 else
12197 {
12198 /* 16 bit address mode */
12199 int disp = 0;
12200
12201 ins->used_prefixes |= ins->prefixes & PREFIX_ADDR;
12202 switch (ins->modrm.mod)
12203 {
12204 case 0:
12205 if (ins->modrm.rm == 6)
12206 {
12207 case 2:
12208 if (!get16 (ins, &disp))
12209 return false;
12210 if ((disp & 0x8000) != 0)
12211 disp -= 0x10000;
12212 }
12213 break;
12214 case 1:
12215 if (!fetch_code (ins->info, ins->codep + 1))
12216 return false;
12217 disp = *ins->codep++;
12218 if ((disp & 0x80) != 0)
12219 disp -= 0x100;
12220 if (ins->vex.evex && shift > 0)
12221 disp <<= shift;
12222 break;
12223 }
12224
12225 if (!ins->intel_syntax)
12226 if (ins->modrm.mod != 0 || ins->modrm.rm == 6)
12227 print_displacement (ins, disp);
12228
12229 if (ins->modrm.mod != 0 || ins->modrm.rm != 6)
12230 {
12231 oappend_char (ins, ins->open_char);
12232 oappend (ins, ins->intel_syntax ? intel_index16[ins->modrm.rm]
12233 : att_index16[ins->modrm.rm]);
12234 if (ins->intel_syntax
12235 && (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6))
12236 {
12237 if (disp >= 0)
12238 oappend_char (ins, '+');
12239 print_displacement (ins, disp);
12240 }
12241
12242 oappend_char (ins, ins->close_char);
12243 }
12244 else if (ins->intel_syntax)
12245 {
12246 if (!ins->active_seg_prefix)
12247 {
12248 oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12249 oappend (ins, ":");
12250 }
12251 print_operand_value (ins, disp & 0xffff, dis_style_text);
12252 }
12253 }
12254 if (ins->vex.b)
12255 {
12256 ins->evex_used |= EVEX_b_used;
12257
12258 /* Broadcast can only ever be valid for memory sources. */
12259 if (ins->obufp == ins->op_out[0])
12260 ins->vex.no_broadcast = true;
12261
12262 if (!ins->vex.no_broadcast
12263 && (!ins->intel_syntax || !(ins->evex_used & EVEX_len_used)))
12264 {
12265 if (bytemode == xh_mode)
12266 {
12267 switch (ins->vex.length)
12268 {
12269 case 128:
12270 oappend (ins, "{1to8}");
12271 break;
12272 case 256:
12273 oappend (ins, "{1to16}");
12274 break;
12275 case 512:
12276 oappend (ins, "{1to32}");
12277 break;
12278 default:
12279 abort ();
12280 }
12281 }
12282 else if (bytemode == q_mode
12283 || bytemode == ymmq_mode)
12284 ins->vex.no_broadcast = true;
12285 else if (ins->vex.w
12286 || bytemode == evex_half_bcst_xmmqdh_mode
12287 || bytemode == evex_half_bcst_xmmq_mode)
12288 {
12289 switch (ins->vex.length)
12290 {
12291 case 128:
12292 oappend (ins, "{1to2}");
12293 break;
12294 case 256:
12295 oappend (ins, "{1to4}");
12296 break;
12297 case 512:
12298 oappend (ins, "{1to8}");
12299 break;
12300 default:
12301 abort ();
12302 }
12303 }
12304 else if (bytemode == x_mode
12305 || bytemode == evex_half_bcst_xmmqh_mode)
12306 {
12307 switch (ins->vex.length)
12308 {
12309 case 128:
12310 oappend (ins, "{1to4}");
12311 break;
12312 case 256:
12313 oappend (ins, "{1to8}");
12314 break;
12315 case 512:
12316 oappend (ins, "{1to16}");
12317 break;
12318 default:
12319 abort ();
12320 }
12321 }
12322 else
12323 ins->vex.no_broadcast = true;
12324 }
12325 if (ins->vex.no_broadcast)
12326 oappend (ins, "{bad}");
12327 }
12328
12329 return true;
12330 }
12331
12332 static bool
12333 OP_E (instr_info *ins, int bytemode, int sizeflag)
12334 {
12335 /* Skip mod/rm byte. */
12336 MODRM_CHECK;
12337 ins->codep++;
12338
12339 if (ins->modrm.mod == 3)
12340 {
12341 if ((sizeflag & SUFFIX_ALWAYS)
12342 && (bytemode == b_swap_mode
12343 || bytemode == bnd_swap_mode
12344 || bytemode == v_swap_mode))
12345 swap_operand (ins);
12346
12347 print_register (ins, ins->modrm.rm, REX_B, bytemode, sizeflag);
12348 return true;
12349 }
12350
12351 return OP_E_memory (ins, bytemode, sizeflag);
12352 }
12353
12354 static bool
12355 OP_G (instr_info *ins, int bytemode, int sizeflag)
12356 {
12357 if (ins->vex.evex && !ins->vex.r && ins->address_mode == mode_64bit)
12358 oappend (ins, "(bad)");
12359 else
12360 print_register (ins, ins->modrm.reg, REX_R, bytemode, sizeflag);
12361 return true;
12362 }
12363
12364 static bool
12365 get64 (instr_info *ins, uint64_t *res)
12366 {
12367 unsigned int a;
12368 unsigned int b;
12369
12370 if (!fetch_code (ins->info, ins->codep + 8))
12371 return false;
12372 a = *ins->codep++ & 0xff;
12373 a |= (*ins->codep++ & 0xff) << 8;
12374 a |= (*ins->codep++ & 0xff) << 16;
12375 a |= (*ins->codep++ & 0xffu) << 24;
12376 b = *ins->codep++ & 0xff;
12377 b |= (*ins->codep++ & 0xff) << 8;
12378 b |= (*ins->codep++ & 0xff) << 16;
12379 b |= (*ins->codep++ & 0xffu) << 24;
12380 *res = a + ((uint64_t) b << 32);
12381 return true;
12382 }
12383
12384 static bool
12385 get32 (instr_info *ins, bfd_signed_vma *res)
12386 {
12387 if (!fetch_code (ins->info, ins->codep + 4))
12388 return false;
12389 *res = *ins->codep++ & (bfd_vma) 0xff;
12390 *res |= (*ins->codep++ & (bfd_vma) 0xff) << 8;
12391 *res |= (*ins->codep++ & (bfd_vma) 0xff) << 16;
12392 *res |= (*ins->codep++ & (bfd_vma) 0xff) << 24;
12393 return true;
12394 }
12395
12396 static bool
12397 get32s (instr_info *ins, bfd_signed_vma *res)
12398 {
12399 if (!get32 (ins, res))
12400 return false;
12401
12402 *res = (*res ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
12403
12404 return true;
12405 }
12406
12407 static bool
12408 get16 (instr_info *ins, int *res)
12409 {
12410 if (!fetch_code (ins->info, ins->codep + 2))
12411 return false;
12412 *res = *ins->codep++ & 0xff;
12413 *res |= (*ins->codep++ & 0xff) << 8;
12414 return true;
12415 }
12416
12417 static void
12418 set_op (instr_info *ins, bfd_vma op, bool riprel)
12419 {
12420 ins->op_index[ins->op_ad] = ins->op_ad;
12421 if (ins->address_mode == mode_64bit)
12422 ins->op_address[ins->op_ad] = op;
12423 else /* Mask to get a 32-bit address. */
12424 ins->op_address[ins->op_ad] = op & 0xffffffff;
12425 ins->op_riprel[ins->op_ad] = riprel;
12426 }
12427
12428 static bool
12429 OP_REG (instr_info *ins, int code, int sizeflag)
12430 {
12431 const char *s;
12432 int add;
12433
12434 switch (code)
12435 {
12436 case es_reg: case ss_reg: case cs_reg:
12437 case ds_reg: case fs_reg: case gs_reg:
12438 oappend_register (ins, att_names_seg[code - es_reg]);
12439 return true;
12440 }
12441
12442 USED_REX (REX_B);
12443 if (ins->rex & REX_B)
12444 add = 8;
12445 else
12446 add = 0;
12447
12448 switch (code)
12449 {
12450 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12451 case sp_reg: case bp_reg: case si_reg: case di_reg:
12452 s = att_names16[code - ax_reg + add];
12453 break;
12454 case ah_reg: case ch_reg: case dh_reg: case bh_reg:
12455 USED_REX (0);
12456 /* Fall through. */
12457 case al_reg: case cl_reg: case dl_reg: case bl_reg:
12458 if (ins->rex)
12459 s = att_names8rex[code - al_reg + add];
12460 else
12461 s = att_names8[code - al_reg];
12462 break;
12463 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12464 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12465 if (ins->address_mode == mode_64bit
12466 && ((sizeflag & DFLAG) || (ins->rex & REX_W)))
12467 {
12468 s = att_names64[code - rAX_reg + add];
12469 break;
12470 }
12471 code += eAX_reg - rAX_reg;
12472 /* Fall through. */
12473 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12474 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12475 USED_REX (REX_W);
12476 if (ins->rex & REX_W)
12477 s = att_names64[code - eAX_reg + add];
12478 else
12479 {
12480 if (sizeflag & DFLAG)
12481 s = att_names32[code - eAX_reg + add];
12482 else
12483 s = att_names16[code - eAX_reg + add];
12484 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12485 }
12486 break;
12487 default:
12488 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12489 return true;
12490 }
12491 oappend_register (ins, s);
12492 return true;
12493 }
12494
12495 static bool
12496 OP_IMREG (instr_info *ins, int code, int sizeflag)
12497 {
12498 const char *s;
12499
12500 switch (code)
12501 {
12502 case indir_dx_reg:
12503 if (!ins->intel_syntax)
12504 {
12505 oappend (ins, "(%dx)");
12506 return true;
12507 }
12508 s = att_names16[dx_reg - ax_reg];
12509 break;
12510 case al_reg: case cl_reg:
12511 s = att_names8[code - al_reg];
12512 break;
12513 case eAX_reg:
12514 USED_REX (REX_W);
12515 if (ins->rex & REX_W)
12516 {
12517 s = *att_names64;
12518 break;
12519 }
12520 /* Fall through. */
12521 case z_mode_ax_reg:
12522 if ((ins->rex & REX_W) || (sizeflag & DFLAG))
12523 s = *att_names32;
12524 else
12525 s = *att_names16;
12526 if (!(ins->rex & REX_W))
12527 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12528 break;
12529 default:
12530 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12531 return true;
12532 }
12533 oappend_register (ins, s);
12534 return true;
12535 }
12536
12537 static bool
12538 OP_I (instr_info *ins, int bytemode, int sizeflag)
12539 {
12540 bfd_signed_vma op;
12541 bfd_signed_vma mask = -1;
12542
12543 switch (bytemode)
12544 {
12545 case b_mode:
12546 if (!fetch_code (ins->info, ins->codep + 1))
12547 return false;
12548 op = *ins->codep++;
12549 mask = 0xff;
12550 break;
12551 case v_mode:
12552 USED_REX (REX_W);
12553 if (ins->rex & REX_W)
12554 {
12555 if (!get32s (ins, &op))
12556 return false;
12557 }
12558 else
12559 {
12560 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12561 if (sizeflag & DFLAG)
12562 {
12563 case d_mode:
12564 if (!get32 (ins, &op))
12565 return false;
12566 mask = 0xffffffff;
12567 }
12568 else
12569 {
12570 int num;
12571
12572 case w_mode:
12573 if (!get16 (ins, &num))
12574 return false;
12575 op = num;
12576 mask = 0xfffff;
12577 }
12578 }
12579 break;
12580 case const_1_mode:
12581 if (ins->intel_syntax)
12582 oappend (ins, "1");
12583 return true;
12584 default:
12585 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12586 return true;
12587 }
12588
12589 op &= mask;
12590 oappend_immediate (ins, op);
12591 return true;
12592 }
12593
12594 static bool
12595 OP_I64 (instr_info *ins, int bytemode, int sizeflag)
12596 {
12597 uint64_t op;
12598
12599 if (bytemode != v_mode || ins->address_mode != mode_64bit
12600 || !(ins->rex & REX_W))
12601 return OP_I (ins, bytemode, sizeflag);
12602
12603 USED_REX (REX_W);
12604
12605 if (!get64 (ins, &op))
12606 return false;
12607
12608 oappend_immediate (ins, op);
12609 return true;
12610 }
12611
12612 static bool
12613 OP_sI (instr_info *ins, int bytemode, int sizeflag)
12614 {
12615 bfd_signed_vma op;
12616
12617 switch (bytemode)
12618 {
12619 case b_mode:
12620 case b_T_mode:
12621 if (!fetch_code (ins->info, ins->codep + 1))
12622 return false;
12623 op = *ins->codep++;
12624 if ((op & 0x80) != 0)
12625 op -= 0x100;
12626 if (bytemode == b_T_mode)
12627 {
12628 if (ins->address_mode != mode_64bit
12629 || !((sizeflag & DFLAG) || (ins->rex & REX_W)))
12630 {
12631 /* The operand-size prefix is overridden by a REX prefix. */
12632 if ((sizeflag & DFLAG) || (ins->rex & REX_W))
12633 op &= 0xffffffff;
12634 else
12635 op &= 0xffff;
12636 }
12637 }
12638 else
12639 {
12640 if (!(ins->rex & REX_W))
12641 {
12642 if (sizeflag & DFLAG)
12643 op &= 0xffffffff;
12644 else
12645 op &= 0xffff;
12646 }
12647 }
12648 break;
12649 case v_mode:
12650 /* The operand-size prefix is overridden by a REX prefix. */
12651 if (!(sizeflag & DFLAG) && !(ins->rex & REX_W))
12652 {
12653 int val;
12654
12655 if (!get16 (ins, &val))
12656 return false;
12657 op = val;
12658 }
12659 else if (!get32s (ins, &op))
12660 return false;
12661 break;
12662 default:
12663 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12664 return true;
12665 }
12666
12667 oappend_immediate (ins, op);
12668 return true;
12669 }
12670
12671 static bool
12672 OP_J (instr_info *ins, int bytemode, int sizeflag)
12673 {
12674 bfd_vma disp;
12675 bfd_vma mask = -1;
12676 bfd_vma segment = 0;
12677
12678 switch (bytemode)
12679 {
12680 case b_mode:
12681 if (!fetch_code (ins->info, ins->codep + 1))
12682 return false;
12683 disp = *ins->codep++;
12684 if ((disp & 0x80) != 0)
12685 disp -= 0x100;
12686 break;
12687 case v_mode:
12688 case dqw_mode:
12689 if ((sizeflag & DFLAG)
12690 || (ins->address_mode == mode_64bit
12691 && ((ins->isa64 == intel64 && bytemode != dqw_mode)
12692 || (ins->rex & REX_W))))
12693 {
12694 bfd_signed_vma val;
12695
12696 if (!get32s (ins, &val))
12697 return false;
12698 disp = val;
12699 }
12700 else
12701 {
12702 int val;
12703
12704 get16 (ins, &val);
12705 disp = val & 0x8000 ? val - 0x10000 : val;
12706 /* In 16bit mode, address is wrapped around at 64k within
12707 the same segment. Otherwise, a data16 prefix on a jump
12708 instruction means that the pc is masked to 16 bits after
12709 the displacement is added! */
12710 mask = 0xffff;
12711 if ((ins->prefixes & PREFIX_DATA) == 0)
12712 segment = ((ins->start_pc + (ins->codep - ins->start_codep))
12713 & ~((bfd_vma) 0xffff));
12714 }
12715 if (ins->address_mode != mode_64bit
12716 || (ins->isa64 != intel64 && !(ins->rex & REX_W)))
12717 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12718 break;
12719 default:
12720 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12721 return true;
12722 }
12723 disp = ((ins->start_pc + (ins->codep - ins->start_codep) + disp) & mask)
12724 | segment;
12725 set_op (ins, disp, false);
12726 print_operand_value (ins, disp, dis_style_text);
12727 return true;
12728 }
12729
12730 static bool
12731 OP_SEG (instr_info *ins, int bytemode, int sizeflag)
12732 {
12733 if (bytemode == w_mode)
12734 {
12735 oappend_register (ins, att_names_seg[ins->modrm.reg]);
12736 return true;
12737 }
12738 return OP_E (ins, ins->modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12739 }
12740
12741 static bool
12742 OP_DIR (instr_info *ins, int dummy ATTRIBUTE_UNUSED, int sizeflag)
12743 {
12744 int seg, offset, res;
12745 char scratch[24];
12746
12747 if (sizeflag & DFLAG)
12748 {
12749 bfd_signed_vma val;
12750
12751 if (!get32 (ins, &val))
12752 return false;;
12753 offset = val;
12754 }
12755 else if (!get16 (ins, &offset))
12756 return false;
12757 if (!get16 (ins, &seg))
12758 return false;;
12759 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12760
12761 res = snprintf (scratch, ARRAY_SIZE (scratch),
12762 ins->intel_syntax ? "0x%x:0x%x" : "$0x%x,$0x%x",
12763 seg, offset);
12764 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12765 abort ();
12766 oappend (ins, scratch);
12767 return true;
12768 }
12769
12770 static bool
12771 OP_OFF (instr_info *ins, int bytemode, int sizeflag)
12772 {
12773 bfd_vma off;
12774
12775 if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12776 intel_operand_size (ins, bytemode, sizeflag);
12777 append_seg (ins);
12778
12779 if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
12780 {
12781 bfd_signed_vma val;
12782
12783 if (!get32 (ins, &val))
12784 return false;
12785 off = val;
12786 }
12787 else
12788 {
12789 int val;
12790
12791 if (!get16 (ins, &val))
12792 return false;
12793 off = val;
12794 }
12795
12796 if (ins->intel_syntax)
12797 {
12798 if (!ins->active_seg_prefix)
12799 {
12800 oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12801 oappend (ins, ":");
12802 }
12803 }
12804 print_operand_value (ins, off, dis_style_address_offset);
12805 return true;
12806 }
12807
12808 static bool
12809 OP_OFF64 (instr_info *ins, int bytemode, int sizeflag)
12810 {
12811 uint64_t off;
12812
12813 if (ins->address_mode != mode_64bit
12814 || (ins->prefixes & PREFIX_ADDR))
12815 return OP_OFF (ins, bytemode, sizeflag);
12816
12817 if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12818 intel_operand_size (ins, bytemode, sizeflag);
12819 append_seg (ins);
12820
12821 if (!get64 (ins, &off))
12822 return false;
12823
12824 if (ins->intel_syntax)
12825 {
12826 if (!ins->active_seg_prefix)
12827 {
12828 oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12829 oappend (ins, ":");
12830 }
12831 }
12832 print_operand_value (ins, off, dis_style_address_offset);
12833 return true;
12834 }
12835
12836 static void
12837 ptr_reg (instr_info *ins, int code, int sizeflag)
12838 {
12839 const char *s;
12840
12841 *ins->obufp++ = ins->open_char;
12842 ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
12843 if (ins->address_mode == mode_64bit)
12844 {
12845 if (!(sizeflag & AFLAG))
12846 s = att_names32[code - eAX_reg];
12847 else
12848 s = att_names64[code - eAX_reg];
12849 }
12850 else if (sizeflag & AFLAG)
12851 s = att_names32[code - eAX_reg];
12852 else
12853 s = att_names16[code - eAX_reg];
12854 oappend_register (ins, s);
12855 oappend_char (ins, ins->close_char);
12856 }
12857
12858 static bool
12859 OP_ESreg (instr_info *ins, int code, int sizeflag)
12860 {
12861 if (ins->intel_syntax)
12862 {
12863 switch (ins->codep[-1])
12864 {
12865 case 0x6d: /* insw/insl */
12866 intel_operand_size (ins, z_mode, sizeflag);
12867 break;
12868 case 0xa5: /* movsw/movsl/movsq */
12869 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12870 case 0xab: /* stosw/stosl */
12871 case 0xaf: /* scasw/scasl */
12872 intel_operand_size (ins, v_mode, sizeflag);
12873 break;
12874 default:
12875 intel_operand_size (ins, b_mode, sizeflag);
12876 }
12877 }
12878 oappend_register (ins, att_names_seg[0]);
12879 oappend_char (ins, ':');
12880 ptr_reg (ins, code, sizeflag);
12881 return true;
12882 }
12883
12884 static bool
12885 OP_DSreg (instr_info *ins, int code, int sizeflag)
12886 {
12887 if (ins->intel_syntax)
12888 {
12889 switch (ins->codep[-1])
12890 {
12891 case 0x6f: /* outsw/outsl */
12892 intel_operand_size (ins, z_mode, sizeflag);
12893 break;
12894 case 0xa5: /* movsw/movsl/movsq */
12895 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12896 case 0xad: /* lodsw/lodsl/lodsq */
12897 intel_operand_size (ins, v_mode, sizeflag);
12898 break;
12899 default:
12900 intel_operand_size (ins, b_mode, sizeflag);
12901 }
12902 }
12903 /* Set ins->active_seg_prefix to PREFIX_DS if it is unset so that the
12904 default segment register DS is printed. */
12905 if (!ins->active_seg_prefix)
12906 ins->active_seg_prefix = PREFIX_DS;
12907 append_seg (ins);
12908 ptr_reg (ins, code, sizeflag);
12909 return true;
12910 }
12911
12912 static bool
12913 OP_C (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
12914 int sizeflag ATTRIBUTE_UNUSED)
12915 {
12916 int add, res;
12917 char scratch[8];
12918
12919 if (ins->rex & REX_R)
12920 {
12921 USED_REX (REX_R);
12922 add = 8;
12923 }
12924 else if (ins->address_mode != mode_64bit && (ins->prefixes & PREFIX_LOCK))
12925 {
12926 ins->all_prefixes[ins->last_lock_prefix] = 0;
12927 ins->used_prefixes |= PREFIX_LOCK;
12928 add = 8;
12929 }
12930 else
12931 add = 0;
12932 res = snprintf (scratch, ARRAY_SIZE (scratch), "%%cr%d",
12933 ins->modrm.reg + add);
12934 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12935 abort ();
12936 oappend_register (ins, scratch);
12937 return true;
12938 }
12939
12940 static bool
12941 OP_D (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
12942 int sizeflag ATTRIBUTE_UNUSED)
12943 {
12944 int add, res;
12945 char scratch[8];
12946
12947 USED_REX (REX_R);
12948 if (ins->rex & REX_R)
12949 add = 8;
12950 else
12951 add = 0;
12952 res = snprintf (scratch, ARRAY_SIZE (scratch),
12953 ins->intel_syntax ? "dr%d" : "%%db%d",
12954 ins->modrm.reg + add);
12955 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12956 abort ();
12957 oappend (ins, scratch);
12958 return true;
12959 }
12960
12961 static bool
12962 OP_T (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
12963 int sizeflag ATTRIBUTE_UNUSED)
12964 {
12965 int res;
12966 char scratch[8];
12967
12968 res = snprintf (scratch, ARRAY_SIZE (scratch), "%%tr%d", ins->modrm.reg);
12969 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12970 abort ();
12971 oappend_register (ins, scratch);
12972 return true;
12973 }
12974
12975 static bool
12976 OP_MMX (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
12977 int sizeflag ATTRIBUTE_UNUSED)
12978 {
12979 int reg = ins->modrm.reg;
12980 const char (*names)[8];
12981
12982 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12983 if (ins->prefixes & PREFIX_DATA)
12984 {
12985 names = att_names_xmm;
12986 USED_REX (REX_R);
12987 if (ins->rex & REX_R)
12988 reg += 8;
12989 }
12990 else
12991 names = att_names_mm;
12992 oappend_register (ins, names[reg]);
12993 return true;
12994 }
12995
12996 static void
12997 print_vector_reg (instr_info *ins, unsigned int reg, int bytemode)
12998 {
12999 const char (*names)[8];
13000
13001 if (bytemode == xmmq_mode
13002 || bytemode == evex_half_bcst_xmmqh_mode
13003 || bytemode == evex_half_bcst_xmmq_mode)
13004 {
13005 switch (ins->vex.length)
13006 {
13007 case 128:
13008 case 256:
13009 names = att_names_xmm;
13010 break;
13011 case 512:
13012 names = att_names_ymm;
13013 ins->evex_used |= EVEX_len_used;
13014 break;
13015 default:
13016 abort ();
13017 }
13018 }
13019 else if (bytemode == ymm_mode)
13020 names = att_names_ymm;
13021 else if (bytemode == tmm_mode)
13022 {
13023 if (reg >= 8)
13024 {
13025 oappend (ins, "(bad)");
13026 return;
13027 }
13028 names = att_names_tmm;
13029 }
13030 else if (ins->need_vex
13031 && bytemode != xmm_mode
13032 && bytemode != scalar_mode
13033 && bytemode != xmmdw_mode
13034 && bytemode != xmmqd_mode
13035 && bytemode != evex_half_bcst_xmmqdh_mode
13036 && bytemode != w_swap_mode
13037 && bytemode != b_mode
13038 && bytemode != w_mode
13039 && bytemode != d_mode
13040 && bytemode != q_mode)
13041 {
13042 ins->evex_used |= EVEX_len_used;
13043 switch (ins->vex.length)
13044 {
13045 case 128:
13046 names = att_names_xmm;
13047 break;
13048 case 256:
13049 if (ins->vex.w
13050 || bytemode != vex_vsib_q_w_dq_mode)
13051 names = att_names_ymm;
13052 else
13053 names = att_names_xmm;
13054 break;
13055 case 512:
13056 if (ins->vex.w
13057 || bytemode != vex_vsib_q_w_dq_mode)
13058 names = att_names_zmm;
13059 else
13060 names = att_names_ymm;
13061 break;
13062 default:
13063 abort ();
13064 }
13065 }
13066 else
13067 names = att_names_xmm;
13068 oappend_register (ins, names[reg]);
13069 }
13070
13071 static bool
13072 OP_XMM (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13073 {
13074 unsigned int reg = ins->modrm.reg;
13075
13076 USED_REX (REX_R);
13077 if (ins->rex & REX_R)
13078 reg += 8;
13079 if (ins->vex.evex)
13080 {
13081 if (!ins->vex.r)
13082 reg += 16;
13083 }
13084
13085 if (bytemode == tmm_mode)
13086 ins->modrm.reg = reg;
13087 else if (bytemode == scalar_mode)
13088 ins->vex.no_broadcast = true;
13089
13090 print_vector_reg (ins, reg, bytemode);
13091 return true;
13092 }
13093
13094 static bool
13095 OP_EM (instr_info *ins, int bytemode, int sizeflag)
13096 {
13097 int reg;
13098 const char (*names)[8];
13099
13100 if (ins->modrm.mod != 3)
13101 {
13102 if (ins->intel_syntax
13103 && (bytemode == v_mode || bytemode == v_swap_mode))
13104 {
13105 bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13106 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13107 }
13108 return OP_E (ins, bytemode, sizeflag);
13109 }
13110
13111 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13112 swap_operand (ins);
13113
13114 /* Skip mod/rm byte. */
13115 MODRM_CHECK;
13116 ins->codep++;
13117 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13118 reg = ins->modrm.rm;
13119 if (ins->prefixes & PREFIX_DATA)
13120 {
13121 names = att_names_xmm;
13122 USED_REX (REX_B);
13123 if (ins->rex & REX_B)
13124 reg += 8;
13125 }
13126 else
13127 names = att_names_mm;
13128 oappend_register (ins, names[reg]);
13129 return true;
13130 }
13131
13132 /* cvt* are the only instructions in sse2 which have
13133 both SSE and MMX operands and also have 0x66 prefix
13134 in their opcode. 0x66 was originally used to differentiate
13135 between SSE and MMX instruction(operands). So we have to handle the
13136 cvt* separately using OP_EMC and OP_MXC */
13137 static bool
13138 OP_EMC (instr_info *ins, int bytemode, int sizeflag)
13139 {
13140 if (ins->modrm.mod != 3)
13141 {
13142 if (ins->intel_syntax && bytemode == v_mode)
13143 {
13144 bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13145 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13146 }
13147 return OP_E (ins, bytemode, sizeflag);
13148 }
13149
13150 /* Skip mod/rm byte. */
13151 MODRM_CHECK;
13152 ins->codep++;
13153 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13154 oappend_register (ins, att_names_mm[ins->modrm.rm]);
13155 return true;
13156 }
13157
13158 static bool
13159 OP_MXC (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13160 int sizeflag ATTRIBUTE_UNUSED)
13161 {
13162 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13163 oappend_register (ins, att_names_mm[ins->modrm.reg]);
13164 return true;
13165 }
13166
13167 static bool
13168 OP_EX (instr_info *ins, int bytemode, int sizeflag)
13169 {
13170 int reg;
13171
13172 /* Skip mod/rm byte. */
13173 MODRM_CHECK;
13174 ins->codep++;
13175
13176 if (bytemode == dq_mode)
13177 bytemode = ins->vex.w ? q_mode : d_mode;
13178
13179 if (ins->modrm.mod != 3)
13180 return OP_E_memory (ins, bytemode, sizeflag);
13181
13182 reg = ins->modrm.rm;
13183 USED_REX (REX_B);
13184 if (ins->rex & REX_B)
13185 reg += 8;
13186 if (ins->vex.evex)
13187 {
13188 USED_REX (REX_X);
13189 if ((ins->rex & REX_X))
13190 reg += 16;
13191 }
13192
13193 if ((sizeflag & SUFFIX_ALWAYS)
13194 && (bytemode == x_swap_mode
13195 || bytemode == w_swap_mode
13196 || bytemode == d_swap_mode
13197 || bytemode == q_swap_mode))
13198 swap_operand (ins);
13199
13200 if (bytemode == tmm_mode)
13201 ins->modrm.rm = reg;
13202
13203 print_vector_reg (ins, reg, bytemode);
13204 return true;
13205 }
13206
13207 static bool
13208 OP_MS (instr_info *ins, int bytemode, int sizeflag)
13209 {
13210 if (ins->modrm.mod == 3)
13211 return OP_EM (ins, bytemode, sizeflag);
13212 return BadOp (ins);
13213 }
13214
13215 static bool
13216 OP_XS (instr_info *ins, int bytemode, int sizeflag)
13217 {
13218 if (ins->modrm.mod == 3)
13219 return OP_EX (ins, bytemode, sizeflag);
13220 return BadOp (ins);
13221 }
13222
13223 static bool
13224 OP_M (instr_info *ins, int bytemode, int sizeflag)
13225 {
13226 if (ins->modrm.mod == 3)
13227 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13228 return BadOp (ins);
13229 return OP_E (ins, bytemode, sizeflag);
13230 }
13231
13232 static bool
13233 OP_0f07 (instr_info *ins, int bytemode, int sizeflag)
13234 {
13235 if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
13236 return BadOp (ins);
13237 return OP_E (ins, bytemode, sizeflag);
13238 }
13239
13240 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13241 32bit mode and "xchg %rax,%rax" in 64bit mode. */
13242
13243 static bool
13244 NOP_Fixup (instr_info *ins, int opnd, int sizeflag)
13245 {
13246 if ((ins->prefixes & PREFIX_DATA) == 0 && (ins->rex & REX_B) == 0)
13247 {
13248 ins->mnemonicendp = stpcpy (ins->obuf, "nop");
13249 return true;
13250 }
13251 if (opnd == 0)
13252 return OP_REG (ins, eAX_reg, sizeflag);
13253 return OP_IMREG (ins, eAX_reg, sizeflag);
13254 }
13255
13256 static const char *const Suffix3DNow[] = {
13257 /* 00 */ NULL, NULL, NULL, NULL,
13258 /* 04 */ NULL, NULL, NULL, NULL,
13259 /* 08 */ NULL, NULL, NULL, NULL,
13260 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
13261 /* 10 */ NULL, NULL, NULL, NULL,
13262 /* 14 */ NULL, NULL, NULL, NULL,
13263 /* 18 */ NULL, NULL, NULL, NULL,
13264 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
13265 /* 20 */ NULL, NULL, NULL, NULL,
13266 /* 24 */ NULL, NULL, NULL, NULL,
13267 /* 28 */ NULL, NULL, NULL, NULL,
13268 /* 2C */ NULL, NULL, NULL, NULL,
13269 /* 30 */ NULL, NULL, NULL, NULL,
13270 /* 34 */ NULL, NULL, NULL, NULL,
13271 /* 38 */ NULL, NULL, NULL, NULL,
13272 /* 3C */ NULL, NULL, NULL, NULL,
13273 /* 40 */ NULL, NULL, NULL, NULL,
13274 /* 44 */ NULL, NULL, NULL, NULL,
13275 /* 48 */ NULL, NULL, NULL, NULL,
13276 /* 4C */ NULL, NULL, NULL, NULL,
13277 /* 50 */ NULL, NULL, NULL, NULL,
13278 /* 54 */ NULL, NULL, NULL, NULL,
13279 /* 58 */ NULL, NULL, NULL, NULL,
13280 /* 5C */ NULL, NULL, NULL, NULL,
13281 /* 60 */ NULL, NULL, NULL, NULL,
13282 /* 64 */ NULL, NULL, NULL, NULL,
13283 /* 68 */ NULL, NULL, NULL, NULL,
13284 /* 6C */ NULL, NULL, NULL, NULL,
13285 /* 70 */ NULL, NULL, NULL, NULL,
13286 /* 74 */ NULL, NULL, NULL, NULL,
13287 /* 78 */ NULL, NULL, NULL, NULL,
13288 /* 7C */ NULL, NULL, NULL, NULL,
13289 /* 80 */ NULL, NULL, NULL, NULL,
13290 /* 84 */ NULL, NULL, NULL, NULL,
13291 /* 88 */ NULL, NULL, "pfnacc", NULL,
13292 /* 8C */ NULL, NULL, "pfpnacc", NULL,
13293 /* 90 */ "pfcmpge", NULL, NULL, NULL,
13294 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
13295 /* 98 */ NULL, NULL, "pfsub", NULL,
13296 /* 9C */ NULL, NULL, "pfadd", NULL,
13297 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
13298 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
13299 /* A8 */ NULL, NULL, "pfsubr", NULL,
13300 /* AC */ NULL, NULL, "pfacc", NULL,
13301 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
13302 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
13303 /* B8 */ NULL, NULL, NULL, "pswapd",
13304 /* BC */ NULL, NULL, NULL, "pavgusb",
13305 /* C0 */ NULL, NULL, NULL, NULL,
13306 /* C4 */ NULL, NULL, NULL, NULL,
13307 /* C8 */ NULL, NULL, NULL, NULL,
13308 /* CC */ NULL, NULL, NULL, NULL,
13309 /* D0 */ NULL, NULL, NULL, NULL,
13310 /* D4 */ NULL, NULL, NULL, NULL,
13311 /* D8 */ NULL, NULL, NULL, NULL,
13312 /* DC */ NULL, NULL, NULL, NULL,
13313 /* E0 */ NULL, NULL, NULL, NULL,
13314 /* E4 */ NULL, NULL, NULL, NULL,
13315 /* E8 */ NULL, NULL, NULL, NULL,
13316 /* EC */ NULL, NULL, NULL, NULL,
13317 /* F0 */ NULL, NULL, NULL, NULL,
13318 /* F4 */ NULL, NULL, NULL, NULL,
13319 /* F8 */ NULL, NULL, NULL, NULL,
13320 /* FC */ NULL, NULL, NULL, NULL,
13321 };
13322
13323 static bool
13324 OP_3DNowSuffix (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13325 int sizeflag ATTRIBUTE_UNUSED)
13326 {
13327 const char *mnemonic;
13328
13329 if (!fetch_code (ins->info, ins->codep + 1))
13330 return false;
13331 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13332 place where an 8-bit immediate would normally go. ie. the last
13333 byte of the instruction. */
13334 ins->obufp = ins->mnemonicendp;
13335 mnemonic = Suffix3DNow[*ins->codep++ & 0xff];
13336 if (mnemonic)
13337 ins->obufp = stpcpy (ins->obufp, mnemonic);
13338 else
13339 {
13340 /* Since a variable sized ins->modrm/ins->sib chunk is between the start
13341 of the opcode (0x0f0f) and the opcode suffix, we need to do
13342 all the ins->modrm processing first, and don't know until now that
13343 we have a bad opcode. This necessitates some cleaning up. */
13344 ins->op_out[0][0] = '\0';
13345 ins->op_out[1][0] = '\0';
13346 BadOp (ins);
13347 }
13348 ins->mnemonicendp = ins->obufp;
13349 return true;
13350 }
13351
13352 static const struct op simd_cmp_op[] =
13353 {
13354 { STRING_COMMA_LEN ("eq") },
13355 { STRING_COMMA_LEN ("lt") },
13356 { STRING_COMMA_LEN ("le") },
13357 { STRING_COMMA_LEN ("unord") },
13358 { STRING_COMMA_LEN ("neq") },
13359 { STRING_COMMA_LEN ("nlt") },
13360 { STRING_COMMA_LEN ("nle") },
13361 { STRING_COMMA_LEN ("ord") }
13362 };
13363
13364 static const struct op vex_cmp_op[] =
13365 {
13366 { STRING_COMMA_LEN ("eq_uq") },
13367 { STRING_COMMA_LEN ("nge") },
13368 { STRING_COMMA_LEN ("ngt") },
13369 { STRING_COMMA_LEN ("false") },
13370 { STRING_COMMA_LEN ("neq_oq") },
13371 { STRING_COMMA_LEN ("ge") },
13372 { STRING_COMMA_LEN ("gt") },
13373 { STRING_COMMA_LEN ("true") },
13374 { STRING_COMMA_LEN ("eq_os") },
13375 { STRING_COMMA_LEN ("lt_oq") },
13376 { STRING_COMMA_LEN ("le_oq") },
13377 { STRING_COMMA_LEN ("unord_s") },
13378 { STRING_COMMA_LEN ("neq_us") },
13379 { STRING_COMMA_LEN ("nlt_uq") },
13380 { STRING_COMMA_LEN ("nle_uq") },
13381 { STRING_COMMA_LEN ("ord_s") },
13382 { STRING_COMMA_LEN ("eq_us") },
13383 { STRING_COMMA_LEN ("nge_uq") },
13384 { STRING_COMMA_LEN ("ngt_uq") },
13385 { STRING_COMMA_LEN ("false_os") },
13386 { STRING_COMMA_LEN ("neq_os") },
13387 { STRING_COMMA_LEN ("ge_oq") },
13388 { STRING_COMMA_LEN ("gt_oq") },
13389 { STRING_COMMA_LEN ("true_us") },
13390 };
13391
13392 static bool
13393 CMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13394 int sizeflag ATTRIBUTE_UNUSED)
13395 {
13396 unsigned int cmp_type;
13397
13398 if (!fetch_code (ins->info, ins->codep + 1))
13399 return false;
13400 cmp_type = *ins->codep++ & 0xff;
13401 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
13402 {
13403 char suffix[3];
13404 char *p = ins->mnemonicendp - 2;
13405 suffix[0] = p[0];
13406 suffix[1] = p[1];
13407 suffix[2] = '\0';
13408 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13409 ins->mnemonicendp += simd_cmp_op[cmp_type].len;
13410 }
13411 else if (ins->need_vex
13412 && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13413 {
13414 char suffix[3];
13415 char *p = ins->mnemonicendp - 2;
13416 suffix[0] = p[0];
13417 suffix[1] = p[1];
13418 suffix[2] = '\0';
13419 cmp_type -= ARRAY_SIZE (simd_cmp_op);
13420 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13421 ins->mnemonicendp += vex_cmp_op[cmp_type].len;
13422 }
13423 else
13424 {
13425 /* We have a reserved extension byte. Output it directly. */
13426 oappend_immediate (ins, cmp_type);
13427 }
13428 return true;
13429 }
13430
13431 static bool
13432 OP_Mwait (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13433 {
13434 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
13435 if (!ins->intel_syntax)
13436 {
13437 strcpy (ins->op_out[0], att_names32[0] + ins->intel_syntax);
13438 strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13439 if (bytemode == eBX_reg)
13440 strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax);
13441 ins->two_source_ops = true;
13442 }
13443 /* Skip mod/rm byte. */
13444 MODRM_CHECK;
13445 ins->codep++;
13446 return true;
13447 }
13448
13449 static bool
13450 OP_Monitor (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13451 int sizeflag ATTRIBUTE_UNUSED)
13452 {
13453 /* monitor %{e,r,}ax,%ecx,%edx" */
13454 if (!ins->intel_syntax)
13455 {
13456 const char (*names)[8] = (ins->address_mode == mode_64bit
13457 ? att_names64 : att_names32);
13458
13459 if (ins->prefixes & PREFIX_ADDR)
13460 {
13461 /* Remove "addr16/addr32". */
13462 ins->all_prefixes[ins->last_addr_prefix] = 0;
13463 names = (ins->address_mode != mode_32bit
13464 ? att_names32 : att_names16);
13465 ins->used_prefixes |= PREFIX_ADDR;
13466 }
13467 else if (ins->address_mode == mode_16bit)
13468 names = att_names16;
13469 strcpy (ins->op_out[0], names[0] + ins->intel_syntax);
13470 strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13471 strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax);
13472 ins->two_source_ops = true;
13473 }
13474 /* Skip mod/rm byte. */
13475 MODRM_CHECK;
13476 ins->codep++;
13477 return true;
13478 }
13479
13480 static bool
13481 BadOp (instr_info *ins)
13482 {
13483 /* Throw away prefixes and 1st. opcode byte. */
13484 ins->codep = ins->insn_codep + 1;
13485 ins->obufp = stpcpy (ins->obufp, "(bad)");
13486 return true;
13487 }
13488
13489 static bool
13490 REP_Fixup (instr_info *ins, int bytemode, int sizeflag)
13491 {
13492 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13493 lods and stos. */
13494 if (ins->prefixes & PREFIX_REPZ)
13495 ins->all_prefixes[ins->last_repz_prefix] = REP_PREFIX;
13496
13497 switch (bytemode)
13498 {
13499 case al_reg:
13500 case eAX_reg:
13501 case indir_dx_reg:
13502 return OP_IMREG (ins, bytemode, sizeflag);
13503 case eDI_reg:
13504 return OP_ESreg (ins, bytemode, sizeflag);
13505 case eSI_reg:
13506 return OP_DSreg (ins, bytemode, sizeflag);
13507 default:
13508 abort ();
13509 break;
13510 }
13511 return true;
13512 }
13513
13514 static bool
13515 SEP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13516 int sizeflag ATTRIBUTE_UNUSED)
13517 {
13518 if (ins->isa64 != amd64)
13519 return true;
13520
13521 ins->obufp = ins->obuf;
13522 BadOp (ins);
13523 ins->mnemonicendp = ins->obufp;
13524 ++ins->codep;
13525 return true;
13526 }
13527
13528 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
13529 "bnd". */
13530
13531 static bool
13532 BND_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13533 int sizeflag ATTRIBUTE_UNUSED)
13534 {
13535 if (ins->prefixes & PREFIX_REPNZ)
13536 ins->all_prefixes[ins->last_repnz_prefix] = BND_PREFIX;
13537 return true;
13538 }
13539
13540 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13541 "notrack". */
13542
13543 static bool
13544 NOTRACK_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13545 int sizeflag ATTRIBUTE_UNUSED)
13546 {
13547 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13548 we've seen a PREFIX_DS. */
13549 if ((ins->prefixes & PREFIX_DS) != 0
13550 && (ins->address_mode != mode_64bit || ins->last_data_prefix < 0))
13551 {
13552 /* NOTRACK prefix is only valid on indirect branch instructions.
13553 NB: DATA prefix is unsupported for Intel64. */
13554 ins->active_seg_prefix = 0;
13555 ins->all_prefixes[ins->last_seg_prefix] = NOTRACK_PREFIX;
13556 }
13557 return true;
13558 }
13559
13560 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13561 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13562 */
13563
13564 static bool
13565 HLE_Fixup1 (instr_info *ins, int bytemode, int sizeflag)
13566 {
13567 if (ins->modrm.mod != 3
13568 && (ins->prefixes & PREFIX_LOCK) != 0)
13569 {
13570 if (ins->prefixes & PREFIX_REPZ)
13571 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13572 if (ins->prefixes & PREFIX_REPNZ)
13573 ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13574 }
13575
13576 return OP_E (ins, bytemode, sizeflag);
13577 }
13578
13579 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13580 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13581 */
13582
13583 static bool
13584 HLE_Fixup2 (instr_info *ins, int bytemode, int sizeflag)
13585 {
13586 if (ins->modrm.mod != 3)
13587 {
13588 if (ins->prefixes & PREFIX_REPZ)
13589 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13590 if (ins->prefixes & PREFIX_REPNZ)
13591 ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13592 }
13593
13594 return OP_E (ins, bytemode, sizeflag);
13595 }
13596
13597 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13598 "xrelease" for memory operand. No check for LOCK prefix. */
13599
13600 static bool
13601 HLE_Fixup3 (instr_info *ins, int bytemode, int sizeflag)
13602 {
13603 if (ins->modrm.mod != 3
13604 && ins->last_repz_prefix > ins->last_repnz_prefix
13605 && (ins->prefixes & PREFIX_REPZ) != 0)
13606 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13607
13608 return OP_E (ins, bytemode, sizeflag);
13609 }
13610
13611 static bool
13612 CMPXCHG8B_Fixup (instr_info *ins, int bytemode, int sizeflag)
13613 {
13614 USED_REX (REX_W);
13615 if (ins->rex & REX_W)
13616 {
13617 /* Change cmpxchg8b to cmpxchg16b. */
13618 char *p = ins->mnemonicendp - 2;
13619 ins->mnemonicendp = stpcpy (p, "16b");
13620 bytemode = o_mode;
13621 }
13622 else if ((ins->prefixes & PREFIX_LOCK) != 0)
13623 {
13624 if (ins->prefixes & PREFIX_REPZ)
13625 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13626 if (ins->prefixes & PREFIX_REPNZ)
13627 ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13628 }
13629
13630 return OP_M (ins, bytemode, sizeflag);
13631 }
13632
13633 static bool
13634 XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED)
13635 {
13636 const char (*names)[8] = att_names_xmm;
13637
13638 if (ins->need_vex)
13639 {
13640 switch (ins->vex.length)
13641 {
13642 case 128:
13643 break;
13644 case 256:
13645 names = att_names_ymm;
13646 break;
13647 default:
13648 abort ();
13649 }
13650 }
13651 oappend_register (ins, names[reg]);
13652 return true;
13653 }
13654
13655 static bool
13656 FXSAVE_Fixup (instr_info *ins, int bytemode, int sizeflag)
13657 {
13658 /* Add proper suffix to "fxsave" and "fxrstor". */
13659 USED_REX (REX_W);
13660 if (ins->rex & REX_W)
13661 {
13662 char *p = ins->mnemonicendp;
13663 *p++ = '6';
13664 *p++ = '4';
13665 *p = '\0';
13666 ins->mnemonicendp = p;
13667 }
13668 return OP_M (ins, bytemode, sizeflag);
13669 }
13670
13671 /* Display the destination register operand for instructions with
13672 VEX. */
13673
13674 static bool
13675 OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13676 {
13677 int reg, modrm_reg, sib_index = -1;
13678 const char (*names)[8];
13679
13680 if (!ins->need_vex)
13681 abort ();
13682
13683 reg = ins->vex.register_specifier;
13684 ins->vex.register_specifier = 0;
13685 if (ins->address_mode != mode_64bit)
13686 {
13687 if (ins->vex.evex && !ins->vex.v)
13688 {
13689 oappend (ins, "(bad)");
13690 return true;
13691 }
13692
13693 reg &= 7;
13694 }
13695 else if (ins->vex.evex && !ins->vex.v)
13696 reg += 16;
13697
13698 switch (bytemode)
13699 {
13700 case scalar_mode:
13701 oappend_register (ins, att_names_xmm[reg]);
13702 return true;
13703
13704 case vex_vsib_d_w_dq_mode:
13705 case vex_vsib_q_w_dq_mode:
13706 /* This must be the 3rd operand. */
13707 if (ins->obufp != ins->op_out[2])
13708 abort ();
13709 if (ins->vex.length == 128
13710 || (bytemode != vex_vsib_d_w_dq_mode
13711 && !ins->vex.w))
13712 oappend_register (ins, att_names_xmm[reg]);
13713 else
13714 oappend_register (ins, att_names_ymm[reg]);
13715
13716 /* All 3 XMM/YMM registers must be distinct. */
13717 modrm_reg = ins->modrm.reg;
13718 if (ins->rex & REX_R)
13719 modrm_reg += 8;
13720
13721 if (ins->has_sib && ins->modrm.rm == 4)
13722 {
13723 sib_index = ins->sib.index;
13724 if (ins->rex & REX_X)
13725 sib_index += 8;
13726 }
13727
13728 if (reg == modrm_reg || reg == sib_index)
13729 strcpy (ins->obufp, "/(bad)");
13730 if (modrm_reg == sib_index || modrm_reg == reg)
13731 strcat (ins->op_out[0], "/(bad)");
13732 if (sib_index == modrm_reg || sib_index == reg)
13733 strcat (ins->op_out[1], "/(bad)");
13734
13735 return true;
13736
13737 case tmm_mode:
13738 /* All 3 TMM registers must be distinct. */
13739 if (reg >= 8)
13740 oappend (ins, "(bad)");
13741 else
13742 {
13743 /* This must be the 3rd operand. */
13744 if (ins->obufp != ins->op_out[2])
13745 abort ();
13746 oappend_register (ins, att_names_tmm[reg]);
13747 if (reg == ins->modrm.reg || reg == ins->modrm.rm)
13748 strcpy (ins->obufp, "/(bad)");
13749 }
13750
13751 if (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg
13752 || ins->modrm.rm == reg)
13753 {
13754 if (ins->modrm.reg <= 8
13755 && (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg))
13756 strcat (ins->op_out[0], "/(bad)");
13757 if (ins->modrm.rm <= 8
13758 && (ins->modrm.rm == ins->modrm.reg || ins->modrm.rm == reg))
13759 strcat (ins->op_out[1], "/(bad)");
13760 }
13761
13762 return true;
13763 }
13764
13765 switch (ins->vex.length)
13766 {
13767 case 128:
13768 switch (bytemode)
13769 {
13770 case x_mode:
13771 names = att_names_xmm;
13772 ins->evex_used |= EVEX_len_used;
13773 break;
13774 case dq_mode:
13775 if (ins->rex & REX_W)
13776 names = att_names64;
13777 else
13778 names = att_names32;
13779 break;
13780 case mask_bd_mode:
13781 case mask_mode:
13782 if (reg > 0x7)
13783 {
13784 oappend (ins, "(bad)");
13785 return true;
13786 }
13787 names = att_names_mask;
13788 break;
13789 default:
13790 abort ();
13791 return true;
13792 }
13793 break;
13794 case 256:
13795 switch (bytemode)
13796 {
13797 case x_mode:
13798 names = att_names_ymm;
13799 ins->evex_used |= EVEX_len_used;
13800 break;
13801 case mask_bd_mode:
13802 case mask_mode:
13803 if (reg <= 0x7)
13804 {
13805 names = att_names_mask;
13806 break;
13807 }
13808 /* Fall through. */
13809 default:
13810 /* See PR binutils/20893 for a reproducer. */
13811 oappend (ins, "(bad)");
13812 return true;
13813 }
13814 break;
13815 case 512:
13816 names = att_names_zmm;
13817 ins->evex_used |= EVEX_len_used;
13818 break;
13819 default:
13820 abort ();
13821 break;
13822 }
13823 oappend_register (ins, names[reg]);
13824 return true;
13825 }
13826
13827 static bool
13828 OP_VexR (instr_info *ins, int bytemode, int sizeflag)
13829 {
13830 if (ins->modrm.mod == 3)
13831 return OP_VEX (ins, bytemode, sizeflag);
13832 return true;
13833 }
13834
13835 static bool
13836 OP_VexW (instr_info *ins, int bytemode, int sizeflag)
13837 {
13838 OP_VEX (ins, bytemode, sizeflag);
13839
13840 if (ins->vex.w)
13841 {
13842 /* Swap 2nd and 3rd operands. */
13843 char *tmp = ins->op_out[2];
13844
13845 ins->op_out[2] = ins->op_out[1];
13846 ins->op_out[1] = tmp;
13847 }
13848 return true;
13849 }
13850
13851 static bool
13852 OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13853 {
13854 int reg;
13855 const char (*names)[8] = att_names_xmm;
13856
13857 if (!fetch_code (ins->info, ins->codep + 1))
13858 return false;
13859 reg = *ins->codep++;
13860
13861 if (bytemode != x_mode && bytemode != scalar_mode)
13862 abort ();
13863
13864 reg >>= 4;
13865 if (ins->address_mode != mode_64bit)
13866 reg &= 7;
13867
13868 if (bytemode == x_mode && ins->vex.length == 256)
13869 names = att_names_ymm;
13870
13871 oappend_register (ins, names[reg]);
13872
13873 if (ins->vex.w)
13874 {
13875 /* Swap 3rd and 4th operands. */
13876 char *tmp = ins->op_out[3];
13877
13878 ins->op_out[3] = ins->op_out[2];
13879 ins->op_out[2] = tmp;
13880 }
13881 return true;
13882 }
13883
13884 static bool
13885 OP_VexI4 (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13886 int sizeflag ATTRIBUTE_UNUSED)
13887 {
13888 oappend_immediate (ins, ins->codep[-1] & 0xf);
13889 return true;
13890 }
13891
13892 static bool
13893 VPCMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13894 int sizeflag ATTRIBUTE_UNUSED)
13895 {
13896 unsigned int cmp_type;
13897
13898 if (!ins->vex.evex)
13899 abort ();
13900
13901 if (!fetch_code (ins->info, ins->codep + 1))
13902 return false;
13903 cmp_type = *ins->codep++ & 0xff;
13904 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13905 If it's the case, print suffix, otherwise - print the immediate. */
13906 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
13907 && cmp_type != 3
13908 && cmp_type != 7)
13909 {
13910 char suffix[3];
13911 char *p = ins->mnemonicendp - 2;
13912
13913 /* vpcmp* can have both one- and two-lettered suffix. */
13914 if (p[0] == 'p')
13915 {
13916 p++;
13917 suffix[0] = p[0];
13918 suffix[1] = '\0';
13919 }
13920 else
13921 {
13922 suffix[0] = p[0];
13923 suffix[1] = p[1];
13924 suffix[2] = '\0';
13925 }
13926
13927 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13928 ins->mnemonicendp += simd_cmp_op[cmp_type].len;
13929 }
13930 else
13931 {
13932 /* We have a reserved extension byte. Output it directly. */
13933 oappend_immediate (ins, cmp_type);
13934 }
13935 return true;
13936 }
13937
13938 static const struct op xop_cmp_op[] =
13939 {
13940 { STRING_COMMA_LEN ("lt") },
13941 { STRING_COMMA_LEN ("le") },
13942 { STRING_COMMA_LEN ("gt") },
13943 { STRING_COMMA_LEN ("ge") },
13944 { STRING_COMMA_LEN ("eq") },
13945 { STRING_COMMA_LEN ("neq") },
13946 { STRING_COMMA_LEN ("false") },
13947 { STRING_COMMA_LEN ("true") }
13948 };
13949
13950 static bool
13951 VPCOM_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13952 int sizeflag ATTRIBUTE_UNUSED)
13953 {
13954 unsigned int cmp_type;
13955
13956 if (!fetch_code (ins->info, ins->codep + 1))
13957 return false;
13958 cmp_type = *ins->codep++ & 0xff;
13959 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
13960 {
13961 char suffix[3];
13962 char *p = ins->mnemonicendp - 2;
13963
13964 /* vpcom* can have both one- and two-lettered suffix. */
13965 if (p[0] == 'm')
13966 {
13967 p++;
13968 suffix[0] = p[0];
13969 suffix[1] = '\0';
13970 }
13971 else
13972 {
13973 suffix[0] = p[0];
13974 suffix[1] = p[1];
13975 suffix[2] = '\0';
13976 }
13977
13978 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
13979 ins->mnemonicendp += xop_cmp_op[cmp_type].len;
13980 }
13981 else
13982 {
13983 /* We have a reserved extension byte. Output it directly. */
13984 oappend_immediate (ins, cmp_type);
13985 }
13986 return true;
13987 }
13988
13989 static const struct op pclmul_op[] =
13990 {
13991 { STRING_COMMA_LEN ("lql") },
13992 { STRING_COMMA_LEN ("hql") },
13993 { STRING_COMMA_LEN ("lqh") },
13994 { STRING_COMMA_LEN ("hqh") }
13995 };
13996
13997 static bool
13998 PCLMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13999 int sizeflag ATTRIBUTE_UNUSED)
14000 {
14001 unsigned int pclmul_type;
14002
14003 if (!fetch_code (ins->info, ins->codep + 1))
14004 return false;
14005 pclmul_type = *ins->codep++ & 0xff;
14006 switch (pclmul_type)
14007 {
14008 case 0x10:
14009 pclmul_type = 2;
14010 break;
14011 case 0x11:
14012 pclmul_type = 3;
14013 break;
14014 default:
14015 break;
14016 }
14017 if (pclmul_type < ARRAY_SIZE (pclmul_op))
14018 {
14019 char suffix[4];
14020 char *p = ins->mnemonicendp - 3;
14021 suffix[0] = p[0];
14022 suffix[1] = p[1];
14023 suffix[2] = p[2];
14024 suffix[3] = '\0';
14025 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14026 ins->mnemonicendp += pclmul_op[pclmul_type].len;
14027 }
14028 else
14029 {
14030 /* We have a reserved extension byte. Output it directly. */
14031 oappend_immediate (ins, pclmul_type);
14032 }
14033 return true;
14034 }
14035
14036 static bool
14037 MOVSXD_Fixup (instr_info *ins, int bytemode, int sizeflag)
14038 {
14039 /* Add proper suffix to "movsxd". */
14040 char *p = ins->mnemonicendp;
14041
14042 switch (bytemode)
14043 {
14044 case movsxd_mode:
14045 if (!ins->intel_syntax)
14046 {
14047 USED_REX (REX_W);
14048 if (ins->rex & REX_W)
14049 {
14050 *p++ = 'l';
14051 *p++ = 'q';
14052 break;
14053 }
14054 }
14055
14056 *p++ = 'x';
14057 *p++ = 'd';
14058 break;
14059 default:
14060 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
14061 break;
14062 }
14063
14064 ins->mnemonicendp = p;
14065 *p = '\0';
14066 return OP_E (ins, bytemode, sizeflag);
14067 }
14068
14069 static bool
14070 DistinctDest_Fixup (instr_info *ins, int bytemode, int sizeflag)
14071 {
14072 unsigned int reg = ins->vex.register_specifier;
14073 unsigned int modrm_reg = ins->modrm.reg;
14074 unsigned int modrm_rm = ins->modrm.rm;
14075
14076 /* Calc destination register number. */
14077 if (ins->rex & REX_R)
14078 modrm_reg += 8;
14079 if (!ins->vex.r)
14080 modrm_reg += 16;
14081
14082 /* Calc src1 register number. */
14083 if (ins->address_mode != mode_64bit)
14084 reg &= 7;
14085 else if (ins->vex.evex && !ins->vex.v)
14086 reg += 16;
14087
14088 /* Calc src2 register number. */
14089 if (ins->modrm.mod == 3)
14090 {
14091 if (ins->rex & REX_B)
14092 modrm_rm += 8;
14093 if (ins->rex & REX_X)
14094 modrm_rm += 16;
14095 }
14096
14097 /* Destination and source registers must be distinct, output bad if
14098 dest == src1 or dest == src2. */
14099 if (modrm_reg == reg
14100 || (ins->modrm.mod == 3
14101 && modrm_reg == modrm_rm))
14102 {
14103 oappend (ins, "(bad)");
14104 return true;
14105 }
14106 return OP_XMM (ins, bytemode, sizeflag);
14107 }
14108
14109 static bool
14110 OP_Rounding (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14111 {
14112 if (ins->modrm.mod != 3 || !ins->vex.b)
14113 return true;
14114
14115 switch (bytemode)
14116 {
14117 case evex_rounding_64_mode:
14118 if (ins->address_mode != mode_64bit || !ins->vex.w)
14119 return true;
14120 /* Fall through. */
14121 case evex_rounding_mode:
14122 ins->evex_used |= EVEX_b_used;
14123 oappend (ins, names_rounding[ins->vex.ll]);
14124 break;
14125 case evex_sae_mode:
14126 ins->evex_used |= EVEX_b_used;
14127 oappend (ins, "{");
14128 break;
14129 default:
14130 abort ();
14131 }
14132 oappend (ins, "sae}");
14133 return true;
14134 }
14135
14136 static bool
14137 PREFETCHI_Fixup (instr_info *ins, int bytemode, int sizeflag)
14138 {
14139 if (ins->modrm.mod != 0 || ins->modrm.rm != 5)
14140 {
14141 if (ins->intel_syntax)
14142 {
14143 ins->mnemonicendp = stpcpy (ins->obuf, "nop ");
14144 }
14145 else
14146 {
14147 USED_REX (REX_W);
14148 if (ins->rex & REX_W)
14149 ins->mnemonicendp = stpcpy (ins->obuf, "nopq ");
14150 else
14151 {
14152 if (sizeflag & DFLAG)
14153 ins->mnemonicendp = stpcpy (ins->obuf, "nopl ");
14154 else
14155 ins->mnemonicendp = stpcpy (ins->obuf, "nopw ");
14156 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
14157 }
14158 }
14159 bytemode = v_mode;
14160 }
14161
14162 return OP_M (ins, bytemode, sizeflag);
14163 }