i386-dis.c revision 1.1.1.12 1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2024 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 (at) prep.ai.mit.edu)
23 July 1988
24 modified by John Hassey (hassey (at) dg-rtp.dg.com)
25 x86-64 support added by Jan Hubicka (jh (at) suse.cz)
26 VIA PadLock support by Michal Ludvig (mludvig (at) 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
49 static bool OP_E (instr_info *, int, int);
50 static bool OP_E_memory (instr_info *, int, int);
51 static bool OP_indirE (instr_info *, int, int);
52 static bool OP_G (instr_info *, int, int);
53 static bool OP_ST (instr_info *, int, int);
54 static bool OP_STi (instr_info *, int, int);
55 static bool OP_Skip_MODRM (instr_info *, int, int);
56 static bool OP_REG (instr_info *, int, int);
57 static bool OP_IMREG (instr_info *, int, int);
58 static bool OP_I (instr_info *, int, int);
59 static bool OP_I64 (instr_info *, int, int);
60 static bool OP_sI (instr_info *, int, int);
61 static bool OP_J (instr_info *, int, int);
62 static bool OP_SEG (instr_info *, int, int);
63 static bool OP_DIR (instr_info *, int, int);
64 static bool OP_OFF (instr_info *, int, int);
65 static bool OP_OFF64 (instr_info *, int, int);
66 static bool OP_ESreg (instr_info *, int, int);
67 static bool OP_DSreg (instr_info *, int, int);
68 static bool OP_C (instr_info *, int, int);
69 static bool OP_D (instr_info *, int, int);
70 static bool OP_T (instr_info *, int, int);
71 static bool OP_MMX (instr_info *, int, int);
72 static bool OP_XMM (instr_info *, int, int);
73 static bool OP_EM (instr_info *, int, int);
74 static bool OP_EX (instr_info *, int, int);
75 static bool OP_EMC (instr_info *, int,int);
76 static bool OP_MXC (instr_info *, int,int);
77 static bool OP_R (instr_info *, int, int);
78 static bool OP_M (instr_info *, int, int);
79 static bool OP_VEX (instr_info *, int, int);
80 static bool OP_VexR (instr_info *, int, int);
81 static bool OP_VexW (instr_info *, int, int);
82 static bool OP_Rounding (instr_info *, int, int);
83 static bool OP_REG_VexI4 (instr_info *, int, int);
84 static bool OP_VexI4 (instr_info *, int, int);
85 static bool OP_0f07 (instr_info *, int, int);
86 static bool OP_Monitor (instr_info *, int, int);
87 static bool OP_Mwait (instr_info *, int, int);
88
89 static bool PCLMUL_Fixup (instr_info *, int, int);
90 static bool VPCMP_Fixup (instr_info *, int, int);
91 static bool VPCOM_Fixup (instr_info *, int, int);
92 static bool NOP_Fixup (instr_info *, int, int);
93 static bool MONTMUL_Fixup (instr_info *, int, int);
94 static bool OP_3DNowSuffix (instr_info *, int, int);
95 static bool CMP_Fixup (instr_info *, int, int);
96 static bool REP_Fixup (instr_info *, int, int);
97 static bool SEP_Fixup (instr_info *, int, int);
98 static bool BND_Fixup (instr_info *, int, int);
99 static bool NOTRACK_Fixup (instr_info *, int, int);
100 static bool HLE_Fixup1 (instr_info *, int, int);
101 static bool HLE_Fixup2 (instr_info *, int, int);
102 static bool HLE_Fixup3 (instr_info *, int, int);
103 static bool CMPXCHG8B_Fixup (instr_info *, int, int);
104 static bool XMM_Fixup (instr_info *, int, int);
105 static bool FXSAVE_Fixup (instr_info *, int, int);
106 static bool MOVSXD_Fixup (instr_info *, int, int);
107 static bool DistinctDest_Fixup (instr_info *, int, int);
108 static bool PREFETCHI_Fixup (instr_info *, int, int);
109 static bool PUSH2_POP2_Fixup (instr_info *, int, int);
110 static bool JMPABS_Fixup (instr_info *, int, int);
111 static bool CFCMOV_Fixup (instr_info *, int, int);
112
113 static void ATTRIBUTE_PRINTF_3 i386_dis_printf (const disassemble_info *,
114 enum disassembler_style,
115 const char *, ...);
116
117 /* This character is used to encode style information within the output
118 buffers. See oappend_insert_style for more details. */
119 #define STYLE_MARKER_CHAR '\002'
120
121 /* The maximum operand buffer size. */
122 #define MAX_OPERAND_BUFFER_SIZE 128
123
124 enum address_mode
125 {
126 mode_16bit,
127 mode_32bit,
128 mode_64bit
129 };
130
131 static const char *prefix_name (enum address_mode, uint8_t, int);
132
133 enum x86_64_isa
134 {
135 amd64 = 1,
136 intel64
137 };
138
139 enum evex_type
140 {
141 evex_default = 0,
142 evex_from_legacy,
143 evex_from_vex,
144 };
145
146 struct instr_info
147 {
148 enum address_mode address_mode;
149
150 /* Flags for the prefixes for the current instruction. See below. */
151 int prefixes;
152
153 /* REX prefix the current instruction. See below. */
154 uint8_t rex;
155 /* Bits of REX we've already used. */
156 uint8_t rex_used;
157
158 /* Record W R4 X4 B4 bits for rex2. */
159 unsigned char rex2;
160 /* Bits of rex2 we've already used. */
161 unsigned char rex2_used;
162 unsigned char rex2_payload;
163
164 bool need_modrm;
165 unsigned char condition_code;
166 unsigned char need_vex;
167 bool has_sib;
168
169 /* Flags for ins->prefixes which we somehow handled when printing the
170 current instruction. */
171 int used_prefixes;
172
173 /* Flags for EVEX bits which we somehow handled when printing the
174 current instruction. */
175 int evex_used;
176
177 char obuf[MAX_OPERAND_BUFFER_SIZE];
178 char *obufp;
179 char *mnemonicendp;
180 const uint8_t *start_codep;
181 uint8_t *codep;
182 const uint8_t *end_codep;
183 unsigned char nr_prefixes;
184 signed char last_lock_prefix;
185 signed char last_repz_prefix;
186 signed char last_repnz_prefix;
187 signed char last_data_prefix;
188 signed char last_addr_prefix;
189 signed char last_rex_prefix;
190 signed char last_rex2_prefix;
191 signed char last_seg_prefix;
192 signed char fwait_prefix;
193 /* The active segment register prefix. */
194 unsigned char active_seg_prefix;
195
196 #define MAX_CODE_LENGTH 15
197 /* We can up to 14 ins->prefixes since the maximum instruction length is
198 15bytes. */
199 uint8_t all_prefixes[MAX_CODE_LENGTH - 1];
200 disassemble_info *info;
201
202 struct
203 {
204 int mod;
205 int reg;
206 int rm;
207 }
208 modrm;
209
210 struct
211 {
212 int scale;
213 int index;
214 int base;
215 }
216 sib;
217
218 struct
219 {
220 int register_specifier;
221 int length;
222 int prefix;
223 int mask_register_specifier;
224 int scc;
225 int ll;
226 bool w;
227 bool evex;
228 bool v;
229 bool zeroing;
230 bool b;
231 bool no_broadcast;
232 bool nf;
233 bool u;
234 }
235 vex;
236
237 /* For APX EVEX-promoted prefix, EVEX.ND shares the same bit as vex.b. */
238 #define nd b
239
240 enum evex_type evex_type;
241
242 /* Remember if the current op is a jump instruction. */
243 bool op_is_jump;
244
245 bool two_source_ops;
246
247 /* Record whether EVEX masking is used incorrectly. */
248 bool illegal_masking;
249
250 /* Record whether the modrm byte has been skipped. */
251 bool has_skipped_modrm;
252
253 unsigned char op_ad;
254 signed char op_index[MAX_OPERANDS];
255 bool op_riprel[MAX_OPERANDS];
256 char *op_out[MAX_OPERANDS];
257 bfd_vma op_address[MAX_OPERANDS];
258 bfd_vma start_pc;
259
260 /* On the 386's of 1988, the maximum length of an instruction is 15 bytes.
261 * (see topic "Redundant ins->prefixes" in the "Differences from 8086"
262 * section of the "Virtual 8086 Mode" chapter.)
263 * 'pc' should be the address of this instruction, it will
264 * be used to print the target address if this is a relative jump or call
265 * The function returns the length of this instruction in bytes.
266 */
267 char intel_syntax;
268 bool intel_mnemonic;
269 char open_char;
270 char close_char;
271 char separator_char;
272 char scale_char;
273
274 enum x86_64_isa isa64;
275 };
276
277 struct dis_private {
278 bfd_vma insn_start;
279 int orig_sizeflag;
280
281 /* Indexes first byte not fetched. */
282 unsigned int fetched;
283 uint8_t the_buffer[2 * MAX_CODE_LENGTH - 1];
284 };
285
286 /* Mark parts used in the REX prefix. When we are testing for
287 empty prefix (for 8bit register REX extension), just mask it
288 out. Otherwise test for REX bit is excuse for existence of REX
289 only in case value is nonzero. */
290 #define USED_REX(value) \
291 { \
292 if (value) \
293 { \
294 if (ins->rex & value) \
295 ins->rex_used |= (value) | REX_OPCODE; \
296 if (ins->rex2 & value) \
297 { \
298 ins->rex2_used |= (value); \
299 ins->rex_used |= REX_OPCODE; \
300 } \
301 } \
302 else \
303 ins->rex_used |= REX_OPCODE; \
304 }
305
306
307 #define EVEX_b_used 1
308 #define EVEX_len_used 2
309
310
311 /* {rex2} is not printed when the REX2_SPECIAL is set. */
312 #define REX2_SPECIAL 16
313
314 /* Flags stored in PREFIXES. */
315 #define PREFIX_REPZ 1
316 #define PREFIX_REPNZ 2
317 #define PREFIX_CS 4
318 #define PREFIX_SS 8
319 #define PREFIX_DS 0x10
320 #define PREFIX_ES 0x20
321 #define PREFIX_FS 0x40
322 #define PREFIX_GS 0x80
323 #define PREFIX_LOCK 0x100
324 #define PREFIX_DATA 0x200
325 #define PREFIX_ADDR 0x400
326 #define PREFIX_FWAIT 0x800
327 #define PREFIX_REX2 0x1000
328 #define PREFIX_NP_OR_DATA 0x2000
329 #define NO_PREFIX 0x4000
330
331 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
332 to ADDR (exclusive) are valid. Returns true for success, false
333 on error. */
334 static bool
335 fetch_code (struct disassemble_info *info, const uint8_t *until)
336 {
337 int status = -1;
338 struct dis_private *priv = info->private_data;
339 bfd_vma start = priv->insn_start + priv->fetched;
340 uint8_t *fetch_end = priv->the_buffer + priv->fetched;
341 ptrdiff_t needed = until - fetch_end;
342
343 if (needed <= 0)
344 return true;
345
346 if (priv->fetched + (size_t) needed <= ARRAY_SIZE (priv->the_buffer))
347 status = (*info->read_memory_func) (start, fetch_end, needed, info);
348 if (status != 0)
349 {
350 /* If we did manage to read at least one byte, then
351 print_insn_i386 will do something sensible. Otherwise, print
352 an error. We do that here because this is where we know
353 STATUS. */
354 if (!priv->fetched)
355 (*info->memory_error_func) (status, start, info);
356 return false;
357 }
358
359 priv->fetched += needed;
360 return true;
361 }
362
363 static bool
364 fetch_modrm (instr_info *ins)
365 {
366 if (!fetch_code (ins->info, ins->codep + 1))
367 return false;
368
369 ins->modrm.mod = (*ins->codep >> 6) & 3;
370 ins->modrm.reg = (*ins->codep >> 3) & 7;
371 ins->modrm.rm = *ins->codep & 7;
372
373 return true;
374 }
375
376 static int
377 fetch_error (const instr_info *ins)
378 {
379 /* Getting here means we tried for data but didn't get it. That
380 means we have an incomplete instruction of some sort. Just
381 print the first byte as a prefix or a .byte pseudo-op. */
382 const struct dis_private *priv = ins->info->private_data;
383 const char *name = NULL;
384
385 if (ins->codep <= priv->the_buffer)
386 return -1;
387
388 if (ins->prefixes || ins->fwait_prefix >= 0 || (ins->rex & REX_OPCODE))
389 name = prefix_name (ins->address_mode, priv->the_buffer[0],
390 priv->orig_sizeflag);
391 if (name != NULL)
392 i386_dis_printf (ins->info, dis_style_mnemonic, "%s", name);
393 else
394 {
395 /* Just print the first byte as a .byte instruction. */
396 i386_dis_printf (ins->info, dis_style_assembler_directive, ".byte ");
397 i386_dis_printf (ins->info, dis_style_immediate, "%#x",
398 (unsigned int) priv->the_buffer[0]);
399 }
400
401 return 1;
402 }
403
404 /* Possible values for prefix requirement. */
405 #define PREFIX_IGNORED_SHIFT 16
406 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
407 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
408 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
409 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
410 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
411 #define PREFIX_REX2_ILLEGAL (PREFIX_REX2 << PREFIX_IGNORED_SHIFT)
412
413 /* Opcode prefixes. */
414 #define PREFIX_OPCODE (PREFIX_REPZ \
415 | PREFIX_REPNZ \
416 | PREFIX_DATA)
417
418 /* Prefixes ignored. */
419 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
420 | PREFIX_IGNORED_REPNZ \
421 | PREFIX_IGNORED_DATA)
422
423 #define XX { NULL, 0 }
424 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
425
426 #define Eb { OP_E, b_mode }
427 #define Ebnd { OP_E, bnd_mode }
428 #define EbS { OP_E, b_swap_mode }
429 #define EbndS { OP_E, bnd_swap_mode }
430 #define Ev { OP_E, v_mode }
431 #define Eva { OP_E, va_mode }
432 #define Ev_bnd { OP_E, v_bnd_mode }
433 #define EvS { OP_E, v_swap_mode }
434 #define Ed { OP_E, d_mode }
435 #define Edq { OP_E, dq_mode }
436 #define Edb { OP_E, db_mode }
437 #define Edw { OP_E, dw_mode }
438 #define Eq { OP_E, q_mode }
439 #define indirEv { OP_indirE, indir_v_mode }
440 #define indirEp { OP_indirE, f_mode }
441 #define stackEv { OP_E, stack_v_mode }
442 #define Em { OP_E, m_mode }
443 #define Ew { OP_E, w_mode }
444 #define M { OP_M, 0 } /* lea, lgdt, etc. */
445 #define Ma { OP_M, a_mode }
446 #define Mb { OP_M, b_mode }
447 #define Md { OP_M, d_mode }
448 #define Mdq { OP_M, dq_mode }
449 #define Mo { OP_M, o_mode }
450 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
451 #define Mq { OP_M, q_mode }
452 #define Mv { OP_M, v_mode }
453 #define Mv_bnd { OP_M, v_bndmk_mode }
454 #define Mw { OP_M, w_mode }
455 #define Mx { OP_M, x_mode }
456 #define Mxmm { OP_M, xmm_mode }
457 #define Mymm { OP_M, ymm_mode }
458 #define Gb { OP_G, b_mode }
459 #define Gbnd { OP_G, bnd_mode }
460 #define Gv { OP_G, v_mode }
461 #define Gd { OP_G, d_mode }
462 #define Gdq { OP_G, dq_mode }
463 #define Gq { OP_G, q_mode }
464 #define Gm { OP_G, m_mode }
465 #define Gva { OP_G, va_mode }
466 #define Gw { OP_G, w_mode }
467 #define Ib { OP_I, b_mode }
468 #define sIb { OP_sI, b_mode } /* sign extened byte */
469 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
470 #define Iv { OP_I, v_mode }
471 #define sIv { OP_sI, v_mode }
472 #define Iv64 { OP_I64, v_mode }
473 #define Id { OP_I, d_mode }
474 #define Iw { OP_I, w_mode }
475 #define I1 { OP_I, const_1_mode }
476 #define Jb { OP_J, b_mode }
477 #define Jv { OP_J, v_mode }
478 #define Jdqw { OP_J, dqw_mode }
479 #define Cm { OP_C, m_mode }
480 #define Dm { OP_D, m_mode }
481 #define Td { OP_T, d_mode }
482 #define Skip_MODRM { OP_Skip_MODRM, 0 }
483
484 #define RMeAX { OP_REG, eAX_reg }
485 #define RMeBX { OP_REG, eBX_reg }
486 #define RMeCX { OP_REG, eCX_reg }
487 #define RMeDX { OP_REG, eDX_reg }
488 #define RMeSP { OP_REG, eSP_reg }
489 #define RMeBP { OP_REG, eBP_reg }
490 #define RMeSI { OP_REG, eSI_reg }
491 #define RMeDI { OP_REG, eDI_reg }
492 #define RMrAX { OP_REG, rAX_reg }
493 #define RMrBX { OP_REG, rBX_reg }
494 #define RMrCX { OP_REG, rCX_reg }
495 #define RMrDX { OP_REG, rDX_reg }
496 #define RMrSP { OP_REG, rSP_reg }
497 #define RMrBP { OP_REG, rBP_reg }
498 #define RMrSI { OP_REG, rSI_reg }
499 #define RMrDI { OP_REG, rDI_reg }
500 #define RMAL { OP_REG, al_reg }
501 #define RMCL { OP_REG, cl_reg }
502 #define RMDL { OP_REG, dl_reg }
503 #define RMBL { OP_REG, bl_reg }
504 #define RMAH { OP_REG, ah_reg }
505 #define RMCH { OP_REG, ch_reg }
506 #define RMDH { OP_REG, dh_reg }
507 #define RMBH { OP_REG, bh_reg }
508 #define RMAX { OP_REG, ax_reg }
509 #define RMDX { OP_REG, dx_reg }
510
511 #define eAX { OP_IMREG, eAX_reg }
512 #define AL { OP_IMREG, al_reg }
513 #define CL { OP_IMREG, cl_reg }
514 #define zAX { OP_IMREG, z_mode_ax_reg }
515 #define indirDX { OP_IMREG, indir_dx_reg }
516
517 #define Sw { OP_SEG, w_mode }
518 #define Sv { OP_SEG, v_mode }
519 #define Ap { OP_DIR, 0 }
520 #define Ob { OP_OFF64, b_mode }
521 #define Ov { OP_OFF64, v_mode }
522 #define Xb { OP_DSreg, eSI_reg }
523 #define Xv { OP_DSreg, eSI_reg }
524 #define Xz { OP_DSreg, eSI_reg }
525 #define Yb { OP_ESreg, eDI_reg }
526 #define Yv { OP_ESreg, eDI_reg }
527 #define DSBX { OP_DSreg, eBX_reg }
528
529 #define es { OP_REG, es_reg }
530 #define ss { OP_REG, ss_reg }
531 #define cs { OP_REG, cs_reg }
532 #define ds { OP_REG, ds_reg }
533 #define fs { OP_REG, fs_reg }
534 #define gs { OP_REG, gs_reg }
535
536 #define MX { OP_MMX, 0 }
537 #define XM { OP_XMM, 0 }
538 #define XMScalar { OP_XMM, scalar_mode }
539 #define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode }
540 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
541 #define XMM { OP_XMM, xmm_mode }
542 #define TMM { OP_XMM, tmm_mode }
543 #define XMxmmq { OP_XMM, xmmq_mode }
544 #define EM { OP_EM, v_mode }
545 #define EMS { OP_EM, v_swap_mode }
546 #define EMd { OP_EM, d_mode }
547 #define EMx { OP_EM, x_mode }
548 #define EXbwUnit { OP_EX, bw_unit_mode }
549 #define EXb { OP_EX, b_mode }
550 #define EXw { OP_EX, w_mode }
551 #define EXd { OP_EX, d_mode }
552 #define EXdS { OP_EX, d_swap_mode }
553 #define EXwS { OP_EX, w_swap_mode }
554 #define EXq { OP_EX, q_mode }
555 #define EXqS { OP_EX, q_swap_mode }
556 #define EXdq { OP_EX, dq_mode }
557 #define EXx { OP_EX, x_mode }
558 #define EXxh { OP_EX, xh_mode }
559 #define EXxS { OP_EX, x_swap_mode }
560 #define EXxmm { OP_EX, xmm_mode }
561 #define EXymm { OP_EX, ymm_mode }
562 #define EXxmmq { OP_EX, xmmq_mode }
563 #define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode }
564 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
565 #define EXxmmdw { OP_EX, xmmdw_mode }
566 #define EXxmmqd { OP_EX, xmmqd_mode }
567 #define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode }
568 #define EXymmq { OP_EX, ymmq_mode }
569 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
570 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
571 #define Rd { OP_R, d_mode }
572 #define Rdq { OP_R, dq_mode }
573 #define Rq { OP_R, q_mode }
574 #define Nq { OP_R, q_mm_mode }
575 #define Ux { OP_R, x_mode }
576 #define Uxmm { OP_R, xmm_mode }
577 #define Rxmmq { OP_R, xmmq_mode }
578 #define Rymm { OP_R, ymm_mode }
579 #define Rtmm { OP_R, tmm_mode }
580 #define EMCq { OP_EMC, q_mode }
581 #define MXC { OP_MXC, 0 }
582 #define OPSUF { OP_3DNowSuffix, 0 }
583 #define SEP { SEP_Fixup, 0 }
584 #define CMP { CMP_Fixup, 0 }
585 #define XMM0 { XMM_Fixup, 0 }
586 #define FXSAVE { FXSAVE_Fixup, 0 }
587
588 #define Vex { OP_VEX, x_mode }
589 #define VexW { OP_VexW, x_mode }
590 #define VexScalar { OP_VEX, scalar_mode }
591 #define VexScalarR { OP_VexR, scalar_mode }
592 #define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode }
593 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
594 #define VexGdq { OP_VEX, dq_mode }
595 #define VexGb { OP_VEX, b_mode }
596 #define VexGv { OP_VEX, v_mode }
597 #define VexTmm { OP_VEX, tmm_mode }
598 #define XMVexI4 { OP_REG_VexI4, x_mode }
599 #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
600 #define VexI4 { OP_VexI4, 0 }
601 #define PCLMUL { PCLMUL_Fixup, 0 }
602 #define VPCMP { VPCMP_Fixup, 0 }
603 #define VPCOM { VPCOM_Fixup, 0 }
604
605 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
606 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
607 #define EXxEVexS { OP_Rounding, evex_sae_mode }
608
609 #define MaskG { OP_G, mask_mode }
610 #define MaskE { OP_E, mask_mode }
611 #define MaskR { OP_R, mask_mode }
612 #define MaskBDE { OP_E, mask_bd_mode }
613 #define MaskVex { OP_VEX, mask_mode }
614
615 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
616 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
617
618 #define MVexSIBMEM { OP_M, vex_sibmem_mode }
619
620 /* Used handle "rep" prefix for string instructions. */
621 #define Xbr { REP_Fixup, eSI_reg }
622 #define Xvr { REP_Fixup, eSI_reg }
623 #define Ybr { REP_Fixup, eDI_reg }
624 #define Yvr { REP_Fixup, eDI_reg }
625 #define Yzr { REP_Fixup, eDI_reg }
626 #define indirDXr { REP_Fixup, indir_dx_reg }
627 #define ALr { REP_Fixup, al_reg }
628 #define eAXr { REP_Fixup, eAX_reg }
629
630 /* Used handle HLE prefix for lockable instructions. */
631 #define Ebh1 { HLE_Fixup1, b_mode }
632 #define Evh1 { HLE_Fixup1, v_mode }
633 #define Ebh2 { HLE_Fixup2, b_mode }
634 #define Evh2 { HLE_Fixup2, v_mode }
635 #define Ebh3 { HLE_Fixup3, b_mode }
636 #define Evh3 { HLE_Fixup3, v_mode }
637
638 #define BND { BND_Fixup, 0 }
639 #define NOTRACK { NOTRACK_Fixup, 0 }
640
641 #define cond_jump_flag { NULL, cond_jump_mode }
642 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
643
644 /* bits in sizeflag */
645 #define SUFFIX_ALWAYS 4
646 #define AFLAG 2
647 #define DFLAG 1
648
649 enum
650 {
651 /* byte operand */
652 b_mode = 1,
653 /* byte operand with operand swapped */
654 b_swap_mode,
655 /* byte operand, sign extend like 'T' suffix */
656 b_T_mode,
657 /* operand size depends on prefixes */
658 v_mode,
659 /* operand size depends on prefixes with operand swapped */
660 v_swap_mode,
661 /* operand size depends on address prefix */
662 va_mode,
663 /* word operand */
664 w_mode,
665 /* double word operand */
666 d_mode,
667 /* word operand with operand swapped */
668 w_swap_mode,
669 /* double word operand with operand swapped */
670 d_swap_mode,
671 /* quad word operand */
672 q_mode,
673 /* 8-byte MM operand */
674 q_mm_mode,
675 /* quad word operand with operand swapped */
676 q_swap_mode,
677 /* ten-byte operand */
678 t_mode,
679 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
680 broadcast enabled. */
681 x_mode,
682 /* Similar to x_mode, but with different EVEX mem shifts. */
683 evex_x_gscat_mode,
684 /* Similar to x_mode, but with yet different EVEX mem shifts. */
685 bw_unit_mode,
686 /* Similar to x_mode, but with disabled broadcast. */
687 evex_x_nobcst_mode,
688 /* Similar to x_mode, but with operands swapped and disabled broadcast
689 in EVEX. */
690 x_swap_mode,
691 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
692 broadcast of 16bit enabled. */
693 xh_mode,
694 /* 16-byte XMM operand */
695 xmm_mode,
696 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
697 memory operand (depending on vector length). Broadcast isn't
698 allowed. */
699 xmmq_mode,
700 /* Same as xmmq_mode, but broadcast is allowed. */
701 evex_half_bcst_xmmq_mode,
702 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
703 memory operand (depending on vector length). 16bit broadcast. */
704 evex_half_bcst_xmmqh_mode,
705 /* 16-byte XMM, word, double word or quad word operand. */
706 xmmdw_mode,
707 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
708 xmmqd_mode,
709 /* 16-byte XMM, double word, quad word operand or xmm word operand.
710 16bit broadcast. */
711 evex_half_bcst_xmmqdh_mode,
712 /* 32-byte YMM operand */
713 ymm_mode,
714 /* quad word, ymmword or zmmword memory operand. */
715 ymmq_mode,
716 /* TMM operand */
717 tmm_mode,
718 /* d_mode in 32bit, q_mode in 64bit mode. */
719 m_mode,
720 /* pair of v_mode operands */
721 a_mode,
722 cond_jump_mode,
723 loop_jcxz_mode,
724 movsxd_mode,
725 v_bnd_mode,
726 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
727 v_bndmk_mode,
728 /* operand size depends on REX.W / VEX.W. */
729 dq_mode,
730 /* Displacements like v_mode without considering Intel64 ISA. */
731 dqw_mode,
732 /* bounds operand */
733 bnd_mode,
734 /* bounds operand with operand swapped */
735 bnd_swap_mode,
736 /* 4- or 6-byte pointer operand */
737 f_mode,
738 const_1_mode,
739 /* v_mode for indirect branch opcodes. */
740 indir_v_mode,
741 /* v_mode for stack-related opcodes. */
742 stack_v_mode,
743 /* non-quad operand size depends on prefixes */
744 z_mode,
745 /* 16-byte operand */
746 o_mode,
747 /* registers like d_mode, memory like b_mode. */
748 db_mode,
749 /* registers like d_mode, memory like w_mode. */
750 dw_mode,
751
752 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
753 vex_vsib_d_w_dq_mode,
754 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
755 vex_vsib_q_w_dq_mode,
756 /* mandatory non-vector SIB. */
757 vex_sibmem_mode,
758
759 /* scalar, ignore vector length. */
760 scalar_mode,
761
762 /* Static rounding. */
763 evex_rounding_mode,
764 /* Static rounding, 64-bit mode only. */
765 evex_rounding_64_mode,
766 /* Supress all exceptions. */
767 evex_sae_mode,
768
769 /* Mask register operand. */
770 mask_mode,
771 /* Mask register operand. */
772 mask_bd_mode,
773
774 es_reg,
775 cs_reg,
776 ss_reg,
777 ds_reg,
778 fs_reg,
779 gs_reg,
780
781 eAX_reg,
782 eCX_reg,
783 eDX_reg,
784 eBX_reg,
785 eSP_reg,
786 eBP_reg,
787 eSI_reg,
788 eDI_reg,
789
790 al_reg,
791 cl_reg,
792 dl_reg,
793 bl_reg,
794 ah_reg,
795 ch_reg,
796 dh_reg,
797 bh_reg,
798
799 ax_reg,
800 cx_reg,
801 dx_reg,
802 bx_reg,
803 sp_reg,
804 bp_reg,
805 si_reg,
806 di_reg,
807
808 rAX_reg,
809 rCX_reg,
810 rDX_reg,
811 rBX_reg,
812 rSP_reg,
813 rBP_reg,
814 rSI_reg,
815 rDI_reg,
816
817 z_mode_ax_reg,
818 indir_dx_reg
819 };
820
821 enum
822 {
823 FLOATCODE = 1,
824 USE_REG_TABLE,
825 USE_MOD_TABLE,
826 USE_RM_TABLE,
827 USE_PREFIX_TABLE,
828 USE_X86_64_TABLE,
829 USE_X86_64_EVEX_FROM_VEX_TABLE,
830 USE_X86_64_EVEX_PFX_TABLE,
831 USE_X86_64_EVEX_W_TABLE,
832 USE_X86_64_EVEX_MEM_W_TABLE,
833 USE_3BYTE_TABLE,
834 USE_XOP_8F_TABLE,
835 USE_VEX_C4_TABLE,
836 USE_VEX_C5_TABLE,
837 USE_VEX_LEN_TABLE,
838 USE_VEX_W_TABLE,
839 USE_EVEX_TABLE,
840 USE_EVEX_LEN_TABLE
841 };
842
843 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
844
845 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
846 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
847 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
848 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
849 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
850 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
851 #define X86_64_EVEX_FROM_VEX_TABLE(I) \
852 DIS386 (USE_X86_64_EVEX_FROM_VEX_TABLE, (I))
853 #define X86_64_EVEX_PFX_TABLE(I) DIS386 (USE_X86_64_EVEX_PFX_TABLE, (I))
854 #define X86_64_EVEX_W_TABLE(I) DIS386 (USE_X86_64_EVEX_W_TABLE, (I))
855 #define X86_64_EVEX_MEM_W_TABLE(I) DIS386 (USE_X86_64_EVEX_MEM_W_TABLE, (I))
856 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
857 #define XOP_8F_TABLE() DIS386 (USE_XOP_8F_TABLE, 0)
858 #define VEX_C4_TABLE() DIS386 (USE_VEX_C4_TABLE, 0)
859 #define VEX_C5_TABLE() DIS386 (USE_VEX_C5_TABLE, 0)
860 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
861 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
862 #define EVEX_TABLE() DIS386 (USE_EVEX_TABLE, 0)
863 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
864
865 enum
866 {
867 REG_80 = 0,
868 REG_81,
869 REG_83,
870 REG_8F,
871 REG_C0,
872 REG_C1,
873 REG_C6,
874 REG_C7,
875 REG_D0,
876 REG_D1,
877 REG_D2,
878 REG_D3,
879 REG_F6,
880 REG_F7,
881 REG_FE,
882 REG_FF,
883 REG_0F00,
884 REG_0F01,
885 REG_0F0D,
886 REG_0F18,
887 REG_0F1C_P_0_MOD_0,
888 REG_0F1E_P_1_MOD_3,
889 REG_0F38D8_PREFIX_1,
890 REG_0F3A0F_P_1,
891 REG_0F71,
892 REG_0F72,
893 REG_0F73,
894 REG_0FA6,
895 REG_0FA7,
896 REG_0FAE,
897 REG_0FBA,
898 REG_0FC7,
899 REG_VEX_0F71,
900 REG_VEX_0F72,
901 REG_VEX_0F73,
902 REG_VEX_0FAE,
903 REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0,
904 REG_VEX_0F38F3_L_0_P_0,
905 REG_VEX_MAP7_F6_L_0_W_0,
906 REG_VEX_MAP7_F8_L_0_W_0,
907
908 REG_XOP_09_01_L_0,
909 REG_XOP_09_02_L_0,
910 REG_XOP_09_12_L_0,
911 REG_XOP_0A_12_L_0,
912
913 REG_EVEX_0F71,
914 REG_EVEX_0F72,
915 REG_EVEX_0F73,
916 REG_EVEX_0F38C6_L_2,
917 REG_EVEX_0F38C7_L_2,
918 REG_EVEX_MAP4_80,
919 REG_EVEX_MAP4_81,
920 REG_EVEX_MAP4_83,
921 REG_EVEX_MAP4_8F,
922 REG_EVEX_MAP4_F6,
923 REG_EVEX_MAP4_F7,
924 REG_EVEX_MAP4_FE,
925 REG_EVEX_MAP4_FF,
926 };
927
928 enum
929 {
930 MOD_62_32BIT = 0,
931 MOD_C4_32BIT,
932 MOD_C5_32BIT,
933 MOD_0F01_REG_0,
934 MOD_0F01_REG_1,
935 MOD_0F01_REG_2,
936 MOD_0F01_REG_3,
937 MOD_0F01_REG_5,
938 MOD_0F01_REG_7,
939 MOD_0F12_PREFIX_0,
940 MOD_0F16_PREFIX_0,
941 MOD_0F18_REG_0,
942 MOD_0F18_REG_1,
943 MOD_0F18_REG_2,
944 MOD_0F18_REG_3,
945 MOD_0F18_REG_6,
946 MOD_0F18_REG_7,
947 MOD_0F1A_PREFIX_0,
948 MOD_0F1B_PREFIX_0,
949 MOD_0F1B_PREFIX_1,
950 MOD_0F1C_PREFIX_0,
951 MOD_0F1E_PREFIX_1,
952 MOD_0FAE_REG_0,
953 MOD_0FAE_REG_1,
954 MOD_0FAE_REG_2,
955 MOD_0FAE_REG_3,
956 MOD_0FAE_REG_4,
957 MOD_0FAE_REG_5,
958 MOD_0FAE_REG_6,
959 MOD_0FAE_REG_7,
960 MOD_0FC7_REG_6,
961 MOD_0FC7_REG_7,
962 MOD_0F38DC_PREFIX_1,
963 MOD_0F38F8,
964
965 MOD_VEX_0F3849_X86_64_L_0_W_0,
966
967 MOD_EVEX_MAP4_60,
968 MOD_EVEX_MAP4_61,
969 MOD_EVEX_MAP4_F8_P_1,
970 MOD_EVEX_MAP4_F8_P_3,
971 };
972
973 enum
974 {
975 RM_C6_REG_7 = 0,
976 RM_C7_REG_7,
977 RM_0F01_REG_0,
978 RM_0F01_REG_1,
979 RM_0F01_REG_2,
980 RM_0F01_REG_3,
981 RM_0F01_REG_5_MOD_3,
982 RM_0F01_REG_7_MOD_3,
983 RM_0F1E_P_1_MOD_3_REG_7,
984 RM_0FAE_REG_6_MOD_3_P_0,
985 RM_0FAE_REG_7_MOD_3,
986 RM_0F3A0F_P_1_R_0,
987
988 RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0,
989 RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3,
990 };
991
992 enum
993 {
994 PREFIX_90 = 0,
995 PREFIX_0F00_REG_6_X86_64,
996 PREFIX_0F01_REG_0_MOD_3_RM_6,
997 PREFIX_0F01_REG_0_MOD_3_RM_7,
998 PREFIX_0F01_REG_1_RM_2,
999 PREFIX_0F01_REG_1_RM_4,
1000 PREFIX_0F01_REG_1_RM_5,
1001 PREFIX_0F01_REG_1_RM_6,
1002 PREFIX_0F01_REG_1_RM_7,
1003 PREFIX_0F01_REG_3_RM_1,
1004 PREFIX_0F01_REG_5_MOD_0,
1005 PREFIX_0F01_REG_5_MOD_3_RM_0,
1006 PREFIX_0F01_REG_5_MOD_3_RM_1,
1007 PREFIX_0F01_REG_5_MOD_3_RM_2,
1008 PREFIX_0F01_REG_5_MOD_3_RM_4,
1009 PREFIX_0F01_REG_5_MOD_3_RM_5,
1010 PREFIX_0F01_REG_5_MOD_3_RM_6,
1011 PREFIX_0F01_REG_5_MOD_3_RM_7,
1012 PREFIX_0F01_REG_7_MOD_3_RM_2,
1013 PREFIX_0F01_REG_7_MOD_3_RM_5,
1014 PREFIX_0F01_REG_7_MOD_3_RM_6,
1015 PREFIX_0F01_REG_7_MOD_3_RM_7,
1016 PREFIX_0F09,
1017 PREFIX_0F10,
1018 PREFIX_0F11,
1019 PREFIX_0F12,
1020 PREFIX_0F16,
1021 PREFIX_0F18_REG_6_MOD_0_X86_64,
1022 PREFIX_0F18_REG_7_MOD_0_X86_64,
1023 PREFIX_0F1A,
1024 PREFIX_0F1B,
1025 PREFIX_0F1C,
1026 PREFIX_0F1E,
1027 PREFIX_0F2A,
1028 PREFIX_0F2B,
1029 PREFIX_0F2C,
1030 PREFIX_0F2D,
1031 PREFIX_0F2E,
1032 PREFIX_0F2F,
1033 PREFIX_0F51,
1034 PREFIX_0F52,
1035 PREFIX_0F53,
1036 PREFIX_0F58,
1037 PREFIX_0F59,
1038 PREFIX_0F5A,
1039 PREFIX_0F5B,
1040 PREFIX_0F5C,
1041 PREFIX_0F5D,
1042 PREFIX_0F5E,
1043 PREFIX_0F5F,
1044 PREFIX_0F60,
1045 PREFIX_0F61,
1046 PREFIX_0F62,
1047 PREFIX_0F6F,
1048 PREFIX_0F70,
1049 PREFIX_0F78,
1050 PREFIX_0F79,
1051 PREFIX_0F7C,
1052 PREFIX_0F7D,
1053 PREFIX_0F7E,
1054 PREFIX_0F7F,
1055 PREFIX_0FA6_REG_0,
1056 PREFIX_0FA6_REG_5,
1057 PREFIX_0FA7_REG_6,
1058 PREFIX_0FAE_REG_0_MOD_3,
1059 PREFIX_0FAE_REG_1_MOD_3,
1060 PREFIX_0FAE_REG_2_MOD_3,
1061 PREFIX_0FAE_REG_3_MOD_3,
1062 PREFIX_0FAE_REG_4_MOD_0,
1063 PREFIX_0FAE_REG_4_MOD_3,
1064 PREFIX_0FAE_REG_5_MOD_3,
1065 PREFIX_0FAE_REG_6_MOD_0,
1066 PREFIX_0FAE_REG_6_MOD_3,
1067 PREFIX_0FAE_REG_7_MOD_0,
1068 PREFIX_0FB8,
1069 PREFIX_0FBC,
1070 PREFIX_0FBD,
1071 PREFIX_0FC2,
1072 PREFIX_0FC7_REG_6_MOD_0,
1073 PREFIX_0FC7_REG_6_MOD_3,
1074 PREFIX_0FC7_REG_7_MOD_3,
1075 PREFIX_0FD0,
1076 PREFIX_0FD6,
1077 PREFIX_0FE6,
1078 PREFIX_0FE7,
1079 PREFIX_0FF0,
1080 PREFIX_0FF7,
1081 PREFIX_0F38D8,
1082 PREFIX_0F38DC,
1083 PREFIX_0F38DD,
1084 PREFIX_0F38DE,
1085 PREFIX_0F38DF,
1086 PREFIX_0F38F0,
1087 PREFIX_0F38F1,
1088 PREFIX_0F38F6,
1089 PREFIX_0F38F8_M_0,
1090 PREFIX_0F38F8_M_1_X86_64,
1091 PREFIX_0F38FA,
1092 PREFIX_0F38FB,
1093 PREFIX_0F38FC,
1094 PREFIX_0F3A0F,
1095 PREFIX_VEX_0F12,
1096 PREFIX_VEX_0F16,
1097 PREFIX_VEX_0F2A,
1098 PREFIX_VEX_0F2C,
1099 PREFIX_VEX_0F2D,
1100 PREFIX_VEX_0F41_L_1_W_0,
1101 PREFIX_VEX_0F41_L_1_W_1,
1102 PREFIX_VEX_0F42_L_1_W_0,
1103 PREFIX_VEX_0F42_L_1_W_1,
1104 PREFIX_VEX_0F44_L_0_W_0,
1105 PREFIX_VEX_0F44_L_0_W_1,
1106 PREFIX_VEX_0F45_L_1_W_0,
1107 PREFIX_VEX_0F45_L_1_W_1,
1108 PREFIX_VEX_0F46_L_1_W_0,
1109 PREFIX_VEX_0F46_L_1_W_1,
1110 PREFIX_VEX_0F47_L_1_W_0,
1111 PREFIX_VEX_0F47_L_1_W_1,
1112 PREFIX_VEX_0F4A_L_1_W_0,
1113 PREFIX_VEX_0F4A_L_1_W_1,
1114 PREFIX_VEX_0F4B_L_1_W_0,
1115 PREFIX_VEX_0F4B_L_1_W_1,
1116 PREFIX_VEX_0F6F,
1117 PREFIX_VEX_0F70,
1118 PREFIX_VEX_0F7E,
1119 PREFIX_VEX_0F7F,
1120 PREFIX_VEX_0F90_L_0_W_0,
1121 PREFIX_VEX_0F90_L_0_W_1,
1122 PREFIX_VEX_0F91_L_0_W_0,
1123 PREFIX_VEX_0F91_L_0_W_1,
1124 PREFIX_VEX_0F92_L_0_W_0,
1125 PREFIX_VEX_0F92_L_0_W_1,
1126 PREFIX_VEX_0F93_L_0_W_0,
1127 PREFIX_VEX_0F93_L_0_W_1,
1128 PREFIX_VEX_0F98_L_0_W_0,
1129 PREFIX_VEX_0F98_L_0_W_1,
1130 PREFIX_VEX_0F99_L_0_W_0,
1131 PREFIX_VEX_0F99_L_0_W_1,
1132 PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0,
1133 PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1,
1134 PREFIX_VEX_0F384B_X86_64_L_0_W_0,
1135 PREFIX_VEX_0F3850_W_0,
1136 PREFIX_VEX_0F3851_W_0,
1137 PREFIX_VEX_0F385C_X86_64_L_0_W_0,
1138 PREFIX_VEX_0F385E_X86_64_L_0_W_0,
1139 PREFIX_VEX_0F386C_X86_64_L_0_W_0,
1140 PREFIX_VEX_0F3872,
1141 PREFIX_VEX_0F38B0_W_0,
1142 PREFIX_VEX_0F38B1_W_0,
1143 PREFIX_VEX_0F38D2_W_0,
1144 PREFIX_VEX_0F38D3_W_0,
1145 PREFIX_VEX_0F38CB,
1146 PREFIX_VEX_0F38CC,
1147 PREFIX_VEX_0F38CD,
1148 PREFIX_VEX_0F38DA_W_0,
1149 PREFIX_VEX_0F38F2_L_0,
1150 PREFIX_VEX_0F38F3_L_0,
1151 PREFIX_VEX_0F38F5_L_0,
1152 PREFIX_VEX_0F38F6_L_0,
1153 PREFIX_VEX_0F38F7_L_0,
1154 PREFIX_VEX_0F3AF0_L_0,
1155 PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64,
1156 PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64,
1157
1158 PREFIX_EVEX_0F2E,
1159 PREFIX_EVEX_0F2F,
1160 PREFIX_EVEX_0F5B,
1161 PREFIX_EVEX_0F6F,
1162 PREFIX_EVEX_0F70,
1163 PREFIX_EVEX_0F78,
1164 PREFIX_EVEX_0F79,
1165 PREFIX_EVEX_0F7A,
1166 PREFIX_EVEX_0F7B,
1167 PREFIX_EVEX_0F7E,
1168 PREFIX_EVEX_0F7F,
1169 PREFIX_EVEX_0FC2,
1170 PREFIX_EVEX_0FE6,
1171 PREFIX_EVEX_0F3810,
1172 PREFIX_EVEX_0F3811,
1173 PREFIX_EVEX_0F3812,
1174 PREFIX_EVEX_0F3813,
1175 PREFIX_EVEX_0F3814,
1176 PREFIX_EVEX_0F3815,
1177 PREFIX_EVEX_0F3820,
1178 PREFIX_EVEX_0F3821,
1179 PREFIX_EVEX_0F3822,
1180 PREFIX_EVEX_0F3823,
1181 PREFIX_EVEX_0F3824,
1182 PREFIX_EVEX_0F3825,
1183 PREFIX_EVEX_0F3826,
1184 PREFIX_EVEX_0F3827,
1185 PREFIX_EVEX_0F3828,
1186 PREFIX_EVEX_0F3829,
1187 PREFIX_EVEX_0F382A,
1188 PREFIX_EVEX_0F3830,
1189 PREFIX_EVEX_0F3831,
1190 PREFIX_EVEX_0F3832,
1191 PREFIX_EVEX_0F3833,
1192 PREFIX_EVEX_0F3834,
1193 PREFIX_EVEX_0F3835,
1194 PREFIX_EVEX_0F3838,
1195 PREFIX_EVEX_0F3839,
1196 PREFIX_EVEX_0F383A,
1197 PREFIX_EVEX_0F3852,
1198 PREFIX_EVEX_0F3853,
1199 PREFIX_EVEX_0F3868,
1200 PREFIX_EVEX_0F3872,
1201 PREFIX_EVEX_0F3874,
1202 PREFIX_EVEX_0F389A,
1203 PREFIX_EVEX_0F389B,
1204 PREFIX_EVEX_0F38AA,
1205 PREFIX_EVEX_0F38AB,
1206
1207 PREFIX_EVEX_0F3A08,
1208 PREFIX_EVEX_0F3A0A,
1209 PREFIX_EVEX_0F3A26,
1210 PREFIX_EVEX_0F3A27,
1211 PREFIX_EVEX_0F3A42_W_0,
1212 PREFIX_EVEX_0F3A52,
1213 PREFIX_EVEX_0F3A53,
1214 PREFIX_EVEX_0F3A56,
1215 PREFIX_EVEX_0F3A57,
1216 PREFIX_EVEX_0F3A66,
1217 PREFIX_EVEX_0F3A67,
1218 PREFIX_EVEX_0F3AC2,
1219
1220 PREFIX_EVEX_MAP4_4x,
1221 PREFIX_EVEX_MAP4_F0,
1222 PREFIX_EVEX_MAP4_F1,
1223 PREFIX_EVEX_MAP4_F2,
1224 PREFIX_EVEX_MAP4_F8,
1225
1226 PREFIX_EVEX_MAP5_10,
1227 PREFIX_EVEX_MAP5_11,
1228 PREFIX_EVEX_MAP5_18,
1229 PREFIX_EVEX_MAP5_1B,
1230 PREFIX_EVEX_MAP5_1D,
1231 PREFIX_EVEX_MAP5_1E,
1232 PREFIX_EVEX_MAP5_2A,
1233 PREFIX_EVEX_MAP5_2C,
1234 PREFIX_EVEX_MAP5_2D,
1235 PREFIX_EVEX_MAP5_2E,
1236 PREFIX_EVEX_MAP5_2F,
1237 PREFIX_EVEX_MAP5_51,
1238 PREFIX_EVEX_MAP5_58,
1239 PREFIX_EVEX_MAP5_59,
1240 PREFIX_EVEX_MAP5_5A,
1241 PREFIX_EVEX_MAP5_5B,
1242 PREFIX_EVEX_MAP5_5C,
1243 PREFIX_EVEX_MAP5_5D,
1244 PREFIX_EVEX_MAP5_5E,
1245 PREFIX_EVEX_MAP5_5F,
1246 PREFIX_EVEX_MAP5_68,
1247 PREFIX_EVEX_MAP5_69,
1248 PREFIX_EVEX_MAP5_6A,
1249 PREFIX_EVEX_MAP5_6B,
1250 PREFIX_EVEX_MAP5_6C,
1251 PREFIX_EVEX_MAP5_6D,
1252 PREFIX_EVEX_MAP5_6E_L_0,
1253 PREFIX_EVEX_MAP5_74,
1254 PREFIX_EVEX_MAP5_78,
1255 PREFIX_EVEX_MAP5_79,
1256 PREFIX_EVEX_MAP5_7A,
1257 PREFIX_EVEX_MAP5_7B,
1258 PREFIX_EVEX_MAP5_7C,
1259 PREFIX_EVEX_MAP5_7D,
1260 PREFIX_EVEX_MAP5_7E_L_0,
1261
1262 PREFIX_EVEX_MAP6_13,
1263 PREFIX_EVEX_MAP6_2C,
1264 PREFIX_EVEX_MAP6_42,
1265 PREFIX_EVEX_MAP6_4C,
1266 PREFIX_EVEX_MAP6_4E,
1267 PREFIX_EVEX_MAP6_56,
1268 PREFIX_EVEX_MAP6_57,
1269 PREFIX_EVEX_MAP6_98,
1270 PREFIX_EVEX_MAP6_9A,
1271 PREFIX_EVEX_MAP6_9C,
1272 PREFIX_EVEX_MAP6_9E,
1273 PREFIX_EVEX_MAP6_A8,
1274 PREFIX_EVEX_MAP6_AA,
1275 PREFIX_EVEX_MAP6_AC,
1276 PREFIX_EVEX_MAP6_AE,
1277 PREFIX_EVEX_MAP6_B8,
1278 PREFIX_EVEX_MAP6_BA,
1279 PREFIX_EVEX_MAP6_BC,
1280 PREFIX_EVEX_MAP6_BE,
1281 PREFIX_EVEX_MAP6_D6,
1282 PREFIX_EVEX_MAP6_D7,
1283 };
1284
1285 enum
1286 {
1287 X86_64_06 = 0,
1288 X86_64_07,
1289 X86_64_0E,
1290 X86_64_16,
1291 X86_64_17,
1292 X86_64_1E,
1293 X86_64_1F,
1294 X86_64_27,
1295 X86_64_2F,
1296 X86_64_37,
1297 X86_64_3F,
1298 X86_64_60,
1299 X86_64_61,
1300 X86_64_62,
1301 X86_64_63,
1302 X86_64_6D,
1303 X86_64_6F,
1304 X86_64_82,
1305 X86_64_9A,
1306 X86_64_C2,
1307 X86_64_C3,
1308 X86_64_C4,
1309 X86_64_C5,
1310 X86_64_CE,
1311 X86_64_D4,
1312 X86_64_D5,
1313 X86_64_E8,
1314 X86_64_E9,
1315 X86_64_EA,
1316 X86_64_0F00_REG_6,
1317 X86_64_0F01_REG_0,
1318 X86_64_0F01_REG_0_MOD_3_RM_6_P_1,
1319 X86_64_0F01_REG_0_MOD_3_RM_6_P_3,
1320 X86_64_0F01_REG_0_MOD_3_RM_7_P_0,
1321 X86_64_0F01_REG_1,
1322 X86_64_0F01_REG_1_RM_2_PREFIX_1,
1323 X86_64_0F01_REG_1_RM_2_PREFIX_3,
1324 X86_64_0F01_REG_1_RM_5_PREFIX_2,
1325 X86_64_0F01_REG_1_RM_6_PREFIX_2,
1326 X86_64_0F01_REG_1_RM_7_PREFIX_2,
1327 X86_64_0F01_REG_2,
1328 X86_64_0F01_REG_3,
1329 X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1,
1330 X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1,
1331 X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1,
1332 X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1,
1333 X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1,
1334 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1,
1335 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3,
1336 X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1,
1337 X86_64_0F18_REG_6_MOD_0,
1338 X86_64_0F18_REG_7_MOD_0,
1339 X86_64_0F24,
1340 X86_64_0F26,
1341 X86_64_0F38F8_M_1,
1342 X86_64_0FC7_REG_6_MOD_3_PREFIX_1,
1343
1344 X86_64_VEX_0F3849,
1345 X86_64_VEX_0F384B,
1346 X86_64_VEX_0F385C,
1347 X86_64_VEX_0F385E,
1348 X86_64_VEX_0F386C,
1349 X86_64_VEX_0F38Ex,
1350
1351 X86_64_VEX_MAP7_F6_L_0_W_0_R_0,
1352 X86_64_VEX_MAP7_F8_L_0_W_0_R_0,
1353 };
1354
1355 enum
1356 {
1357 THREE_BYTE_0F38 = 0,
1358 THREE_BYTE_0F3A
1359 };
1360
1361 enum
1362 {
1363 XOP_08 = 0,
1364 XOP_09,
1365 XOP_0A
1366 };
1367
1368 enum
1369 {
1370 VEX_0F = 0,
1371 VEX_0F38,
1372 VEX_0F3A,
1373 VEX_MAP7,
1374 };
1375
1376 enum
1377 {
1378 EVEX_0F = 0,
1379 EVEX_0F38,
1380 EVEX_0F3A,
1381 EVEX_MAP4,
1382 EVEX_MAP5,
1383 EVEX_MAP6,
1384 EVEX_MAP7,
1385 };
1386
1387 enum
1388 {
1389 VEX_LEN_0F12_P_0 = 0,
1390 VEX_LEN_0F12_P_2,
1391 VEX_LEN_0F13,
1392 VEX_LEN_0F16_P_0,
1393 VEX_LEN_0F16_P_2,
1394 VEX_LEN_0F17,
1395 VEX_LEN_0F41,
1396 VEX_LEN_0F42,
1397 VEX_LEN_0F44,
1398 VEX_LEN_0F45,
1399 VEX_LEN_0F46,
1400 VEX_LEN_0F47,
1401 VEX_LEN_0F4A,
1402 VEX_LEN_0F4B,
1403 VEX_LEN_0F6E,
1404 VEX_LEN_0F77,
1405 VEX_LEN_0F7E_P_1,
1406 VEX_LEN_0F7E_P_2,
1407 VEX_LEN_0F90,
1408 VEX_LEN_0F91,
1409 VEX_LEN_0F92,
1410 VEX_LEN_0F93,
1411 VEX_LEN_0F98,
1412 VEX_LEN_0F99,
1413 VEX_LEN_0FAE_R_2,
1414 VEX_LEN_0FAE_R_3,
1415 VEX_LEN_0FC4,
1416 VEX_LEN_0FD6,
1417 VEX_LEN_0F3816,
1418 VEX_LEN_0F3819,
1419 VEX_LEN_0F381A,
1420 VEX_LEN_0F3836,
1421 VEX_LEN_0F3841,
1422 VEX_LEN_0F3849_X86_64,
1423 VEX_LEN_0F384B_X86_64,
1424 VEX_LEN_0F385A,
1425 VEX_LEN_0F385C_X86_64,
1426 VEX_LEN_0F385E_X86_64,
1427 VEX_LEN_0F386C_X86_64,
1428 VEX_LEN_0F38CB_P_3_W_0,
1429 VEX_LEN_0F38CC_P_3_W_0,
1430 VEX_LEN_0F38CD_P_3_W_0,
1431 VEX_LEN_0F38DA_W_0_P_0,
1432 VEX_LEN_0F38DA_W_0_P_2,
1433 VEX_LEN_0F38DB,
1434 VEX_LEN_0F38F2,
1435 VEX_LEN_0F38F3,
1436 VEX_LEN_0F38F5,
1437 VEX_LEN_0F38F6,
1438 VEX_LEN_0F38F7,
1439 VEX_LEN_0F3A00,
1440 VEX_LEN_0F3A01,
1441 VEX_LEN_0F3A06,
1442 VEX_LEN_0F3A14,
1443 VEX_LEN_0F3A15,
1444 VEX_LEN_0F3A16,
1445 VEX_LEN_0F3A17,
1446 VEX_LEN_0F3A18,
1447 VEX_LEN_0F3A19,
1448 VEX_LEN_0F3A20,
1449 VEX_LEN_0F3A21,
1450 VEX_LEN_0F3A22,
1451 VEX_LEN_0F3A30,
1452 VEX_LEN_0F3A31,
1453 VEX_LEN_0F3A32,
1454 VEX_LEN_0F3A33,
1455 VEX_LEN_0F3A38,
1456 VEX_LEN_0F3A39,
1457 VEX_LEN_0F3A41,
1458 VEX_LEN_0F3A46,
1459 VEX_LEN_0F3A60,
1460 VEX_LEN_0F3A61,
1461 VEX_LEN_0F3A62,
1462 VEX_LEN_0F3A63,
1463 VEX_LEN_0F3ADE_W_0,
1464 VEX_LEN_0F3ADF,
1465 VEX_LEN_0F3AF0,
1466 VEX_LEN_MAP7_F6,
1467 VEX_LEN_MAP7_F8,
1468 VEX_LEN_XOP_08_85,
1469 VEX_LEN_XOP_08_86,
1470 VEX_LEN_XOP_08_87,
1471 VEX_LEN_XOP_08_8E,
1472 VEX_LEN_XOP_08_8F,
1473 VEX_LEN_XOP_08_95,
1474 VEX_LEN_XOP_08_96,
1475 VEX_LEN_XOP_08_97,
1476 VEX_LEN_XOP_08_9E,
1477 VEX_LEN_XOP_08_9F,
1478 VEX_LEN_XOP_08_A3,
1479 VEX_LEN_XOP_08_A6,
1480 VEX_LEN_XOP_08_B6,
1481 VEX_LEN_XOP_08_C0,
1482 VEX_LEN_XOP_08_C1,
1483 VEX_LEN_XOP_08_C2,
1484 VEX_LEN_XOP_08_C3,
1485 VEX_LEN_XOP_08_CC,
1486 VEX_LEN_XOP_08_CD,
1487 VEX_LEN_XOP_08_CE,
1488 VEX_LEN_XOP_08_CF,
1489 VEX_LEN_XOP_08_EC,
1490 VEX_LEN_XOP_08_ED,
1491 VEX_LEN_XOP_08_EE,
1492 VEX_LEN_XOP_08_EF,
1493 VEX_LEN_XOP_09_01,
1494 VEX_LEN_XOP_09_02,
1495 VEX_LEN_XOP_09_12,
1496 VEX_LEN_XOP_09_82_W_0,
1497 VEX_LEN_XOP_09_83_W_0,
1498 VEX_LEN_XOP_09_90,
1499 VEX_LEN_XOP_09_91,
1500 VEX_LEN_XOP_09_92,
1501 VEX_LEN_XOP_09_93,
1502 VEX_LEN_XOP_09_94,
1503 VEX_LEN_XOP_09_95,
1504 VEX_LEN_XOP_09_96,
1505 VEX_LEN_XOP_09_97,
1506 VEX_LEN_XOP_09_98,
1507 VEX_LEN_XOP_09_99,
1508 VEX_LEN_XOP_09_9A,
1509 VEX_LEN_XOP_09_9B,
1510 VEX_LEN_XOP_09_C1,
1511 VEX_LEN_XOP_09_C2,
1512 VEX_LEN_XOP_09_C3,
1513 VEX_LEN_XOP_09_C6,
1514 VEX_LEN_XOP_09_C7,
1515 VEX_LEN_XOP_09_CB,
1516 VEX_LEN_XOP_09_D1,
1517 VEX_LEN_XOP_09_D2,
1518 VEX_LEN_XOP_09_D3,
1519 VEX_LEN_XOP_09_D6,
1520 VEX_LEN_XOP_09_D7,
1521 VEX_LEN_XOP_09_DB,
1522 VEX_LEN_XOP_09_E1,
1523 VEX_LEN_XOP_09_E2,
1524 VEX_LEN_XOP_09_E3,
1525 VEX_LEN_XOP_0A_12,
1526 };
1527
1528 enum
1529 {
1530 EVEX_LEN_0F7E_P_1_W_0 = 0,
1531 EVEX_LEN_0FD6_P_2_W_0,
1532 EVEX_LEN_0F3816,
1533 EVEX_LEN_0F3819,
1534 EVEX_LEN_0F381A,
1535 EVEX_LEN_0F381B,
1536 EVEX_LEN_0F3836,
1537 EVEX_LEN_0F385A,
1538 EVEX_LEN_0F385B,
1539 EVEX_LEN_0F38C6,
1540 EVEX_LEN_0F38C7,
1541 EVEX_LEN_0F3A00,
1542 EVEX_LEN_0F3A01,
1543 EVEX_LEN_0F3A18,
1544 EVEX_LEN_0F3A19,
1545 EVEX_LEN_0F3A1A,
1546 EVEX_LEN_0F3A1B,
1547 EVEX_LEN_0F3A23,
1548 EVEX_LEN_0F3A38,
1549 EVEX_LEN_0F3A39,
1550 EVEX_LEN_0F3A3A,
1551 EVEX_LEN_0F3A3B,
1552 EVEX_LEN_0F3A43,
1553
1554 EVEX_LEN_MAP5_6E,
1555 EVEX_LEN_MAP5_7E,
1556 };
1557
1558 enum
1559 {
1560 VEX_W_0F41_L_1 = 0,
1561 VEX_W_0F42_L_1,
1562 VEX_W_0F44_L_0,
1563 VEX_W_0F45_L_1,
1564 VEX_W_0F46_L_1,
1565 VEX_W_0F47_L_1,
1566 VEX_W_0F4A_L_1,
1567 VEX_W_0F4B_L_1,
1568 VEX_W_0F90_L_0,
1569 VEX_W_0F91_L_0,
1570 VEX_W_0F92_L_0,
1571 VEX_W_0F93_L_0,
1572 VEX_W_0F98_L_0,
1573 VEX_W_0F99_L_0,
1574 VEX_W_0F380C,
1575 VEX_W_0F380D,
1576 VEX_W_0F380E,
1577 VEX_W_0F380F,
1578 VEX_W_0F3813,
1579 VEX_W_0F3816_L_1,
1580 VEX_W_0F3818,
1581 VEX_W_0F3819_L_1,
1582 VEX_W_0F381A_L_1,
1583 VEX_W_0F382C,
1584 VEX_W_0F382D,
1585 VEX_W_0F382E,
1586 VEX_W_0F382F,
1587 VEX_W_0F3836,
1588 VEX_W_0F3846,
1589 VEX_W_0F3849_X86_64_L_0,
1590 VEX_W_0F384B_X86_64_L_0,
1591 VEX_W_0F3850,
1592 VEX_W_0F3851,
1593 VEX_W_0F3852,
1594 VEX_W_0F3853,
1595 VEX_W_0F3858,
1596 VEX_W_0F3859,
1597 VEX_W_0F385A_L_0,
1598 VEX_W_0F385C_X86_64_L_0,
1599 VEX_W_0F385E_X86_64_L_0,
1600 VEX_W_0F386C_X86_64_L_0,
1601 VEX_W_0F3872_P_1,
1602 VEX_W_0F3878,
1603 VEX_W_0F3879,
1604 VEX_W_0F38B0,
1605 VEX_W_0F38B1,
1606 VEX_W_0F38B4,
1607 VEX_W_0F38B5,
1608 VEX_W_0F38CB_P_3,
1609 VEX_W_0F38CC_P_3,
1610 VEX_W_0F38CD_P_3,
1611 VEX_W_0F38CF,
1612 VEX_W_0F38D2,
1613 VEX_W_0F38D3,
1614 VEX_W_0F38DA,
1615 VEX_W_0F3A00_L_1,
1616 VEX_W_0F3A01_L_1,
1617 VEX_W_0F3A02,
1618 VEX_W_0F3A04,
1619 VEX_W_0F3A05,
1620 VEX_W_0F3A06_L_1,
1621 VEX_W_0F3A18_L_1,
1622 VEX_W_0F3A19_L_1,
1623 VEX_W_0F3A1D,
1624 VEX_W_0F3A38_L_1,
1625 VEX_W_0F3A39_L_1,
1626 VEX_W_0F3A46_L_1,
1627 VEX_W_0F3A4A,
1628 VEX_W_0F3A4B,
1629 VEX_W_0F3A4C,
1630 VEX_W_0F3ACE,
1631 VEX_W_0F3ACF,
1632 VEX_W_0F3ADE,
1633 VEX_W_MAP7_F6_L_0,
1634 VEX_W_MAP7_F8_L_0,
1635
1636 VEX_W_XOP_08_85_L_0,
1637 VEX_W_XOP_08_86_L_0,
1638 VEX_W_XOP_08_87_L_0,
1639 VEX_W_XOP_08_8E_L_0,
1640 VEX_W_XOP_08_8F_L_0,
1641 VEX_W_XOP_08_95_L_0,
1642 VEX_W_XOP_08_96_L_0,
1643 VEX_W_XOP_08_97_L_0,
1644 VEX_W_XOP_08_9E_L_0,
1645 VEX_W_XOP_08_9F_L_0,
1646 VEX_W_XOP_08_A6_L_0,
1647 VEX_W_XOP_08_B6_L_0,
1648 VEX_W_XOP_08_C0_L_0,
1649 VEX_W_XOP_08_C1_L_0,
1650 VEX_W_XOP_08_C2_L_0,
1651 VEX_W_XOP_08_C3_L_0,
1652 VEX_W_XOP_08_CC_L_0,
1653 VEX_W_XOP_08_CD_L_0,
1654 VEX_W_XOP_08_CE_L_0,
1655 VEX_W_XOP_08_CF_L_0,
1656 VEX_W_XOP_08_EC_L_0,
1657 VEX_W_XOP_08_ED_L_0,
1658 VEX_W_XOP_08_EE_L_0,
1659 VEX_W_XOP_08_EF_L_0,
1660
1661 VEX_W_XOP_09_80,
1662 VEX_W_XOP_09_81,
1663 VEX_W_XOP_09_82,
1664 VEX_W_XOP_09_83,
1665 VEX_W_XOP_09_C1_L_0,
1666 VEX_W_XOP_09_C2_L_0,
1667 VEX_W_XOP_09_C3_L_0,
1668 VEX_W_XOP_09_C6_L_0,
1669 VEX_W_XOP_09_C7_L_0,
1670 VEX_W_XOP_09_CB_L_0,
1671 VEX_W_XOP_09_D1_L_0,
1672 VEX_W_XOP_09_D2_L_0,
1673 VEX_W_XOP_09_D3_L_0,
1674 VEX_W_XOP_09_D6_L_0,
1675 VEX_W_XOP_09_D7_L_0,
1676 VEX_W_XOP_09_DB_L_0,
1677 VEX_W_XOP_09_E1_L_0,
1678 VEX_W_XOP_09_E2_L_0,
1679 VEX_W_XOP_09_E3_L_0,
1680
1681 EVEX_W_0F5B_P_0,
1682 EVEX_W_0F62,
1683 EVEX_W_0F66,
1684 EVEX_W_0F6A,
1685 EVEX_W_0F6B,
1686 EVEX_W_0F6C,
1687 EVEX_W_0F6D,
1688 EVEX_W_0F6F_P_1,
1689 EVEX_W_0F6F_P_2,
1690 EVEX_W_0F6F_P_3,
1691 EVEX_W_0F70_P_2,
1692 EVEX_W_0F72_R_2,
1693 EVEX_W_0F72_R_4,
1694 EVEX_W_0F72_R_6,
1695 EVEX_W_0F73_R_2,
1696 EVEX_W_0F73_R_6,
1697 EVEX_W_0F76,
1698 EVEX_W_0F78_P_0,
1699 EVEX_W_0F78_P_2,
1700 EVEX_W_0F79_P_0,
1701 EVEX_W_0F79_P_2,
1702 EVEX_W_0F7A_P_1,
1703 EVEX_W_0F7A_P_2,
1704 EVEX_W_0F7A_P_3,
1705 EVEX_W_0F7B_P_2,
1706 EVEX_W_0F7E_P_1,
1707 EVEX_W_0F7F_P_1,
1708 EVEX_W_0F7F_P_2,
1709 EVEX_W_0F7F_P_3,
1710 EVEX_W_0FD2,
1711 EVEX_W_0FD3,
1712 EVEX_W_0FD4,
1713 EVEX_W_0FD6,
1714 EVEX_W_0FE2,
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_L_n,
1735 EVEX_W_0F381B_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_L_n,
1761 EVEX_W_0F385B_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_MAP4_8F_R_0,
1784 EVEX_W_MAP4_F8_P1_M_1,
1785 EVEX_W_MAP4_F8_P3_M_1,
1786 EVEX_W_MAP4_FF_R_6,
1787
1788 EVEX_W_MAP5_5B_P_0,
1789 EVEX_W_MAP5_6C_P_0,
1790 EVEX_W_MAP5_6C_P_2,
1791 EVEX_W_MAP5_6D_P_0,
1792 EVEX_W_MAP5_6D_P_2,
1793 EVEX_W_MAP5_6E_P_1,
1794 EVEX_W_MAP5_7A_P_3,
1795 EVEX_W_MAP5_7E_P_1,
1796 };
1797
1798 typedef bool (*op_rtn) (instr_info *ins, int bytemode, int sizeflag);
1799
1800 struct dis386 {
1801 const char *name;
1802 struct
1803 {
1804 op_rtn rtn;
1805 int bytemode;
1806 } op[MAX_OPERANDS];
1807 unsigned int prefix_requirement;
1808 };
1809
1810 /* Upper case letters in the instruction names here are macros.
1811 'A' => print 'b' if no (suitable) register operand or suffix_always is true
1812 'B' => print 'b' if suffix_always is true
1813 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1814 size prefix
1815 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1816 suffix_always is true
1817 'E' => print 'e' if 32-bit form of jcxz
1818 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1819 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1820 'H' => print ",pt" or ",pn" branch hint
1821 'I' unused.
1822 'J' unused.
1823 'K' => print 'd' or 'q' if rex prefix is present.
1824 'L' => print 'l' or 'q' if suffix_always is true
1825 'M' => print 'r' if intel_mnemonic is false.
1826 'N' => print 'n' if instruction has no wait "prefix"
1827 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1828 'P' => behave as 'T' except with register operand outside of suffix_always
1829 mode
1830 'Q' => print 'w', 'l' or 'q' if no (suitable) register operand or
1831 suffix_always is true
1832 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1833 'S' => print 'w', 'l' or 'q' if suffix_always is true
1834 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1835 prefix or if suffix_always is true.
1836 'U' unused.
1837 'V' => print 'v' for VEX/EVEX and nothing for legacy encodings.
1838 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1839 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1840 'Y' => no output, mark EVEX.aaa != 0 as bad.
1841 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1842 '!' => change condition from true to false or from false to true.
1843 '%' => add 1 upper case letter to the macro.
1844 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1845 prefix or suffix_always is true (lcall/ljmp).
1846 '@' => in 64bit mode for Intel64 ISA or if instruction
1847 has no operand sizing prefix, print 'q' if suffix_always is true or
1848 nothing otherwise; behave as 'P' in all other cases
1849
1850 2 upper case letter macros:
1851 "CC" => print condition code
1852 "XY" => print 'x' or 'y' if suffix_always is true or no register
1853 operands and no broadcast.
1854 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1855 register operands and no broadcast.
1856 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1857 "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
1858 "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
1859 "XB" => print 'bf16' if EVEX.W=0, EVEX.W=1 is not a valid encoding
1860 (for BF16)
1861 "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
1862 "XV" => print "{vex} " pseudo prefix
1863 "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is
1864 is used by an EVEX-encoded (AVX512VL) instruction.
1865 "ME" => Similar to "XE", but only print "{evex} " when there is no
1866 memory operand.
1867 "NF" => print "{nf} " pseudo prefix when EVEX.NF = 1 and print "{evex} "
1868 pseudo prefix when instructions without NF, EGPR and VVVV,
1869 "NE" => don't print "{evex} " pseudo prefix for some special instructions
1870 in MAP4.
1871 "ZU" => print 'zu' if EVEX.ZU=1.
1872 "SC" => print suffix SCC for SCC insns
1873 "YK" keep unused, to avoid ambiguity with the combined use of Y and K.
1874 "YX" keep unused, to avoid ambiguity with the combined use of Y and X.
1875 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1876 being false, or no operand at all in 64bit mode, or if suffix_always
1877 is true.
1878 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1879 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1880 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1881 "DQ" => print 'd' or 'q' depending on the VEX.W bit
1882 "DF" => print default flag value for SCC insns
1883 "BW" => print 'b' or 'w' depending on the VEX.W bit
1884 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1885 an operand size prefix, or suffix_always is true. print
1886 'q' if rex prefix is present.
1887
1888 Many of the above letters print nothing in Intel mode. See "putop"
1889 for the details.
1890
1891 Braces '{' and '}', and vertical bars '|', indicate alternative
1892 mnemonic strings for AT&T and Intel. */
1893
1894 static const struct dis386 dis386[] = {
1895 /* 00 */
1896 { "addB", { Ebh1, Gb }, 0 },
1897 { "addS", { Evh1, Gv }, 0 },
1898 { "addB", { Gb, EbS }, 0 },
1899 { "addS", { Gv, EvS }, 0 },
1900 { "addB", { AL, Ib }, 0 },
1901 { "addS", { eAX, Iv }, 0 },
1902 { X86_64_TABLE (X86_64_06) },
1903 { X86_64_TABLE (X86_64_07) },
1904 /* 08 */
1905 { "orB", { Ebh1, Gb }, 0 },
1906 { "orS", { Evh1, Gv }, 0 },
1907 { "orB", { Gb, EbS }, 0 },
1908 { "orS", { Gv, EvS }, 0 },
1909 { "orB", { AL, Ib }, 0 },
1910 { "orS", { eAX, Iv }, 0 },
1911 { X86_64_TABLE (X86_64_0E) },
1912 { Bad_Opcode }, /* 0x0f extended opcode escape */
1913 /* 10 */
1914 { "adcB", { Ebh1, Gb }, 0 },
1915 { "adcS", { Evh1, Gv }, 0 },
1916 { "adcB", { Gb, EbS }, 0 },
1917 { "adcS", { Gv, EvS }, 0 },
1918 { "adcB", { AL, Ib }, 0 },
1919 { "adcS", { eAX, Iv }, 0 },
1920 { X86_64_TABLE (X86_64_16) },
1921 { X86_64_TABLE (X86_64_17) },
1922 /* 18 */
1923 { "sbbB", { Ebh1, Gb }, 0 },
1924 { "sbbS", { Evh1, Gv }, 0 },
1925 { "sbbB", { Gb, EbS }, 0 },
1926 { "sbbS", { Gv, EvS }, 0 },
1927 { "sbbB", { AL, Ib }, 0 },
1928 { "sbbS", { eAX, Iv }, 0 },
1929 { X86_64_TABLE (X86_64_1E) },
1930 { X86_64_TABLE (X86_64_1F) },
1931 /* 20 */
1932 { "andB", { Ebh1, Gb }, 0 },
1933 { "andS", { Evh1, Gv }, 0 },
1934 { "andB", { Gb, EbS }, 0 },
1935 { "andS", { Gv, EvS }, 0 },
1936 { "andB", { AL, Ib }, 0 },
1937 { "andS", { eAX, Iv }, 0 },
1938 { Bad_Opcode }, /* SEG ES prefix */
1939 { X86_64_TABLE (X86_64_27) },
1940 /* 28 */
1941 { "subB", { Ebh1, Gb }, 0 },
1942 { "subS", { Evh1, Gv }, 0 },
1943 { "subB", { Gb, EbS }, 0 },
1944 { "subS", { Gv, EvS }, 0 },
1945 { "subB", { AL, Ib }, 0 },
1946 { "subS", { eAX, Iv }, 0 },
1947 { Bad_Opcode }, /* SEG CS prefix */
1948 { X86_64_TABLE (X86_64_2F) },
1949 /* 30 */
1950 { "xorB", { Ebh1, Gb }, 0 },
1951 { "xorS", { Evh1, Gv }, 0 },
1952 { "xorB", { Gb, EbS }, 0 },
1953 { "xorS", { Gv, EvS }, 0 },
1954 { "xorB", { AL, Ib }, 0 },
1955 { "xorS", { eAX, Iv }, 0 },
1956 { Bad_Opcode }, /* SEG SS prefix */
1957 { X86_64_TABLE (X86_64_37) },
1958 /* 38 */
1959 { "cmpB", { Eb, Gb }, 0 },
1960 { "cmpS", { Ev, Gv }, 0 },
1961 { "cmpB", { Gb, EbS }, 0 },
1962 { "cmpS", { Gv, EvS }, 0 },
1963 { "cmpB", { AL, Ib }, 0 },
1964 { "cmpS", { eAX, Iv }, 0 },
1965 { Bad_Opcode }, /* SEG DS prefix */
1966 { X86_64_TABLE (X86_64_3F) },
1967 /* 40 */
1968 { "inc{S|}", { RMeAX }, 0 },
1969 { "inc{S|}", { RMeCX }, 0 },
1970 { "inc{S|}", { RMeDX }, 0 },
1971 { "inc{S|}", { RMeBX }, 0 },
1972 { "inc{S|}", { RMeSP }, 0 },
1973 { "inc{S|}", { RMeBP }, 0 },
1974 { "inc{S|}", { RMeSI }, 0 },
1975 { "inc{S|}", { RMeDI }, 0 },
1976 /* 48 */
1977 { "dec{S|}", { RMeAX }, 0 },
1978 { "dec{S|}", { RMeCX }, 0 },
1979 { "dec{S|}", { RMeDX }, 0 },
1980 { "dec{S|}", { RMeBX }, 0 },
1981 { "dec{S|}", { RMeSP }, 0 },
1982 { "dec{S|}", { RMeBP }, 0 },
1983 { "dec{S|}", { RMeSI }, 0 },
1984 { "dec{S|}", { RMeDI }, 0 },
1985 /* 50 */
1986 { "push!P", { RMrAX }, 0 },
1987 { "push!P", { RMrCX }, 0 },
1988 { "push!P", { RMrDX }, 0 },
1989 { "push!P", { RMrBX }, 0 },
1990 { "push!P", { RMrSP }, 0 },
1991 { "push!P", { RMrBP }, 0 },
1992 { "push!P", { RMrSI }, 0 },
1993 { "push!P", { RMrDI }, 0 },
1994 /* 58 */
1995 { "pop!P", { RMrAX }, 0 },
1996 { "pop!P", { RMrCX }, 0 },
1997 { "pop!P", { RMrDX }, 0 },
1998 { "pop!P", { RMrBX }, 0 },
1999 { "pop!P", { RMrSP }, 0 },
2000 { "pop!P", { RMrBP }, 0 },
2001 { "pop!P", { RMrSI }, 0 },
2002 { "pop!P", { RMrDI }, 0 },
2003 /* 60 */
2004 { X86_64_TABLE (X86_64_60) },
2005 { X86_64_TABLE (X86_64_61) },
2006 { X86_64_TABLE (X86_64_62) },
2007 { X86_64_TABLE (X86_64_63) },
2008 { Bad_Opcode }, /* seg fs */
2009 { Bad_Opcode }, /* seg gs */
2010 { Bad_Opcode }, /* op size prefix */
2011 { Bad_Opcode }, /* adr size prefix */
2012 /* 68 */
2013 { "pushP", { sIv }, 0 },
2014 { "imulS", { Gv, Ev, Iv }, 0 },
2015 { "pushP", { sIbT }, 0 },
2016 { "imulS", { Gv, Ev, sIb }, 0 },
2017 { "ins{b|}", { Ybr, indirDX }, 0 },
2018 { X86_64_TABLE (X86_64_6D) },
2019 { "outs{b|}", { indirDXr, Xb }, 0 },
2020 { X86_64_TABLE (X86_64_6F) },
2021 /* 70 */
2022 { "joH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2023 { "jnoH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2024 { "jbH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2025 { "jaeH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2026 { "jeH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2027 { "jneH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2028 { "jbeH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2029 { "jaH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2030 /* 78 */
2031 { "jsH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2032 { "jnsH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2033 { "jpH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2034 { "jnpH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2035 { "jlH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2036 { "jgeH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2037 { "jleH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2038 { "jgH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2039 /* 80 */
2040 { REG_TABLE (REG_80) },
2041 { REG_TABLE (REG_81) },
2042 { X86_64_TABLE (X86_64_82) },
2043 { REG_TABLE (REG_83) },
2044 { "testB", { Eb, Gb }, 0 },
2045 { "testS", { Ev, Gv }, 0 },
2046 { "xchgB", { Ebh2, Gb }, 0 },
2047 { "xchgS", { Evh2, Gv }, 0 },
2048 /* 88 */
2049 { "movB", { Ebh3, Gb }, 0 },
2050 { "movS", { Evh3, Gv }, 0 },
2051 { "movB", { Gb, EbS }, 0 },
2052 { "movS", { Gv, EvS }, 0 },
2053 { "movD", { Sv, Sw }, 0 },
2054 { "leaS", { Gv, M }, 0 },
2055 { "movD", { Sw, Sv }, 0 },
2056 { REG_TABLE (REG_8F) },
2057 /* 90 */
2058 { PREFIX_TABLE (PREFIX_90) },
2059 { "xchgS", { RMeCX, eAX }, 0 },
2060 { "xchgS", { RMeDX, eAX }, 0 },
2061 { "xchgS", { RMeBX, eAX }, 0 },
2062 { "xchgS", { RMeSP, eAX }, 0 },
2063 { "xchgS", { RMeBP, eAX }, 0 },
2064 { "xchgS", { RMeSI, eAX }, 0 },
2065 { "xchgS", { RMeDI, eAX }, 0 },
2066 /* 98 */
2067 { "cW{t|}R", { XX }, 0 },
2068 { "cR{t|}O", { XX }, 0 },
2069 { X86_64_TABLE (X86_64_9A) },
2070 { Bad_Opcode }, /* fwait */
2071 { "pushfP", { XX }, 0 },
2072 { "popfP", { XX }, 0 },
2073 { "sahf", { XX }, 0 },
2074 { "lahf", { XX }, 0 },
2075 /* a0 */
2076 { "mov%LB", { AL, Ob }, PREFIX_REX2_ILLEGAL },
2077 { "mov%LS", { { JMPABS_Fixup, eAX_reg }, { JMPABS_Fixup, v_mode } }, PREFIX_REX2_ILLEGAL },
2078 { "mov%LB", { Ob, AL }, PREFIX_REX2_ILLEGAL },
2079 { "mov%LS", { Ov, eAX }, PREFIX_REX2_ILLEGAL },
2080 { "movs{b|}", { Ybr, Xb }, PREFIX_REX2_ILLEGAL },
2081 { "movs{R|}", { Yvr, Xv }, PREFIX_REX2_ILLEGAL },
2082 { "cmps{b|}", { Xb, Yb }, PREFIX_REX2_ILLEGAL },
2083 { "cmps{R|}", { Xv, Yv }, PREFIX_REX2_ILLEGAL },
2084 /* a8 */
2085 { "testB", { AL, Ib }, PREFIX_REX2_ILLEGAL },
2086 { "testS", { eAX, Iv }, PREFIX_REX2_ILLEGAL },
2087 { "stosB", { Ybr, AL }, PREFIX_REX2_ILLEGAL },
2088 { "stosS", { Yvr, eAX }, PREFIX_REX2_ILLEGAL },
2089 { "lodsB", { ALr, Xb }, PREFIX_REX2_ILLEGAL },
2090 { "lodsS", { eAXr, Xv }, PREFIX_REX2_ILLEGAL },
2091 { "scasB", { AL, Yb }, PREFIX_REX2_ILLEGAL },
2092 { "scasS", { eAX, Yv }, PREFIX_REX2_ILLEGAL },
2093 /* b0 */
2094 { "movB", { RMAL, Ib }, 0 },
2095 { "movB", { RMCL, Ib }, 0 },
2096 { "movB", { RMDL, Ib }, 0 },
2097 { "movB", { RMBL, Ib }, 0 },
2098 { "movB", { RMAH, Ib }, 0 },
2099 { "movB", { RMCH, Ib }, 0 },
2100 { "movB", { RMDH, Ib }, 0 },
2101 { "movB", { RMBH, Ib }, 0 },
2102 /* b8 */
2103 { "mov%LV", { RMeAX, Iv64 }, 0 },
2104 { "mov%LV", { RMeCX, Iv64 }, 0 },
2105 { "mov%LV", { RMeDX, Iv64 }, 0 },
2106 { "mov%LV", { RMeBX, Iv64 }, 0 },
2107 { "mov%LV", { RMeSP, Iv64 }, 0 },
2108 { "mov%LV", { RMeBP, Iv64 }, 0 },
2109 { "mov%LV", { RMeSI, Iv64 }, 0 },
2110 { "mov%LV", { RMeDI, Iv64 }, 0 },
2111 /* c0 */
2112 { REG_TABLE (REG_C0) },
2113 { REG_TABLE (REG_C1) },
2114 { X86_64_TABLE (X86_64_C2) },
2115 { X86_64_TABLE (X86_64_C3) },
2116 { X86_64_TABLE (X86_64_C4) },
2117 { X86_64_TABLE (X86_64_C5) },
2118 { REG_TABLE (REG_C6) },
2119 { REG_TABLE (REG_C7) },
2120 /* c8 */
2121 { "enterP", { Iw, Ib }, 0 },
2122 { "leaveP", { XX }, 0 },
2123 { "{l|}ret{|f}%LP", { Iw }, 0 },
2124 { "{l|}ret{|f}%LP", { XX }, 0 },
2125 { "int3", { XX }, 0 },
2126 { "int", { Ib }, 0 },
2127 { X86_64_TABLE (X86_64_CE) },
2128 { "iret%LP", { XX }, 0 },
2129 /* d0 */
2130 { REG_TABLE (REG_D0) },
2131 { REG_TABLE (REG_D1) },
2132 { REG_TABLE (REG_D2) },
2133 { REG_TABLE (REG_D3) },
2134 { X86_64_TABLE (X86_64_D4) },
2135 { X86_64_TABLE (X86_64_D5) },
2136 { Bad_Opcode },
2137 { "xlat", { DSBX }, 0 },
2138 /* d8 */
2139 { FLOAT },
2140 { FLOAT },
2141 { FLOAT },
2142 { FLOAT },
2143 { FLOAT },
2144 { FLOAT },
2145 { FLOAT },
2146 { FLOAT },
2147 /* e0 */
2148 { "loopneFH", { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2149 { "loopeFH", { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2150 { "loopFH", { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2151 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL },
2152 { "inB", { AL, Ib }, PREFIX_REX2_ILLEGAL },
2153 { "inG", { zAX, Ib }, PREFIX_REX2_ILLEGAL },
2154 { "outB", { Ib, AL }, PREFIX_REX2_ILLEGAL },
2155 { "outG", { Ib, zAX }, PREFIX_REX2_ILLEGAL },
2156 /* e8 */
2157 { X86_64_TABLE (X86_64_E8) },
2158 { X86_64_TABLE (X86_64_E9) },
2159 { X86_64_TABLE (X86_64_EA) },
2160 { "jmp", { Jb, BND }, PREFIX_REX2_ILLEGAL },
2161 { "inB", { AL, indirDX }, PREFIX_REX2_ILLEGAL },
2162 { "inG", { zAX, indirDX }, PREFIX_REX2_ILLEGAL },
2163 { "outB", { indirDX, AL }, PREFIX_REX2_ILLEGAL },
2164 { "outG", { indirDX, zAX }, PREFIX_REX2_ILLEGAL },
2165 /* f0 */
2166 { Bad_Opcode }, /* lock prefix */
2167 { "int1", { XX }, 0 },
2168 { Bad_Opcode }, /* repne */
2169 { Bad_Opcode }, /* repz */
2170 { "hlt", { XX }, 0 },
2171 { "cmc", { XX }, 0 },
2172 { REG_TABLE (REG_F6) },
2173 { REG_TABLE (REG_F7) },
2174 /* f8 */
2175 { "clc", { XX }, 0 },
2176 { "stc", { XX }, 0 },
2177 { "cli", { XX }, 0 },
2178 { "sti", { XX }, 0 },
2179 { "cld", { XX }, 0 },
2180 { "std", { XX }, 0 },
2181 { REG_TABLE (REG_FE) },
2182 { REG_TABLE (REG_FF) },
2183 };
2184
2185 static const struct dis386 dis386_twobyte[] = {
2186 /* 00 */
2187 { REG_TABLE (REG_0F00 ) },
2188 { REG_TABLE (REG_0F01 ) },
2189 { "larS", { Gv, Sv }, 0 },
2190 { "lslS", { Gv, Sv }, 0 },
2191 { Bad_Opcode },
2192 { "syscall", { XX }, 0 },
2193 { "clts", { XX }, 0 },
2194 { "sysret%LQ", { XX }, 0 },
2195 /* 08 */
2196 { "invd", { XX }, 0 },
2197 { PREFIX_TABLE (PREFIX_0F09) },
2198 { Bad_Opcode },
2199 { "ud2", { XX }, 0 },
2200 { Bad_Opcode },
2201 { REG_TABLE (REG_0F0D) },
2202 { "femms", { XX }, 0 },
2203 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
2204 /* 10 */
2205 { PREFIX_TABLE (PREFIX_0F10) },
2206 { PREFIX_TABLE (PREFIX_0F11) },
2207 { PREFIX_TABLE (PREFIX_0F12) },
2208 { "movlpX", { Mq, XM }, PREFIX_OPCODE },
2209 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2210 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
2211 { PREFIX_TABLE (PREFIX_0F16) },
2212 { "movhpX", { Mq, XM }, PREFIX_OPCODE },
2213 /* 18 */
2214 { REG_TABLE (REG_0F18) },
2215 { "nopQ", { Ev }, 0 },
2216 { PREFIX_TABLE (PREFIX_0F1A) },
2217 { PREFIX_TABLE (PREFIX_0F1B) },
2218 { PREFIX_TABLE (PREFIX_0F1C) },
2219 { "nopQ", { Ev }, 0 },
2220 { PREFIX_TABLE (PREFIX_0F1E) },
2221 { "nopQ", { Ev }, 0 },
2222 /* 20 */
2223 { "movZ", { Em, Cm }, 0 },
2224 { "movZ", { Em, Dm }, 0 },
2225 { "movZ", { Cm, Em }, 0 },
2226 { "movZ", { Dm, Em }, 0 },
2227 { X86_64_TABLE (X86_64_0F24) },
2228 { Bad_Opcode },
2229 { X86_64_TABLE (X86_64_0F26) },
2230 { Bad_Opcode },
2231 /* 28 */
2232 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2233 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
2234 { PREFIX_TABLE (PREFIX_0F2A) },
2235 { PREFIX_TABLE (PREFIX_0F2B) },
2236 { PREFIX_TABLE (PREFIX_0F2C) },
2237 { PREFIX_TABLE (PREFIX_0F2D) },
2238 { PREFIX_TABLE (PREFIX_0F2E) },
2239 { PREFIX_TABLE (PREFIX_0F2F) },
2240 /* 30 */
2241 { "wrmsr", { XX }, PREFIX_REX2_ILLEGAL },
2242 { "rdtsc", { XX }, PREFIX_REX2_ILLEGAL },
2243 { "rdmsr", { XX }, PREFIX_REX2_ILLEGAL },
2244 { "rdpmc", { XX }, PREFIX_REX2_ILLEGAL },
2245 { "sysenter", { SEP }, PREFIX_REX2_ILLEGAL },
2246 { "sysexit%LQ", { SEP }, PREFIX_REX2_ILLEGAL },
2247 { Bad_Opcode },
2248 { "getsec", { XX }, 0 },
2249 /* 38 */
2250 { THREE_BYTE_TABLE (THREE_BYTE_0F38) },
2251 { Bad_Opcode },
2252 { THREE_BYTE_TABLE (THREE_BYTE_0F3A) },
2253 { Bad_Opcode },
2254 { Bad_Opcode },
2255 { Bad_Opcode },
2256 { Bad_Opcode },
2257 { Bad_Opcode },
2258 /* 40 */
2259 { "cmovoS", { Gv, Ev }, 0 },
2260 { "cmovnoS", { Gv, Ev }, 0 },
2261 { "cmovbS", { Gv, Ev }, 0 },
2262 { "cmovaeS", { Gv, Ev }, 0 },
2263 { "cmoveS", { Gv, Ev }, 0 },
2264 { "cmovneS", { Gv, Ev }, 0 },
2265 { "cmovbeS", { Gv, Ev }, 0 },
2266 { "cmovaS", { Gv, Ev }, 0 },
2267 /* 48 */
2268 { "cmovsS", { Gv, Ev }, 0 },
2269 { "cmovnsS", { Gv, Ev }, 0 },
2270 { "cmovpS", { Gv, Ev }, 0 },
2271 { "cmovnpS", { Gv, Ev }, 0 },
2272 { "cmovlS", { Gv, Ev }, 0 },
2273 { "cmovgeS", { Gv, Ev }, 0 },
2274 { "cmovleS", { Gv, Ev }, 0 },
2275 { "cmovgS", { Gv, Ev }, 0 },
2276 /* 50 */
2277 { "movmskpX", { Gdq, Ux }, PREFIX_OPCODE },
2278 { PREFIX_TABLE (PREFIX_0F51) },
2279 { PREFIX_TABLE (PREFIX_0F52) },
2280 { PREFIX_TABLE (PREFIX_0F53) },
2281 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2282 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2283 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2284 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
2285 /* 58 */
2286 { PREFIX_TABLE (PREFIX_0F58) },
2287 { PREFIX_TABLE (PREFIX_0F59) },
2288 { PREFIX_TABLE (PREFIX_0F5A) },
2289 { PREFIX_TABLE (PREFIX_0F5B) },
2290 { PREFIX_TABLE (PREFIX_0F5C) },
2291 { PREFIX_TABLE (PREFIX_0F5D) },
2292 { PREFIX_TABLE (PREFIX_0F5E) },
2293 { PREFIX_TABLE (PREFIX_0F5F) },
2294 /* 60 */
2295 { PREFIX_TABLE (PREFIX_0F60) },
2296 { PREFIX_TABLE (PREFIX_0F61) },
2297 { PREFIX_TABLE (PREFIX_0F62) },
2298 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2299 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2300 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2301 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2302 { "packuswb", { MX, EM }, PREFIX_OPCODE },
2303 /* 68 */
2304 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2305 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2306 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2307 { "packssdw", { MX, EM }, PREFIX_OPCODE },
2308 { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2309 { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
2310 { "movK", { MX, Edq }, PREFIX_OPCODE },
2311 { PREFIX_TABLE (PREFIX_0F6F) },
2312 /* 70 */
2313 { PREFIX_TABLE (PREFIX_0F70) },
2314 { REG_TABLE (REG_0F71) },
2315 { REG_TABLE (REG_0F72) },
2316 { REG_TABLE (REG_0F73) },
2317 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2318 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2319 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2320 { "emms", { XX }, PREFIX_OPCODE },
2321 /* 78 */
2322 { PREFIX_TABLE (PREFIX_0F78) },
2323 { PREFIX_TABLE (PREFIX_0F79) },
2324 { Bad_Opcode },
2325 { Bad_Opcode },
2326 { PREFIX_TABLE (PREFIX_0F7C) },
2327 { PREFIX_TABLE (PREFIX_0F7D) },
2328 { PREFIX_TABLE (PREFIX_0F7E) },
2329 { PREFIX_TABLE (PREFIX_0F7F) },
2330 /* 80 */
2331 { "joH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2332 { "jnoH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2333 { "jbH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2334 { "jaeH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2335 { "jeH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2336 { "jneH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2337 { "jbeH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2338 { "jaH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2339 /* 88 */
2340 { "jsH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2341 { "jnsH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2342 { "jpH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2343 { "jnpH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2344 { "jlH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2345 { "jgeH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2346 { "jleH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2347 { "jgH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL },
2348 /* 90 */
2349 { "seto", { Eb }, 0 },
2350 { "setno", { Eb }, 0 },
2351 { "setb", { Eb }, 0 },
2352 { "setae", { Eb }, 0 },
2353 { "sete", { Eb }, 0 },
2354 { "setne", { Eb }, 0 },
2355 { "setbe", { Eb }, 0 },
2356 { "seta", { Eb }, 0 },
2357 /* 98 */
2358 { "sets", { Eb }, 0 },
2359 { "setns", { Eb }, 0 },
2360 { "setp", { Eb }, 0 },
2361 { "setnp", { Eb }, 0 },
2362 { "setl", { Eb }, 0 },
2363 { "setge", { Eb }, 0 },
2364 { "setle", { Eb }, 0 },
2365 { "setg", { Eb }, 0 },
2366 /* a0 */
2367 { "pushP", { fs }, 0 },
2368 { "popP", { fs }, 0 },
2369 { "cpuid", { XX }, 0 },
2370 { "btS", { Ev, Gv }, 0 },
2371 { "shldS", { Ev, Gv, Ib }, 0 },
2372 { "shldS", { Ev, Gv, CL }, 0 },
2373 { REG_TABLE (REG_0FA6) },
2374 { REG_TABLE (REG_0FA7) },
2375 /* a8 */
2376 { "pushP", { gs }, 0 },
2377 { "popP", { gs }, 0 },
2378 { "rsm", { XX }, 0 },
2379 { "btsS", { Evh1, Gv }, 0 },
2380 { "shrdS", { Ev, Gv, Ib }, 0 },
2381 { "shrdS", { Ev, Gv, CL }, 0 },
2382 { REG_TABLE (REG_0FAE) },
2383 { "imulS", { Gv, Ev }, 0 },
2384 /* b0 */
2385 { "cmpxchgB", { Ebh1, Gb }, 0 },
2386 { "cmpxchgS", { Evh1, Gv }, 0 },
2387 { "lssS", { Gv, Mp }, 0 },
2388 { "btrS", { Evh1, Gv }, 0 },
2389 { "lfsS", { Gv, Mp }, 0 },
2390 { "lgsS", { Gv, Mp }, 0 },
2391 { "movz{bR|x}", { Gv, Eb }, 0 },
2392 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2393 /* b8 */
2394 { PREFIX_TABLE (PREFIX_0FB8) },
2395 { "ud1S", { Gv, Ev }, 0 },
2396 { REG_TABLE (REG_0FBA) },
2397 { "btcS", { Evh1, Gv }, 0 },
2398 { PREFIX_TABLE (PREFIX_0FBC) },
2399 { PREFIX_TABLE (PREFIX_0FBD) },
2400 { "movs{bR|x}", { Gv, Eb }, 0 },
2401 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2402 /* c0 */
2403 { "xaddB", { Ebh1, Gb }, 0 },
2404 { "xaddS", { Evh1, Gv }, 0 },
2405 { PREFIX_TABLE (PREFIX_0FC2) },
2406 { "movntiS", { Mdq, Gdq }, PREFIX_OPCODE },
2407 { "pinsrw", { MX, Edw, Ib }, PREFIX_OPCODE },
2408 { "pextrw", { Gd, Nq, Ib }, PREFIX_OPCODE },
2409 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
2410 { REG_TABLE (REG_0FC7) },
2411 /* c8 */
2412 { "bswap", { RMeAX }, 0 },
2413 { "bswap", { RMeCX }, 0 },
2414 { "bswap", { RMeDX }, 0 },
2415 { "bswap", { RMeBX }, 0 },
2416 { "bswap", { RMeSP }, 0 },
2417 { "bswap", { RMeBP }, 0 },
2418 { "bswap", { RMeSI }, 0 },
2419 { "bswap", { RMeDI }, 0 },
2420 /* d0 */
2421 { PREFIX_TABLE (PREFIX_0FD0) },
2422 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2423 { "psrld", { MX, EM }, PREFIX_OPCODE },
2424 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2425 { "paddq", { MX, EM }, PREFIX_OPCODE },
2426 { "pmullw", { MX, EM }, PREFIX_OPCODE },
2427 { PREFIX_TABLE (PREFIX_0FD6) },
2428 { "pmovmskb", { Gdq, Nq }, PREFIX_OPCODE },
2429 /* d8 */
2430 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2431 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2432 { "pminub", { MX, EM }, PREFIX_OPCODE },
2433 { "pand", { MX, EM }, PREFIX_OPCODE },
2434 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2435 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2436 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2437 { "pandn", { MX, EM }, PREFIX_OPCODE },
2438 /* e0 */
2439 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2440 { "psraw", { MX, EM }, PREFIX_OPCODE },
2441 { "psrad", { MX, EM }, PREFIX_OPCODE },
2442 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2443 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2444 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
2445 { PREFIX_TABLE (PREFIX_0FE6) },
2446 { PREFIX_TABLE (PREFIX_0FE7) },
2447 /* e8 */
2448 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2449 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2450 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2451 { "por", { MX, EM }, PREFIX_OPCODE },
2452 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2453 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2454 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2455 { "pxor", { MX, EM }, PREFIX_OPCODE },
2456 /* f0 */
2457 { PREFIX_TABLE (PREFIX_0FF0) },
2458 { "psllw", { MX, EM }, PREFIX_OPCODE },
2459 { "pslld", { MX, EM }, PREFIX_OPCODE },
2460 { "psllq", { MX, EM }, PREFIX_OPCODE },
2461 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2462 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2463 { "psadbw", { MX, EM }, PREFIX_OPCODE },
2464 { PREFIX_TABLE (PREFIX_0FF7) },
2465 /* f8 */
2466 { "psubb", { MX, EM }, PREFIX_OPCODE },
2467 { "psubw", { MX, EM }, PREFIX_OPCODE },
2468 { "psubd", { MX, EM }, PREFIX_OPCODE },
2469 { "psubq", { MX, EM }, PREFIX_OPCODE },
2470 { "paddb", { MX, EM }, PREFIX_OPCODE },
2471 { "paddw", { MX, EM }, PREFIX_OPCODE },
2472 { "paddd", { MX, EM }, PREFIX_OPCODE },
2473 { "ud0S", { Gv, Ev }, 0 },
2474 };
2475
2476 static const bool onebyte_has_modrm[256] = {
2477 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2478 /* ------------------------------- */
2479 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2480 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2481 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2482 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2483 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2484 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2485 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2486 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2487 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2488 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2489 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2490 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2491 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2492 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2493 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2494 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2495 /* ------------------------------- */
2496 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2497 };
2498
2499 static const bool twobyte_has_modrm[256] = {
2500 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2501 /* ------------------------------- */
2502 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2503 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2504 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2505 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2506 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2507 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2508 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2509 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2510 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2511 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2512 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2513 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2514 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2515 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2516 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2517 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2518 /* ------------------------------- */
2519 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2520 };
2521
2522
2523 struct op
2524 {
2525 const char *name;
2526 unsigned int len;
2527 };
2528
2529 /* If we are accessing mod/rm/reg without need_modrm set, then the
2530 values are stale. Hitting this abort likely indicates that you
2531 need to update onebyte_has_modrm or twobyte_has_modrm. */
2532 #define MODRM_CHECK if (!ins->need_modrm) abort ()
2533
2534 static const char intel_index16[][6] = {
2535 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2536 };
2537
2538 static const char att_names64[][8] = {
2539 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2540 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
2541 "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23",
2542 "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31",
2543 };
2544 static const char att_names32[][8] = {
2545 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2546 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d",
2547 "%r16d", "%r17d", "%r18d", "%r19d", "%r20d", "%r21d", "%r22d", "%r23d",
2548 "%r24d", "%r25d", "%r26d", "%r27d", "%r28d", "%r29d", "%r30d", "%r31d",
2549 };
2550 static const char att_names16[][8] = {
2551 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2552 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w",
2553 "%r16w", "%r17w", "%r18w", "%r19w", "%r20w", "%r21w", "%r22w", "%r23w",
2554 "%r24w", "%r25w", "%r26w", "%r27w", "%r28w", "%r29w", "%r30w", "%r31w",
2555 };
2556 static const char att_names8[][8] = {
2557 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2558 };
2559 static const char att_names8rex[][8] = {
2560 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2561 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b",
2562 "%r16b", "%r17b", "%r18b", "%r19b", "%r20b", "%r21b", "%r22b", "%r23b",
2563 "%r24b", "%r25b", "%r26b", "%r27b", "%r28b", "%r29b", "%r30b", "%r31b",
2564 };
2565 static const char att_names_seg[][4] = {
2566 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2567 };
2568 static const char att_index64[] = "%riz";
2569 static const char att_index32[] = "%eiz";
2570 static const char att_index16[][8] = {
2571 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2572 };
2573
2574 static const char att_names_mm[][8] = {
2575 "%mm0", "%mm1", "%mm2", "%mm3",
2576 "%mm4", "%mm5", "%mm6", "%mm7"
2577 };
2578
2579 static const char att_names_bnd[][8] = {
2580 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2581 };
2582
2583 static const char att_names_xmm[][8] = {
2584 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2585 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2586 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2587 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2588 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2589 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2590 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2591 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2592 };
2593
2594 static const char att_names_ymm[][8] = {
2595 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2596 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2597 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2598 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2599 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2600 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2601 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2602 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2603 };
2604
2605 static const char att_names_zmm[][8] = {
2606 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2607 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2608 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2609 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2610 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2611 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2612 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2613 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2614 };
2615
2616 static const char att_names_tmm[][8] = {
2617 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2618 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2619 };
2620
2621 static const char att_names_mask[][8] = {
2622 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2623 };
2624
2625 static const char *const names_rounding[] =
2626 {
2627 "{rn-",
2628 "{rd-",
2629 "{ru-",
2630 "{rz-"
2631 };
2632
2633 static const struct dis386 reg_table[][8] = {
2634 /* REG_80 */
2635 {
2636 { "addA", { Ebh1, Ib }, 0 },
2637 { "orA", { Ebh1, Ib }, 0 },
2638 { "adcA", { Ebh1, Ib }, 0 },
2639 { "sbbA", { Ebh1, Ib }, 0 },
2640 { "andA", { Ebh1, Ib }, 0 },
2641 { "subA", { Ebh1, Ib }, 0 },
2642 { "xorA", { Ebh1, Ib }, 0 },
2643 { "cmpA", { Eb, Ib }, 0 },
2644 },
2645 /* REG_81 */
2646 {
2647 { "addQ", { Evh1, Iv }, 0 },
2648 { "orQ", { Evh1, Iv }, 0 },
2649 { "adcQ", { Evh1, Iv }, 0 },
2650 { "sbbQ", { Evh1, Iv }, 0 },
2651 { "andQ", { Evh1, Iv }, 0 },
2652 { "subQ", { Evh1, Iv }, 0 },
2653 { "xorQ", { Evh1, Iv }, 0 },
2654 { "cmpQ", { Ev, Iv }, 0 },
2655 },
2656 /* REG_83 */
2657 {
2658 { "addQ", { Evh1, sIb }, 0 },
2659 { "orQ", { Evh1, sIb }, 0 },
2660 { "adcQ", { Evh1, sIb }, 0 },
2661 { "sbbQ", { Evh1, sIb }, 0 },
2662 { "andQ", { Evh1, sIb }, 0 },
2663 { "subQ", { Evh1, sIb }, 0 },
2664 { "xorQ", { Evh1, sIb }, 0 },
2665 { "cmpQ", { Ev, sIb }, 0 },
2666 },
2667 /* REG_8F */
2668 {
2669 { "pop{P|}", { stackEv }, 0 },
2670 { XOP_8F_TABLE () },
2671 { Bad_Opcode },
2672 { Bad_Opcode },
2673 { Bad_Opcode },
2674 { XOP_8F_TABLE () },
2675 },
2676 /* REG_C0 */
2677 {
2678 { "%NFrolA", { VexGb, Eb, Ib }, NO_PREFIX },
2679 { "%NFrorA", { VexGb, Eb, Ib }, NO_PREFIX },
2680 { "rclA", { VexGb, Eb, Ib }, NO_PREFIX },
2681 { "rcrA", { VexGb, Eb, Ib }, NO_PREFIX },
2682 { "%NFshlA", { VexGb, Eb, Ib }, NO_PREFIX },
2683 { "%NFshrA", { VexGb, Eb, Ib }, NO_PREFIX },
2684 { "%NFshlA", { VexGb, Eb, Ib }, NO_PREFIX },
2685 { "%NFsarA", { VexGb, Eb, Ib }, NO_PREFIX },
2686 },
2687 /* REG_C1 */
2688 {
2689 { "%NFrolQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2690 { "%NFrorQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2691 { "rclQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2692 { "rcrQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2693 { "%NFshlQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2694 { "%NFshrQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2695 { "%NFshlQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2696 { "%NFsarQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA },
2697 },
2698 /* REG_C6 */
2699 {
2700 { "movA", { Ebh3, Ib }, 0 },
2701 { Bad_Opcode },
2702 { Bad_Opcode },
2703 { Bad_Opcode },
2704 { Bad_Opcode },
2705 { Bad_Opcode },
2706 { Bad_Opcode },
2707 { RM_TABLE (RM_C6_REG_7) },
2708 },
2709 /* REG_C7 */
2710 {
2711 { "movQ", { Evh3, Iv }, 0 },
2712 { Bad_Opcode },
2713 { Bad_Opcode },
2714 { Bad_Opcode },
2715 { Bad_Opcode },
2716 { Bad_Opcode },
2717 { Bad_Opcode },
2718 { RM_TABLE (RM_C7_REG_7) },
2719 },
2720 /* REG_D0 */
2721 {
2722 { "%NFrolA", { VexGb, Eb, I1 }, NO_PREFIX },
2723 { "%NFrorA", { VexGb, Eb, I1 }, NO_PREFIX },
2724 { "rclA", { VexGb, Eb, I1 }, NO_PREFIX },
2725 { "rcrA", { VexGb, Eb, I1 }, NO_PREFIX },
2726 { "%NFshlA", { VexGb, Eb, I1 }, NO_PREFIX },
2727 { "%NFshrA", { VexGb, Eb, I1 }, NO_PREFIX },
2728 { "%NFshlA", { VexGb, Eb, I1 }, NO_PREFIX },
2729 { "%NFsarA", { VexGb, Eb, I1 }, NO_PREFIX },
2730 },
2731 /* REG_D1 */
2732 {
2733 { "%NFrolQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2734 { "%NFrorQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2735 { "rclQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2736 { "rcrQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2737 { "%NFshlQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2738 { "%NFshrQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2739 { "%NFshlQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2740 { "%NFsarQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA },
2741 },
2742 /* REG_D2 */
2743 {
2744 { "%NFrolA", { VexGb, Eb, CL }, NO_PREFIX },
2745 { "%NFrorA", { VexGb, Eb, CL }, NO_PREFIX },
2746 { "rclA", { VexGb, Eb, CL }, NO_PREFIX },
2747 { "rcrA", { VexGb, Eb, CL }, NO_PREFIX },
2748 { "%NFshlA", { VexGb, Eb, CL }, NO_PREFIX },
2749 { "%NFshrA", { VexGb, Eb, CL }, NO_PREFIX },
2750 { "%NFshlA", { VexGb, Eb, CL }, NO_PREFIX },
2751 { "%NFsarA", { VexGb, Eb, CL }, NO_PREFIX },
2752 },
2753 /* REG_D3 */
2754 {
2755 { "%NFrolQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2756 { "%NFrorQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2757 { "rclQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2758 { "rcrQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2759 { "%NFshlQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2760 { "%NFshrQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2761 { "%NFshlQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2762 { "%NFsarQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA },
2763 },
2764 /* REG_F6 */
2765 {
2766 { "testA", { Eb, Ib }, 0 },
2767 { "testA", { Eb, Ib }, 0 },
2768 { "notA", { Ebh1 }, 0 },
2769 { "negA", { Ebh1 }, 0 },
2770 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
2771 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
2772 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
2773 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
2774 },
2775 /* REG_F7 */
2776 {
2777 { "testQ", { Ev, Iv }, 0 },
2778 { "testQ", { Ev, Iv }, 0 },
2779 { "notQ", { Evh1 }, 0 },
2780 { "negQ", { Evh1 }, 0 },
2781 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
2782 { "imulQ", { Ev }, 0 },
2783 { "divQ", { Ev }, 0 },
2784 { "idivQ", { Ev }, 0 },
2785 },
2786 /* REG_FE */
2787 {
2788 { "incA", { Ebh1 }, 0 },
2789 { "decA", { Ebh1 }, 0 },
2790 },
2791 /* REG_FF */
2792 {
2793 { "incQ", { Evh1 }, 0 },
2794 { "decQ", { Evh1 }, 0 },
2795 { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
2796 { "{l|}call^", { indirEp }, 0 },
2797 { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
2798 { "{l|}jmp^", { indirEp }, 0 },
2799 { "push{P|}", { stackEv }, 0 },
2800 { Bad_Opcode },
2801 },
2802 /* REG_0F00 */
2803 {
2804 { "sldtD", { Sv }, 0 },
2805 { "strD", { Sv }, 0 },
2806 { "lldtD", { Sv }, 0 },
2807 { "ltrD", { Sv }, 0 },
2808 { "verrD", { Sv }, 0 },
2809 { "verwD", { Sv }, 0 },
2810 { X86_64_TABLE (X86_64_0F00_REG_6) },
2811 { Bad_Opcode },
2812 },
2813 /* REG_0F01 */
2814 {
2815 { MOD_TABLE (MOD_0F01_REG_0) },
2816 { MOD_TABLE (MOD_0F01_REG_1) },
2817 { MOD_TABLE (MOD_0F01_REG_2) },
2818 { MOD_TABLE (MOD_0F01_REG_3) },
2819 { "smswD", { Sv }, 0 },
2820 { MOD_TABLE (MOD_0F01_REG_5) },
2821 { "lmsw", { Ew }, 0 },
2822 { MOD_TABLE (MOD_0F01_REG_7) },
2823 },
2824 /* REG_0F0D */
2825 {
2826 { "prefetch", { Mb }, 0 },
2827 { "prefetchw", { Mb }, 0 },
2828 { "prefetchwt1", { Mb }, 0 },
2829 { "prefetch", { Mb }, 0 },
2830 { "prefetch", { Mb }, 0 },
2831 { "prefetch", { Mb }, 0 },
2832 { "prefetch", { Mb }, 0 },
2833 { "prefetch", { Mb }, 0 },
2834 },
2835 /* REG_0F18 */
2836 {
2837 { MOD_TABLE (MOD_0F18_REG_0) },
2838 { MOD_TABLE (MOD_0F18_REG_1) },
2839 { MOD_TABLE (MOD_0F18_REG_2) },
2840 { MOD_TABLE (MOD_0F18_REG_3) },
2841 { "nopQ", { Ev }, 0 },
2842 { "nopQ", { Ev }, 0 },
2843 { MOD_TABLE (MOD_0F18_REG_6) },
2844 { MOD_TABLE (MOD_0F18_REG_7) },
2845 },
2846 /* REG_0F1C_P_0_MOD_0 */
2847 {
2848 { "cldemote", { Mb }, 0 },
2849 { "nopQ", { Ev }, 0 },
2850 { "nopQ", { Ev }, 0 },
2851 { "nopQ", { Ev }, 0 },
2852 { "nopQ", { Ev }, 0 },
2853 { "nopQ", { Ev }, 0 },
2854 { "nopQ", { Ev }, 0 },
2855 { "nopQ", { Ev }, 0 },
2856 },
2857 /* REG_0F1E_P_1_MOD_3 */
2858 {
2859 { "nopQ", { Ev }, PREFIX_IGNORED },
2860 { "rdsspK", { Edq }, 0 },
2861 { "nopQ", { Ev }, PREFIX_IGNORED },
2862 { "nopQ", { Ev }, PREFIX_IGNORED },
2863 { "nopQ", { Ev }, PREFIX_IGNORED },
2864 { "nopQ", { Ev }, PREFIX_IGNORED },
2865 { "nopQ", { Ev }, PREFIX_IGNORED },
2866 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
2867 },
2868 /* REG_0F38D8_PREFIX_1 */
2869 {
2870 { "aesencwide128kl", { M }, 0 },
2871 { "aesdecwide128kl", { M }, 0 },
2872 { "aesencwide256kl", { M }, 0 },
2873 { "aesdecwide256kl", { M }, 0 },
2874 },
2875 /* REG_0F3A0F_P_1 */
2876 {
2877 { RM_TABLE (RM_0F3A0F_P_1_R_0) },
2878 },
2879 /* REG_0F71 */
2880 {
2881 { Bad_Opcode },
2882 { Bad_Opcode },
2883 { "psrlw", { Nq, Ib }, PREFIX_OPCODE },
2884 { Bad_Opcode },
2885 { "psraw", { Nq, Ib }, PREFIX_OPCODE },
2886 { Bad_Opcode },
2887 { "psllw", { Nq, Ib }, PREFIX_OPCODE },
2888 },
2889 /* REG_0F72 */
2890 {
2891 { Bad_Opcode },
2892 { Bad_Opcode },
2893 { "psrld", { Nq, Ib }, PREFIX_OPCODE },
2894 { Bad_Opcode },
2895 { "psrad", { Nq, Ib }, PREFIX_OPCODE },
2896 { Bad_Opcode },
2897 { "pslld", { Nq, Ib }, PREFIX_OPCODE },
2898 },
2899 /* REG_0F73 */
2900 {
2901 { Bad_Opcode },
2902 { Bad_Opcode },
2903 { "psrlq", { Nq, Ib }, PREFIX_OPCODE },
2904 { "psrldq", { Ux, Ib }, PREFIX_DATA },
2905 { Bad_Opcode },
2906 { Bad_Opcode },
2907 { "psllq", { Nq, Ib }, PREFIX_OPCODE },
2908 { "pslldq", { Ux, Ib }, PREFIX_DATA },
2909 },
2910 /* REG_0FA6 */
2911 {
2912 { PREFIX_TABLE (PREFIX_0FA6_REG_0) },
2913 { "xsha1", { { OP_0f07, 0 } }, 0 },
2914 { "xsha256", { { OP_0f07, 0 } }, 0 },
2915 { Bad_Opcode },
2916 { Bad_Opcode },
2917 { PREFIX_TABLE (PREFIX_0FA6_REG_5) },
2918 },
2919 /* REG_0FA7 */
2920 {
2921 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
2922 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
2923 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
2924 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
2925 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
2926 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
2927 { PREFIX_TABLE (PREFIX_0FA7_REG_6) },
2928 },
2929 /* REG_0FAE */
2930 {
2931 { MOD_TABLE (MOD_0FAE_REG_0) },
2932 { MOD_TABLE (MOD_0FAE_REG_1) },
2933 { MOD_TABLE (MOD_0FAE_REG_2) },
2934 { MOD_TABLE (MOD_0FAE_REG_3) },
2935 { MOD_TABLE (MOD_0FAE_REG_4) },
2936 { MOD_TABLE (MOD_0FAE_REG_5) },
2937 { MOD_TABLE (MOD_0FAE_REG_6) },
2938 { MOD_TABLE (MOD_0FAE_REG_7) },
2939 },
2940 /* REG_0FBA */
2941 {
2942 { Bad_Opcode },
2943 { Bad_Opcode },
2944 { Bad_Opcode },
2945 { Bad_Opcode },
2946 { "btQ", { Ev, Ib }, 0 },
2947 { "btsQ", { Evh1, Ib }, 0 },
2948 { "btrQ", { Evh1, Ib }, 0 },
2949 { "btcQ", { Evh1, Ib }, 0 },
2950 },
2951 /* REG_0FC7 */
2952 {
2953 { Bad_Opcode },
2954 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
2955 { Bad_Opcode },
2956 { "xrstors", { FXSAVE }, PREFIX_REX2_ILLEGAL },
2957 { "xsavec", { FXSAVE }, PREFIX_REX2_ILLEGAL },
2958 { "xsaves", { FXSAVE }, PREFIX_REX2_ILLEGAL },
2959 { MOD_TABLE (MOD_0FC7_REG_6) },
2960 { MOD_TABLE (MOD_0FC7_REG_7) },
2961 },
2962 /* REG_VEX_0F71 */
2963 {
2964 { Bad_Opcode },
2965 { Bad_Opcode },
2966 { "vpsrlw", { Vex, Ux, Ib }, PREFIX_DATA },
2967 { Bad_Opcode },
2968 { "vpsraw", { Vex, Ux, Ib }, PREFIX_DATA },
2969 { Bad_Opcode },
2970 { "vpsllw", { Vex, Ux, Ib }, PREFIX_DATA },
2971 },
2972 /* REG_VEX_0F72 */
2973 {
2974 { Bad_Opcode },
2975 { Bad_Opcode },
2976 { "vpsrld", { Vex, Ux, Ib }, PREFIX_DATA },
2977 { Bad_Opcode },
2978 { "vpsrad", { Vex, Ux, Ib }, PREFIX_DATA },
2979 { Bad_Opcode },
2980 { "vpslld", { Vex, Ux, Ib }, PREFIX_DATA },
2981 },
2982 /* REG_VEX_0F73 */
2983 {
2984 { Bad_Opcode },
2985 { Bad_Opcode },
2986 { "vpsrlq", { Vex, Ux, Ib }, PREFIX_DATA },
2987 { "vpsrldq", { Vex, Ux, Ib }, PREFIX_DATA },
2988 { Bad_Opcode },
2989 { Bad_Opcode },
2990 { "vpsllq", { Vex, Ux, Ib }, PREFIX_DATA },
2991 { "vpslldq", { Vex, Ux, Ib }, PREFIX_DATA },
2992 },
2993 /* REG_VEX_0FAE */
2994 {
2995 { Bad_Opcode },
2996 { Bad_Opcode },
2997 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2) },
2998 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3) },
2999 },
3000 /* REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0 */
3001 {
3002 { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0) },
3003 },
3004 /* REG_VEX_0F38F3_L_0_P_0 */
3005 {
3006 { Bad_Opcode },
3007 { "%NFblsrS", { VexGdq, Edq }, 0 },
3008 { "%NFblsmskS", { VexGdq, Edq }, 0 },
3009 { "%NFblsiS", { VexGdq, Edq }, 0 },
3010 },
3011 /* REG_VEX_MAP7_F6_L_0_W_0 */
3012 {
3013 { X86_64_TABLE (X86_64_VEX_MAP7_F6_L_0_W_0_R_0) },
3014 },
3015 /* REG_VEX_MAP7_F8_L_0_W_0 */
3016 {
3017 { X86_64_TABLE (X86_64_VEX_MAP7_F8_L_0_W_0_R_0) },
3018 },
3019 /* REG_XOP_09_01_L_0 */
3020 {
3021 { Bad_Opcode },
3022 { "blcfill", { VexGdq, Edq }, 0 },
3023 { "blsfill", { VexGdq, Edq }, 0 },
3024 { "blcs", { VexGdq, Edq }, 0 },
3025 { "tzmsk", { VexGdq, Edq }, 0 },
3026 { "blcic", { VexGdq, Edq }, 0 },
3027 { "blsic", { VexGdq, Edq }, 0 },
3028 { "t1mskc", { VexGdq, Edq }, 0 },
3029 },
3030 /* REG_XOP_09_02_L_0 */
3031 {
3032 { Bad_Opcode },
3033 { "blcmsk", { VexGdq, Edq }, 0 },
3034 { Bad_Opcode },
3035 { Bad_Opcode },
3036 { Bad_Opcode },
3037 { Bad_Opcode },
3038 { "blci", { VexGdq, Edq }, 0 },
3039 },
3040 /* REG_XOP_09_12_L_0 */
3041 {
3042 { "llwpcb", { Rdq }, 0 },
3043 { "slwpcb", { Rdq }, 0 },
3044 },
3045 /* REG_XOP_0A_12_L_0 */
3046 {
3047 { "lwpins", { VexGdq, Ed, Id }, 0 },
3048 { "lwpval", { VexGdq, Ed, Id }, 0 },
3049 },
3050
3051 #include "i386-dis-evex-reg.h"
3052 };
3053
3054 static const struct dis386 prefix_table[][4] = {
3055 /* PREFIX_90 */
3056 {
3057 { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
3058 { "pause", { XX }, 0 },
3059 { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
3060 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
3061 },
3062
3063 /* PREFIX_0F00_REG_6_X86_64 */
3064 {
3065 { Bad_Opcode },
3066 { Bad_Opcode },
3067 { Bad_Opcode },
3068 { "lkgsD", { Sv }, 0 },
3069 },
3070
3071 /* PREFIX_0F01_REG_0_MOD_3_RM_6 */
3072 {
3073 { "wrmsrns", { Skip_MODRM }, 0 },
3074 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_1) },
3075 { Bad_Opcode },
3076 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_3) },
3077 },
3078
3079 /* PREFIX_0F01_REG_0_MOD_3_RM_7 */
3080 {
3081 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_7_P_0) },
3082 },
3083
3084 /* PREFIX_0F01_REG_1_RM_2 */
3085 {
3086 { "clac", { Skip_MODRM }, 0 },
3087 { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_1) },
3088 { Bad_Opcode },
3089 { X86_64_TABLE (X86_64_0F01_REG_1_RM_2_PREFIX_3)},
3090 },
3091
3092 /* PREFIX_0F01_REG_1_RM_4 */
3093 {
3094 { Bad_Opcode },
3095 { Bad_Opcode },
3096 { "tdcall", { Skip_MODRM }, 0 },
3097 { Bad_Opcode },
3098 },
3099
3100 /* PREFIX_0F01_REG_1_RM_5 */
3101 {
3102 { Bad_Opcode },
3103 { Bad_Opcode },
3104 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2) },
3105 { Bad_Opcode },
3106 },
3107
3108 /* PREFIX_0F01_REG_1_RM_6 */
3109 {
3110 { Bad_Opcode },
3111 { Bad_Opcode },
3112 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2) },
3113 { Bad_Opcode },
3114 },
3115
3116 /* PREFIX_0F01_REG_1_RM_7 */
3117 {
3118 { "encls", { Skip_MODRM }, 0 },
3119 { Bad_Opcode },
3120 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2) },
3121 { Bad_Opcode },
3122 },
3123
3124 /* PREFIX_0F01_REG_3_RM_1 */
3125 {
3126 { "vmmcall", { Skip_MODRM }, 0 },
3127 { "vmgexit", { Skip_MODRM }, 0 },
3128 { Bad_Opcode },
3129 { "vmgexit", { Skip_MODRM }, 0 },
3130 },
3131
3132 /* PREFIX_0F01_REG_5_MOD_0 */
3133 {
3134 { Bad_Opcode },
3135 { "rstorssp", { Mq }, PREFIX_OPCODE },
3136 },
3137
3138 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3139 {
3140 { "serialize", { Skip_MODRM }, PREFIX_OPCODE },
3141 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
3142 { Bad_Opcode },
3143 { "xsusldtrk", { Skip_MODRM }, PREFIX_OPCODE },
3144 },
3145
3146 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3147 {
3148 { Bad_Opcode },
3149 { Bad_Opcode },
3150 { Bad_Opcode },
3151 { "xresldtrk", { Skip_MODRM }, PREFIX_OPCODE },
3152 },
3153
3154 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3155 {
3156 { Bad_Opcode },
3157 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
3158 },
3159
3160 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3161 {
3162 { Bad_Opcode },
3163 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1) },
3164 },
3165
3166 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3167 {
3168 { Bad_Opcode },
3169 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1) },
3170 },
3171
3172 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3173 {
3174 { "rdpkru", { Skip_MODRM }, 0 },
3175 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1) },
3176 },
3177
3178 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3179 {
3180 { "wrpkru", { Skip_MODRM }, 0 },
3181 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1) },
3182 },
3183
3184 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3185 {
3186 { "monitorx", { { OP_Monitor, 0 } }, 0 },
3187 { "mcommit", { Skip_MODRM }, 0 },
3188 },
3189
3190 /* PREFIX_0F01_REG_7_MOD_3_RM_5 */
3191 {
3192 { "rdpru", { Skip_MODRM }, 0 },
3193 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1) },
3194 },
3195
3196 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3197 {
3198 { "invlpgb", { Skip_MODRM }, 0 },
3199 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1) },
3200 { Bad_Opcode },
3201 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3) },
3202 },
3203
3204 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3205 {
3206 { "tlbsync", { Skip_MODRM }, 0 },
3207 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1) },
3208 { Bad_Opcode },
3209 { "pvalidate", { Skip_MODRM }, 0 },
3210 },
3211
3212 /* PREFIX_0F09 */
3213 {
3214 { "wbinvd", { XX }, 0 },
3215 { "wbnoinvd", { XX }, 0 },
3216 },
3217
3218 /* PREFIX_0F10 */
3219 {
3220 { "%XEVmovupX", { XM, EXEvexXNoBcst }, 0 },
3221 { "%XEVmovs%XS", { XMScalar, VexScalarR, EXd }, 0 },
3222 { "%XEVmovupX", { XM, EXEvexXNoBcst }, 0 },
3223 { "%XEVmovs%XD", { XMScalar, VexScalarR, EXq }, 0 },
3224 },
3225
3226 /* PREFIX_0F11 */
3227 {
3228 { "%XEVmovupX", { EXxS, XM }, 0 },
3229 { "%XEVmovs%XS", { EXdS, VexScalarR, XMScalar }, 0 },
3230 { "%XEVmovupX", { EXxS, XM }, 0 },
3231 { "%XEVmovs%XD", { EXqS, VexScalarR, XMScalar }, 0 },
3232 },
3233
3234 /* PREFIX_0F12 */
3235 {
3236 { MOD_TABLE (MOD_0F12_PREFIX_0) },
3237 { "movsldup", { XM, EXx }, 0 },
3238 { "%XEVmovlpYX", { XM, Vex, Mq }, 0 },
3239 { "movddup", { XM, EXq }, 0 },
3240 },
3241
3242 /* PREFIX_0F16 */
3243 {
3244 { MOD_TABLE (MOD_0F16_PREFIX_0) },
3245 { "movshdup", { XM, EXx }, 0 },
3246 { "%XEVmovhpYX", { XM, Vex, Mq }, 0 },
3247 },
3248
3249 /* PREFIX_0F18_REG_6_MOD_0_X86_64 */
3250 {
3251 { "prefetchit1", { { PREFETCHI_Fixup, b_mode } }, 0 },
3252 { "nopQ", { Ev }, 0 },
3253 { "nopQ", { Ev }, 0 },
3254 { "nopQ", { Ev }, 0 },
3255 },
3256
3257 /* PREFIX_0F18_REG_7_MOD_0_X86_64 */
3258 {
3259 { "prefetchit0", { { PREFETCHI_Fixup, b_mode } }, 0 },
3260 { "nopQ", { Ev }, 0 },
3261 { "nopQ", { Ev }, 0 },
3262 { "nopQ", { Ev }, 0 },
3263 },
3264
3265 /* PREFIX_0F1A */
3266 {
3267 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3268 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3269 { "bndmov", { Gbnd, Ebnd }, 0 },
3270 { "bndcu", { Gbnd, Ev_bnd }, 0 },
3271 },
3272
3273 /* PREFIX_0F1B */
3274 {
3275 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3276 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3277 { "bndmov", { EbndS, Gbnd }, 0 },
3278 { "bndcn", { Gbnd, Ev_bnd }, 0 },
3279 },
3280
3281 /* PREFIX_0F1C */
3282 {
3283 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3284 { "nopQ", { Ev }, PREFIX_IGNORED },
3285 { "nopQ", { Ev }, 0 },
3286 { "nopQ", { Ev }, PREFIX_IGNORED },
3287 },
3288
3289 /* PREFIX_0F1E */
3290 {
3291 { "nopQ", { Ev }, 0 },
3292 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3293 { "nopQ", { Ev }, 0 },
3294 { NULL, { XX }, PREFIX_IGNORED },
3295 },
3296
3297 /* PREFIX_0F2A */
3298 {
3299 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3300 { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
3301 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3302 { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
3303 },
3304
3305 /* PREFIX_0F2B */
3306 {
3307 { "movntps", { Mx, XM }, 0 },
3308 { "movntss", { Md, XM }, 0 },
3309 { "movntpd", { Mx, XM }, 0 },
3310 { "movntsd", { Mq, XM }, 0 },
3311 },
3312
3313 /* PREFIX_0F2C */
3314 {
3315 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3316 { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
3317 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3318 { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3319 },
3320
3321 /* PREFIX_0F2D */
3322 {
3323 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3324 { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
3325 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3326 { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3327 },
3328
3329 /* PREFIX_0F2E */
3330 {
3331 { "VucomisYX", { XMScalar, EXd, EXxEVexS }, 0 },
3332 { Bad_Opcode },
3333 { "VucomisYX", { XMScalar, EXq, EXxEVexS }, 0 },
3334 },
3335
3336 /* PREFIX_0F2F */
3337 {
3338 { "VcomisYX", { XMScalar, EXd, EXxEVexS }, 0 },
3339 { Bad_Opcode },
3340 { "VcomisYX", { XMScalar, EXq, EXxEVexS }, 0 },
3341 },
3342
3343 /* PREFIX_0F51 */
3344 {
3345 { "%XEVsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3346 { "%XEVsqrts%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3347 { "%XEVsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3348 { "%XEVsqrts%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3349 },
3350
3351 /* PREFIX_0F52 */
3352 {
3353 { "Vrsqrtps", { XM, EXx }, 0 },
3354 { "Vrsqrtss", { XMScalar, VexScalar, EXd }, 0 },
3355 },
3356
3357 /* PREFIX_0F53 */
3358 {
3359 { "Vrcpps", { XM, EXx }, 0 },
3360 { "Vrcpss", { XMScalar, VexScalar, EXd }, 0 },
3361 },
3362
3363 /* PREFIX_0F58 */
3364 {
3365 { "%XEVaddpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3366 { "%XEVadds%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3367 { "%XEVaddpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3368 { "%XEVadds%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3369 },
3370
3371 /* PREFIX_0F59 */
3372 {
3373 { "%XEVmulpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3374 { "%XEVmuls%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3375 { "%XEVmulpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3376 { "%XEVmuls%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3377 },
3378
3379 /* PREFIX_0F5A */
3380 {
3381 { "%XEVcvtp%XS2pd", { XM, EXEvexHalfBcstXmmq, EXxEVexS }, 0 },
3382 { "%XEVcvts%XS2sd", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3383 { "%XEVcvtp%XD2ps%XY", { XMxmmq, EXx, EXxEVexR }, 0 },
3384 { "%XEVcvts%XD2ss", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3385 },
3386
3387 /* PREFIX_0F5B */
3388 {
3389 { "Vcvtdq2ps", { XM, EXx }, 0 },
3390 { "Vcvttps2dq", { XM, EXx }, 0 },
3391 { "Vcvtps2dq", { XM, EXx }, 0 },
3392 },
3393
3394 /* PREFIX_0F5C */
3395 {
3396 { "%XEVsubpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3397 { "%XEVsubs%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3398 { "%XEVsubpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3399 { "%XEVsubs%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3400 },
3401
3402 /* PREFIX_0F5D */
3403 {
3404 { "%XEVminpX", { XM, Vex, EXx, EXxEVexS }, 0 },
3405 { "%XEVmins%XS", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3406 { "%XEVminpX", { XM, Vex, EXx, EXxEVexS }, 0 },
3407 { "%XEVmins%XD", { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3408 },
3409
3410 /* PREFIX_0F5E */
3411 {
3412 { "%XEVdivpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3413 { "%XEVdivs%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3414 { "%XEVdivpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3415 { "%XEVdivs%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3416 },
3417
3418 /* PREFIX_0F5F */
3419 {
3420 { "%XEVmaxpX", { XM, Vex, EXx, EXxEVexS }, 0 },
3421 { "%XEVmaxs%XS", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3422 { "%XEVmaxpX", { XM, Vex, EXx, EXxEVexS }, 0 },
3423 { "%XEVmaxs%XD", { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3424 },
3425
3426 /* PREFIX_0F60 */
3427 {
3428 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3429 { Bad_Opcode },
3430 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3431 },
3432
3433 /* PREFIX_0F61 */
3434 {
3435 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3436 { Bad_Opcode },
3437 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3438 },
3439
3440 /* PREFIX_0F62 */
3441 {
3442 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3443 { Bad_Opcode },
3444 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3445 },
3446
3447 /* PREFIX_0F6F */
3448 {
3449 { "movq", { MX, EM }, PREFIX_OPCODE },
3450 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3451 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3452 },
3453
3454 /* PREFIX_0F70 */
3455 {
3456 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3457 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3458 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3459 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3460 },
3461
3462 /* PREFIX_0F78 */
3463 {
3464 {"vmread", { Em, Gm }, 0 },
3465 { Bad_Opcode },
3466 {"extrq", { Uxmm, Ib, Ib }, 0 },
3467 {"insertq", { XM, Uxmm, Ib, Ib }, 0 },
3468 },
3469
3470 /* PREFIX_0F79 */
3471 {
3472 {"vmwrite", { Gm, Em }, 0 },
3473 { Bad_Opcode },
3474 {"extrq", { XM, Uxmm }, 0 },
3475 {"insertq", { XM, Uxmm }, 0 },
3476 },
3477
3478 /* PREFIX_0F7C */
3479 {
3480 { Bad_Opcode },
3481 { Bad_Opcode },
3482 { "Vhaddpd", { XM, Vex, EXx }, 0 },
3483 { "Vhaddps", { XM, Vex, EXx }, 0 },
3484 },
3485
3486 /* PREFIX_0F7D */
3487 {
3488 { Bad_Opcode },
3489 { Bad_Opcode },
3490 { "Vhsubpd", { XM, Vex, EXx }, 0 },
3491 { "Vhsubps", { XM, Vex, EXx }, 0 },
3492 },
3493
3494 /* PREFIX_0F7E */
3495 {
3496 { "movK", { Edq, MX }, PREFIX_OPCODE },
3497 { "movq", { XM, EXq }, PREFIX_OPCODE },
3498 { "movK", { Edq, XM }, PREFIX_OPCODE },
3499 },
3500
3501 /* PREFIX_0F7F */
3502 {
3503 { "movq", { EMS, MX }, PREFIX_OPCODE },
3504 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3505 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3506 },
3507
3508 /* PREFIX_0FA6_REG_0 */
3509 {
3510 { Bad_Opcode },
3511 { "montmul", { { MONTMUL_Fixup, 0 } }, 0},
3512 { Bad_Opcode },
3513 { "sm2", { Skip_MODRM }, 0 },
3514 },
3515
3516 /* PREFIX_0FA6_REG_5 */
3517 {
3518 { Bad_Opcode },
3519 { "sm3", { Skip_MODRM }, 0 },
3520 },
3521
3522 /* PREFIX_0FA7_REG_6 */
3523 {
3524 { Bad_Opcode },
3525 { "sm4", { Skip_MODRM }, 0 },
3526 },
3527
3528 /* PREFIX_0FAE_REG_0_MOD_3 */
3529 {
3530 { Bad_Opcode },
3531 { "rdfsbase", { Ev }, 0 },
3532 },
3533
3534 /* PREFIX_0FAE_REG_1_MOD_3 */
3535 {
3536 { Bad_Opcode },
3537 { "rdgsbase", { Ev }, 0 },
3538 },
3539
3540 /* PREFIX_0FAE_REG_2_MOD_3 */
3541 {
3542 { Bad_Opcode },
3543 { "wrfsbase", { Ev }, 0 },
3544 },
3545
3546 /* PREFIX_0FAE_REG_3_MOD_3 */
3547 {
3548 { Bad_Opcode },
3549 { "wrgsbase", { Ev }, 0 },
3550 },
3551
3552 /* PREFIX_0FAE_REG_4_MOD_0 */
3553 {
3554 { "xsave", { FXSAVE }, PREFIX_REX2_ILLEGAL },
3555 { "ptwrite{%LQ|}", { Edq }, 0 },
3556 },
3557
3558 /* PREFIX_0FAE_REG_4_MOD_3 */
3559 {
3560 { Bad_Opcode },
3561 { "ptwrite{%LQ|}", { Edq }, 0 },
3562 },
3563
3564 /* PREFIX_0FAE_REG_5_MOD_3 */
3565 {
3566 { "lfence", { Skip_MODRM }, 0 },
3567 { "incsspK", { Edq }, PREFIX_OPCODE },
3568 },
3569
3570 /* PREFIX_0FAE_REG_6_MOD_0 */
3571 {
3572 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL },
3573 { "clrssbsy", { Mq }, PREFIX_OPCODE },
3574 { "clwb", { Mb }, PREFIX_OPCODE },
3575 },
3576
3577 /* PREFIX_0FAE_REG_6_MOD_3 */
3578 {
3579 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
3580 { "umonitor", { Eva }, PREFIX_OPCODE },
3581 { "tpause", { Edq }, PREFIX_OPCODE },
3582 { "umwait", { Edq }, PREFIX_OPCODE },
3583 },
3584
3585 /* PREFIX_0FAE_REG_7_MOD_0 */
3586 {
3587 { "clflush", { Mb }, 0 },
3588 { Bad_Opcode },
3589 { "clflushopt", { Mb }, 0 },
3590 },
3591
3592 /* PREFIX_0FB8 */
3593 {
3594 { Bad_Opcode },
3595 { "popcntS", { Gv, Ev }, 0 },
3596 },
3597
3598 /* PREFIX_0FBC */
3599 {
3600 { "bsfS", { Gv, Ev }, 0 },
3601 { "tzcntS", { Gv, Ev }, 0 },
3602 { "bsfS", { Gv, Ev }, 0 },
3603 },
3604
3605 /* PREFIX_0FBD */
3606 {
3607 { "bsrS", { Gv, Ev }, 0 },
3608 { "lzcntS", { Gv, Ev }, 0 },
3609 { "bsrS", { Gv, Ev }, 0 },
3610 },
3611
3612 /* PREFIX_0FC2 */
3613 {
3614 { "VcmppX", { XM, Vex, EXx, CMP }, 0 },
3615 { "Vcmpss", { XMScalar, VexScalar, EXd, CMP }, 0 },
3616 { "VcmppX", { XM, Vex, EXx, CMP }, 0 },
3617 { "Vcmpsd", { XMScalar, VexScalar, EXq, CMP }, 0 },
3618 },
3619
3620 /* PREFIX_0FC7_REG_6_MOD_0 */
3621 {
3622 { "vmptrld",{ Mq }, 0 },
3623 { "vmxon", { Mq }, 0 },
3624 { "vmclear",{ Mq }, 0 },
3625 },
3626
3627 /* PREFIX_0FC7_REG_6_MOD_3 */
3628 {
3629 { "rdrand", { Ev }, 0 },
3630 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1) },
3631 { "rdrand", { Ev }, 0 }
3632 },
3633
3634 /* PREFIX_0FC7_REG_7_MOD_3 */
3635 {
3636 { "rdseed", { Ev }, 0 },
3637 { "rdpid", { Em }, 0 },
3638 { "rdseed", { Ev }, 0 },
3639 },
3640
3641 /* PREFIX_0FD0 */
3642 {
3643 { Bad_Opcode },
3644 { Bad_Opcode },
3645 { "VaddsubpX", { XM, Vex, EXx }, 0 },
3646 { "VaddsubpX", { XM, Vex, EXx }, 0 },
3647 },
3648
3649 /* PREFIX_0FD6 */
3650 {
3651 { Bad_Opcode },
3652 { "movq2dq",{ XM, Nq }, 0 },
3653 { "movq", { EXqS, XM }, 0 },
3654 { "movdq2q",{ MX, Ux }, 0 },
3655 },
3656
3657 /* PREFIX_0FE6 */
3658 {
3659 { Bad_Opcode },
3660 { "Vcvtdq2pd", { XM, EXxmmq }, 0 },
3661 { "Vcvttpd2dq%XY", { XMM, EXx }, 0 },
3662 { "Vcvtpd2dq%XY", { XMM, EXx }, 0 },
3663 },
3664
3665 /* PREFIX_0FE7 */
3666 {
3667 { "movntq", { Mq, MX }, 0 },
3668 { Bad_Opcode },
3669 { "movntdq", { Mx, XM }, 0 },
3670 },
3671
3672 /* PREFIX_0FF0 */
3673 {
3674 { Bad_Opcode },
3675 { Bad_Opcode },
3676 { Bad_Opcode },
3677 { "Vlddqu", { XM, M }, 0 },
3678 },
3679
3680 /* PREFIX_0FF7 */
3681 {
3682 { "maskmovq", { MX, Nq }, PREFIX_OPCODE },
3683 { Bad_Opcode },
3684 { "maskmovdqu", { XM, Ux }, PREFIX_OPCODE },
3685 },
3686
3687 /* PREFIX_0F38D8 */
3688 {
3689 { Bad_Opcode },
3690 { REG_TABLE (REG_0F38D8_PREFIX_1) },
3691 },
3692
3693 /* PREFIX_0F38DC */
3694 {
3695 { Bad_Opcode },
3696 { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
3697 { "aesenc", { XM, EXx }, 0 },
3698 },
3699
3700 /* PREFIX_0F38DD */
3701 {
3702 { Bad_Opcode },
3703 { "aesdec128kl", { XM, M }, 0 },
3704 { "aesenclast", { XM, EXx }, 0 },
3705 },
3706
3707 /* PREFIX_0F38DE */
3708 {
3709 { Bad_Opcode },
3710 { "aesenc256kl", { XM, M }, 0 },
3711 { "aesdec", { XM, EXx }, 0 },
3712 },
3713
3714 /* PREFIX_0F38DF */
3715 {
3716 { Bad_Opcode },
3717 { "aesdec256kl", { XM, M }, 0 },
3718 { "aesdeclast", { XM, EXx }, 0 },
3719 },
3720
3721 /* PREFIX_0F38F0 */
3722 {
3723 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3724 { Bad_Opcode },
3725 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3726 { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
3727 },
3728
3729 /* PREFIX_0F38F1 */
3730 {
3731 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3732 { Bad_Opcode },
3733 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3734 { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
3735 },
3736
3737 /* PREFIX_0F38F6 */
3738 {
3739 { "wrssK", { M, Gdq }, 0 },
3740 { "adoxL", { VexGdq, Gdq, Edq }, 0 },
3741 { "adcxL", { VexGdq, Gdq, Edq }, 0 },
3742 { Bad_Opcode },
3743 },
3744
3745 /* PREFIX_0F38F8_M_0 */
3746 {
3747 { Bad_Opcode },
3748 { "enqcmds", { Gva, M }, 0 },
3749 { "movdir64b", { Gva, M }, 0 },
3750 { "enqcmd", { Gva, M }, 0 },
3751 },
3752
3753 /* PREFIX_0F38F8_M_1_X86_64 */
3754 {
3755 { Bad_Opcode },
3756 { "uwrmsr", { Gq, Rq }, 0 },
3757 { Bad_Opcode },
3758 { "urdmsr", { Rq, Gq }, 0 },
3759 },
3760
3761 /* PREFIX_0F38FA */
3762 {
3763 { Bad_Opcode },
3764 { "encodekey128", { Gd, Rd }, 0 },
3765 },
3766
3767 /* PREFIX_0F38FB */
3768 {
3769 { Bad_Opcode },
3770 { "encodekey256", { Gd, Rd }, 0 },
3771 },
3772
3773 /* PREFIX_0F38FC */
3774 {
3775 { "aadd", { Mdq, Gdq }, 0 },
3776 { "axor", { Mdq, Gdq }, 0 },
3777 { "aand", { Mdq, Gdq }, 0 },
3778 { "aor", { Mdq, Gdq }, 0 },
3779 },
3780
3781 /* PREFIX_0F3A0F */
3782 {
3783 { Bad_Opcode },
3784 { REG_TABLE (REG_0F3A0F_P_1) },
3785 },
3786
3787 /* PREFIX_VEX_0F12 */
3788 {
3789 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0) },
3790 { "%XEvmov%XSldup", { XM, EXEvexXNoBcst }, 0 },
3791 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2) },
3792 { "%XEvmov%XDdup", { XM, EXymmq }, 0 },
3793 },
3794
3795 /* PREFIX_VEX_0F16 */
3796 {
3797 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0) },
3798 { "%XEvmov%XShdup", { XM, EXEvexXNoBcst }, 0 },
3799 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2) },
3800 },
3801
3802 /* PREFIX_VEX_0F2A */
3803 {
3804 { Bad_Opcode },
3805 { "%XEvcvtsi2ssY{%LQ|}", { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
3806 { Bad_Opcode },
3807 { "%XEvcvtsi2sdY{%LQ|}", { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
3808 },
3809
3810 /* PREFIX_VEX_0F2C */
3811 {
3812 { Bad_Opcode },
3813 { "%XEvcvttss2si", { Gdq, EXd, EXxEVexS }, 0 },
3814 { Bad_Opcode },
3815 { "%XEvcvttsd2si", { Gdq, EXq, EXxEVexS }, 0 },
3816 },
3817
3818 /* PREFIX_VEX_0F2D */
3819 {
3820 { Bad_Opcode },
3821 { "%XEvcvtss2si", { Gdq, EXd, EXxEVexR }, 0 },
3822 { Bad_Opcode },
3823 { "%XEvcvtsd2si", { Gdq, EXq, EXxEVexR }, 0 },
3824 },
3825
3826 /* PREFIX_VEX_0F41_L_1_W_0 */
3827 {
3828 { "kandw", { MaskG, MaskVex, MaskR }, 0 },
3829 { Bad_Opcode },
3830 { "kandb", { MaskG, MaskVex, MaskR }, 0 },
3831 },
3832
3833 /* PREFIX_VEX_0F41_L_1_W_1 */
3834 {
3835 { "kandq", { MaskG, MaskVex, MaskR }, 0 },
3836 { Bad_Opcode },
3837 { "kandd", { MaskG, MaskVex, MaskR }, 0 },
3838 },
3839
3840 /* PREFIX_VEX_0F42_L_1_W_0 */
3841 {
3842 { "kandnw", { MaskG, MaskVex, MaskR }, 0 },
3843 { Bad_Opcode },
3844 { "kandnb", { MaskG, MaskVex, MaskR }, 0 },
3845 },
3846
3847 /* PREFIX_VEX_0F42_L_1_W_1 */
3848 {
3849 { "kandnq", { MaskG, MaskVex, MaskR }, 0 },
3850 { Bad_Opcode },
3851 { "kandnd", { MaskG, MaskVex, MaskR }, 0 },
3852 },
3853
3854 /* PREFIX_VEX_0F44_L_0_W_0 */
3855 {
3856 { "knotw", { MaskG, MaskR }, 0 },
3857 { Bad_Opcode },
3858 { "knotb", { MaskG, MaskR }, 0 },
3859 },
3860
3861 /* PREFIX_VEX_0F44_L_0_W_1 */
3862 {
3863 { "knotq", { MaskG, MaskR }, 0 },
3864 { Bad_Opcode },
3865 { "knotd", { MaskG, MaskR }, 0 },
3866 },
3867
3868 /* PREFIX_VEX_0F45_L_1_W_0 */
3869 {
3870 { "korw", { MaskG, MaskVex, MaskR }, 0 },
3871 { Bad_Opcode },
3872 { "korb", { MaskG, MaskVex, MaskR }, 0 },
3873 },
3874
3875 /* PREFIX_VEX_0F45_L_1_W_1 */
3876 {
3877 { "korq", { MaskG, MaskVex, MaskR }, 0 },
3878 { Bad_Opcode },
3879 { "kord", { MaskG, MaskVex, MaskR }, 0 },
3880 },
3881
3882 /* PREFIX_VEX_0F46_L_1_W_0 */
3883 {
3884 { "kxnorw", { MaskG, MaskVex, MaskR }, 0 },
3885 { Bad_Opcode },
3886 { "kxnorb", { MaskG, MaskVex, MaskR }, 0 },
3887 },
3888
3889 /* PREFIX_VEX_0F46_L_1_W_1 */
3890 {
3891 { "kxnorq", { MaskG, MaskVex, MaskR }, 0 },
3892 { Bad_Opcode },
3893 { "kxnord", { MaskG, MaskVex, MaskR }, 0 },
3894 },
3895
3896 /* PREFIX_VEX_0F47_L_1_W_0 */
3897 {
3898 { "kxorw", { MaskG, MaskVex, MaskR }, 0 },
3899 { Bad_Opcode },
3900 { "kxorb", { MaskG, MaskVex, MaskR }, 0 },
3901 },
3902
3903 /* PREFIX_VEX_0F47_L_1_W_1 */
3904 {
3905 { "kxorq", { MaskG, MaskVex, MaskR }, 0 },
3906 { Bad_Opcode },
3907 { "kxord", { MaskG, MaskVex, MaskR }, 0 },
3908 },
3909
3910 /* PREFIX_VEX_0F4A_L_1_W_0 */
3911 {
3912 { "kaddw", { MaskG, MaskVex, MaskR }, 0 },
3913 { Bad_Opcode },
3914 { "kaddb", { MaskG, MaskVex, MaskR }, 0 },
3915 },
3916
3917 /* PREFIX_VEX_0F4A_L_1_W_1 */
3918 {
3919 { "kaddq", { MaskG, MaskVex, MaskR }, 0 },
3920 { Bad_Opcode },
3921 { "kaddd", { MaskG, MaskVex, MaskR }, 0 },
3922 },
3923
3924 /* PREFIX_VEX_0F4B_L_1_W_0 */
3925 {
3926 { "kunpckwd", { MaskG, MaskVex, MaskR }, 0 },
3927 { Bad_Opcode },
3928 { "kunpckbw", { MaskG, MaskVex, MaskR }, 0 },
3929 },
3930
3931 /* PREFIX_VEX_0F4B_L_1_W_1 */
3932 {
3933 { "kunpckdq", { MaskG, MaskVex, MaskR }, 0 },
3934 },
3935
3936 /* PREFIX_VEX_0F6F */
3937 {
3938 { Bad_Opcode },
3939 { "vmovdqu", { XM, EXx }, 0 },
3940 { "vmovdqa", { XM, EXx }, 0 },
3941 },
3942
3943 /* PREFIX_VEX_0F70 */
3944 {
3945 { Bad_Opcode },
3946 { "vpshufhw", { XM, EXx, Ib }, 0 },
3947 { "vpshufd", { XM, EXx, Ib }, 0 },
3948 { "vpshuflw", { XM, EXx, Ib }, 0 },
3949 },
3950
3951 /* PREFIX_VEX_0F7E */
3952 {
3953 { Bad_Opcode },
3954 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
3955 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
3956 },
3957
3958 /* PREFIX_VEX_0F7F */
3959 {
3960 { Bad_Opcode },
3961 { "vmovdqu", { EXxS, XM }, 0 },
3962 { "vmovdqa", { EXxS, XM }, 0 },
3963 },
3964
3965 /* PREFIX_VEX_0F90_L_0_W_0 */
3966 {
3967 { "%XEkmovw", { MaskG, MaskE }, 0 },
3968 { Bad_Opcode },
3969 { "%XEkmovb", { MaskG, MaskBDE }, 0 },
3970 },
3971
3972 /* PREFIX_VEX_0F90_L_0_W_1 */
3973 {
3974 { "%XEkmovq", { MaskG, MaskE }, 0 },
3975 { Bad_Opcode },
3976 { "%XEkmovd", { MaskG, MaskBDE }, 0 },
3977 },
3978
3979 /* PREFIX_VEX_0F91_L_0_W_0 */
3980 {
3981 { "%XEkmovw", { Mw, MaskG }, 0 },
3982 { Bad_Opcode },
3983 { "%XEkmovb", { Mb, MaskG }, 0 },
3984 },
3985
3986 /* PREFIX_VEX_0F91_L_0_W_1 */
3987 {
3988 { "%XEkmovq", { Mq, MaskG }, 0 },
3989 { Bad_Opcode },
3990 { "%XEkmovd", { Md, MaskG }, 0 },
3991 },
3992
3993 /* PREFIX_VEX_0F92_L_0_W_0 */
3994 {
3995 { "%XEkmovw", { MaskG, Rdq }, 0 },
3996 { Bad_Opcode },
3997 { "%XEkmovb", { MaskG, Rdq }, 0 },
3998 { "%XEkmovd", { MaskG, Rdq }, 0 },
3999 },
4000
4001 /* PREFIX_VEX_0F92_L_0_W_1 */
4002 {
4003 { Bad_Opcode },
4004 { Bad_Opcode },
4005 { Bad_Opcode },
4006 { "%XEkmovK", { MaskG, Rdq }, 0 },
4007 },
4008
4009 /* PREFIX_VEX_0F93_L_0_W_0 */
4010 {
4011 { "%XEkmovw", { Gdq, MaskR }, 0 },
4012 { Bad_Opcode },
4013 { "%XEkmovb", { Gdq, MaskR }, 0 },
4014 { "%XEkmovd", { Gdq, MaskR }, 0 },
4015 },
4016
4017 /* PREFIX_VEX_0F93_L_0_W_1 */
4018 {
4019 { Bad_Opcode },
4020 { Bad_Opcode },
4021 { Bad_Opcode },
4022 { "%XEkmovK", { Gdq, MaskR }, 0 },
4023 },
4024
4025 /* PREFIX_VEX_0F98_L_0_W_0 */
4026 {
4027 { "kortestw", { MaskG, MaskR }, 0 },
4028 { Bad_Opcode },
4029 { "kortestb", { MaskG, MaskR }, 0 },
4030 },
4031
4032 /* PREFIX_VEX_0F98_L_0_W_1 */
4033 {
4034 { "kortestq", { MaskG, MaskR }, 0 },
4035 { Bad_Opcode },
4036 { "kortestd", { MaskG, MaskR }, 0 },
4037 },
4038
4039 /* PREFIX_VEX_0F99_L_0_W_0 */
4040 {
4041 { "ktestw", { MaskG, MaskR }, 0 },
4042 { Bad_Opcode },
4043 { "ktestb", { MaskG, MaskR }, 0 },
4044 },
4045
4046 /* PREFIX_VEX_0F99_L_0_W_1 */
4047 {
4048 { "ktestq", { MaskG, MaskR }, 0 },
4049 { Bad_Opcode },
4050 { "ktestd", { MaskG, MaskR }, 0 },
4051 },
4052
4053 /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0 */
4054 {
4055 { "ldtilecfg", { M }, 0 },
4056 { Bad_Opcode },
4057 { "sttilecfg", { M }, 0 },
4058 },
4059
4060 /* PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1 */
4061 {
4062 { REG_TABLE (REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0) },
4063 { Bad_Opcode },
4064 { Bad_Opcode },
4065 { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3) },
4066 },
4067
4068 /* PREFIX_VEX_0F384B_X86_64_L_0_W_0 */
4069 {
4070 { Bad_Opcode },
4071 { "tilestored", { MVexSIBMEM, TMM }, 0 },
4072 { "tileloaddt1", { TMM, MVexSIBMEM }, 0 },
4073 { "tileloadd", { TMM, MVexSIBMEM }, 0 },
4074 },
4075
4076 /* PREFIX_VEX_0F3850_W_0 */
4077 {
4078 { "%XEvpdpbuud", { XM, Vex, EXx }, 0 },
4079 { "%XEvpdpbsud", { XM, Vex, EXx }, 0 },
4080 { "%XVvpdpbusd", { XM, Vex, EXx }, 0 },
4081 { "%XEvpdpbssd", { XM, Vex, EXx }, 0 },
4082 },
4083
4084 /* PREFIX_VEX_0F3851_W_0 */
4085 {
4086 { "%XEvpdpbuuds", { XM, Vex, EXx }, 0 },
4087 { "%XEvpdpbsuds", { XM, Vex, EXx }, 0 },
4088 { "%XVvpdpbusds", { XM, Vex, EXx }, 0 },
4089 { "%XEvpdpbssds", { XM, Vex, EXx }, 0 },
4090 },
4091 /* PREFIX_VEX_0F385C_X86_64_L_0_W_0 */
4092 {
4093 { Bad_Opcode },
4094 { "tdpbf16ps", { TMM, Rtmm, VexTmm }, 0 },
4095 { Bad_Opcode },
4096 { "tdpfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4097 },
4098
4099 /* PREFIX_VEX_0F385E_X86_64_L_0_W_0 */
4100 {
4101 { "tdpbuud", {TMM, Rtmm, VexTmm }, 0 },
4102 { "tdpbsud", {TMM, Rtmm, VexTmm }, 0 },
4103 { "tdpbusd", {TMM, Rtmm, VexTmm }, 0 },
4104 { "tdpbssd", {TMM, Rtmm, VexTmm }, 0 },
4105 },
4106
4107 /* PREFIX_VEX_0F386C_X86_64_L_0_W_0 */
4108 {
4109 { "tcmmrlfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4110 { Bad_Opcode },
4111 { "tcmmimfp16ps", { TMM, Rtmm, VexTmm }, 0 },
4112 },
4113
4114 /* PREFIX_VEX_0F3872 */
4115 {
4116 { Bad_Opcode },
4117 { VEX_W_TABLE (VEX_W_0F3872_P_1) },
4118 },
4119
4120 /* PREFIX_VEX_0F38B0_W_0 */
4121 {
4122 { "vcvtneoph2ps", { XM, Mx }, 0 },
4123 { "vcvtneebf162ps", { XM, Mx }, 0 },
4124 { "vcvtneeph2ps", { XM, Mx }, 0 },
4125 { "vcvtneobf162ps", { XM, Mx }, 0 },
4126 },
4127
4128 /* PREFIX_VEX_0F38B1_W_0 */
4129 {
4130 { Bad_Opcode },
4131 { "vbcstnebf162ps", { XM, Mw }, 0 },
4132 { "vbcstnesh2ps", { XM, Mw }, 0 },
4133 },
4134
4135 /* PREFIX_VEX_0F38D2_W_0 */
4136 {
4137 { "%XEvpdpwuud", { XM, Vex, EXx }, 0 },
4138 { "%XEvpdpwsud", { XM, Vex, EXx }, 0 },
4139 { "%XEvpdpwusd", { XM, Vex, EXx }, 0 },
4140 },
4141
4142 /* PREFIX_VEX_0F38D3_W_0 */
4143 {
4144 { "%XEvpdpwuuds", { XM, Vex, EXx }, 0 },
4145 { "%XEvpdpwsuds", { XM, Vex, EXx }, 0 },
4146 { "%XEvpdpwusds", { XM, Vex, EXx }, 0 },
4147 },
4148
4149 /* PREFIX_VEX_0F38CB */
4150 {
4151 { Bad_Opcode },
4152 { Bad_Opcode },
4153 { Bad_Opcode },
4154 { VEX_W_TABLE (VEX_W_0F38CB_P_3) },
4155 },
4156
4157 /* PREFIX_VEX_0F38CC */
4158 {
4159 { Bad_Opcode },
4160 { Bad_Opcode },
4161 { Bad_Opcode },
4162 { VEX_W_TABLE (VEX_W_0F38CC_P_3) },
4163 },
4164
4165 /* PREFIX_VEX_0F38CD */
4166 {
4167 { Bad_Opcode },
4168 { Bad_Opcode },
4169 { Bad_Opcode },
4170 { VEX_W_TABLE (VEX_W_0F38CD_P_3) },
4171 },
4172
4173 /* PREFIX_VEX_0F38DA_W_0 */
4174 {
4175 { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_0) },
4176 { "%XEvsm4key4", { XM, Vex, EXx }, 0 },
4177 { VEX_LEN_TABLE (VEX_LEN_0F38DA_W_0_P_2) },
4178 { "%XEvsm4rnds4", { XM, Vex, EXx }, 0 },
4179 },
4180
4181 /* PREFIX_VEX_0F38F2_L_0 */
4182 {
4183 { "%NFandnS", { Gdq, VexGdq, Edq }, 0 },
4184 },
4185
4186 /* PREFIX_VEX_0F38F3_L_0 */
4187 {
4188 { REG_TABLE (REG_VEX_0F38F3_L_0_P_0) },
4189 },
4190
4191 /* PREFIX_VEX_0F38F5_L_0 */
4192 {
4193 { "%NFbzhiS", { Gdq, Edq, VexGdq }, 0 },
4194 { "%XEpextS", { Gdq, VexGdq, Edq }, 0 },
4195 { Bad_Opcode },
4196 { "%XEpdepS", { Gdq, VexGdq, Edq }, 0 },
4197 },
4198
4199 /* PREFIX_VEX_0F38F6_L_0 */
4200 {
4201 { Bad_Opcode },
4202 { Bad_Opcode },
4203 { Bad_Opcode },
4204 { "%XEmulxS", { Gdq, VexGdq, Edq }, 0 },
4205 },
4206
4207 /* PREFIX_VEX_0F38F7_L_0 */
4208 {
4209 { "%NFbextrS", { Gdq, Edq, VexGdq }, 0 },
4210 { "%XEsarxS", { Gdq, Edq, VexGdq }, 0 },
4211 { "%XEshlxS", { Gdq, Edq, VexGdq }, 0 },
4212 { "%XEshrxS", { Gdq, Edq, VexGdq }, 0 },
4213 },
4214
4215 /* PREFIX_VEX_0F3AF0_L_0 */
4216 {
4217 { Bad_Opcode },
4218 { Bad_Opcode },
4219 { Bad_Opcode },
4220 { "%XErorxS", { Gdq, Edq, Ib }, 0 },
4221 },
4222
4223 /* PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64 */
4224 {
4225 { Bad_Opcode },
4226 { "wrmsrns", { Skip_MODRM, Id, Rq }, 0 },
4227 { Bad_Opcode },
4228 { "rdmsr", { Rq, Id }, 0 },
4229 },
4230
4231 /* PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64 */
4232 {
4233 { Bad_Opcode },
4234 { "uwrmsr", { Skip_MODRM, Id, Rq }, 0 },
4235 { Bad_Opcode },
4236 { "urdmsr", { Rq, Id }, 0 },
4237 },
4238
4239 #include "i386-dis-evex-prefix.h"
4240 };
4241
4242 static const struct dis386 x86_64_table[][2] = {
4243 /* X86_64_06 */
4244 {
4245 { "pushP", { es }, 0 },
4246 },
4247
4248 /* X86_64_07 */
4249 {
4250 { "popP", { es }, 0 },
4251 },
4252
4253 /* X86_64_0E */
4254 {
4255 { "pushP", { cs }, 0 },
4256 },
4257
4258 /* X86_64_16 */
4259 {
4260 { "pushP", { ss }, 0 },
4261 },
4262
4263 /* X86_64_17 */
4264 {
4265 { "popP", { ss }, 0 },
4266 },
4267
4268 /* X86_64_1E */
4269 {
4270 { "pushP", { ds }, 0 },
4271 },
4272
4273 /* X86_64_1F */
4274 {
4275 { "popP", { ds }, 0 },
4276 },
4277
4278 /* X86_64_27 */
4279 {
4280 { "daa", { XX }, 0 },
4281 },
4282
4283 /* X86_64_2F */
4284 {
4285 { "das", { XX }, 0 },
4286 },
4287
4288 /* X86_64_37 */
4289 {
4290 { "aaa", { XX }, 0 },
4291 },
4292
4293 /* X86_64_3F */
4294 {
4295 { "aas", { XX }, 0 },
4296 },
4297
4298 /* X86_64_60 */
4299 {
4300 { "pushaP", { XX }, 0 },
4301 },
4302
4303 /* X86_64_61 */
4304 {
4305 { "popaP", { XX }, 0 },
4306 },
4307
4308 /* X86_64_62 */
4309 {
4310 { MOD_TABLE (MOD_62_32BIT) },
4311 { EVEX_TABLE () },
4312 },
4313
4314 /* X86_64_63 */
4315 {
4316 { "arplS", { Sv, Gv }, 0 },
4317 { "movs", { Gv, { MOVSXD_Fixup, movsxd_mode } }, 0 },
4318 },
4319
4320 /* X86_64_6D */
4321 {
4322 { "ins{R|}", { Yzr, indirDX }, 0 },
4323 { "ins{G|}", { Yzr, indirDX }, 0 },
4324 },
4325
4326 /* X86_64_6F */
4327 {
4328 { "outs{R|}", { indirDXr, Xz }, 0 },
4329 { "outs{G|}", { indirDXr, Xz }, 0 },
4330 },
4331
4332 /* X86_64_82 */
4333 {
4334 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
4335 { REG_TABLE (REG_80) },
4336 },
4337
4338 /* X86_64_9A */
4339 {
4340 { "{l|}call{P|}", { Ap }, 0 },
4341 },
4342
4343 /* X86_64_C2 */
4344 {
4345 { "retP", { Iw, BND }, 0 },
4346 { "ret@", { Iw, BND }, 0 },
4347 },
4348
4349 /* X86_64_C3 */
4350 {
4351 { "retP", { BND }, 0 },
4352 { "ret@", { BND }, 0 },
4353 },
4354
4355 /* X86_64_C4 */
4356 {
4357 { MOD_TABLE (MOD_C4_32BIT) },
4358 { VEX_C4_TABLE () },
4359 },
4360
4361 /* X86_64_C5 */
4362 {
4363 { MOD_TABLE (MOD_C5_32BIT) },
4364 { VEX_C5_TABLE () },
4365 },
4366
4367 /* X86_64_CE */
4368 {
4369 { "into", { XX }, 0 },
4370 },
4371
4372 /* X86_64_D4 */
4373 {
4374 { "aam", { Ib }, 0 },
4375 },
4376
4377 /* X86_64_D5 */
4378 {
4379 { "aad", { Ib }, 0 },
4380 },
4381
4382 /* X86_64_E8 */
4383 {
4384 { "callP", { Jv, BND }, 0 },
4385 { "call@", { Jv, BND }, PREFIX_REX2_ILLEGAL }
4386 },
4387
4388 /* X86_64_E9 */
4389 {
4390 { "jmpP", { Jv, BND }, 0 },
4391 { "jmp@", { Jv, BND }, PREFIX_REX2_ILLEGAL }
4392 },
4393
4394 /* X86_64_EA */
4395 {
4396 { "{l|}jmp{P|}", { Ap }, 0 },
4397 },
4398
4399 /* X86_64_0F00_REG_6 */
4400 {
4401 { Bad_Opcode },
4402 { PREFIX_TABLE (PREFIX_0F00_REG_6_X86_64) },
4403 },
4404
4405 /* X86_64_0F01_REG_0 */
4406 {
4407 { "sgdt{Q|Q}", { M }, 0 },
4408 { "sgdt", { M }, 0 },
4409 },
4410
4411 /* X86_64_0F01_REG_0_MOD_3_RM_6_P_1 */
4412 {
4413 { Bad_Opcode },
4414 { "wrmsrlist", { Skip_MODRM }, 0 },
4415 },
4416
4417 /* X86_64_0F01_REG_0_MOD_3_RM_6_P_3 */
4418 {
4419 { Bad_Opcode },
4420 { "rdmsrlist", { Skip_MODRM }, 0 },
4421 },
4422
4423 /* X86_64_0F01_REG_0_MOD_3_RM_7_P_0 */
4424 {
4425 { Bad_Opcode },
4426 { "pbndkb", { Skip_MODRM }, 0 },
4427 },
4428
4429 /* X86_64_0F01_REG_1 */
4430 {
4431 { "sidt{Q|Q}", { M }, 0 },
4432 { "sidt", { M }, 0 },
4433 },
4434
4435 /* X86_64_0F01_REG_1_RM_2_PREFIX_1 */
4436 {
4437 { Bad_Opcode },
4438 { "eretu", { Skip_MODRM }, 0 },
4439 },
4440
4441 /* X86_64_0F01_REG_1_RM_2_PREFIX_3 */
4442 {
4443 { Bad_Opcode },
4444 { "erets", { Skip_MODRM }, 0 },
4445 },
4446
4447 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4448 {
4449 { Bad_Opcode },
4450 { "seamret", { Skip_MODRM }, 0 },
4451 },
4452
4453 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4454 {
4455 { Bad_Opcode },
4456 { "seamops", { Skip_MODRM }, 0 },
4457 },
4458
4459 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4460 {
4461 { Bad_Opcode },
4462 { "seamcall", { Skip_MODRM }, 0 },
4463 },
4464
4465 /* X86_64_0F01_REG_2 */
4466 {
4467 { "lgdt{Q|Q}", { M }, 0 },
4468 { "lgdt", { M }, 0 },
4469 },
4470
4471 /* X86_64_0F01_REG_3 */
4472 {
4473 { "lidt{Q|Q}", { M }, 0 },
4474 { "lidt", { M }, 0 },
4475 },
4476
4477 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4478 {
4479 { Bad_Opcode },
4480 { "uiret", { Skip_MODRM }, 0 },
4481 },
4482
4483 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4484 {
4485 { Bad_Opcode },
4486 { "testui", { Skip_MODRM }, 0 },
4487 },
4488
4489 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4490 {
4491 { Bad_Opcode },
4492 { "clui", { Skip_MODRM }, 0 },
4493 },
4494
4495 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4496 {
4497 { Bad_Opcode },
4498 { "stui", { Skip_MODRM }, 0 },
4499 },
4500
4501 /* X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1 */
4502 {
4503 { Bad_Opcode },
4504 { "rmpquery", { Skip_MODRM }, 0 },
4505 },
4506
4507 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4508 {
4509 { Bad_Opcode },
4510 { "rmpadjust", { Skip_MODRM }, 0 },
4511 },
4512
4513 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4514 {
4515 { Bad_Opcode },
4516 { "rmpupdate", { Skip_MODRM }, 0 },
4517 },
4518
4519 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4520 {
4521 { Bad_Opcode },
4522 { "psmash", { Skip_MODRM }, 0 },
4523 },
4524
4525 /* X86_64_0F18_REG_6_MOD_0 */
4526 {
4527 { "nopQ", { Ev }, 0 },
4528 { PREFIX_TABLE (PREFIX_0F18_REG_6_MOD_0_X86_64) },
4529 },
4530
4531 /* X86_64_0F18_REG_7_MOD_0 */
4532 {
4533 { "nopQ", { Ev }, 0 },
4534 { PREFIX_TABLE (PREFIX_0F18_REG_7_MOD_0_X86_64) },
4535 },
4536
4537 {
4538 /* X86_64_0F24 */
4539 { "movZ", { Em, Td }, 0 },
4540 },
4541
4542 {
4543 /* X86_64_0F26 */
4544 { "movZ", { Td, Em }, 0 },
4545 },
4546
4547 {
4548 /* X86_64_0F38F8_M_1 */
4549 { Bad_Opcode },
4550 { PREFIX_TABLE (PREFIX_0F38F8_M_1_X86_64) },
4551 },
4552
4553 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4554 {
4555 { Bad_Opcode },
4556 { "senduipi", { Eq }, 0 },
4557 },
4558
4559 /* X86_64_VEX_0F3849 */
4560 {
4561 { Bad_Opcode },
4562 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64) },
4563 },
4564
4565 /* X86_64_VEX_0F384B */
4566 {
4567 { Bad_Opcode },
4568 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64) },
4569 },
4570
4571 /* X86_64_VEX_0F385C */
4572 {
4573 { Bad_Opcode },
4574 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64) },
4575 },
4576
4577 /* X86_64_VEX_0F385E */
4578 {
4579 { Bad_Opcode },
4580 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64) },
4581 },
4582
4583 /* X86_64_VEX_0F386C */
4584 {
4585 { Bad_Opcode },
4586 { VEX_LEN_TABLE (VEX_LEN_0F386C_X86_64) },
4587 },
4588
4589 /* X86_64_VEX_0F38Ex */
4590 {
4591 { Bad_Opcode },
4592 { "%XEcmp%CCxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4593 },
4594
4595 /* X86_64_VEX_MAP7_F6_L_0_W_0_R_0 */
4596 {
4597 { Bad_Opcode },
4598 { PREFIX_TABLE (PREFIX_VEX_MAP7_F6_L_0_W_0_R_0_X86_64) },
4599 },
4600
4601 /* X86_64_VEX_MAP7_F8_L_0_W_0_R_0 */
4602 {
4603 { Bad_Opcode },
4604 { PREFIX_TABLE (PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64) },
4605 },
4606 };
4607
4608 static const struct dis386 three_byte_table[][256] = {
4609
4610 /* THREE_BYTE_0F38 */
4611 {
4612 /* 00 */
4613 { "pshufb", { MX, EM }, PREFIX_OPCODE },
4614 { "phaddw", { MX, EM }, PREFIX_OPCODE },
4615 { "phaddd", { MX, EM }, PREFIX_OPCODE },
4616 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
4617 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
4618 { "phsubw", { MX, EM }, PREFIX_OPCODE },
4619 { "phsubd", { MX, EM }, PREFIX_OPCODE },
4620 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
4621 /* 08 */
4622 { "psignb", { MX, EM }, PREFIX_OPCODE },
4623 { "psignw", { MX, EM }, PREFIX_OPCODE },
4624 { "psignd", { MX, EM }, PREFIX_OPCODE },
4625 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
4626 { Bad_Opcode },
4627 { Bad_Opcode },
4628 { Bad_Opcode },
4629 { Bad_Opcode },
4630 /* 10 */
4631 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
4632 { Bad_Opcode },
4633 { Bad_Opcode },
4634 { Bad_Opcode },
4635 { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4636 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
4637 { Bad_Opcode },
4638 { "ptest", { XM, EXx }, PREFIX_DATA },
4639 /* 18 */
4640 { Bad_Opcode },
4641 { Bad_Opcode },
4642 { Bad_Opcode },
4643 { Bad_Opcode },
4644 { "pabsb", { MX, EM }, PREFIX_OPCODE },
4645 { "pabsw", { MX, EM }, PREFIX_OPCODE },
4646 { "pabsd", { MX, EM }, PREFIX_OPCODE },
4647 { Bad_Opcode },
4648 /* 20 */
4649 { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4650 { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4651 { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4652 { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4653 { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4654 { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
4655 { Bad_Opcode },
4656 { Bad_Opcode },
4657 /* 28 */
4658 { "pmuldq", { XM, EXx }, PREFIX_DATA },
4659 { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4660 { "movntdqa", { XM, Mx }, PREFIX_DATA },
4661 { "packusdw", { XM, EXx }, PREFIX_DATA },
4662 { Bad_Opcode },
4663 { Bad_Opcode },
4664 { Bad_Opcode },
4665 { Bad_Opcode },
4666 /* 30 */
4667 { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4668 { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4669 { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4670 { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4671 { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4672 { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4673 { Bad_Opcode },
4674 { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
4675 /* 38 */
4676 { "pminsb", { XM, EXx }, PREFIX_DATA },
4677 { "pminsd", { XM, EXx }, PREFIX_DATA },
4678 { "pminuw", { XM, EXx }, PREFIX_DATA },
4679 { "pminud", { XM, EXx }, PREFIX_DATA },
4680 { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4681 { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4682 { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4683 { "pmaxud", { XM, EXx }, PREFIX_DATA },
4684 /* 40 */
4685 { "pmulld", { XM, EXx }, PREFIX_DATA },
4686 { "phminposuw", { XM, EXx }, PREFIX_DATA },
4687 { Bad_Opcode },
4688 { Bad_Opcode },
4689 { Bad_Opcode },
4690 { Bad_Opcode },
4691 { Bad_Opcode },
4692 { Bad_Opcode },
4693 /* 48 */
4694 { Bad_Opcode },
4695 { Bad_Opcode },
4696 { Bad_Opcode },
4697 { Bad_Opcode },
4698 { Bad_Opcode },
4699 { Bad_Opcode },
4700 { Bad_Opcode },
4701 { Bad_Opcode },
4702 /* 50 */
4703 { Bad_Opcode },
4704 { Bad_Opcode },
4705 { Bad_Opcode },
4706 { Bad_Opcode },
4707 { Bad_Opcode },
4708 { Bad_Opcode },
4709 { Bad_Opcode },
4710 { Bad_Opcode },
4711 /* 58 */
4712 { Bad_Opcode },
4713 { Bad_Opcode },
4714 { Bad_Opcode },
4715 { Bad_Opcode },
4716 { Bad_Opcode },
4717 { Bad_Opcode },
4718 { Bad_Opcode },
4719 { Bad_Opcode },
4720 /* 60 */
4721 { Bad_Opcode },
4722 { Bad_Opcode },
4723 { Bad_Opcode },
4724 { Bad_Opcode },
4725 { Bad_Opcode },
4726 { Bad_Opcode },
4727 { Bad_Opcode },
4728 { Bad_Opcode },
4729 /* 68 */
4730 { Bad_Opcode },
4731 { Bad_Opcode },
4732 { Bad_Opcode },
4733 { Bad_Opcode },
4734 { Bad_Opcode },
4735 { Bad_Opcode },
4736 { Bad_Opcode },
4737 { Bad_Opcode },
4738 /* 70 */
4739 { Bad_Opcode },
4740 { Bad_Opcode },
4741 { Bad_Opcode },
4742 { Bad_Opcode },
4743 { Bad_Opcode },
4744 { Bad_Opcode },
4745 { Bad_Opcode },
4746 { Bad_Opcode },
4747 /* 78 */
4748 { Bad_Opcode },
4749 { Bad_Opcode },
4750 { Bad_Opcode },
4751 { Bad_Opcode },
4752 { Bad_Opcode },
4753 { Bad_Opcode },
4754 { Bad_Opcode },
4755 { Bad_Opcode },
4756 /* 80 */
4757 { "invept", { Gm, Mo }, PREFIX_DATA },
4758 { "invvpid", { Gm, Mo }, PREFIX_DATA },
4759 { "invpcid", { Gm, M }, PREFIX_DATA },
4760 { Bad_Opcode },
4761 { Bad_Opcode },
4762 { Bad_Opcode },
4763 { Bad_Opcode },
4764 { Bad_Opcode },
4765 /* 88 */
4766 { Bad_Opcode },
4767 { Bad_Opcode },
4768 { Bad_Opcode },
4769 { Bad_Opcode },
4770 { Bad_Opcode },
4771 { Bad_Opcode },
4772 { Bad_Opcode },
4773 { Bad_Opcode },
4774 /* 90 */
4775 { Bad_Opcode },
4776 { Bad_Opcode },
4777 { Bad_Opcode },
4778 { Bad_Opcode },
4779 { Bad_Opcode },
4780 { Bad_Opcode },
4781 { Bad_Opcode },
4782 { Bad_Opcode },
4783 /* 98 */
4784 { Bad_Opcode },
4785 { Bad_Opcode },
4786 { Bad_Opcode },
4787 { Bad_Opcode },
4788 { Bad_Opcode },
4789 { Bad_Opcode },
4790 { Bad_Opcode },
4791 { Bad_Opcode },
4792 /* a0 */
4793 { Bad_Opcode },
4794 { Bad_Opcode },
4795 { Bad_Opcode },
4796 { Bad_Opcode },
4797 { Bad_Opcode },
4798 { Bad_Opcode },
4799 { Bad_Opcode },
4800 { Bad_Opcode },
4801 /* a8 */
4802 { Bad_Opcode },
4803 { Bad_Opcode },
4804 { Bad_Opcode },
4805 { Bad_Opcode },
4806 { Bad_Opcode },
4807 { Bad_Opcode },
4808 { Bad_Opcode },
4809 { Bad_Opcode },
4810 /* b0 */
4811 { Bad_Opcode },
4812 { Bad_Opcode },
4813 { Bad_Opcode },
4814 { Bad_Opcode },
4815 { Bad_Opcode },
4816 { Bad_Opcode },
4817 { Bad_Opcode },
4818 { Bad_Opcode },
4819 /* b8 */
4820 { Bad_Opcode },
4821 { Bad_Opcode },
4822 { Bad_Opcode },
4823 { Bad_Opcode },
4824 { Bad_Opcode },
4825 { Bad_Opcode },
4826 { Bad_Opcode },
4827 { Bad_Opcode },
4828 /* c0 */
4829 { Bad_Opcode },
4830 { Bad_Opcode },
4831 { Bad_Opcode },
4832 { Bad_Opcode },
4833 { Bad_Opcode },
4834 { Bad_Opcode },
4835 { Bad_Opcode },
4836 { Bad_Opcode },
4837 /* c8 */
4838 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4839 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4840 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4841 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4842 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4843 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4844 { Bad_Opcode },
4845 { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
4846 /* d0 */
4847 { Bad_Opcode },
4848 { Bad_Opcode },
4849 { Bad_Opcode },
4850 { Bad_Opcode },
4851 { Bad_Opcode },
4852 { Bad_Opcode },
4853 { Bad_Opcode },
4854 { Bad_Opcode },
4855 /* d8 */
4856 { PREFIX_TABLE (PREFIX_0F38D8) },
4857 { Bad_Opcode },
4858 { Bad_Opcode },
4859 { "aesimc", { XM, EXx }, PREFIX_DATA },
4860 { PREFIX_TABLE (PREFIX_0F38DC) },
4861 { PREFIX_TABLE (PREFIX_0F38DD) },
4862 { PREFIX_TABLE (PREFIX_0F38DE) },
4863 { PREFIX_TABLE (PREFIX_0F38DF) },
4864 /* e0 */
4865 { Bad_Opcode },
4866 { Bad_Opcode },
4867 { Bad_Opcode },
4868 { Bad_Opcode },
4869 { Bad_Opcode },
4870 { Bad_Opcode },
4871 { Bad_Opcode },
4872 { Bad_Opcode },
4873 /* e8 */
4874 { Bad_Opcode },
4875 { Bad_Opcode },
4876 { Bad_Opcode },
4877 { Bad_Opcode },
4878 { Bad_Opcode },
4879 { Bad_Opcode },
4880 { Bad_Opcode },
4881 { Bad_Opcode },
4882 /* f0 */
4883 { PREFIX_TABLE (PREFIX_0F38F0) },
4884 { PREFIX_TABLE (PREFIX_0F38F1) },
4885 { Bad_Opcode },
4886 { Bad_Opcode },
4887 { Bad_Opcode },
4888 { "wrussK", { M, Gdq }, PREFIX_DATA },
4889 { PREFIX_TABLE (PREFIX_0F38F6) },
4890 { Bad_Opcode },
4891 /* f8 */
4892 { MOD_TABLE (MOD_0F38F8) },
4893 { "movdiri", { Mdq, Gdq }, PREFIX_OPCODE },
4894 { PREFIX_TABLE (PREFIX_0F38FA) },
4895 { PREFIX_TABLE (PREFIX_0F38FB) },
4896 { PREFIX_TABLE (PREFIX_0F38FC) },
4897 { Bad_Opcode },
4898 { Bad_Opcode },
4899 { Bad_Opcode },
4900 },
4901 /* THREE_BYTE_0F3A */
4902 {
4903 /* 00 */
4904 { Bad_Opcode },
4905 { Bad_Opcode },
4906 { Bad_Opcode },
4907 { Bad_Opcode },
4908 { Bad_Opcode },
4909 { Bad_Opcode },
4910 { Bad_Opcode },
4911 { Bad_Opcode },
4912 /* 08 */
4913 { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
4914 { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
4915 { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
4916 { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
4917 { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
4918 { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
4919 { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
4920 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
4921 /* 10 */
4922 { Bad_Opcode },
4923 { Bad_Opcode },
4924 { Bad_Opcode },
4925 { Bad_Opcode },
4926 { "pextrb", { Edb, XM, Ib }, PREFIX_DATA },
4927 { "pextrw", { Edw, XM, Ib }, PREFIX_DATA },
4928 { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
4929 { "extractps", { Ed, XM, Ib }, PREFIX_DATA },
4930 /* 18 */
4931 { Bad_Opcode },
4932 { Bad_Opcode },
4933 { Bad_Opcode },
4934 { Bad_Opcode },
4935 { Bad_Opcode },
4936 { Bad_Opcode },
4937 { Bad_Opcode },
4938 { Bad_Opcode },
4939 /* 20 */
4940 { "pinsrb", { XM, Edb, Ib }, PREFIX_DATA },
4941 { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
4942 { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
4943 { Bad_Opcode },
4944 { Bad_Opcode },
4945 { Bad_Opcode },
4946 { Bad_Opcode },
4947 { Bad_Opcode },
4948 /* 28 */
4949 { Bad_Opcode },
4950 { Bad_Opcode },
4951 { Bad_Opcode },
4952 { Bad_Opcode },
4953 { Bad_Opcode },
4954 { Bad_Opcode },
4955 { Bad_Opcode },
4956 { Bad_Opcode },
4957 /* 30 */
4958 { Bad_Opcode },
4959 { Bad_Opcode },
4960 { Bad_Opcode },
4961 { Bad_Opcode },
4962 { Bad_Opcode },
4963 { Bad_Opcode },
4964 { Bad_Opcode },
4965 { Bad_Opcode },
4966 /* 38 */
4967 { Bad_Opcode },
4968 { Bad_Opcode },
4969 { Bad_Opcode },
4970 { Bad_Opcode },
4971 { Bad_Opcode },
4972 { Bad_Opcode },
4973 { Bad_Opcode },
4974 { Bad_Opcode },
4975 /* 40 */
4976 { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
4977 { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
4978 { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
4979 { Bad_Opcode },
4980 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
4981 { Bad_Opcode },
4982 { Bad_Opcode },
4983 { Bad_Opcode },
4984 /* 48 */
4985 { Bad_Opcode },
4986 { Bad_Opcode },
4987 { Bad_Opcode },
4988 { Bad_Opcode },
4989 { Bad_Opcode },
4990 { Bad_Opcode },
4991 { Bad_Opcode },
4992 { Bad_Opcode },
4993 /* 50 */
4994 { Bad_Opcode },
4995 { Bad_Opcode },
4996 { Bad_Opcode },
4997 { Bad_Opcode },
4998 { Bad_Opcode },
4999 { Bad_Opcode },
5000 { Bad_Opcode },
5001 { Bad_Opcode },
5002 /* 58 */
5003 { Bad_Opcode },
5004 { Bad_Opcode },
5005 { Bad_Opcode },
5006 { Bad_Opcode },
5007 { Bad_Opcode },
5008 { Bad_Opcode },
5009 { Bad_Opcode },
5010 { Bad_Opcode },
5011 /* 60 */
5012 { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
5013 { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
5014 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
5015 { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
5016 { Bad_Opcode },
5017 { Bad_Opcode },
5018 { Bad_Opcode },
5019 { Bad_Opcode },
5020 /* 68 */
5021 { Bad_Opcode },
5022 { Bad_Opcode },
5023 { Bad_Opcode },
5024 { Bad_Opcode },
5025 { Bad_Opcode },
5026 { Bad_Opcode },
5027 { Bad_Opcode },
5028 { Bad_Opcode },
5029 /* 70 */
5030 { Bad_Opcode },
5031 { Bad_Opcode },
5032 { Bad_Opcode },
5033 { Bad_Opcode },
5034 { Bad_Opcode },
5035 { Bad_Opcode },
5036 { Bad_Opcode },
5037 { Bad_Opcode },
5038 /* 78 */
5039 { Bad_Opcode },
5040 { Bad_Opcode },
5041 { Bad_Opcode },
5042 { Bad_Opcode },
5043 { Bad_Opcode },
5044 { Bad_Opcode },
5045 { Bad_Opcode },
5046 { Bad_Opcode },
5047 /* 80 */
5048 { Bad_Opcode },
5049 { Bad_Opcode },
5050 { Bad_Opcode },
5051 { Bad_Opcode },
5052 { Bad_Opcode },
5053 { Bad_Opcode },
5054 { Bad_Opcode },
5055 { Bad_Opcode },
5056 /* 88 */
5057 { Bad_Opcode },
5058 { Bad_Opcode },
5059 { Bad_Opcode },
5060 { Bad_Opcode },
5061 { Bad_Opcode },
5062 { Bad_Opcode },
5063 { Bad_Opcode },
5064 { Bad_Opcode },
5065 /* 90 */
5066 { Bad_Opcode },
5067 { Bad_Opcode },
5068 { Bad_Opcode },
5069 { Bad_Opcode },
5070 { Bad_Opcode },
5071 { Bad_Opcode },
5072 { Bad_Opcode },
5073 { Bad_Opcode },
5074 /* 98 */
5075 { Bad_Opcode },
5076 { Bad_Opcode },
5077 { Bad_Opcode },
5078 { Bad_Opcode },
5079 { Bad_Opcode },
5080 { Bad_Opcode },
5081 { Bad_Opcode },
5082 { Bad_Opcode },
5083 /* a0 */
5084 { Bad_Opcode },
5085 { Bad_Opcode },
5086 { Bad_Opcode },
5087 { Bad_Opcode },
5088 { Bad_Opcode },
5089 { Bad_Opcode },
5090 { Bad_Opcode },
5091 { Bad_Opcode },
5092 /* a8 */
5093 { Bad_Opcode },
5094 { Bad_Opcode },
5095 { Bad_Opcode },
5096 { Bad_Opcode },
5097 { Bad_Opcode },
5098 { Bad_Opcode },
5099 { Bad_Opcode },
5100 { Bad_Opcode },
5101 /* b0 */
5102 { Bad_Opcode },
5103 { Bad_Opcode },
5104 { Bad_Opcode },
5105 { Bad_Opcode },
5106 { Bad_Opcode },
5107 { Bad_Opcode },
5108 { Bad_Opcode },
5109 { Bad_Opcode },
5110 /* b8 */
5111 { Bad_Opcode },
5112 { Bad_Opcode },
5113 { Bad_Opcode },
5114 { Bad_Opcode },
5115 { Bad_Opcode },
5116 { Bad_Opcode },
5117 { Bad_Opcode },
5118 { Bad_Opcode },
5119 /* c0 */
5120 { Bad_Opcode },
5121 { Bad_Opcode },
5122 { Bad_Opcode },
5123 { Bad_Opcode },
5124 { Bad_Opcode },
5125 { Bad_Opcode },
5126 { Bad_Opcode },
5127 { Bad_Opcode },
5128 /* c8 */
5129 { Bad_Opcode },
5130 { Bad_Opcode },
5131 { Bad_Opcode },
5132 { Bad_Opcode },
5133 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
5134 { Bad_Opcode },
5135 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5136 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5137 /* d0 */
5138 { Bad_Opcode },
5139 { Bad_Opcode },
5140 { Bad_Opcode },
5141 { Bad_Opcode },
5142 { Bad_Opcode },
5143 { Bad_Opcode },
5144 { Bad_Opcode },
5145 { Bad_Opcode },
5146 /* d8 */
5147 { Bad_Opcode },
5148 { Bad_Opcode },
5149 { Bad_Opcode },
5150 { Bad_Opcode },
5151 { Bad_Opcode },
5152 { Bad_Opcode },
5153 { Bad_Opcode },
5154 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
5155 /* e0 */
5156 { Bad_Opcode },
5157 { Bad_Opcode },
5158 { Bad_Opcode },
5159 { Bad_Opcode },
5160 { Bad_Opcode },
5161 { Bad_Opcode },
5162 { Bad_Opcode },
5163 { Bad_Opcode },
5164 /* e8 */
5165 { Bad_Opcode },
5166 { Bad_Opcode },
5167 { Bad_Opcode },
5168 { Bad_Opcode },
5169 { Bad_Opcode },
5170 { Bad_Opcode },
5171 { Bad_Opcode },
5172 { Bad_Opcode },
5173 /* f0 */
5174 { PREFIX_TABLE (PREFIX_0F3A0F) },
5175 { Bad_Opcode },
5176 { Bad_Opcode },
5177 { Bad_Opcode },
5178 { Bad_Opcode },
5179 { Bad_Opcode },
5180 { Bad_Opcode },
5181 { Bad_Opcode },
5182 /* f8 */
5183 { Bad_Opcode },
5184 { Bad_Opcode },
5185 { Bad_Opcode },
5186 { Bad_Opcode },
5187 { Bad_Opcode },
5188 { Bad_Opcode },
5189 { Bad_Opcode },
5190 { Bad_Opcode },
5191 },
5192 };
5193
5194 static const struct dis386 xop_table[][256] = {
5195 /* XOP_08 */
5196 {
5197 /* 00 */
5198 { Bad_Opcode },
5199 { Bad_Opcode },
5200 { Bad_Opcode },
5201 { Bad_Opcode },
5202 { Bad_Opcode },
5203 { Bad_Opcode },
5204 { Bad_Opcode },
5205 { Bad_Opcode },
5206 /* 08 */
5207 { Bad_Opcode },
5208 { Bad_Opcode },
5209 { Bad_Opcode },
5210 { Bad_Opcode },
5211 { Bad_Opcode },
5212 { Bad_Opcode },
5213 { Bad_Opcode },
5214 { Bad_Opcode },
5215 /* 10 */
5216 { Bad_Opcode },
5217 { Bad_Opcode },
5218 { Bad_Opcode },
5219 { Bad_Opcode },
5220 { Bad_Opcode },
5221 { Bad_Opcode },
5222 { Bad_Opcode },
5223 { Bad_Opcode },
5224 /* 18 */
5225 { Bad_Opcode },
5226 { Bad_Opcode },
5227 { Bad_Opcode },
5228 { Bad_Opcode },
5229 { Bad_Opcode },
5230 { Bad_Opcode },
5231 { Bad_Opcode },
5232 { Bad_Opcode },
5233 /* 20 */
5234 { Bad_Opcode },
5235 { Bad_Opcode },
5236 { Bad_Opcode },
5237 { Bad_Opcode },
5238 { Bad_Opcode },
5239 { Bad_Opcode },
5240 { Bad_Opcode },
5241 { Bad_Opcode },
5242 /* 28 */
5243 { Bad_Opcode },
5244 { Bad_Opcode },
5245 { Bad_Opcode },
5246 { Bad_Opcode },
5247 { Bad_Opcode },
5248 { Bad_Opcode },
5249 { Bad_Opcode },
5250 { Bad_Opcode },
5251 /* 30 */
5252 { Bad_Opcode },
5253 { Bad_Opcode },
5254 { Bad_Opcode },
5255 { Bad_Opcode },
5256 { Bad_Opcode },
5257 { Bad_Opcode },
5258 { Bad_Opcode },
5259 { Bad_Opcode },
5260 /* 38 */
5261 { Bad_Opcode },
5262 { Bad_Opcode },
5263 { Bad_Opcode },
5264 { Bad_Opcode },
5265 { Bad_Opcode },
5266 { Bad_Opcode },
5267 { Bad_Opcode },
5268 { Bad_Opcode },
5269 /* 40 */
5270 { Bad_Opcode },
5271 { Bad_Opcode },
5272 { Bad_Opcode },
5273 { Bad_Opcode },
5274 { Bad_Opcode },
5275 { Bad_Opcode },
5276 { Bad_Opcode },
5277 { Bad_Opcode },
5278 /* 48 */
5279 { Bad_Opcode },
5280 { Bad_Opcode },
5281 { Bad_Opcode },
5282 { Bad_Opcode },
5283 { Bad_Opcode },
5284 { Bad_Opcode },
5285 { Bad_Opcode },
5286 { Bad_Opcode },
5287 /* 50 */
5288 { Bad_Opcode },
5289 { Bad_Opcode },
5290 { Bad_Opcode },
5291 { Bad_Opcode },
5292 { Bad_Opcode },
5293 { Bad_Opcode },
5294 { Bad_Opcode },
5295 { Bad_Opcode },
5296 /* 58 */
5297 { Bad_Opcode },
5298 { Bad_Opcode },
5299 { Bad_Opcode },
5300 { Bad_Opcode },
5301 { Bad_Opcode },
5302 { Bad_Opcode },
5303 { Bad_Opcode },
5304 { Bad_Opcode },
5305 /* 60 */
5306 { Bad_Opcode },
5307 { Bad_Opcode },
5308 { Bad_Opcode },
5309 { Bad_Opcode },
5310 { Bad_Opcode },
5311 { Bad_Opcode },
5312 { Bad_Opcode },
5313 { Bad_Opcode },
5314 /* 68 */
5315 { Bad_Opcode },
5316 { Bad_Opcode },
5317 { Bad_Opcode },
5318 { Bad_Opcode },
5319 { Bad_Opcode },
5320 { Bad_Opcode },
5321 { Bad_Opcode },
5322 { Bad_Opcode },
5323 /* 70 */
5324 { Bad_Opcode },
5325 { Bad_Opcode },
5326 { Bad_Opcode },
5327 { Bad_Opcode },
5328 { Bad_Opcode },
5329 { Bad_Opcode },
5330 { Bad_Opcode },
5331 { Bad_Opcode },
5332 /* 78 */
5333 { Bad_Opcode },
5334 { Bad_Opcode },
5335 { Bad_Opcode },
5336 { Bad_Opcode },
5337 { Bad_Opcode },
5338 { Bad_Opcode },
5339 { Bad_Opcode },
5340 { Bad_Opcode },
5341 /* 80 */
5342 { Bad_Opcode },
5343 { Bad_Opcode },
5344 { Bad_Opcode },
5345 { Bad_Opcode },
5346 { Bad_Opcode },
5347 { VEX_LEN_TABLE (VEX_LEN_XOP_08_85) },
5348 { VEX_LEN_TABLE (VEX_LEN_XOP_08_86) },
5349 { VEX_LEN_TABLE (VEX_LEN_XOP_08_87) },
5350 /* 88 */
5351 { Bad_Opcode },
5352 { Bad_Opcode },
5353 { Bad_Opcode },
5354 { Bad_Opcode },
5355 { Bad_Opcode },
5356 { Bad_Opcode },
5357 { VEX_LEN_TABLE (VEX_LEN_XOP_08_8E) },
5358 { VEX_LEN_TABLE (VEX_LEN_XOP_08_8F) },
5359 /* 90 */
5360 { Bad_Opcode },
5361 { Bad_Opcode },
5362 { Bad_Opcode },
5363 { Bad_Opcode },
5364 { Bad_Opcode },
5365 { VEX_LEN_TABLE (VEX_LEN_XOP_08_95) },
5366 { VEX_LEN_TABLE (VEX_LEN_XOP_08_96) },
5367 { VEX_LEN_TABLE (VEX_LEN_XOP_08_97) },
5368 /* 98 */
5369 { Bad_Opcode },
5370 { Bad_Opcode },
5371 { Bad_Opcode },
5372 { Bad_Opcode },
5373 { Bad_Opcode },
5374 { Bad_Opcode },
5375 { VEX_LEN_TABLE (VEX_LEN_XOP_08_9E) },
5376 { VEX_LEN_TABLE (VEX_LEN_XOP_08_9F) },
5377 /* a0 */
5378 { Bad_Opcode },
5379 { Bad_Opcode },
5380 { "vpcmov", { XM, Vex, EXx, XMVexI4 }, 0 },
5381 { VEX_LEN_TABLE (VEX_LEN_XOP_08_A3) },
5382 { Bad_Opcode },
5383 { Bad_Opcode },
5384 { VEX_LEN_TABLE (VEX_LEN_XOP_08_A6) },
5385 { Bad_Opcode },
5386 /* a8 */
5387 { Bad_Opcode },
5388 { Bad_Opcode },
5389 { Bad_Opcode },
5390 { Bad_Opcode },
5391 { Bad_Opcode },
5392 { Bad_Opcode },
5393 { Bad_Opcode },
5394 { Bad_Opcode },
5395 /* b0 */
5396 { Bad_Opcode },
5397 { Bad_Opcode },
5398 { Bad_Opcode },
5399 { Bad_Opcode },
5400 { Bad_Opcode },
5401 { Bad_Opcode },
5402 { VEX_LEN_TABLE (VEX_LEN_XOP_08_B6) },
5403 { Bad_Opcode },
5404 /* b8 */
5405 { Bad_Opcode },
5406 { Bad_Opcode },
5407 { Bad_Opcode },
5408 { Bad_Opcode },
5409 { Bad_Opcode },
5410 { Bad_Opcode },
5411 { Bad_Opcode },
5412 { Bad_Opcode },
5413 /* c0 */
5414 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C0) },
5415 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C1) },
5416 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C2) },
5417 { VEX_LEN_TABLE (VEX_LEN_XOP_08_C3) },
5418 { Bad_Opcode },
5419 { Bad_Opcode },
5420 { Bad_Opcode },
5421 { Bad_Opcode },
5422 /* c8 */
5423 { Bad_Opcode },
5424 { Bad_Opcode },
5425 { Bad_Opcode },
5426 { Bad_Opcode },
5427 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CC) },
5428 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CD) },
5429 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CE) },
5430 { VEX_LEN_TABLE (VEX_LEN_XOP_08_CF) },
5431 /* d0 */
5432 { Bad_Opcode },
5433 { Bad_Opcode },
5434 { Bad_Opcode },
5435 { Bad_Opcode },
5436 { Bad_Opcode },
5437 { Bad_Opcode },
5438 { Bad_Opcode },
5439 { Bad_Opcode },
5440 /* d8 */
5441 { Bad_Opcode },
5442 { Bad_Opcode },
5443 { Bad_Opcode },
5444 { Bad_Opcode },
5445 { Bad_Opcode },
5446 { Bad_Opcode },
5447 { Bad_Opcode },
5448 { Bad_Opcode },
5449 /* e0 */
5450 { Bad_Opcode },
5451 { Bad_Opcode },
5452 { Bad_Opcode },
5453 { Bad_Opcode },
5454 { Bad_Opcode },
5455 { Bad_Opcode },
5456 { Bad_Opcode },
5457 { Bad_Opcode },
5458 /* e8 */
5459 { Bad_Opcode },
5460 { Bad_Opcode },
5461 { Bad_Opcode },
5462 { Bad_Opcode },
5463 { VEX_LEN_TABLE (VEX_LEN_XOP_08_EC) },
5464 { VEX_LEN_TABLE (VEX_LEN_XOP_08_ED) },
5465 { VEX_LEN_TABLE (VEX_LEN_XOP_08_EE) },
5466 { VEX_LEN_TABLE (VEX_LEN_XOP_08_EF) },
5467 /* f0 */
5468 { Bad_Opcode },
5469 { Bad_Opcode },
5470 { Bad_Opcode },
5471 { Bad_Opcode },
5472 { Bad_Opcode },
5473 { Bad_Opcode },
5474 { Bad_Opcode },
5475 { Bad_Opcode },
5476 /* f8 */
5477 { Bad_Opcode },
5478 { Bad_Opcode },
5479 { Bad_Opcode },
5480 { Bad_Opcode },
5481 { Bad_Opcode },
5482 { Bad_Opcode },
5483 { Bad_Opcode },
5484 { Bad_Opcode },
5485 },
5486 /* XOP_09 */
5487 {
5488 /* 00 */
5489 { Bad_Opcode },
5490 { VEX_LEN_TABLE (VEX_LEN_XOP_09_01) },
5491 { VEX_LEN_TABLE (VEX_LEN_XOP_09_02) },
5492 { Bad_Opcode },
5493 { Bad_Opcode },
5494 { Bad_Opcode },
5495 { Bad_Opcode },
5496 { Bad_Opcode },
5497 /* 08 */
5498 { Bad_Opcode },
5499 { Bad_Opcode },
5500 { Bad_Opcode },
5501 { Bad_Opcode },
5502 { Bad_Opcode },
5503 { Bad_Opcode },
5504 { Bad_Opcode },
5505 { Bad_Opcode },
5506 /* 10 */
5507 { Bad_Opcode },
5508 { Bad_Opcode },
5509 { VEX_LEN_TABLE (VEX_LEN_XOP_09_12) },
5510 { Bad_Opcode },
5511 { Bad_Opcode },
5512 { Bad_Opcode },
5513 { Bad_Opcode },
5514 { Bad_Opcode },
5515 /* 18 */
5516 { Bad_Opcode },
5517 { Bad_Opcode },
5518 { Bad_Opcode },
5519 { Bad_Opcode },
5520 { Bad_Opcode },
5521 { Bad_Opcode },
5522 { Bad_Opcode },
5523 { Bad_Opcode },
5524 /* 20 */
5525 { Bad_Opcode },
5526 { Bad_Opcode },
5527 { Bad_Opcode },
5528 { Bad_Opcode },
5529 { Bad_Opcode },
5530 { Bad_Opcode },
5531 { Bad_Opcode },
5532 { Bad_Opcode },
5533 /* 28 */
5534 { Bad_Opcode },
5535 { Bad_Opcode },
5536 { Bad_Opcode },
5537 { Bad_Opcode },
5538 { Bad_Opcode },
5539 { Bad_Opcode },
5540 { Bad_Opcode },
5541 { Bad_Opcode },
5542 /* 30 */
5543 { Bad_Opcode },
5544 { Bad_Opcode },
5545 { Bad_Opcode },
5546 { Bad_Opcode },
5547 { Bad_Opcode },
5548 { Bad_Opcode },
5549 { Bad_Opcode },
5550 { Bad_Opcode },
5551 /* 38 */
5552 { Bad_Opcode },
5553 { Bad_Opcode },
5554 { Bad_Opcode },
5555 { Bad_Opcode },
5556 { Bad_Opcode },
5557 { Bad_Opcode },
5558 { Bad_Opcode },
5559 { Bad_Opcode },
5560 /* 40 */
5561 { Bad_Opcode },
5562 { Bad_Opcode },
5563 { Bad_Opcode },
5564 { Bad_Opcode },
5565 { Bad_Opcode },
5566 { Bad_Opcode },
5567 { Bad_Opcode },
5568 { Bad_Opcode },
5569 /* 48 */
5570 { Bad_Opcode },
5571 { Bad_Opcode },
5572 { Bad_Opcode },
5573 { Bad_Opcode },
5574 { Bad_Opcode },
5575 { Bad_Opcode },
5576 { Bad_Opcode },
5577 { Bad_Opcode },
5578 /* 50 */
5579 { Bad_Opcode },
5580 { Bad_Opcode },
5581 { Bad_Opcode },
5582 { Bad_Opcode },
5583 { Bad_Opcode },
5584 { Bad_Opcode },
5585 { Bad_Opcode },
5586 { Bad_Opcode },
5587 /* 58 */
5588 { Bad_Opcode },
5589 { Bad_Opcode },
5590 { Bad_Opcode },
5591 { Bad_Opcode },
5592 { Bad_Opcode },
5593 { Bad_Opcode },
5594 { Bad_Opcode },
5595 { Bad_Opcode },
5596 /* 60 */
5597 { Bad_Opcode },
5598 { Bad_Opcode },
5599 { Bad_Opcode },
5600 { Bad_Opcode },
5601 { Bad_Opcode },
5602 { Bad_Opcode },
5603 { Bad_Opcode },
5604 { Bad_Opcode },
5605 /* 68 */
5606 { Bad_Opcode },
5607 { Bad_Opcode },
5608 { Bad_Opcode },
5609 { Bad_Opcode },
5610 { Bad_Opcode },
5611 { Bad_Opcode },
5612 { Bad_Opcode },
5613 { Bad_Opcode },
5614 /* 70 */
5615 { Bad_Opcode },
5616 { Bad_Opcode },
5617 { Bad_Opcode },
5618 { Bad_Opcode },
5619 { Bad_Opcode },
5620 { Bad_Opcode },
5621 { Bad_Opcode },
5622 { Bad_Opcode },
5623 /* 78 */
5624 { Bad_Opcode },
5625 { Bad_Opcode },
5626 { Bad_Opcode },
5627 { Bad_Opcode },
5628 { Bad_Opcode },
5629 { Bad_Opcode },
5630 { Bad_Opcode },
5631 { Bad_Opcode },
5632 /* 80 */
5633 { VEX_W_TABLE (VEX_W_XOP_09_80) },
5634 { VEX_W_TABLE (VEX_W_XOP_09_81) },
5635 { VEX_W_TABLE (VEX_W_XOP_09_82) },
5636 { VEX_W_TABLE (VEX_W_XOP_09_83) },
5637 { Bad_Opcode },
5638 { Bad_Opcode },
5639 { Bad_Opcode },
5640 { Bad_Opcode },
5641 /* 88 */
5642 { Bad_Opcode },
5643 { Bad_Opcode },
5644 { Bad_Opcode },
5645 { Bad_Opcode },
5646 { Bad_Opcode },
5647 { Bad_Opcode },
5648 { Bad_Opcode },
5649 { Bad_Opcode },
5650 /* 90 */
5651 { VEX_LEN_TABLE (VEX_LEN_XOP_09_90) },
5652 { VEX_LEN_TABLE (VEX_LEN_XOP_09_91) },
5653 { VEX_LEN_TABLE (VEX_LEN_XOP_09_92) },
5654 { VEX_LEN_TABLE (VEX_LEN_XOP_09_93) },
5655 { VEX_LEN_TABLE (VEX_LEN_XOP_09_94) },
5656 { VEX_LEN_TABLE (VEX_LEN_XOP_09_95) },
5657 { VEX_LEN_TABLE (VEX_LEN_XOP_09_96) },
5658 { VEX_LEN_TABLE (VEX_LEN_XOP_09_97) },
5659 /* 98 */
5660 { VEX_LEN_TABLE (VEX_LEN_XOP_09_98) },
5661 { VEX_LEN_TABLE (VEX_LEN_XOP_09_99) },
5662 { VEX_LEN_TABLE (VEX_LEN_XOP_09_9A) },
5663 { VEX_LEN_TABLE (VEX_LEN_XOP_09_9B) },
5664 { Bad_Opcode },
5665 { Bad_Opcode },
5666 { Bad_Opcode },
5667 { Bad_Opcode },
5668 /* a0 */
5669 { Bad_Opcode },
5670 { Bad_Opcode },
5671 { Bad_Opcode },
5672 { Bad_Opcode },
5673 { Bad_Opcode },
5674 { Bad_Opcode },
5675 { Bad_Opcode },
5676 { Bad_Opcode },
5677 /* a8 */
5678 { Bad_Opcode },
5679 { Bad_Opcode },
5680 { Bad_Opcode },
5681 { Bad_Opcode },
5682 { Bad_Opcode },
5683 { Bad_Opcode },
5684 { Bad_Opcode },
5685 { Bad_Opcode },
5686 /* b0 */
5687 { Bad_Opcode },
5688 { Bad_Opcode },
5689 { Bad_Opcode },
5690 { Bad_Opcode },
5691 { Bad_Opcode },
5692 { Bad_Opcode },
5693 { Bad_Opcode },
5694 { Bad_Opcode },
5695 /* b8 */
5696 { Bad_Opcode },
5697 { Bad_Opcode },
5698 { Bad_Opcode },
5699 { Bad_Opcode },
5700 { Bad_Opcode },
5701 { Bad_Opcode },
5702 { Bad_Opcode },
5703 { Bad_Opcode },
5704 /* c0 */
5705 { Bad_Opcode },
5706 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C1) },
5707 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C2) },
5708 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C3) },
5709 { Bad_Opcode },
5710 { Bad_Opcode },
5711 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C6) },
5712 { VEX_LEN_TABLE (VEX_LEN_XOP_09_C7) },
5713 /* c8 */
5714 { Bad_Opcode },
5715 { Bad_Opcode },
5716 { Bad_Opcode },
5717 { VEX_LEN_TABLE (VEX_LEN_XOP_09_CB) },
5718 { Bad_Opcode },
5719 { Bad_Opcode },
5720 { Bad_Opcode },
5721 { Bad_Opcode },
5722 /* d0 */
5723 { Bad_Opcode },
5724 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D1) },
5725 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D2) },
5726 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D3) },
5727 { Bad_Opcode },
5728 { Bad_Opcode },
5729 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D6) },
5730 { VEX_LEN_TABLE (VEX_LEN_XOP_09_D7) },
5731 /* d8 */
5732 { Bad_Opcode },
5733 { Bad_Opcode },
5734 { Bad_Opcode },
5735 { VEX_LEN_TABLE (VEX_LEN_XOP_09_DB) },
5736 { Bad_Opcode },
5737 { Bad_Opcode },
5738 { Bad_Opcode },
5739 { Bad_Opcode },
5740 /* e0 */
5741 { Bad_Opcode },
5742 { VEX_LEN_TABLE (VEX_LEN_XOP_09_E1) },
5743 { VEX_LEN_TABLE (VEX_LEN_XOP_09_E2) },
5744 { VEX_LEN_TABLE (VEX_LEN_XOP_09_E3) },
5745 { Bad_Opcode },
5746 { Bad_Opcode },
5747 { Bad_Opcode },
5748 { Bad_Opcode },
5749 /* e8 */
5750 { Bad_Opcode },
5751 { Bad_Opcode },
5752 { Bad_Opcode },
5753 { Bad_Opcode },
5754 { Bad_Opcode },
5755 { Bad_Opcode },
5756 { Bad_Opcode },
5757 { Bad_Opcode },
5758 /* f0 */
5759 { Bad_Opcode },
5760 { Bad_Opcode },
5761 { Bad_Opcode },
5762 { Bad_Opcode },
5763 { Bad_Opcode },
5764 { Bad_Opcode },
5765 { Bad_Opcode },
5766 { Bad_Opcode },
5767 /* f8 */
5768 { Bad_Opcode },
5769 { Bad_Opcode },
5770 { Bad_Opcode },
5771 { Bad_Opcode },
5772 { Bad_Opcode },
5773 { Bad_Opcode },
5774 { Bad_Opcode },
5775 { Bad_Opcode },
5776 },
5777 /* XOP_0A */
5778 {
5779 /* 00 */
5780 { Bad_Opcode },
5781 { Bad_Opcode },
5782 { Bad_Opcode },
5783 { Bad_Opcode },
5784 { Bad_Opcode },
5785 { Bad_Opcode },
5786 { Bad_Opcode },
5787 { Bad_Opcode },
5788 /* 08 */
5789 { Bad_Opcode },
5790 { Bad_Opcode },
5791 { Bad_Opcode },
5792 { Bad_Opcode },
5793 { Bad_Opcode },
5794 { Bad_Opcode },
5795 { Bad_Opcode },
5796 { Bad_Opcode },
5797 /* 10 */
5798 { "bextrS", { Gdq, Edq, Id }, 0 },
5799 { Bad_Opcode },
5800 { VEX_LEN_TABLE (VEX_LEN_XOP_0A_12) },
5801 { Bad_Opcode },
5802 { Bad_Opcode },
5803 { Bad_Opcode },
5804 { Bad_Opcode },
5805 { Bad_Opcode },
5806 /* 18 */
5807 { Bad_Opcode },
5808 { Bad_Opcode },
5809 { Bad_Opcode },
5810 { Bad_Opcode },
5811 { Bad_Opcode },
5812 { Bad_Opcode },
5813 { Bad_Opcode },
5814 { Bad_Opcode },
5815 /* 20 */
5816 { Bad_Opcode },
5817 { Bad_Opcode },
5818 { Bad_Opcode },
5819 { Bad_Opcode },
5820 { Bad_Opcode },
5821 { Bad_Opcode },
5822 { Bad_Opcode },
5823 { Bad_Opcode },
5824 /* 28 */
5825 { Bad_Opcode },
5826 { Bad_Opcode },
5827 { Bad_Opcode },
5828 { Bad_Opcode },
5829 { Bad_Opcode },
5830 { Bad_Opcode },
5831 { Bad_Opcode },
5832 { Bad_Opcode },
5833 /* 30 */
5834 { Bad_Opcode },
5835 { Bad_Opcode },
5836 { Bad_Opcode },
5837 { Bad_Opcode },
5838 { Bad_Opcode },
5839 { Bad_Opcode },
5840 { Bad_Opcode },
5841 { Bad_Opcode },
5842 /* 38 */
5843 { Bad_Opcode },
5844 { Bad_Opcode },
5845 { Bad_Opcode },
5846 { Bad_Opcode },
5847 { Bad_Opcode },
5848 { Bad_Opcode },
5849 { Bad_Opcode },
5850 { Bad_Opcode },
5851 /* 40 */
5852 { Bad_Opcode },
5853 { Bad_Opcode },
5854 { Bad_Opcode },
5855 { Bad_Opcode },
5856 { Bad_Opcode },
5857 { Bad_Opcode },
5858 { Bad_Opcode },
5859 { Bad_Opcode },
5860 /* 48 */
5861 { Bad_Opcode },
5862 { Bad_Opcode },
5863 { Bad_Opcode },
5864 { Bad_Opcode },
5865 { Bad_Opcode },
5866 { Bad_Opcode },
5867 { Bad_Opcode },
5868 { Bad_Opcode },
5869 /* 50 */
5870 { Bad_Opcode },
5871 { Bad_Opcode },
5872 { Bad_Opcode },
5873 { Bad_Opcode },
5874 { Bad_Opcode },
5875 { Bad_Opcode },
5876 { Bad_Opcode },
5877 { Bad_Opcode },
5878 /* 58 */
5879 { Bad_Opcode },
5880 { Bad_Opcode },
5881 { Bad_Opcode },
5882 { Bad_Opcode },
5883 { Bad_Opcode },
5884 { Bad_Opcode },
5885 { Bad_Opcode },
5886 { Bad_Opcode },
5887 /* 60 */
5888 { Bad_Opcode },
5889 { Bad_Opcode },
5890 { Bad_Opcode },
5891 { Bad_Opcode },
5892 { Bad_Opcode },
5893 { Bad_Opcode },
5894 { Bad_Opcode },
5895 { Bad_Opcode },
5896 /* 68 */
5897 { Bad_Opcode },
5898 { Bad_Opcode },
5899 { Bad_Opcode },
5900 { Bad_Opcode },
5901 { Bad_Opcode },
5902 { Bad_Opcode },
5903 { Bad_Opcode },
5904 { Bad_Opcode },
5905 /* 70 */
5906 { Bad_Opcode },
5907 { Bad_Opcode },
5908 { Bad_Opcode },
5909 { Bad_Opcode },
5910 { Bad_Opcode },
5911 { Bad_Opcode },
5912 { Bad_Opcode },
5913 { Bad_Opcode },
5914 /* 78 */
5915 { Bad_Opcode },
5916 { Bad_Opcode },
5917 { Bad_Opcode },
5918 { Bad_Opcode },
5919 { Bad_Opcode },
5920 { Bad_Opcode },
5921 { Bad_Opcode },
5922 { Bad_Opcode },
5923 /* 80 */
5924 { Bad_Opcode },
5925 { Bad_Opcode },
5926 { Bad_Opcode },
5927 { Bad_Opcode },
5928 { Bad_Opcode },
5929 { Bad_Opcode },
5930 { Bad_Opcode },
5931 { Bad_Opcode },
5932 /* 88 */
5933 { Bad_Opcode },
5934 { Bad_Opcode },
5935 { Bad_Opcode },
5936 { Bad_Opcode },
5937 { Bad_Opcode },
5938 { Bad_Opcode },
5939 { Bad_Opcode },
5940 { Bad_Opcode },
5941 /* 90 */
5942 { Bad_Opcode },
5943 { Bad_Opcode },
5944 { Bad_Opcode },
5945 { Bad_Opcode },
5946 { Bad_Opcode },
5947 { Bad_Opcode },
5948 { Bad_Opcode },
5949 { Bad_Opcode },
5950 /* 98 */
5951 { Bad_Opcode },
5952 { Bad_Opcode },
5953 { Bad_Opcode },
5954 { Bad_Opcode },
5955 { Bad_Opcode },
5956 { Bad_Opcode },
5957 { Bad_Opcode },
5958 { Bad_Opcode },
5959 /* a0 */
5960 { Bad_Opcode },
5961 { Bad_Opcode },
5962 { Bad_Opcode },
5963 { Bad_Opcode },
5964 { Bad_Opcode },
5965 { Bad_Opcode },
5966 { Bad_Opcode },
5967 { Bad_Opcode },
5968 /* a8 */
5969 { Bad_Opcode },
5970 { Bad_Opcode },
5971 { Bad_Opcode },
5972 { Bad_Opcode },
5973 { Bad_Opcode },
5974 { Bad_Opcode },
5975 { Bad_Opcode },
5976 { Bad_Opcode },
5977 /* b0 */
5978 { Bad_Opcode },
5979 { Bad_Opcode },
5980 { Bad_Opcode },
5981 { Bad_Opcode },
5982 { Bad_Opcode },
5983 { Bad_Opcode },
5984 { Bad_Opcode },
5985 { Bad_Opcode },
5986 /* b8 */
5987 { Bad_Opcode },
5988 { Bad_Opcode },
5989 { Bad_Opcode },
5990 { Bad_Opcode },
5991 { Bad_Opcode },
5992 { Bad_Opcode },
5993 { Bad_Opcode },
5994 { Bad_Opcode },
5995 /* c0 */
5996 { Bad_Opcode },
5997 { Bad_Opcode },
5998 { Bad_Opcode },
5999 { Bad_Opcode },
6000 { Bad_Opcode },
6001 { Bad_Opcode },
6002 { Bad_Opcode },
6003 { Bad_Opcode },
6004 /* c8 */
6005 { Bad_Opcode },
6006 { Bad_Opcode },
6007 { Bad_Opcode },
6008 { Bad_Opcode },
6009 { Bad_Opcode },
6010 { Bad_Opcode },
6011 { Bad_Opcode },
6012 { Bad_Opcode },
6013 /* d0 */
6014 { Bad_Opcode },
6015 { Bad_Opcode },
6016 { Bad_Opcode },
6017 { Bad_Opcode },
6018 { Bad_Opcode },
6019 { Bad_Opcode },
6020 { Bad_Opcode },
6021 { Bad_Opcode },
6022 /* d8 */
6023 { Bad_Opcode },
6024 { Bad_Opcode },
6025 { Bad_Opcode },
6026 { Bad_Opcode },
6027 { Bad_Opcode },
6028 { Bad_Opcode },
6029 { Bad_Opcode },
6030 { Bad_Opcode },
6031 /* e0 */
6032 { Bad_Opcode },
6033 { Bad_Opcode },
6034 { Bad_Opcode },
6035 { Bad_Opcode },
6036 { Bad_Opcode },
6037 { Bad_Opcode },
6038 { Bad_Opcode },
6039 { Bad_Opcode },
6040 /* e8 */
6041 { Bad_Opcode },
6042 { Bad_Opcode },
6043 { Bad_Opcode },
6044 { Bad_Opcode },
6045 { Bad_Opcode },
6046 { Bad_Opcode },
6047 { Bad_Opcode },
6048 { Bad_Opcode },
6049 /* f0 */
6050 { Bad_Opcode },
6051 { Bad_Opcode },
6052 { Bad_Opcode },
6053 { Bad_Opcode },
6054 { Bad_Opcode },
6055 { Bad_Opcode },
6056 { Bad_Opcode },
6057 { Bad_Opcode },
6058 /* f8 */
6059 { Bad_Opcode },
6060 { Bad_Opcode },
6061 { Bad_Opcode },
6062 { Bad_Opcode },
6063 { Bad_Opcode },
6064 { Bad_Opcode },
6065 { Bad_Opcode },
6066 { Bad_Opcode },
6067 },
6068 };
6069
6070 static const struct dis386 vex_table[][256] = {
6071 /* VEX_0F */
6072 {
6073 /* 00 */
6074 { Bad_Opcode },
6075 { Bad_Opcode },
6076 { Bad_Opcode },
6077 { Bad_Opcode },
6078 { Bad_Opcode },
6079 { Bad_Opcode },
6080 { Bad_Opcode },
6081 { Bad_Opcode },
6082 /* 08 */
6083 { Bad_Opcode },
6084 { Bad_Opcode },
6085 { Bad_Opcode },
6086 { Bad_Opcode },
6087 { Bad_Opcode },
6088 { Bad_Opcode },
6089 { Bad_Opcode },
6090 { Bad_Opcode },
6091 /* 10 */
6092 { PREFIX_TABLE (PREFIX_0F10) },
6093 { PREFIX_TABLE (PREFIX_0F11) },
6094 { PREFIX_TABLE (PREFIX_VEX_0F12) },
6095 { VEX_LEN_TABLE (VEX_LEN_0F13) },
6096 { "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6097 { "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6098 { PREFIX_TABLE (PREFIX_VEX_0F16) },
6099 { VEX_LEN_TABLE (VEX_LEN_0F17) },
6100 /* 18 */
6101 { Bad_Opcode },
6102 { Bad_Opcode },
6103 { Bad_Opcode },
6104 { Bad_Opcode },
6105 { Bad_Opcode },
6106 { Bad_Opcode },
6107 { Bad_Opcode },
6108 { Bad_Opcode },
6109 /* 20 */
6110 { Bad_Opcode },
6111 { Bad_Opcode },
6112 { Bad_Opcode },
6113 { Bad_Opcode },
6114 { Bad_Opcode },
6115 { Bad_Opcode },
6116 { Bad_Opcode },
6117 { Bad_Opcode },
6118 /* 28 */
6119 { "vmovapX", { XM, EXx }, PREFIX_OPCODE },
6120 { "vmovapX", { EXxS, XM }, PREFIX_OPCODE },
6121 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
6122 { "vmovntpX", { Mx, XM }, PREFIX_OPCODE },
6123 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
6124 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
6125 { PREFIX_TABLE (PREFIX_0F2E) },
6126 { PREFIX_TABLE (PREFIX_0F2F) },
6127 /* 30 */
6128 { Bad_Opcode },
6129 { Bad_Opcode },
6130 { Bad_Opcode },
6131 { Bad_Opcode },
6132 { Bad_Opcode },
6133 { Bad_Opcode },
6134 { Bad_Opcode },
6135 { Bad_Opcode },
6136 /* 38 */
6137 { Bad_Opcode },
6138 { Bad_Opcode },
6139 { Bad_Opcode },
6140 { Bad_Opcode },
6141 { Bad_Opcode },
6142 { Bad_Opcode },
6143 { Bad_Opcode },
6144 { Bad_Opcode },
6145 /* 40 */
6146 { Bad_Opcode },
6147 { VEX_LEN_TABLE (VEX_LEN_0F41) },
6148 { VEX_LEN_TABLE (VEX_LEN_0F42) },
6149 { Bad_Opcode },
6150 { VEX_LEN_TABLE (VEX_LEN_0F44) },
6151 { VEX_LEN_TABLE (VEX_LEN_0F45) },
6152 { VEX_LEN_TABLE (VEX_LEN_0F46) },
6153 { VEX_LEN_TABLE (VEX_LEN_0F47) },
6154 /* 48 */
6155 { Bad_Opcode },
6156 { Bad_Opcode },
6157 { VEX_LEN_TABLE (VEX_LEN_0F4A) },
6158 { VEX_LEN_TABLE (VEX_LEN_0F4B) },
6159 { Bad_Opcode },
6160 { Bad_Opcode },
6161 { Bad_Opcode },
6162 { Bad_Opcode },
6163 /* 50 */
6164 { "vmovmskpX", { Gdq, Ux }, PREFIX_OPCODE },
6165 { PREFIX_TABLE (PREFIX_0F51) },
6166 { PREFIX_TABLE (PREFIX_0F52) },
6167 { PREFIX_TABLE (PREFIX_0F53) },
6168 { "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6169 { "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6170 { "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6171 { "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6172 /* 58 */
6173 { PREFIX_TABLE (PREFIX_0F58) },
6174 { PREFIX_TABLE (PREFIX_0F59) },
6175 { PREFIX_TABLE (PREFIX_0F5A) },
6176 { PREFIX_TABLE (PREFIX_0F5B) },
6177 { PREFIX_TABLE (PREFIX_0F5C) },
6178 { PREFIX_TABLE (PREFIX_0F5D) },
6179 { PREFIX_TABLE (PREFIX_0F5E) },
6180 { PREFIX_TABLE (PREFIX_0F5F) },
6181 /* 60 */
6182 { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
6183 { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
6184 { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
6185 { "vpacksswb", { XM, Vex, EXx }, PREFIX_DATA },
6186 { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
6187 { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
6188 { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
6189 { "vpackuswb", { XM, Vex, EXx }, PREFIX_DATA },
6190 /* 68 */
6191 { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
6192 { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
6193 { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
6194 { "vpackssdw", { XM, Vex, EXx }, PREFIX_DATA },
6195 { "vpunpcklqdq", { XM, Vex, EXx }, PREFIX_DATA },
6196 { "vpunpckhqdq", { XM, Vex, EXx }, PREFIX_DATA },
6197 { VEX_LEN_TABLE (VEX_LEN_0F6E) },
6198 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
6199 /* 70 */
6200 { PREFIX_TABLE (PREFIX_VEX_0F70) },
6201 { REG_TABLE (REG_VEX_0F71) },
6202 { REG_TABLE (REG_VEX_0F72) },
6203 { REG_TABLE (REG_VEX_0F73) },
6204 { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
6205 { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
6206 { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
6207 { VEX_LEN_TABLE (VEX_LEN_0F77) },
6208 /* 78 */
6209 { Bad_Opcode },
6210 { Bad_Opcode },
6211 { Bad_Opcode },
6212 { Bad_Opcode },
6213 { PREFIX_TABLE (PREFIX_0F7C) },
6214 { PREFIX_TABLE (PREFIX_0F7D) },
6215 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
6216 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
6217 /* 80 */
6218 { Bad_Opcode },
6219 { Bad_Opcode },
6220 { Bad_Opcode },
6221 { Bad_Opcode },
6222 { Bad_Opcode },
6223 { Bad_Opcode },
6224 { Bad_Opcode },
6225 { Bad_Opcode },
6226 /* 88 */
6227 { Bad_Opcode },
6228 { Bad_Opcode },
6229 { Bad_Opcode },
6230 { Bad_Opcode },
6231 { Bad_Opcode },
6232 { Bad_Opcode },
6233 { Bad_Opcode },
6234 { Bad_Opcode },
6235 /* 90 */
6236 { VEX_LEN_TABLE (VEX_LEN_0F90) },
6237 { VEX_LEN_TABLE (VEX_LEN_0F91) },
6238 { VEX_LEN_TABLE (VEX_LEN_0F92) },
6239 { VEX_LEN_TABLE (VEX_LEN_0F93) },
6240 { Bad_Opcode },
6241 { Bad_Opcode },
6242 { Bad_Opcode },
6243 { Bad_Opcode },
6244 /* 98 */
6245 { VEX_LEN_TABLE (VEX_LEN_0F98) },
6246 { VEX_LEN_TABLE (VEX_LEN_0F99) },
6247 { Bad_Opcode },
6248 { Bad_Opcode },
6249 { Bad_Opcode },
6250 { Bad_Opcode },
6251 { Bad_Opcode },
6252 { Bad_Opcode },
6253 /* a0 */
6254 { Bad_Opcode },
6255 { Bad_Opcode },
6256 { Bad_Opcode },
6257 { Bad_Opcode },
6258 { Bad_Opcode },
6259 { Bad_Opcode },
6260 { Bad_Opcode },
6261 { Bad_Opcode },
6262 /* a8 */
6263 { Bad_Opcode },
6264 { Bad_Opcode },
6265 { Bad_Opcode },
6266 { Bad_Opcode },
6267 { Bad_Opcode },
6268 { Bad_Opcode },
6269 { REG_TABLE (REG_VEX_0FAE) },
6270 { Bad_Opcode },
6271 /* b0 */
6272 { Bad_Opcode },
6273 { Bad_Opcode },
6274 { Bad_Opcode },
6275 { Bad_Opcode },
6276 { Bad_Opcode },
6277 { Bad_Opcode },
6278 { Bad_Opcode },
6279 { Bad_Opcode },
6280 /* b8 */
6281 { Bad_Opcode },
6282 { Bad_Opcode },
6283 { Bad_Opcode },
6284 { Bad_Opcode },
6285 { Bad_Opcode },
6286 { Bad_Opcode },
6287 { Bad_Opcode },
6288 { Bad_Opcode },
6289 /* c0 */
6290 { Bad_Opcode },
6291 { Bad_Opcode },
6292 { PREFIX_TABLE (PREFIX_0FC2) },
6293 { Bad_Opcode },
6294 { VEX_LEN_TABLE (VEX_LEN_0FC4) },
6295 { "vpextrw", { Gd, Uxmm, Ib }, PREFIX_DATA },
6296 { "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
6297 { Bad_Opcode },
6298 /* c8 */
6299 { Bad_Opcode },
6300 { Bad_Opcode },
6301 { Bad_Opcode },
6302 { Bad_Opcode },
6303 { Bad_Opcode },
6304 { Bad_Opcode },
6305 { Bad_Opcode },
6306 { Bad_Opcode },
6307 /* d0 */
6308 { PREFIX_TABLE (PREFIX_0FD0) },
6309 { "vpsrlw", { XM, Vex, EXxmm }, PREFIX_DATA },
6310 { "vpsrld", { XM, Vex, EXxmm }, PREFIX_DATA },
6311 { "vpsrlq", { XM, Vex, EXxmm }, PREFIX_DATA },
6312 { "vpaddq", { XM, Vex, EXx }, PREFIX_DATA },
6313 { "vpmullw", { XM, Vex, EXx }, PREFIX_DATA },
6314 { VEX_LEN_TABLE (VEX_LEN_0FD6) },
6315 { "vpmovmskb", { Gdq, Ux }, PREFIX_DATA },
6316 /* d8 */
6317 { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
6318 { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
6319 { "vpminub", { XM, Vex, EXx }, PREFIX_DATA },
6320 { "vpand", { XM, Vex, EXx }, PREFIX_DATA },
6321 { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
6322 { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
6323 { "vpmaxub", { XM, Vex, EXx }, PREFIX_DATA },
6324 { "vpandn", { XM, Vex, EXx }, PREFIX_DATA },
6325 /* e0 */
6326 { "vpavgb", { XM, Vex, EXx }, PREFIX_DATA },
6327 { "vpsraw", { XM, Vex, EXxmm }, PREFIX_DATA },
6328 { "vpsrad", { XM, Vex, EXxmm }, PREFIX_DATA },
6329 { "vpavgw", { XM, Vex, EXx }, PREFIX_DATA },
6330 { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
6331 { "vpmulhw", { XM, Vex, EXx }, PREFIX_DATA },
6332 { PREFIX_TABLE (PREFIX_0FE6) },
6333 { "vmovntdq", { Mx, XM }, PREFIX_DATA },
6334 /* e8 */
6335 { "vpsubsb", { XM, Vex, EXx }, PREFIX_DATA },
6336 { "vpsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6337 { "vpminsw", { XM, Vex, EXx }, PREFIX_DATA },
6338 { "vpor", { XM, Vex, EXx }, PREFIX_DATA },
6339 { "vpaddsb", { XM, Vex, EXx }, PREFIX_DATA },
6340 { "vpaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6341 { "vpmaxsw", { XM, Vex, EXx }, PREFIX_DATA },
6342 { "vpxor", { XM, Vex, EXx }, PREFIX_DATA },
6343 /* f0 */
6344 { PREFIX_TABLE (PREFIX_0FF0) },
6345 { "vpsllw", { XM, Vex, EXxmm }, PREFIX_DATA },
6346 { "vpslld", { XM, Vex, EXxmm }, PREFIX_DATA },
6347 { "vpsllq", { XM, Vex, EXxmm }, PREFIX_DATA },
6348 { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
6349 { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
6350 { "vpsadbw", { XM, Vex, EXx }, PREFIX_DATA },
6351 { "vmaskmovdqu", { XM, Uxmm }, PREFIX_DATA },
6352 /* f8 */
6353 { "vpsubb", { XM, Vex, EXx }, PREFIX_DATA },
6354 { "vpsubw", { XM, Vex, EXx }, PREFIX_DATA },
6355 { "vpsubd", { XM, Vex, EXx }, PREFIX_DATA },
6356 { "vpsubq", { XM, Vex, EXx }, PREFIX_DATA },
6357 { "vpaddb", { XM, Vex, EXx }, PREFIX_DATA },
6358 { "vpaddw", { XM, Vex, EXx }, PREFIX_DATA },
6359 { "vpaddd", { XM, Vex, EXx }, PREFIX_DATA },
6360 { Bad_Opcode },
6361 },
6362 /* VEX_0F38 */
6363 {
6364 /* 00 */
6365 { "vpshufb", { XM, Vex, EXx }, PREFIX_DATA },
6366 { "vphaddw", { XM, Vex, EXx }, PREFIX_DATA },
6367 { "vphaddd", { XM, Vex, EXx }, PREFIX_DATA },
6368 { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6369 { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
6370 { "vphsubw", { XM, Vex, EXx }, PREFIX_DATA },
6371 { "vphsubd", { XM, Vex, EXx }, PREFIX_DATA },
6372 { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6373 /* 08 */
6374 { "vpsignb", { XM, Vex, EXx }, PREFIX_DATA },
6375 { "vpsignw", { XM, Vex, EXx }, PREFIX_DATA },
6376 { "vpsignd", { XM, Vex, EXx }, PREFIX_DATA },
6377 { "vpmulhrsw", { XM, Vex, EXx }, PREFIX_DATA },
6378 { VEX_W_TABLE (VEX_W_0F380C) },
6379 { VEX_W_TABLE (VEX_W_0F380D) },
6380 { VEX_W_TABLE (VEX_W_0F380E) },
6381 { VEX_W_TABLE (VEX_W_0F380F) },
6382 /* 10 */
6383 { Bad_Opcode },
6384 { Bad_Opcode },
6385 { Bad_Opcode },
6386 { VEX_W_TABLE (VEX_W_0F3813) },
6387 { Bad_Opcode },
6388 { Bad_Opcode },
6389 { VEX_LEN_TABLE (VEX_LEN_0F3816) },
6390 { "vptest", { XM, EXx }, PREFIX_DATA },
6391 /* 18 */
6392 { VEX_W_TABLE (VEX_W_0F3818) },
6393 { VEX_LEN_TABLE (VEX_LEN_0F3819) },
6394 { VEX_LEN_TABLE (VEX_LEN_0F381A) },
6395 { Bad_Opcode },
6396 { "vpabsb", { XM, EXx }, PREFIX_DATA },
6397 { "vpabsw", { XM, EXx }, PREFIX_DATA },
6398 { "vpabsd", { XM, EXx }, PREFIX_DATA },
6399 { Bad_Opcode },
6400 /* 20 */
6401 { "vpmovsxbw", { XM, EXxmmq }, PREFIX_DATA },
6402 { "vpmovsxbd", { XM, EXxmmqd }, PREFIX_DATA },
6403 { "vpmovsxbq", { XM, EXxmmdw }, PREFIX_DATA },
6404 { "vpmovsxwd", { XM, EXxmmq }, PREFIX_DATA },
6405 { "vpmovsxwq", { XM, EXxmmqd }, PREFIX_DATA },
6406 { "vpmovsxdq", { XM, EXxmmq }, PREFIX_DATA },
6407 { Bad_Opcode },
6408 { Bad_Opcode },
6409 /* 28 */
6410 { "vpmuldq", { XM, Vex, EXx }, PREFIX_DATA },
6411 { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
6412 { "vmovntdqa", { XM, Mx }, PREFIX_DATA },
6413 { "vpackusdw", { XM, Vex, EXx }, PREFIX_DATA },
6414 { VEX_W_TABLE (VEX_W_0F382C) },
6415 { VEX_W_TABLE (VEX_W_0F382D) },
6416 { VEX_W_TABLE (VEX_W_0F382E) },
6417 { VEX_W_TABLE (VEX_W_0F382F) },
6418 /* 30 */
6419 { "vpmovzxbw", { XM, EXxmmq }, PREFIX_DATA },
6420 { "vpmovzxbd", { XM, EXxmmqd }, PREFIX_DATA },
6421 { "vpmovzxbq", { XM, EXxmmdw }, PREFIX_DATA },
6422 { "vpmovzxwd", { XM, EXxmmq }, PREFIX_DATA },
6423 { "vpmovzxwq", { XM, EXxmmqd }, PREFIX_DATA },
6424 { "vpmovzxdq", { XM, EXxmmq }, PREFIX_DATA },
6425 { VEX_LEN_TABLE (VEX_LEN_0F3836) },
6426 { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
6427 /* 38 */
6428 { "vpminsb", { XM, Vex, EXx }, PREFIX_DATA },
6429 { "vpminsd", { XM, Vex, EXx }, PREFIX_DATA },
6430 { "vpminuw", { XM, Vex, EXx }, PREFIX_DATA },
6431 { "vpminud", { XM, Vex, EXx }, PREFIX_DATA },
6432 { "vpmaxsb", { XM, Vex, EXx }, PREFIX_DATA },
6433 { "vpmaxsd", { XM, Vex, EXx }, PREFIX_DATA },
6434 { "vpmaxuw", { XM, Vex, EXx }, PREFIX_DATA },
6435 { "vpmaxud", { XM, Vex, EXx }, PREFIX_DATA },
6436 /* 40 */
6437 { "vpmulld", { XM, Vex, EXx }, PREFIX_DATA },
6438 { VEX_LEN_TABLE (VEX_LEN_0F3841) },
6439 { Bad_Opcode },
6440 { Bad_Opcode },
6441 { Bad_Opcode },
6442 { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6443 { VEX_W_TABLE (VEX_W_0F3846) },
6444 { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6445 /* 48 */
6446 { Bad_Opcode },
6447 { X86_64_TABLE (X86_64_VEX_0F3849) },
6448 { Bad_Opcode },
6449 { X86_64_TABLE (X86_64_VEX_0F384B) },
6450 { Bad_Opcode },
6451 { Bad_Opcode },
6452 { Bad_Opcode },
6453 { Bad_Opcode },
6454 /* 50 */
6455 { VEX_W_TABLE (VEX_W_0F3850) },
6456 { VEX_W_TABLE (VEX_W_0F3851) },
6457 { VEX_W_TABLE (VEX_W_0F3852) },
6458 { VEX_W_TABLE (VEX_W_0F3853) },
6459 { Bad_Opcode },
6460 { Bad_Opcode },
6461 { Bad_Opcode },
6462 { Bad_Opcode },
6463 /* 58 */
6464 { VEX_W_TABLE (VEX_W_0F3858) },
6465 { VEX_W_TABLE (VEX_W_0F3859) },
6466 { VEX_LEN_TABLE (VEX_LEN_0F385A) },
6467 { Bad_Opcode },
6468 { X86_64_TABLE (X86_64_VEX_0F385C) },
6469 { Bad_Opcode },
6470 { X86_64_TABLE (X86_64_VEX_0F385E) },
6471 { Bad_Opcode },
6472 /* 60 */
6473 { Bad_Opcode },
6474 { Bad_Opcode },
6475 { Bad_Opcode },
6476 { Bad_Opcode },
6477 { Bad_Opcode },
6478 { Bad_Opcode },
6479 { Bad_Opcode },
6480 { Bad_Opcode },
6481 /* 68 */
6482 { Bad_Opcode },
6483 { Bad_Opcode },
6484 { Bad_Opcode },
6485 { Bad_Opcode },
6486 { X86_64_TABLE (X86_64_VEX_0F386C) },
6487 { Bad_Opcode },
6488 { Bad_Opcode },
6489 { Bad_Opcode },
6490 /* 70 */
6491 { Bad_Opcode },
6492 { Bad_Opcode },
6493 { PREFIX_TABLE (PREFIX_VEX_0F3872) },
6494 { Bad_Opcode },
6495 { Bad_Opcode },
6496 { Bad_Opcode },
6497 { Bad_Opcode },
6498 { Bad_Opcode },
6499 /* 78 */
6500 { VEX_W_TABLE (VEX_W_0F3878) },
6501 { VEX_W_TABLE (VEX_W_0F3879) },
6502 { Bad_Opcode },
6503 { Bad_Opcode },
6504 { Bad_Opcode },
6505 { Bad_Opcode },
6506 { Bad_Opcode },
6507 { Bad_Opcode },
6508 /* 80 */
6509 { Bad_Opcode },
6510 { Bad_Opcode },
6511 { Bad_Opcode },
6512 { Bad_Opcode },
6513 { Bad_Opcode },
6514 { Bad_Opcode },
6515 { Bad_Opcode },
6516 { Bad_Opcode },
6517 /* 88 */
6518 { Bad_Opcode },
6519 { Bad_Opcode },
6520 { Bad_Opcode },
6521 { Bad_Opcode },
6522 { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
6523 { Bad_Opcode },
6524 { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
6525 { Bad_Opcode },
6526 /* 90 */
6527 { "vpgatherd%DQ", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6528 { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6529 { "vgatherdp%XW", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6530 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6531 { Bad_Opcode },
6532 { Bad_Opcode },
6533 { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6534 { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6535 /* 98 */
6536 { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6537 { "vfmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6538 { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6539 { "vfmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6540 { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6541 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6542 { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6543 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6544 /* a0 */
6545 { Bad_Opcode },
6546 { Bad_Opcode },
6547 { Bad_Opcode },
6548 { Bad_Opcode },
6549 { Bad_Opcode },
6550 { Bad_Opcode },
6551 { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6552 { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6553 /* a8 */
6554 { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6555 { "vfmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6556 { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6557 { "vfmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6558 { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6559 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6560 { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6561 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6562 /* b0 */
6563 { VEX_W_TABLE (VEX_W_0F38B0) },
6564 { VEX_W_TABLE (VEX_W_0F38B1) },
6565 { Bad_Opcode },
6566 { Bad_Opcode },
6567 { VEX_W_TABLE (VEX_W_0F38B4) },
6568 { VEX_W_TABLE (VEX_W_0F38B5) },
6569 { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6570 { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6571 /* b8 */
6572 { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6573 { "vfmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6574 { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6575 { "vfmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6576 { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6577 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6578 { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6579 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6580 /* c0 */
6581 { Bad_Opcode },
6582 { Bad_Opcode },
6583 { Bad_Opcode },
6584 { Bad_Opcode },
6585 { Bad_Opcode },
6586 { Bad_Opcode },
6587 { Bad_Opcode },
6588 { Bad_Opcode },
6589 /* c8 */
6590 { Bad_Opcode },
6591 { Bad_Opcode },
6592 { Bad_Opcode },
6593 { PREFIX_TABLE (PREFIX_VEX_0F38CB) },
6594 { PREFIX_TABLE (PREFIX_VEX_0F38CC) },
6595 { PREFIX_TABLE (PREFIX_VEX_0F38CD) },
6596 { Bad_Opcode },
6597 { VEX_W_TABLE (VEX_W_0F38CF) },
6598 /* d0 */
6599 { Bad_Opcode },
6600 { Bad_Opcode },
6601 { VEX_W_TABLE (VEX_W_0F38D2) },
6602 { VEX_W_TABLE (VEX_W_0F38D3) },
6603 { Bad_Opcode },
6604 { Bad_Opcode },
6605 { Bad_Opcode },
6606 { Bad_Opcode },
6607 /* d8 */
6608 { Bad_Opcode },
6609 { Bad_Opcode },
6610 { VEX_W_TABLE (VEX_W_0F38DA) },
6611 { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6612 { "vaesenc", { XM, Vex, EXx }, PREFIX_DATA },
6613 { "vaesenclast", { XM, Vex, EXx }, PREFIX_DATA },
6614 { "vaesdec", { XM, Vex, EXx }, PREFIX_DATA },
6615 { "vaesdeclast", { XM, Vex, EXx }, PREFIX_DATA },
6616 /* e0 */
6617 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6618 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6619 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6620 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6621 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6622 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6623 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6624 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6625 /* e8 */
6626 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6627 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6628 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6629 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6630 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6631 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6632 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6633 { X86_64_TABLE (X86_64_VEX_0F38Ex) },
6634 /* f0 */
6635 { Bad_Opcode },
6636 { Bad_Opcode },
6637 { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
6638 { VEX_LEN_TABLE (VEX_LEN_0F38F3) },
6639 { Bad_Opcode },
6640 { VEX_LEN_TABLE (VEX_LEN_0F38F5) },
6641 { VEX_LEN_TABLE (VEX_LEN_0F38F6) },
6642 { VEX_LEN_TABLE (VEX_LEN_0F38F7) },
6643 /* f8 */
6644 { Bad_Opcode },
6645 { Bad_Opcode },
6646 { Bad_Opcode },
6647 { Bad_Opcode },
6648 { Bad_Opcode },
6649 { Bad_Opcode },
6650 { Bad_Opcode },
6651 { Bad_Opcode },
6652 },
6653 /* VEX_0F3A */
6654 {
6655 /* 00 */
6656 { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6657 { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6658 { VEX_W_TABLE (VEX_W_0F3A02) },
6659 { Bad_Opcode },
6660 { VEX_W_TABLE (VEX_W_0F3A04) },
6661 { VEX_W_TABLE (VEX_W_0F3A05) },
6662 { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
6663 { Bad_Opcode },
6664 /* 08 */
6665 { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6666 { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6667 { "vroundss", { XMScalar, VexScalar, EXd, Ib }, PREFIX_DATA },
6668 { "vroundsd", { XMScalar, VexScalar, EXq, Ib }, PREFIX_DATA },
6669 { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6670 { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6671 { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6672 { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6673 /* 10 */
6674 { Bad_Opcode },
6675 { Bad_Opcode },
6676 { Bad_Opcode },
6677 { Bad_Opcode },
6678 { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6679 { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6680 { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6681 { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
6682 /* 18 */
6683 { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6684 { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
6685 { Bad_Opcode },
6686 { Bad_Opcode },
6687 { Bad_Opcode },
6688 { VEX_W_TABLE (VEX_W_0F3A1D) },
6689 { Bad_Opcode },
6690 { Bad_Opcode },
6691 /* 20 */
6692 { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6693 { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6694 { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
6695 { Bad_Opcode },
6696 { Bad_Opcode },
6697 { Bad_Opcode },
6698 { Bad_Opcode },
6699 { Bad_Opcode },
6700 /* 28 */
6701 { Bad_Opcode },
6702 { Bad_Opcode },
6703 { Bad_Opcode },
6704 { Bad_Opcode },
6705 { Bad_Opcode },
6706 { Bad_Opcode },
6707 { Bad_Opcode },
6708 { Bad_Opcode },
6709 /* 30 */
6710 { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
6711 { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
6712 { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
6713 { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
6714 { Bad_Opcode },
6715 { Bad_Opcode },
6716 { Bad_Opcode },
6717 { Bad_Opcode },
6718 /* 38 */
6719 { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
6720 { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
6721 { Bad_Opcode },
6722 { Bad_Opcode },
6723 { Bad_Opcode },
6724 { Bad_Opcode },
6725 { Bad_Opcode },
6726 { Bad_Opcode },
6727 /* 40 */
6728 { "vdpps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6729 { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
6730 { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6731 { Bad_Opcode },
6732 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
6733 { Bad_Opcode },
6734 { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
6735 { Bad_Opcode },
6736 /* 48 */
6737 { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6738 { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6739 { VEX_W_TABLE (VEX_W_0F3A4A) },
6740 { VEX_W_TABLE (VEX_W_0F3A4B) },
6741 { VEX_W_TABLE (VEX_W_0F3A4C) },
6742 { Bad_Opcode },
6743 { Bad_Opcode },
6744 { Bad_Opcode },
6745 /* 50 */
6746 { Bad_Opcode },
6747 { Bad_Opcode },
6748 { Bad_Opcode },
6749 { Bad_Opcode },
6750 { Bad_Opcode },
6751 { Bad_Opcode },
6752 { Bad_Opcode },
6753 { Bad_Opcode },
6754 /* 58 */
6755 { Bad_Opcode },
6756 { Bad_Opcode },
6757 { Bad_Opcode },
6758 { Bad_Opcode },
6759 { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6760 { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6761 { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6762 { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6763 /* 60 */
6764 { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
6765 { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
6766 { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
6767 { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
6768 { Bad_Opcode },
6769 { Bad_Opcode },
6770 { Bad_Opcode },
6771 { Bad_Opcode },
6772 /* 68 */
6773 { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6774 { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6775 { "vfmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6776 { "vfmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6777 { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6778 { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6779 { "vfmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6780 { "vfmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6781 /* 70 */
6782 { Bad_Opcode },
6783 { Bad_Opcode },
6784 { Bad_Opcode },
6785 { Bad_Opcode },
6786 { Bad_Opcode },
6787 { Bad_Opcode },
6788 { Bad_Opcode },
6789 { Bad_Opcode },
6790 /* 78 */
6791 { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6792 { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6793 { "vfnmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6794 { "vfnmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6795 { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6796 { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6797 { "vfnmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6798 { "vfnmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6799 /* 80 */
6800 { Bad_Opcode },
6801 { Bad_Opcode },
6802 { Bad_Opcode },
6803 { Bad_Opcode },
6804 { Bad_Opcode },
6805 { Bad_Opcode },
6806 { Bad_Opcode },
6807 { Bad_Opcode },
6808 /* 88 */
6809 { Bad_Opcode },
6810 { Bad_Opcode },
6811 { Bad_Opcode },
6812 { Bad_Opcode },
6813 { Bad_Opcode },
6814 { Bad_Opcode },
6815 { Bad_Opcode },
6816 { Bad_Opcode },
6817 /* 90 */
6818 { Bad_Opcode },
6819 { Bad_Opcode },
6820 { Bad_Opcode },
6821 { Bad_Opcode },
6822 { Bad_Opcode },
6823 { Bad_Opcode },
6824 { Bad_Opcode },
6825 { Bad_Opcode },
6826 /* 98 */
6827 { Bad_Opcode },
6828 { Bad_Opcode },
6829 { Bad_Opcode },
6830 { Bad_Opcode },
6831 { Bad_Opcode },
6832 { Bad_Opcode },
6833 { Bad_Opcode },
6834 { Bad_Opcode },
6835 /* a0 */
6836 { Bad_Opcode },
6837 { Bad_Opcode },
6838 { Bad_Opcode },
6839 { Bad_Opcode },
6840 { Bad_Opcode },
6841 { Bad_Opcode },
6842 { Bad_Opcode },
6843 { Bad_Opcode },
6844 /* a8 */
6845 { Bad_Opcode },
6846 { Bad_Opcode },
6847 { Bad_Opcode },
6848 { Bad_Opcode },
6849 { Bad_Opcode },
6850 { Bad_Opcode },
6851 { Bad_Opcode },
6852 { Bad_Opcode },
6853 /* b0 */
6854 { Bad_Opcode },
6855 { Bad_Opcode },
6856 { Bad_Opcode },
6857 { Bad_Opcode },
6858 { Bad_Opcode },
6859 { Bad_Opcode },
6860 { Bad_Opcode },
6861 { Bad_Opcode },
6862 /* b8 */
6863 { Bad_Opcode },
6864 { Bad_Opcode },
6865 { Bad_Opcode },
6866 { Bad_Opcode },
6867 { Bad_Opcode },
6868 { Bad_Opcode },
6869 { Bad_Opcode },
6870 { Bad_Opcode },
6871 /* c0 */
6872 { Bad_Opcode },
6873 { Bad_Opcode },
6874 { Bad_Opcode },
6875 { Bad_Opcode },
6876 { Bad_Opcode },
6877 { Bad_Opcode },
6878 { Bad_Opcode },
6879 { Bad_Opcode },
6880 /* c8 */
6881 { Bad_Opcode },
6882 { Bad_Opcode },
6883 { Bad_Opcode },
6884 { Bad_Opcode },
6885 { Bad_Opcode },
6886 { Bad_Opcode },
6887 { VEX_W_TABLE (VEX_W_0F3ACE) },
6888 { VEX_W_TABLE (VEX_W_0F3ACF) },
6889 /* d0 */
6890 { Bad_Opcode },
6891 { Bad_Opcode },
6892 { Bad_Opcode },
6893 { Bad_Opcode },
6894 { Bad_Opcode },
6895 { Bad_Opcode },
6896 { Bad_Opcode },
6897 { Bad_Opcode },
6898 /* d8 */
6899 { Bad_Opcode },
6900 { Bad_Opcode },
6901 { Bad_Opcode },
6902 { Bad_Opcode },
6903 { Bad_Opcode },
6904 { Bad_Opcode },
6905 { VEX_W_TABLE (VEX_W_0F3ADE) },
6906 { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
6907 /* e0 */
6908 { Bad_Opcode },
6909 { Bad_Opcode },
6910 { Bad_Opcode },
6911 { Bad_Opcode },
6912 { Bad_Opcode },
6913 { Bad_Opcode },
6914 { Bad_Opcode },
6915 { Bad_Opcode },
6916 /* e8 */
6917 { Bad_Opcode },
6918 { Bad_Opcode },
6919 { Bad_Opcode },
6920 { Bad_Opcode },
6921 { Bad_Opcode },
6922 { Bad_Opcode },
6923 { Bad_Opcode },
6924 { Bad_Opcode },
6925 /* f0 */
6926 { VEX_LEN_TABLE (VEX_LEN_0F3AF0) },
6927 { Bad_Opcode },
6928 { Bad_Opcode },
6929 { Bad_Opcode },
6930 { Bad_Opcode },
6931 { Bad_Opcode },
6932 { Bad_Opcode },
6933 { Bad_Opcode },
6934 /* f8 */
6935 { Bad_Opcode },
6936 { Bad_Opcode },
6937 { Bad_Opcode },
6938 { Bad_Opcode },
6939 { Bad_Opcode },
6940 { Bad_Opcode },
6941 { Bad_Opcode },
6942 { Bad_Opcode },
6943 },
6944 };
6945
6946 #include "i386-dis-evex.h"
6947
6948 static const struct dis386 vex_len_table[][2] = {
6949 /* VEX_LEN_0F12_P_0 */
6950 {
6951 { MOD_TABLE (MOD_0F12_PREFIX_0) },
6952 },
6953
6954 /* VEX_LEN_0F12_P_2 */
6955 {
6956 { "%XEVmovlpYX", { XM, Vex, Mq }, 0 },
6957 },
6958
6959 /* VEX_LEN_0F13 */
6960 {
6961 { "%XEVmovlpYX", { Mq, XM }, PREFIX_OPCODE },
6962 },
6963
6964 /* VEX_LEN_0F16_P_0 */
6965 {
6966 { MOD_TABLE (MOD_0F16_PREFIX_0) },
6967 },
6968
6969 /* VEX_LEN_0F16_P_2 */
6970 {
6971 { "%XEVmovhpYX", { XM, Vex, Mq }, 0 },
6972 },
6973
6974 /* VEX_LEN_0F17 */
6975 {
6976 { "%XEVmovhpYX", { Mq, XM }, PREFIX_OPCODE },
6977 },
6978
6979 /* VEX_LEN_0F41 */
6980 {
6981 { Bad_Opcode },
6982 { VEX_W_TABLE (VEX_W_0F41_L_1) },
6983 },
6984
6985 /* VEX_LEN_0F42 */
6986 {
6987 { Bad_Opcode },
6988 { VEX_W_TABLE (VEX_W_0F42_L_1) },
6989 },
6990
6991 /* VEX_LEN_0F44 */
6992 {
6993 { VEX_W_TABLE (VEX_W_0F44_L_0) },
6994 },
6995
6996 /* VEX_LEN_0F45 */
6997 {
6998 { Bad_Opcode },
6999 { VEX_W_TABLE (VEX_W_0F45_L_1) },
7000 },
7001
7002 /* VEX_LEN_0F46 */
7003 {
7004 { Bad_Opcode },
7005 { VEX_W_TABLE (VEX_W_0F46_L_1) },
7006 },
7007
7008 /* VEX_LEN_0F47 */
7009 {
7010 { Bad_Opcode },
7011 { VEX_W_TABLE (VEX_W_0F47_L_1) },
7012 },
7013
7014 /* VEX_LEN_0F4A */
7015 {
7016 { Bad_Opcode },
7017 { VEX_W_TABLE (VEX_W_0F4A_L_1) },
7018 },
7019
7020 /* VEX_LEN_0F4B */
7021 {
7022 { Bad_Opcode },
7023 { VEX_W_TABLE (VEX_W_0F4B_L_1) },
7024 },
7025
7026 /* VEX_LEN_0F6E */
7027 {
7028 { "%XEvmovYK", { XMScalar, Edq }, PREFIX_DATA },
7029 },
7030
7031 /* VEX_LEN_0F77 */
7032 {
7033 { "vzeroupper", { XX }, 0 },
7034 { "vzeroall", { XX }, 0 },
7035 },
7036
7037 /* VEX_LEN_0F7E_P_1 */
7038 {
7039 { "%XEvmovqY", { XMScalar, EXq }, 0 },
7040 },
7041
7042 /* VEX_LEN_0F7E_P_2 */
7043 {
7044 { "%XEvmovK", { Edq, XMScalar }, 0 },
7045 },
7046
7047 /* VEX_LEN_0F90 */
7048 {
7049 { VEX_W_TABLE (VEX_W_0F90_L_0) },
7050 },
7051
7052 /* VEX_LEN_0F91 */
7053 {
7054 { VEX_W_TABLE (VEX_W_0F91_L_0) },
7055 },
7056
7057 /* VEX_LEN_0F92 */
7058 {
7059 { VEX_W_TABLE (VEX_W_0F92_L_0) },
7060 },
7061
7062 /* VEX_LEN_0F93 */
7063 {
7064 { VEX_W_TABLE (VEX_W_0F93_L_0) },
7065 },
7066
7067 /* VEX_LEN_0F98 */
7068 {
7069 { VEX_W_TABLE (VEX_W_0F98_L_0) },
7070 },
7071
7072 /* VEX_LEN_0F99 */
7073 {
7074 { VEX_W_TABLE (VEX_W_0F99_L_0) },
7075 },
7076
7077 /* VEX_LEN_0FAE_R_2 */
7078 {
7079 { "vldmxcsr", { Md }, 0 },
7080 },
7081
7082 /* VEX_LEN_0FAE_R_3 */
7083 {
7084 { "vstmxcsr", { Md }, 0 },
7085 },
7086
7087 /* VEX_LEN_0FC4 */
7088 {
7089 { "%XEvpinsrwY", { XM, Vex, Edw, Ib }, PREFIX_DATA },
7090 },
7091
7092 /* VEX_LEN_0FD6 */
7093 {
7094 { "%XEvmovqY", { EXqS, XMScalar }, PREFIX_DATA },
7095 },
7096
7097 /* VEX_LEN_0F3816 */
7098 {
7099 { Bad_Opcode },
7100 { VEX_W_TABLE (VEX_W_0F3816_L_1) },
7101 },
7102
7103 /* VEX_LEN_0F3819 */
7104 {
7105 { Bad_Opcode },
7106 { VEX_W_TABLE (VEX_W_0F3819_L_1) },
7107 },
7108
7109 /* VEX_LEN_0F381A */
7110 {
7111 { Bad_Opcode },
7112 { VEX_W_TABLE (VEX_W_0F381A_L_1) },
7113 },
7114
7115 /* VEX_LEN_0F3836 */
7116 {
7117 { Bad_Opcode },
7118 { VEX_W_TABLE (VEX_W_0F3836) },
7119 },
7120
7121 /* VEX_LEN_0F3841 */
7122 {
7123 { "vphminposuw", { XM, EXx }, PREFIX_DATA },
7124 },
7125
7126 /* VEX_LEN_0F3849_X86_64 */
7127 {
7128 { VEX_W_TABLE (VEX_W_0F3849_X86_64_L_0) },
7129 },
7130
7131 /* VEX_LEN_0F384B_X86_64 */
7132 {
7133 { VEX_W_TABLE (VEX_W_0F384B_X86_64_L_0) },
7134 },
7135
7136 /* VEX_LEN_0F385A */
7137 {
7138 { Bad_Opcode },
7139 { VEX_W_TABLE (VEX_W_0F385A_L_0) },
7140 },
7141
7142 /* VEX_LEN_0F385C_X86_64 */
7143 {
7144 { VEX_W_TABLE (VEX_W_0F385C_X86_64_L_0) },
7145 },
7146
7147 /* VEX_LEN_0F385E_X86_64 */
7148 {
7149 { VEX_W_TABLE (VEX_W_0F385E_X86_64_L_0) },
7150 },
7151
7152 /* VEX_LEN_0F386C_X86_64 */
7153 {
7154 { VEX_W_TABLE (VEX_W_0F386C_X86_64_L_0) },
7155 },
7156
7157 /* VEX_LEN_0F38CB_P_3_W_0 */
7158 {
7159 { Bad_Opcode },
7160 { "vsha512rnds2", { XM, Vex, Rxmmq }, 0 },
7161 },
7162
7163 /* VEX_LEN_0F38CC_P_3_W_0 */
7164 {
7165 { Bad_Opcode },
7166 { "vsha512msg1", { XM, Rxmmq }, 0 },
7167 },
7168
7169 /* VEX_LEN_0F38CD_P_3_W_0 */
7170 {
7171 { Bad_Opcode },
7172 { "vsha512msg2", { XM, Rymm }, 0 },
7173 },
7174
7175 /* VEX_LEN_0F38DA_W_0_P_0 */
7176 {
7177 { "vsm3msg1", { XM, Vex, EXxmm }, 0 },
7178 },
7179
7180 /* VEX_LEN_0F38DA_W_0_P_2 */
7181 {
7182 { "vsm3msg2", { XM, Vex, EXxmm }, 0 },
7183 },
7184
7185 /* VEX_LEN_0F38DB */
7186 {
7187 { "vaesimc", { XM, EXx }, PREFIX_DATA },
7188 },
7189
7190 /* VEX_LEN_0F38F2 */
7191 {
7192 { PREFIX_TABLE (PREFIX_VEX_0F38F2_L_0) },
7193 },
7194
7195 /* VEX_LEN_0F38F3 */
7196 {
7197 { PREFIX_TABLE (PREFIX_VEX_0F38F3_L_0) },
7198 },
7199
7200 /* VEX_LEN_0F38F5 */
7201 {
7202 { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0) },
7203 },
7204
7205 /* VEX_LEN_0F38F6 */
7206 {
7207 { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0) },
7208 },
7209
7210 /* VEX_LEN_0F38F7 */
7211 {
7212 { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0) },
7213 },
7214
7215 /* VEX_LEN_0F3A00 */
7216 {
7217 { Bad_Opcode },
7218 { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
7219 },
7220
7221 /* VEX_LEN_0F3A01 */
7222 {
7223 { Bad_Opcode },
7224 { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
7225 },
7226
7227 /* VEX_LEN_0F3A06 */
7228 {
7229 { Bad_Opcode },
7230 { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
7231 },
7232
7233 /* VEX_LEN_0F3A14 */
7234 {
7235 { "%XEvpextrb", { Edb, XM, Ib }, PREFIX_DATA },
7236 },
7237
7238 /* VEX_LEN_0F3A15 */
7239 {
7240 { "%XEvpextrw", { Edw, XM, Ib }, PREFIX_DATA },
7241 },
7242
7243 /* VEX_LEN_0F3A16 */
7244 {
7245 { "%XEvpextrK", { Edq, XM, Ib }, PREFIX_DATA },
7246 },
7247
7248 /* VEX_LEN_0F3A17 */
7249 {
7250 { "%XEvextractps", { Ed, XM, Ib }, PREFIX_DATA },
7251 },
7252
7253 /* VEX_LEN_0F3A18 */
7254 {
7255 { Bad_Opcode },
7256 { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
7257 },
7258
7259 /* VEX_LEN_0F3A19 */
7260 {
7261 { Bad_Opcode },
7262 { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
7263 },
7264
7265 /* VEX_LEN_0F3A20 */
7266 {
7267 { "%XEvpinsrbY", { XM, Vex, Edb, Ib }, PREFIX_DATA },
7268 },
7269
7270 /* VEX_LEN_0F3A21 */
7271 {
7272 { "%XEvinsertpsY", { XM, Vex, EXd, Ib }, PREFIX_DATA },
7273 },
7274
7275 /* VEX_LEN_0F3A22 */
7276 {
7277 { "%XEvpinsrYK", { XM, Vex, Edq, Ib }, PREFIX_DATA },
7278 },
7279
7280 /* VEX_LEN_0F3A30 */
7281 {
7282 { "kshiftr%BW", { MaskG, MaskR, Ib }, PREFIX_DATA },
7283 },
7284
7285 /* VEX_LEN_0F3A31 */
7286 {
7287 { "kshiftr%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA },
7288 },
7289
7290 /* VEX_LEN_0F3A32 */
7291 {
7292 { "kshiftl%BW", { MaskG, MaskR, Ib }, PREFIX_DATA },
7293 },
7294
7295 /* VEX_LEN_0F3A33 */
7296 {
7297 { "kshiftl%DQ", { MaskG, MaskR, Ib }, PREFIX_DATA },
7298 },
7299
7300 /* VEX_LEN_0F3A38 */
7301 {
7302 { Bad_Opcode },
7303 { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
7304 },
7305
7306 /* VEX_LEN_0F3A39 */
7307 {
7308 { Bad_Opcode },
7309 { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
7310 },
7311
7312 /* VEX_LEN_0F3A41 */
7313 {
7314 { "vdppd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7315 },
7316
7317 /* VEX_LEN_0F3A46 */
7318 {
7319 { Bad_Opcode },
7320 { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
7321 },
7322
7323 /* VEX_LEN_0F3A60 */
7324 {
7325 { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7326 },
7327
7328 /* VEX_LEN_0F3A61 */
7329 {
7330 { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7331 },
7332
7333 /* VEX_LEN_0F3A62 */
7334 {
7335 { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
7336 },
7337
7338 /* VEX_LEN_0F3A63 */
7339 {
7340 { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
7341 },
7342
7343 /* VEX_LEN_0F3ADE_W_0 */
7344 {
7345 { "vsm3rnds2", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
7346 },
7347
7348 /* VEX_LEN_0F3ADF */
7349 {
7350 { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
7351 },
7352
7353 /* VEX_LEN_0F3AF0 */
7354 {
7355 { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) },
7356 },
7357
7358 /* VEX_LEN_MAP7_F6 */
7359 {
7360 { VEX_W_TABLE (VEX_W_MAP7_F6_L_0) },
7361 },
7362
7363 /* VEX_LEN_MAP7_F8 */
7364 {
7365 { VEX_W_TABLE (VEX_W_MAP7_F8_L_0) },
7366 },
7367
7368 /* VEX_LEN_XOP_08_85 */
7369 {
7370 { VEX_W_TABLE (VEX_W_XOP_08_85_L_0) },
7371 },
7372
7373 /* VEX_LEN_XOP_08_86 */
7374 {
7375 { VEX_W_TABLE (VEX_W_XOP_08_86_L_0) },
7376 },
7377
7378 /* VEX_LEN_XOP_08_87 */
7379 {
7380 { VEX_W_TABLE (VEX_W_XOP_08_87_L_0) },
7381 },
7382
7383 /* VEX_LEN_XOP_08_8E */
7384 {
7385 { VEX_W_TABLE (VEX_W_XOP_08_8E_L_0) },
7386 },
7387
7388 /* VEX_LEN_XOP_08_8F */
7389 {
7390 { VEX_W_TABLE (VEX_W_XOP_08_8F_L_0) },
7391 },
7392
7393 /* VEX_LEN_XOP_08_95 */
7394 {
7395 { VEX_W_TABLE (VEX_W_XOP_08_95_L_0) },
7396 },
7397
7398 /* VEX_LEN_XOP_08_96 */
7399 {
7400 { VEX_W_TABLE (VEX_W_XOP_08_96_L_0) },
7401 },
7402
7403 /* VEX_LEN_XOP_08_97 */
7404 {
7405 { VEX_W_TABLE (VEX_W_XOP_08_97_L_0) },
7406 },
7407
7408 /* VEX_LEN_XOP_08_9E */
7409 {
7410 { VEX_W_TABLE (VEX_W_XOP_08_9E_L_0) },
7411 },
7412
7413 /* VEX_LEN_XOP_08_9F */
7414 {
7415 { VEX_W_TABLE (VEX_W_XOP_08_9F_L_0) },
7416 },
7417
7418 /* VEX_LEN_XOP_08_A3 */
7419 {
7420 { "vpperm", { XM, Vex, EXx, XMVexI4 }, 0 },
7421 },
7422
7423 /* VEX_LEN_XOP_08_A6 */
7424 {
7425 { VEX_W_TABLE (VEX_W_XOP_08_A6_L_0) },
7426 },
7427
7428 /* VEX_LEN_XOP_08_B6 */
7429 {
7430 { VEX_W_TABLE (VEX_W_XOP_08_B6_L_0) },
7431 },
7432
7433 /* VEX_LEN_XOP_08_C0 */
7434 {
7435 { VEX_W_TABLE (VEX_W_XOP_08_C0_L_0) },
7436 },
7437
7438 /* VEX_LEN_XOP_08_C1 */
7439 {
7440 { VEX_W_TABLE (VEX_W_XOP_08_C1_L_0) },
7441 },
7442
7443 /* VEX_LEN_XOP_08_C2 */
7444 {
7445 { VEX_W_TABLE (VEX_W_XOP_08_C2_L_0) },
7446 },
7447
7448 /* VEX_LEN_XOP_08_C3 */
7449 {
7450 { VEX_W_TABLE (VEX_W_XOP_08_C3_L_0) },
7451 },
7452
7453 /* VEX_LEN_XOP_08_CC */
7454 {
7455 { VEX_W_TABLE (VEX_W_XOP_08_CC_L_0) },
7456 },
7457
7458 /* VEX_LEN_XOP_08_CD */
7459 {
7460 { VEX_W_TABLE (VEX_W_XOP_08_CD_L_0) },
7461 },
7462
7463 /* VEX_LEN_XOP_08_CE */
7464 {
7465 { VEX_W_TABLE (VEX_W_XOP_08_CE_L_0) },
7466 },
7467
7468 /* VEX_LEN_XOP_08_CF */
7469 {
7470 { VEX_W_TABLE (VEX_W_XOP_08_CF_L_0) },
7471 },
7472
7473 /* VEX_LEN_XOP_08_EC */
7474 {
7475 { VEX_W_TABLE (VEX_W_XOP_08_EC_L_0) },
7476 },
7477
7478 /* VEX_LEN_XOP_08_ED */
7479 {
7480 { VEX_W_TABLE (VEX_W_XOP_08_ED_L_0) },
7481 },
7482
7483 /* VEX_LEN_XOP_08_EE */
7484 {
7485 { VEX_W_TABLE (VEX_W_XOP_08_EE_L_0) },
7486 },
7487
7488 /* VEX_LEN_XOP_08_EF */
7489 {
7490 { VEX_W_TABLE (VEX_W_XOP_08_EF_L_0) },
7491 },
7492
7493 /* VEX_LEN_XOP_09_01 */
7494 {
7495 { REG_TABLE (REG_XOP_09_01_L_0) },
7496 },
7497
7498 /* VEX_LEN_XOP_09_02 */
7499 {
7500 { REG_TABLE (REG_XOP_09_02_L_0) },
7501 },
7502
7503 /* VEX_LEN_XOP_09_12 */
7504 {
7505 { REG_TABLE (REG_XOP_09_12_L_0) },
7506 },
7507
7508 /* VEX_LEN_XOP_09_82_W_0 */
7509 {
7510 { "vfrczss", { XM, EXd }, 0 },
7511 },
7512
7513 /* VEX_LEN_XOP_09_83_W_0 */
7514 {
7515 { "vfrczsd", { XM, EXq }, 0 },
7516 },
7517
7518 /* VEX_LEN_XOP_09_90 */
7519 {
7520 { "vprotb", { XM, EXx, VexW }, 0 },
7521 },
7522
7523 /* VEX_LEN_XOP_09_91 */
7524 {
7525 { "vprotw", { XM, EXx, VexW }, 0 },
7526 },
7527
7528 /* VEX_LEN_XOP_09_92 */
7529 {
7530 { "vprotd", { XM, EXx, VexW }, 0 },
7531 },
7532
7533 /* VEX_LEN_XOP_09_93 */
7534 {
7535 { "vprotq", { XM, EXx, VexW }, 0 },
7536 },
7537
7538 /* VEX_LEN_XOP_09_94 */
7539 {
7540 { "vpshlb", { XM, EXx, VexW }, 0 },
7541 },
7542
7543 /* VEX_LEN_XOP_09_95 */
7544 {
7545 { "vpshlw", { XM, EXx, VexW }, 0 },
7546 },
7547
7548 /* VEX_LEN_XOP_09_96 */
7549 {
7550 { "vpshld", { XM, EXx, VexW }, 0 },
7551 },
7552
7553 /* VEX_LEN_XOP_09_97 */
7554 {
7555 { "vpshlq", { XM, EXx, VexW }, 0 },
7556 },
7557
7558 /* VEX_LEN_XOP_09_98 */
7559 {
7560 { "vpshab", { XM, EXx, VexW }, 0 },
7561 },
7562
7563 /* VEX_LEN_XOP_09_99 */
7564 {
7565 { "vpshaw", { XM, EXx, VexW }, 0 },
7566 },
7567
7568 /* VEX_LEN_XOP_09_9A */
7569 {
7570 { "vpshad", { XM, EXx, VexW }, 0 },
7571 },
7572
7573 /* VEX_LEN_XOP_09_9B */
7574 {
7575 { "vpshaq", { XM, EXx, VexW }, 0 },
7576 },
7577
7578 /* VEX_LEN_XOP_09_C1 */
7579 {
7580 { VEX_W_TABLE (VEX_W_XOP_09_C1_L_0) },
7581 },
7582
7583 /* VEX_LEN_XOP_09_C2 */
7584 {
7585 { VEX_W_TABLE (VEX_W_XOP_09_C2_L_0) },
7586 },
7587
7588 /* VEX_LEN_XOP_09_C3 */
7589 {
7590 { VEX_W_TABLE (VEX_W_XOP_09_C3_L_0) },
7591 },
7592
7593 /* VEX_LEN_XOP_09_C6 */
7594 {
7595 { VEX_W_TABLE (VEX_W_XOP_09_C6_L_0) },
7596 },
7597
7598 /* VEX_LEN_XOP_09_C7 */
7599 {
7600 { VEX_W_TABLE (VEX_W_XOP_09_C7_L_0) },
7601 },
7602
7603 /* VEX_LEN_XOP_09_CB */
7604 {
7605 { VEX_W_TABLE (VEX_W_XOP_09_CB_L_0) },
7606 },
7607
7608 /* VEX_LEN_XOP_09_D1 */
7609 {
7610 { VEX_W_TABLE (VEX_W_XOP_09_D1_L_0) },
7611 },
7612
7613 /* VEX_LEN_XOP_09_D2 */
7614 {
7615 { VEX_W_TABLE (VEX_W_XOP_09_D2_L_0) },
7616 },
7617
7618 /* VEX_LEN_XOP_09_D3 */
7619 {
7620 { VEX_W_TABLE (VEX_W_XOP_09_D3_L_0) },
7621 },
7622
7623 /* VEX_LEN_XOP_09_D6 */
7624 {
7625 { VEX_W_TABLE (VEX_W_XOP_09_D6_L_0) },
7626 },
7627
7628 /* VEX_LEN_XOP_09_D7 */
7629 {
7630 { VEX_W_TABLE (VEX_W_XOP_09_D7_L_0) },
7631 },
7632
7633 /* VEX_LEN_XOP_09_DB */
7634 {
7635 { VEX_W_TABLE (VEX_W_XOP_09_DB_L_0) },
7636 },
7637
7638 /* VEX_LEN_XOP_09_E1 */
7639 {
7640 { VEX_W_TABLE (VEX_W_XOP_09_E1_L_0) },
7641 },
7642
7643 /* VEX_LEN_XOP_09_E2 */
7644 {
7645 { VEX_W_TABLE (VEX_W_XOP_09_E2_L_0) },
7646 },
7647
7648 /* VEX_LEN_XOP_09_E3 */
7649 {
7650 { VEX_W_TABLE (VEX_W_XOP_09_E3_L_0) },
7651 },
7652
7653 /* VEX_LEN_XOP_0A_12 */
7654 {
7655 { REG_TABLE (REG_XOP_0A_12_L_0) },
7656 },
7657 };
7658
7659 #include "i386-dis-evex-len.h"
7660
7661 static const struct dis386 vex_w_table[][2] = {
7662 {
7663 /* VEX_W_0F41_L_1_M_1 */
7664 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_0) },
7665 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_W_1) },
7666 },
7667 {
7668 /* VEX_W_0F42_L_1_M_1 */
7669 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_0) },
7670 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_W_1) },
7671 },
7672 {
7673 /* VEX_W_0F44_L_0_M_1 */
7674 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_0) },
7675 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_W_1) },
7676 },
7677 {
7678 /* VEX_W_0F45_L_1_M_1 */
7679 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_0) },
7680 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_W_1) },
7681 },
7682 {
7683 /* VEX_W_0F46_L_1_M_1 */
7684 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_0) },
7685 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_W_1) },
7686 },
7687 {
7688 /* VEX_W_0F47_L_1_M_1 */
7689 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_0) },
7690 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_W_1) },
7691 },
7692 {
7693 /* VEX_W_0F4A_L_1_M_1 */
7694 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_0) },
7695 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_W_1) },
7696 },
7697 {
7698 /* VEX_W_0F4B_L_1_M_1 */
7699 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_0) },
7700 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_W_1) },
7701 },
7702 {
7703 /* VEX_W_0F90_L_0 */
7704 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0) },
7705 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1) },
7706 },
7707 {
7708 /* VEX_W_0F91_L_0_M_0 */
7709 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_0) },
7710 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_W_1) },
7711 },
7712 {
7713 /* VEX_W_0F92_L_0_M_1 */
7714 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_0) },
7715 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_W_1) },
7716 },
7717 {
7718 /* VEX_W_0F93_L_0_M_1 */
7719 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_0) },
7720 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_W_1) },
7721 },
7722 {
7723 /* VEX_W_0F98_L_0_M_1 */
7724 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_0) },
7725 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_W_1) },
7726 },
7727 {
7728 /* VEX_W_0F99_L_0_M_1 */
7729 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_0) },
7730 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_W_1) },
7731 },
7732 {
7733 /* VEX_W_0F380C */
7734 { "%XEvpermilps", { XM, Vex, EXx }, PREFIX_DATA },
7735 },
7736 {
7737 /* VEX_W_0F380D */
7738 { "vpermilpd", { XM, Vex, EXx }, PREFIX_DATA },
7739 },
7740 {
7741 /* VEX_W_0F380E */
7742 { "vtestps", { XM, EXx }, PREFIX_DATA },
7743 },
7744 {
7745 /* VEX_W_0F380F */
7746 { "vtestpd", { XM, EXx }, PREFIX_DATA },
7747 },
7748 {
7749 /* VEX_W_0F3813 */
7750 { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
7751 },
7752 {
7753 /* VEX_W_0F3816_L_1 */
7754 { "vpermps", { XM, Vex, EXx }, PREFIX_DATA },
7755 },
7756 {
7757 /* VEX_W_0F3818 */
7758 { "%XEvbroadcastss", { XM, EXd }, PREFIX_DATA },
7759 },
7760 {
7761 /* VEX_W_0F3819_L_1 */
7762 { "vbroadcastsd", { XM, EXq }, PREFIX_DATA },
7763 },
7764 {
7765 /* VEX_W_0F381A_L_1 */
7766 { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
7767 },
7768 {
7769 /* VEX_W_0F382C */
7770 { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
7771 },
7772 {
7773 /* VEX_W_0F382D */
7774 { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
7775 },
7776 {
7777 /* VEX_W_0F382E */
7778 { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
7779 },
7780 {
7781 /* VEX_W_0F382F */
7782 { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
7783 },
7784 {
7785 /* VEX_W_0F3836 */
7786 { "vpermd", { XM, Vex, EXx }, PREFIX_DATA },
7787 },
7788 {
7789 /* VEX_W_0F3846 */
7790 { "vpsravd", { XM, Vex, EXx }, PREFIX_DATA },
7791 },
7792 {
7793 /* VEX_W_0F3849_X86_64_L_0 */
7794 { MOD_TABLE (MOD_VEX_0F3849_X86_64_L_0_W_0) },
7795 },
7796 {
7797 /* VEX_W_0F384B_X86_64_L_0 */
7798 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64_L_0_W_0) },
7799 },
7800 {
7801 /* VEX_W_0F3850 */
7802 { PREFIX_TABLE (PREFIX_VEX_0F3850_W_0) },
7803 },
7804 {
7805 /* VEX_W_0F3851 */
7806 { PREFIX_TABLE (PREFIX_VEX_0F3851_W_0) },
7807 },
7808 {
7809 /* VEX_W_0F3852 */
7810 { "%XVvpdpwssd", { XM, Vex, EXx }, PREFIX_DATA },
7811 },
7812 {
7813 /* VEX_W_0F3853 */
7814 { "%XVvpdpwssds", { XM, Vex, EXx }, PREFIX_DATA },
7815 },
7816 {
7817 /* VEX_W_0F3858 */
7818 { "%XEvpbroadcastd", { XM, EXd }, PREFIX_DATA },
7819 },
7820 {
7821 /* VEX_W_0F3859 */
7822 { "vpbroadcastq", { XM, EXq }, PREFIX_DATA },
7823 },
7824 {
7825 /* VEX_W_0F385A_L_0 */
7826 { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
7827 },
7828 {
7829 /* VEX_W_0F385C_X86_64_L_0 */
7830 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64_L_0_W_0) },
7831 },
7832 {
7833 /* VEX_W_0F385E_X86_64_L_0 */
7834 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64_L_0_W_0) },
7835 },
7836 {
7837 /* VEX_W_0F386C_X86_64_L_0 */
7838 { PREFIX_TABLE (PREFIX_VEX_0F386C_X86_64_L_0_W_0) },
7839 },
7840 {
7841 /* VEX_W_0F3872_P_1 */
7842 { "%XVvcvtneps2bf16%XY", { XMM, EXx }, 0 },
7843 },
7844 {
7845 /* VEX_W_0F3878 */
7846 { "%XEvpbroadcastb", { XM, EXb }, PREFIX_DATA },
7847 },
7848 {
7849 /* VEX_W_0F3879 */
7850 { "%XEvpbroadcastw", { XM, EXw }, PREFIX_DATA },
7851 },
7852 {
7853 /* VEX_W_0F38B0 */
7854 { PREFIX_TABLE (PREFIX_VEX_0F38B0_W_0) },
7855 },
7856 {
7857 /* VEX_W_0F38B1 */
7858 { PREFIX_TABLE (PREFIX_VEX_0F38B1_W_0) },
7859 },
7860 {
7861 /* VEX_W_0F38B4 */
7862 { Bad_Opcode },
7863 { "%XVvpmadd52luq", { XM, Vex, EXx }, PREFIX_DATA },
7864 },
7865 {
7866 /* VEX_W_0F38B5 */
7867 { Bad_Opcode },
7868 { "%XVvpmadd52huq", { XM, Vex, EXx }, PREFIX_DATA },
7869 },
7870 {
7871 /* VEX_W_0F38CB_P_3 */
7872 { VEX_LEN_TABLE (VEX_LEN_0F38CB_P_3_W_0) },
7873 },
7874 {
7875 /* VEX_W_0F38CC_P_3 */
7876 { VEX_LEN_TABLE (VEX_LEN_0F38CC_P_3_W_0) },
7877 },
7878 {
7879 /* VEX_W_0F38CD_P_3 */
7880 { VEX_LEN_TABLE (VEX_LEN_0F38CD_P_3_W_0) },
7881 },
7882 {
7883 /* VEX_W_0F38CF */
7884 { "%XEvgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
7885 },
7886 {
7887 /* VEX_W_0F38D2 */
7888 { PREFIX_TABLE (PREFIX_VEX_0F38D2_W_0) },
7889 },
7890 {
7891 /* VEX_W_0F38D3 */
7892 { PREFIX_TABLE (PREFIX_VEX_0F38D3_W_0) },
7893 },
7894 {
7895 /* VEX_W_0F38DA */
7896 { PREFIX_TABLE (PREFIX_VEX_0F38DA_W_0) },
7897 },
7898 {
7899 /* VEX_W_0F3A00_L_1 */
7900 { Bad_Opcode },
7901 { "%XEvpermq", { XM, EXx, Ib }, PREFIX_DATA },
7902 },
7903 {
7904 /* VEX_W_0F3A01_L_1 */
7905 { Bad_Opcode },
7906 { "%XEvpermpd", { XM, EXx, Ib }, PREFIX_DATA },
7907 },
7908 {
7909 /* VEX_W_0F3A02 */
7910 { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7911 },
7912 {
7913 /* VEX_W_0F3A04 */
7914 { "%XEvpermilps", { XM, EXx, Ib }, PREFIX_DATA },
7915 },
7916 {
7917 /* VEX_W_0F3A05 */
7918 { "vpermilpd", { XM, EXx, Ib }, PREFIX_DATA },
7919 },
7920 {
7921 /* VEX_W_0F3A06_L_1 */
7922 { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7923 },
7924 {
7925 /* VEX_W_0F3A18_L_1 */
7926 { "vinsertf128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
7927 },
7928 {
7929 /* VEX_W_0F3A19_L_1 */
7930 { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
7931 },
7932 {
7933 /* VEX_W_0F3A1D */
7934 { "%XEvcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
7935 },
7936 {
7937 /* VEX_W_0F3A38_L_1 */
7938 { "vinserti128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
7939 },
7940 {
7941 /* VEX_W_0F3A39_L_1 */
7942 { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
7943 },
7944 {
7945 /* VEX_W_0F3A46_L_1 */
7946 { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7947 },
7948 {
7949 /* VEX_W_0F3A4A */
7950 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7951 },
7952 {
7953 /* VEX_W_0F3A4B */
7954 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7955 },
7956 {
7957 /* VEX_W_0F3A4C */
7958 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7959 },
7960 {
7961 /* VEX_W_0F3ACE */
7962 { Bad_Opcode },
7963 { "%XEvgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7964 },
7965 {
7966 /* VEX_W_0F3ACF */
7967 { Bad_Opcode },
7968 { "%XEvgf2p8affineinvqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7969 },
7970 {
7971 /* VEX_W_0F3ADE */
7972 { VEX_LEN_TABLE (VEX_LEN_0F3ADE_W_0) },
7973 },
7974 {
7975 /* VEX_W_MAP7_F6_L_0 */
7976 { REG_TABLE (REG_VEX_MAP7_F6_L_0_W_0) },
7977 },
7978 {
7979 /* VEX_W_MAP7_F8_L_0 */
7980 { REG_TABLE (REG_VEX_MAP7_F8_L_0_W_0) },
7981 },
7982 /* VEX_W_XOP_08_85_L_0 */
7983 {
7984 { "vpmacssww", { XM, Vex, EXx, XMVexI4 }, 0 },
7985 },
7986 /* VEX_W_XOP_08_86_L_0 */
7987 {
7988 { "vpmacsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7989 },
7990 /* VEX_W_XOP_08_87_L_0 */
7991 {
7992 { "vpmacssdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7993 },
7994 /* VEX_W_XOP_08_8E_L_0 */
7995 {
7996 { "vpmacssdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7997 },
7998 /* VEX_W_XOP_08_8F_L_0 */
7999 {
8000 { "vpmacssdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
8001 },
8002 /* VEX_W_XOP_08_95_L_0 */
8003 {
8004 { "vpmacsww", { XM, Vex, EXx, XMVexI4 }, 0 },
8005 },
8006 /* VEX_W_XOP_08_96_L_0 */
8007 {
8008 { "vpmacswd", { XM, Vex, EXx, XMVexI4 }, 0 },
8009 },
8010 /* VEX_W_XOP_08_97_L_0 */
8011 {
8012 { "vpmacsdql", { XM, Vex, EXx, XMVexI4 }, 0 },
8013 },
8014 /* VEX_W_XOP_08_9E_L_0 */
8015 {
8016 { "vpmacsdd", { XM, Vex, EXx, XMVexI4 }, 0 },
8017 },
8018 /* VEX_W_XOP_08_9F_L_0 */
8019 {
8020 { "vpmacsdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
8021 },
8022 /* VEX_W_XOP_08_A6_L_0 */
8023 {
8024 { "vpmadcsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
8025 },
8026 /* VEX_W_XOP_08_B6_L_0 */
8027 {
8028 { "vpmadcswd", { XM, Vex, EXx, XMVexI4 }, 0 },
8029 },
8030 /* VEX_W_XOP_08_C0_L_0 */
8031 {
8032 { "vprotb", { XM, EXx, Ib }, 0 },
8033 },
8034 /* VEX_W_XOP_08_C1_L_0 */
8035 {
8036 { "vprotw", { XM, EXx, Ib }, 0 },
8037 },
8038 /* VEX_W_XOP_08_C2_L_0 */
8039 {
8040 { "vprotd", { XM, EXx, Ib }, 0 },
8041 },
8042 /* VEX_W_XOP_08_C3_L_0 */
8043 {
8044 { "vprotq", { XM, EXx, Ib }, 0 },
8045 },
8046 /* VEX_W_XOP_08_CC_L_0 */
8047 {
8048 { "vpcomb", { XM, Vex, EXx, VPCOM }, 0 },
8049 },
8050 /* VEX_W_XOP_08_CD_L_0 */
8051 {
8052 { "vpcomw", { XM, Vex, EXx, VPCOM }, 0 },
8053 },
8054 /* VEX_W_XOP_08_CE_L_0 */
8055 {
8056 { "vpcomd", { XM, Vex, EXx, VPCOM }, 0 },
8057 },
8058 /* VEX_W_XOP_08_CF_L_0 */
8059 {
8060 { "vpcomq", { XM, Vex, EXx, VPCOM }, 0 },
8061 },
8062 /* VEX_W_XOP_08_EC_L_0 */
8063 {
8064 { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
8065 },
8066 /* VEX_W_XOP_08_ED_L_0 */
8067 {
8068 { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
8069 },
8070 /* VEX_W_XOP_08_EE_L_0 */
8071 {
8072 { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
8073 },
8074 /* VEX_W_XOP_08_EF_L_0 */
8075 {
8076 { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
8077 },
8078 /* VEX_W_XOP_09_80 */
8079 {
8080 { "vfrczps", { XM, EXx }, 0 },
8081 },
8082 /* VEX_W_XOP_09_81 */
8083 {
8084 { "vfrczpd", { XM, EXx }, 0 },
8085 },
8086 /* VEX_W_XOP_09_82 */
8087 {
8088 { VEX_LEN_TABLE (VEX_LEN_XOP_09_82_W_0) },
8089 },
8090 /* VEX_W_XOP_09_83 */
8091 {
8092 { VEX_LEN_TABLE (VEX_LEN_XOP_09_83_W_0) },
8093 },
8094 /* VEX_W_XOP_09_C1_L_0 */
8095 {
8096 { "vphaddbw", { XM, EXxmm }, 0 },
8097 },
8098 /* VEX_W_XOP_09_C2_L_0 */
8099 {
8100 { "vphaddbd", { XM, EXxmm }, 0 },
8101 },
8102 /* VEX_W_XOP_09_C3_L_0 */
8103 {
8104 { "vphaddbq", { XM, EXxmm }, 0 },
8105 },
8106 /* VEX_W_XOP_09_C6_L_0 */
8107 {
8108 { "vphaddwd", { XM, EXxmm }, 0 },
8109 },
8110 /* VEX_W_XOP_09_C7_L_0 */
8111 {
8112 { "vphaddwq", { XM, EXxmm }, 0 },
8113 },
8114 /* VEX_W_XOP_09_CB_L_0 */
8115 {
8116 { "vphadddq", { XM, EXxmm }, 0 },
8117 },
8118 /* VEX_W_XOP_09_D1_L_0 */
8119 {
8120 { "vphaddubw", { XM, EXxmm }, 0 },
8121 },
8122 /* VEX_W_XOP_09_D2_L_0 */
8123 {
8124 { "vphaddubd", { XM, EXxmm }, 0 },
8125 },
8126 /* VEX_W_XOP_09_D3_L_0 */
8127 {
8128 { "vphaddubq", { XM, EXxmm }, 0 },
8129 },
8130 /* VEX_W_XOP_09_D6_L_0 */
8131 {
8132 { "vphadduwd", { XM, EXxmm }, 0 },
8133 },
8134 /* VEX_W_XOP_09_D7_L_0 */
8135 {
8136 { "vphadduwq", { XM, EXxmm }, 0 },
8137 },
8138 /* VEX_W_XOP_09_DB_L_0 */
8139 {
8140 { "vphaddudq", { XM, EXxmm }, 0 },
8141 },
8142 /* VEX_W_XOP_09_E1_L_0 */
8143 {
8144 { "vphsubbw", { XM, EXxmm }, 0 },
8145 },
8146 /* VEX_W_XOP_09_E2_L_0 */
8147 {
8148 { "vphsubwd", { XM, EXxmm }, 0 },
8149 },
8150 /* VEX_W_XOP_09_E3_L_0 */
8151 {
8152 { "vphsubdq", { XM, EXxmm }, 0 },
8153 },
8154
8155 #include "i386-dis-evex-w.h"
8156 };
8157
8158 static const struct dis386 mod_table[][2] = {
8159 {
8160 /* MOD_62_32BIT */
8161 { "bound{S|}", { Gv, Ma }, 0 },
8162 { EVEX_TABLE () },
8163 },
8164 {
8165 /* MOD_C4_32BIT */
8166 { "lesS", { Gv, Mp }, 0 },
8167 { VEX_C4_TABLE () },
8168 },
8169 {
8170 /* MOD_C5_32BIT */
8171 { "ldsS", { Gv, Mp }, 0 },
8172 { VEX_C5_TABLE () },
8173 },
8174 {
8175 /* MOD_0F01_REG_0 */
8176 { X86_64_TABLE (X86_64_0F01_REG_0) },
8177 { RM_TABLE (RM_0F01_REG_0) },
8178 },
8179 {
8180 /* MOD_0F01_REG_1 */
8181 { X86_64_TABLE (X86_64_0F01_REG_1) },
8182 { RM_TABLE (RM_0F01_REG_1) },
8183 },
8184 {
8185 /* MOD_0F01_REG_2 */
8186 { X86_64_TABLE (X86_64_0F01_REG_2) },
8187 { RM_TABLE (RM_0F01_REG_2) },
8188 },
8189 {
8190 /* MOD_0F01_REG_3 */
8191 { X86_64_TABLE (X86_64_0F01_REG_3) },
8192 { RM_TABLE (RM_0F01_REG_3) },
8193 },
8194 {
8195 /* MOD_0F01_REG_5 */
8196 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
8197 { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8198 },
8199 {
8200 /* MOD_0F01_REG_7 */
8201 { "invlpg", { Mb }, 0 },
8202 { RM_TABLE (RM_0F01_REG_7_MOD_3) },
8203 },
8204 {
8205 /* MOD_0F12_PREFIX_0 */
8206 { "%XEVmovlpYX", { XM, Vex, EXq }, 0 },
8207 { "%XEVmovhlpY%XS", { XM, Vex, EXq }, 0 },
8208 },
8209 {
8210 /* MOD_0F16_PREFIX_0 */
8211 { "%XEVmovhpYX", { XM, Vex, EXq }, 0 },
8212 { "%XEVmovlhpY%XS", { XM, Vex, EXq }, 0 },
8213 },
8214 {
8215 /* MOD_0F18_REG_0 */
8216 { "prefetchnta", { Mb }, 0 },
8217 { "nopQ", { Ev }, 0 },
8218 },
8219 {
8220 /* MOD_0F18_REG_1 */
8221 { "prefetcht0", { Mb }, 0 },
8222 { "nopQ", { Ev }, 0 },
8223 },
8224 {
8225 /* MOD_0F18_REG_2 */
8226 { "prefetcht1", { Mb }, 0 },
8227 { "nopQ", { Ev }, 0 },
8228 },
8229 {
8230 /* MOD_0F18_REG_3 */
8231 { "prefetcht2", { Mb }, 0 },
8232 { "nopQ", { Ev }, 0 },
8233 },
8234 {
8235 /* MOD_0F18_REG_6 */
8236 { X86_64_TABLE (X86_64_0F18_REG_6_MOD_0) },
8237 { "nopQ", { Ev }, 0 },
8238 },
8239 {
8240 /* MOD_0F18_REG_7 */
8241 { X86_64_TABLE (X86_64_0F18_REG_7_MOD_0) },
8242 { "nopQ", { Ev }, 0 },
8243 },
8244 {
8245 /* MOD_0F1A_PREFIX_0 */
8246 { "bndldx", { Gbnd, Mv_bnd }, 0 },
8247 { "nopQ", { Ev }, 0 },
8248 },
8249 {
8250 /* MOD_0F1B_PREFIX_0 */
8251 { "bndstx", { Mv_bnd, Gbnd }, 0 },
8252 { "nopQ", { Ev }, 0 },
8253 },
8254 {
8255 /* MOD_0F1B_PREFIX_1 */
8256 { "bndmk", { Gbnd, Mv_bnd }, 0 },
8257 { "nopQ", { Ev }, PREFIX_IGNORED },
8258 },
8259 {
8260 /* MOD_0F1C_PREFIX_0 */
8261 { REG_TABLE (REG_0F1C_P_0_MOD_0) },
8262 { "nopQ", { Ev }, 0 },
8263 },
8264 {
8265 /* MOD_0F1E_PREFIX_1 */
8266 { "nopQ", { Ev }, PREFIX_IGNORED },
8267 { REG_TABLE (REG_0F1E_P_1_MOD_3) },
8268 },
8269 {
8270 /* MOD_0FAE_REG_0 */
8271 { "fxsave", { FXSAVE }, 0 },
8272 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
8273 },
8274 {
8275 /* MOD_0FAE_REG_1 */
8276 { "fxrstor", { FXSAVE }, 0 },
8277 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
8278 },
8279 {
8280 /* MOD_0FAE_REG_2 */
8281 { "ldmxcsr", { Md }, 0 },
8282 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
8283 },
8284 {
8285 /* MOD_0FAE_REG_3 */
8286 { "stmxcsr", { Md }, 0 },
8287 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
8288 },
8289 {
8290 /* MOD_0FAE_REG_4 */
8291 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8292 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
8293 },
8294 {
8295 /* MOD_0FAE_REG_5 */
8296 { "xrstor", { FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL },
8297 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
8298 },
8299 {
8300 /* MOD_0FAE_REG_6 */
8301 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8302 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
8303 },
8304 {
8305 /* MOD_0FAE_REG_7 */
8306 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8307 { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
8308 },
8309 {
8310 /* MOD_0FC7_REG_6 */
8311 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8312 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
8313 },
8314 {
8315 /* MOD_0FC7_REG_7 */
8316 { "vmptrst", { Mq }, 0 },
8317 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
8318 },
8319 {
8320 /* MOD_0F38DC_PREFIX_1 */
8321 { "aesenc128kl", { XM, M }, 0 },
8322 { "loadiwkey", { XM, EXx }, 0 },
8323 },
8324 /* MOD_0F38F8 */
8325 {
8326 { PREFIX_TABLE (PREFIX_0F38F8_M_0) },
8327 { X86_64_TABLE (X86_64_0F38F8_M_1) },
8328 },
8329 {
8330 /* MOD_VEX_0F3849_X86_64_L_0_W_0 */
8331 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0) },
8332 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_1) },
8333 },
8334
8335 #include "i386-dis-evex-mod.h"
8336 };
8337
8338 static const struct dis386 rm_table[][8] = {
8339 {
8340 /* RM_C6_REG_7 */
8341 { "xabort", { Skip_MODRM, Ib }, 0 },
8342 },
8343 {
8344 /* RM_C7_REG_7 */
8345 { "xbeginT", { Skip_MODRM, Jdqw }, 0 },
8346 },
8347 {
8348 /* RM_0F01_REG_0 */
8349 { "enclv", { Skip_MODRM }, 0 },
8350 { "vmcall", { Skip_MODRM }, 0 },
8351 { "vmlaunch", { Skip_MODRM }, 0 },
8352 { "vmresume", { Skip_MODRM }, 0 },
8353 { "vmxoff", { Skip_MODRM }, 0 },
8354 { "pconfig", { Skip_MODRM }, 0 },
8355 { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_6) },
8356 { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_7) },
8357 },
8358 {
8359 /* RM_0F01_REG_1 */
8360 { "monitor", { { OP_Monitor, 0 } }, 0 },
8361 { "mwait", { { OP_Mwait, 0 } }, 0 },
8362 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_2) },
8363 { "stac", { Skip_MODRM }, 0 },
8364 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4) },
8365 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5) },
8366 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6) },
8367 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7) },
8368 },
8369 {
8370 /* RM_0F01_REG_2 */
8371 { "xgetbv", { Skip_MODRM }, 0 },
8372 { "xsetbv", { Skip_MODRM }, 0 },
8373 { Bad_Opcode },
8374 { Bad_Opcode },
8375 { "vmfunc", { Skip_MODRM }, 0 },
8376 { "xend", { Skip_MODRM }, 0 },
8377 { "xtest", { Skip_MODRM }, 0 },
8378 { "enclu", { Skip_MODRM }, 0 },
8379 },
8380 {
8381 /* RM_0F01_REG_3 */
8382 { "vmrun", { Skip_MODRM }, 0 },
8383 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
8384 { "vmload", { Skip_MODRM }, 0 },
8385 { "vmsave", { Skip_MODRM }, 0 },
8386 { "stgi", { Skip_MODRM }, 0 },
8387 { "clgi", { Skip_MODRM }, 0 },
8388 { "skinit", { Skip_MODRM }, 0 },
8389 { "invlpga", { Skip_MODRM }, 0 },
8390 },
8391 {
8392 /* RM_0F01_REG_5_MOD_3 */
8393 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
8394 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
8395 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8396 { Bad_Opcode },
8397 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4) },
8398 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5) },
8399 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6) },
8400 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7) },
8401 },
8402 {
8403 /* RM_0F01_REG_7_MOD_3 */
8404 { "swapgs", { Skip_MODRM }, 0 },
8405 { "rdtscp", { Skip_MODRM }, 0 },
8406 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
8407 { "mwaitx", { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
8408 { "clzero", { Skip_MODRM }, 0 },
8409 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_5) },
8410 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6) },
8411 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7) },
8412 },
8413 {
8414 /* RM_0F1E_P_1_MOD_3_REG_7 */
8415 { "nopQ", { Ev }, PREFIX_IGNORED },
8416 { "nopQ", { Ev }, PREFIX_IGNORED },
8417 { "endbr64", { Skip_MODRM }, 0 },
8418 { "endbr32", { Skip_MODRM }, 0 },
8419 { "nopQ", { Ev }, PREFIX_IGNORED },
8420 { "nopQ", { Ev }, PREFIX_IGNORED },
8421 { "nopQ", { Ev }, PREFIX_IGNORED },
8422 { "nopQ", { Ev }, PREFIX_IGNORED },
8423 },
8424 {
8425 /* RM_0FAE_REG_6_MOD_3 */
8426 { "mfence", { Skip_MODRM }, 0 },
8427 },
8428 {
8429 /* RM_0FAE_REG_7_MOD_3 */
8430 { "sfence", { Skip_MODRM }, 0 },
8431 },
8432 {
8433 /* RM_0F3A0F_P_1_R_0 */
8434 { "hreset", { Skip_MODRM, Ib }, 0 },
8435 },
8436 {
8437 /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0 */
8438 { "tilerelease", { Skip_MODRM }, 0 },
8439 },
8440 {
8441 /* RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_3 */
8442 { "tilezero", { TMM, Skip_MODRM }, 0 },
8443 },
8444 };
8445
8446 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8447
8448 /* The values used here must be non-zero, fit in 'unsigned char', and not be
8449 in conflict with actual prefix opcodes. */
8450 #define REP_PREFIX 0x01
8451 #define XACQUIRE_PREFIX 0x02
8452 #define XRELEASE_PREFIX 0x03
8453 #define BND_PREFIX 0x04
8454 #define NOTRACK_PREFIX 0x05
8455
8456 static enum {
8457 ckp_okay,
8458 ckp_bogus,
8459 ckp_fetch_error,
8460 }
8461 ckprefix (instr_info *ins)
8462 {
8463 int i, length;
8464 uint8_t newrex;
8465
8466 i = 0;
8467 length = 0;
8468 /* The maximum instruction length is 15bytes. */
8469 while (length < MAX_CODE_LENGTH - 1)
8470 {
8471 if (!fetch_code (ins->info, ins->codep + 1))
8472 return ckp_fetch_error;
8473 newrex = 0;
8474 switch (*ins->codep)
8475 {
8476 /* REX prefixes family. */
8477 case 0x40:
8478 case 0x41:
8479 case 0x42:
8480 case 0x43:
8481 case 0x44:
8482 case 0x45:
8483 case 0x46:
8484 case 0x47:
8485 case 0x48:
8486 case 0x49:
8487 case 0x4a:
8488 case 0x4b:
8489 case 0x4c:
8490 case 0x4d:
8491 case 0x4e:
8492 case 0x4f:
8493 if (ins->address_mode == mode_64bit)
8494 newrex = *ins->codep;
8495 else
8496 return ckp_okay;
8497 ins->last_rex_prefix = i;
8498 break;
8499 /* REX2 must be the last prefix. */
8500 case REX2_OPCODE:
8501 if (ins->address_mode == mode_64bit)
8502 {
8503 if (ins->last_rex_prefix >= 0)
8504 return ckp_bogus;
8505
8506 ins->codep++;
8507 if (!fetch_code (ins->info, ins->codep + 1))
8508 return ckp_fetch_error;
8509 ins->rex2_payload = *ins->codep;
8510 ins->rex2 = ins->rex2_payload >> 4;
8511 ins->rex = (ins->rex2_payload & 0xf) | REX_OPCODE;
8512 ins->codep++;
8513 ins->last_rex2_prefix = i;
8514 ins->all_prefixes[i] = REX2_OPCODE;
8515 }
8516 return ckp_okay;
8517 case 0xf3:
8518 ins->prefixes |= PREFIX_REPZ;
8519 ins->last_repz_prefix = i;
8520 break;
8521 case 0xf2:
8522 ins->prefixes |= PREFIX_REPNZ;
8523 ins->last_repnz_prefix = i;
8524 break;
8525 case 0xf0:
8526 ins->prefixes |= PREFIX_LOCK;
8527 ins->last_lock_prefix = i;
8528 break;
8529 case 0x2e:
8530 ins->prefixes |= PREFIX_CS;
8531 ins->last_seg_prefix = i;
8532 if (ins->address_mode != mode_64bit)
8533 ins->active_seg_prefix = PREFIX_CS;
8534 break;
8535 case 0x36:
8536 ins->prefixes |= PREFIX_SS;
8537 ins->last_seg_prefix = i;
8538 if (ins->address_mode != mode_64bit)
8539 ins->active_seg_prefix = PREFIX_SS;
8540 break;
8541 case 0x3e:
8542 ins->prefixes |= PREFIX_DS;
8543 ins->last_seg_prefix = i;
8544 if (ins->address_mode != mode_64bit)
8545 ins->active_seg_prefix = PREFIX_DS;
8546 break;
8547 case 0x26:
8548 ins->prefixes |= PREFIX_ES;
8549 ins->last_seg_prefix = i;
8550 if (ins->address_mode != mode_64bit)
8551 ins->active_seg_prefix = PREFIX_ES;
8552 break;
8553 case 0x64:
8554 ins->prefixes |= PREFIX_FS;
8555 ins->last_seg_prefix = i;
8556 ins->active_seg_prefix = PREFIX_FS;
8557 break;
8558 case 0x65:
8559 ins->prefixes |= PREFIX_GS;
8560 ins->last_seg_prefix = i;
8561 ins->active_seg_prefix = PREFIX_GS;
8562 break;
8563 case 0x66:
8564 ins->prefixes |= PREFIX_DATA;
8565 ins->last_data_prefix = i;
8566 break;
8567 case 0x67:
8568 ins->prefixes |= PREFIX_ADDR;
8569 ins->last_addr_prefix = i;
8570 break;
8571 case FWAIT_OPCODE:
8572 /* fwait is really an instruction. If there are prefixes
8573 before the fwait, they belong to the fwait, *not* to the
8574 following instruction. */
8575 ins->fwait_prefix = i;
8576 if (ins->prefixes || ins->rex)
8577 {
8578 ins->prefixes |= PREFIX_FWAIT;
8579 ins->codep++;
8580 /* This ensures that the previous REX prefixes are noticed
8581 as unused prefixes, as in the return case below. */
8582 return ins->rex ? ckp_bogus : ckp_okay;
8583 }
8584 ins->prefixes = PREFIX_FWAIT;
8585 break;
8586 default:
8587 return ckp_okay;
8588 }
8589 /* Rex is ignored when followed by another prefix. */
8590 if (ins->rex)
8591 return ckp_bogus;
8592 if (*ins->codep != FWAIT_OPCODE)
8593 ins->all_prefixes[i++] = *ins->codep;
8594 ins->rex = newrex;
8595 ins->codep++;
8596 length++;
8597 }
8598 return ckp_bogus;
8599 }
8600
8601 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
8602 prefix byte. */
8603
8604 static const char *
8605 prefix_name (enum address_mode mode, uint8_t pref, int sizeflag)
8606 {
8607 static const char *rexes [16] =
8608 {
8609 "rex", /* 0x40 */
8610 "rex.B", /* 0x41 */
8611 "rex.X", /* 0x42 */
8612 "rex.XB", /* 0x43 */
8613 "rex.R", /* 0x44 */
8614 "rex.RB", /* 0x45 */
8615 "rex.RX", /* 0x46 */
8616 "rex.RXB", /* 0x47 */
8617 "rex.W", /* 0x48 */
8618 "rex.WB", /* 0x49 */
8619 "rex.WX", /* 0x4a */
8620 "rex.WXB", /* 0x4b */
8621 "rex.WR", /* 0x4c */
8622 "rex.WRB", /* 0x4d */
8623 "rex.WRX", /* 0x4e */
8624 "rex.WRXB", /* 0x4f */
8625 };
8626
8627 switch (pref)
8628 {
8629 /* REX prefixes family. */
8630 case 0x40:
8631 case 0x41:
8632 case 0x42:
8633 case 0x43:
8634 case 0x44:
8635 case 0x45:
8636 case 0x46:
8637 case 0x47:
8638 case 0x48:
8639 case 0x49:
8640 case 0x4a:
8641 case 0x4b:
8642 case 0x4c:
8643 case 0x4d:
8644 case 0x4e:
8645 case 0x4f:
8646 return rexes [pref - 0x40];
8647 case 0xf3:
8648 return "repz";
8649 case 0xf2:
8650 return "repnz";
8651 case 0xf0:
8652 return "lock";
8653 case 0x2e:
8654 return "cs";
8655 case 0x36:
8656 return "ss";
8657 case 0x3e:
8658 return "ds";
8659 case 0x26:
8660 return "es";
8661 case 0x64:
8662 return "fs";
8663 case 0x65:
8664 return "gs";
8665 case 0x66:
8666 return (sizeflag & DFLAG) ? "data16" : "data32";
8667 case 0x67:
8668 if (mode == mode_64bit)
8669 return (sizeflag & AFLAG) ? "addr32" : "addr64";
8670 else
8671 return (sizeflag & AFLAG) ? "addr16" : "addr32";
8672 case FWAIT_OPCODE:
8673 return "fwait";
8674 case REP_PREFIX:
8675 return "rep";
8676 case XACQUIRE_PREFIX:
8677 return "xacquire";
8678 case XRELEASE_PREFIX:
8679 return "xrelease";
8680 case BND_PREFIX:
8681 return "bnd";
8682 case NOTRACK_PREFIX:
8683 return "notrack";
8684 case REX2_OPCODE:
8685 return "rex2";
8686 default:
8687 return NULL;
8688 }
8689 }
8690
8691 void
8692 print_i386_disassembler_options (FILE *stream)
8693 {
8694 fprintf (stream, _("\n\
8695 The following i386/x86-64 specific disassembler options are supported for use\n\
8696 with the -M switch (multiple options should be separated by commas):\n"));
8697
8698 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
8699 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
8700 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
8701 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
8702 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
8703 fprintf (stream, _(" att-mnemonic (AT&T syntax only)\n"
8704 " Display instruction with AT&T mnemonic\n"));
8705 fprintf (stream, _(" intel-mnemonic (AT&T syntax only)\n"
8706 " Display instruction with Intel mnemonic\n"));
8707 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
8708 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
8709 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
8710 fprintf (stream, _(" data32 Assume 32bit data size\n"));
8711 fprintf (stream, _(" data16 Assume 16bit data size\n"));
8712 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
8713 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
8714 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
8715 }
8716
8717 /* Bad opcode. */
8718 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
8719
8720 /* Fetch error indicator. */
8721 static const struct dis386 err_opcode = { NULL, { XX }, 0 };
8722
8723 static const struct dis386 map7_f6_opcode = { VEX_LEN_TABLE (VEX_LEN_MAP7_F6) };
8724 static const struct dis386 map7_f8_opcode = { VEX_LEN_TABLE (VEX_LEN_MAP7_F8) };
8725
8726 /* Get a pointer to struct dis386 with a valid name. */
8727
8728 static const struct dis386 *
8729 get_valid_dis386 (const struct dis386 *dp, instr_info *ins)
8730 {
8731 int vindex, vex_table_index;
8732
8733 if (dp->name != NULL)
8734 return dp;
8735
8736 switch (dp->op[0].bytemode)
8737 {
8738 case USE_REG_TABLE:
8739 dp = ®_table[dp->op[1].bytemode][ins->modrm.reg];
8740 break;
8741
8742 case USE_MOD_TABLE:
8743 vindex = ins->modrm.mod == 0x3 ? 1 : 0;
8744 dp = &mod_table[dp->op[1].bytemode][vindex];
8745 break;
8746
8747 case USE_RM_TABLE:
8748 dp = &rm_table[dp->op[1].bytemode][ins->modrm.rm];
8749 break;
8750
8751 case USE_PREFIX_TABLE:
8752 use_prefix_table:
8753 if (ins->need_vex)
8754 {
8755 /* The prefix in VEX is implicit. */
8756 switch (ins->vex.prefix)
8757 {
8758 case 0:
8759 vindex = 0;
8760 break;
8761 case REPE_PREFIX_OPCODE:
8762 vindex = 1;
8763 break;
8764 case DATA_PREFIX_OPCODE:
8765 vindex = 2;
8766 break;
8767 case REPNE_PREFIX_OPCODE:
8768 vindex = 3;
8769 break;
8770 default:
8771 abort ();
8772 break;
8773 }
8774 }
8775 else
8776 {
8777 int last_prefix = -1;
8778 int prefix = 0;
8779 vindex = 0;
8780 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
8781 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
8782 last one wins. */
8783 if ((ins->prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
8784 {
8785 if (ins->last_repz_prefix > ins->last_repnz_prefix)
8786 {
8787 vindex = 1;
8788 prefix = PREFIX_REPZ;
8789 last_prefix = ins->last_repz_prefix;
8790 }
8791 else
8792 {
8793 vindex = 3;
8794 prefix = PREFIX_REPNZ;
8795 last_prefix = ins->last_repnz_prefix;
8796 }
8797
8798 /* Check if prefix should be ignored. */
8799 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
8800 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
8801 & prefix) != 0
8802 && !prefix_table[dp->op[1].bytemode][vindex].name)
8803 vindex = 0;
8804 }
8805
8806 if (vindex == 0 && (ins->prefixes & PREFIX_DATA) != 0)
8807 {
8808 vindex = 2;
8809 prefix = PREFIX_DATA;
8810 last_prefix = ins->last_data_prefix;
8811 }
8812
8813 if (vindex != 0)
8814 {
8815 ins->used_prefixes |= prefix;
8816 ins->all_prefixes[last_prefix] = 0;
8817 }
8818 }
8819 dp = &prefix_table[dp->op[1].bytemode][vindex];
8820 break;
8821
8822 case USE_X86_64_EVEX_FROM_VEX_TABLE:
8823 case USE_X86_64_EVEX_PFX_TABLE:
8824 case USE_X86_64_EVEX_W_TABLE:
8825 case USE_X86_64_EVEX_MEM_W_TABLE:
8826 ins->evex_type = evex_from_vex;
8827 /* EVEX from VEX instructions are 64-bit only and require that EVEX.z,
8828 EVEX.L'L, EVEX.b, and the lower 2 bits of EVEX.aaa must be 0. */
8829 if (ins->address_mode != mode_64bit
8830 || (ins->vex.mask_register_specifier & 0x3) != 0
8831 || ins->vex.ll != 0
8832 || ins->vex.zeroing != 0
8833 || ins->vex.b)
8834 return &bad_opcode;
8835
8836 if (dp->op[0].bytemode == USE_X86_64_EVEX_PFX_TABLE)
8837 goto use_prefix_table;
8838 if (dp->op[0].bytemode == USE_X86_64_EVEX_W_TABLE)
8839 goto use_vex_w_table;
8840 if (dp->op[0].bytemode == USE_X86_64_EVEX_MEM_W_TABLE)
8841 {
8842 if (ins->modrm.mod == 3)
8843 return &bad_opcode;
8844 goto use_vex_w_table;
8845 }
8846
8847 /* Fall through. */
8848 case USE_X86_64_TABLE:
8849 vindex = ins->address_mode == mode_64bit ? 1 : 0;
8850 dp = &x86_64_table[dp->op[1].bytemode][vindex];
8851 break;
8852
8853 case USE_3BYTE_TABLE:
8854 if (ins->last_rex2_prefix >= 0)
8855 return &err_opcode;
8856 if (!fetch_code (ins->info, ins->codep + 2))
8857 return &err_opcode;
8858 vindex = *ins->codep++;
8859 dp = &three_byte_table[dp->op[1].bytemode][vindex];
8860 ins->end_codep = ins->codep;
8861 if (!fetch_modrm (ins))
8862 return &err_opcode;
8863 break;
8864
8865 case USE_VEX_LEN_TABLE:
8866 if (!ins->need_vex)
8867 abort ();
8868
8869 switch (ins->vex.length)
8870 {
8871 case 128:
8872 vindex = 0;
8873 break;
8874 case 512:
8875 /* This allows re-using in particular table entries where only
8876 128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid. */
8877 if (ins->vex.evex)
8878 {
8879 case 256:
8880 vindex = 1;
8881 break;
8882 }
8883 /* Fall through. */
8884 default:
8885 abort ();
8886 break;
8887 }
8888
8889 dp = &vex_len_table[dp->op[1].bytemode][vindex];
8890 break;
8891
8892 case USE_EVEX_LEN_TABLE:
8893 if (!ins->vex.evex)
8894 abort ();
8895
8896 switch (ins->vex.length)
8897 {
8898 case 128:
8899 vindex = 0;
8900 break;
8901 case 256:
8902 vindex = 1;
8903 break;
8904 case 512:
8905 vindex = 2;
8906 break;
8907 default:
8908 abort ();
8909 break;
8910 }
8911
8912 dp = &evex_len_table[dp->op[1].bytemode][vindex];
8913 break;
8914
8915 case USE_XOP_8F_TABLE:
8916 if (!fetch_code (ins->info, ins->codep + 3))
8917 return &err_opcode;
8918 ins->rex = ~(*ins->codep >> 5) & 0x7;
8919
8920 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
8921 switch ((*ins->codep & 0x1f))
8922 {
8923 default:
8924 dp = &bad_opcode;
8925 return dp;
8926 case 0x8:
8927 vex_table_index = XOP_08;
8928 break;
8929 case 0x9:
8930 vex_table_index = XOP_09;
8931 break;
8932 case 0xa:
8933 vex_table_index = XOP_0A;
8934 break;
8935 }
8936 ins->codep++;
8937 ins->vex.w = *ins->codep & 0x80;
8938 if (ins->vex.w && ins->address_mode == mode_64bit)
8939 ins->rex |= REX_W;
8940
8941 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
8942 if (ins->address_mode != mode_64bit)
8943 {
8944 /* In 16/32-bit mode REX_B is silently ignored. */
8945 ins->rex &= ~REX_B;
8946 }
8947
8948 ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
8949 switch ((*ins->codep & 0x3))
8950 {
8951 case 0:
8952 break;
8953 case 1:
8954 ins->vex.prefix = DATA_PREFIX_OPCODE;
8955 break;
8956 case 2:
8957 ins->vex.prefix = REPE_PREFIX_OPCODE;
8958 break;
8959 case 3:
8960 ins->vex.prefix = REPNE_PREFIX_OPCODE;
8961 break;
8962 }
8963 ins->need_vex = 3;
8964 ins->codep++;
8965 vindex = *ins->codep++;
8966 dp = &xop_table[vex_table_index][vindex];
8967
8968 ins->end_codep = ins->codep;
8969 if (!fetch_modrm (ins))
8970 return &err_opcode;
8971
8972 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
8973 having to decode the bits for every otherwise valid encoding. */
8974 if (ins->vex.prefix)
8975 return &bad_opcode;
8976 break;
8977
8978 case USE_VEX_C4_TABLE:
8979 /* VEX prefix. */
8980 if (!fetch_code (ins->info, ins->codep + 3))
8981 return &err_opcode;
8982 ins->rex = ~(*ins->codep >> 5) & 0x7;
8983 switch ((*ins->codep & 0x1f))
8984 {
8985 default:
8986 dp = &bad_opcode;
8987 return dp;
8988 case 0x1:
8989 vex_table_index = VEX_0F;
8990 break;
8991 case 0x2:
8992 vex_table_index = VEX_0F38;
8993 break;
8994 case 0x3:
8995 vex_table_index = VEX_0F3A;
8996 break;
8997 case 0x7:
8998 vex_table_index = VEX_MAP7;
8999 break;
9000 }
9001 ins->codep++;
9002 ins->vex.w = *ins->codep & 0x80;
9003 if (ins->address_mode == mode_64bit)
9004 {
9005 if (ins->vex.w)
9006 ins->rex |= REX_W;
9007 }
9008 else
9009 {
9010 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9011 is ignored, other REX bits are 0 and the highest bit in
9012 VEX.vvvv is also ignored (but we mustn't clear it here). */
9013 ins->rex = 0;
9014 }
9015 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9016 ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9017 switch ((*ins->codep & 0x3))
9018 {
9019 case 0:
9020 break;
9021 case 1:
9022 ins->vex.prefix = DATA_PREFIX_OPCODE;
9023 break;
9024 case 2:
9025 ins->vex.prefix = REPE_PREFIX_OPCODE;
9026 break;
9027 case 3:
9028 ins->vex.prefix = REPNE_PREFIX_OPCODE;
9029 break;
9030 }
9031 ins->need_vex = 3;
9032 ins->codep++;
9033 vindex = *ins->codep++;
9034 ins->condition_code = vindex & 0xf;
9035 if (vex_table_index != VEX_MAP7)
9036 dp = &vex_table[vex_table_index][vindex];
9037 else if (vindex == 0xf6)
9038 dp = &map7_f6_opcode;
9039 else if (vindex == 0xf8)
9040 dp = &map7_f8_opcode;
9041 else
9042 dp = &bad_opcode;
9043 ins->end_codep = ins->codep;
9044 /* There is no MODRM byte for VEX0F 77. */
9045 if ((vex_table_index != VEX_0F || vindex != 0x77)
9046 && !fetch_modrm (ins))
9047 return &err_opcode;
9048 break;
9049
9050 case USE_VEX_C5_TABLE:
9051 /* VEX prefix. */
9052 if (!fetch_code (ins->info, ins->codep + 2))
9053 return &err_opcode;
9054 ins->rex = (*ins->codep & 0x80) ? 0 : REX_R;
9055
9056 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9057 VEX.vvvv is 1. */
9058 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9059 ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9060 switch ((*ins->codep & 0x3))
9061 {
9062 case 0:
9063 break;
9064 case 1:
9065 ins->vex.prefix = DATA_PREFIX_OPCODE;
9066 break;
9067 case 2:
9068 ins->vex.prefix = REPE_PREFIX_OPCODE;
9069 break;
9070 case 3:
9071 ins->vex.prefix = REPNE_PREFIX_OPCODE;
9072 break;
9073 }
9074 ins->need_vex = 2;
9075 ins->codep++;
9076 vindex = *ins->codep++;
9077 dp = &vex_table[VEX_0F][vindex];
9078 ins->end_codep = ins->codep;
9079 /* There is no MODRM byte for VEX 77. */
9080 if (vindex != 0x77 && !fetch_modrm (ins))
9081 return &err_opcode;
9082 break;
9083
9084 case USE_VEX_W_TABLE:
9085 use_vex_w_table:
9086 if (!ins->need_vex)
9087 abort ();
9088
9089 dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w];
9090 break;
9091
9092 case USE_EVEX_TABLE:
9093 ins->two_source_ops = false;
9094 /* EVEX prefix. */
9095 ins->vex.evex = true;
9096 if (!fetch_code (ins->info, ins->codep + 4))
9097 return &err_opcode;
9098 /* The first byte after 0x62. */
9099 if (*ins->codep & 0x8)
9100 ins->rex2 |= REX_B;
9101 if (!(*ins->codep & 0x10))
9102 ins->rex2 |= REX_R;
9103
9104 ins->rex = ~(*ins->codep >> 5) & 0x7;
9105 switch (*ins->codep & 0x7)
9106 {
9107 default:
9108 return &bad_opcode;
9109 case 0x1:
9110 vex_table_index = EVEX_0F;
9111 break;
9112 case 0x2:
9113 vex_table_index = EVEX_0F38;
9114 break;
9115 case 0x3:
9116 vex_table_index = EVEX_0F3A;
9117 break;
9118 case 0x4:
9119 vex_table_index = EVEX_MAP4;
9120 ins->evex_type = evex_from_legacy;
9121 if (ins->address_mode != mode_64bit)
9122 return &bad_opcode;
9123 ins->rex |= REX_OPCODE;
9124 break;
9125 case 0x5:
9126 vex_table_index = EVEX_MAP5;
9127 break;
9128 case 0x6:
9129 vex_table_index = EVEX_MAP6;
9130 break;
9131 case 0x7:
9132 vex_table_index = EVEX_MAP7;
9133 break;
9134 }
9135
9136 /* The second byte after 0x62. */
9137 ins->codep++;
9138 ins->vex.w = *ins->codep & 0x80;
9139 if (ins->vex.w && ins->address_mode == mode_64bit)
9140 ins->rex |= REX_W;
9141
9142 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9143
9144 if (!(*ins->codep & 0x4))
9145 ins->rex2 |= REX_X;
9146
9147 ins->vex.u = *ins->codep & 0x4;
9148
9149 switch ((*ins->codep & 0x3))
9150 {
9151 case 0:
9152 break;
9153 case 1:
9154 ins->vex.prefix = DATA_PREFIX_OPCODE;
9155 break;
9156 case 2:
9157 ins->vex.prefix = REPE_PREFIX_OPCODE;
9158 break;
9159 case 3:
9160 ins->vex.prefix = REPNE_PREFIX_OPCODE;
9161 break;
9162 }
9163
9164 /* The third byte after 0x62. */
9165 ins->codep++;
9166
9167 /* Remember the static rounding bits. */
9168 ins->vex.ll = (*ins->codep >> 5) & 3;
9169 ins->vex.b = *ins->codep & 0x10;
9170
9171 ins->vex.v = *ins->codep & 0x8;
9172 ins->vex.mask_register_specifier = *ins->codep & 0x7;
9173 ins->vex.scc = *ins->codep & 0xf;
9174 ins->vex.zeroing = *ins->codep & 0x80;
9175 /* Set the NF bit for EVEX-Promoted instructions, this bit will be cleared
9176 when it's an evex_default one. */
9177 ins->vex.nf = *ins->codep & 0x4;
9178
9179 if (ins->address_mode != mode_64bit)
9180 {
9181 /* Report bad for !evex_default and when two fixed values of evex
9182 change. */
9183 if (ins->evex_type != evex_default || (ins->rex2 & REX_B)
9184 || ((ins->rex2 & REX_X) && (ins->modrm.mod != 3)))
9185 return &bad_opcode;
9186 /* In 16/32-bit mode silently ignore following bits. */
9187 ins->rex &= ~REX_B;
9188 ins->rex2 &= ~REX_R;
9189 }
9190
9191 ins->need_vex = 4;
9192
9193 ins->codep++;
9194 vindex = *ins->codep++;
9195 ins->condition_code = vindex & 0xf;
9196 if (vex_table_index != EVEX_MAP7)
9197 dp = &evex_table[vex_table_index][vindex];
9198 else if (vindex == 0xf8)
9199 dp = &map7_f8_opcode;
9200 else if (vindex == 0xf6)
9201 dp = &map7_f6_opcode;
9202 else
9203 dp = &bad_opcode;
9204 ins->end_codep = ins->codep;
9205 if (!fetch_modrm (ins))
9206 return &err_opcode;
9207
9208 /* When modrm.mod != 3, the U bit is used by APX for bit X4.
9209 When modrm.mod == 3, the U bit is used by AVX10. The U bit and
9210 the b bit should not be zero at the same time. */
9211 if (ins->modrm.mod == 3 && !ins->vex.u && !ins->vex.b)
9212 return &bad_opcode;
9213
9214 /* Set vector length. For EVEX-promoted instructions, evex.ll == 0b00,
9215 which has the same encoding as vex.length == 128 and they can share
9216 the same processing with vex.length in OP_VEX. */
9217 if (ins->modrm.mod == 3 && ins->vex.b && ins->evex_type != evex_from_legacy)
9218 {
9219 if (ins->vex.u)
9220 ins->vex.length = 512;
9221 else
9222 ins->vex.length = 256;
9223 }
9224 else
9225 {
9226 switch (ins->vex.ll)
9227 {
9228 case 0x0:
9229 ins->vex.length = 128;
9230 break;
9231 case 0x1:
9232 ins->vex.length = 256;
9233 break;
9234 case 0x2:
9235 ins->vex.length = 512;
9236 break;
9237 default:
9238 return &bad_opcode;
9239 }
9240 }
9241 break;
9242
9243 case 0:
9244 dp = &bad_opcode;
9245 break;
9246
9247 default:
9248 abort ();
9249 }
9250
9251 if (dp->name != NULL)
9252 return dp;
9253 else
9254 return get_valid_dis386 (dp, ins);
9255 }
9256
9257 static bool
9258 get_sib (instr_info *ins, int sizeflag)
9259 {
9260 /* If modrm.mod == 3, operand must be register. */
9261 if (ins->need_modrm
9262 && ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
9263 && ins->modrm.mod != 3
9264 && ins->modrm.rm == 4)
9265 {
9266 if (!fetch_code (ins->info, ins->codep + 2))
9267 return false;
9268 ins->sib.index = (ins->codep[1] >> 3) & 7;
9269 ins->sib.scale = (ins->codep[1] >> 6) & 3;
9270 ins->sib.base = ins->codep[1] & 7;
9271 ins->has_sib = true;
9272 }
9273 else
9274 ins->has_sib = false;
9275
9276 return true;
9277 }
9278
9279 /* Like oappend_with_style (below) but always with text style. */
9280
9281 static void
9282 oappend (instr_info *ins, const char *s)
9283 {
9284 oappend_with_style (ins, s, dis_style_text);
9285 }
9286
9287 /* Like oappend (above), but S is a string starting with '%'. In
9288 Intel syntax, the '%' is elided. */
9289
9290 static void
9291 oappend_register (instr_info *ins, const char *s)
9292 {
9293 oappend_with_style (ins, s + ins->intel_syntax, dis_style_register);
9294 }
9295
9296 /* Wrap around a call to INS->info->fprintf_styled_func, printing FMT.
9297 STYLE is the default style to use in the fprintf_styled_func calls,
9298 however, FMT might include embedded style markers (see oappend_style),
9299 these embedded markers are not printed, but instead change the style
9300 used in the next fprintf_styled_func call. */
9301
9302 static void ATTRIBUTE_PRINTF_3
9303 i386_dis_printf (const disassemble_info *info, enum disassembler_style style,
9304 const char *fmt, ...)
9305 {
9306 va_list ap;
9307 enum disassembler_style curr_style = style;
9308 const char *start, *curr;
9309 char staging_area[50];
9310
9311 va_start (ap, fmt);
9312 /* In particular print_insn()'s processing of op_txt[] can hand rather long
9313 strings here. Bypass vsnprintf() in such cases to avoid capacity issues
9314 with the staging area. */
9315 if (strcmp (fmt, "%s"))
9316 {
9317 int res = vsnprintf (staging_area, sizeof (staging_area), fmt, ap);
9318
9319 va_end (ap);
9320
9321 if (res < 0)
9322 return;
9323
9324 if ((size_t) res >= sizeof (staging_area))
9325 abort ();
9326
9327 start = curr = staging_area;
9328 }
9329 else
9330 {
9331 start = curr = va_arg (ap, const char *);
9332 va_end (ap);
9333 }
9334
9335 do
9336 {
9337 if (*curr == '\0'
9338 || (*curr == STYLE_MARKER_CHAR
9339 && ISXDIGIT (*(curr + 1))
9340 && *(curr + 2) == STYLE_MARKER_CHAR))
9341 {
9342 /* Output content between our START position and CURR. */
9343 int len = curr - start;
9344 int n = (*info->fprintf_styled_func) (info->stream, curr_style,
9345 "%.*s", len, start);
9346 if (n < 0)
9347 break;
9348
9349 if (*curr == '\0')
9350 break;
9351
9352 /* Skip over the initial STYLE_MARKER_CHAR. */
9353 ++curr;
9354
9355 /* Update the CURR_STYLE. As there are less than 16 styles, it
9356 is possible, that if the input is corrupted in some way, that
9357 we might set CURR_STYLE to an invalid value. Don't worry
9358 though, we check for this situation. */
9359 if (*curr >= '0' && *curr <= '9')
9360 curr_style = (enum disassembler_style) (*curr - '0');
9361 else if (*curr >= 'a' && *curr <= 'f')
9362 curr_style = (enum disassembler_style) (*curr - 'a' + 10);
9363 else
9364 curr_style = dis_style_text;
9365
9366 /* Check for an invalid style having been selected. This should
9367 never happen, but it doesn't hurt to be a little paranoid. */
9368 if (curr_style > dis_style_comment_start)
9369 curr_style = dis_style_text;
9370
9371 /* Skip the hex character, and the closing STYLE_MARKER_CHAR. */
9372 curr += 2;
9373
9374 /* Reset the START to after the style marker. */
9375 start = curr;
9376 }
9377 else
9378 ++curr;
9379 }
9380 while (true);
9381 }
9382
9383 static int
9384 print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax)
9385 {
9386 const struct dis386 *dp;
9387 int i;
9388 int ret;
9389 char *op_txt[MAX_OPERANDS];
9390 int needcomma;
9391 bool intel_swap_2_3;
9392 int sizeflag, orig_sizeflag;
9393 const char *p;
9394 struct dis_private priv;
9395 int prefix_length;
9396 int op_count;
9397 instr_info ins = {
9398 .info = info,
9399 .intel_syntax = intel_syntax >= 0
9400 ? intel_syntax
9401 : (info->mach & bfd_mach_i386_intel_syntax) != 0,
9402 .intel_mnemonic = !SYSV386_COMPAT,
9403 .op_index[0 ... MAX_OPERANDS - 1] = -1,
9404 .start_pc = pc,
9405 .start_codep = priv.the_buffer,
9406 .codep = priv.the_buffer,
9407 .obufp = ins.obuf,
9408 .last_lock_prefix = -1,
9409 .last_repz_prefix = -1,
9410 .last_repnz_prefix = -1,
9411 .last_data_prefix = -1,
9412 .last_addr_prefix = -1,
9413 .last_rex_prefix = -1,
9414 .last_rex2_prefix = -1,
9415 .last_seg_prefix = -1,
9416 .fwait_prefix = -1,
9417 };
9418 char op_out[MAX_OPERANDS][MAX_OPERAND_BUFFER_SIZE];
9419
9420 priv.orig_sizeflag = AFLAG | DFLAG;
9421 if ((info->mach & bfd_mach_i386_i386) != 0)
9422 ins.address_mode = mode_32bit;
9423 else if (info->mach == bfd_mach_i386_i8086)
9424 {
9425 ins.address_mode = mode_16bit;
9426 priv.orig_sizeflag = 0;
9427 }
9428 else
9429 ins.address_mode = mode_64bit;
9430
9431 for (p = info->disassembler_options; p != NULL;)
9432 {
9433 if (startswith (p, "amd64"))
9434 ins.isa64 = amd64;
9435 else if (startswith (p, "intel64"))
9436 ins.isa64 = intel64;
9437 else if (startswith (p, "x86-64"))
9438 {
9439 ins.address_mode = mode_64bit;
9440 priv.orig_sizeflag |= AFLAG | DFLAG;
9441 }
9442 else if (startswith (p, "i386"))
9443 {
9444 ins.address_mode = mode_32bit;
9445 priv.orig_sizeflag |= AFLAG | DFLAG;
9446 }
9447 else if (startswith (p, "i8086"))
9448 {
9449 ins.address_mode = mode_16bit;
9450 priv.orig_sizeflag &= ~(AFLAG | DFLAG);
9451 }
9452 else if (startswith (p, "intel"))
9453 {
9454 if (startswith (p + 5, "-mnemonic"))
9455 ins.intel_mnemonic = true;
9456 else
9457 ins.intel_syntax = 1;
9458 }
9459 else if (startswith (p, "att"))
9460 {
9461 ins.intel_syntax = 0;
9462 if (startswith (p + 3, "-mnemonic"))
9463 ins.intel_mnemonic = false;
9464 }
9465 else if (startswith (p, "addr"))
9466 {
9467 if (ins.address_mode == mode_64bit)
9468 {
9469 if (p[4] == '3' && p[5] == '2')
9470 priv.orig_sizeflag &= ~AFLAG;
9471 else if (p[4] == '6' && p[5] == '4')
9472 priv.orig_sizeflag |= AFLAG;
9473 }
9474 else
9475 {
9476 if (p[4] == '1' && p[5] == '6')
9477 priv.orig_sizeflag &= ~AFLAG;
9478 else if (p[4] == '3' && p[5] == '2')
9479 priv.orig_sizeflag |= AFLAG;
9480 }
9481 }
9482 else if (startswith (p, "data"))
9483 {
9484 if (p[4] == '1' && p[5] == '6')
9485 priv.orig_sizeflag &= ~DFLAG;
9486 else if (p[4] == '3' && p[5] == '2')
9487 priv.orig_sizeflag |= DFLAG;
9488 }
9489 else if (startswith (p, "suffix"))
9490 priv.orig_sizeflag |= SUFFIX_ALWAYS;
9491
9492 p = strchr (p, ',');
9493 if (p != NULL)
9494 p++;
9495 }
9496
9497 if (ins.address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9498 {
9499 i386_dis_printf (info, dis_style_text, _("64-bit address is disabled"));
9500 return -1;
9501 }
9502
9503 if (ins.intel_syntax)
9504 {
9505 ins.open_char = '[';
9506 ins.close_char = ']';
9507 ins.separator_char = '+';
9508 ins.scale_char = '*';
9509 }
9510 else
9511 {
9512 ins.open_char = '(';
9513 ins.close_char = ')';
9514 ins.separator_char = ',';
9515 ins.scale_char = ',';
9516 }
9517
9518 /* The output looks better if we put 7 bytes on a line, since that
9519 puts most long word instructions on a single line. */
9520 info->bytes_per_line = 7;
9521
9522 info->private_data = &priv;
9523 priv.fetched = 0;
9524 priv.insn_start = pc;
9525
9526 for (i = 0; i < MAX_OPERANDS; ++i)
9527 {
9528 op_out[i][0] = 0;
9529 ins.op_out[i] = op_out[i];
9530 }
9531
9532 sizeflag = priv.orig_sizeflag;
9533
9534 switch (ckprefix (&ins))
9535 {
9536 case ckp_okay:
9537 break;
9538
9539 case ckp_bogus:
9540 /* Too many prefixes or unused REX prefixes. */
9541 for (i = 0;
9542 i < (int) ARRAY_SIZE (ins.all_prefixes) && ins.all_prefixes[i];
9543 i++)
9544 i386_dis_printf (info, dis_style_mnemonic, "%s%s",
9545 (i == 0 ? "" : " "),
9546 prefix_name (ins.address_mode, ins.all_prefixes[i],
9547 sizeflag));
9548 ret = i;
9549 goto out;
9550
9551 case ckp_fetch_error:
9552 goto fetch_error_out;
9553 }
9554
9555 ins.nr_prefixes = ins.codep - ins.start_codep;
9556
9557 if (!fetch_code (info, ins.codep + 1))
9558 {
9559 fetch_error_out:
9560 ret = fetch_error (&ins);
9561 goto out;
9562 }
9563
9564 ins.two_source_ops = (*ins.codep == 0x62 || *ins.codep == 0xc8);
9565
9566 if ((ins.prefixes & PREFIX_FWAIT)
9567 && (*ins.codep < 0xd8 || *ins.codep > 0xdf))
9568 {
9569 /* Handle ins.prefixes before fwait. */
9570 for (i = 0; i < ins.fwait_prefix && ins.all_prefixes[i];
9571 i++)
9572 i386_dis_printf (info, dis_style_mnemonic, "%s ",
9573 prefix_name (ins.address_mode, ins.all_prefixes[i],
9574 sizeflag));
9575 i386_dis_printf (info, dis_style_mnemonic, "fwait");
9576 ret = i + 1;
9577 goto out;
9578 }
9579
9580 /* REX2.M in rex2 prefix represents map0 or map1. */
9581 if (ins.last_rex2_prefix < 0 ? *ins.codep == 0x0f : (ins.rex2 & REX2_M))
9582 {
9583 if (!ins.rex2)
9584 {
9585 ins.codep++;
9586 if (!fetch_code (info, ins.codep + 1))
9587 goto fetch_error_out;
9588 }
9589
9590 dp = &dis386_twobyte[*ins.codep];
9591 ins.need_modrm = twobyte_has_modrm[*ins.codep];
9592 }
9593 else
9594 {
9595 dp = &dis386[*ins.codep];
9596 ins.need_modrm = onebyte_has_modrm[*ins.codep];
9597 }
9598 ins.condition_code = *ins.codep & 0xf;
9599 ins.codep++;
9600
9601 /* Save sizeflag for printing the extra ins.prefixes later before updating
9602 it for mnemonic and operand processing. The prefix names depend
9603 only on the address mode. */
9604 orig_sizeflag = sizeflag;
9605 if (ins.prefixes & PREFIX_ADDR)
9606 sizeflag ^= AFLAG;
9607 if ((ins.prefixes & PREFIX_DATA))
9608 sizeflag ^= DFLAG;
9609
9610 ins.end_codep = ins.codep;
9611 if (ins.need_modrm && !fetch_modrm (&ins))
9612 goto fetch_error_out;
9613
9614 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
9615 {
9616 if (!get_sib (&ins, sizeflag)
9617 || !dofloat (&ins, sizeflag))
9618 goto fetch_error_out;
9619 }
9620 else
9621 {
9622 dp = get_valid_dis386 (dp, &ins);
9623 if (dp == &err_opcode)
9624 goto fetch_error_out;
9625
9626 /* For APX instructions promoted from legacy maps 0/1, embedded prefix
9627 is interpreted as the operand size override. */
9628 if (ins.evex_type == evex_from_legacy
9629 && ins.vex.prefix == DATA_PREFIX_OPCODE)
9630 sizeflag ^= DFLAG;
9631
9632 if(ins.evex_type == evex_default)
9633 ins.vex.nf = false;
9634 else
9635 /* For EVEX-promoted formats, we need to clear EVEX.NF (ccmp and ctest
9636 are cleared separately.) in mask_register_specifier and keep the low
9637 2 bits of mask_register_specifier to report errors for invalid cases
9638 . */
9639 ins.vex.mask_register_specifier &= 0x3;
9640
9641 if (dp != NULL && putop (&ins, dp->name, sizeflag) == 0)
9642 {
9643 if (!get_sib (&ins, sizeflag))
9644 goto fetch_error_out;
9645 for (i = 0; i < MAX_OPERANDS; ++i)
9646 {
9647 ins.obufp = ins.op_out[i];
9648 ins.op_ad = MAX_OPERANDS - 1 - i;
9649 if (dp->op[i].rtn
9650 && !dp->op[i].rtn (&ins, dp->op[i].bytemode, sizeflag))
9651 goto fetch_error_out;
9652 /* For EVEX instruction after the last operand masking
9653 should be printed. */
9654 if (i == 0 && ins.vex.evex)
9655 {
9656 /* Don't print {%k0}. */
9657 if (ins.vex.mask_register_specifier)
9658 {
9659 const char *reg_name
9660 = att_names_mask[ins.vex.mask_register_specifier];
9661
9662 oappend (&ins, "{");
9663 oappend_register (&ins, reg_name);
9664 oappend (&ins, "}");
9665
9666 if (ins.vex.zeroing)
9667 oappend (&ins, "{z}");
9668 }
9669 else if (ins.vex.zeroing)
9670 {
9671 oappend (&ins, "{bad}");
9672 continue;
9673 }
9674
9675 /* Instructions with a mask register destination allow for
9676 zeroing-masking only (if any masking at all), which is
9677 _not_ expressed by EVEX.z. */
9678 if (ins.vex.zeroing && dp->op[0].bytemode == mask_mode)
9679 ins.illegal_masking = true;
9680
9681 /* S/G insns require a mask and don't allow
9682 zeroing-masking. */
9683 if ((dp->op[0].bytemode == vex_vsib_d_w_dq_mode
9684 || dp->op[0].bytemode == vex_vsib_q_w_dq_mode)
9685 && (ins.vex.mask_register_specifier == 0
9686 || ins.vex.zeroing))
9687 ins.illegal_masking = true;
9688
9689 if (ins.illegal_masking)
9690 oappend (&ins, "/(bad)");
9691 }
9692 }
9693 /* vex.nf is cleared after being consumed. */
9694 if (ins.vex.nf)
9695 oappend (&ins, "{bad-nf}");
9696
9697 /* Check whether rounding control was enabled for an insn not
9698 supporting it, when evex.b is not treated as evex.nd. */
9699 if (ins.modrm.mod == 3 && ins.vex.b && ins.evex_type == evex_default
9700 && !(ins.evex_used & EVEX_b_used))
9701 {
9702 for (i = 0; i < MAX_OPERANDS; ++i)
9703 {
9704 ins.obufp = ins.op_out[i];
9705 if (*ins.obufp)
9706 continue;
9707 oappend (&ins, names_rounding[ins.vex.ll]);
9708 oappend (&ins, "bad}");
9709 break;
9710 }
9711 }
9712 }
9713 }
9714
9715 /* Clear instruction information. */
9716 info->insn_info_valid = 0;
9717 info->branch_delay_insns = 0;
9718 info->data_size = 0;
9719 info->insn_type = dis_noninsn;
9720 info->target = 0;
9721 info->target2 = 0;
9722
9723 /* Reset jump operation indicator. */
9724 ins.op_is_jump = false;
9725 {
9726 int jump_detection = 0;
9727
9728 /* Extract flags. */
9729 for (i = 0; i < MAX_OPERANDS; ++i)
9730 {
9731 if ((dp->op[i].rtn == OP_J)
9732 || (dp->op[i].rtn == OP_indirE))
9733 jump_detection |= 1;
9734 else if ((dp->op[i].rtn == BND_Fixup)
9735 || (!dp->op[i].rtn && !dp->op[i].bytemode))
9736 jump_detection |= 2;
9737 else if ((dp->op[i].bytemode == cond_jump_mode)
9738 || (dp->op[i].bytemode == loop_jcxz_mode))
9739 jump_detection |= 4;
9740 }
9741
9742 /* Determine if this is a jump or branch. */
9743 if ((jump_detection & 0x3) == 0x3)
9744 {
9745 ins.op_is_jump = true;
9746 if (jump_detection & 0x4)
9747 info->insn_type = dis_condbranch;
9748 else
9749 info->insn_type = (dp->name && !strncmp (dp->name, "call", 4))
9750 ? dis_jsr : dis_branch;
9751 }
9752 }
9753 /* The purpose of placing the check here is to wait for the EVEX prefix for
9754 conditional CMP and TEST to be consumed and cleared, and then make a
9755 unified judgment. Because they are both in map4, we can not distinguish
9756 EVEX prefix for conditional CMP and TEST from others during the
9757 EVEX prefix stage of parsing. */
9758 if (ins.evex_type == evex_from_legacy)
9759 {
9760 /* EVEX from legacy instructions, when the EVEX.ND bit is 0,
9761 all bits of EVEX.vvvv and EVEX.V' must be 1. */
9762 if (!ins.vex.nd && (ins.vex.register_specifier || !ins.vex.v))
9763 {
9764 i386_dis_printf (info, dis_style_text, "(bad)");
9765 ret = ins.end_codep - priv.the_buffer;
9766 goto out;
9767 }
9768
9769 /* EVEX from legacy instructions require that EVEX.z, EVEX.LL and the
9770 lower 2 bits of EVEX.aaa must be 0. */
9771 if ((ins.vex.mask_register_specifier & 0x3) != 0
9772 || ins.vex.ll != 0 || ins.vex.zeroing != 0)
9773 {
9774 i386_dis_printf (info, dis_style_text, "(bad)");
9775 ret = ins.end_codep - priv.the_buffer;
9776 goto out;
9777 }
9778 }
9779 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
9780 are all 0s in inverted form. */
9781 if (ins.need_vex && ins.vex.register_specifier != 0)
9782 {
9783 i386_dis_printf (info, dis_style_text, "(bad)");
9784 ret = ins.end_codep - priv.the_buffer;
9785 goto out;
9786 }
9787
9788 if ((dp->prefix_requirement & PREFIX_REX2_ILLEGAL)
9789 && ins.last_rex2_prefix >= 0 && (ins.rex2 & REX2_SPECIAL) == 0)
9790 {
9791 i386_dis_printf (info, dis_style_text, "(bad)");
9792 ret = ins.end_codep - priv.the_buffer;
9793 goto out;
9794 }
9795
9796 switch (dp->prefix_requirement & ~PREFIX_REX2_ILLEGAL)
9797 {
9798 case PREFIX_DATA:
9799 /* If only the data prefix is marked as mandatory, its absence renders
9800 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
9801 if (ins.need_vex ? !ins.vex.prefix : !(ins.prefixes & PREFIX_DATA))
9802 {
9803 i386_dis_printf (info, dis_style_text, "(bad)");
9804 ret = ins.end_codep - priv.the_buffer;
9805 goto out;
9806 }
9807 ins.used_prefixes |= PREFIX_DATA;
9808 /* Fall through. */
9809 case PREFIX_OPCODE:
9810 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
9811 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
9812 used by putop and MMX/SSE operand and may be overridden by the
9813 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
9814 separately. */
9815 if (((ins.need_vex
9816 ? ins.vex.prefix == REPE_PREFIX_OPCODE
9817 || ins.vex.prefix == REPNE_PREFIX_OPCODE
9818 : (ins.prefixes
9819 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
9820 && (ins.used_prefixes
9821 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
9822 || (((ins.need_vex
9823 ? ins.vex.prefix == DATA_PREFIX_OPCODE
9824 : ((ins.prefixes
9825 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
9826 == PREFIX_DATA))
9827 && (ins.used_prefixes & PREFIX_DATA) == 0))
9828 || (ins.vex.evex && dp->prefix_requirement != PREFIX_DATA
9829 && !ins.vex.w != !(ins.used_prefixes & PREFIX_DATA)))
9830 {
9831 i386_dis_printf (info, dis_style_text, "(bad)");
9832 ret = ins.end_codep - priv.the_buffer;
9833 goto out;
9834 }
9835 break;
9836
9837 case PREFIX_IGNORED:
9838 /* Zap data size and rep prefixes from used_prefixes and reinstate their
9839 origins in all_prefixes. */
9840 ins.used_prefixes &= ~PREFIX_OPCODE;
9841 if (ins.last_data_prefix >= 0)
9842 ins.all_prefixes[ins.last_data_prefix] = 0x66;
9843 if (ins.last_repz_prefix >= 0)
9844 ins.all_prefixes[ins.last_repz_prefix] = 0xf3;
9845 if (ins.last_repnz_prefix >= 0)
9846 ins.all_prefixes[ins.last_repnz_prefix] = 0xf2;
9847 break;
9848
9849 case PREFIX_NP_OR_DATA:
9850 if (ins.vex.prefix == REPE_PREFIX_OPCODE
9851 || ins.vex.prefix == REPNE_PREFIX_OPCODE)
9852 {
9853 i386_dis_printf (info, dis_style_text, "(bad)");
9854 ret = ins.end_codep - priv.the_buffer;
9855 goto out;
9856 }
9857 break;
9858
9859 case NO_PREFIX:
9860 if (ins.vex.prefix)
9861 {
9862 i386_dis_printf (info, dis_style_text, "(bad)");
9863 ret = ins.end_codep - priv.the_buffer;
9864 goto out;
9865 }
9866 break;
9867 }
9868
9869 /* Check if the REX prefix is used. */
9870 if ((ins.rex ^ ins.rex_used) == 0
9871 && !ins.need_vex && ins.last_rex_prefix >= 0)
9872 ins.all_prefixes[ins.last_rex_prefix] = 0;
9873
9874 /* Check if the REX2 prefix is used. */
9875 if (ins.last_rex2_prefix >= 0
9876 && ((ins.rex2 & REX2_SPECIAL)
9877 || (((ins.rex2 & 7) ^ (ins.rex2_used & 7)) == 0
9878 && (ins.rex ^ ins.rex_used) == 0
9879 && (ins.rex2 & 7))))
9880 ins.all_prefixes[ins.last_rex2_prefix] = 0;
9881
9882 /* Check if the SEG prefix is used. */
9883 if ((ins.prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
9884 | PREFIX_FS | PREFIX_GS)) != 0
9885 && (ins.used_prefixes & ins.active_seg_prefix) != 0)
9886 ins.all_prefixes[ins.last_seg_prefix] = 0;
9887
9888 /* Check if the ADDR prefix is used. */
9889 if ((ins.prefixes & PREFIX_ADDR) != 0
9890 && (ins.used_prefixes & PREFIX_ADDR) != 0)
9891 ins.all_prefixes[ins.last_addr_prefix] = 0;
9892
9893 /* Check if the DATA prefix is used. */
9894 if ((ins.prefixes & PREFIX_DATA) != 0
9895 && (ins.used_prefixes & PREFIX_DATA) != 0
9896 && !ins.need_vex)
9897 ins.all_prefixes[ins.last_data_prefix] = 0;
9898
9899 /* Print the extra ins.prefixes. */
9900 prefix_length = 0;
9901 for (i = 0; i < (int) ARRAY_SIZE (ins.all_prefixes); i++)
9902 if (ins.all_prefixes[i])
9903 {
9904 const char *name = prefix_name (ins.address_mode, ins.all_prefixes[i],
9905 orig_sizeflag);
9906
9907 if (name == NULL)
9908 abort ();
9909 prefix_length += strlen (name) + 1;
9910 if (ins.all_prefixes[i] == REX2_OPCODE)
9911 i386_dis_printf (info, dis_style_mnemonic, "{%s 0x%x} ", name,
9912 (unsigned int) ins.rex2_payload);
9913 else
9914 i386_dis_printf (info, dis_style_mnemonic, "%s ", name);
9915 }
9916
9917 /* Check maximum code length. */
9918 if ((ins.codep - ins.start_codep) > MAX_CODE_LENGTH)
9919 {
9920 i386_dis_printf (info, dis_style_text, "(bad)");
9921 ret = MAX_CODE_LENGTH;
9922 goto out;
9923 }
9924
9925 /* Calculate the number of operands this instruction has. */
9926 op_count = 0;
9927 for (i = 0; i < MAX_OPERANDS; ++i)
9928 if (*ins.op_out[i] != '\0')
9929 ++op_count;
9930
9931 /* Calculate the number of spaces to print after the mnemonic. */
9932 ins.obufp = ins.mnemonicendp;
9933 if (op_count > 0)
9934 {
9935 i = strlen (ins.obuf) + prefix_length;
9936 if (i < 7)
9937 i = 7 - i;
9938 else
9939 i = 1;
9940 }
9941 else
9942 i = 0;
9943
9944 /* Print the instruction mnemonic along with any trailing whitespace. */
9945 i386_dis_printf (info, dis_style_mnemonic, "%s%*s", ins.obuf, i, "");
9946
9947 /* The enter and bound instructions are printed with operands in the same
9948 order as the intel book; everything else is printed in reverse order. */
9949 intel_swap_2_3 = false;
9950 if (ins.intel_syntax || ins.two_source_ops)
9951 {
9952 for (i = 0; i < MAX_OPERANDS; ++i)
9953 op_txt[i] = ins.op_out[i];
9954
9955 if (ins.intel_syntax && dp && dp->op[2].rtn == OP_Rounding
9956 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
9957 {
9958 op_txt[2] = ins.op_out[3];
9959 op_txt[3] = ins.op_out[2];
9960 intel_swap_2_3 = true;
9961 }
9962
9963 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
9964 {
9965 bool riprel;
9966
9967 ins.op_ad = ins.op_index[i];
9968 ins.op_index[i] = ins.op_index[MAX_OPERANDS - 1 - i];
9969 ins.op_index[MAX_OPERANDS - 1 - i] = ins.op_ad;
9970 riprel = ins.op_riprel[i];
9971 ins.op_riprel[i] = ins.op_riprel[MAX_OPERANDS - 1 - i];
9972 ins.op_riprel[MAX_OPERANDS - 1 - i] = riprel;
9973 }
9974 }
9975 else
9976 {
9977 for (i = 0; i < MAX_OPERANDS; ++i)
9978 op_txt[MAX_OPERANDS - 1 - i] = ins.op_out[i];
9979 }
9980
9981 needcomma = 0;
9982 for (i = 0; i < MAX_OPERANDS; ++i)
9983 if (*op_txt[i])
9984 {
9985 /* In Intel syntax embedded rounding / SAE are not separate operands.
9986 Instead they're attached to the prior register operand. Simply
9987 suppress emission of the comma to achieve that effect. */
9988 switch (i & -(ins.intel_syntax && dp))
9989 {
9990 case 2:
9991 if (dp->op[2].rtn == OP_Rounding && !intel_swap_2_3)
9992 needcomma = 0;
9993 break;
9994 case 3:
9995 if (dp->op[3].rtn == OP_Rounding || intel_swap_2_3)
9996 needcomma = 0;
9997 break;
9998 }
9999 if (needcomma)
10000 i386_dis_printf (info, dis_style_text, ",");
10001 if (ins.op_index[i] != -1 && !ins.op_riprel[i])
10002 {
10003 bfd_vma target = (bfd_vma) ins.op_address[ins.op_index[i]];
10004
10005 if (ins.op_is_jump)
10006 {
10007 info->insn_info_valid = 1;
10008 info->branch_delay_insns = 0;
10009 info->data_size = 0;
10010 info->target = target;
10011 info->target2 = 0;
10012 }
10013 (*info->print_address_func) (target, info);
10014 }
10015 else
10016 i386_dis_printf (info, dis_style_text, "%s", op_txt[i]);
10017 needcomma = 1;
10018 }
10019
10020 for (i = 0; i < MAX_OPERANDS; i++)
10021 if (ins.op_index[i] != -1 && ins.op_riprel[i])
10022 {
10023 i386_dis_printf (info, dis_style_comment_start, " # ");
10024 (*info->print_address_func)
10025 ((bfd_vma)(ins.start_pc + (ins.codep - ins.start_codep)
10026 + ins.op_address[ins.op_index[i]]),
10027 info);
10028 break;
10029 }
10030 ret = ins.codep - priv.the_buffer;
10031 out:
10032 info->private_data = NULL;
10033 return ret;
10034 }
10035
10036 /* Here for backwards compatibility. When gdb stops using
10037 print_insn_i386_att and print_insn_i386_intel these functions can
10038 disappear, and print_insn_i386 be merged into print_insn. */
10039 int
10040 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10041 {
10042 return print_insn (pc, info, 0);
10043 }
10044
10045 int
10046 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10047 {
10048 return print_insn (pc, info, 1);
10049 }
10050
10051 int
10052 print_insn_i386 (bfd_vma pc, disassemble_info *info)
10053 {
10054 return print_insn (pc, info, -1);
10055 }
10056
10057 static const char *float_mem[] = {
10058 /* d8 */
10059 "fadd{s|}",
10060 "fmul{s|}",
10061 "fcom{s|}",
10062 "fcomp{s|}",
10063 "fsub{s|}",
10064 "fsubr{s|}",
10065 "fdiv{s|}",
10066 "fdivr{s|}",
10067 /* d9 */
10068 "fld{s|}",
10069 "(bad)",
10070 "fst{s|}",
10071 "fstp{s|}",
10072 "fldenv{C|C}",
10073 "fldcw",
10074 "fNstenv{C|C}",
10075 "fNstcw",
10076 /* da */
10077 "fiadd{l|}",
10078 "fimul{l|}",
10079 "ficom{l|}",
10080 "ficomp{l|}",
10081 "fisub{l|}",
10082 "fisubr{l|}",
10083 "fidiv{l|}",
10084 "fidivr{l|}",
10085 /* db */
10086 "fild{l|}",
10087 "fisttp{l|}",
10088 "fist{l|}",
10089 "fistp{l|}",
10090 "(bad)",
10091 "fld{t|}",
10092 "(bad)",
10093 "fstp{t|}",
10094 /* dc */
10095 "fadd{l|}",
10096 "fmul{l|}",
10097 "fcom{l|}",
10098 "fcomp{l|}",
10099 "fsub{l|}",
10100 "fsubr{l|}",
10101 "fdiv{l|}",
10102 "fdivr{l|}",
10103 /* dd */
10104 "fld{l|}",
10105 "fisttp{ll|}",
10106 "fst{l||}",
10107 "fstp{l|}",
10108 "frstor{C|C}",
10109 "(bad)",
10110 "fNsave{C|C}",
10111 "fNstsw",
10112 /* de */
10113 "fiadd{s|}",
10114 "fimul{s|}",
10115 "ficom{s|}",
10116 "ficomp{s|}",
10117 "fisub{s|}",
10118 "fisubr{s|}",
10119 "fidiv{s|}",
10120 "fidivr{s|}",
10121 /* df */
10122 "fild{s|}",
10123 "fisttp{s|}",
10124 "fist{s|}",
10125 "fistp{s|}",
10126 "fbld",
10127 "fild{ll|}",
10128 "fbstp",
10129 "fistp{ll|}",
10130 };
10131
10132 static const unsigned char float_mem_mode[] = {
10133 /* d8 */
10134 d_mode,
10135 d_mode,
10136 d_mode,
10137 d_mode,
10138 d_mode,
10139 d_mode,
10140 d_mode,
10141 d_mode,
10142 /* d9 */
10143 d_mode,
10144 0,
10145 d_mode,
10146 d_mode,
10147 0,
10148 w_mode,
10149 0,
10150 w_mode,
10151 /* da */
10152 d_mode,
10153 d_mode,
10154 d_mode,
10155 d_mode,
10156 d_mode,
10157 d_mode,
10158 d_mode,
10159 d_mode,
10160 /* db */
10161 d_mode,
10162 d_mode,
10163 d_mode,
10164 d_mode,
10165 0,
10166 t_mode,
10167 0,
10168 t_mode,
10169 /* dc */
10170 q_mode,
10171 q_mode,
10172 q_mode,
10173 q_mode,
10174 q_mode,
10175 q_mode,
10176 q_mode,
10177 q_mode,
10178 /* dd */
10179 q_mode,
10180 q_mode,
10181 q_mode,
10182 q_mode,
10183 0,
10184 0,
10185 0,
10186 w_mode,
10187 /* de */
10188 w_mode,
10189 w_mode,
10190 w_mode,
10191 w_mode,
10192 w_mode,
10193 w_mode,
10194 w_mode,
10195 w_mode,
10196 /* df */
10197 w_mode,
10198 w_mode,
10199 w_mode,
10200 w_mode,
10201 t_mode,
10202 q_mode,
10203 t_mode,
10204 q_mode
10205 };
10206
10207 #define ST { OP_ST, 0 }
10208 #define STi { OP_STi, 0 }
10209
10210 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10211 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10212 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10213 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10214 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10215 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
10216 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10217 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
10218 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10219
10220 static const struct dis386 float_reg[][8] = {
10221 /* d8 */
10222 {
10223 { "fadd", { ST, STi }, 0 },
10224 { "fmul", { ST, STi }, 0 },
10225 { "fcom", { STi }, 0 },
10226 { "fcomp", { STi }, 0 },
10227 { "fsub", { ST, STi }, 0 },
10228 { "fsubr", { ST, STi }, 0 },
10229 { "fdiv", { ST, STi }, 0 },
10230 { "fdivr", { ST, STi }, 0 },
10231 },
10232 /* d9 */
10233 {
10234 { "fld", { STi }, 0 },
10235 { "fxch", { STi }, 0 },
10236 { FGRPd9_2 },
10237 { Bad_Opcode },
10238 { FGRPd9_4 },
10239 { FGRPd9_5 },
10240 { FGRPd9_6 },
10241 { FGRPd9_7 },
10242 },
10243 /* da */
10244 {
10245 { "fcmovb", { ST, STi }, 0 },
10246 { "fcmove", { ST, STi }, 0 },
10247 { "fcmovbe",{ ST, STi }, 0 },
10248 { "fcmovu", { ST, STi }, 0 },
10249 { Bad_Opcode },
10250 { FGRPda_5 },
10251 { Bad_Opcode },
10252 { Bad_Opcode },
10253 },
10254 /* db */
10255 {
10256 { "fcmovnb",{ ST, STi }, 0 },
10257 { "fcmovne",{ ST, STi }, 0 },
10258 { "fcmovnbe",{ ST, STi }, 0 },
10259 { "fcmovnu",{ ST, STi }, 0 },
10260 { FGRPdb_4 },
10261 { "fucomi", { ST, STi }, 0 },
10262 { "fcomi", { ST, STi }, 0 },
10263 { Bad_Opcode },
10264 },
10265 /* dc */
10266 {
10267 { "fadd", { STi, ST }, 0 },
10268 { "fmul", { STi, ST }, 0 },
10269 { Bad_Opcode },
10270 { Bad_Opcode },
10271 { "fsub{!M|r}", { STi, ST }, 0 },
10272 { "fsub{M|}", { STi, ST }, 0 },
10273 { "fdiv{!M|r}", { STi, ST }, 0 },
10274 { "fdiv{M|}", { STi, ST }, 0 },
10275 },
10276 /* dd */
10277 {
10278 { "ffree", { STi }, 0 },
10279 { Bad_Opcode },
10280 { "fst", { STi }, 0 },
10281 { "fstp", { STi }, 0 },
10282 { "fucom", { STi }, 0 },
10283 { "fucomp", { STi }, 0 },
10284 { Bad_Opcode },
10285 { Bad_Opcode },
10286 },
10287 /* de */
10288 {
10289 { "faddp", { STi, ST }, 0 },
10290 { "fmulp", { STi, ST }, 0 },
10291 { Bad_Opcode },
10292 { FGRPde_3 },
10293 { "fsub{!M|r}p", { STi, ST }, 0 },
10294 { "fsub{M|}p", { STi, ST }, 0 },
10295 { "fdiv{!M|r}p", { STi, ST }, 0 },
10296 { "fdiv{M|}p", { STi, ST }, 0 },
10297 },
10298 /* df */
10299 {
10300 { "ffreep", { STi }, 0 },
10301 { Bad_Opcode },
10302 { Bad_Opcode },
10303 { Bad_Opcode },
10304 { FGRPdf_4 },
10305 { "fucomip", { ST, STi }, 0 },
10306 { "fcomip", { ST, STi }, 0 },
10307 { Bad_Opcode },
10308 },
10309 };
10310
10311 static const char *const fgrps[][8] = {
10312 /* Bad opcode 0 */
10313 {
10314 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10315 },
10316
10317 /* d9_2 1 */
10318 {
10319 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10320 },
10321
10322 /* d9_4 2 */
10323 {
10324 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10325 },
10326
10327 /* d9_5 3 */
10328 {
10329 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10330 },
10331
10332 /* d9_6 4 */
10333 {
10334 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10335 },
10336
10337 /* d9_7 5 */
10338 {
10339 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10340 },
10341
10342 /* da_5 6 */
10343 {
10344 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10345 },
10346
10347 /* db_4 7 */
10348 {
10349 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10350 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10351 },
10352
10353 /* de_3 8 */
10354 {
10355 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10356 },
10357
10358 /* df_4 9 */
10359 {
10360 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10361 },
10362 };
10363
10364 static const char *const oszc_flags[16] = {
10365 " {dfv=}", " {dfv=cf}", " {dfv=zf}", " {dfv=zf, cf}", " {dfv=sf}",
10366 " {dfv=sf, cf}", " {dfv=sf, zf}", " {dfv=sf, zf, cf}", " {dfv=of}",
10367 " {dfv=of, cf}", " {dfv=of, zf}", " {dfv=of, zf, cf}", " {dfv=of, sf}",
10368 " {dfv=of, sf, cf}", " {dfv=of, sf, zf}", " {dfv=of, sf, zf, cf}"
10369 };
10370
10371 static const char *const scc_suffix[16] = {
10372 "o", "no", "b", "ae", "e", "ne", "be", "a", "s", "ns", "t", "f",
10373 "l", "ge", "le", "g"
10374 };
10375
10376 static void
10377 swap_operand (instr_info *ins)
10378 {
10379 char *p = ins->mnemonicendp;
10380
10381 if (p[-1] == '}')
10382 {
10383 while (*--p != '{')
10384 {
10385 if (p <= ins->obuf + 2)
10386 abort ();
10387 }
10388 if (p[-1] == ' ')
10389 --p;
10390 }
10391 memmove (p + 2, p, ins->mnemonicendp - p + 1);
10392 p[0] = '.';
10393 p[1] = 's';
10394 ins->mnemonicendp += 2;
10395 }
10396
10397 static bool
10398 dofloat (instr_info *ins, int sizeflag)
10399 {
10400 const struct dis386 *dp;
10401 unsigned char floatop = ins->codep[-1];
10402
10403 if (ins->modrm.mod != 3)
10404 {
10405 int fp_indx = (floatop - 0xd8) * 8 + ins->modrm.reg;
10406
10407 putop (ins, float_mem[fp_indx], sizeflag);
10408 ins->obufp = ins->op_out[0];
10409 ins->op_ad = 2;
10410 return OP_E (ins, float_mem_mode[fp_indx], sizeflag);
10411 }
10412 /* Skip mod/rm byte. */
10413 MODRM_CHECK;
10414 ins->codep++;
10415
10416 dp = &float_reg[floatop - 0xd8][ins->modrm.reg];
10417 if (dp->name == NULL)
10418 {
10419 putop (ins, fgrps[dp->op[0].bytemode][ins->modrm.rm], sizeflag);
10420
10421 /* Instruction fnstsw is only one with strange arg. */
10422 if (floatop == 0xdf && ins->codep[-1] == 0xe0)
10423 strcpy (ins->op_out[0], att_names16[0] + ins->intel_syntax);
10424 }
10425 else
10426 {
10427 putop (ins, dp->name, sizeflag);
10428
10429 ins->obufp = ins->op_out[0];
10430 ins->op_ad = 2;
10431 if (dp->op[0].rtn
10432 && !dp->op[0].rtn (ins, dp->op[0].bytemode, sizeflag))
10433 return false;
10434
10435 ins->obufp = ins->op_out[1];
10436 ins->op_ad = 1;
10437 if (dp->op[1].rtn
10438 && !dp->op[1].rtn (ins, dp->op[1].bytemode, sizeflag))
10439 return false;
10440 }
10441 return true;
10442 }
10443
10444 static bool
10445 OP_ST (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10446 int sizeflag ATTRIBUTE_UNUSED)
10447 {
10448 oappend_register (ins, "%st");
10449 return true;
10450 }
10451
10452 static bool
10453 OP_STi (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10454 int sizeflag ATTRIBUTE_UNUSED)
10455 {
10456 char scratch[8];
10457 int res = snprintf (scratch, ARRAY_SIZE (scratch), "%%st(%d)", ins->modrm.rm);
10458
10459 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
10460 abort ();
10461 oappend_register (ins, scratch);
10462 return true;
10463 }
10464
10465 /* Capital letters in template are macros. */
10466 static int
10467 putop (instr_info *ins, const char *in_template, int sizeflag)
10468 {
10469 const char *p;
10470 int alt = 0;
10471 int cond = 1;
10472 unsigned int l = 0, len = 0;
10473 char last[4];
10474 bool evex_printed = false;
10475
10476 /* We don't want to add any prefix or suffix to (bad), so return early. */
10477 if (!strncmp (in_template, "(bad)", 5))
10478 {
10479 oappend (ins, "(bad)");
10480 *ins->obufp = 0;
10481 ins->mnemonicendp = ins->obufp;
10482 return 0;
10483 }
10484
10485 for (p = in_template; *p; p++)
10486 {
10487 if (len > l)
10488 {
10489 if (l >= sizeof (last) || !ISUPPER (*p))
10490 abort ();
10491 last[l++] = *p;
10492 continue;
10493 }
10494 switch (*p)
10495 {
10496 default:
10497 if (ins->evex_type == evex_from_legacy && !ins->vex.nd
10498 && !(ins->rex2 & 7) && !evex_printed)
10499 {
10500 oappend (ins, "{evex} ");
10501 evex_printed = true;
10502 }
10503 *ins->obufp++ = *p;
10504 break;
10505 case '%':
10506 len++;
10507 break;
10508 case '!':
10509 cond = 0;
10510 break;
10511 case '{':
10512 if (ins->intel_syntax)
10513 {
10514 while (*++p != '|')
10515 if (*p == '}' || *p == '\0')
10516 abort ();
10517 alt = 1;
10518 }
10519 break;
10520 case '|':
10521 while (*++p != '}')
10522 {
10523 if (*p == '\0')
10524 abort ();
10525 }
10526 break;
10527 case '}':
10528 alt = 0;
10529 break;
10530 case 'A':
10531 if (ins->intel_syntax)
10532 break;
10533 if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd)
10534 || (sizeflag & SUFFIX_ALWAYS))
10535 *ins->obufp++ = 'b';
10536 break;
10537 case 'B':
10538 if (l == 0)
10539 {
10540 case_B:
10541 if (ins->intel_syntax)
10542 break;
10543 if (sizeflag & SUFFIX_ALWAYS)
10544 *ins->obufp++ = 'b';
10545 }
10546 else if (l == 1 && last[0] == 'L')
10547 {
10548 if (ins->address_mode == mode_64bit
10549 && !(ins->prefixes & PREFIX_ADDR))
10550 {
10551 *ins->obufp++ = 'a';
10552 *ins->obufp++ = 'b';
10553 *ins->obufp++ = 's';
10554 }
10555
10556 goto case_B;
10557 }
10558 else if (l && last[0] == 'X')
10559 {
10560 if (!ins->vex.w)
10561 oappend (ins, "bf16");
10562 else
10563 oappend (ins, "{bad}");
10564 }
10565 else
10566 abort ();
10567 break;
10568 case 'C':
10569 if (l == 1 && last[0] == 'C')
10570 {
10571 /* Condition code (taken from the map-0 Jcc entries). */
10572 for (const char *q = dis386[0x70 | ins->condition_code].name + 1;
10573 ISLOWER(*q); ++q)
10574 *ins->obufp++ = *q;
10575 break;
10576 }
10577 else if (l == 1 && last[0] == 'S')
10578 {
10579 /* Add scc suffix. */
10580 oappend (ins, scc_suffix[ins->vex.scc]);
10581
10582 /* For SCC insns, the ND bit is required to be set to 0. */
10583 if (ins->vex.nd)
10584 oappend (ins, "(bad)");
10585
10586 /* These bits have been consumed and should be cleared or restored
10587 to default values. */
10588 ins->vex.v = 1;
10589 ins->vex.nf = false;
10590 ins->vex.mask_register_specifier = 0;
10591 break;
10592 }
10593
10594 if (l)
10595 abort ();
10596 if (ins->intel_syntax && !alt)
10597 break;
10598 if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10599 {
10600 if (sizeflag & DFLAG)
10601 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10602 else
10603 *ins->obufp++ = ins->intel_syntax ? 'w' : 's';
10604 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10605 }
10606 break;
10607 case 'D':
10608 if (l == 1)
10609 {
10610 switch (last[0])
10611 {
10612 case 'X':
10613 if (!ins->vex.evex || ins->vex.w)
10614 *ins->obufp++ = 'd';
10615 else
10616 oappend (ins, "{bad}");
10617 break;
10618 default:
10619 abort ();
10620 }
10621 break;
10622 }
10623 if (l)
10624 abort ();
10625 if (ins->intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10626 break;
10627 USED_REX (REX_W);
10628 if (ins->modrm.mod == 3)
10629 {
10630 if (ins->rex & REX_W)
10631 *ins->obufp++ = 'q';
10632 else
10633 {
10634 if (sizeflag & DFLAG)
10635 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10636 else
10637 *ins->obufp++ = 'w';
10638 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10639 }
10640 }
10641 else
10642 *ins->obufp++ = 'w';
10643 break;
10644 case 'E':
10645 if (l == 1)
10646 {
10647 switch (last[0])
10648 {
10649 case 'M':
10650 if (ins->modrm.mod != 3)
10651 break;
10652 /* Fall through. */
10653 case 'X':
10654 if (!ins->vex.evex || ins->vex.b || ins->vex.ll >= 2
10655 || (ins->rex2 & 7)
10656 || (ins->modrm.mod == 3 && (ins->rex & REX_X))
10657 || !ins->vex.v || ins->vex.mask_register_specifier)
10658 break;
10659 /* AVX512 extends a number of V*D insns to also have V*Q variants,
10660 merely distinguished by EVEX.W. Look for a use of the
10661 respective macro. */
10662 if (ins->vex.w)
10663 {
10664 const char *pct = strchr (p + 1, '%');
10665
10666 if (pct != NULL && pct[1] == 'D' && pct[2] == 'Q')
10667 break;
10668 }
10669 *ins->obufp++ = '{';
10670 *ins->obufp++ = 'e';
10671 *ins->obufp++ = 'v';
10672 *ins->obufp++ = 'e';
10673 *ins->obufp++ = 'x';
10674 *ins->obufp++ = '}';
10675 *ins->obufp++ = ' ';
10676 break;
10677 case 'N':
10678 /* Skip printing {evex} for some special instructions in MAP4. */
10679 evex_printed = true;
10680 break;
10681 default:
10682 abort ();
10683 }
10684 break;
10685 }
10686 /* For jcxz/jecxz */
10687 if (ins->address_mode == mode_64bit)
10688 {
10689 if (sizeflag & AFLAG)
10690 *ins->obufp++ = 'r';
10691 else
10692 *ins->obufp++ = 'e';
10693 }
10694 else
10695 if (sizeflag & AFLAG)
10696 *ins->obufp++ = 'e';
10697 ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
10698 break;
10699 case 'F':
10700 if (l == 0)
10701 {
10702 if (ins->intel_syntax)
10703 break;
10704 if ((ins->prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
10705 {
10706 if (sizeflag & AFLAG)
10707 *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
10708 else
10709 *ins->obufp++ = ins->address_mode == mode_64bit ? 'l' : 'w';
10710 ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
10711 }
10712 }
10713 else if (l == 1 && last[0] == 'C')
10714 {
10715 if (ins->vex.nd && !ins->vex.nf)
10716 break;
10717 *ins->obufp++ = 'c';
10718 *ins->obufp++ = 'f';
10719 /* Skip printing {evex} */
10720 evex_printed = true;
10721 }
10722 else if (l == 1 && last[0] == 'N')
10723 {
10724 if (ins->vex.nf)
10725 {
10726 oappend (ins, "{nf} ");
10727 /* This bit needs to be cleared after it is consumed. */
10728 ins->vex.nf = false;
10729 evex_printed = true;
10730 }
10731 else if (ins->evex_type == evex_from_vex && !(ins->rex2 & 7)
10732 && ins->vex.v)
10733 {
10734 oappend (ins, "{evex} ");
10735 evex_printed = true;
10736 }
10737 }
10738 else if (l == 1 && last[0] == 'D')
10739 {
10740 /* Get oszc flags value from register_specifier. */
10741 int oszc_value = ~ins->vex.register_specifier & 0xf;
10742
10743 /* Add {dfv=of, sf, zf, cf} flags. */
10744 oappend (ins, oszc_flags[oszc_value]);
10745
10746 /* These bits have been consumed and should be cleared. */
10747 ins->vex.register_specifier = 0;
10748 }
10749 else
10750 abort ();
10751 break;
10752 case 'G':
10753 if (ins->intel_syntax || (ins->obufp[-1] != 's'
10754 && !(sizeflag & SUFFIX_ALWAYS)))
10755 break;
10756 if ((ins->rex & REX_W) || (sizeflag & DFLAG))
10757 *ins->obufp++ = 'l';
10758 else
10759 *ins->obufp++ = 'w';
10760 if (!(ins->rex & REX_W))
10761 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10762 break;
10763 case 'H':
10764 if (l == 0)
10765 {
10766 if (ins->intel_syntax)
10767 break;
10768 if ((ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10769 || (ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10770 {
10771 ins->used_prefixes |= ins->prefixes & (PREFIX_CS | PREFIX_DS);
10772 *ins->obufp++ = ',';
10773 *ins->obufp++ = 'p';
10774
10775 /* Set active_seg_prefix even if not set in 64-bit mode
10776 because here it is a valid branch hint. */
10777 if (ins->prefixes & PREFIX_DS)
10778 {
10779 ins->active_seg_prefix = PREFIX_DS;
10780 *ins->obufp++ = 't';
10781 }
10782 else
10783 {
10784 ins->active_seg_prefix = PREFIX_CS;
10785 *ins->obufp++ = 'n';
10786 }
10787 }
10788 }
10789 else if (l == 1 && last[0] == 'X')
10790 {
10791 if (!ins->vex.w)
10792 *ins->obufp++ = 'h';
10793 else
10794 oappend (ins, "{bad}");
10795 }
10796 else
10797 abort ();
10798 break;
10799 case 'K':
10800 USED_REX (REX_W);
10801 if (ins->rex & REX_W)
10802 *ins->obufp++ = 'q';
10803 else
10804 *ins->obufp++ = 'd';
10805 break;
10806 case 'L':
10807 if (ins->intel_syntax)
10808 break;
10809 if (sizeflag & SUFFIX_ALWAYS)
10810 {
10811 if (ins->rex & REX_W)
10812 *ins->obufp++ = 'q';
10813 else
10814 *ins->obufp++ = 'l';
10815 }
10816 break;
10817 case 'M':
10818 if (ins->intel_mnemonic != cond)
10819 *ins->obufp++ = 'r';
10820 break;
10821 case 'N':
10822 if ((ins->prefixes & PREFIX_FWAIT) == 0)
10823 *ins->obufp++ = 'n';
10824 else
10825 ins->used_prefixes |= PREFIX_FWAIT;
10826 break;
10827 case 'O':
10828 USED_REX (REX_W);
10829 if (ins->rex & REX_W)
10830 *ins->obufp++ = 'o';
10831 else if (ins->intel_syntax && (sizeflag & DFLAG))
10832 *ins->obufp++ = 'q';
10833 else
10834 *ins->obufp++ = 'd';
10835 if (!(ins->rex & REX_W))
10836 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10837 break;
10838 case '@':
10839 if (ins->address_mode == mode_64bit
10840 && (ins->isa64 == intel64 || (ins->rex & REX_W)
10841 || !(ins->prefixes & PREFIX_DATA)))
10842 {
10843 if (sizeflag & SUFFIX_ALWAYS)
10844 *ins->obufp++ = 'q';
10845 break;
10846 }
10847 /* Fall through. */
10848 case 'P':
10849 if (l == 0)
10850 {
10851 if (!cond && ins->last_rex2_prefix >= 0 && (ins->rex & REX_W))
10852 {
10853 /* For pushp and popp, p is printed and do not print {rex2}
10854 for them. */
10855 *ins->obufp++ = 'p';
10856 ins->rex2 |= REX2_SPECIAL;
10857 break;
10858 }
10859
10860 /* For "!P" print nothing else in Intel syntax. */
10861 if (!cond && ins->intel_syntax)
10862 break;
10863
10864 if ((ins->modrm.mod == 3 || !cond)
10865 && !(sizeflag & SUFFIX_ALWAYS))
10866 break;
10867 /* Fall through. */
10868 case 'T':
10869 if ((!(ins->rex & REX_W) && (ins->prefixes & PREFIX_DATA))
10870 || ((sizeflag & SUFFIX_ALWAYS)
10871 && ins->address_mode != mode_64bit))
10872 {
10873 *ins->obufp++ = (sizeflag & DFLAG)
10874 ? ins->intel_syntax ? 'd' : 'l' : 'w';
10875 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10876 }
10877 else if (sizeflag & SUFFIX_ALWAYS)
10878 *ins->obufp++ = 'q';
10879 }
10880 else if (l == 1 && last[0] == 'L')
10881 {
10882 if ((ins->prefixes & PREFIX_DATA)
10883 || (ins->rex & REX_W)
10884 || (sizeflag & SUFFIX_ALWAYS))
10885 {
10886 USED_REX (REX_W);
10887 if (ins->rex & REX_W)
10888 *ins->obufp++ = 'q';
10889 else
10890 {
10891 if (sizeflag & DFLAG)
10892 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10893 else
10894 *ins->obufp++ = 'w';
10895 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10896 }
10897 }
10898 }
10899 else
10900 abort ();
10901 break;
10902 case 'Q':
10903 if (l == 0)
10904 {
10905 if (ins->intel_syntax && !alt)
10906 break;
10907 USED_REX (REX_W);
10908 if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd)
10909 || (sizeflag & SUFFIX_ALWAYS))
10910 {
10911 if (ins->rex & REX_W)
10912 *ins->obufp++ = 'q';
10913 else
10914 {
10915 if (sizeflag & DFLAG)
10916 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10917 else
10918 *ins->obufp++ = 'w';
10919 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10920 }
10921 }
10922 }
10923 else if (l == 1 && last[0] == 'D')
10924 *ins->obufp++ = ins->vex.w ? 'q' : 'd';
10925 else if (l == 1 && last[0] == 'L')
10926 {
10927 if (cond ? ins->modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
10928 : ins->address_mode != mode_64bit)
10929 break;
10930 if ((ins->rex & REX_W))
10931 {
10932 USED_REX (REX_W);
10933 *ins->obufp++ = 'q';
10934 }
10935 else if ((ins->address_mode == mode_64bit && cond)
10936 || (sizeflag & SUFFIX_ALWAYS))
10937 *ins->obufp++ = ins->intel_syntax? 'd' : 'l';
10938 }
10939 else
10940 abort ();
10941 break;
10942 case 'R':
10943 USED_REX (REX_W);
10944 if (ins->rex & REX_W)
10945 *ins->obufp++ = 'q';
10946 else if (sizeflag & DFLAG)
10947 {
10948 if (ins->intel_syntax)
10949 *ins->obufp++ = 'd';
10950 else
10951 *ins->obufp++ = 'l';
10952 }
10953 else
10954 *ins->obufp++ = 'w';
10955 if (ins->intel_syntax && !p[1]
10956 && ((ins->rex & REX_W) || (sizeflag & DFLAG)))
10957 *ins->obufp++ = 'e';
10958 if (!(ins->rex & REX_W))
10959 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10960 break;
10961 case 'S':
10962 if (l == 0)
10963 {
10964 case_S:
10965 if (ins->intel_syntax)
10966 break;
10967 if (sizeflag & SUFFIX_ALWAYS)
10968 {
10969 if (ins->rex & REX_W)
10970 *ins->obufp++ = 'q';
10971 else
10972 {
10973 if (sizeflag & DFLAG)
10974 *ins->obufp++ = 'l';
10975 else
10976 *ins->obufp++ = 'w';
10977 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10978 }
10979 }
10980 break;
10981 }
10982 if (l != 1)
10983 abort ();
10984 switch (last[0])
10985 {
10986 case 'L':
10987 if (ins->address_mode == mode_64bit
10988 && !(ins->prefixes & PREFIX_ADDR))
10989 {
10990 *ins->obufp++ = 'a';
10991 *ins->obufp++ = 'b';
10992 *ins->obufp++ = 's';
10993 }
10994
10995 goto case_S;
10996 case 'X':
10997 if (!ins->vex.evex || !ins->vex.w)
10998 *ins->obufp++ = 's';
10999 else
11000 oappend (ins, "{bad}");
11001 break;
11002 default:
11003 abort ();
11004 }
11005 break;
11006 case 'U':
11007 if (l == 1 && (last[0] == 'Z'))
11008 {
11009 /* Although IMUL/SETcc does not support NDD, the EVEX.ND bit is
11010 used to control whether its destination register has its upper
11011 bits zeroed. */
11012 if (ins->vex.nd)
11013 oappend (ins, "zu");
11014 }
11015 else
11016 abort ();
11017 break;
11018 case 'V':
11019 if (l == 0)
11020 {
11021 if (ins->need_vex)
11022 *ins->obufp++ = 'v';
11023 }
11024 else if (l == 1)
11025 {
11026 switch (last[0])
11027 {
11028 case 'X':
11029 if (ins->vex.evex)
11030 break;
11031 *ins->obufp++ = '{';
11032 *ins->obufp++ = 'v';
11033 *ins->obufp++ = 'e';
11034 *ins->obufp++ = 'x';
11035 *ins->obufp++ = '}';
11036 *ins->obufp++ = ' ';
11037 break;
11038 case 'L':
11039 if (ins->rex & REX_W)
11040 {
11041 *ins->obufp++ = 'a';
11042 *ins->obufp++ = 'b';
11043 *ins->obufp++ = 's';
11044 }
11045 goto case_S;
11046 default:
11047 abort ();
11048 }
11049 }
11050 else
11051 abort ();
11052 break;
11053 case 'W':
11054 if (l == 0)
11055 {
11056 /* operand size flag for cwtl, cbtw */
11057 USED_REX (REX_W);
11058 if (ins->rex & REX_W)
11059 {
11060 if (ins->intel_syntax)
11061 *ins->obufp++ = 'd';
11062 else
11063 *ins->obufp++ = 'l';
11064 }
11065 else if (sizeflag & DFLAG)
11066 *ins->obufp++ = 'w';
11067 else
11068 *ins->obufp++ = 'b';
11069 if (!(ins->rex & REX_W))
11070 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11071 }
11072 else if (l == 1)
11073 {
11074 if (!ins->need_vex)
11075 abort ();
11076 if (last[0] == 'X')
11077 *ins->obufp++ = ins->vex.w ? 'd': 's';
11078 else if (last[0] == 'B')
11079 *ins->obufp++ = ins->vex.w ? 'w': 'b';
11080 else
11081 abort ();
11082 }
11083 else
11084 abort ();
11085 break;
11086 case 'X':
11087 if (l != 0)
11088 abort ();
11089 if (ins->need_vex
11090 ? ins->vex.prefix == DATA_PREFIX_OPCODE
11091 : ins->prefixes & PREFIX_DATA)
11092 {
11093 *ins->obufp++ = 'd';
11094 ins->used_prefixes |= PREFIX_DATA;
11095 }
11096 else
11097 *ins->obufp++ = 's';
11098 break;
11099 case 'Y':
11100 if (l == 0)
11101 {
11102 if (ins->vex.mask_register_specifier)
11103 ins->illegal_masking = true;
11104 }
11105 else if (l == 1 && last[0] == 'X')
11106 {
11107 if (!ins->need_vex)
11108 break;
11109 if (ins->intel_syntax
11110 || ((ins->modrm.mod == 3 || ins->vex.b)
11111 && !(sizeflag & SUFFIX_ALWAYS)))
11112 break;
11113 switch (ins->vex.length)
11114 {
11115 case 128:
11116 *ins->obufp++ = 'x';
11117 break;
11118 case 256:
11119 *ins->obufp++ = 'y';
11120 break;
11121 case 512:
11122 if (!ins->vex.evex)
11123 default:
11124 abort ();
11125 }
11126 }
11127 else
11128 abort ();
11129 break;
11130 case 'Z':
11131 if (l == 0)
11132 {
11133 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
11134 ins->modrm.mod = 3;
11135 if (!ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
11136 *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
11137 }
11138 else if (l == 1 && last[0] == 'X')
11139 {
11140 if (!ins->vex.evex)
11141 abort ();
11142 if (ins->intel_syntax
11143 || ((ins->modrm.mod == 3 || ins->vex.b)
11144 && !(sizeflag & SUFFIX_ALWAYS)))
11145 break;
11146 switch (ins->vex.length)
11147 {
11148 case 128:
11149 *ins->obufp++ = 'x';
11150 break;
11151 case 256:
11152 *ins->obufp++ = 'y';
11153 break;
11154 case 512:
11155 *ins->obufp++ = 'z';
11156 break;
11157 default:
11158 abort ();
11159 }
11160 }
11161 else
11162 abort ();
11163 break;
11164 case '^':
11165 if (ins->intel_syntax)
11166 break;
11167 if (ins->isa64 == intel64 && (ins->rex & REX_W))
11168 {
11169 USED_REX (REX_W);
11170 *ins->obufp++ = 'q';
11171 break;
11172 }
11173 if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11174 {
11175 if (sizeflag & DFLAG)
11176 *ins->obufp++ = 'l';
11177 else
11178 *ins->obufp++ = 'w';
11179 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11180 }
11181 break;
11182 }
11183
11184 if (len == l)
11185 len = l = 0;
11186 }
11187 *ins->obufp = 0;
11188 ins->mnemonicendp = ins->obufp;
11189 return 0;
11190 }
11191
11192 /* Add a style marker to *INS->obufp that encodes STYLE. This assumes that
11193 the buffer pointed to by INS->obufp has space. A style marker is made
11194 from the STYLE_MARKER_CHAR followed by STYLE converted to a single hex
11195 digit, followed by another STYLE_MARKER_CHAR. This function assumes
11196 that the number of styles is not greater than 16. */
11197
11198 static void
11199 oappend_insert_style (instr_info *ins, enum disassembler_style style)
11200 {
11201 unsigned num = (unsigned) style;
11202
11203 /* We currently assume that STYLE can be encoded as a single hex
11204 character. If more styles are added then this might start to fail,
11205 and we'll need to expand this code. */
11206 if (num > 0xf)
11207 abort ();
11208
11209 *ins->obufp++ = STYLE_MARKER_CHAR;
11210 *ins->obufp++ = (num < 10 ? ('0' + num)
11211 : ((num < 16) ? ('a' + (num - 10)) : '0'));
11212 *ins->obufp++ = STYLE_MARKER_CHAR;
11213
11214 /* This final null character is not strictly necessary, after inserting a
11215 style marker we should always be inserting some additional content.
11216 However, having the buffer null terminated doesn't cost much, and make
11217 it easier to debug what's going on. Also, if we do ever forget to add
11218 any additional content after this style marker, then the buffer will
11219 still be well formed. */
11220 *ins->obufp = '\0';
11221 }
11222
11223 static void
11224 oappend_with_style (instr_info *ins, const char *s,
11225 enum disassembler_style style)
11226 {
11227 oappend_insert_style (ins, style);
11228 ins->obufp = stpcpy (ins->obufp, s);
11229 }
11230
11231 /* Add a single character C to the buffer pointer to by INS->obufp, marking
11232 the style for the character as STYLE. */
11233
11234 static void
11235 oappend_char_with_style (instr_info *ins, const char c,
11236 enum disassembler_style style)
11237 {
11238 oappend_insert_style (ins, style);
11239 *ins->obufp++ = c;
11240 *ins->obufp = '\0';
11241 }
11242
11243 /* Like oappend_char_with_style, but always uses dis_style_text. */
11244
11245 static void
11246 oappend_char (instr_info *ins, const char c)
11247 {
11248 oappend_char_with_style (ins, c, dis_style_text);
11249 }
11250
11251 static void
11252 append_seg (instr_info *ins)
11253 {
11254 /* Only print the active segment register. */
11255 if (!ins->active_seg_prefix)
11256 return;
11257
11258 ins->used_prefixes |= ins->active_seg_prefix;
11259 switch (ins->active_seg_prefix)
11260 {
11261 case PREFIX_CS:
11262 oappend_register (ins, att_names_seg[1]);
11263 break;
11264 case PREFIX_DS:
11265 oappend_register (ins, att_names_seg[3]);
11266 break;
11267 case PREFIX_SS:
11268 oappend_register (ins, att_names_seg[2]);
11269 break;
11270 case PREFIX_ES:
11271 oappend_register (ins, att_names_seg[0]);
11272 break;
11273 case PREFIX_FS:
11274 oappend_register (ins, att_names_seg[4]);
11275 break;
11276 case PREFIX_GS:
11277 oappend_register (ins, att_names_seg[5]);
11278 break;
11279 default:
11280 break;
11281 }
11282 oappend_char (ins, ':');
11283 }
11284
11285 static void
11286 print_operand_value (instr_info *ins, bfd_vma disp,
11287 enum disassembler_style style)
11288 {
11289 char tmp[30];
11290
11291 if (ins->address_mode != mode_64bit)
11292 disp &= 0xffffffff;
11293 sprintf (tmp, "0x%" PRIx64, (uint64_t) disp);
11294 oappend_with_style (ins, tmp, style);
11295 }
11296
11297 /* Like oappend, but called for immediate operands. */
11298
11299 static void
11300 oappend_immediate (instr_info *ins, bfd_vma imm)
11301 {
11302 if (!ins->intel_syntax)
11303 oappend_char_with_style (ins, '$', dis_style_immediate);
11304 print_operand_value (ins, imm, dis_style_immediate);
11305 }
11306
11307 /* Put DISP in BUF as signed hex number. */
11308
11309 static void
11310 print_displacement (instr_info *ins, bfd_signed_vma val)
11311 {
11312 char tmp[30];
11313
11314 if (val < 0)
11315 {
11316 oappend_char_with_style (ins, '-', dis_style_address_offset);
11317 val = (bfd_vma) 0 - val;
11318
11319 /* Check for possible overflow. */
11320 if (val < 0)
11321 {
11322 switch (ins->address_mode)
11323 {
11324 case mode_64bit:
11325 oappend_with_style (ins, "0x8000000000000000",
11326 dis_style_address_offset);
11327 break;
11328 case mode_32bit:
11329 oappend_with_style (ins, "0x80000000",
11330 dis_style_address_offset);
11331 break;
11332 case mode_16bit:
11333 oappend_with_style (ins, "0x8000",
11334 dis_style_address_offset);
11335 break;
11336 }
11337 return;
11338 }
11339 }
11340
11341 sprintf (tmp, "0x%" PRIx64, (int64_t) val);
11342 oappend_with_style (ins, tmp, dis_style_address_offset);
11343 }
11344
11345 static void
11346 intel_operand_size (instr_info *ins, int bytemode, int sizeflag)
11347 {
11348 /* Check if there is a broadcast, when evex.b is not treated as evex.nd. */
11349 if (ins->vex.b && ins->evex_type == evex_default)
11350 {
11351 if (!ins->vex.no_broadcast)
11352 switch (bytemode)
11353 {
11354 case x_mode:
11355 case evex_half_bcst_xmmq_mode:
11356 if (ins->vex.w)
11357 oappend (ins, "QWORD BCST ");
11358 else
11359 oappend (ins, "DWORD BCST ");
11360 break;
11361 case xh_mode:
11362 case evex_half_bcst_xmmqh_mode:
11363 case evex_half_bcst_xmmqdh_mode:
11364 oappend (ins, "WORD BCST ");
11365 break;
11366 default:
11367 ins->vex.no_broadcast = true;
11368 break;
11369 }
11370 return;
11371 }
11372 switch (bytemode)
11373 {
11374 case b_mode:
11375 case b_swap_mode:
11376 case db_mode:
11377 oappend (ins, "BYTE PTR ");
11378 break;
11379 case w_mode:
11380 case w_swap_mode:
11381 case dw_mode:
11382 oappend (ins, "WORD PTR ");
11383 break;
11384 case indir_v_mode:
11385 if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
11386 {
11387 oappend (ins, "QWORD PTR ");
11388 break;
11389 }
11390 /* Fall through. */
11391 case stack_v_mode:
11392 if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
11393 || (ins->rex & REX_W)))
11394 {
11395 oappend (ins, "QWORD PTR ");
11396 break;
11397 }
11398 /* Fall through. */
11399 case v_mode:
11400 case v_swap_mode:
11401 case dq_mode:
11402 USED_REX (REX_W);
11403 if (ins->rex & REX_W)
11404 oappend (ins, "QWORD PTR ");
11405 else if (bytemode == dq_mode)
11406 oappend (ins, "DWORD PTR ");
11407 else
11408 {
11409 if (sizeflag & DFLAG)
11410 oappend (ins, "DWORD PTR ");
11411 else
11412 oappend (ins, "WORD PTR ");
11413 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11414 }
11415 break;
11416 case z_mode:
11417 if ((ins->rex & REX_W) || (sizeflag & DFLAG))
11418 *ins->obufp++ = 'D';
11419 oappend (ins, "WORD PTR ");
11420 if (!(ins->rex & REX_W))
11421 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11422 break;
11423 case a_mode:
11424 if (sizeflag & DFLAG)
11425 oappend (ins, "QWORD PTR ");
11426 else
11427 oappend (ins, "DWORD PTR ");
11428 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11429 break;
11430 case movsxd_mode:
11431 if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
11432 oappend (ins, "WORD PTR ");
11433 else
11434 oappend (ins, "DWORD PTR ");
11435 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11436 break;
11437 case d_mode:
11438 case d_swap_mode:
11439 oappend (ins, "DWORD PTR ");
11440 break;
11441 case q_mode:
11442 case q_swap_mode:
11443 oappend (ins, "QWORD PTR ");
11444 break;
11445 case m_mode:
11446 if (ins->address_mode == mode_64bit)
11447 oappend (ins, "QWORD PTR ");
11448 else
11449 oappend (ins, "DWORD PTR ");
11450 break;
11451 case f_mode:
11452 if (sizeflag & DFLAG)
11453 oappend (ins, "FWORD PTR ");
11454 else
11455 oappend (ins, "DWORD PTR ");
11456 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11457 break;
11458 case t_mode:
11459 oappend (ins, "TBYTE PTR ");
11460 break;
11461 case x_mode:
11462 case xh_mode:
11463 case x_swap_mode:
11464 case evex_x_gscat_mode:
11465 case evex_x_nobcst_mode:
11466 case bw_unit_mode:
11467 if (ins->need_vex)
11468 {
11469 switch (ins->vex.length)
11470 {
11471 case 128:
11472 oappend (ins, "XMMWORD PTR ");
11473 break;
11474 case 256:
11475 oappend (ins, "YMMWORD PTR ");
11476 break;
11477 case 512:
11478 oappend (ins, "ZMMWORD PTR ");
11479 break;
11480 default:
11481 abort ();
11482 }
11483 }
11484 else
11485 oappend (ins, "XMMWORD PTR ");
11486 break;
11487 case xmm_mode:
11488 oappend (ins, "XMMWORD PTR ");
11489 break;
11490 case ymm_mode:
11491 oappend (ins, "YMMWORD PTR ");
11492 break;
11493 case xmmq_mode:
11494 case evex_half_bcst_xmmqh_mode:
11495 case evex_half_bcst_xmmq_mode:
11496 switch (ins->vex.length)
11497 {
11498 case 0:
11499 case 128:
11500 oappend (ins, "QWORD PTR ");
11501 break;
11502 case 256:
11503 oappend (ins, "XMMWORD PTR ");
11504 break;
11505 case 512:
11506 oappend (ins, "YMMWORD PTR ");
11507 break;
11508 default:
11509 abort ();
11510 }
11511 break;
11512 case xmmdw_mode:
11513 if (!ins->need_vex)
11514 abort ();
11515
11516 switch (ins->vex.length)
11517 {
11518 case 128:
11519 oappend (ins, "WORD PTR ");
11520 break;
11521 case 256:
11522 oappend (ins, "DWORD PTR ");
11523 break;
11524 case 512:
11525 oappend (ins, "QWORD PTR ");
11526 break;
11527 default:
11528 abort ();
11529 }
11530 break;
11531 case xmmqd_mode:
11532 case evex_half_bcst_xmmqdh_mode:
11533 if (!ins->need_vex)
11534 abort ();
11535
11536 switch (ins->vex.length)
11537 {
11538 case 128:
11539 oappend (ins, "DWORD PTR ");
11540 break;
11541 case 256:
11542 oappend (ins, "QWORD PTR ");
11543 break;
11544 case 512:
11545 oappend (ins, "XMMWORD PTR ");
11546 break;
11547 default:
11548 abort ();
11549 }
11550 break;
11551 case ymmq_mode:
11552 if (!ins->need_vex)
11553 abort ();
11554
11555 switch (ins->vex.length)
11556 {
11557 case 128:
11558 oappend (ins, "QWORD PTR ");
11559 break;
11560 case 256:
11561 oappend (ins, "YMMWORD PTR ");
11562 break;
11563 case 512:
11564 oappend (ins, "ZMMWORD PTR ");
11565 break;
11566 default:
11567 abort ();
11568 }
11569 break;
11570 case o_mode:
11571 oappend (ins, "OWORD PTR ");
11572 break;
11573 case vex_vsib_d_w_dq_mode:
11574 case vex_vsib_q_w_dq_mode:
11575 if (!ins->need_vex)
11576 abort ();
11577 if (ins->vex.w)
11578 oappend (ins, "QWORD PTR ");
11579 else
11580 oappend (ins, "DWORD PTR ");
11581 break;
11582 case mask_bd_mode:
11583 if (!ins->need_vex || ins->vex.length != 128)
11584 abort ();
11585 if (ins->vex.w)
11586 oappend (ins, "DWORD PTR ");
11587 else
11588 oappend (ins, "BYTE PTR ");
11589 break;
11590 case mask_mode:
11591 if (!ins->need_vex)
11592 abort ();
11593 if (ins->vex.w)
11594 oappend (ins, "QWORD PTR ");
11595 else
11596 oappend (ins, "WORD PTR ");
11597 break;
11598 case v_bnd_mode:
11599 case v_bndmk_mode:
11600 default:
11601 break;
11602 }
11603 }
11604
11605 static void
11606 print_register (instr_info *ins, unsigned int reg, unsigned int rexmask,
11607 int bytemode, int sizeflag)
11608 {
11609 const char (*names)[8];
11610
11611 /* Masking is invalid for insns with GPR destination. Set the flag uniformly,
11612 as the consumer will inspect it only for the destination operand. */
11613 if (bytemode != mask_mode && ins->vex.mask_register_specifier)
11614 ins->illegal_masking = true;
11615
11616 USED_REX (rexmask);
11617 if (ins->rex & rexmask)
11618 reg += 8;
11619 if (ins->rex2 & rexmask)
11620 reg += 16;
11621
11622 switch (bytemode)
11623 {
11624 case b_mode:
11625 case b_swap_mode:
11626 if (reg & 4)
11627 USED_REX (0);
11628 if (ins->rex || ins->rex2)
11629 names = att_names8rex;
11630 else
11631 names = att_names8;
11632 break;
11633 case w_mode:
11634 names = att_names16;
11635 break;
11636 case d_mode:
11637 case dw_mode:
11638 case db_mode:
11639 names = att_names32;
11640 break;
11641 case q_mode:
11642 names = att_names64;
11643 break;
11644 case m_mode:
11645 case v_bnd_mode:
11646 names = ins->address_mode == mode_64bit ? att_names64 : att_names32;
11647 break;
11648 case bnd_mode:
11649 case bnd_swap_mode:
11650 if (reg > 0x3)
11651 {
11652 oappend (ins, "(bad)");
11653 return;
11654 }
11655 names = att_names_bnd;
11656 break;
11657 case indir_v_mode:
11658 if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
11659 {
11660 names = att_names64;
11661 break;
11662 }
11663 /* Fall through. */
11664 case stack_v_mode:
11665 if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
11666 || (ins->rex & REX_W)))
11667 {
11668 names = att_names64;
11669 break;
11670 }
11671 bytemode = v_mode;
11672 /* Fall through. */
11673 case v_mode:
11674 case v_swap_mode:
11675 case dq_mode:
11676 USED_REX (REX_W);
11677 if (ins->rex & REX_W)
11678 names = att_names64;
11679 else if (bytemode != v_mode && bytemode != v_swap_mode)
11680 names = att_names32;
11681 else
11682 {
11683 if (sizeflag & DFLAG)
11684 names = att_names32;
11685 else
11686 names = att_names16;
11687 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11688 }
11689 break;
11690 case movsxd_mode:
11691 if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
11692 names = att_names16;
11693 else
11694 names = att_names32;
11695 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11696 break;
11697 case va_mode:
11698 names = (ins->address_mode == mode_64bit
11699 ? att_names64 : att_names32);
11700 if (!(ins->prefixes & PREFIX_ADDR))
11701 names = (ins->address_mode == mode_16bit
11702 ? att_names16 : names);
11703 else
11704 {
11705 /* Remove "addr16/addr32". */
11706 ins->all_prefixes[ins->last_addr_prefix] = 0;
11707 names = (ins->address_mode != mode_32bit
11708 ? att_names32 : att_names16);
11709 ins->used_prefixes |= PREFIX_ADDR;
11710 }
11711 break;
11712 case mask_bd_mode:
11713 case mask_mode:
11714 if (reg > 0x7)
11715 {
11716 oappend (ins, "(bad)");
11717 return;
11718 }
11719 names = att_names_mask;
11720 break;
11721 case 0:
11722 return;
11723 default:
11724 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
11725 return;
11726 }
11727 oappend_register (ins, names[reg]);
11728 }
11729
11730 static bool
11731 get8s (instr_info *ins, bfd_vma *res)
11732 {
11733 if (!fetch_code (ins->info, ins->codep + 1))
11734 return false;
11735 *res = ((bfd_vma) *ins->codep++ ^ 0x80) - 0x80;
11736 return true;
11737 }
11738
11739 static bool
11740 get16 (instr_info *ins, bfd_vma *res)
11741 {
11742 if (!fetch_code (ins->info, ins->codep + 2))
11743 return false;
11744 *res = *ins->codep++;
11745 *res |= (bfd_vma) *ins->codep++ << 8;
11746 return true;
11747 }
11748
11749 static bool
11750 get16s (instr_info *ins, bfd_vma *res)
11751 {
11752 if (!get16 (ins, res))
11753 return false;
11754 *res = (*res ^ 0x8000) - 0x8000;
11755 return true;
11756 }
11757
11758 static bool
11759 get32 (instr_info *ins, bfd_vma *res)
11760 {
11761 if (!fetch_code (ins->info, ins->codep + 4))
11762 return false;
11763 *res = *ins->codep++;
11764 *res |= (bfd_vma) *ins->codep++ << 8;
11765 *res |= (bfd_vma) *ins->codep++ << 16;
11766 *res |= (bfd_vma) *ins->codep++ << 24;
11767 return true;
11768 }
11769
11770 static bool
11771 get32s (instr_info *ins, bfd_vma *res)
11772 {
11773 if (!get32 (ins, res))
11774 return false;
11775
11776 *res = (*res ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
11777
11778 return true;
11779 }
11780
11781 static bool
11782 get64 (instr_info *ins, uint64_t *res)
11783 {
11784 unsigned int a;
11785 unsigned int b;
11786
11787 if (!fetch_code (ins->info, ins->codep + 8))
11788 return false;
11789 a = *ins->codep++;
11790 a |= (unsigned int) *ins->codep++ << 8;
11791 a |= (unsigned int) *ins->codep++ << 16;
11792 a |= (unsigned int) *ins->codep++ << 24;
11793 b = *ins->codep++;
11794 b |= (unsigned int) *ins->codep++ << 8;
11795 b |= (unsigned int) *ins->codep++ << 16;
11796 b |= (unsigned int) *ins->codep++ << 24;
11797 *res = a + ((uint64_t) b << 32);
11798 return true;
11799 }
11800
11801 static void
11802 set_op (instr_info *ins, bfd_vma op, bool riprel)
11803 {
11804 ins->op_index[ins->op_ad] = ins->op_ad;
11805 if (ins->address_mode == mode_64bit)
11806 ins->op_address[ins->op_ad] = op;
11807 else /* Mask to get a 32-bit address. */
11808 ins->op_address[ins->op_ad] = op & 0xffffffff;
11809 ins->op_riprel[ins->op_ad] = riprel;
11810 }
11811
11812 static bool
11813 BadOp (instr_info *ins)
11814 {
11815 /* Throw away prefixes and 1st. opcode byte. */
11816 struct dis_private *priv = ins->info->private_data;
11817
11818 ins->codep = priv->the_buffer + ins->nr_prefixes + ins->need_vex + 1;
11819 ins->obufp = stpcpy (ins->obufp, "(bad)");
11820 return true;
11821 }
11822
11823 static bool
11824 OP_Skip_MODRM (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
11825 int sizeflag ATTRIBUTE_UNUSED)
11826 {
11827 if (ins->modrm.mod != 3)
11828 return BadOp (ins);
11829
11830 /* Skip mod/rm byte. */
11831 MODRM_CHECK;
11832 ins->codep++;
11833 ins->has_skipped_modrm = true;
11834 return true;
11835 }
11836
11837 static bool
11838 OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
11839 {
11840 int add = (ins->rex & REX_B) ? 8 : 0;
11841 int riprel = 0;
11842 int shift;
11843
11844 add += (ins->rex2 & REX_B) ? 16 : 0;
11845
11846 /* Handles EVEX other than APX EVEX-promoted instructions. */
11847 if (ins->vex.evex && ins->evex_type == evex_default)
11848 {
11849
11850 /* Zeroing-masking is invalid for memory destinations. Set the flag
11851 uniformly, as the consumer will inspect it only for the destination
11852 operand. */
11853 if (ins->vex.zeroing)
11854 ins->illegal_masking = true;
11855
11856 switch (bytemode)
11857 {
11858 case dw_mode:
11859 case w_mode:
11860 case w_swap_mode:
11861 shift = 1;
11862 break;
11863 case db_mode:
11864 case b_mode:
11865 shift = 0;
11866 break;
11867 case dq_mode:
11868 if (ins->address_mode != mode_64bit)
11869 {
11870 case d_mode:
11871 case d_swap_mode:
11872 shift = 2;
11873 break;
11874 }
11875 /* fall through */
11876 case vex_vsib_d_w_dq_mode:
11877 case vex_vsib_q_w_dq_mode:
11878 case evex_x_gscat_mode:
11879 shift = ins->vex.w ? 3 : 2;
11880 break;
11881 case xh_mode:
11882 case evex_half_bcst_xmmqh_mode:
11883 case evex_half_bcst_xmmqdh_mode:
11884 if (ins->vex.b)
11885 {
11886 shift = ins->vex.w ? 2 : 1;
11887 break;
11888 }
11889 /* Fall through. */
11890 case x_mode:
11891 case evex_half_bcst_xmmq_mode:
11892 if (ins->vex.b)
11893 {
11894 shift = ins->vex.w ? 3 : 2;
11895 break;
11896 }
11897 /* Fall through. */
11898 case xmmqd_mode:
11899 case xmmdw_mode:
11900 case xmmq_mode:
11901 case ymmq_mode:
11902 case evex_x_nobcst_mode:
11903 case x_swap_mode:
11904 switch (ins->vex.length)
11905 {
11906 case 128:
11907 shift = 4;
11908 break;
11909 case 256:
11910 shift = 5;
11911 break;
11912 case 512:
11913 shift = 6;
11914 break;
11915 default:
11916 abort ();
11917 }
11918 /* Make necessary corrections to shift for modes that need it. */
11919 if (bytemode == xmmq_mode
11920 || bytemode == evex_half_bcst_xmmqh_mode
11921 || bytemode == evex_half_bcst_xmmq_mode
11922 || (bytemode == ymmq_mode && ins->vex.length == 128))
11923 shift -= 1;
11924 else if (bytemode == xmmqd_mode
11925 || bytemode == evex_half_bcst_xmmqdh_mode)
11926 shift -= 2;
11927 else if (bytemode == xmmdw_mode)
11928 shift -= 3;
11929 break;
11930 case ymm_mode:
11931 shift = 5;
11932 break;
11933 case xmm_mode:
11934 shift = 4;
11935 break;
11936 case q_mode:
11937 case q_swap_mode:
11938 shift = 3;
11939 break;
11940 case bw_unit_mode:
11941 shift = ins->vex.w ? 1 : 0;
11942 break;
11943 default:
11944 abort ();
11945 }
11946 }
11947 else
11948 shift = 0;
11949
11950 USED_REX (REX_B);
11951 if (ins->intel_syntax)
11952 intel_operand_size (ins, bytemode, sizeflag);
11953 append_seg (ins);
11954
11955 if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
11956 {
11957 /* 32/64 bit address mode */
11958 bfd_vma disp = 0;
11959 int havedisp;
11960 int havebase;
11961 int needindex;
11962 int needaddr32;
11963 int base, rbase;
11964 int vindex = 0;
11965 int scale = 0;
11966 int addr32flag = !((sizeflag & AFLAG)
11967 || bytemode == v_bnd_mode
11968 || bytemode == v_bndmk_mode
11969 || bytemode == bnd_mode
11970 || bytemode == bnd_swap_mode);
11971 bool check_gather = false;
11972 const char (*indexes)[8] = NULL;
11973
11974 havebase = 1;
11975 base = ins->modrm.rm;
11976
11977 if (base == 4)
11978 {
11979 vindex = ins->sib.index;
11980 USED_REX (REX_X);
11981 if (ins->rex & REX_X)
11982 vindex += 8;
11983 switch (bytemode)
11984 {
11985 case vex_vsib_d_w_dq_mode:
11986 case vex_vsib_q_w_dq_mode:
11987 if (!ins->need_vex)
11988 abort ();
11989 if (ins->vex.evex)
11990 {
11991 /* S/G EVEX insns require EVEX.X4 not to be set. */
11992 if (ins->rex2 & REX_X)
11993 {
11994 oappend (ins, "(bad)");
11995 return true;
11996 }
11997
11998 if (!ins->vex.v)
11999 vindex += 16;
12000 check_gather = ins->obufp == ins->op_out[1];
12001 }
12002
12003 switch (ins->vex.length)
12004 {
12005 case 128:
12006 indexes = att_names_xmm;
12007 break;
12008 case 256:
12009 if (!ins->vex.w
12010 || bytemode == vex_vsib_q_w_dq_mode)
12011 indexes = att_names_ymm;
12012 else
12013 indexes = att_names_xmm;
12014 break;
12015 case 512:
12016 if (!ins->vex.w
12017 || bytemode == vex_vsib_q_w_dq_mode)
12018 indexes = att_names_zmm;
12019 else
12020 indexes = att_names_ymm;
12021 break;
12022 default:
12023 abort ();
12024 }
12025 break;
12026 default:
12027 if (ins->rex2 & REX_X)
12028 vindex += 16;
12029
12030 if (vindex != 4)
12031 indexes = ins->address_mode == mode_64bit && !addr32flag
12032 ? att_names64 : att_names32;
12033 break;
12034 }
12035 scale = ins->sib.scale;
12036 base = ins->sib.base;
12037 ins->codep++;
12038 }
12039 else
12040 {
12041 /* Check for mandatory SIB. */
12042 if (bytemode == vex_vsib_d_w_dq_mode
12043 || bytemode == vex_vsib_q_w_dq_mode
12044 || bytemode == vex_sibmem_mode)
12045 {
12046 oappend (ins, "(bad)");
12047 return true;
12048 }
12049 }
12050 rbase = base + add;
12051
12052 switch (ins->modrm.mod)
12053 {
12054 case 0:
12055 if (base == 5)
12056 {
12057 havebase = 0;
12058 if (ins->address_mode == mode_64bit && !ins->has_sib)
12059 riprel = 1;
12060 if (!get32s (ins, &disp))
12061 return false;
12062 if (riprel && bytemode == v_bndmk_mode)
12063 {
12064 oappend (ins, "(bad)");
12065 return true;
12066 }
12067 }
12068 break;
12069 case 1:
12070 if (!get8s (ins, &disp))
12071 return false;
12072 if (ins->vex.evex && shift > 0)
12073 disp <<= shift;
12074 break;
12075 case 2:
12076 if (!get32s (ins, &disp))
12077 return false;
12078 break;
12079 }
12080
12081 needindex = 0;
12082 needaddr32 = 0;
12083 if (ins->has_sib
12084 && !havebase
12085 && !indexes
12086 && ins->address_mode != mode_16bit)
12087 {
12088 if (ins->address_mode == mode_64bit)
12089 {
12090 if (addr32flag)
12091 {
12092 /* Without base nor index registers, zero-extend the
12093 lower 32-bit displacement to 64 bits. */
12094 disp &= 0xffffffff;
12095 needindex = 1;
12096 }
12097 needaddr32 = 1;
12098 }
12099 else
12100 {
12101 /* In 32-bit mode, we need index register to tell [offset]
12102 from [eiz*1 + offset]. */
12103 needindex = 1;
12104 }
12105 }
12106
12107 havedisp = (havebase
12108 || needindex
12109 || (ins->has_sib && (indexes || scale != 0)));
12110
12111 if (!ins->intel_syntax)
12112 if (ins->modrm.mod != 0 || base == 5)
12113 {
12114 if (havedisp || riprel)
12115 print_displacement (ins, disp);
12116 else
12117 print_operand_value (ins, disp, dis_style_address_offset);
12118 if (riprel)
12119 {
12120 set_op (ins, disp, true);
12121 oappend_char (ins, '(');
12122 oappend_with_style (ins, !addr32flag ? "%rip" : "%eip",
12123 dis_style_register);
12124 oappend_char (ins, ')');
12125 }
12126 }
12127
12128 if ((havebase || indexes || needindex || needaddr32 || riprel)
12129 && (ins->address_mode != mode_64bit
12130 || ((bytemode != v_bnd_mode)
12131 && (bytemode != v_bndmk_mode)
12132 && (bytemode != bnd_mode)
12133 && (bytemode != bnd_swap_mode))))
12134 ins->used_prefixes |= PREFIX_ADDR;
12135
12136 if (havedisp || (ins->intel_syntax && riprel))
12137 {
12138 oappend_char (ins, ins->open_char);
12139 if (ins->intel_syntax && riprel)
12140 {
12141 set_op (ins, disp, true);
12142 oappend_with_style (ins, !addr32flag ? "rip" : "eip",
12143 dis_style_register);
12144 }
12145 if (havebase)
12146 oappend_register
12147 (ins,
12148 (ins->address_mode == mode_64bit && !addr32flag
12149 ? att_names64 : att_names32)[rbase]);
12150 if (ins->has_sib)
12151 {
12152 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
12153 print index to tell base + index from base. */
12154 if (scale != 0
12155 || needindex
12156 || indexes
12157 || (havebase && base != ESP_REG_NUM))
12158 {
12159 if (!ins->intel_syntax || havebase)
12160 oappend_char (ins, ins->separator_char);
12161 if (indexes)
12162 {
12163 if (ins->address_mode == mode_64bit || vindex < 16)
12164 oappend_register (ins, indexes[vindex]);
12165 else
12166 oappend (ins, "(bad)");
12167 }
12168 else
12169 oappend_register (ins,
12170 ins->address_mode == mode_64bit
12171 && !addr32flag
12172 ? att_index64
12173 : att_index32);
12174
12175 oappend_char (ins, ins->scale_char);
12176 oappend_char_with_style (ins, '0' + (1 << scale),
12177 dis_style_immediate);
12178 }
12179 }
12180 if (ins->intel_syntax
12181 && (disp || ins->modrm.mod != 0 || base == 5))
12182 {
12183 if (!havedisp || (bfd_signed_vma) disp >= 0)
12184 oappend_char (ins, '+');
12185 if (havedisp)
12186 print_displacement (ins, disp);
12187 else
12188 print_operand_value (ins, disp, dis_style_address_offset);
12189 }
12190
12191 oappend_char (ins, ins->close_char);
12192
12193 if (check_gather)
12194 {
12195 /* Both XMM/YMM/ZMM registers must be distinct. */
12196 int modrm_reg = ins->modrm.reg;
12197
12198 if (ins->rex & REX_R)
12199 modrm_reg += 8;
12200 if (ins->rex2 & REX_R)
12201 modrm_reg += 16;
12202 if (vindex == modrm_reg)
12203 oappend (ins, "/(bad)");
12204 }
12205 }
12206 else if (ins->intel_syntax)
12207 {
12208 if (ins->modrm.mod != 0 || base == 5)
12209 {
12210 if (!ins->active_seg_prefix)
12211 {
12212 oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12213 oappend (ins, ":");
12214 }
12215 print_operand_value (ins, disp, dis_style_text);
12216 }
12217 }
12218 }
12219 else if (bytemode == v_bnd_mode
12220 || bytemode == v_bndmk_mode
12221 || bytemode == bnd_mode
12222 || bytemode == bnd_swap_mode
12223 || bytemode == vex_vsib_d_w_dq_mode
12224 || bytemode == vex_vsib_q_w_dq_mode)
12225 {
12226 oappend (ins, "(bad)");
12227 return true;
12228 }
12229 else
12230 {
12231 /* 16 bit address mode */
12232 bfd_vma disp = 0;
12233
12234 ins->used_prefixes |= ins->prefixes & PREFIX_ADDR;
12235 switch (ins->modrm.mod)
12236 {
12237 case 0:
12238 if (ins->modrm.rm == 6)
12239 {
12240 case 2:
12241 if (!get16s (ins, &disp))
12242 return false;
12243 }
12244 break;
12245 case 1:
12246 if (!get8s (ins, &disp))
12247 return false;
12248 if (ins->vex.evex && shift > 0)
12249 disp <<= shift;
12250 break;
12251 }
12252
12253 if (!ins->intel_syntax)
12254 if (ins->modrm.mod != 0 || ins->modrm.rm == 6)
12255 print_displacement (ins, disp);
12256
12257 if (ins->modrm.mod != 0 || ins->modrm.rm != 6)
12258 {
12259 oappend_char (ins, ins->open_char);
12260 oappend (ins, ins->intel_syntax ? intel_index16[ins->modrm.rm]
12261 : att_index16[ins->modrm.rm]);
12262 if (ins->intel_syntax
12263 && (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6))
12264 {
12265 if ((bfd_signed_vma) disp >= 0)
12266 oappend_char (ins, '+');
12267 print_displacement (ins, disp);
12268 }
12269
12270 oappend_char (ins, ins->close_char);
12271 }
12272 else if (ins->intel_syntax)
12273 {
12274 if (!ins->active_seg_prefix)
12275 {
12276 oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12277 oappend (ins, ":");
12278 }
12279 print_operand_value (ins, disp & 0xffff, dis_style_text);
12280 }
12281 }
12282 if (ins->vex.b && ins->evex_type == evex_default)
12283 {
12284 ins->evex_used |= EVEX_b_used;
12285
12286 /* Broadcast can only ever be valid for memory sources. */
12287 if (ins->obufp == ins->op_out[0])
12288 ins->vex.no_broadcast = true;
12289
12290 if (!ins->vex.no_broadcast
12291 && (!ins->intel_syntax || !(ins->evex_used & EVEX_len_used)))
12292 {
12293 if (bytemode == xh_mode)
12294 {
12295 switch (ins->vex.length)
12296 {
12297 case 128:
12298 oappend (ins, "{1to8}");
12299 break;
12300 case 256:
12301 oappend (ins, "{1to16}");
12302 break;
12303 case 512:
12304 oappend (ins, "{1to32}");
12305 break;
12306 default:
12307 abort ();
12308 }
12309 }
12310 else if (bytemode == q_mode
12311 || bytemode == ymmq_mode)
12312 ins->vex.no_broadcast = true;
12313 else if (ins->vex.w
12314 || bytemode == evex_half_bcst_xmmqdh_mode
12315 || bytemode == evex_half_bcst_xmmq_mode)
12316 {
12317 switch (ins->vex.length)
12318 {
12319 case 128:
12320 oappend (ins, "{1to2}");
12321 break;
12322 case 256:
12323 oappend (ins, "{1to4}");
12324 break;
12325 case 512:
12326 oappend (ins, "{1to8}");
12327 break;
12328 default:
12329 abort ();
12330 }
12331 }
12332 else if (bytemode == x_mode
12333 || bytemode == evex_half_bcst_xmmqh_mode)
12334 {
12335 switch (ins->vex.length)
12336 {
12337 case 128:
12338 oappend (ins, "{1to4}");
12339 break;
12340 case 256:
12341 oappend (ins, "{1to8}");
12342 break;
12343 case 512:
12344 oappend (ins, "{1to16}");
12345 break;
12346 default:
12347 abort ();
12348 }
12349 }
12350 else
12351 ins->vex.no_broadcast = true;
12352 }
12353 if (ins->vex.no_broadcast)
12354 oappend (ins, "{bad}");
12355 }
12356
12357 return true;
12358 }
12359
12360 static bool
12361 OP_E (instr_info *ins, int bytemode, int sizeflag)
12362 {
12363 /* Skip mod/rm byte. */
12364 MODRM_CHECK;
12365 if (!ins->has_skipped_modrm)
12366 {
12367 ins->codep++;
12368 ins->has_skipped_modrm = true;
12369 }
12370
12371 if (ins->modrm.mod == 3)
12372 {
12373 if ((sizeflag & SUFFIX_ALWAYS)
12374 && (bytemode == b_swap_mode
12375 || bytemode == bnd_swap_mode
12376 || bytemode == v_swap_mode))
12377 swap_operand (ins);
12378
12379 print_register (ins, ins->modrm.rm, REX_B, bytemode, sizeflag);
12380 return true;
12381 }
12382
12383 /* Masking is invalid for insns with GPR-like memory destination. Set the
12384 flag uniformly, as the consumer will inspect it only for the destination
12385 operand. */
12386 if (ins->vex.mask_register_specifier)
12387 ins->illegal_masking = true;
12388
12389 return OP_E_memory (ins, bytemode, sizeflag);
12390 }
12391
12392 static bool
12393 OP_indirE (instr_info *ins, int bytemode, int sizeflag)
12394 {
12395 if (ins->modrm.mod == 3 && bytemode == f_mode)
12396 /* bad lcall/ljmp */
12397 return BadOp (ins);
12398 if (!ins->intel_syntax)
12399 oappend (ins, "*");
12400 return OP_E (ins, bytemode, sizeflag);
12401 }
12402
12403 static bool
12404 OP_G (instr_info *ins, int bytemode, int sizeflag)
12405 {
12406 print_register (ins, ins->modrm.reg, REX_R, bytemode, sizeflag);
12407 return true;
12408 }
12409
12410 static bool
12411 OP_REG (instr_info *ins, int code, int sizeflag)
12412 {
12413 const char *s;
12414 int add = 0;
12415
12416 switch (code)
12417 {
12418 case es_reg: case ss_reg: case cs_reg:
12419 case ds_reg: case fs_reg: case gs_reg:
12420 oappend_register (ins, att_names_seg[code - es_reg]);
12421 return true;
12422 }
12423
12424 USED_REX (REX_B);
12425 if (ins->rex & REX_B)
12426 add = 8;
12427 if (ins->rex2 & REX_B)
12428 add += 16;
12429
12430 switch (code)
12431 {
12432 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12433 case sp_reg: case bp_reg: case si_reg: case di_reg:
12434 s = att_names16[code - ax_reg + add];
12435 break;
12436 case ah_reg: case ch_reg: case dh_reg: case bh_reg:
12437 USED_REX (0);
12438 /* Fall through. */
12439 case al_reg: case cl_reg: case dl_reg: case bl_reg:
12440 if (ins->rex)
12441 s = att_names8rex[code - al_reg + add];
12442 else
12443 s = att_names8[code - al_reg];
12444 break;
12445 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12446 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12447 if (ins->address_mode == mode_64bit
12448 && ((sizeflag & DFLAG) || (ins->rex & REX_W)))
12449 {
12450 s = att_names64[code - rAX_reg + add];
12451 break;
12452 }
12453 code += eAX_reg - rAX_reg;
12454 /* Fall through. */
12455 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12456 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12457 USED_REX (REX_W);
12458 if (ins->rex & REX_W)
12459 s = att_names64[code - eAX_reg + add];
12460 else
12461 {
12462 if (sizeflag & DFLAG)
12463 s = att_names32[code - eAX_reg + add];
12464 else
12465 s = att_names16[code - eAX_reg + add];
12466 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12467 }
12468 break;
12469 default:
12470 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12471 return true;
12472 }
12473 oappend_register (ins, s);
12474 return true;
12475 }
12476
12477 static bool
12478 OP_IMREG (instr_info *ins, int code, int sizeflag)
12479 {
12480 const char *s;
12481
12482 switch (code)
12483 {
12484 case indir_dx_reg:
12485 if (!ins->intel_syntax)
12486 {
12487 oappend (ins, "(%dx)");
12488 return true;
12489 }
12490 s = att_names16[dx_reg - ax_reg];
12491 break;
12492 case al_reg: case cl_reg:
12493 s = att_names8[code - al_reg];
12494 break;
12495 case eAX_reg:
12496 USED_REX (REX_W);
12497 if (ins->rex & REX_W)
12498 {
12499 s = *att_names64;
12500 break;
12501 }
12502 /* Fall through. */
12503 case z_mode_ax_reg:
12504 if ((ins->rex & REX_W) || (sizeflag & DFLAG))
12505 s = *att_names32;
12506 else
12507 s = *att_names16;
12508 if (!(ins->rex & REX_W))
12509 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12510 break;
12511 default:
12512 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12513 return true;
12514 }
12515 oappend_register (ins, s);
12516 return true;
12517 }
12518
12519 static bool
12520 OP_I (instr_info *ins, int bytemode, int sizeflag)
12521 {
12522 bfd_vma op;
12523
12524 switch (bytemode)
12525 {
12526 case b_mode:
12527 if (!fetch_code (ins->info, ins->codep + 1))
12528 return false;
12529 op = *ins->codep++;
12530 break;
12531 case v_mode:
12532 USED_REX (REX_W);
12533 if (ins->rex & REX_W)
12534 {
12535 if (!get32s (ins, &op))
12536 return false;
12537 }
12538 else
12539 {
12540 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12541 if (sizeflag & DFLAG)
12542 {
12543 case d_mode:
12544 if (!get32 (ins, &op))
12545 return false;
12546 }
12547 else
12548 {
12549 /* Fall through. */
12550 case w_mode:
12551 if (!get16 (ins, &op))
12552 return false;
12553 }
12554 }
12555 break;
12556 case const_1_mode:
12557 if (ins->intel_syntax)
12558 oappend_with_style (ins, "1", dis_style_immediate);
12559 else
12560 oappend_with_style (ins, "$1", dis_style_immediate);
12561 return true;
12562 default:
12563 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12564 return true;
12565 }
12566
12567 oappend_immediate (ins, op);
12568 return true;
12569 }
12570
12571 static bool
12572 OP_I64 (instr_info *ins, int bytemode, int sizeflag)
12573 {
12574 uint64_t op;
12575
12576 if (bytemode != v_mode || ins->address_mode != mode_64bit
12577 || !(ins->rex & REX_W))
12578 return OP_I (ins, bytemode, sizeflag);
12579
12580 USED_REX (REX_W);
12581
12582 if (!get64 (ins, &op))
12583 return false;
12584
12585 oappend_immediate (ins, op);
12586 return true;
12587 }
12588
12589 static bool
12590 OP_sI (instr_info *ins, int bytemode, int sizeflag)
12591 {
12592 bfd_vma op;
12593
12594 switch (bytemode)
12595 {
12596 case b_mode:
12597 case b_T_mode:
12598 if (!get8s (ins, &op))
12599 return false;
12600 if (bytemode == b_T_mode)
12601 {
12602 if (ins->address_mode != mode_64bit
12603 || !((sizeflag & DFLAG) || (ins->rex & REX_W)))
12604 {
12605 /* The operand-size prefix is overridden by a REX prefix. */
12606 if ((sizeflag & DFLAG) || (ins->rex & REX_W))
12607 op &= 0xffffffff;
12608 else
12609 op &= 0xffff;
12610 }
12611 }
12612 else
12613 {
12614 if (!(ins->rex & REX_W))
12615 {
12616 if (sizeflag & DFLAG)
12617 op &= 0xffffffff;
12618 else
12619 op &= 0xffff;
12620 }
12621 }
12622 break;
12623 case v_mode:
12624 /* The operand-size prefix is overridden by a REX prefix. */
12625 if (!(sizeflag & DFLAG) && !(ins->rex & REX_W))
12626 {
12627 if (!get16 (ins, &op))
12628 return false;
12629 }
12630 else if (!get32s (ins, &op))
12631 return false;
12632 break;
12633 default:
12634 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12635 return true;
12636 }
12637
12638 oappend_immediate (ins, op);
12639 return true;
12640 }
12641
12642 static bool
12643 OP_J (instr_info *ins, int bytemode, int sizeflag)
12644 {
12645 bfd_vma disp;
12646 bfd_vma mask = -1;
12647 bfd_vma segment = 0;
12648
12649 switch (bytemode)
12650 {
12651 case b_mode:
12652 if (!get8s (ins, &disp))
12653 return false;
12654 break;
12655 case v_mode:
12656 case dqw_mode:
12657 if ((sizeflag & DFLAG)
12658 || (ins->address_mode == mode_64bit
12659 && ((ins->isa64 == intel64 && bytemode != dqw_mode)
12660 || (ins->rex & REX_W))))
12661 {
12662 if (!get32s (ins, &disp))
12663 return false;
12664 }
12665 else
12666 {
12667 if (!get16s (ins, &disp))
12668 return false;
12669 /* In 16bit mode, address is wrapped around at 64k within
12670 the same segment. Otherwise, a data16 prefix on a jump
12671 instruction means that the pc is masked to 16 bits after
12672 the displacement is added! */
12673 mask = 0xffff;
12674 if ((ins->prefixes & PREFIX_DATA) == 0)
12675 segment = ((ins->start_pc + (ins->codep - ins->start_codep))
12676 & ~((bfd_vma) 0xffff));
12677 }
12678 if (ins->address_mode != mode_64bit
12679 || (ins->isa64 != intel64 && !(ins->rex & REX_W)))
12680 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12681 break;
12682 default:
12683 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12684 return true;
12685 }
12686 disp = ((ins->start_pc + (ins->codep - ins->start_codep) + disp) & mask)
12687 | segment;
12688 set_op (ins, disp, false);
12689 print_operand_value (ins, disp, dis_style_text);
12690 return true;
12691 }
12692
12693 static bool
12694 OP_SEG (instr_info *ins, int bytemode, int sizeflag)
12695 {
12696 if (bytemode == w_mode)
12697 {
12698 oappend_register (ins, att_names_seg[ins->modrm.reg]);
12699 return true;
12700 }
12701 return OP_E (ins, ins->modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12702 }
12703
12704 static bool
12705 OP_DIR (instr_info *ins, int dummy ATTRIBUTE_UNUSED, int sizeflag)
12706 {
12707 bfd_vma seg, offset;
12708 int res;
12709 char scratch[24];
12710
12711 if (sizeflag & DFLAG)
12712 {
12713 if (!get32 (ins, &offset))
12714 return false;;
12715 }
12716 else if (!get16 (ins, &offset))
12717 return false;
12718 if (!get16 (ins, &seg))
12719 return false;;
12720 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12721
12722 res = snprintf (scratch, ARRAY_SIZE (scratch),
12723 ins->intel_syntax ? "0x%x:0x%x" : "$0x%x,$0x%x",
12724 (unsigned) seg, (unsigned) offset);
12725 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12726 abort ();
12727 oappend (ins, scratch);
12728 return true;
12729 }
12730
12731 static bool
12732 OP_OFF (instr_info *ins, int bytemode, int sizeflag)
12733 {
12734 bfd_vma off;
12735
12736 if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12737 intel_operand_size (ins, bytemode, sizeflag);
12738 append_seg (ins);
12739
12740 if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
12741 {
12742 if (!get32 (ins, &off))
12743 return false;
12744 }
12745 else
12746 {
12747 if (!get16 (ins, &off))
12748 return false;
12749 }
12750
12751 if (ins->intel_syntax)
12752 {
12753 if (!ins->active_seg_prefix)
12754 {
12755 oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12756 oappend (ins, ":");
12757 }
12758 }
12759 print_operand_value (ins, off, dis_style_address_offset);
12760 return true;
12761 }
12762
12763 static bool
12764 OP_OFF64 (instr_info *ins, int bytemode, int sizeflag)
12765 {
12766 uint64_t off;
12767
12768 if (ins->address_mode != mode_64bit
12769 || (ins->prefixes & PREFIX_ADDR))
12770 return OP_OFF (ins, bytemode, sizeflag);
12771
12772 if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12773 intel_operand_size (ins, bytemode, sizeflag);
12774 append_seg (ins);
12775
12776 if (!get64 (ins, &off))
12777 return false;
12778
12779 if (ins->intel_syntax)
12780 {
12781 if (!ins->active_seg_prefix)
12782 {
12783 oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12784 oappend (ins, ":");
12785 }
12786 }
12787 print_operand_value (ins, off, dis_style_address_offset);
12788 return true;
12789 }
12790
12791 static void
12792 ptr_reg (instr_info *ins, int code, int sizeflag)
12793 {
12794 const char *s;
12795
12796 *ins->obufp++ = ins->open_char;
12797 ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
12798 if (ins->address_mode == mode_64bit)
12799 {
12800 if (!(sizeflag & AFLAG))
12801 s = att_names32[code - eAX_reg];
12802 else
12803 s = att_names64[code - eAX_reg];
12804 }
12805 else if (sizeflag & AFLAG)
12806 s = att_names32[code - eAX_reg];
12807 else
12808 s = att_names16[code - eAX_reg];
12809 oappend_register (ins, s);
12810 oappend_char (ins, ins->close_char);
12811 }
12812
12813 static bool
12814 OP_ESreg (instr_info *ins, int code, int sizeflag)
12815 {
12816 if (ins->intel_syntax)
12817 {
12818 switch (ins->codep[-1])
12819 {
12820 case 0x6d: /* insw/insl */
12821 intel_operand_size (ins, z_mode, sizeflag);
12822 break;
12823 case 0xa5: /* movsw/movsl/movsq */
12824 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12825 case 0xab: /* stosw/stosl */
12826 case 0xaf: /* scasw/scasl */
12827 intel_operand_size (ins, v_mode, sizeflag);
12828 break;
12829 default:
12830 intel_operand_size (ins, b_mode, sizeflag);
12831 }
12832 }
12833 oappend_register (ins, att_names_seg[0]);
12834 oappend_char (ins, ':');
12835 ptr_reg (ins, code, sizeflag);
12836 return true;
12837 }
12838
12839 static bool
12840 OP_DSreg (instr_info *ins, int code, int sizeflag)
12841 {
12842 if (ins->intel_syntax)
12843 {
12844 switch (ins->codep[-1])
12845 {
12846 case 0x6f: /* outsw/outsl */
12847 intel_operand_size (ins, z_mode, sizeflag);
12848 break;
12849 case 0xa5: /* movsw/movsl/movsq */
12850 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12851 case 0xad: /* lodsw/lodsl/lodsq */
12852 intel_operand_size (ins, v_mode, sizeflag);
12853 break;
12854 default:
12855 intel_operand_size (ins, b_mode, sizeflag);
12856 }
12857 }
12858 /* Set ins->active_seg_prefix to PREFIX_DS if it is unset so that the
12859 default segment register DS is printed. */
12860 if (!ins->active_seg_prefix)
12861 ins->active_seg_prefix = PREFIX_DS;
12862 append_seg (ins);
12863 ptr_reg (ins, code, sizeflag);
12864 return true;
12865 }
12866
12867 static bool
12868 OP_C (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
12869 int sizeflag ATTRIBUTE_UNUSED)
12870 {
12871 int add, res;
12872 char scratch[8];
12873
12874 if (ins->rex & REX_R)
12875 {
12876 USED_REX (REX_R);
12877 add = 8;
12878 }
12879 else if (ins->address_mode != mode_64bit && (ins->prefixes & PREFIX_LOCK))
12880 {
12881 ins->all_prefixes[ins->last_lock_prefix] = 0;
12882 ins->used_prefixes |= PREFIX_LOCK;
12883 add = 8;
12884 }
12885 else
12886 add = 0;
12887 res = snprintf (scratch, ARRAY_SIZE (scratch), "%%cr%d",
12888 ins->modrm.reg + add);
12889 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12890 abort ();
12891 oappend_register (ins, scratch);
12892 return true;
12893 }
12894
12895 static bool
12896 OP_D (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
12897 int sizeflag ATTRIBUTE_UNUSED)
12898 {
12899 int add, res;
12900 char scratch[8];
12901
12902 USED_REX (REX_R);
12903 if (ins->rex & REX_R)
12904 add = 8;
12905 else
12906 add = 0;
12907 res = snprintf (scratch, ARRAY_SIZE (scratch),
12908 ins->intel_syntax ? "dr%d" : "%%db%d",
12909 ins->modrm.reg + add);
12910 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12911 abort ();
12912 oappend (ins, scratch);
12913 return true;
12914 }
12915
12916 static bool
12917 OP_T (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
12918 int sizeflag ATTRIBUTE_UNUSED)
12919 {
12920 int res;
12921 char scratch[8];
12922
12923 res = snprintf (scratch, ARRAY_SIZE (scratch), "%%tr%d", ins->modrm.reg);
12924 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12925 abort ();
12926 oappend_register (ins, scratch);
12927 return true;
12928 }
12929
12930 static bool
12931 OP_MMX (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
12932 int sizeflag ATTRIBUTE_UNUSED)
12933 {
12934 int reg = ins->modrm.reg;
12935 const char (*names)[8];
12936
12937 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12938 if (ins->prefixes & PREFIX_DATA)
12939 {
12940 names = att_names_xmm;
12941 USED_REX (REX_R);
12942 if (ins->rex & REX_R)
12943 reg += 8;
12944 }
12945 else
12946 names = att_names_mm;
12947 oappend_register (ins, names[reg]);
12948 return true;
12949 }
12950
12951 static void
12952 print_vector_reg (instr_info *ins, unsigned int reg, int bytemode)
12953 {
12954 const char (*names)[8];
12955
12956 if (bytemode == xmmq_mode
12957 || bytemode == evex_half_bcst_xmmqh_mode
12958 || bytemode == evex_half_bcst_xmmq_mode)
12959 {
12960 switch (ins->vex.length)
12961 {
12962 case 0:
12963 case 128:
12964 case 256:
12965 names = att_names_xmm;
12966 break;
12967 case 512:
12968 names = att_names_ymm;
12969 ins->evex_used |= EVEX_len_used;
12970 break;
12971 default:
12972 abort ();
12973 }
12974 }
12975 else if (bytemode == ymm_mode)
12976 names = att_names_ymm;
12977 else if (bytemode == tmm_mode)
12978 {
12979 if (reg >= 8)
12980 {
12981 oappend (ins, "(bad)");
12982 return;
12983 }
12984 names = att_names_tmm;
12985 }
12986 else if (ins->need_vex
12987 && bytemode != xmm_mode
12988 && bytemode != scalar_mode
12989 && bytemode != xmmdw_mode
12990 && bytemode != xmmqd_mode
12991 && bytemode != evex_half_bcst_xmmqdh_mode
12992 && bytemode != w_swap_mode
12993 && bytemode != b_mode
12994 && bytemode != w_mode
12995 && bytemode != d_mode
12996 && bytemode != q_mode)
12997 {
12998 ins->evex_used |= EVEX_len_used;
12999 switch (ins->vex.length)
13000 {
13001 case 128:
13002 names = att_names_xmm;
13003 break;
13004 case 256:
13005 if (ins->vex.w
13006 || bytemode != vex_vsib_q_w_dq_mode)
13007 names = att_names_ymm;
13008 else
13009 names = att_names_xmm;
13010 break;
13011 case 512:
13012 if (ins->vex.w
13013 || bytemode != vex_vsib_q_w_dq_mode)
13014 names = att_names_zmm;
13015 else
13016 names = att_names_ymm;
13017 break;
13018 default:
13019 abort ();
13020 }
13021 }
13022 else
13023 names = att_names_xmm;
13024 oappend_register (ins, names[reg]);
13025 }
13026
13027 static bool
13028 OP_XMM (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13029 {
13030 unsigned int reg = ins->modrm.reg;
13031
13032 USED_REX (REX_R);
13033 if (ins->rex & REX_R)
13034 reg += 8;
13035 if (ins->vex.evex)
13036 {
13037 if (ins->rex2 & REX_R)
13038 reg += 16;
13039 }
13040
13041 if (bytemode == tmm_mode)
13042 ins->modrm.reg = reg;
13043 else if (bytemode == scalar_mode)
13044 ins->vex.no_broadcast = true;
13045
13046 print_vector_reg (ins, reg, bytemode);
13047 return true;
13048 }
13049
13050 static bool
13051 OP_EM (instr_info *ins, int bytemode, int sizeflag)
13052 {
13053 int reg;
13054 const char (*names)[8];
13055
13056 if (ins->modrm.mod != 3)
13057 {
13058 if (ins->intel_syntax
13059 && (bytemode == v_mode || bytemode == v_swap_mode))
13060 {
13061 bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13062 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13063 }
13064 return OP_E (ins, bytemode, sizeflag);
13065 }
13066
13067 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13068 swap_operand (ins);
13069
13070 /* Skip mod/rm byte. */
13071 MODRM_CHECK;
13072 ins->codep++;
13073 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13074 reg = ins->modrm.rm;
13075 if (ins->prefixes & PREFIX_DATA)
13076 {
13077 names = att_names_xmm;
13078 USED_REX (REX_B);
13079 if (ins->rex & REX_B)
13080 reg += 8;
13081 }
13082 else
13083 names = att_names_mm;
13084 oappend_register (ins, names[reg]);
13085 return true;
13086 }
13087
13088 /* cvt* are the only instructions in sse2 which have
13089 both SSE and MMX operands and also have 0x66 prefix
13090 in their opcode. 0x66 was originally used to differentiate
13091 between SSE and MMX instruction(operands). So we have to handle the
13092 cvt* separately using OP_EMC and OP_MXC */
13093 static bool
13094 OP_EMC (instr_info *ins, int bytemode, int sizeflag)
13095 {
13096 if (ins->modrm.mod != 3)
13097 {
13098 if (ins->intel_syntax && bytemode == v_mode)
13099 {
13100 bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13101 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13102 }
13103 return OP_E (ins, bytemode, sizeflag);
13104 }
13105
13106 /* Skip mod/rm byte. */
13107 MODRM_CHECK;
13108 ins->codep++;
13109 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13110 oappend_register (ins, att_names_mm[ins->modrm.rm]);
13111 return true;
13112 }
13113
13114 static bool
13115 OP_MXC (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13116 int sizeflag ATTRIBUTE_UNUSED)
13117 {
13118 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13119 oappend_register (ins, att_names_mm[ins->modrm.reg]);
13120 return true;
13121 }
13122
13123 static bool
13124 OP_EX (instr_info *ins, int bytemode, int sizeflag)
13125 {
13126 int reg;
13127
13128 /* Skip mod/rm byte. */
13129 MODRM_CHECK;
13130 ins->codep++;
13131
13132 if (bytemode == dq_mode)
13133 bytemode = ins->vex.w ? q_mode : d_mode;
13134
13135 if (ins->modrm.mod != 3)
13136 return OP_E_memory (ins, bytemode, sizeflag);
13137
13138 reg = ins->modrm.rm;
13139 USED_REX (REX_B);
13140 if (ins->rex & REX_B)
13141 reg += 8;
13142 if (ins->vex.evex)
13143 {
13144 USED_REX (REX_X);
13145 if ((ins->rex & REX_X))
13146 reg += 16;
13147 ins->rex2_used &= ~REX_B;
13148 }
13149 else if (ins->rex2 & REX_B)
13150 reg += 16;
13151
13152 if ((sizeflag & SUFFIX_ALWAYS)
13153 && (bytemode == x_swap_mode
13154 || bytemode == w_swap_mode
13155 || bytemode == d_swap_mode
13156 || bytemode == q_swap_mode))
13157 swap_operand (ins);
13158
13159 if (bytemode == tmm_mode)
13160 ins->modrm.rm = reg;
13161
13162 print_vector_reg (ins, reg, bytemode);
13163 return true;
13164 }
13165
13166 static bool
13167 OP_R (instr_info *ins, int bytemode, int sizeflag)
13168 {
13169 if (ins->modrm.mod != 3)
13170 return BadOp (ins);
13171
13172 switch (bytemode)
13173 {
13174 case d_mode:
13175 case dq_mode:
13176 case q_mode:
13177 case mask_mode:
13178 return OP_E (ins, bytemode, sizeflag);
13179 case q_mm_mode:
13180 return OP_EM (ins, x_mode, sizeflag);
13181 case xmm_mode:
13182 if (ins->vex.length <= 128)
13183 break;
13184 return BadOp (ins);
13185 }
13186
13187 return OP_EX (ins, bytemode, sizeflag);
13188 }
13189
13190 static bool
13191 OP_M (instr_info *ins, int bytemode, int sizeflag)
13192 {
13193 /* Skip mod/rm byte. */
13194 MODRM_CHECK;
13195 ins->codep++;
13196
13197 if (ins->modrm.mod == 3)
13198 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13199 return BadOp (ins);
13200
13201 if (bytemode == x_mode)
13202 ins->vex.no_broadcast = true;
13203
13204 return OP_E_memory (ins, bytemode, sizeflag);
13205 }
13206
13207 static bool
13208 OP_0f07 (instr_info *ins, int bytemode, int sizeflag)
13209 {
13210 if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
13211 return BadOp (ins);
13212 return OP_E (ins, bytemode, sizeflag);
13213 }
13214
13215 /* montmul instruction need display repz and skip modrm */
13216
13217 static bool
13218 MONTMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13219 {
13220 if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
13221 return BadOp (ins);
13222
13223 /* The 0xf3 prefix should be displayed as "repz" for montmul. */
13224 if (ins->prefixes & PREFIX_REPZ)
13225 ins->all_prefixes[ins->last_repz_prefix] = 0xf3;
13226
13227 /* Skip mod/rm byte. */
13228 MODRM_CHECK;
13229 ins->codep++;
13230 return true;
13231 }
13232
13233 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13234 32bit mode and "xchg %rax,%rax" in 64bit mode. */
13235
13236 static bool
13237 NOP_Fixup (instr_info *ins, int opnd, int sizeflag)
13238 {
13239 if ((ins->prefixes & PREFIX_DATA) == 0 && (ins->rex & REX_B) == 0)
13240 {
13241 ins->mnemonicendp = stpcpy (ins->obuf, "nop");
13242 return true;
13243 }
13244 if (opnd == 0)
13245 return OP_REG (ins, eAX_reg, sizeflag);
13246 return OP_IMREG (ins, eAX_reg, sizeflag);
13247 }
13248
13249 static const char *const Suffix3DNow[] = {
13250 /* 00 */ NULL, NULL, NULL, NULL,
13251 /* 04 */ NULL, NULL, NULL, NULL,
13252 /* 08 */ NULL, NULL, NULL, NULL,
13253 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
13254 /* 10 */ NULL, NULL, NULL, NULL,
13255 /* 14 */ NULL, NULL, NULL, NULL,
13256 /* 18 */ NULL, NULL, NULL, NULL,
13257 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
13258 /* 20 */ NULL, NULL, NULL, NULL,
13259 /* 24 */ NULL, NULL, NULL, NULL,
13260 /* 28 */ NULL, NULL, NULL, NULL,
13261 /* 2C */ NULL, NULL, NULL, NULL,
13262 /* 30 */ NULL, NULL, NULL, NULL,
13263 /* 34 */ NULL, NULL, NULL, NULL,
13264 /* 38 */ NULL, NULL, NULL, NULL,
13265 /* 3C */ NULL, NULL, NULL, NULL,
13266 /* 40 */ NULL, NULL, NULL, NULL,
13267 /* 44 */ NULL, NULL, NULL, NULL,
13268 /* 48 */ NULL, NULL, NULL, NULL,
13269 /* 4C */ NULL, NULL, NULL, NULL,
13270 /* 50 */ NULL, NULL, NULL, NULL,
13271 /* 54 */ NULL, NULL, NULL, NULL,
13272 /* 58 */ NULL, NULL, NULL, NULL,
13273 /* 5C */ NULL, NULL, NULL, NULL,
13274 /* 60 */ NULL, NULL, NULL, NULL,
13275 /* 64 */ NULL, NULL, NULL, NULL,
13276 /* 68 */ NULL, NULL, NULL, NULL,
13277 /* 6C */ NULL, NULL, NULL, NULL,
13278 /* 70 */ NULL, NULL, NULL, NULL,
13279 /* 74 */ NULL, NULL, NULL, NULL,
13280 /* 78 */ NULL, NULL, NULL, NULL,
13281 /* 7C */ NULL, NULL, NULL, NULL,
13282 /* 80 */ NULL, NULL, NULL, NULL,
13283 /* 84 */ NULL, NULL, NULL, NULL,
13284 /* 88 */ NULL, NULL, "pfnacc", NULL,
13285 /* 8C */ NULL, NULL, "pfpnacc", NULL,
13286 /* 90 */ "pfcmpge", NULL, NULL, NULL,
13287 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
13288 /* 98 */ NULL, NULL, "pfsub", NULL,
13289 /* 9C */ NULL, NULL, "pfadd", NULL,
13290 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
13291 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
13292 /* A8 */ NULL, NULL, "pfsubr", NULL,
13293 /* AC */ NULL, NULL, "pfacc", NULL,
13294 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
13295 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
13296 /* B8 */ NULL, NULL, NULL, "pswapd",
13297 /* BC */ NULL, NULL, NULL, "pavgusb",
13298 /* C0 */ NULL, NULL, NULL, NULL,
13299 /* C4 */ NULL, NULL, NULL, NULL,
13300 /* C8 */ NULL, NULL, NULL, NULL,
13301 /* CC */ NULL, NULL, NULL, NULL,
13302 /* D0 */ NULL, NULL, NULL, NULL,
13303 /* D4 */ NULL, NULL, NULL, NULL,
13304 /* D8 */ NULL, NULL, NULL, NULL,
13305 /* DC */ NULL, NULL, NULL, NULL,
13306 /* E0 */ NULL, NULL, NULL, NULL,
13307 /* E4 */ NULL, NULL, NULL, NULL,
13308 /* E8 */ NULL, NULL, NULL, NULL,
13309 /* EC */ NULL, NULL, NULL, NULL,
13310 /* F0 */ NULL, NULL, NULL, NULL,
13311 /* F4 */ NULL, NULL, NULL, NULL,
13312 /* F8 */ NULL, NULL, NULL, NULL,
13313 /* FC */ NULL, NULL, NULL, NULL,
13314 };
13315
13316 static bool
13317 OP_3DNowSuffix (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13318 int sizeflag ATTRIBUTE_UNUSED)
13319 {
13320 const char *mnemonic;
13321
13322 if (!fetch_code (ins->info, ins->codep + 1))
13323 return false;
13324 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13325 place where an 8-bit immediate would normally go. ie. the last
13326 byte of the instruction. */
13327 ins->obufp = ins->mnemonicendp;
13328 mnemonic = Suffix3DNow[*ins->codep++];
13329 if (mnemonic)
13330 ins->obufp = stpcpy (ins->obufp, mnemonic);
13331 else
13332 {
13333 /* Since a variable sized ins->modrm/ins->sib chunk is between the start
13334 of the opcode (0x0f0f) and the opcode suffix, we need to do
13335 all the ins->modrm processing first, and don't know until now that
13336 we have a bad opcode. This necessitates some cleaning up. */
13337 ins->op_out[0][0] = '\0';
13338 ins->op_out[1][0] = '\0';
13339 BadOp (ins);
13340 }
13341 ins->mnemonicendp = ins->obufp;
13342 return true;
13343 }
13344
13345 static const struct op simd_cmp_op[] =
13346 {
13347 { STRING_COMMA_LEN ("eq") },
13348 { STRING_COMMA_LEN ("lt") },
13349 { STRING_COMMA_LEN ("le") },
13350 { STRING_COMMA_LEN ("unord") },
13351 { STRING_COMMA_LEN ("neq") },
13352 { STRING_COMMA_LEN ("nlt") },
13353 { STRING_COMMA_LEN ("nle") },
13354 { STRING_COMMA_LEN ("ord") }
13355 };
13356
13357 static const struct op vex_cmp_op[] =
13358 {
13359 { STRING_COMMA_LEN ("eq_uq") },
13360 { STRING_COMMA_LEN ("nge") },
13361 { STRING_COMMA_LEN ("ngt") },
13362 { STRING_COMMA_LEN ("false") },
13363 { STRING_COMMA_LEN ("neq_oq") },
13364 { STRING_COMMA_LEN ("ge") },
13365 { STRING_COMMA_LEN ("gt") },
13366 { STRING_COMMA_LEN ("true") },
13367 { STRING_COMMA_LEN ("eq_os") },
13368 { STRING_COMMA_LEN ("lt_oq") },
13369 { STRING_COMMA_LEN ("le_oq") },
13370 { STRING_COMMA_LEN ("unord_s") },
13371 { STRING_COMMA_LEN ("neq_us") },
13372 { STRING_COMMA_LEN ("nlt_uq") },
13373 { STRING_COMMA_LEN ("nle_uq") },
13374 { STRING_COMMA_LEN ("ord_s") },
13375 { STRING_COMMA_LEN ("eq_us") },
13376 { STRING_COMMA_LEN ("nge_uq") },
13377 { STRING_COMMA_LEN ("ngt_uq") },
13378 { STRING_COMMA_LEN ("false_os") },
13379 { STRING_COMMA_LEN ("neq_os") },
13380 { STRING_COMMA_LEN ("ge_oq") },
13381 { STRING_COMMA_LEN ("gt_oq") },
13382 { STRING_COMMA_LEN ("true_us") },
13383 };
13384
13385 static bool
13386 CMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13387 int sizeflag ATTRIBUTE_UNUSED)
13388 {
13389 unsigned int cmp_type;
13390
13391 if (!fetch_code (ins->info, ins->codep + 1))
13392 return false;
13393 cmp_type = *ins->codep++;
13394 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
13395 {
13396 char suffix[3];
13397 char *p = ins->mnemonicendp - 2;
13398 suffix[0] = p[0];
13399 suffix[1] = p[1];
13400 suffix[2] = '\0';
13401 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13402 ins->mnemonicendp += simd_cmp_op[cmp_type].len;
13403 }
13404 else if (ins->need_vex
13405 && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13406 {
13407 char suffix[3];
13408 char *p = ins->mnemonicendp - 2;
13409 suffix[0] = p[0];
13410 suffix[1] = p[1];
13411 suffix[2] = '\0';
13412 cmp_type -= ARRAY_SIZE (simd_cmp_op);
13413 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13414 ins->mnemonicendp += vex_cmp_op[cmp_type].len;
13415 }
13416 else
13417 {
13418 /* We have a reserved extension byte. Output it directly. */
13419 oappend_immediate (ins, cmp_type);
13420 }
13421 return true;
13422 }
13423
13424 static bool
13425 OP_Mwait (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13426 {
13427 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
13428 if (!ins->intel_syntax)
13429 {
13430 strcpy (ins->op_out[0], att_names32[0] + ins->intel_syntax);
13431 strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13432 if (bytemode == eBX_reg)
13433 strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax);
13434 ins->two_source_ops = true;
13435 }
13436 /* Skip mod/rm byte. */
13437 MODRM_CHECK;
13438 ins->codep++;
13439 return true;
13440 }
13441
13442 static bool
13443 OP_Monitor (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13444 int sizeflag ATTRIBUTE_UNUSED)
13445 {
13446 /* monitor %{e,r,}ax,%ecx,%edx" */
13447 if (!ins->intel_syntax)
13448 {
13449 const char (*names)[8] = (ins->address_mode == mode_64bit
13450 ? att_names64 : att_names32);
13451
13452 if (ins->prefixes & PREFIX_ADDR)
13453 {
13454 /* Remove "addr16/addr32". */
13455 ins->all_prefixes[ins->last_addr_prefix] = 0;
13456 names = (ins->address_mode != mode_32bit
13457 ? att_names32 : att_names16);
13458 ins->used_prefixes |= PREFIX_ADDR;
13459 }
13460 else if (ins->address_mode == mode_16bit)
13461 names = att_names16;
13462 strcpy (ins->op_out[0], names[0] + ins->intel_syntax);
13463 strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13464 strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax);
13465 ins->two_source_ops = true;
13466 }
13467 /* Skip mod/rm byte. */
13468 MODRM_CHECK;
13469 ins->codep++;
13470 return true;
13471 }
13472
13473 static bool
13474 REP_Fixup (instr_info *ins, int bytemode, int sizeflag)
13475 {
13476 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13477 lods and stos. */
13478 if (ins->prefixes & PREFIX_REPZ)
13479 ins->all_prefixes[ins->last_repz_prefix] = REP_PREFIX;
13480
13481 switch (bytemode)
13482 {
13483 case al_reg:
13484 case eAX_reg:
13485 case indir_dx_reg:
13486 return OP_IMREG (ins, bytemode, sizeflag);
13487 case eDI_reg:
13488 return OP_ESreg (ins, bytemode, sizeflag);
13489 case eSI_reg:
13490 return OP_DSreg (ins, bytemode, sizeflag);
13491 default:
13492 abort ();
13493 break;
13494 }
13495 return true;
13496 }
13497
13498 static bool
13499 SEP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13500 int sizeflag ATTRIBUTE_UNUSED)
13501 {
13502 if (ins->isa64 != amd64)
13503 return true;
13504
13505 ins->obufp = ins->obuf;
13506 BadOp (ins);
13507 ins->mnemonicendp = ins->obufp;
13508 ++ins->codep;
13509 return true;
13510 }
13511
13512 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
13513 "bnd". */
13514
13515 static bool
13516 BND_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13517 int sizeflag ATTRIBUTE_UNUSED)
13518 {
13519 if (ins->prefixes & PREFIX_REPNZ)
13520 ins->all_prefixes[ins->last_repnz_prefix] = BND_PREFIX;
13521 return true;
13522 }
13523
13524 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13525 "notrack". */
13526
13527 static bool
13528 NOTRACK_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13529 int sizeflag ATTRIBUTE_UNUSED)
13530 {
13531 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13532 we've seen a PREFIX_DS. */
13533 if ((ins->prefixes & PREFIX_DS) != 0
13534 && (ins->address_mode != mode_64bit || ins->last_data_prefix < 0))
13535 {
13536 /* NOTRACK prefix is only valid on indirect branch instructions.
13537 NB: DATA prefix is unsupported for Intel64. */
13538 ins->active_seg_prefix = 0;
13539 ins->all_prefixes[ins->last_seg_prefix] = NOTRACK_PREFIX;
13540 }
13541 return true;
13542 }
13543
13544 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13545 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13546 */
13547
13548 static bool
13549 HLE_Fixup1 (instr_info *ins, int bytemode, int sizeflag)
13550 {
13551 if (ins->modrm.mod != 3
13552 && (ins->prefixes & PREFIX_LOCK) != 0)
13553 {
13554 if (ins->prefixes & PREFIX_REPZ)
13555 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13556 if (ins->prefixes & PREFIX_REPNZ)
13557 ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13558 }
13559
13560 return OP_E (ins, bytemode, sizeflag);
13561 }
13562
13563 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13564 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13565 */
13566
13567 static bool
13568 HLE_Fixup2 (instr_info *ins, int bytemode, int sizeflag)
13569 {
13570 if (ins->modrm.mod != 3)
13571 {
13572 if (ins->prefixes & PREFIX_REPZ)
13573 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13574 if (ins->prefixes & PREFIX_REPNZ)
13575 ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13576 }
13577
13578 return OP_E (ins, bytemode, sizeflag);
13579 }
13580
13581 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13582 "xrelease" for memory operand. No check for LOCK prefix. */
13583
13584 static bool
13585 HLE_Fixup3 (instr_info *ins, int bytemode, int sizeflag)
13586 {
13587 if (ins->modrm.mod != 3
13588 && ins->last_repz_prefix > ins->last_repnz_prefix
13589 && (ins->prefixes & PREFIX_REPZ) != 0)
13590 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13591
13592 return OP_E (ins, bytemode, sizeflag);
13593 }
13594
13595 static bool
13596 CMPXCHG8B_Fixup (instr_info *ins, int bytemode, int sizeflag)
13597 {
13598 USED_REX (REX_W);
13599 if (ins->rex & REX_W)
13600 {
13601 /* Change cmpxchg8b to cmpxchg16b. */
13602 char *p = ins->mnemonicendp - 2;
13603 ins->mnemonicendp = stpcpy (p, "16b");
13604 bytemode = o_mode;
13605 }
13606 else if ((ins->prefixes & PREFIX_LOCK) != 0)
13607 {
13608 if (ins->prefixes & PREFIX_REPZ)
13609 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13610 if (ins->prefixes & PREFIX_REPNZ)
13611 ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13612 }
13613
13614 return OP_M (ins, bytemode, sizeflag);
13615 }
13616
13617 static bool
13618 XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED)
13619 {
13620 const char (*names)[8] = att_names_xmm;
13621
13622 if (ins->need_vex)
13623 {
13624 switch (ins->vex.length)
13625 {
13626 case 128:
13627 break;
13628 case 256:
13629 names = att_names_ymm;
13630 break;
13631 default:
13632 abort ();
13633 }
13634 }
13635 oappend_register (ins, names[reg]);
13636 return true;
13637 }
13638
13639 static bool
13640 FXSAVE_Fixup (instr_info *ins, int bytemode, int sizeflag)
13641 {
13642 /* Add proper suffix to "fxsave" and "fxrstor". */
13643 USED_REX (REX_W);
13644 if (ins->rex & REX_W)
13645 {
13646 char *p = ins->mnemonicendp;
13647 *p++ = '6';
13648 *p++ = '4';
13649 *p = '\0';
13650 ins->mnemonicendp = p;
13651 }
13652 return OP_M (ins, bytemode, sizeflag);
13653 }
13654
13655 /* Display the destination register operand for instructions with
13656 VEX. */
13657
13658 static bool
13659 OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13660 {
13661 int reg, modrm_reg, sib_index = -1;
13662 const char (*names)[8];
13663
13664 if (!ins->need_vex)
13665 return true;
13666
13667 if (ins->evex_type == evex_from_legacy)
13668 {
13669 ins->evex_used |= EVEX_b_used;
13670 if (!ins->vex.nd)
13671 return true;
13672 }
13673
13674 reg = ins->vex.register_specifier;
13675 ins->vex.register_specifier = 0;
13676 if (ins->address_mode != mode_64bit)
13677 {
13678 if (ins->vex.evex && !ins->vex.v)
13679 {
13680 oappend (ins, "(bad)");
13681 return true;
13682 }
13683
13684 reg &= 7;
13685 }
13686 else if (ins->vex.evex && !ins->vex.v)
13687 reg += 16;
13688
13689 switch (bytemode)
13690 {
13691 case scalar_mode:
13692 oappend_register (ins, att_names_xmm[reg]);
13693 return true;
13694
13695 case vex_vsib_d_w_dq_mode:
13696 case vex_vsib_q_w_dq_mode:
13697 /* This must be the 3rd operand. */
13698 if (ins->obufp != ins->op_out[2])
13699 abort ();
13700 if (ins->vex.length == 128
13701 || (bytemode != vex_vsib_d_w_dq_mode
13702 && !ins->vex.w))
13703 oappend_register (ins, att_names_xmm[reg]);
13704 else
13705 oappend_register (ins, att_names_ymm[reg]);
13706
13707 /* All 3 XMM/YMM registers must be distinct. */
13708 modrm_reg = ins->modrm.reg;
13709 if (ins->rex & REX_R)
13710 modrm_reg += 8;
13711
13712 if (ins->has_sib && ins->modrm.rm == 4)
13713 {
13714 sib_index = ins->sib.index;
13715 if (ins->rex & REX_X)
13716 sib_index += 8;
13717 }
13718
13719 if (reg == modrm_reg || reg == sib_index)
13720 strcpy (ins->obufp, "/(bad)");
13721 if (modrm_reg == sib_index || modrm_reg == reg)
13722 strcat (ins->op_out[0], "/(bad)");
13723 if (sib_index == modrm_reg || sib_index == reg)
13724 strcat (ins->op_out[1], "/(bad)");
13725
13726 return true;
13727
13728 case tmm_mode:
13729 /* All 3 TMM registers must be distinct. */
13730 if (reg >= 8)
13731 oappend (ins, "(bad)");
13732 else
13733 {
13734 /* This must be the 3rd operand. */
13735 if (ins->obufp != ins->op_out[2])
13736 abort ();
13737 oappend_register (ins, att_names_tmm[reg]);
13738 if (reg == ins->modrm.reg || reg == ins->modrm.rm)
13739 strcpy (ins->obufp, "/(bad)");
13740 }
13741
13742 if (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg
13743 || ins->modrm.rm == reg)
13744 {
13745 if (ins->modrm.reg <= 8
13746 && (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg))
13747 strcat (ins->op_out[0], "/(bad)");
13748 if (ins->modrm.rm <= 8
13749 && (ins->modrm.rm == ins->modrm.reg || ins->modrm.rm == reg))
13750 strcat (ins->op_out[1], "/(bad)");
13751 }
13752
13753 return true;
13754 }
13755
13756 switch (ins->vex.length)
13757 {
13758 case 128:
13759 switch (bytemode)
13760 {
13761 case x_mode:
13762 names = att_names_xmm;
13763 ins->evex_used |= EVEX_len_used;
13764 break;
13765 case v_mode:
13766 case dq_mode:
13767 if (ins->rex & REX_W)
13768 names = att_names64;
13769 else if (bytemode == v_mode
13770 && !(sizeflag & DFLAG))
13771 names = att_names16;
13772 else
13773 names = att_names32;
13774 break;
13775 case b_mode:
13776 names = att_names8rex;
13777 break;
13778 case q_mode:
13779 names = att_names64;
13780 break;
13781 case mask_bd_mode:
13782 case mask_mode:
13783 if (reg > 0x7)
13784 {
13785 oappend (ins, "(bad)");
13786 return true;
13787 }
13788 names = att_names_mask;
13789 break;
13790 default:
13791 abort ();
13792 return true;
13793 }
13794 break;
13795 case 256:
13796 switch (bytemode)
13797 {
13798 case x_mode:
13799 names = att_names_ymm;
13800 ins->evex_used |= EVEX_len_used;
13801 break;
13802 case mask_bd_mode:
13803 case mask_mode:
13804 if (reg <= 0x7)
13805 {
13806 names = att_names_mask;
13807 break;
13808 }
13809 /* Fall through. */
13810 default:
13811 /* See PR binutils/20893 for a reproducer. */
13812 oappend (ins, "(bad)");
13813 return true;
13814 }
13815 break;
13816 case 512:
13817 names = att_names_zmm;
13818 ins->evex_used |= EVEX_len_used;
13819 break;
13820 default:
13821 abort ();
13822 break;
13823 }
13824 oappend_register (ins, names[reg]);
13825 return true;
13826 }
13827
13828 static bool
13829 OP_VexR (instr_info *ins, int bytemode, int sizeflag)
13830 {
13831 if (ins->modrm.mod == 3)
13832 return OP_VEX (ins, bytemode, sizeflag);
13833 return true;
13834 }
13835
13836 static bool
13837 OP_VexW (instr_info *ins, int bytemode, int sizeflag)
13838 {
13839 OP_VEX (ins, bytemode, sizeflag);
13840
13841 if (ins->vex.w)
13842 {
13843 /* Swap 2nd and 3rd operands. */
13844 char *tmp = ins->op_out[2];
13845
13846 ins->op_out[2] = ins->op_out[1];
13847 ins->op_out[1] = tmp;
13848 }
13849 return true;
13850 }
13851
13852 static bool
13853 OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13854 {
13855 int reg;
13856 const char (*names)[8] = att_names_xmm;
13857
13858 if (!fetch_code (ins->info, ins->codep + 1))
13859 return false;
13860 reg = *ins->codep++;
13861
13862 if (bytemode != x_mode && bytemode != scalar_mode)
13863 abort ();
13864
13865 reg >>= 4;
13866 if (ins->address_mode != mode_64bit)
13867 reg &= 7;
13868
13869 if (bytemode == x_mode && ins->vex.length == 256)
13870 names = att_names_ymm;
13871
13872 oappend_register (ins, names[reg]);
13873
13874 if (ins->vex.w)
13875 {
13876 /* Swap 3rd and 4th operands. */
13877 char *tmp = ins->op_out[3];
13878
13879 ins->op_out[3] = ins->op_out[2];
13880 ins->op_out[2] = tmp;
13881 }
13882 return true;
13883 }
13884
13885 static bool
13886 OP_VexI4 (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13887 int sizeflag ATTRIBUTE_UNUSED)
13888 {
13889 oappend_immediate (ins, ins->codep[-1] & 0xf);
13890 return true;
13891 }
13892
13893 static bool
13894 VPCMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13895 int sizeflag ATTRIBUTE_UNUSED)
13896 {
13897 unsigned int cmp_type;
13898
13899 if (!ins->vex.evex)
13900 abort ();
13901
13902 if (!fetch_code (ins->info, ins->codep + 1))
13903 return false;
13904 cmp_type = *ins->codep++;
13905 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13906 If it's the case, print suffix, otherwise - print the immediate. */
13907 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
13908 && cmp_type != 3
13909 && cmp_type != 7)
13910 {
13911 char suffix[3];
13912 char *p = ins->mnemonicendp - 2;
13913
13914 /* vpcmp* can have both one- and two-lettered suffix. */
13915 if (p[0] == 'p')
13916 {
13917 p++;
13918 suffix[0] = p[0];
13919 suffix[1] = '\0';
13920 }
13921 else
13922 {
13923 suffix[0] = p[0];
13924 suffix[1] = p[1];
13925 suffix[2] = '\0';
13926 }
13927
13928 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13929 ins->mnemonicendp += simd_cmp_op[cmp_type].len;
13930 }
13931 else
13932 {
13933 /* We have a reserved extension byte. Output it directly. */
13934 oappend_immediate (ins, cmp_type);
13935 }
13936 return true;
13937 }
13938
13939 static const struct op xop_cmp_op[] =
13940 {
13941 { STRING_COMMA_LEN ("lt") },
13942 { STRING_COMMA_LEN ("le") },
13943 { STRING_COMMA_LEN ("gt") },
13944 { STRING_COMMA_LEN ("ge") },
13945 { STRING_COMMA_LEN ("eq") },
13946 { STRING_COMMA_LEN ("neq") },
13947 { STRING_COMMA_LEN ("false") },
13948 { STRING_COMMA_LEN ("true") }
13949 };
13950
13951 static bool
13952 VPCOM_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13953 int sizeflag ATTRIBUTE_UNUSED)
13954 {
13955 unsigned int cmp_type;
13956
13957 if (!fetch_code (ins->info, ins->codep + 1))
13958 return false;
13959 cmp_type = *ins->codep++;
13960 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
13961 {
13962 char suffix[3];
13963 char *p = ins->mnemonicendp - 2;
13964
13965 /* vpcom* can have both one- and two-lettered suffix. */
13966 if (p[0] == 'm')
13967 {
13968 p++;
13969 suffix[0] = p[0];
13970 suffix[1] = '\0';
13971 }
13972 else
13973 {
13974 suffix[0] = p[0];
13975 suffix[1] = p[1];
13976 suffix[2] = '\0';
13977 }
13978
13979 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
13980 ins->mnemonicendp += xop_cmp_op[cmp_type].len;
13981 }
13982 else
13983 {
13984 /* We have a reserved extension byte. Output it directly. */
13985 oappend_immediate (ins, cmp_type);
13986 }
13987 return true;
13988 }
13989
13990 static const struct op pclmul_op[] =
13991 {
13992 { STRING_COMMA_LEN ("lql") },
13993 { STRING_COMMA_LEN ("hql") },
13994 { STRING_COMMA_LEN ("lqh") },
13995 { STRING_COMMA_LEN ("hqh") }
13996 };
13997
13998 static bool
13999 PCLMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
14000 int sizeflag ATTRIBUTE_UNUSED)
14001 {
14002 unsigned int pclmul_type;
14003
14004 if (!fetch_code (ins->info, ins->codep + 1))
14005 return false;
14006 pclmul_type = *ins->codep++;
14007 switch (pclmul_type)
14008 {
14009 case 0x10:
14010 pclmul_type = 2;
14011 break;
14012 case 0x11:
14013 pclmul_type = 3;
14014 break;
14015 default:
14016 break;
14017 }
14018 if (pclmul_type < ARRAY_SIZE (pclmul_op))
14019 {
14020 char suffix[4];
14021 char *p = ins->mnemonicendp - 3;
14022 suffix[0] = p[0];
14023 suffix[1] = p[1];
14024 suffix[2] = p[2];
14025 suffix[3] = '\0';
14026 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
14027 ins->mnemonicendp += pclmul_op[pclmul_type].len;
14028 }
14029 else
14030 {
14031 /* We have a reserved extension byte. Output it directly. */
14032 oappend_immediate (ins, pclmul_type);
14033 }
14034 return true;
14035 }
14036
14037 static bool
14038 MOVSXD_Fixup (instr_info *ins, int bytemode, int sizeflag)
14039 {
14040 /* Add proper suffix to "movsxd". */
14041 char *p = ins->mnemonicendp;
14042
14043 switch (bytemode)
14044 {
14045 case movsxd_mode:
14046 if (!ins->intel_syntax)
14047 {
14048 USED_REX (REX_W);
14049 if (ins->rex & REX_W)
14050 {
14051 *p++ = 'l';
14052 *p++ = 'q';
14053 break;
14054 }
14055 }
14056
14057 *p++ = 'x';
14058 *p++ = 'd';
14059 break;
14060 default:
14061 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
14062 break;
14063 }
14064
14065 ins->mnemonicendp = p;
14066 *p = '\0';
14067 return OP_E (ins, bytemode, sizeflag);
14068 }
14069
14070 static bool
14071 DistinctDest_Fixup (instr_info *ins, int bytemode, int sizeflag)
14072 {
14073 unsigned int reg = ins->vex.register_specifier;
14074 unsigned int modrm_reg = ins->modrm.reg;
14075 unsigned int modrm_rm = ins->modrm.rm;
14076
14077 /* Calc destination register number. */
14078 if (ins->rex & REX_R)
14079 modrm_reg += 8;
14080 if (ins->rex2 & REX_R)
14081 modrm_reg += 16;
14082
14083 /* Calc src1 register number. */
14084 if (ins->address_mode != mode_64bit)
14085 reg &= 7;
14086 else if (ins->vex.evex && !ins->vex.v)
14087 reg += 16;
14088
14089 /* Calc src2 register number. */
14090 if (ins->modrm.mod == 3)
14091 {
14092 if (ins->rex & REX_B)
14093 modrm_rm += 8;
14094 if (ins->rex & REX_X)
14095 modrm_rm += 16;
14096 }
14097
14098 /* Destination and source registers must be distinct, output bad if
14099 dest == src1 or dest == src2. */
14100 if (modrm_reg == reg
14101 || (ins->modrm.mod == 3
14102 && modrm_reg == modrm_rm))
14103 {
14104 oappend (ins, "(bad)");
14105 return true;
14106 }
14107 return OP_XMM (ins, bytemode, sizeflag);
14108 }
14109
14110 static bool
14111 OP_Rounding (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14112 {
14113 if (ins->modrm.mod != 3 || !ins->vex.b)
14114 return true;
14115
14116 switch (bytemode)
14117 {
14118 case evex_rounding_64_mode:
14119 if (ins->address_mode != mode_64bit || !ins->vex.w)
14120 return true;
14121 /* Fall through. */
14122 case evex_rounding_mode:
14123 ins->evex_used |= EVEX_b_used;
14124 oappend (ins, names_rounding[ins->vex.ll]);
14125 break;
14126 case evex_sae_mode:
14127 ins->evex_used |= EVEX_b_used;
14128 oappend (ins, "{");
14129 break;
14130 default:
14131 abort ();
14132 }
14133 oappend (ins, "sae}");
14134 return true;
14135 }
14136
14137 static bool
14138 PREFETCHI_Fixup (instr_info *ins, int bytemode, int sizeflag)
14139 {
14140 if (ins->modrm.mod != 0 || ins->modrm.rm != 5)
14141 {
14142 if (ins->intel_syntax)
14143 {
14144 ins->mnemonicendp = stpcpy (ins->obuf, "nop ");
14145 }
14146 else
14147 {
14148 USED_REX (REX_W);
14149 if (ins->rex & REX_W)
14150 ins->mnemonicendp = stpcpy (ins->obuf, "nopq ");
14151 else
14152 {
14153 if (sizeflag & DFLAG)
14154 ins->mnemonicendp = stpcpy (ins->obuf, "nopl ");
14155 else
14156 ins->mnemonicendp = stpcpy (ins->obuf, "nopw ");
14157 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
14158 }
14159 }
14160 bytemode = v_mode;
14161 }
14162
14163 return OP_M (ins, bytemode, sizeflag);
14164 }
14165
14166 static bool
14167 PUSH2_POP2_Fixup (instr_info *ins, int bytemode, int sizeflag)
14168 {
14169 if (ins->modrm.mod != 3)
14170 return true;
14171
14172 unsigned int vvvv_reg = ins->vex.register_specifier
14173 | (!ins->vex.v << 4);
14174 unsigned int rm_reg = ins->modrm.rm + (ins->rex & REX_B ? 8 : 0)
14175 + (ins->rex2 & REX_B ? 16 : 0);
14176
14177 /* Push2/Pop2 cannot use RSP and Pop2 cannot pop two same registers. */
14178 if (!ins->vex.nd || vvvv_reg == 0x4 || rm_reg == 0x4
14179 || (!ins->modrm.reg
14180 && vvvv_reg == rm_reg))
14181 {
14182 oappend (ins, "(bad)");
14183 return true;
14184 }
14185
14186 return OP_VEX (ins, bytemode, sizeflag);
14187 }
14188
14189 static bool
14190 JMPABS_Fixup (instr_info *ins, int bytemode, int sizeflag)
14191 {
14192 if (ins->last_rex2_prefix >= 0)
14193 {
14194 uint64_t op;
14195
14196 if ((ins->prefixes & (PREFIX_OPCODE | PREFIX_ADDR | PREFIX_LOCK)) != 0x0
14197 || (ins->rex & REX_W) != 0x0)
14198 {
14199 oappend (ins, "(bad)");
14200 return true;
14201 }
14202
14203 if (bytemode == eAX_reg)
14204 return true;
14205
14206 if (!get64 (ins, &op))
14207 return false;
14208
14209 ins->mnemonicendp = stpcpy (ins->obuf, "jmpabs");
14210 ins->rex2 |= REX2_SPECIAL;
14211 oappend_immediate (ins, op);
14212
14213 return true;
14214 }
14215
14216 if (bytemode == eAX_reg)
14217 return OP_IMREG (ins, bytemode, sizeflag);
14218 return OP_OFF64 (ins, bytemode, sizeflag);
14219 }
14220
14221 static bool
14222 CFCMOV_Fixup (instr_info *ins, int opnd, int sizeflag)
14223 {
14224 /* EVEX.NF is used as a direction bit in the 2-operand case to reverse the
14225 source and destination operands. */
14226 bool dstmem = !ins->vex.nd && ins->vex.nf;
14227
14228 if (opnd == 0)
14229 {
14230 if (dstmem)
14231 return OP_E (ins, v_swap_mode, sizeflag);
14232 return OP_G (ins, v_mode, sizeflag);
14233 }
14234
14235 /* These bits have been consumed and should be cleared. */
14236 ins->vex.nf = false;
14237 ins->vex.mask_register_specifier = 0;
14238
14239 if (dstmem)
14240 return OP_G (ins, v_mode, sizeflag);
14241 return OP_E (ins, v_mode, sizeflag);
14242 }
14243