Update year range in copyright notice of binutils files
[binutils-gdb.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright (C) 1988-2023 Free Software Foundation, Inc.
3
4 This file is part of the GNU opcodes library.
5
6 This library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21
22 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
23 July 1988
24 modified by John Hassey (hassey@dg-rtp.dg.com)
25 x86-64 support added by Jan Hubicka (jh@suse.cz)
26 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
27
28 /* The main tables describing the instructions is essentially a copy
29 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30 Programmers Manual. Usually, there is a capital letter, followed
31 by a small letter. The capital letter tell the addressing mode,
32 and the small letter tells about the operand size. Refer to
33 the Intel manual for details. */
34
35 #include "sysdep.h"
36 #include "disassemble.h"
37 #include "opintl.h"
38 #include "opcode/i386.h"
39 #include "libiberty.h"
40 #include "safe-ctype.h"
41
42 #include <setjmp.h>
43 typedef struct instr_info instr_info;
44
45 static void dofloat (instr_info *, int);
46 static void OP_ST (instr_info *, int, int);
47 static void OP_STi (instr_info *, int, int);
48 static int putop (instr_info *, const char *, int);
49 static void oappend_with_style (instr_info *, const char *,
50 enum disassembler_style);
51 static void oappend (instr_info *, const char *);
52 static void append_seg (instr_info *);
53 static void OP_indirE (instr_info *, int, int);
54 static void OP_E_memory (instr_info *, int, int);
55 static void OP_E (instr_info *, int, int);
56 static void OP_G (instr_info *, int, int);
57 static bfd_vma get64 (instr_info *);
58 static bfd_signed_vma get32 (instr_info *);
59 static bfd_signed_vma get32s (instr_info *);
60 static int get16 (instr_info *);
61 static void set_op (instr_info *, bfd_vma, bool);
62 static void OP_Skip_MODRM (instr_info *, int, int);
63 static void OP_REG (instr_info *, int, int);
64 static void OP_IMREG (instr_info *, int, int);
65 static void OP_I (instr_info *, int, int);
66 static void OP_I64 (instr_info *, int, int);
67 static void OP_sI (instr_info *, int, int);
68 static void OP_J (instr_info *, int, int);
69 static void OP_SEG (instr_info *, int, int);
70 static void OP_DIR (instr_info *, int, int);
71 static void OP_OFF (instr_info *, int, int);
72 static void OP_OFF64 (instr_info *, int, int);
73 static void ptr_reg (instr_info *, int, int);
74 static void OP_ESreg (instr_info *, int, int);
75 static void OP_DSreg (instr_info *, int, int);
76 static void OP_C (instr_info *, int, int);
77 static void OP_D (instr_info *, int, int);
78 static void OP_T (instr_info *, int, int);
79 static void OP_MMX (instr_info *, int, int);
80 static void OP_XMM (instr_info *, int, int);
81 static void OP_EM (instr_info *, int, int);
82 static void OP_EX (instr_info *, int, int);
83 static void OP_EMC (instr_info *, int,int);
84 static void OP_MXC (instr_info *, int,int);
85 static void OP_MS (instr_info *, int, int);
86 static void OP_XS (instr_info *, int, int);
87 static void OP_M (instr_info *, int, int);
88 static void OP_VEX (instr_info *, int, int);
89 static void OP_VexR (instr_info *, int, int);
90 static void OP_VexW (instr_info *, int, int);
91 static void OP_Rounding (instr_info *, int, int);
92 static void OP_REG_VexI4 (instr_info *, int, int);
93 static void OP_VexI4 (instr_info *, int, int);
94 static void PCLMUL_Fixup (instr_info *, int, int);
95 static void VPCMP_Fixup (instr_info *, int, int);
96 static void VPCOM_Fixup (instr_info *, int, int);
97 static void OP_0f07 (instr_info *, int, int);
98 static void OP_Monitor (instr_info *, int, int);
99 static void OP_Mwait (instr_info *, int, int);
100 static void NOP_Fixup (instr_info *, int, int);
101 static void OP_3DNowSuffix (instr_info *, int, int);
102 static void CMP_Fixup (instr_info *, int, int);
103 static void BadOp (instr_info *);
104 static void REP_Fixup (instr_info *, int, int);
105 static void SEP_Fixup (instr_info *, int, int);
106 static void BND_Fixup (instr_info *, int, int);
107 static void NOTRACK_Fixup (instr_info *, int, int);
108 static void HLE_Fixup1 (instr_info *, int, int);
109 static void HLE_Fixup2 (instr_info *, int, int);
110 static void HLE_Fixup3 (instr_info *, int, int);
111 static void CMPXCHG8B_Fixup (instr_info *, int, int);
112 static void XMM_Fixup (instr_info *, int, int);
113 static void FXSAVE_Fixup (instr_info *, int, int);
114
115 static void MOVSXD_Fixup (instr_info *, int, int);
116 static void DistinctDest_Fixup (instr_info *, int, int);
117 static void PREFETCHI_Fixup (instr_info *, int, int);
118
119 /* This character is used to encode style information within the output
120 buffers. See oappend_insert_style for more details. */
121 #define STYLE_MARKER_CHAR '\002'
122
123 /* The maximum operand buffer size. */
124 #define MAX_OPERAND_BUFFER_SIZE 128
125
126 struct dis_private {
127 /* Points to first byte not fetched. */
128 bfd_byte *max_fetched;
129 bfd_byte the_buffer[MAX_MNEM_SIZE];
130 bfd_vma insn_start;
131 int orig_sizeflag;
132 OPCODES_SIGJMP_BUF bailout;
133 };
134
135 enum address_mode
136 {
137 mode_16bit,
138 mode_32bit,
139 mode_64bit
140 };
141
142 enum x86_64_isa
143 {
144 amd64 = 1,
145 intel64
146 };
147
148 struct instr_info
149 {
150 enum address_mode address_mode;
151
152 /* Flags for the prefixes for the current instruction. See below. */
153 int prefixes;
154
155 /* REX prefix the current instruction. See below. */
156 unsigned char rex;
157 /* Bits of REX we've already used. */
158 unsigned char rex_used;
159
160 bool need_modrm;
161 bool need_vex;
162 bool has_sib;
163
164 /* Flags for ins->prefixes which we somehow handled when printing the
165 current instruction. */
166 int used_prefixes;
167
168 /* Flags for EVEX bits which we somehow handled when printing the
169 current instruction. */
170 int evex_used;
171
172 char obuf[MAX_OPERAND_BUFFER_SIZE];
173 char *obufp;
174 char *mnemonicendp;
175 unsigned char *start_codep;
176 unsigned char *insn_codep;
177 unsigned char *codep;
178 unsigned char *end_codep;
179 signed char last_lock_prefix;
180 signed char last_repz_prefix;
181 signed char last_repnz_prefix;
182 signed char last_data_prefix;
183 signed char last_addr_prefix;
184 signed char last_rex_prefix;
185 signed char last_seg_prefix;
186 signed char fwait_prefix;
187 /* The active segment register prefix. */
188 unsigned char active_seg_prefix;
189
190 #define MAX_CODE_LENGTH 15
191 /* We can up to 14 ins->prefixes since the maximum instruction length is
192 15bytes. */
193 unsigned char all_prefixes[MAX_CODE_LENGTH - 1];
194 disassemble_info *info;
195
196 struct
197 {
198 int mod;
199 int reg;
200 int rm;
201 }
202 modrm;
203
204 struct
205 {
206 int scale;
207 int index;
208 int base;
209 }
210 sib;
211
212 struct
213 {
214 int register_specifier;
215 int length;
216 int prefix;
217 int mask_register_specifier;
218 int ll;
219 bool w;
220 bool evex;
221 bool r;
222 bool v;
223 bool zeroing;
224 bool b;
225 bool no_broadcast;
226 }
227 vex;
228
229 /* Remember if the current op is a jump instruction. */
230 bool op_is_jump;
231
232 bool two_source_ops;
233
234 unsigned char op_ad;
235 signed char op_index[MAX_OPERANDS];
236 bool op_riprel[MAX_OPERANDS];
237 char *op_out[MAX_OPERANDS];
238 bfd_vma op_address[MAX_OPERANDS];
239 bfd_vma start_pc;
240
241 /* On the 386's of 1988, the maximum length of an instruction is 15 bytes.
242 * (see topic "Redundant ins->prefixes" in the "Differences from 8086"
243 * section of the "Virtual 8086 Mode" chapter.)
244 * 'pc' should be the address of this instruction, it will
245 * be used to print the target address if this is a relative jump or call
246 * The function returns the length of this instruction in bytes.
247 */
248 char intel_syntax;
249 bool intel_mnemonic;
250 char open_char;
251 char close_char;
252 char separator_char;
253 char scale_char;
254
255 enum x86_64_isa isa64;
256 };
257
258 /* Mark parts used in the REX prefix. When we are testing for
259 empty prefix (for 8bit register REX extension), just mask it
260 out. Otherwise test for REX bit is excuse for existence of REX
261 only in case value is nonzero. */
262 #define USED_REX(value) \
263 { \
264 if (value) \
265 { \
266 if ((ins->rex & value)) \
267 ins->rex_used |= (value) | REX_OPCODE; \
268 } \
269 else \
270 ins->rex_used |= REX_OPCODE; \
271 }
272
273
274 #define EVEX_b_used 1
275 #define EVEX_len_used 2
276
277 /* Flags stored in PREFIXES. */
278 #define PREFIX_REPZ 1
279 #define PREFIX_REPNZ 2
280 #define PREFIX_CS 4
281 #define PREFIX_SS 8
282 #define PREFIX_DS 0x10
283 #define PREFIX_ES 0x20
284 #define PREFIX_FS 0x40
285 #define PREFIX_GS 0x80
286 #define PREFIX_LOCK 0x100
287 #define PREFIX_DATA 0x200
288 #define PREFIX_ADDR 0x400
289 #define PREFIX_FWAIT 0x800
290
291 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
292 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
293 on error. */
294 #define FETCH_DATA(info, addr) \
295 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
296 ? 1 : fetch_data ((info), (addr)))
297
298 static int
299 fetch_data (struct disassemble_info *info, bfd_byte *addr)
300 {
301 int status;
302 struct dis_private *priv = (struct dis_private *) info->private_data;
303 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
304
305 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
306 status = (*info->read_memory_func) (start,
307 priv->max_fetched,
308 addr - priv->max_fetched,
309 info);
310 else
311 status = -1;
312 if (status != 0)
313 {
314 /* If we did manage to read at least one byte, then
315 print_insn_i386 will do something sensible. Otherwise, print
316 an error. We do that here because this is where we know
317 STATUS. */
318 if (priv->max_fetched == priv->the_buffer)
319 (*info->memory_error_func) (status, start, info);
320 OPCODES_SIGLONGJMP (priv->bailout, 1);
321 }
322 else
323 priv->max_fetched = addr;
324 return 1;
325 }
326
327 /* Possible values for prefix requirement. */
328 #define PREFIX_IGNORED_SHIFT 16
329 #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
330 #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
331 #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
332 #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
333 #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
334
335 /* Opcode prefixes. */
336 #define PREFIX_OPCODE (PREFIX_REPZ \
337 | PREFIX_REPNZ \
338 | PREFIX_DATA)
339
340 /* Prefixes ignored. */
341 #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
342 | PREFIX_IGNORED_REPNZ \
343 | PREFIX_IGNORED_DATA)
344
345 #define XX { NULL, 0 }
346 #define Bad_Opcode NULL, { { NULL, 0 } }, 0
347
348 #define Eb { OP_E, b_mode }
349 #define Ebnd { OP_E, bnd_mode }
350 #define EbS { OP_E, b_swap_mode }
351 #define EbndS { OP_E, bnd_swap_mode }
352 #define Ev { OP_E, v_mode }
353 #define Eva { OP_E, va_mode }
354 #define Ev_bnd { OP_E, v_bnd_mode }
355 #define EvS { OP_E, v_swap_mode }
356 #define Ed { OP_E, d_mode }
357 #define Edq { OP_E, dq_mode }
358 #define Edb { OP_E, db_mode }
359 #define Edw { OP_E, dw_mode }
360 #define Eq { OP_E, q_mode }
361 #define indirEv { OP_indirE, indir_v_mode }
362 #define indirEp { OP_indirE, f_mode }
363 #define stackEv { OP_E, stack_v_mode }
364 #define Em { OP_E, m_mode }
365 #define Ew { OP_E, w_mode }
366 #define M { OP_M, 0 } /* lea, lgdt, etc. */
367 #define Ma { OP_M, a_mode }
368 #define Mb { OP_M, b_mode }
369 #define Md { OP_M, d_mode }
370 #define Mdq { OP_M, dq_mode }
371 #define Mo { OP_M, o_mode }
372 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
373 #define Mq { OP_M, q_mode }
374 #define Mv { OP_M, v_mode }
375 #define Mv_bnd { OP_M, v_bndmk_mode }
376 #define Mw { OP_M, w_mode }
377 #define Mx { OP_M, x_mode }
378 #define Mxmm { OP_M, xmm_mode }
379 #define Gb { OP_G, b_mode }
380 #define Gbnd { OP_G, bnd_mode }
381 #define Gv { OP_G, v_mode }
382 #define Gd { OP_G, d_mode }
383 #define Gdq { OP_G, dq_mode }
384 #define Gm { OP_G, m_mode }
385 #define Gva { OP_G, va_mode }
386 #define Gw { OP_G, w_mode }
387 #define Ib { OP_I, b_mode }
388 #define sIb { OP_sI, b_mode } /* sign extened byte */
389 #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
390 #define Iv { OP_I, v_mode }
391 #define sIv { OP_sI, v_mode }
392 #define Iv64 { OP_I64, v_mode }
393 #define Id { OP_I, d_mode }
394 #define Iw { OP_I, w_mode }
395 #define I1 { OP_I, const_1_mode }
396 #define Jb { OP_J, b_mode }
397 #define Jv { OP_J, v_mode }
398 #define Jdqw { OP_J, dqw_mode }
399 #define Cm { OP_C, m_mode }
400 #define Dm { OP_D, m_mode }
401 #define Td { OP_T, d_mode }
402 #define Skip_MODRM { OP_Skip_MODRM, 0 }
403
404 #define RMeAX { OP_REG, eAX_reg }
405 #define RMeBX { OP_REG, eBX_reg }
406 #define RMeCX { OP_REG, eCX_reg }
407 #define RMeDX { OP_REG, eDX_reg }
408 #define RMeSP { OP_REG, eSP_reg }
409 #define RMeBP { OP_REG, eBP_reg }
410 #define RMeSI { OP_REG, eSI_reg }
411 #define RMeDI { OP_REG, eDI_reg }
412 #define RMrAX { OP_REG, rAX_reg }
413 #define RMrBX { OP_REG, rBX_reg }
414 #define RMrCX { OP_REG, rCX_reg }
415 #define RMrDX { OP_REG, rDX_reg }
416 #define RMrSP { OP_REG, rSP_reg }
417 #define RMrBP { OP_REG, rBP_reg }
418 #define RMrSI { OP_REG, rSI_reg }
419 #define RMrDI { OP_REG, rDI_reg }
420 #define RMAL { OP_REG, al_reg }
421 #define RMCL { OP_REG, cl_reg }
422 #define RMDL { OP_REG, dl_reg }
423 #define RMBL { OP_REG, bl_reg }
424 #define RMAH { OP_REG, ah_reg }
425 #define RMCH { OP_REG, ch_reg }
426 #define RMDH { OP_REG, dh_reg }
427 #define RMBH { OP_REG, bh_reg }
428 #define RMAX { OP_REG, ax_reg }
429 #define RMDX { OP_REG, dx_reg }
430
431 #define eAX { OP_IMREG, eAX_reg }
432 #define AL { OP_IMREG, al_reg }
433 #define CL { OP_IMREG, cl_reg }
434 #define zAX { OP_IMREG, z_mode_ax_reg }
435 #define indirDX { OP_IMREG, indir_dx_reg }
436
437 #define Sw { OP_SEG, w_mode }
438 #define Sv { OP_SEG, v_mode }
439 #define Ap { OP_DIR, 0 }
440 #define Ob { OP_OFF64, b_mode }
441 #define Ov { OP_OFF64, v_mode }
442 #define Xb { OP_DSreg, eSI_reg }
443 #define Xv { OP_DSreg, eSI_reg }
444 #define Xz { OP_DSreg, eSI_reg }
445 #define Yb { OP_ESreg, eDI_reg }
446 #define Yv { OP_ESreg, eDI_reg }
447 #define DSBX { OP_DSreg, eBX_reg }
448
449 #define es { OP_REG, es_reg }
450 #define ss { OP_REG, ss_reg }
451 #define cs { OP_REG, cs_reg }
452 #define ds { OP_REG, ds_reg }
453 #define fs { OP_REG, fs_reg }
454 #define gs { OP_REG, gs_reg }
455
456 #define MX { OP_MMX, 0 }
457 #define XM { OP_XMM, 0 }
458 #define XMScalar { OP_XMM, scalar_mode }
459 #define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode }
460 #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
461 #define XMM { OP_XMM, xmm_mode }
462 #define TMM { OP_XMM, tmm_mode }
463 #define XMxmmq { OP_XMM, xmmq_mode }
464 #define EM { OP_EM, v_mode }
465 #define EMS { OP_EM, v_swap_mode }
466 #define EMd { OP_EM, d_mode }
467 #define EMx { OP_EM, x_mode }
468 #define EXbwUnit { OP_EX, bw_unit_mode }
469 #define EXb { OP_EX, b_mode }
470 #define EXw { OP_EX, w_mode }
471 #define EXd { OP_EX, d_mode }
472 #define EXdS { OP_EX, d_swap_mode }
473 #define EXwS { OP_EX, w_swap_mode }
474 #define EXq { OP_EX, q_mode }
475 #define EXqS { OP_EX, q_swap_mode }
476 #define EXdq { OP_EX, dq_mode }
477 #define EXx { OP_EX, x_mode }
478 #define EXxh { OP_EX, xh_mode }
479 #define EXxS { OP_EX, x_swap_mode }
480 #define EXxmm { OP_EX, xmm_mode }
481 #define EXymm { OP_EX, ymm_mode }
482 #define EXtmm { OP_EX, tmm_mode }
483 #define EXxmmq { OP_EX, xmmq_mode }
484 #define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode }
485 #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
486 #define EXxmmdw { OP_EX, xmmdw_mode }
487 #define EXxmmqd { OP_EX, xmmqd_mode }
488 #define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode }
489 #define EXymmq { OP_EX, ymmq_mode }
490 #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
491 #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
492 #define MS { OP_MS, v_mode }
493 #define XS { OP_XS, v_mode }
494 #define EMCq { OP_EMC, q_mode }
495 #define MXC { OP_MXC, 0 }
496 #define OPSUF { OP_3DNowSuffix, 0 }
497 #define SEP { SEP_Fixup, 0 }
498 #define CMP { CMP_Fixup, 0 }
499 #define XMM0 { XMM_Fixup, 0 }
500 #define FXSAVE { FXSAVE_Fixup, 0 }
501
502 #define Vex { OP_VEX, x_mode }
503 #define VexW { OP_VexW, x_mode }
504 #define VexScalar { OP_VEX, scalar_mode }
505 #define VexScalarR { OP_VexR, scalar_mode }
506 #define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode }
507 #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
508 #define VexGdq { OP_VEX, dq_mode }
509 #define VexTmm { OP_VEX, tmm_mode }
510 #define XMVexI4 { OP_REG_VexI4, x_mode }
511 #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
512 #define VexI4 { OP_VexI4, 0 }
513 #define PCLMUL { PCLMUL_Fixup, 0 }
514 #define VPCMP { VPCMP_Fixup, 0 }
515 #define VPCOM { VPCOM_Fixup, 0 }
516
517 #define EXxEVexR { OP_Rounding, evex_rounding_mode }
518 #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
519 #define EXxEVexS { OP_Rounding, evex_sae_mode }
520
521 #define MaskG { OP_G, mask_mode }
522 #define MaskE { OP_E, mask_mode }
523 #define MaskBDE { OP_E, mask_bd_mode }
524 #define MaskVex { OP_VEX, mask_mode }
525
526 #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
527 #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
528
529 #define MVexSIBMEM { OP_M, vex_sibmem_mode }
530
531 /* Used handle "rep" prefix for string instructions. */
532 #define Xbr { REP_Fixup, eSI_reg }
533 #define Xvr { REP_Fixup, eSI_reg }
534 #define Ybr { REP_Fixup, eDI_reg }
535 #define Yvr { REP_Fixup, eDI_reg }
536 #define Yzr { REP_Fixup, eDI_reg }
537 #define indirDXr { REP_Fixup, indir_dx_reg }
538 #define ALr { REP_Fixup, al_reg }
539 #define eAXr { REP_Fixup, eAX_reg }
540
541 /* Used handle HLE prefix for lockable instructions. */
542 #define Ebh1 { HLE_Fixup1, b_mode }
543 #define Evh1 { HLE_Fixup1, v_mode }
544 #define Ebh2 { HLE_Fixup2, b_mode }
545 #define Evh2 { HLE_Fixup2, v_mode }
546 #define Ebh3 { HLE_Fixup3, b_mode }
547 #define Evh3 { HLE_Fixup3, v_mode }
548
549 #define BND { BND_Fixup, 0 }
550 #define NOTRACK { NOTRACK_Fixup, 0 }
551
552 #define cond_jump_flag { NULL, cond_jump_mode }
553 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
554
555 /* bits in sizeflag */
556 #define SUFFIX_ALWAYS 4
557 #define AFLAG 2
558 #define DFLAG 1
559
560 enum
561 {
562 /* byte operand */
563 b_mode = 1,
564 /* byte operand with operand swapped */
565 b_swap_mode,
566 /* byte operand, sign extend like 'T' suffix */
567 b_T_mode,
568 /* operand size depends on prefixes */
569 v_mode,
570 /* operand size depends on prefixes with operand swapped */
571 v_swap_mode,
572 /* operand size depends on address prefix */
573 va_mode,
574 /* word operand */
575 w_mode,
576 /* double word operand */
577 d_mode,
578 /* word operand with operand swapped */
579 w_swap_mode,
580 /* double word operand with operand swapped */
581 d_swap_mode,
582 /* quad word operand */
583 q_mode,
584 /* quad word operand with operand swapped */
585 q_swap_mode,
586 /* ten-byte operand */
587 t_mode,
588 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
589 broadcast enabled. */
590 x_mode,
591 /* Similar to x_mode, but with different EVEX mem shifts. */
592 evex_x_gscat_mode,
593 /* Similar to x_mode, but with yet different EVEX mem shifts. */
594 bw_unit_mode,
595 /* Similar to x_mode, but with disabled broadcast. */
596 evex_x_nobcst_mode,
597 /* Similar to x_mode, but with operands swapped and disabled broadcast
598 in EVEX. */
599 x_swap_mode,
600 /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
601 broadcast of 16bit enabled. */
602 xh_mode,
603 /* 16-byte XMM operand */
604 xmm_mode,
605 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
606 memory operand (depending on vector length). Broadcast isn't
607 allowed. */
608 xmmq_mode,
609 /* Same as xmmq_mode, but broadcast is allowed. */
610 evex_half_bcst_xmmq_mode,
611 /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
612 memory operand (depending on vector length). 16bit broadcast. */
613 evex_half_bcst_xmmqh_mode,
614 /* 16-byte XMM, word, double word or quad word operand. */
615 xmmdw_mode,
616 /* 16-byte XMM, double word, quad word operand or xmm word operand. */
617 xmmqd_mode,
618 /* 16-byte XMM, double word, quad word operand or xmm word operand.
619 16bit broadcast. */
620 evex_half_bcst_xmmqdh_mode,
621 /* 32-byte YMM operand */
622 ymm_mode,
623 /* quad word, ymmword or zmmword memory operand. */
624 ymmq_mode,
625 /* TMM operand */
626 tmm_mode,
627 /* d_mode in 32bit, q_mode in 64bit mode. */
628 m_mode,
629 /* pair of v_mode operands */
630 a_mode,
631 cond_jump_mode,
632 loop_jcxz_mode,
633 movsxd_mode,
634 v_bnd_mode,
635 /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
636 v_bndmk_mode,
637 /* operand size depends on REX.W / VEX.W. */
638 dq_mode,
639 /* Displacements like v_mode without considering Intel64 ISA. */
640 dqw_mode,
641 /* bounds operand */
642 bnd_mode,
643 /* bounds operand with operand swapped */
644 bnd_swap_mode,
645 /* 4- or 6-byte pointer operand */
646 f_mode,
647 const_1_mode,
648 /* v_mode for indirect branch opcodes. */
649 indir_v_mode,
650 /* v_mode for stack-related opcodes. */
651 stack_v_mode,
652 /* non-quad operand size depends on prefixes */
653 z_mode,
654 /* 16-byte operand */
655 o_mode,
656 /* registers like d_mode, memory like b_mode. */
657 db_mode,
658 /* registers like d_mode, memory like w_mode. */
659 dw_mode,
660
661 /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
662 vex_vsib_d_w_dq_mode,
663 /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
664 vex_vsib_q_w_dq_mode,
665 /* mandatory non-vector SIB. */
666 vex_sibmem_mode,
667
668 /* scalar, ignore vector length. */
669 scalar_mode,
670
671 /* Static rounding. */
672 evex_rounding_mode,
673 /* Static rounding, 64-bit mode only. */
674 evex_rounding_64_mode,
675 /* Supress all exceptions. */
676 evex_sae_mode,
677
678 /* Mask register operand. */
679 mask_mode,
680 /* Mask register operand. */
681 mask_bd_mode,
682
683 es_reg,
684 cs_reg,
685 ss_reg,
686 ds_reg,
687 fs_reg,
688 gs_reg,
689
690 eAX_reg,
691 eCX_reg,
692 eDX_reg,
693 eBX_reg,
694 eSP_reg,
695 eBP_reg,
696 eSI_reg,
697 eDI_reg,
698
699 al_reg,
700 cl_reg,
701 dl_reg,
702 bl_reg,
703 ah_reg,
704 ch_reg,
705 dh_reg,
706 bh_reg,
707
708 ax_reg,
709 cx_reg,
710 dx_reg,
711 bx_reg,
712 sp_reg,
713 bp_reg,
714 si_reg,
715 di_reg,
716
717 rAX_reg,
718 rCX_reg,
719 rDX_reg,
720 rBX_reg,
721 rSP_reg,
722 rBP_reg,
723 rSI_reg,
724 rDI_reg,
725
726 z_mode_ax_reg,
727 indir_dx_reg
728 };
729
730 enum
731 {
732 FLOATCODE = 1,
733 USE_REG_TABLE,
734 USE_MOD_TABLE,
735 USE_RM_TABLE,
736 USE_PREFIX_TABLE,
737 USE_X86_64_TABLE,
738 USE_3BYTE_TABLE,
739 USE_XOP_8F_TABLE,
740 USE_VEX_C4_TABLE,
741 USE_VEX_C5_TABLE,
742 USE_VEX_LEN_TABLE,
743 USE_VEX_W_TABLE,
744 USE_EVEX_TABLE,
745 USE_EVEX_LEN_TABLE
746 };
747
748 #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
749
750 #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
751 #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
752 #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
753 #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
754 #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
755 #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
756 #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
757 #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
758 #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
759 #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
760 #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
761 #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
762 #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
763 #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
764 #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
765 #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
766
767 enum
768 {
769 REG_80 = 0,
770 REG_81,
771 REG_83,
772 REG_8F,
773 REG_C0,
774 REG_C1,
775 REG_C6,
776 REG_C7,
777 REG_D0,
778 REG_D1,
779 REG_D2,
780 REG_D3,
781 REG_F6,
782 REG_F7,
783 REG_FE,
784 REG_FF,
785 REG_0F00,
786 REG_0F01,
787 REG_0F0D,
788 REG_0F18,
789 REG_0F1C_P_0_MOD_0,
790 REG_0F1E_P_1_MOD_3,
791 REG_0F38D8_PREFIX_1,
792 REG_0F3A0F_PREFIX_1_MOD_3,
793 REG_0F71_MOD_0,
794 REG_0F72_MOD_0,
795 REG_0F73_MOD_0,
796 REG_0FA6,
797 REG_0FA7,
798 REG_0FAE,
799 REG_0FBA,
800 REG_0FC7,
801 REG_VEX_0F71_M_0,
802 REG_VEX_0F72_M_0,
803 REG_VEX_0F73_M_0,
804 REG_VEX_0FAE,
805 REG_VEX_0F3849_X86_64_P_0_W_0_M_1,
806 REG_VEX_0F38F3_L_0,
807
808 REG_XOP_09_01_L_0,
809 REG_XOP_09_02_L_0,
810 REG_XOP_09_12_M_1_L_0,
811 REG_XOP_0A_12_L_0,
812
813 REG_EVEX_0F71,
814 REG_EVEX_0F72,
815 REG_EVEX_0F73,
816 REG_EVEX_0F38C6_M_0_L_2,
817 REG_EVEX_0F38C7_M_0_L_2
818 };
819
820 enum
821 {
822 MOD_62_32BIT = 0,
823 MOD_8D,
824 MOD_C4_32BIT,
825 MOD_C5_32BIT,
826 MOD_C6_REG_7,
827 MOD_C7_REG_7,
828 MOD_FF_REG_3,
829 MOD_FF_REG_5,
830 MOD_0F01_REG_0,
831 MOD_0F01_REG_1,
832 MOD_0F01_REG_2,
833 MOD_0F01_REG_3,
834 MOD_0F01_REG_5,
835 MOD_0F01_REG_7,
836 MOD_0F02,
837 MOD_0F03,
838 MOD_0F12_PREFIX_0,
839 MOD_0F12_PREFIX_2,
840 MOD_0F13,
841 MOD_0F16_PREFIX_0,
842 MOD_0F16_PREFIX_2,
843 MOD_0F17,
844 MOD_0F18_REG_0,
845 MOD_0F18_REG_1,
846 MOD_0F18_REG_2,
847 MOD_0F18_REG_3,
848 MOD_0F18_REG_6,
849 MOD_0F18_REG_7,
850 MOD_0F1A_PREFIX_0,
851 MOD_0F1B_PREFIX_0,
852 MOD_0F1B_PREFIX_1,
853 MOD_0F1C_PREFIX_0,
854 MOD_0F1E_PREFIX_1,
855 MOD_0F2B_PREFIX_0,
856 MOD_0F2B_PREFIX_1,
857 MOD_0F2B_PREFIX_2,
858 MOD_0F2B_PREFIX_3,
859 MOD_0F50,
860 MOD_0F71,
861 MOD_0F72,
862 MOD_0F73,
863 MOD_0FAE_REG_0,
864 MOD_0FAE_REG_1,
865 MOD_0FAE_REG_2,
866 MOD_0FAE_REG_3,
867 MOD_0FAE_REG_4,
868 MOD_0FAE_REG_5,
869 MOD_0FAE_REG_6,
870 MOD_0FAE_REG_7,
871 MOD_0FB2,
872 MOD_0FB4,
873 MOD_0FB5,
874 MOD_0FC3,
875 MOD_0FC7_REG_3,
876 MOD_0FC7_REG_4,
877 MOD_0FC7_REG_5,
878 MOD_0FC7_REG_6,
879 MOD_0FC7_REG_7,
880 MOD_0FD7,
881 MOD_0FE7_PREFIX_2,
882 MOD_0FF0_PREFIX_3,
883 MOD_0F382A,
884 MOD_0F38DC_PREFIX_1,
885 MOD_0F38DD_PREFIX_1,
886 MOD_0F38DE_PREFIX_1,
887 MOD_0F38DF_PREFIX_1,
888 MOD_0F38F5,
889 MOD_0F38F6_PREFIX_0,
890 MOD_0F38F8_PREFIX_1,
891 MOD_0F38F8_PREFIX_2,
892 MOD_0F38F8_PREFIX_3,
893 MOD_0F38F9,
894 MOD_0F38FA_PREFIX_1,
895 MOD_0F38FB_PREFIX_1,
896 MOD_0F3A0F_PREFIX_1,
897
898 MOD_VEX_0F12_PREFIX_0,
899 MOD_VEX_0F12_PREFIX_2,
900 MOD_VEX_0F13,
901 MOD_VEX_0F16_PREFIX_0,
902 MOD_VEX_0F16_PREFIX_2,
903 MOD_VEX_0F17,
904 MOD_VEX_0F2B,
905 MOD_VEX_0F41_L_1,
906 MOD_VEX_0F42_L_1,
907 MOD_VEX_0F44_L_0,
908 MOD_VEX_0F45_L_1,
909 MOD_VEX_0F46_L_1,
910 MOD_VEX_0F47_L_1,
911 MOD_VEX_0F4A_L_1,
912 MOD_VEX_0F4B_L_1,
913 MOD_VEX_0F50,
914 MOD_VEX_0F71,
915 MOD_VEX_0F72,
916 MOD_VEX_0F73,
917 MOD_VEX_0F91_L_0,
918 MOD_VEX_0F92_L_0,
919 MOD_VEX_0F93_L_0,
920 MOD_VEX_0F98_L_0,
921 MOD_VEX_0F99_L_0,
922 MOD_VEX_0FAE_REG_2,
923 MOD_VEX_0FAE_REG_3,
924 MOD_VEX_0FD7,
925 MOD_VEX_0FE7,
926 MOD_VEX_0FF0_PREFIX_3,
927 MOD_VEX_0F381A,
928 MOD_VEX_0F382A,
929 MOD_VEX_0F382C,
930 MOD_VEX_0F382D,
931 MOD_VEX_0F382E,
932 MOD_VEX_0F382F,
933 MOD_VEX_0F3849_X86_64_P_0_W_0,
934 MOD_VEX_0F3849_X86_64_P_2_W_0,
935 MOD_VEX_0F3849_X86_64_P_3_W_0,
936 MOD_VEX_0F384B_X86_64_P_1_W_0,
937 MOD_VEX_0F384B_X86_64_P_2_W_0,
938 MOD_VEX_0F384B_X86_64_P_3_W_0,
939 MOD_VEX_0F385A,
940 MOD_VEX_0F385C_X86_64_P_1_W_0,
941 MOD_VEX_0F385C_X86_64_P_3_W_0,
942 MOD_VEX_0F385E_X86_64_P_0_W_0,
943 MOD_VEX_0F385E_X86_64_P_1_W_0,
944 MOD_VEX_0F385E_X86_64_P_2_W_0,
945 MOD_VEX_0F385E_X86_64_P_3_W_0,
946 MOD_VEX_0F388C,
947 MOD_VEX_0F388E,
948 MOD_VEX_0F3A30_L_0,
949 MOD_VEX_0F3A31_L_0,
950 MOD_VEX_0F3A32_L_0,
951 MOD_VEX_0F3A33_L_0,
952
953 MOD_XOP_09_12,
954
955 MOD_EVEX_0F381A,
956 MOD_EVEX_0F381B,
957 MOD_EVEX_0F3828_P_1,
958 MOD_EVEX_0F382A_P_1_W_1,
959 MOD_EVEX_0F3838_P_1,
960 MOD_EVEX_0F383A_P_1_W_0,
961 MOD_EVEX_0F385A,
962 MOD_EVEX_0F385B,
963 MOD_EVEX_0F387A_W_0,
964 MOD_EVEX_0F387B_W_0,
965 MOD_EVEX_0F387C,
966 MOD_EVEX_0F38C6,
967 MOD_EVEX_0F38C7,
968 };
969
970 enum
971 {
972 RM_C6_REG_7 = 0,
973 RM_C7_REG_7,
974 RM_0F01_REG_0,
975 RM_0F01_REG_1,
976 RM_0F01_REG_2,
977 RM_0F01_REG_3,
978 RM_0F01_REG_5_MOD_3,
979 RM_0F01_REG_7_MOD_3,
980 RM_0F1E_P_1_MOD_3_REG_7,
981 RM_0FAE_REG_6_MOD_3_P_0,
982 RM_0FAE_REG_7_MOD_3,
983 RM_0F3A0F_P_1_MOD_3_REG_0,
984
985 RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
986 };
987
988 enum
989 {
990 PREFIX_90 = 0,
991 PREFIX_0F01_REG_0_MOD_3_RM_6,
992 PREFIX_0F01_REG_1_RM_4,
993 PREFIX_0F01_REG_1_RM_5,
994 PREFIX_0F01_REG_1_RM_6,
995 PREFIX_0F01_REG_1_RM_7,
996 PREFIX_0F01_REG_3_RM_1,
997 PREFIX_0F01_REG_5_MOD_0,
998 PREFIX_0F01_REG_5_MOD_3_RM_0,
999 PREFIX_0F01_REG_5_MOD_3_RM_1,
1000 PREFIX_0F01_REG_5_MOD_3_RM_2,
1001 PREFIX_0F01_REG_5_MOD_3_RM_4,
1002 PREFIX_0F01_REG_5_MOD_3_RM_5,
1003 PREFIX_0F01_REG_5_MOD_3_RM_6,
1004 PREFIX_0F01_REG_5_MOD_3_RM_7,
1005 PREFIX_0F01_REG_7_MOD_3_RM_2,
1006 PREFIX_0F01_REG_7_MOD_3_RM_5,
1007 PREFIX_0F01_REG_7_MOD_3_RM_6,
1008 PREFIX_0F01_REG_7_MOD_3_RM_7,
1009 PREFIX_0F09,
1010 PREFIX_0F10,
1011 PREFIX_0F11,
1012 PREFIX_0F12,
1013 PREFIX_0F16,
1014 PREFIX_0F18_REG_6_MOD_0_X86_64,
1015 PREFIX_0F18_REG_7_MOD_0_X86_64,
1016 PREFIX_0F1A,
1017 PREFIX_0F1B,
1018 PREFIX_0F1C,
1019 PREFIX_0F1E,
1020 PREFIX_0F2A,
1021 PREFIX_0F2B,
1022 PREFIX_0F2C,
1023 PREFIX_0F2D,
1024 PREFIX_0F2E,
1025 PREFIX_0F2F,
1026 PREFIX_0F51,
1027 PREFIX_0F52,
1028 PREFIX_0F53,
1029 PREFIX_0F58,
1030 PREFIX_0F59,
1031 PREFIX_0F5A,
1032 PREFIX_0F5B,
1033 PREFIX_0F5C,
1034 PREFIX_0F5D,
1035 PREFIX_0F5E,
1036 PREFIX_0F5F,
1037 PREFIX_0F60,
1038 PREFIX_0F61,
1039 PREFIX_0F62,
1040 PREFIX_0F6F,
1041 PREFIX_0F70,
1042 PREFIX_0F78,
1043 PREFIX_0F79,
1044 PREFIX_0F7C,
1045 PREFIX_0F7D,
1046 PREFIX_0F7E,
1047 PREFIX_0F7F,
1048 PREFIX_0FAE_REG_0_MOD_3,
1049 PREFIX_0FAE_REG_1_MOD_3,
1050 PREFIX_0FAE_REG_2_MOD_3,
1051 PREFIX_0FAE_REG_3_MOD_3,
1052 PREFIX_0FAE_REG_4_MOD_0,
1053 PREFIX_0FAE_REG_4_MOD_3,
1054 PREFIX_0FAE_REG_5_MOD_3,
1055 PREFIX_0FAE_REG_6_MOD_0,
1056 PREFIX_0FAE_REG_6_MOD_3,
1057 PREFIX_0FAE_REG_7_MOD_0,
1058 PREFIX_0FB8,
1059 PREFIX_0FBC,
1060 PREFIX_0FBD,
1061 PREFIX_0FC2,
1062 PREFIX_0FC7_REG_6_MOD_0,
1063 PREFIX_0FC7_REG_6_MOD_3,
1064 PREFIX_0FC7_REG_7_MOD_3,
1065 PREFIX_0FD0,
1066 PREFIX_0FD6,
1067 PREFIX_0FE6,
1068 PREFIX_0FE7,
1069 PREFIX_0FF0,
1070 PREFIX_0FF7,
1071 PREFIX_0F38D8,
1072 PREFIX_0F38DC,
1073 PREFIX_0F38DD,
1074 PREFIX_0F38DE,
1075 PREFIX_0F38DF,
1076 PREFIX_0F38F0,
1077 PREFIX_0F38F1,
1078 PREFIX_0F38F6,
1079 PREFIX_0F38F8,
1080 PREFIX_0F38FA,
1081 PREFIX_0F38FB,
1082 PREFIX_0F38FC,
1083 PREFIX_0F3A0F,
1084 PREFIX_VEX_0F10,
1085 PREFIX_VEX_0F11,
1086 PREFIX_VEX_0F12,
1087 PREFIX_VEX_0F16,
1088 PREFIX_VEX_0F2A,
1089 PREFIX_VEX_0F2C,
1090 PREFIX_VEX_0F2D,
1091 PREFIX_VEX_0F2E,
1092 PREFIX_VEX_0F2F,
1093 PREFIX_VEX_0F41_L_1_M_1_W_0,
1094 PREFIX_VEX_0F41_L_1_M_1_W_1,
1095 PREFIX_VEX_0F42_L_1_M_1_W_0,
1096 PREFIX_VEX_0F42_L_1_M_1_W_1,
1097 PREFIX_VEX_0F44_L_0_M_1_W_0,
1098 PREFIX_VEX_0F44_L_0_M_1_W_1,
1099 PREFIX_VEX_0F45_L_1_M_1_W_0,
1100 PREFIX_VEX_0F45_L_1_M_1_W_1,
1101 PREFIX_VEX_0F46_L_1_M_1_W_0,
1102 PREFIX_VEX_0F46_L_1_M_1_W_1,
1103 PREFIX_VEX_0F47_L_1_M_1_W_0,
1104 PREFIX_VEX_0F47_L_1_M_1_W_1,
1105 PREFIX_VEX_0F4A_L_1_M_1_W_0,
1106 PREFIX_VEX_0F4A_L_1_M_1_W_1,
1107 PREFIX_VEX_0F4B_L_1_M_1_W_0,
1108 PREFIX_VEX_0F4B_L_1_M_1_W_1,
1109 PREFIX_VEX_0F51,
1110 PREFIX_VEX_0F52,
1111 PREFIX_VEX_0F53,
1112 PREFIX_VEX_0F58,
1113 PREFIX_VEX_0F59,
1114 PREFIX_VEX_0F5A,
1115 PREFIX_VEX_0F5B,
1116 PREFIX_VEX_0F5C,
1117 PREFIX_VEX_0F5D,
1118 PREFIX_VEX_0F5E,
1119 PREFIX_VEX_0F5F,
1120 PREFIX_VEX_0F6F,
1121 PREFIX_VEX_0F70,
1122 PREFIX_VEX_0F7C,
1123 PREFIX_VEX_0F7D,
1124 PREFIX_VEX_0F7E,
1125 PREFIX_VEX_0F7F,
1126 PREFIX_VEX_0F90_L_0_W_0,
1127 PREFIX_VEX_0F90_L_0_W_1,
1128 PREFIX_VEX_0F91_L_0_M_0_W_0,
1129 PREFIX_VEX_0F91_L_0_M_0_W_1,
1130 PREFIX_VEX_0F92_L_0_M_1_W_0,
1131 PREFIX_VEX_0F92_L_0_M_1_W_1,
1132 PREFIX_VEX_0F93_L_0_M_1_W_0,
1133 PREFIX_VEX_0F93_L_0_M_1_W_1,
1134 PREFIX_VEX_0F98_L_0_M_1_W_0,
1135 PREFIX_VEX_0F98_L_0_M_1_W_1,
1136 PREFIX_VEX_0F99_L_0_M_1_W_0,
1137 PREFIX_VEX_0F99_L_0_M_1_W_1,
1138 PREFIX_VEX_0FC2,
1139 PREFIX_VEX_0FD0,
1140 PREFIX_VEX_0FE6,
1141 PREFIX_VEX_0FF0,
1142 PREFIX_VEX_0F3849_X86_64,
1143 PREFIX_VEX_0F384B_X86_64,
1144 PREFIX_VEX_0F3850_W_0,
1145 PREFIX_VEX_0F3851_W_0,
1146 PREFIX_VEX_0F385C_X86_64,
1147 PREFIX_VEX_0F385E_X86_64,
1148 PREFIX_VEX_0F3872,
1149 PREFIX_VEX_0F38B0_W_0,
1150 PREFIX_VEX_0F38B1_W_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
1156 PREFIX_EVEX_0F5B,
1157 PREFIX_EVEX_0F6F,
1158 PREFIX_EVEX_0F70,
1159 PREFIX_EVEX_0F78,
1160 PREFIX_EVEX_0F79,
1161 PREFIX_EVEX_0F7A,
1162 PREFIX_EVEX_0F7B,
1163 PREFIX_EVEX_0F7E,
1164 PREFIX_EVEX_0F7F,
1165 PREFIX_EVEX_0FC2,
1166 PREFIX_EVEX_0FE6,
1167 PREFIX_EVEX_0F3810,
1168 PREFIX_EVEX_0F3811,
1169 PREFIX_EVEX_0F3812,
1170 PREFIX_EVEX_0F3813,
1171 PREFIX_EVEX_0F3814,
1172 PREFIX_EVEX_0F3815,
1173 PREFIX_EVEX_0F3820,
1174 PREFIX_EVEX_0F3821,
1175 PREFIX_EVEX_0F3822,
1176 PREFIX_EVEX_0F3823,
1177 PREFIX_EVEX_0F3824,
1178 PREFIX_EVEX_0F3825,
1179 PREFIX_EVEX_0F3826,
1180 PREFIX_EVEX_0F3827,
1181 PREFIX_EVEX_0F3828,
1182 PREFIX_EVEX_0F3829,
1183 PREFIX_EVEX_0F382A,
1184 PREFIX_EVEX_0F3830,
1185 PREFIX_EVEX_0F3831,
1186 PREFIX_EVEX_0F3832,
1187 PREFIX_EVEX_0F3833,
1188 PREFIX_EVEX_0F3834,
1189 PREFIX_EVEX_0F3835,
1190 PREFIX_EVEX_0F3838,
1191 PREFIX_EVEX_0F3839,
1192 PREFIX_EVEX_0F383A,
1193 PREFIX_EVEX_0F3852,
1194 PREFIX_EVEX_0F3853,
1195 PREFIX_EVEX_0F3868,
1196 PREFIX_EVEX_0F3872,
1197 PREFIX_EVEX_0F389A,
1198 PREFIX_EVEX_0F389B,
1199 PREFIX_EVEX_0F38AA,
1200 PREFIX_EVEX_0F38AB,
1201
1202 PREFIX_EVEX_0F3A08,
1203 PREFIX_EVEX_0F3A0A,
1204 PREFIX_EVEX_0F3A26,
1205 PREFIX_EVEX_0F3A27,
1206 PREFIX_EVEX_0F3A56,
1207 PREFIX_EVEX_0F3A57,
1208 PREFIX_EVEX_0F3A66,
1209 PREFIX_EVEX_0F3A67,
1210 PREFIX_EVEX_0F3AC2,
1211
1212 PREFIX_EVEX_MAP5_10,
1213 PREFIX_EVEX_MAP5_11,
1214 PREFIX_EVEX_MAP5_1D,
1215 PREFIX_EVEX_MAP5_2A,
1216 PREFIX_EVEX_MAP5_2C,
1217 PREFIX_EVEX_MAP5_2D,
1218 PREFIX_EVEX_MAP5_2E,
1219 PREFIX_EVEX_MAP5_2F,
1220 PREFIX_EVEX_MAP5_51,
1221 PREFIX_EVEX_MAP5_58,
1222 PREFIX_EVEX_MAP5_59,
1223 PREFIX_EVEX_MAP5_5A,
1224 PREFIX_EVEX_MAP5_5B,
1225 PREFIX_EVEX_MAP5_5C,
1226 PREFIX_EVEX_MAP5_5D,
1227 PREFIX_EVEX_MAP5_5E,
1228 PREFIX_EVEX_MAP5_5F,
1229 PREFIX_EVEX_MAP5_78,
1230 PREFIX_EVEX_MAP5_79,
1231 PREFIX_EVEX_MAP5_7A,
1232 PREFIX_EVEX_MAP5_7B,
1233 PREFIX_EVEX_MAP5_7C,
1234 PREFIX_EVEX_MAP5_7D,
1235
1236 PREFIX_EVEX_MAP6_13,
1237 PREFIX_EVEX_MAP6_56,
1238 PREFIX_EVEX_MAP6_57,
1239 PREFIX_EVEX_MAP6_D6,
1240 PREFIX_EVEX_MAP6_D7,
1241 };
1242
1243 enum
1244 {
1245 X86_64_06 = 0,
1246 X86_64_07,
1247 X86_64_0E,
1248 X86_64_16,
1249 X86_64_17,
1250 X86_64_1E,
1251 X86_64_1F,
1252 X86_64_27,
1253 X86_64_2F,
1254 X86_64_37,
1255 X86_64_3F,
1256 X86_64_60,
1257 X86_64_61,
1258 X86_64_62,
1259 X86_64_63,
1260 X86_64_6D,
1261 X86_64_6F,
1262 X86_64_82,
1263 X86_64_9A,
1264 X86_64_C2,
1265 X86_64_C3,
1266 X86_64_C4,
1267 X86_64_C5,
1268 X86_64_CE,
1269 X86_64_D4,
1270 X86_64_D5,
1271 X86_64_E8,
1272 X86_64_E9,
1273 X86_64_EA,
1274 X86_64_0F01_REG_0,
1275 X86_64_0F01_REG_0_MOD_3_RM_6_P_1,
1276 X86_64_0F01_REG_0_MOD_3_RM_6_P_3,
1277 X86_64_0F01_REG_1,
1278 X86_64_0F01_REG_1_RM_5_PREFIX_2,
1279 X86_64_0F01_REG_1_RM_6_PREFIX_2,
1280 X86_64_0F01_REG_1_RM_7_PREFIX_2,
1281 X86_64_0F01_REG_2,
1282 X86_64_0F01_REG_3,
1283 X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1,
1284 X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1,
1285 X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1,
1286 X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1,
1287 X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1,
1288 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1,
1289 X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3,
1290 X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1,
1291 X86_64_0F18_REG_6_MOD_0,
1292 X86_64_0F18_REG_7_MOD_0,
1293 X86_64_0F24,
1294 X86_64_0F26,
1295 X86_64_0FC7_REG_6_MOD_3_PREFIX_1,
1296
1297 X86_64_VEX_0F3849,
1298 X86_64_VEX_0F384B,
1299 X86_64_VEX_0F385C,
1300 X86_64_VEX_0F385E,
1301 X86_64_VEX_0F38E0,
1302 X86_64_VEX_0F38E1,
1303 X86_64_VEX_0F38E2,
1304 X86_64_VEX_0F38E3,
1305 X86_64_VEX_0F38E4,
1306 X86_64_VEX_0F38E5,
1307 X86_64_VEX_0F38E6,
1308 X86_64_VEX_0F38E7,
1309 X86_64_VEX_0F38E8,
1310 X86_64_VEX_0F38E9,
1311 X86_64_VEX_0F38EA,
1312 X86_64_VEX_0F38EB,
1313 X86_64_VEX_0F38EC,
1314 X86_64_VEX_0F38ED,
1315 X86_64_VEX_0F38EE,
1316 X86_64_VEX_0F38EF,
1317 };
1318
1319 enum
1320 {
1321 THREE_BYTE_0F38 = 0,
1322 THREE_BYTE_0F3A
1323 };
1324
1325 enum
1326 {
1327 XOP_08 = 0,
1328 XOP_09,
1329 XOP_0A
1330 };
1331
1332 enum
1333 {
1334 VEX_0F = 0,
1335 VEX_0F38,
1336 VEX_0F3A
1337 };
1338
1339 enum
1340 {
1341 EVEX_0F = 0,
1342 EVEX_0F38,
1343 EVEX_0F3A,
1344 EVEX_MAP5,
1345 EVEX_MAP6,
1346 };
1347
1348 enum
1349 {
1350 VEX_LEN_0F12_P_0_M_0 = 0,
1351 VEX_LEN_0F12_P_0_M_1,
1352 #define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
1353 VEX_LEN_0F13_M_0,
1354 VEX_LEN_0F16_P_0_M_0,
1355 VEX_LEN_0F16_P_0_M_1,
1356 #define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
1357 VEX_LEN_0F17_M_0,
1358 VEX_LEN_0F41,
1359 VEX_LEN_0F42,
1360 VEX_LEN_0F44,
1361 VEX_LEN_0F45,
1362 VEX_LEN_0F46,
1363 VEX_LEN_0F47,
1364 VEX_LEN_0F4A,
1365 VEX_LEN_0F4B,
1366 VEX_LEN_0F6E,
1367 VEX_LEN_0F77,
1368 VEX_LEN_0F7E_P_1,
1369 VEX_LEN_0F7E_P_2,
1370 VEX_LEN_0F90,
1371 VEX_LEN_0F91,
1372 VEX_LEN_0F92,
1373 VEX_LEN_0F93,
1374 VEX_LEN_0F98,
1375 VEX_LEN_0F99,
1376 VEX_LEN_0FAE_R_2_M_0,
1377 VEX_LEN_0FAE_R_3_M_0,
1378 VEX_LEN_0FC4,
1379 VEX_LEN_0FC5,
1380 VEX_LEN_0FD6,
1381 VEX_LEN_0FF7,
1382 VEX_LEN_0F3816,
1383 VEX_LEN_0F3819,
1384 VEX_LEN_0F381A_M_0,
1385 VEX_LEN_0F3836,
1386 VEX_LEN_0F3841,
1387 VEX_LEN_0F3849_X86_64_P_0_W_0_M_0,
1388 VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0,
1389 VEX_LEN_0F3849_X86_64_P_2_W_0_M_0,
1390 VEX_LEN_0F3849_X86_64_P_3_W_0_M_0,
1391 VEX_LEN_0F384B_X86_64_P_1_W_0_M_0,
1392 VEX_LEN_0F384B_X86_64_P_2_W_0_M_0,
1393 VEX_LEN_0F384B_X86_64_P_3_W_0_M_0,
1394 VEX_LEN_0F385A_M_0,
1395 VEX_LEN_0F385C_X86_64_P_1_W_0_M_0,
1396 VEX_LEN_0F385C_X86_64_P_3_W_0_M_0,
1397 VEX_LEN_0F385E_X86_64_P_0_W_0_M_0,
1398 VEX_LEN_0F385E_X86_64_P_1_W_0_M_0,
1399 VEX_LEN_0F385E_X86_64_P_2_W_0_M_0,
1400 VEX_LEN_0F385E_X86_64_P_3_W_0_M_0,
1401 VEX_LEN_0F38DB,
1402 VEX_LEN_0F38F2,
1403 VEX_LEN_0F38F3,
1404 VEX_LEN_0F38F5,
1405 VEX_LEN_0F38F6,
1406 VEX_LEN_0F38F7,
1407 VEX_LEN_0F3A00,
1408 VEX_LEN_0F3A01,
1409 VEX_LEN_0F3A06,
1410 VEX_LEN_0F3A14,
1411 VEX_LEN_0F3A15,
1412 VEX_LEN_0F3A16,
1413 VEX_LEN_0F3A17,
1414 VEX_LEN_0F3A18,
1415 VEX_LEN_0F3A19,
1416 VEX_LEN_0F3A20,
1417 VEX_LEN_0F3A21,
1418 VEX_LEN_0F3A22,
1419 VEX_LEN_0F3A30,
1420 VEX_LEN_0F3A31,
1421 VEX_LEN_0F3A32,
1422 VEX_LEN_0F3A33,
1423 VEX_LEN_0F3A38,
1424 VEX_LEN_0F3A39,
1425 VEX_LEN_0F3A41,
1426 VEX_LEN_0F3A46,
1427 VEX_LEN_0F3A60,
1428 VEX_LEN_0F3A61,
1429 VEX_LEN_0F3A62,
1430 VEX_LEN_0F3A63,
1431 VEX_LEN_0F3ADF,
1432 VEX_LEN_0F3AF0,
1433 VEX_LEN_0FXOP_08_85,
1434 VEX_LEN_0FXOP_08_86,
1435 VEX_LEN_0FXOP_08_87,
1436 VEX_LEN_0FXOP_08_8E,
1437 VEX_LEN_0FXOP_08_8F,
1438 VEX_LEN_0FXOP_08_95,
1439 VEX_LEN_0FXOP_08_96,
1440 VEX_LEN_0FXOP_08_97,
1441 VEX_LEN_0FXOP_08_9E,
1442 VEX_LEN_0FXOP_08_9F,
1443 VEX_LEN_0FXOP_08_A3,
1444 VEX_LEN_0FXOP_08_A6,
1445 VEX_LEN_0FXOP_08_B6,
1446 VEX_LEN_0FXOP_08_C0,
1447 VEX_LEN_0FXOP_08_C1,
1448 VEX_LEN_0FXOP_08_C2,
1449 VEX_LEN_0FXOP_08_C3,
1450 VEX_LEN_0FXOP_08_CC,
1451 VEX_LEN_0FXOP_08_CD,
1452 VEX_LEN_0FXOP_08_CE,
1453 VEX_LEN_0FXOP_08_CF,
1454 VEX_LEN_0FXOP_08_EC,
1455 VEX_LEN_0FXOP_08_ED,
1456 VEX_LEN_0FXOP_08_EE,
1457 VEX_LEN_0FXOP_08_EF,
1458 VEX_LEN_0FXOP_09_01,
1459 VEX_LEN_0FXOP_09_02,
1460 VEX_LEN_0FXOP_09_12_M_1,
1461 VEX_LEN_0FXOP_09_82_W_0,
1462 VEX_LEN_0FXOP_09_83_W_0,
1463 VEX_LEN_0FXOP_09_90,
1464 VEX_LEN_0FXOP_09_91,
1465 VEX_LEN_0FXOP_09_92,
1466 VEX_LEN_0FXOP_09_93,
1467 VEX_LEN_0FXOP_09_94,
1468 VEX_LEN_0FXOP_09_95,
1469 VEX_LEN_0FXOP_09_96,
1470 VEX_LEN_0FXOP_09_97,
1471 VEX_LEN_0FXOP_09_98,
1472 VEX_LEN_0FXOP_09_99,
1473 VEX_LEN_0FXOP_09_9A,
1474 VEX_LEN_0FXOP_09_9B,
1475 VEX_LEN_0FXOP_09_C1,
1476 VEX_LEN_0FXOP_09_C2,
1477 VEX_LEN_0FXOP_09_C3,
1478 VEX_LEN_0FXOP_09_C6,
1479 VEX_LEN_0FXOP_09_C7,
1480 VEX_LEN_0FXOP_09_CB,
1481 VEX_LEN_0FXOP_09_D1,
1482 VEX_LEN_0FXOP_09_D2,
1483 VEX_LEN_0FXOP_09_D3,
1484 VEX_LEN_0FXOP_09_D6,
1485 VEX_LEN_0FXOP_09_D7,
1486 VEX_LEN_0FXOP_09_DB,
1487 VEX_LEN_0FXOP_09_E1,
1488 VEX_LEN_0FXOP_09_E2,
1489 VEX_LEN_0FXOP_09_E3,
1490 VEX_LEN_0FXOP_0A_12,
1491 };
1492
1493 enum
1494 {
1495 EVEX_LEN_0F3816 = 0,
1496 EVEX_LEN_0F3819,
1497 EVEX_LEN_0F381A_M_0,
1498 EVEX_LEN_0F381B_M_0,
1499 EVEX_LEN_0F3836,
1500 EVEX_LEN_0F385A_M_0,
1501 EVEX_LEN_0F385B_M_0,
1502 EVEX_LEN_0F38C6_M_0,
1503 EVEX_LEN_0F38C7_M_0,
1504 EVEX_LEN_0F3A00,
1505 EVEX_LEN_0F3A01,
1506 EVEX_LEN_0F3A18,
1507 EVEX_LEN_0F3A19,
1508 EVEX_LEN_0F3A1A,
1509 EVEX_LEN_0F3A1B,
1510 EVEX_LEN_0F3A23,
1511 EVEX_LEN_0F3A38,
1512 EVEX_LEN_0F3A39,
1513 EVEX_LEN_0F3A3A,
1514 EVEX_LEN_0F3A3B,
1515 EVEX_LEN_0F3A43
1516 };
1517
1518 enum
1519 {
1520 VEX_W_0F41_L_1_M_1 = 0,
1521 VEX_W_0F42_L_1_M_1,
1522 VEX_W_0F44_L_0_M_1,
1523 VEX_W_0F45_L_1_M_1,
1524 VEX_W_0F46_L_1_M_1,
1525 VEX_W_0F47_L_1_M_1,
1526 VEX_W_0F4A_L_1_M_1,
1527 VEX_W_0F4B_L_1_M_1,
1528 VEX_W_0F90_L_0,
1529 VEX_W_0F91_L_0_M_0,
1530 VEX_W_0F92_L_0_M_1,
1531 VEX_W_0F93_L_0_M_1,
1532 VEX_W_0F98_L_0_M_1,
1533 VEX_W_0F99_L_0_M_1,
1534 VEX_W_0F380C,
1535 VEX_W_0F380D,
1536 VEX_W_0F380E,
1537 VEX_W_0F380F,
1538 VEX_W_0F3813,
1539 VEX_W_0F3816_L_1,
1540 VEX_W_0F3818,
1541 VEX_W_0F3819_L_1,
1542 VEX_W_0F381A_M_0_L_1,
1543 VEX_W_0F382C_M_0,
1544 VEX_W_0F382D_M_0,
1545 VEX_W_0F382E_M_0,
1546 VEX_W_0F382F_M_0,
1547 VEX_W_0F3836,
1548 VEX_W_0F3846,
1549 VEX_W_0F3849_X86_64_P_0,
1550 VEX_W_0F3849_X86_64_P_2,
1551 VEX_W_0F3849_X86_64_P_3,
1552 VEX_W_0F384B_X86_64_P_1,
1553 VEX_W_0F384B_X86_64_P_2,
1554 VEX_W_0F384B_X86_64_P_3,
1555 VEX_W_0F3850,
1556 VEX_W_0F3851,
1557 VEX_W_0F3852,
1558 VEX_W_0F3853,
1559 VEX_W_0F3858,
1560 VEX_W_0F3859,
1561 VEX_W_0F385A_M_0_L_0,
1562 VEX_W_0F385C_X86_64_P_1,
1563 VEX_W_0F385C_X86_64_P_3,
1564 VEX_W_0F385E_X86_64_P_0,
1565 VEX_W_0F385E_X86_64_P_1,
1566 VEX_W_0F385E_X86_64_P_2,
1567 VEX_W_0F385E_X86_64_P_3,
1568 VEX_W_0F3872_P_1,
1569 VEX_W_0F3878,
1570 VEX_W_0F3879,
1571 VEX_W_0F38B0,
1572 VEX_W_0F38B1,
1573 VEX_W_0F38B4,
1574 VEX_W_0F38B5,
1575 VEX_W_0F38CF,
1576 VEX_W_0F3A00_L_1,
1577 VEX_W_0F3A01_L_1,
1578 VEX_W_0F3A02,
1579 VEX_W_0F3A04,
1580 VEX_W_0F3A05,
1581 VEX_W_0F3A06_L_1,
1582 VEX_W_0F3A18_L_1,
1583 VEX_W_0F3A19_L_1,
1584 VEX_W_0F3A1D,
1585 VEX_W_0F3A38_L_1,
1586 VEX_W_0F3A39_L_1,
1587 VEX_W_0F3A46_L_1,
1588 VEX_W_0F3A4A,
1589 VEX_W_0F3A4B,
1590 VEX_W_0F3A4C,
1591 VEX_W_0F3ACE,
1592 VEX_W_0F3ACF,
1593
1594 VEX_W_0FXOP_08_85_L_0,
1595 VEX_W_0FXOP_08_86_L_0,
1596 VEX_W_0FXOP_08_87_L_0,
1597 VEX_W_0FXOP_08_8E_L_0,
1598 VEX_W_0FXOP_08_8F_L_0,
1599 VEX_W_0FXOP_08_95_L_0,
1600 VEX_W_0FXOP_08_96_L_0,
1601 VEX_W_0FXOP_08_97_L_0,
1602 VEX_W_0FXOP_08_9E_L_0,
1603 VEX_W_0FXOP_08_9F_L_0,
1604 VEX_W_0FXOP_08_A6_L_0,
1605 VEX_W_0FXOP_08_B6_L_0,
1606 VEX_W_0FXOP_08_C0_L_0,
1607 VEX_W_0FXOP_08_C1_L_0,
1608 VEX_W_0FXOP_08_C2_L_0,
1609 VEX_W_0FXOP_08_C3_L_0,
1610 VEX_W_0FXOP_08_CC_L_0,
1611 VEX_W_0FXOP_08_CD_L_0,
1612 VEX_W_0FXOP_08_CE_L_0,
1613 VEX_W_0FXOP_08_CF_L_0,
1614 VEX_W_0FXOP_08_EC_L_0,
1615 VEX_W_0FXOP_08_ED_L_0,
1616 VEX_W_0FXOP_08_EE_L_0,
1617 VEX_W_0FXOP_08_EF_L_0,
1618
1619 VEX_W_0FXOP_09_80,
1620 VEX_W_0FXOP_09_81,
1621 VEX_W_0FXOP_09_82,
1622 VEX_W_0FXOP_09_83,
1623 VEX_W_0FXOP_09_C1_L_0,
1624 VEX_W_0FXOP_09_C2_L_0,
1625 VEX_W_0FXOP_09_C3_L_0,
1626 VEX_W_0FXOP_09_C6_L_0,
1627 VEX_W_0FXOP_09_C7_L_0,
1628 VEX_W_0FXOP_09_CB_L_0,
1629 VEX_W_0FXOP_09_D1_L_0,
1630 VEX_W_0FXOP_09_D2_L_0,
1631 VEX_W_0FXOP_09_D3_L_0,
1632 VEX_W_0FXOP_09_D6_L_0,
1633 VEX_W_0FXOP_09_D7_L_0,
1634 VEX_W_0FXOP_09_DB_L_0,
1635 VEX_W_0FXOP_09_E1_L_0,
1636 VEX_W_0FXOP_09_E2_L_0,
1637 VEX_W_0FXOP_09_E3_L_0,
1638
1639 EVEX_W_0F5B_P_0,
1640 EVEX_W_0F62,
1641 EVEX_W_0F66,
1642 EVEX_W_0F6A,
1643 EVEX_W_0F6B,
1644 EVEX_W_0F6C,
1645 EVEX_W_0F6D,
1646 EVEX_W_0F6F_P_1,
1647 EVEX_W_0F6F_P_2,
1648 EVEX_W_0F6F_P_3,
1649 EVEX_W_0F70_P_2,
1650 EVEX_W_0F72_R_2,
1651 EVEX_W_0F72_R_6,
1652 EVEX_W_0F73_R_2,
1653 EVEX_W_0F73_R_6,
1654 EVEX_W_0F76,
1655 EVEX_W_0F78_P_0,
1656 EVEX_W_0F78_P_2,
1657 EVEX_W_0F79_P_0,
1658 EVEX_W_0F79_P_2,
1659 EVEX_W_0F7A_P_1,
1660 EVEX_W_0F7A_P_2,
1661 EVEX_W_0F7A_P_3,
1662 EVEX_W_0F7B_P_2,
1663 EVEX_W_0F7E_P_1,
1664 EVEX_W_0F7F_P_1,
1665 EVEX_W_0F7F_P_2,
1666 EVEX_W_0F7F_P_3,
1667 EVEX_W_0FD2,
1668 EVEX_W_0FD3,
1669 EVEX_W_0FD4,
1670 EVEX_W_0FD6,
1671 EVEX_W_0FE6_P_1,
1672 EVEX_W_0FE7,
1673 EVEX_W_0FF2,
1674 EVEX_W_0FF3,
1675 EVEX_W_0FF4,
1676 EVEX_W_0FFA,
1677 EVEX_W_0FFB,
1678 EVEX_W_0FFE,
1679
1680 EVEX_W_0F3810_P_1,
1681 EVEX_W_0F3810_P_2,
1682 EVEX_W_0F3811_P_1,
1683 EVEX_W_0F3811_P_2,
1684 EVEX_W_0F3812_P_1,
1685 EVEX_W_0F3812_P_2,
1686 EVEX_W_0F3813_P_1,
1687 EVEX_W_0F3814_P_1,
1688 EVEX_W_0F3815_P_1,
1689 EVEX_W_0F3819_L_n,
1690 EVEX_W_0F381A_M_0_L_n,
1691 EVEX_W_0F381B_M_0_L_2,
1692 EVEX_W_0F381E,
1693 EVEX_W_0F381F,
1694 EVEX_W_0F3820_P_1,
1695 EVEX_W_0F3821_P_1,
1696 EVEX_W_0F3822_P_1,
1697 EVEX_W_0F3823_P_1,
1698 EVEX_W_0F3824_P_1,
1699 EVEX_W_0F3825_P_1,
1700 EVEX_W_0F3825_P_2,
1701 EVEX_W_0F3828_P_2,
1702 EVEX_W_0F3829_P_2,
1703 EVEX_W_0F382A_P_1,
1704 EVEX_W_0F382A_P_2,
1705 EVEX_W_0F382B,
1706 EVEX_W_0F3830_P_1,
1707 EVEX_W_0F3831_P_1,
1708 EVEX_W_0F3832_P_1,
1709 EVEX_W_0F3833_P_1,
1710 EVEX_W_0F3834_P_1,
1711 EVEX_W_0F3835_P_1,
1712 EVEX_W_0F3835_P_2,
1713 EVEX_W_0F3837,
1714 EVEX_W_0F383A_P_1,
1715 EVEX_W_0F3859,
1716 EVEX_W_0F385A_M_0_L_n,
1717 EVEX_W_0F385B_M_0_L_2,
1718 EVEX_W_0F3870,
1719 EVEX_W_0F3872_P_2,
1720 EVEX_W_0F387A,
1721 EVEX_W_0F387B,
1722 EVEX_W_0F3883,
1723
1724 EVEX_W_0F3A18_L_n,
1725 EVEX_W_0F3A19_L_n,
1726 EVEX_W_0F3A1A_L_2,
1727 EVEX_W_0F3A1B_L_2,
1728 EVEX_W_0F3A21,
1729 EVEX_W_0F3A23_L_n,
1730 EVEX_W_0F3A38_L_n,
1731 EVEX_W_0F3A39_L_n,
1732 EVEX_W_0F3A3A_L_2,
1733 EVEX_W_0F3A3B_L_2,
1734 EVEX_W_0F3A42,
1735 EVEX_W_0F3A43_L_n,
1736 EVEX_W_0F3A70,
1737 EVEX_W_0F3A72,
1738
1739 EVEX_W_MAP5_5B_P_0,
1740 EVEX_W_MAP5_7A_P_3,
1741 };
1742
1743 typedef void (*op_rtn) (instr_info *ins, int bytemode, int sizeflag);
1744
1745 struct dis386 {
1746 const char *name;
1747 struct
1748 {
1749 op_rtn rtn;
1750 int bytemode;
1751 } op[MAX_OPERANDS];
1752 unsigned int prefix_requirement;
1753 };
1754
1755 /* Upper case letters in the instruction names here are macros.
1756 'A' => print 'b' if no register operands or suffix_always is true
1757 'B' => print 'b' if suffix_always is true
1758 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
1759 size prefix
1760 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
1761 suffix_always is true
1762 'E' => print 'e' if 32-bit form of jcxz
1763 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
1764 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
1765 'H' => print ",pt" or ",pn" branch hint
1766 'I' unused.
1767 'J' unused.
1768 'K' => print 'd' or 'q' if rex prefix is present.
1769 'L' unused.
1770 'M' => print 'r' if intel_mnemonic is false.
1771 'N' => print 'n' if instruction has no wait "prefix"
1772 'O' => print 'd' or 'o' (or 'q' in Intel mode)
1773 'P' => behave as 'T' except with register operand outside of suffix_always
1774 mode
1775 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
1776 is true
1777 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
1778 'S' => print 'w', 'l' or 'q' if suffix_always is true
1779 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
1780 prefix or if suffix_always is true.
1781 'U' unused.
1782 'V' unused.
1783 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
1784 'X' => print 's', 'd' depending on data16 prefix (for XMM)
1785 'Y' unused.
1786 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
1787 '!' => change condition from true to false or from false to true.
1788 '%' => add 1 upper case letter to the macro.
1789 '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
1790 prefix or suffix_always is true (lcall/ljmp).
1791 '@' => in 64bit mode for Intel64 ISA or if instruction
1792 has no operand sizing prefix, print 'q' if suffix_always is true or
1793 nothing otherwise; behave as 'P' in all other cases
1794
1795 2 upper case letter macros:
1796 "XY" => print 'x' or 'y' if suffix_always is true or no register
1797 operands and no broadcast.
1798 "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
1799 register operands and no broadcast.
1800 "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
1801 "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
1802 "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
1803 "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
1804 "XV" => print "{vex} " pseudo prefix
1805 "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is
1806 is used by an EVEX-encoded (AVX512VL) instruction.
1807 "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
1808 being false, or no operand at all in 64bit mode, or if suffix_always
1809 is true.
1810 "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
1811 "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
1812 "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
1813 "DQ" => print 'd' or 'q' depending on the VEX.W bit
1814 "BW" => print 'b' or 'w' depending on the VEX.W bit
1815 "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
1816 an operand size prefix, or suffix_always is true. print
1817 'q' if rex prefix is present.
1818
1819 Many of the above letters print nothing in Intel mode. See "putop"
1820 for the details.
1821
1822 Braces '{' and '}', and vertical bars '|', indicate alternative
1823 mnemonic strings for AT&T and Intel. */
1824
1825 static const struct dis386 dis386[] = {
1826 /* 00 */
1827 { "addB", { Ebh1, Gb }, 0 },
1828 { "addS", { Evh1, Gv }, 0 },
1829 { "addB", { Gb, EbS }, 0 },
1830 { "addS", { Gv, EvS }, 0 },
1831 { "addB", { AL, Ib }, 0 },
1832 { "addS", { eAX, Iv }, 0 },
1833 { X86_64_TABLE (X86_64_06) },
1834 { X86_64_TABLE (X86_64_07) },
1835 /* 08 */
1836 { "orB", { Ebh1, Gb }, 0 },
1837 { "orS", { Evh1, Gv }, 0 },
1838 { "orB", { Gb, EbS }, 0 },
1839 { "orS", { Gv, EvS }, 0 },
1840 { "orB", { AL, Ib }, 0 },
1841 { "orS", { eAX, Iv }, 0 },
1842 { X86_64_TABLE (X86_64_0E) },
1843 { Bad_Opcode }, /* 0x0f extended opcode escape */
1844 /* 10 */
1845 { "adcB", { Ebh1, Gb }, 0 },
1846 { "adcS", { Evh1, Gv }, 0 },
1847 { "adcB", { Gb, EbS }, 0 },
1848 { "adcS", { Gv, EvS }, 0 },
1849 { "adcB", { AL, Ib }, 0 },
1850 { "adcS", { eAX, Iv }, 0 },
1851 { X86_64_TABLE (X86_64_16) },
1852 { X86_64_TABLE (X86_64_17) },
1853 /* 18 */
1854 { "sbbB", { Ebh1, Gb }, 0 },
1855 { "sbbS", { Evh1, Gv }, 0 },
1856 { "sbbB", { Gb, EbS }, 0 },
1857 { "sbbS", { Gv, EvS }, 0 },
1858 { "sbbB", { AL, Ib }, 0 },
1859 { "sbbS", { eAX, Iv }, 0 },
1860 { X86_64_TABLE (X86_64_1E) },
1861 { X86_64_TABLE (X86_64_1F) },
1862 /* 20 */
1863 { "andB", { Ebh1, Gb }, 0 },
1864 { "andS", { Evh1, Gv }, 0 },
1865 { "andB", { Gb, EbS }, 0 },
1866 { "andS", { Gv, EvS }, 0 },
1867 { "andB", { AL, Ib }, 0 },
1868 { "andS", { eAX, Iv }, 0 },
1869 { Bad_Opcode }, /* SEG ES prefix */
1870 { X86_64_TABLE (X86_64_27) },
1871 /* 28 */
1872 { "subB", { Ebh1, Gb }, 0 },
1873 { "subS", { Evh1, Gv }, 0 },
1874 { "subB", { Gb, EbS }, 0 },
1875 { "subS", { Gv, EvS }, 0 },
1876 { "subB", { AL, Ib }, 0 },
1877 { "subS", { eAX, Iv }, 0 },
1878 { Bad_Opcode }, /* SEG CS prefix */
1879 { X86_64_TABLE (X86_64_2F) },
1880 /* 30 */
1881 { "xorB", { Ebh1, Gb }, 0 },
1882 { "xorS", { Evh1, Gv }, 0 },
1883 { "xorB", { Gb, EbS }, 0 },
1884 { "xorS", { Gv, EvS }, 0 },
1885 { "xorB", { AL, Ib }, 0 },
1886 { "xorS", { eAX, Iv }, 0 },
1887 { Bad_Opcode }, /* SEG SS prefix */
1888 { X86_64_TABLE (X86_64_37) },
1889 /* 38 */
1890 { "cmpB", { Eb, Gb }, 0 },
1891 { "cmpS", { Ev, Gv }, 0 },
1892 { "cmpB", { Gb, EbS }, 0 },
1893 { "cmpS", { Gv, EvS }, 0 },
1894 { "cmpB", { AL, Ib }, 0 },
1895 { "cmpS", { eAX, Iv }, 0 },
1896 { Bad_Opcode }, /* SEG DS prefix */
1897 { X86_64_TABLE (X86_64_3F) },
1898 /* 40 */
1899 { "inc{S|}", { RMeAX }, 0 },
1900 { "inc{S|}", { RMeCX }, 0 },
1901 { "inc{S|}", { RMeDX }, 0 },
1902 { "inc{S|}", { RMeBX }, 0 },
1903 { "inc{S|}", { RMeSP }, 0 },
1904 { "inc{S|}", { RMeBP }, 0 },
1905 { "inc{S|}", { RMeSI }, 0 },
1906 { "inc{S|}", { RMeDI }, 0 },
1907 /* 48 */
1908 { "dec{S|}", { RMeAX }, 0 },
1909 { "dec{S|}", { RMeCX }, 0 },
1910 { "dec{S|}", { RMeDX }, 0 },
1911 { "dec{S|}", { RMeBX }, 0 },
1912 { "dec{S|}", { RMeSP }, 0 },
1913 { "dec{S|}", { RMeBP }, 0 },
1914 { "dec{S|}", { RMeSI }, 0 },
1915 { "dec{S|}", { RMeDI }, 0 },
1916 /* 50 */
1917 { "push{!P|}", { RMrAX }, 0 },
1918 { "push{!P|}", { RMrCX }, 0 },
1919 { "push{!P|}", { RMrDX }, 0 },
1920 { "push{!P|}", { RMrBX }, 0 },
1921 { "push{!P|}", { RMrSP }, 0 },
1922 { "push{!P|}", { RMrBP }, 0 },
1923 { "push{!P|}", { RMrSI }, 0 },
1924 { "push{!P|}", { RMrDI }, 0 },
1925 /* 58 */
1926 { "pop{!P|}", { RMrAX }, 0 },
1927 { "pop{!P|}", { RMrCX }, 0 },
1928 { "pop{!P|}", { RMrDX }, 0 },
1929 { "pop{!P|}", { RMrBX }, 0 },
1930 { "pop{!P|}", { RMrSP }, 0 },
1931 { "pop{!P|}", { RMrBP }, 0 },
1932 { "pop{!P|}", { RMrSI }, 0 },
1933 { "pop{!P|}", { RMrDI }, 0 },
1934 /* 60 */
1935 { X86_64_TABLE (X86_64_60) },
1936 { X86_64_TABLE (X86_64_61) },
1937 { X86_64_TABLE (X86_64_62) },
1938 { X86_64_TABLE (X86_64_63) },
1939 { Bad_Opcode }, /* seg fs */
1940 { Bad_Opcode }, /* seg gs */
1941 { Bad_Opcode }, /* op size prefix */
1942 { Bad_Opcode }, /* adr size prefix */
1943 /* 68 */
1944 { "pushP", { sIv }, 0 },
1945 { "imulS", { Gv, Ev, Iv }, 0 },
1946 { "pushP", { sIbT }, 0 },
1947 { "imulS", { Gv, Ev, sIb }, 0 },
1948 { "ins{b|}", { Ybr, indirDX }, 0 },
1949 { X86_64_TABLE (X86_64_6D) },
1950 { "outs{b|}", { indirDXr, Xb }, 0 },
1951 { X86_64_TABLE (X86_64_6F) },
1952 /* 70 */
1953 { "joH", { Jb, BND, cond_jump_flag }, 0 },
1954 { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
1955 { "jbH", { Jb, BND, cond_jump_flag }, 0 },
1956 { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
1957 { "jeH", { Jb, BND, cond_jump_flag }, 0 },
1958 { "jneH", { Jb, BND, cond_jump_flag }, 0 },
1959 { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
1960 { "jaH", { Jb, BND, cond_jump_flag }, 0 },
1961 /* 78 */
1962 { "jsH", { Jb, BND, cond_jump_flag }, 0 },
1963 { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
1964 { "jpH", { Jb, BND, cond_jump_flag }, 0 },
1965 { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
1966 { "jlH", { Jb, BND, cond_jump_flag }, 0 },
1967 { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
1968 { "jleH", { Jb, BND, cond_jump_flag }, 0 },
1969 { "jgH", { Jb, BND, cond_jump_flag }, 0 },
1970 /* 80 */
1971 { REG_TABLE (REG_80) },
1972 { REG_TABLE (REG_81) },
1973 { X86_64_TABLE (X86_64_82) },
1974 { REG_TABLE (REG_83) },
1975 { "testB", { Eb, Gb }, 0 },
1976 { "testS", { Ev, Gv }, 0 },
1977 { "xchgB", { Ebh2, Gb }, 0 },
1978 { "xchgS", { Evh2, Gv }, 0 },
1979 /* 88 */
1980 { "movB", { Ebh3, Gb }, 0 },
1981 { "movS", { Evh3, Gv }, 0 },
1982 { "movB", { Gb, EbS }, 0 },
1983 { "movS", { Gv, EvS }, 0 },
1984 { "movD", { Sv, Sw }, 0 },
1985 { MOD_TABLE (MOD_8D) },
1986 { "movD", { Sw, Sv }, 0 },
1987 { REG_TABLE (REG_8F) },
1988 /* 90 */
1989 { PREFIX_TABLE (PREFIX_90) },
1990 { "xchgS", { RMeCX, eAX }, 0 },
1991 { "xchgS", { RMeDX, eAX }, 0 },
1992 { "xchgS", { RMeBX, eAX }, 0 },
1993 { "xchgS", { RMeSP, eAX }, 0 },
1994 { "xchgS", { RMeBP, eAX }, 0 },
1995 { "xchgS", { RMeSI, eAX }, 0 },
1996 { "xchgS", { RMeDI, eAX }, 0 },
1997 /* 98 */
1998 { "cW{t|}R", { XX }, 0 },
1999 { "cR{t|}O", { XX }, 0 },
2000 { X86_64_TABLE (X86_64_9A) },
2001 { Bad_Opcode }, /* fwait */
2002 { "pushfP", { XX }, 0 },
2003 { "popfP", { XX }, 0 },
2004 { "sahf", { XX }, 0 },
2005 { "lahf", { XX }, 0 },
2006 /* a0 */
2007 { "mov%LB", { AL, Ob }, 0 },
2008 { "mov%LS", { eAX, Ov }, 0 },
2009 { "mov%LB", { Ob, AL }, 0 },
2010 { "mov%LS", { Ov, eAX }, 0 },
2011 { "movs{b|}", { Ybr, Xb }, 0 },
2012 { "movs{R|}", { Yvr, Xv }, 0 },
2013 { "cmps{b|}", { Xb, Yb }, 0 },
2014 { "cmps{R|}", { Xv, Yv }, 0 },
2015 /* a8 */
2016 { "testB", { AL, Ib }, 0 },
2017 { "testS", { eAX, Iv }, 0 },
2018 { "stosB", { Ybr, AL }, 0 },
2019 { "stosS", { Yvr, eAX }, 0 },
2020 { "lodsB", { ALr, Xb }, 0 },
2021 { "lodsS", { eAXr, Xv }, 0 },
2022 { "scasB", { AL, Yb }, 0 },
2023 { "scasS", { eAX, Yv }, 0 },
2024 /* b0 */
2025 { "movB", { RMAL, Ib }, 0 },
2026 { "movB", { RMCL, Ib }, 0 },
2027 { "movB", { RMDL, Ib }, 0 },
2028 { "movB", { RMBL, Ib }, 0 },
2029 { "movB", { RMAH, Ib }, 0 },
2030 { "movB", { RMCH, Ib }, 0 },
2031 { "movB", { RMDH, Ib }, 0 },
2032 { "movB", { RMBH, Ib }, 0 },
2033 /* b8 */
2034 { "mov%LV", { RMeAX, Iv64 }, 0 },
2035 { "mov%LV", { RMeCX, Iv64 }, 0 },
2036 { "mov%LV", { RMeDX, Iv64 }, 0 },
2037 { "mov%LV", { RMeBX, Iv64 }, 0 },
2038 { "mov%LV", { RMeSP, Iv64 }, 0 },
2039 { "mov%LV", { RMeBP, Iv64 }, 0 },
2040 { "mov%LV", { RMeSI, Iv64 }, 0 },
2041 { "mov%LV", { RMeDI, Iv64 }, 0 },
2042 /* c0 */
2043 { REG_TABLE (REG_C0) },
2044 { REG_TABLE (REG_C1) },
2045 { X86_64_TABLE (X86_64_C2) },
2046 { X86_64_TABLE (X86_64_C3) },
2047 { X86_64_TABLE (X86_64_C4) },
2048 { X86_64_TABLE (X86_64_C5) },
2049 { REG_TABLE (REG_C6) },
2050 { REG_TABLE (REG_C7) },
2051 /* c8 */
2052 { "enterP", { Iw, Ib }, 0 },
2053 { "leaveP", { XX }, 0 },
2054 { "{l|}ret{|f}%LP", { Iw }, 0 },
2055 { "{l|}ret{|f}%LP", { XX }, 0 },
2056 { "int3", { XX }, 0 },
2057 { "int", { Ib }, 0 },
2058 { X86_64_TABLE (X86_64_CE) },
2059 { "iret%LP", { XX }, 0 },
2060 /* d0 */
2061 { REG_TABLE (REG_D0) },
2062 { REG_TABLE (REG_D1) },
2063 { REG_TABLE (REG_D2) },
2064 { REG_TABLE (REG_D3) },
2065 { X86_64_TABLE (X86_64_D4) },
2066 { X86_64_TABLE (X86_64_D5) },
2067 { Bad_Opcode },
2068 { "xlat", { DSBX }, 0 },
2069 /* d8 */
2070 { FLOAT },
2071 { FLOAT },
2072 { FLOAT },
2073 { FLOAT },
2074 { FLOAT },
2075 { FLOAT },
2076 { FLOAT },
2077 { FLOAT },
2078 /* e0 */
2079 { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
2080 { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
2081 { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
2082 { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
2083 { "inB", { AL, Ib }, 0 },
2084 { "inG", { zAX, Ib }, 0 },
2085 { "outB", { Ib, AL }, 0 },
2086 { "outG", { Ib, zAX }, 0 },
2087 /* e8 */
2088 { X86_64_TABLE (X86_64_E8) },
2089 { X86_64_TABLE (X86_64_E9) },
2090 { X86_64_TABLE (X86_64_EA) },
2091 { "jmp", { Jb, BND }, 0 },
2092 { "inB", { AL, indirDX }, 0 },
2093 { "inG", { zAX, indirDX }, 0 },
2094 { "outB", { indirDX, AL }, 0 },
2095 { "outG", { indirDX, zAX }, 0 },
2096 /* f0 */
2097 { Bad_Opcode }, /* lock prefix */
2098 { "int1", { XX }, 0 },
2099 { Bad_Opcode }, /* repne */
2100 { Bad_Opcode }, /* repz */
2101 { "hlt", { XX }, 0 },
2102 { "cmc", { XX }, 0 },
2103 { REG_TABLE (REG_F6) },
2104 { REG_TABLE (REG_F7) },
2105 /* f8 */
2106 { "clc", { XX }, 0 },
2107 { "stc", { XX }, 0 },
2108 { "cli", { XX }, 0 },
2109 { "sti", { XX }, 0 },
2110 { "cld", { XX }, 0 },
2111 { "std", { XX }, 0 },
2112 { REG_TABLE (REG_FE) },
2113 { REG_TABLE (REG_FF) },
2114 };
2115
2116 static const struct dis386 dis386_twobyte[] = {
2117 /* 00 */
2118 { REG_TABLE (REG_0F00 ) },
2119 { REG_TABLE (REG_0F01 ) },
2120 { MOD_TABLE (MOD_0F02) },
2121 { MOD_TABLE (MOD_0F03) },
2122 { Bad_Opcode },
2123 { "syscall", { XX }, 0 },
2124 { "clts", { XX }, 0 },
2125 { "sysret%LQ", { XX }, 0 },
2126 /* 08 */
2127 { "invd", { XX }, 0 },
2128 { PREFIX_TABLE (PREFIX_0F09) },
2129 { Bad_Opcode },
2130 { "ud2", { XX }, 0 },
2131 { Bad_Opcode },
2132 { REG_TABLE (REG_0F0D) },
2133 { "femms", { XX }, 0 },
2134 { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
2135 /* 10 */
2136 { PREFIX_TABLE (PREFIX_0F10) },
2137 { PREFIX_TABLE (PREFIX_0F11) },
2138 { PREFIX_TABLE (PREFIX_0F12) },
2139 { MOD_TABLE (MOD_0F13) },
2140 { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
2141 { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
2142 { PREFIX_TABLE (PREFIX_0F16) },
2143 { MOD_TABLE (MOD_0F17) },
2144 /* 18 */
2145 { REG_TABLE (REG_0F18) },
2146 { "nopQ", { Ev }, 0 },
2147 { PREFIX_TABLE (PREFIX_0F1A) },
2148 { PREFIX_TABLE (PREFIX_0F1B) },
2149 { PREFIX_TABLE (PREFIX_0F1C) },
2150 { "nopQ", { Ev }, 0 },
2151 { PREFIX_TABLE (PREFIX_0F1E) },
2152 { "nopQ", { Ev }, 0 },
2153 /* 20 */
2154 { "movZ", { Em, Cm }, 0 },
2155 { "movZ", { Em, Dm }, 0 },
2156 { "movZ", { Cm, Em }, 0 },
2157 { "movZ", { Dm, Em }, 0 },
2158 { X86_64_TABLE (X86_64_0F24) },
2159 { Bad_Opcode },
2160 { X86_64_TABLE (X86_64_0F26) },
2161 { Bad_Opcode },
2162 /* 28 */
2163 { "movapX", { XM, EXx }, PREFIX_OPCODE },
2164 { "movapX", { EXxS, XM }, PREFIX_OPCODE },
2165 { PREFIX_TABLE (PREFIX_0F2A) },
2166 { PREFIX_TABLE (PREFIX_0F2B) },
2167 { PREFIX_TABLE (PREFIX_0F2C) },
2168 { PREFIX_TABLE (PREFIX_0F2D) },
2169 { PREFIX_TABLE (PREFIX_0F2E) },
2170 { PREFIX_TABLE (PREFIX_0F2F) },
2171 /* 30 */
2172 { "wrmsr", { XX }, 0 },
2173 { "rdtsc", { XX }, 0 },
2174 { "rdmsr", { XX }, 0 },
2175 { "rdpmc", { XX }, 0 },
2176 { "sysenter", { SEP }, 0 },
2177 { "sysexit%LQ", { SEP }, 0 },
2178 { Bad_Opcode },
2179 { "getsec", { XX }, 0 },
2180 /* 38 */
2181 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
2182 { Bad_Opcode },
2183 { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
2184 { Bad_Opcode },
2185 { Bad_Opcode },
2186 { Bad_Opcode },
2187 { Bad_Opcode },
2188 { Bad_Opcode },
2189 /* 40 */
2190 { "cmovoS", { Gv, Ev }, 0 },
2191 { "cmovnoS", { Gv, Ev }, 0 },
2192 { "cmovbS", { Gv, Ev }, 0 },
2193 { "cmovaeS", { Gv, Ev }, 0 },
2194 { "cmoveS", { Gv, Ev }, 0 },
2195 { "cmovneS", { Gv, Ev }, 0 },
2196 { "cmovbeS", { Gv, Ev }, 0 },
2197 { "cmovaS", { Gv, Ev }, 0 },
2198 /* 48 */
2199 { "cmovsS", { Gv, Ev }, 0 },
2200 { "cmovnsS", { Gv, Ev }, 0 },
2201 { "cmovpS", { Gv, Ev }, 0 },
2202 { "cmovnpS", { Gv, Ev }, 0 },
2203 { "cmovlS", { Gv, Ev }, 0 },
2204 { "cmovgeS", { Gv, Ev }, 0 },
2205 { "cmovleS", { Gv, Ev }, 0 },
2206 { "cmovgS", { Gv, Ev }, 0 },
2207 /* 50 */
2208 { MOD_TABLE (MOD_0F50) },
2209 { PREFIX_TABLE (PREFIX_0F51) },
2210 { PREFIX_TABLE (PREFIX_0F52) },
2211 { PREFIX_TABLE (PREFIX_0F53) },
2212 { "andpX", { XM, EXx }, PREFIX_OPCODE },
2213 { "andnpX", { XM, EXx }, PREFIX_OPCODE },
2214 { "orpX", { XM, EXx }, PREFIX_OPCODE },
2215 { "xorpX", { XM, EXx }, PREFIX_OPCODE },
2216 /* 58 */
2217 { PREFIX_TABLE (PREFIX_0F58) },
2218 { PREFIX_TABLE (PREFIX_0F59) },
2219 { PREFIX_TABLE (PREFIX_0F5A) },
2220 { PREFIX_TABLE (PREFIX_0F5B) },
2221 { PREFIX_TABLE (PREFIX_0F5C) },
2222 { PREFIX_TABLE (PREFIX_0F5D) },
2223 { PREFIX_TABLE (PREFIX_0F5E) },
2224 { PREFIX_TABLE (PREFIX_0F5F) },
2225 /* 60 */
2226 { PREFIX_TABLE (PREFIX_0F60) },
2227 { PREFIX_TABLE (PREFIX_0F61) },
2228 { PREFIX_TABLE (PREFIX_0F62) },
2229 { "packsswb", { MX, EM }, PREFIX_OPCODE },
2230 { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
2231 { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
2232 { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
2233 { "packuswb", { MX, EM }, PREFIX_OPCODE },
2234 /* 68 */
2235 { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
2236 { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
2237 { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
2238 { "packssdw", { MX, EM }, PREFIX_OPCODE },
2239 { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
2240 { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
2241 { "movK", { MX, Edq }, PREFIX_OPCODE },
2242 { PREFIX_TABLE (PREFIX_0F6F) },
2243 /* 70 */
2244 { PREFIX_TABLE (PREFIX_0F70) },
2245 { MOD_TABLE (MOD_0F71) },
2246 { MOD_TABLE (MOD_0F72) },
2247 { MOD_TABLE (MOD_0F73) },
2248 { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
2249 { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
2250 { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
2251 { "emms", { XX }, PREFIX_OPCODE },
2252 /* 78 */
2253 { PREFIX_TABLE (PREFIX_0F78) },
2254 { PREFIX_TABLE (PREFIX_0F79) },
2255 { Bad_Opcode },
2256 { Bad_Opcode },
2257 { PREFIX_TABLE (PREFIX_0F7C) },
2258 { PREFIX_TABLE (PREFIX_0F7D) },
2259 { PREFIX_TABLE (PREFIX_0F7E) },
2260 { PREFIX_TABLE (PREFIX_0F7F) },
2261 /* 80 */
2262 { "joH", { Jv, BND, cond_jump_flag }, 0 },
2263 { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
2264 { "jbH", { Jv, BND, cond_jump_flag }, 0 },
2265 { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
2266 { "jeH", { Jv, BND, cond_jump_flag }, 0 },
2267 { "jneH", { Jv, BND, cond_jump_flag }, 0 },
2268 { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
2269 { "jaH", { Jv, BND, cond_jump_flag }, 0 },
2270 /* 88 */
2271 { "jsH", { Jv, BND, cond_jump_flag }, 0 },
2272 { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
2273 { "jpH", { Jv, BND, cond_jump_flag }, 0 },
2274 { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
2275 { "jlH", { Jv, BND, cond_jump_flag }, 0 },
2276 { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
2277 { "jleH", { Jv, BND, cond_jump_flag }, 0 },
2278 { "jgH", { Jv, BND, cond_jump_flag }, 0 },
2279 /* 90 */
2280 { "seto", { Eb }, 0 },
2281 { "setno", { Eb }, 0 },
2282 { "setb", { Eb }, 0 },
2283 { "setae", { Eb }, 0 },
2284 { "sete", { Eb }, 0 },
2285 { "setne", { Eb }, 0 },
2286 { "setbe", { Eb }, 0 },
2287 { "seta", { Eb }, 0 },
2288 /* 98 */
2289 { "sets", { Eb }, 0 },
2290 { "setns", { Eb }, 0 },
2291 { "setp", { Eb }, 0 },
2292 { "setnp", { Eb }, 0 },
2293 { "setl", { Eb }, 0 },
2294 { "setge", { Eb }, 0 },
2295 { "setle", { Eb }, 0 },
2296 { "setg", { Eb }, 0 },
2297 /* a0 */
2298 { "pushP", { fs }, 0 },
2299 { "popP", { fs }, 0 },
2300 { "cpuid", { XX }, 0 },
2301 { "btS", { Ev, Gv }, 0 },
2302 { "shldS", { Ev, Gv, Ib }, 0 },
2303 { "shldS", { Ev, Gv, CL }, 0 },
2304 { REG_TABLE (REG_0FA6) },
2305 { REG_TABLE (REG_0FA7) },
2306 /* a8 */
2307 { "pushP", { gs }, 0 },
2308 { "popP", { gs }, 0 },
2309 { "rsm", { XX }, 0 },
2310 { "btsS", { Evh1, Gv }, 0 },
2311 { "shrdS", { Ev, Gv, Ib }, 0 },
2312 { "shrdS", { Ev, Gv, CL }, 0 },
2313 { REG_TABLE (REG_0FAE) },
2314 { "imulS", { Gv, Ev }, 0 },
2315 /* b0 */
2316 { "cmpxchgB", { Ebh1, Gb }, 0 },
2317 { "cmpxchgS", { Evh1, Gv }, 0 },
2318 { MOD_TABLE (MOD_0FB2) },
2319 { "btrS", { Evh1, Gv }, 0 },
2320 { MOD_TABLE (MOD_0FB4) },
2321 { MOD_TABLE (MOD_0FB5) },
2322 { "movz{bR|x}", { Gv, Eb }, 0 },
2323 { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
2324 /* b8 */
2325 { PREFIX_TABLE (PREFIX_0FB8) },
2326 { "ud1S", { Gv, Ev }, 0 },
2327 { REG_TABLE (REG_0FBA) },
2328 { "btcS", { Evh1, Gv }, 0 },
2329 { PREFIX_TABLE (PREFIX_0FBC) },
2330 { PREFIX_TABLE (PREFIX_0FBD) },
2331 { "movs{bR|x}", { Gv, Eb }, 0 },
2332 { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
2333 /* c0 */
2334 { "xaddB", { Ebh1, Gb }, 0 },
2335 { "xaddS", { Evh1, Gv }, 0 },
2336 { PREFIX_TABLE (PREFIX_0FC2) },
2337 { MOD_TABLE (MOD_0FC3) },
2338 { "pinsrw", { MX, Edw, Ib }, PREFIX_OPCODE },
2339 { "pextrw", { Gd, MS, Ib }, PREFIX_OPCODE },
2340 { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
2341 { REG_TABLE (REG_0FC7) },
2342 /* c8 */
2343 { "bswap", { RMeAX }, 0 },
2344 { "bswap", { RMeCX }, 0 },
2345 { "bswap", { RMeDX }, 0 },
2346 { "bswap", { RMeBX }, 0 },
2347 { "bswap", { RMeSP }, 0 },
2348 { "bswap", { RMeBP }, 0 },
2349 { "bswap", { RMeSI }, 0 },
2350 { "bswap", { RMeDI }, 0 },
2351 /* d0 */
2352 { PREFIX_TABLE (PREFIX_0FD0) },
2353 { "psrlw", { MX, EM }, PREFIX_OPCODE },
2354 { "psrld", { MX, EM }, PREFIX_OPCODE },
2355 { "psrlq", { MX, EM }, PREFIX_OPCODE },
2356 { "paddq", { MX, EM }, PREFIX_OPCODE },
2357 { "pmullw", { MX, EM }, PREFIX_OPCODE },
2358 { PREFIX_TABLE (PREFIX_0FD6) },
2359 { MOD_TABLE (MOD_0FD7) },
2360 /* d8 */
2361 { "psubusb", { MX, EM }, PREFIX_OPCODE },
2362 { "psubusw", { MX, EM }, PREFIX_OPCODE },
2363 { "pminub", { MX, EM }, PREFIX_OPCODE },
2364 { "pand", { MX, EM }, PREFIX_OPCODE },
2365 { "paddusb", { MX, EM }, PREFIX_OPCODE },
2366 { "paddusw", { MX, EM }, PREFIX_OPCODE },
2367 { "pmaxub", { MX, EM }, PREFIX_OPCODE },
2368 { "pandn", { MX, EM }, PREFIX_OPCODE },
2369 /* e0 */
2370 { "pavgb", { MX, EM }, PREFIX_OPCODE },
2371 { "psraw", { MX, EM }, PREFIX_OPCODE },
2372 { "psrad", { MX, EM }, PREFIX_OPCODE },
2373 { "pavgw", { MX, EM }, PREFIX_OPCODE },
2374 { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
2375 { "pmulhw", { MX, EM }, PREFIX_OPCODE },
2376 { PREFIX_TABLE (PREFIX_0FE6) },
2377 { PREFIX_TABLE (PREFIX_0FE7) },
2378 /* e8 */
2379 { "psubsb", { MX, EM }, PREFIX_OPCODE },
2380 { "psubsw", { MX, EM }, PREFIX_OPCODE },
2381 { "pminsw", { MX, EM }, PREFIX_OPCODE },
2382 { "por", { MX, EM }, PREFIX_OPCODE },
2383 { "paddsb", { MX, EM }, PREFIX_OPCODE },
2384 { "paddsw", { MX, EM }, PREFIX_OPCODE },
2385 { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
2386 { "pxor", { MX, EM }, PREFIX_OPCODE },
2387 /* f0 */
2388 { PREFIX_TABLE (PREFIX_0FF0) },
2389 { "psllw", { MX, EM }, PREFIX_OPCODE },
2390 { "pslld", { MX, EM }, PREFIX_OPCODE },
2391 { "psllq", { MX, EM }, PREFIX_OPCODE },
2392 { "pmuludq", { MX, EM }, PREFIX_OPCODE },
2393 { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
2394 { "psadbw", { MX, EM }, PREFIX_OPCODE },
2395 { PREFIX_TABLE (PREFIX_0FF7) },
2396 /* f8 */
2397 { "psubb", { MX, EM }, PREFIX_OPCODE },
2398 { "psubw", { MX, EM }, PREFIX_OPCODE },
2399 { "psubd", { MX, EM }, PREFIX_OPCODE },
2400 { "psubq", { MX, EM }, PREFIX_OPCODE },
2401 { "paddb", { MX, EM }, PREFIX_OPCODE },
2402 { "paddw", { MX, EM }, PREFIX_OPCODE },
2403 { "paddd", { MX, EM }, PREFIX_OPCODE },
2404 { "ud0S", { Gv, Ev }, 0 },
2405 };
2406
2407 static const bool onebyte_has_modrm[256] = {
2408 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2409 /* ------------------------------- */
2410 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
2411 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
2412 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
2413 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
2414 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
2415 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
2416 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
2417 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
2418 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
2419 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
2420 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
2421 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
2422 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
2423 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
2424 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
2425 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
2426 /* ------------------------------- */
2427 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2428 };
2429
2430 static const bool twobyte_has_modrm[256] = {
2431 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2432 /* ------------------------------- */
2433 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
2434 /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
2435 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
2436 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
2437 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
2438 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
2439 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
2440 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
2441 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
2442 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
2443 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
2444 /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
2445 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
2446 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
2447 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
2448 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
2449 /* ------------------------------- */
2450 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
2451 };
2452
2453
2454 struct op
2455 {
2456 const char *name;
2457 unsigned int len;
2458 };
2459
2460 /* If we are accessing mod/rm/reg without need_modrm set, then the
2461 values are stale. Hitting this abort likely indicates that you
2462 need to update onebyte_has_modrm or twobyte_has_modrm. */
2463 #define MODRM_CHECK if (!ins->need_modrm) abort ()
2464
2465 static const char *const intel_index16[] = {
2466 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
2467 };
2468
2469 static const char *const att_names64[] = {
2470 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
2471 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
2472 };
2473 static const char *const att_names32[] = {
2474 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
2475 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
2476 };
2477 static const char *const att_names16[] = {
2478 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
2479 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
2480 };
2481 static const char *const att_names8[] = {
2482 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
2483 };
2484 static const char *const att_names8rex[] = {
2485 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
2486 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
2487 };
2488 static const char *const att_names_seg[] = {
2489 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
2490 };
2491 static const char att_index64[] = "%riz";
2492 static const char att_index32[] = "%eiz";
2493 static const char *const att_index16[] = {
2494 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
2495 };
2496
2497 static const char *const att_names_mm[] = {
2498 "%mm0", "%mm1", "%mm2", "%mm3",
2499 "%mm4", "%mm5", "%mm6", "%mm7"
2500 };
2501
2502 static const char *const att_names_bnd[] = {
2503 "%bnd0", "%bnd1", "%bnd2", "%bnd3"
2504 };
2505
2506 static const char *const att_names_xmm[] = {
2507 "%xmm0", "%xmm1", "%xmm2", "%xmm3",
2508 "%xmm4", "%xmm5", "%xmm6", "%xmm7",
2509 "%xmm8", "%xmm9", "%xmm10", "%xmm11",
2510 "%xmm12", "%xmm13", "%xmm14", "%xmm15",
2511 "%xmm16", "%xmm17", "%xmm18", "%xmm19",
2512 "%xmm20", "%xmm21", "%xmm22", "%xmm23",
2513 "%xmm24", "%xmm25", "%xmm26", "%xmm27",
2514 "%xmm28", "%xmm29", "%xmm30", "%xmm31"
2515 };
2516
2517 static const char *const att_names_ymm[] = {
2518 "%ymm0", "%ymm1", "%ymm2", "%ymm3",
2519 "%ymm4", "%ymm5", "%ymm6", "%ymm7",
2520 "%ymm8", "%ymm9", "%ymm10", "%ymm11",
2521 "%ymm12", "%ymm13", "%ymm14", "%ymm15",
2522 "%ymm16", "%ymm17", "%ymm18", "%ymm19",
2523 "%ymm20", "%ymm21", "%ymm22", "%ymm23",
2524 "%ymm24", "%ymm25", "%ymm26", "%ymm27",
2525 "%ymm28", "%ymm29", "%ymm30", "%ymm31"
2526 };
2527
2528 static const char *const att_names_zmm[] = {
2529 "%zmm0", "%zmm1", "%zmm2", "%zmm3",
2530 "%zmm4", "%zmm5", "%zmm6", "%zmm7",
2531 "%zmm8", "%zmm9", "%zmm10", "%zmm11",
2532 "%zmm12", "%zmm13", "%zmm14", "%zmm15",
2533 "%zmm16", "%zmm17", "%zmm18", "%zmm19",
2534 "%zmm20", "%zmm21", "%zmm22", "%zmm23",
2535 "%zmm24", "%zmm25", "%zmm26", "%zmm27",
2536 "%zmm28", "%zmm29", "%zmm30", "%zmm31"
2537 };
2538
2539 static const char *const att_names_tmm[] = {
2540 "%tmm0", "%tmm1", "%tmm2", "%tmm3",
2541 "%tmm4", "%tmm5", "%tmm6", "%tmm7"
2542 };
2543
2544 static const char *const att_names_mask[] = {
2545 "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
2546 };
2547
2548 static const char *const names_rounding[] =
2549 {
2550 "{rn-",
2551 "{rd-",
2552 "{ru-",
2553 "{rz-"
2554 };
2555
2556 static const struct dis386 reg_table[][8] = {
2557 /* REG_80 */
2558 {
2559 { "addA", { Ebh1, Ib }, 0 },
2560 { "orA", { Ebh1, Ib }, 0 },
2561 { "adcA", { Ebh1, Ib }, 0 },
2562 { "sbbA", { Ebh1, Ib }, 0 },
2563 { "andA", { Ebh1, Ib }, 0 },
2564 { "subA", { Ebh1, Ib }, 0 },
2565 { "xorA", { Ebh1, Ib }, 0 },
2566 { "cmpA", { Eb, Ib }, 0 },
2567 },
2568 /* REG_81 */
2569 {
2570 { "addQ", { Evh1, Iv }, 0 },
2571 { "orQ", { Evh1, Iv }, 0 },
2572 { "adcQ", { Evh1, Iv }, 0 },
2573 { "sbbQ", { Evh1, Iv }, 0 },
2574 { "andQ", { Evh1, Iv }, 0 },
2575 { "subQ", { Evh1, Iv }, 0 },
2576 { "xorQ", { Evh1, Iv }, 0 },
2577 { "cmpQ", { Ev, Iv }, 0 },
2578 },
2579 /* REG_83 */
2580 {
2581 { "addQ", { Evh1, sIb }, 0 },
2582 { "orQ", { Evh1, sIb }, 0 },
2583 { "adcQ", { Evh1, sIb }, 0 },
2584 { "sbbQ", { Evh1, sIb }, 0 },
2585 { "andQ", { Evh1, sIb }, 0 },
2586 { "subQ", { Evh1, sIb }, 0 },
2587 { "xorQ", { Evh1, sIb }, 0 },
2588 { "cmpQ", { Ev, sIb }, 0 },
2589 },
2590 /* REG_8F */
2591 {
2592 { "pop{P|}", { stackEv }, 0 },
2593 { XOP_8F_TABLE (XOP_09) },
2594 { Bad_Opcode },
2595 { Bad_Opcode },
2596 { Bad_Opcode },
2597 { XOP_8F_TABLE (XOP_09) },
2598 },
2599 /* REG_C0 */
2600 {
2601 { "rolA", { Eb, Ib }, 0 },
2602 { "rorA", { Eb, Ib }, 0 },
2603 { "rclA", { Eb, Ib }, 0 },
2604 { "rcrA", { Eb, Ib }, 0 },
2605 { "shlA", { Eb, Ib }, 0 },
2606 { "shrA", { Eb, Ib }, 0 },
2607 { "shlA", { Eb, Ib }, 0 },
2608 { "sarA", { Eb, Ib }, 0 },
2609 },
2610 /* REG_C1 */
2611 {
2612 { "rolQ", { Ev, Ib }, 0 },
2613 { "rorQ", { Ev, Ib }, 0 },
2614 { "rclQ", { Ev, Ib }, 0 },
2615 { "rcrQ", { Ev, Ib }, 0 },
2616 { "shlQ", { Ev, Ib }, 0 },
2617 { "shrQ", { Ev, Ib }, 0 },
2618 { "shlQ", { Ev, Ib }, 0 },
2619 { "sarQ", { Ev, Ib }, 0 },
2620 },
2621 /* REG_C6 */
2622 {
2623 { "movA", { Ebh3, Ib }, 0 },
2624 { Bad_Opcode },
2625 { Bad_Opcode },
2626 { Bad_Opcode },
2627 { Bad_Opcode },
2628 { Bad_Opcode },
2629 { Bad_Opcode },
2630 { MOD_TABLE (MOD_C6_REG_7) },
2631 },
2632 /* REG_C7 */
2633 {
2634 { "movQ", { Evh3, Iv }, 0 },
2635 { Bad_Opcode },
2636 { Bad_Opcode },
2637 { Bad_Opcode },
2638 { Bad_Opcode },
2639 { Bad_Opcode },
2640 { Bad_Opcode },
2641 { MOD_TABLE (MOD_C7_REG_7) },
2642 },
2643 /* REG_D0 */
2644 {
2645 { "rolA", { Eb, I1 }, 0 },
2646 { "rorA", { Eb, I1 }, 0 },
2647 { "rclA", { Eb, I1 }, 0 },
2648 { "rcrA", { Eb, I1 }, 0 },
2649 { "shlA", { Eb, I1 }, 0 },
2650 { "shrA", { Eb, I1 }, 0 },
2651 { "shlA", { Eb, I1 }, 0 },
2652 { "sarA", { Eb, I1 }, 0 },
2653 },
2654 /* REG_D1 */
2655 {
2656 { "rolQ", { Ev, I1 }, 0 },
2657 { "rorQ", { Ev, I1 }, 0 },
2658 { "rclQ", { Ev, I1 }, 0 },
2659 { "rcrQ", { Ev, I1 }, 0 },
2660 { "shlQ", { Ev, I1 }, 0 },
2661 { "shrQ", { Ev, I1 }, 0 },
2662 { "shlQ", { Ev, I1 }, 0 },
2663 { "sarQ", { Ev, I1 }, 0 },
2664 },
2665 /* REG_D2 */
2666 {
2667 { "rolA", { Eb, CL }, 0 },
2668 { "rorA", { Eb, CL }, 0 },
2669 { "rclA", { Eb, CL }, 0 },
2670 { "rcrA", { Eb, CL }, 0 },
2671 { "shlA", { Eb, CL }, 0 },
2672 { "shrA", { Eb, CL }, 0 },
2673 { "shlA", { Eb, CL }, 0 },
2674 { "sarA", { Eb, CL }, 0 },
2675 },
2676 /* REG_D3 */
2677 {
2678 { "rolQ", { Ev, CL }, 0 },
2679 { "rorQ", { Ev, CL }, 0 },
2680 { "rclQ", { Ev, CL }, 0 },
2681 { "rcrQ", { Ev, CL }, 0 },
2682 { "shlQ", { Ev, CL }, 0 },
2683 { "shrQ", { Ev, CL }, 0 },
2684 { "shlQ", { Ev, CL }, 0 },
2685 { "sarQ", { Ev, CL }, 0 },
2686 },
2687 /* REG_F6 */
2688 {
2689 { "testA", { Eb, Ib }, 0 },
2690 { "testA", { Eb, Ib }, 0 },
2691 { "notA", { Ebh1 }, 0 },
2692 { "negA", { Ebh1 }, 0 },
2693 { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
2694 { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
2695 { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
2696 { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
2697 },
2698 /* REG_F7 */
2699 {
2700 { "testQ", { Ev, Iv }, 0 },
2701 { "testQ", { Ev, Iv }, 0 },
2702 { "notQ", { Evh1 }, 0 },
2703 { "negQ", { Evh1 }, 0 },
2704 { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
2705 { "imulQ", { Ev }, 0 },
2706 { "divQ", { Ev }, 0 },
2707 { "idivQ", { Ev }, 0 },
2708 },
2709 /* REG_FE */
2710 {
2711 { "incA", { Ebh1 }, 0 },
2712 { "decA", { Ebh1 }, 0 },
2713 },
2714 /* REG_FF */
2715 {
2716 { "incQ", { Evh1 }, 0 },
2717 { "decQ", { Evh1 }, 0 },
2718 { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
2719 { MOD_TABLE (MOD_FF_REG_3) },
2720 { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
2721 { MOD_TABLE (MOD_FF_REG_5) },
2722 { "push{P|}", { stackEv }, 0 },
2723 { Bad_Opcode },
2724 },
2725 /* REG_0F00 */
2726 {
2727 { "sldtD", { Sv }, 0 },
2728 { "strD", { Sv }, 0 },
2729 { "lldt", { Ew }, 0 },
2730 { "ltr", { Ew }, 0 },
2731 { "verr", { Ew }, 0 },
2732 { "verw", { Ew }, 0 },
2733 { Bad_Opcode },
2734 { Bad_Opcode },
2735 },
2736 /* REG_0F01 */
2737 {
2738 { MOD_TABLE (MOD_0F01_REG_0) },
2739 { MOD_TABLE (MOD_0F01_REG_1) },
2740 { MOD_TABLE (MOD_0F01_REG_2) },
2741 { MOD_TABLE (MOD_0F01_REG_3) },
2742 { "smswD", { Sv }, 0 },
2743 { MOD_TABLE (MOD_0F01_REG_5) },
2744 { "lmsw", { Ew }, 0 },
2745 { MOD_TABLE (MOD_0F01_REG_7) },
2746 },
2747 /* REG_0F0D */
2748 {
2749 { "prefetch", { Mb }, 0 },
2750 { "prefetchw", { Mb }, 0 },
2751 { "prefetchwt1", { Mb }, 0 },
2752 { "prefetch", { Mb }, 0 },
2753 { "prefetch", { Mb }, 0 },
2754 { "prefetch", { Mb }, 0 },
2755 { "prefetch", { Mb }, 0 },
2756 { "prefetch", { Mb }, 0 },
2757 },
2758 /* REG_0F18 */
2759 {
2760 { MOD_TABLE (MOD_0F18_REG_0) },
2761 { MOD_TABLE (MOD_0F18_REG_1) },
2762 { MOD_TABLE (MOD_0F18_REG_2) },
2763 { MOD_TABLE (MOD_0F18_REG_3) },
2764 { "nopQ", { Ev }, 0 },
2765 { "nopQ", { Ev }, 0 },
2766 { MOD_TABLE (MOD_0F18_REG_6) },
2767 { MOD_TABLE (MOD_0F18_REG_7) },
2768 },
2769 /* REG_0F1C_P_0_MOD_0 */
2770 {
2771 { "cldemote", { Mb }, 0 },
2772 { "nopQ", { Ev }, 0 },
2773 { "nopQ", { Ev }, 0 },
2774 { "nopQ", { Ev }, 0 },
2775 { "nopQ", { Ev }, 0 },
2776 { "nopQ", { Ev }, 0 },
2777 { "nopQ", { Ev }, 0 },
2778 { "nopQ", { Ev }, 0 },
2779 },
2780 /* REG_0F1E_P_1_MOD_3 */
2781 {
2782 { "nopQ", { Ev }, PREFIX_IGNORED },
2783 { "rdsspK", { Edq }, 0 },
2784 { "nopQ", { Ev }, PREFIX_IGNORED },
2785 { "nopQ", { Ev }, PREFIX_IGNORED },
2786 { "nopQ", { Ev }, PREFIX_IGNORED },
2787 { "nopQ", { Ev }, PREFIX_IGNORED },
2788 { "nopQ", { Ev }, PREFIX_IGNORED },
2789 { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
2790 },
2791 /* REG_0F38D8_PREFIX_1 */
2792 {
2793 { "aesencwide128kl", { M }, 0 },
2794 { "aesdecwide128kl", { M }, 0 },
2795 { "aesencwide256kl", { M }, 0 },
2796 { "aesdecwide256kl", { M }, 0 },
2797 },
2798 /* REG_0F3A0F_PREFIX_1_MOD_3 */
2799 {
2800 { RM_TABLE (RM_0F3A0F_P_1_MOD_3_REG_0) },
2801 },
2802 /* REG_0F71_MOD_0 */
2803 {
2804 { Bad_Opcode },
2805 { Bad_Opcode },
2806 { "psrlw", { MS, Ib }, PREFIX_OPCODE },
2807 { Bad_Opcode },
2808 { "psraw", { MS, Ib }, PREFIX_OPCODE },
2809 { Bad_Opcode },
2810 { "psllw", { MS, Ib }, PREFIX_OPCODE },
2811 },
2812 /* REG_0F72_MOD_0 */
2813 {
2814 { Bad_Opcode },
2815 { Bad_Opcode },
2816 { "psrld", { MS, Ib }, PREFIX_OPCODE },
2817 { Bad_Opcode },
2818 { "psrad", { MS, Ib }, PREFIX_OPCODE },
2819 { Bad_Opcode },
2820 { "pslld", { MS, Ib }, PREFIX_OPCODE },
2821 },
2822 /* REG_0F73_MOD_0 */
2823 {
2824 { Bad_Opcode },
2825 { Bad_Opcode },
2826 { "psrlq", { MS, Ib }, PREFIX_OPCODE },
2827 { "psrldq", { XS, Ib }, PREFIX_DATA },
2828 { Bad_Opcode },
2829 { Bad_Opcode },
2830 { "psllq", { MS, Ib }, PREFIX_OPCODE },
2831 { "pslldq", { XS, Ib }, PREFIX_DATA },
2832 },
2833 /* REG_0FA6 */
2834 {
2835 { "montmul", { { OP_0f07, 0 } }, 0 },
2836 { "xsha1", { { OP_0f07, 0 } }, 0 },
2837 { "xsha256", { { OP_0f07, 0 } }, 0 },
2838 },
2839 /* REG_0FA7 */
2840 {
2841 { "xstore-rng", { { OP_0f07, 0 } }, 0 },
2842 { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
2843 { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
2844 { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
2845 { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
2846 { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
2847 },
2848 /* REG_0FAE */
2849 {
2850 { MOD_TABLE (MOD_0FAE_REG_0) },
2851 { MOD_TABLE (MOD_0FAE_REG_1) },
2852 { MOD_TABLE (MOD_0FAE_REG_2) },
2853 { MOD_TABLE (MOD_0FAE_REG_3) },
2854 { MOD_TABLE (MOD_0FAE_REG_4) },
2855 { MOD_TABLE (MOD_0FAE_REG_5) },
2856 { MOD_TABLE (MOD_0FAE_REG_6) },
2857 { MOD_TABLE (MOD_0FAE_REG_7) },
2858 },
2859 /* REG_0FBA */
2860 {
2861 { Bad_Opcode },
2862 { Bad_Opcode },
2863 { Bad_Opcode },
2864 { Bad_Opcode },
2865 { "btQ", { Ev, Ib }, 0 },
2866 { "btsQ", { Evh1, Ib }, 0 },
2867 { "btrQ", { Evh1, Ib }, 0 },
2868 { "btcQ", { Evh1, Ib }, 0 },
2869 },
2870 /* REG_0FC7 */
2871 {
2872 { Bad_Opcode },
2873 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
2874 { Bad_Opcode },
2875 { MOD_TABLE (MOD_0FC7_REG_3) },
2876 { MOD_TABLE (MOD_0FC7_REG_4) },
2877 { MOD_TABLE (MOD_0FC7_REG_5) },
2878 { MOD_TABLE (MOD_0FC7_REG_6) },
2879 { MOD_TABLE (MOD_0FC7_REG_7) },
2880 },
2881 /* REG_VEX_0F71_M_0 */
2882 {
2883 { Bad_Opcode },
2884 { Bad_Opcode },
2885 { "vpsrlw", { Vex, XS, Ib }, PREFIX_DATA },
2886 { Bad_Opcode },
2887 { "vpsraw", { Vex, XS, Ib }, PREFIX_DATA },
2888 { Bad_Opcode },
2889 { "vpsllw", { Vex, XS, Ib }, PREFIX_DATA },
2890 },
2891 /* REG_VEX_0F72_M_0 */
2892 {
2893 { Bad_Opcode },
2894 { Bad_Opcode },
2895 { "vpsrld", { Vex, XS, Ib }, PREFIX_DATA },
2896 { Bad_Opcode },
2897 { "vpsrad", { Vex, XS, Ib }, PREFIX_DATA },
2898 { Bad_Opcode },
2899 { "vpslld", { Vex, XS, Ib }, PREFIX_DATA },
2900 },
2901 /* REG_VEX_0F73_M_0 */
2902 {
2903 { Bad_Opcode },
2904 { Bad_Opcode },
2905 { "vpsrlq", { Vex, XS, Ib }, PREFIX_DATA },
2906 { "vpsrldq", { Vex, XS, Ib }, PREFIX_DATA },
2907 { Bad_Opcode },
2908 { Bad_Opcode },
2909 { "vpsllq", { Vex, XS, Ib }, PREFIX_DATA },
2910 { "vpslldq", { Vex, XS, Ib }, PREFIX_DATA },
2911 },
2912 /* REG_VEX_0FAE */
2913 {
2914 { Bad_Opcode },
2915 { Bad_Opcode },
2916 { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
2917 { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
2918 },
2919 /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
2920 {
2921 { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0) },
2922 },
2923 /* REG_VEX_0F38F3_L_0 */
2924 {
2925 { Bad_Opcode },
2926 { "blsrS", { VexGdq, Edq }, PREFIX_OPCODE },
2927 { "blsmskS", { VexGdq, Edq }, PREFIX_OPCODE },
2928 { "blsiS", { VexGdq, Edq }, PREFIX_OPCODE },
2929 },
2930 /* REG_XOP_09_01_L_0 */
2931 {
2932 { Bad_Opcode },
2933 { "blcfill", { VexGdq, Edq }, 0 },
2934 { "blsfill", { VexGdq, Edq }, 0 },
2935 { "blcs", { VexGdq, Edq }, 0 },
2936 { "tzmsk", { VexGdq, Edq }, 0 },
2937 { "blcic", { VexGdq, Edq }, 0 },
2938 { "blsic", { VexGdq, Edq }, 0 },
2939 { "t1mskc", { VexGdq, Edq }, 0 },
2940 },
2941 /* REG_XOP_09_02_L_0 */
2942 {
2943 { Bad_Opcode },
2944 { "blcmsk", { VexGdq, Edq }, 0 },
2945 { Bad_Opcode },
2946 { Bad_Opcode },
2947 { Bad_Opcode },
2948 { Bad_Opcode },
2949 { "blci", { VexGdq, Edq }, 0 },
2950 },
2951 /* REG_XOP_09_12_M_1_L_0 */
2952 {
2953 { "llwpcb", { Edq }, 0 },
2954 { "slwpcb", { Edq }, 0 },
2955 },
2956 /* REG_XOP_0A_12_L_0 */
2957 {
2958 { "lwpins", { VexGdq, Ed, Id }, 0 },
2959 { "lwpval", { VexGdq, Ed, Id }, 0 },
2960 },
2961
2962 #include "i386-dis-evex-reg.h"
2963 };
2964
2965 static const struct dis386 prefix_table[][4] = {
2966 /* PREFIX_90 */
2967 {
2968 { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
2969 { "pause", { XX }, 0 },
2970 { "xchgS", { { NOP_Fixup, 0 }, { NOP_Fixup, 1 } }, 0 },
2971 { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
2972 },
2973
2974 /* PREFIX_0F01_REG_0_MOD_3_RM_6 */
2975 {
2976 { "wrmsrns", { Skip_MODRM }, 0 },
2977 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_1) },
2978 { Bad_Opcode },
2979 { X86_64_TABLE (X86_64_0F01_REG_0_MOD_3_RM_6_P_3) },
2980 },
2981
2982 /* PREFIX_0F01_REG_1_RM_4 */
2983 {
2984 { Bad_Opcode },
2985 { Bad_Opcode },
2986 { "tdcall", { Skip_MODRM }, 0 },
2987 { Bad_Opcode },
2988 },
2989
2990 /* PREFIX_0F01_REG_1_RM_5 */
2991 {
2992 { Bad_Opcode },
2993 { Bad_Opcode },
2994 { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2) },
2995 { Bad_Opcode },
2996 },
2997
2998 /* PREFIX_0F01_REG_1_RM_6 */
2999 {
3000 { Bad_Opcode },
3001 { Bad_Opcode },
3002 { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2) },
3003 { Bad_Opcode },
3004 },
3005
3006 /* PREFIX_0F01_REG_1_RM_7 */
3007 {
3008 { "encls", { Skip_MODRM }, 0 },
3009 { Bad_Opcode },
3010 { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2) },
3011 { Bad_Opcode },
3012 },
3013
3014 /* PREFIX_0F01_REG_3_RM_1 */
3015 {
3016 { "vmmcall", { Skip_MODRM }, 0 },
3017 { "vmgexit", { Skip_MODRM }, 0 },
3018 { Bad_Opcode },
3019 { "vmgexit", { Skip_MODRM }, 0 },
3020 },
3021
3022 /* PREFIX_0F01_REG_5_MOD_0 */
3023 {
3024 { Bad_Opcode },
3025 { "rstorssp", { Mq }, PREFIX_OPCODE },
3026 },
3027
3028 /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
3029 {
3030 { "serialize", { Skip_MODRM }, PREFIX_OPCODE },
3031 { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
3032 { Bad_Opcode },
3033 { "xsusldtrk", { Skip_MODRM }, PREFIX_OPCODE },
3034 },
3035
3036 /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
3037 {
3038 { Bad_Opcode },
3039 { Bad_Opcode },
3040 { Bad_Opcode },
3041 { "xresldtrk", { Skip_MODRM }, PREFIX_OPCODE },
3042 },
3043
3044 /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
3045 {
3046 { Bad_Opcode },
3047 { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
3048 },
3049
3050 /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
3051 {
3052 { Bad_Opcode },
3053 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1) },
3054 },
3055
3056 /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
3057 {
3058 { Bad_Opcode },
3059 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1) },
3060 },
3061
3062 /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
3063 {
3064 { "rdpkru", { Skip_MODRM }, 0 },
3065 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1) },
3066 },
3067
3068 /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
3069 {
3070 { "wrpkru", { Skip_MODRM }, 0 },
3071 { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1) },
3072 },
3073
3074 /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
3075 {
3076 { "monitorx", { { OP_Monitor, 0 } }, 0 },
3077 { "mcommit", { Skip_MODRM }, 0 },
3078 },
3079
3080 /* PREFIX_0F01_REG_7_MOD_3_RM_5 */
3081 {
3082 { "rdpru", { Skip_MODRM }, 0 },
3083 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1) },
3084 },
3085
3086 /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
3087 {
3088 { "invlpgb", { Skip_MODRM }, 0 },
3089 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1) },
3090 { Bad_Opcode },
3091 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3) },
3092 },
3093
3094 /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
3095 {
3096 { "tlbsync", { Skip_MODRM }, 0 },
3097 { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1) },
3098 { Bad_Opcode },
3099 { "pvalidate", { Skip_MODRM }, 0 },
3100 },
3101
3102 /* PREFIX_0F09 */
3103 {
3104 { "wbinvd", { XX }, 0 },
3105 { "wbnoinvd", { XX }, 0 },
3106 },
3107
3108 /* PREFIX_0F10 */
3109 {
3110 { "movups", { XM, EXx }, PREFIX_OPCODE },
3111 { "movss", { XM, EXd }, PREFIX_OPCODE },
3112 { "movupd", { XM, EXx }, PREFIX_OPCODE },
3113 { "movsd", { XM, EXq }, PREFIX_OPCODE },
3114 },
3115
3116 /* PREFIX_0F11 */
3117 {
3118 { "movups", { EXxS, XM }, PREFIX_OPCODE },
3119 { "movss", { EXdS, XM }, PREFIX_OPCODE },
3120 { "movupd", { EXxS, XM }, PREFIX_OPCODE },
3121 { "movsd", { EXqS, XM }, PREFIX_OPCODE },
3122 },
3123
3124 /* PREFIX_0F12 */
3125 {
3126 { MOD_TABLE (MOD_0F12_PREFIX_0) },
3127 { "movsldup", { XM, EXx }, PREFIX_OPCODE },
3128 { MOD_TABLE (MOD_0F12_PREFIX_2) },
3129 { "movddup", { XM, EXq }, PREFIX_OPCODE },
3130 },
3131
3132 /* PREFIX_0F16 */
3133 {
3134 { MOD_TABLE (MOD_0F16_PREFIX_0) },
3135 { "movshdup", { XM, EXx }, PREFIX_OPCODE },
3136 { MOD_TABLE (MOD_0F16_PREFIX_2) },
3137 },
3138
3139 /* PREFIX_0F18_REG_6_MOD_0_X86_64 */
3140 {
3141 { "prefetchit1", { { PREFETCHI_Fixup, b_mode } }, 0 },
3142 { "nopQ", { Ev }, 0 },
3143 { "nopQ", { Ev }, 0 },
3144 { "nopQ", { Ev }, 0 },
3145 },
3146
3147 /* PREFIX_0F18_REG_7_MOD_0_X86_64 */
3148 {
3149 { "prefetchit0", { { PREFETCHI_Fixup, b_mode } }, 0 },
3150 { "nopQ", { Ev }, 0 },
3151 { "nopQ", { Ev }, 0 },
3152 { "nopQ", { Ev }, 0 },
3153 },
3154
3155 /* PREFIX_0F1A */
3156 {
3157 { MOD_TABLE (MOD_0F1A_PREFIX_0) },
3158 { "bndcl", { Gbnd, Ev_bnd }, 0 },
3159 { "bndmov", { Gbnd, Ebnd }, 0 },
3160 { "bndcu", { Gbnd, Ev_bnd }, 0 },
3161 },
3162
3163 /* PREFIX_0F1B */
3164 {
3165 { MOD_TABLE (MOD_0F1B_PREFIX_0) },
3166 { MOD_TABLE (MOD_0F1B_PREFIX_1) },
3167 { "bndmov", { EbndS, Gbnd }, 0 },
3168 { "bndcn", { Gbnd, Ev_bnd }, 0 },
3169 },
3170
3171 /* PREFIX_0F1C */
3172 {
3173 { MOD_TABLE (MOD_0F1C_PREFIX_0) },
3174 { "nopQ", { Ev }, PREFIX_IGNORED },
3175 { "nopQ", { Ev }, 0 },
3176 { "nopQ", { Ev }, PREFIX_IGNORED },
3177 },
3178
3179 /* PREFIX_0F1E */
3180 {
3181 { "nopQ", { Ev }, 0 },
3182 { MOD_TABLE (MOD_0F1E_PREFIX_1) },
3183 { "nopQ", { Ev }, 0 },
3184 { NULL, { XX }, PREFIX_IGNORED },
3185 },
3186
3187 /* PREFIX_0F2A */
3188 {
3189 { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
3190 { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
3191 { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
3192 { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
3193 },
3194
3195 /* PREFIX_0F2B */
3196 {
3197 { MOD_TABLE (MOD_0F2B_PREFIX_0) },
3198 { MOD_TABLE (MOD_0F2B_PREFIX_1) },
3199 { MOD_TABLE (MOD_0F2B_PREFIX_2) },
3200 { MOD_TABLE (MOD_0F2B_PREFIX_3) },
3201 },
3202
3203 /* PREFIX_0F2C */
3204 {
3205 { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
3206 { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
3207 { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3208 { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3209 },
3210
3211 /* PREFIX_0F2D */
3212 {
3213 { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
3214 { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
3215 { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
3216 { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
3217 },
3218
3219 /* PREFIX_0F2E */
3220 {
3221 { "ucomiss",{ XM, EXd }, 0 },
3222 { Bad_Opcode },
3223 { "ucomisd",{ XM, EXq }, 0 },
3224 },
3225
3226 /* PREFIX_0F2F */
3227 {
3228 { "comiss", { XM, EXd }, 0 },
3229 { Bad_Opcode },
3230 { "comisd", { XM, EXq }, 0 },
3231 },
3232
3233 /* PREFIX_0F51 */
3234 {
3235 { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
3236 { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
3237 { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
3238 { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
3239 },
3240
3241 /* PREFIX_0F52 */
3242 {
3243 { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
3244 { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
3245 },
3246
3247 /* PREFIX_0F53 */
3248 {
3249 { "rcpps", { XM, EXx }, PREFIX_OPCODE },
3250 { "rcpss", { XM, EXd }, PREFIX_OPCODE },
3251 },
3252
3253 /* PREFIX_0F58 */
3254 {
3255 { "addps", { XM, EXx }, PREFIX_OPCODE },
3256 { "addss", { XM, EXd }, PREFIX_OPCODE },
3257 { "addpd", { XM, EXx }, PREFIX_OPCODE },
3258 { "addsd", { XM, EXq }, PREFIX_OPCODE },
3259 },
3260
3261 /* PREFIX_0F59 */
3262 {
3263 { "mulps", { XM, EXx }, PREFIX_OPCODE },
3264 { "mulss", { XM, EXd }, PREFIX_OPCODE },
3265 { "mulpd", { XM, EXx }, PREFIX_OPCODE },
3266 { "mulsd", { XM, EXq }, PREFIX_OPCODE },
3267 },
3268
3269 /* PREFIX_0F5A */
3270 {
3271 { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
3272 { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
3273 { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
3274 { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
3275 },
3276
3277 /* PREFIX_0F5B */
3278 {
3279 { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
3280 { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
3281 { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
3282 },
3283
3284 /* PREFIX_0F5C */
3285 {
3286 { "subps", { XM, EXx }, PREFIX_OPCODE },
3287 { "subss", { XM, EXd }, PREFIX_OPCODE },
3288 { "subpd", { XM, EXx }, PREFIX_OPCODE },
3289 { "subsd", { XM, EXq }, PREFIX_OPCODE },
3290 },
3291
3292 /* PREFIX_0F5D */
3293 {
3294 { "minps", { XM, EXx }, PREFIX_OPCODE },
3295 { "minss", { XM, EXd }, PREFIX_OPCODE },
3296 { "minpd", { XM, EXx }, PREFIX_OPCODE },
3297 { "minsd", { XM, EXq }, PREFIX_OPCODE },
3298 },
3299
3300 /* PREFIX_0F5E */
3301 {
3302 { "divps", { XM, EXx }, PREFIX_OPCODE },
3303 { "divss", { XM, EXd }, PREFIX_OPCODE },
3304 { "divpd", { XM, EXx }, PREFIX_OPCODE },
3305 { "divsd", { XM, EXq }, PREFIX_OPCODE },
3306 },
3307
3308 /* PREFIX_0F5F */
3309 {
3310 { "maxps", { XM, EXx }, PREFIX_OPCODE },
3311 { "maxss", { XM, EXd }, PREFIX_OPCODE },
3312 { "maxpd", { XM, EXx }, PREFIX_OPCODE },
3313 { "maxsd", { XM, EXq }, PREFIX_OPCODE },
3314 },
3315
3316 /* PREFIX_0F60 */
3317 {
3318 { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
3319 { Bad_Opcode },
3320 { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
3321 },
3322
3323 /* PREFIX_0F61 */
3324 {
3325 { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
3326 { Bad_Opcode },
3327 { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
3328 },
3329
3330 /* PREFIX_0F62 */
3331 {
3332 { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
3333 { Bad_Opcode },
3334 { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
3335 },
3336
3337 /* PREFIX_0F6F */
3338 {
3339 { "movq", { MX, EM }, PREFIX_OPCODE },
3340 { "movdqu", { XM, EXx }, PREFIX_OPCODE },
3341 { "movdqa", { XM, EXx }, PREFIX_OPCODE },
3342 },
3343
3344 /* PREFIX_0F70 */
3345 {
3346 { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
3347 { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3348 { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
3349 { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
3350 },
3351
3352 /* PREFIX_0F78 */
3353 {
3354 {"vmread", { Em, Gm }, 0 },
3355 { Bad_Opcode },
3356 {"extrq", { XS, Ib, Ib }, 0 },
3357 {"insertq", { XM, XS, Ib, Ib }, 0 },
3358 },
3359
3360 /* PREFIX_0F79 */
3361 {
3362 {"vmwrite", { Gm, Em }, 0 },
3363 { Bad_Opcode },
3364 {"extrq", { XM, XS }, 0 },
3365 {"insertq", { XM, XS }, 0 },
3366 },
3367
3368 /* PREFIX_0F7C */
3369 {
3370 { Bad_Opcode },
3371 { Bad_Opcode },
3372 { "haddpd", { XM, EXx }, PREFIX_OPCODE },
3373 { "haddps", { XM, EXx }, PREFIX_OPCODE },
3374 },
3375
3376 /* PREFIX_0F7D */
3377 {
3378 { Bad_Opcode },
3379 { Bad_Opcode },
3380 { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
3381 { "hsubps", { XM, EXx }, PREFIX_OPCODE },
3382 },
3383
3384 /* PREFIX_0F7E */
3385 {
3386 { "movK", { Edq, MX }, PREFIX_OPCODE },
3387 { "movq", { XM, EXq }, PREFIX_OPCODE },
3388 { "movK", { Edq, XM }, PREFIX_OPCODE },
3389 },
3390
3391 /* PREFIX_0F7F */
3392 {
3393 { "movq", { EMS, MX }, PREFIX_OPCODE },
3394 { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
3395 { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
3396 },
3397
3398 /* PREFIX_0FAE_REG_0_MOD_3 */
3399 {
3400 { Bad_Opcode },
3401 { "rdfsbase", { Ev }, 0 },
3402 },
3403
3404 /* PREFIX_0FAE_REG_1_MOD_3 */
3405 {
3406 { Bad_Opcode },
3407 { "rdgsbase", { Ev }, 0 },
3408 },
3409
3410 /* PREFIX_0FAE_REG_2_MOD_3 */
3411 {
3412 { Bad_Opcode },
3413 { "wrfsbase", { Ev }, 0 },
3414 },
3415
3416 /* PREFIX_0FAE_REG_3_MOD_3 */
3417 {
3418 { Bad_Opcode },
3419 { "wrgsbase", { Ev }, 0 },
3420 },
3421
3422 /* PREFIX_0FAE_REG_4_MOD_0 */
3423 {
3424 { "xsave", { FXSAVE }, 0 },
3425 { "ptwrite{%LQ|}", { Edq }, 0 },
3426 },
3427
3428 /* PREFIX_0FAE_REG_4_MOD_3 */
3429 {
3430 { Bad_Opcode },
3431 { "ptwrite{%LQ|}", { Edq }, 0 },
3432 },
3433
3434 /* PREFIX_0FAE_REG_5_MOD_3 */
3435 {
3436 { "lfence", { Skip_MODRM }, 0 },
3437 { "incsspK", { Edq }, PREFIX_OPCODE },
3438 },
3439
3440 /* PREFIX_0FAE_REG_6_MOD_0 */
3441 {
3442 { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
3443 { "clrssbsy", { Mq }, PREFIX_OPCODE },
3444 { "clwb", { Mb }, PREFIX_OPCODE },
3445 },
3446
3447 /* PREFIX_0FAE_REG_6_MOD_3 */
3448 {
3449 { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
3450 { "umonitor", { Eva }, PREFIX_OPCODE },
3451 { "tpause", { Edq }, PREFIX_OPCODE },
3452 { "umwait", { Edq }, PREFIX_OPCODE },
3453 },
3454
3455 /* PREFIX_0FAE_REG_7_MOD_0 */
3456 {
3457 { "clflush", { Mb }, 0 },
3458 { Bad_Opcode },
3459 { "clflushopt", { Mb }, 0 },
3460 },
3461
3462 /* PREFIX_0FB8 */
3463 {
3464 { Bad_Opcode },
3465 { "popcntS", { Gv, Ev }, 0 },
3466 },
3467
3468 /* PREFIX_0FBC */
3469 {
3470 { "bsfS", { Gv, Ev }, 0 },
3471 { "tzcntS", { Gv, Ev }, 0 },
3472 { "bsfS", { Gv, Ev }, 0 },
3473 },
3474
3475 /* PREFIX_0FBD */
3476 {
3477 { "bsrS", { Gv, Ev }, 0 },
3478 { "lzcntS", { Gv, Ev }, 0 },
3479 { "bsrS", { Gv, Ev }, 0 },
3480 },
3481
3482 /* PREFIX_0FC2 */
3483 {
3484 { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
3485 { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
3486 { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
3487 { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
3488 },
3489
3490 /* PREFIX_0FC7_REG_6_MOD_0 */
3491 {
3492 { "vmptrld",{ Mq }, 0 },
3493 { "vmxon", { Mq }, 0 },
3494 { "vmclear",{ Mq }, 0 },
3495 },
3496
3497 /* PREFIX_0FC7_REG_6_MOD_3 */
3498 {
3499 { "rdrand", { Ev }, 0 },
3500 { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1) },
3501 { "rdrand", { Ev }, 0 }
3502 },
3503
3504 /* PREFIX_0FC7_REG_7_MOD_3 */
3505 {
3506 { "rdseed", { Ev }, 0 },
3507 { "rdpid", { Em }, 0 },
3508 { "rdseed", { Ev }, 0 },
3509 },
3510
3511 /* PREFIX_0FD0 */
3512 {
3513 { Bad_Opcode },
3514 { Bad_Opcode },
3515 { "addsubpd", { XM, EXx }, 0 },
3516 { "addsubps", { XM, EXx }, 0 },
3517 },
3518
3519 /* PREFIX_0FD6 */
3520 {
3521 { Bad_Opcode },
3522 { "movq2dq",{ XM, MS }, 0 },
3523 { "movq", { EXqS, XM }, 0 },
3524 { "movdq2q",{ MX, XS }, 0 },
3525 },
3526
3527 /* PREFIX_0FE6 */
3528 {
3529 { Bad_Opcode },
3530 { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
3531 { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
3532 { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
3533 },
3534
3535 /* PREFIX_0FE7 */
3536 {
3537 { "movntq", { Mq, MX }, PREFIX_OPCODE },
3538 { Bad_Opcode },
3539 { MOD_TABLE (MOD_0FE7_PREFIX_2) },
3540 },
3541
3542 /* PREFIX_0FF0 */
3543 {
3544 { Bad_Opcode },
3545 { Bad_Opcode },
3546 { Bad_Opcode },
3547 { MOD_TABLE (MOD_0FF0_PREFIX_3) },
3548 },
3549
3550 /* PREFIX_0FF7 */
3551 {
3552 { "maskmovq", { MX, MS }, PREFIX_OPCODE },
3553 { Bad_Opcode },
3554 { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
3555 },
3556
3557 /* PREFIX_0F38D8 */
3558 {
3559 { Bad_Opcode },
3560 { REG_TABLE (REG_0F38D8_PREFIX_1) },
3561 },
3562
3563 /* PREFIX_0F38DC */
3564 {
3565 { Bad_Opcode },
3566 { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
3567 { "aesenc", { XM, EXx }, 0 },
3568 },
3569
3570 /* PREFIX_0F38DD */
3571 {
3572 { Bad_Opcode },
3573 { MOD_TABLE (MOD_0F38DD_PREFIX_1) },
3574 { "aesenclast", { XM, EXx }, 0 },
3575 },
3576
3577 /* PREFIX_0F38DE */
3578 {
3579 { Bad_Opcode },
3580 { MOD_TABLE (MOD_0F38DE_PREFIX_1) },
3581 { "aesdec", { XM, EXx }, 0 },
3582 },
3583
3584 /* PREFIX_0F38DF */
3585 {
3586 { Bad_Opcode },
3587 { MOD_TABLE (MOD_0F38DF_PREFIX_1) },
3588 { "aesdeclast", { XM, EXx }, 0 },
3589 },
3590
3591 /* PREFIX_0F38F0 */
3592 {
3593 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3594 { Bad_Opcode },
3595 { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
3596 { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
3597 },
3598
3599 /* PREFIX_0F38F1 */
3600 {
3601 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3602 { Bad_Opcode },
3603 { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
3604 { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
3605 },
3606
3607 /* PREFIX_0F38F6 */
3608 {
3609 { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
3610 { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
3611 { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
3612 { Bad_Opcode },
3613 },
3614
3615 /* PREFIX_0F38F8 */
3616 {
3617 { Bad_Opcode },
3618 { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
3619 { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
3620 { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
3621 },
3622 /* PREFIX_0F38FA */
3623 {
3624 { Bad_Opcode },
3625 { MOD_TABLE (MOD_0F38FA_PREFIX_1) },
3626 },
3627
3628 /* PREFIX_0F38FB */
3629 {
3630 { Bad_Opcode },
3631 { MOD_TABLE (MOD_0F38FB_PREFIX_1) },
3632 },
3633
3634 /* PREFIX_0F38FC */
3635 {
3636 { "aadd", { Mdq, Gdq }, 0 },
3637 { "axor", { Mdq, Gdq }, 0 },
3638 { "aand", { Mdq, Gdq }, 0 },
3639 { "aor", { Mdq, Gdq }, 0 },
3640 },
3641
3642 /* PREFIX_0F3A0F */
3643 {
3644 { Bad_Opcode },
3645 { MOD_TABLE (MOD_0F3A0F_PREFIX_1)},
3646 },
3647
3648 /* PREFIX_VEX_0F10 */
3649 {
3650 { "%XEvmovupX", { XM, EXEvexXNoBcst }, 0 },
3651 { "%XEvmovs%XS", { XMScalar, VexScalarR, EXd }, 0 },
3652 { "%XEvmovupX", { XM, EXEvexXNoBcst }, 0 },
3653 { "%XEvmovs%XD", { XMScalar, VexScalarR, EXq }, 0 },
3654 },
3655
3656 /* PREFIX_VEX_0F11 */
3657 {
3658 { "%XEvmovupX", { EXxS, XM }, 0 },
3659 { "%XEvmovs%XS", { EXdS, VexScalarR, XMScalar }, 0 },
3660 { "%XEvmovupX", { EXxS, XM }, 0 },
3661 { "%XEvmovs%XD", { EXqS, VexScalarR, XMScalar }, 0 },
3662 },
3663
3664 /* PREFIX_VEX_0F12 */
3665 {
3666 { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
3667 { "%XEvmov%XSldup", { XM, EXEvexXNoBcst }, 0 },
3668 { MOD_TABLE (MOD_VEX_0F12_PREFIX_2) },
3669 { "%XEvmov%XDdup", { XM, EXymmq }, 0 },
3670 },
3671
3672 /* PREFIX_VEX_0F16 */
3673 {
3674 { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
3675 { "%XEvmov%XShdup", { XM, EXEvexXNoBcst }, 0 },
3676 { MOD_TABLE (MOD_VEX_0F16_PREFIX_2) },
3677 },
3678
3679 /* PREFIX_VEX_0F2A */
3680 {
3681 { Bad_Opcode },
3682 { "%XEvcvtsi2ss{%LQ|}", { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
3683 { Bad_Opcode },
3684 { "%XEvcvtsi2sd{%LQ|}", { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
3685 },
3686
3687 /* PREFIX_VEX_0F2C */
3688 {
3689 { Bad_Opcode },
3690 { "%XEvcvttss2si", { Gdq, EXd, EXxEVexS }, 0 },
3691 { Bad_Opcode },
3692 { "%XEvcvttsd2si", { Gdq, EXq, EXxEVexS }, 0 },
3693 },
3694
3695 /* PREFIX_VEX_0F2D */
3696 {
3697 { Bad_Opcode },
3698 { "%XEvcvtss2si", { Gdq, EXd, EXxEVexR }, 0 },
3699 { Bad_Opcode },
3700 { "%XEvcvtsd2si", { Gdq, EXq, EXxEVexR }, 0 },
3701 },
3702
3703 /* PREFIX_VEX_0F2E */
3704 {
3705 { "%XEvucomisX", { XMScalar, EXd, EXxEVexS }, 0 },
3706 { Bad_Opcode },
3707 { "%XEvucomisX", { XMScalar, EXq, EXxEVexS }, 0 },
3708 },
3709
3710 /* PREFIX_VEX_0F2F */
3711 {
3712 { "%XEvcomisX", { XMScalar, EXd, EXxEVexS }, 0 },
3713 { Bad_Opcode },
3714 { "%XEvcomisX", { XMScalar, EXq, EXxEVexS }, 0 },
3715 },
3716
3717 /* PREFIX_VEX_0F41_L_1_M_1_W_0 */
3718 {
3719 { "kandw", { MaskG, MaskVex, MaskE }, 0 },
3720 { Bad_Opcode },
3721 { "kandb", { MaskG, MaskVex, MaskE }, 0 },
3722 },
3723
3724 /* PREFIX_VEX_0F41_L_1_M_1_W_1 */
3725 {
3726 { "kandq", { MaskG, MaskVex, MaskE }, 0 },
3727 { Bad_Opcode },
3728 { "kandd", { MaskG, MaskVex, MaskE }, 0 },
3729 },
3730
3731 /* PREFIX_VEX_0F42_L_1_M_1_W_0 */
3732 {
3733 { "kandnw", { MaskG, MaskVex, MaskE }, 0 },
3734 { Bad_Opcode },
3735 { "kandnb", { MaskG, MaskVex, MaskE }, 0 },
3736 },
3737
3738 /* PREFIX_VEX_0F42_L_1_M_1_W_1 */
3739 {
3740 { "kandnq", { MaskG, MaskVex, MaskE }, 0 },
3741 { Bad_Opcode },
3742 { "kandnd", { MaskG, MaskVex, MaskE }, 0 },
3743 },
3744
3745 /* PREFIX_VEX_0F44_L_0_M_1_W_0 */
3746 {
3747 { "knotw", { MaskG, MaskE }, 0 },
3748 { Bad_Opcode },
3749 { "knotb", { MaskG, MaskE }, 0 },
3750 },
3751
3752 /* PREFIX_VEX_0F44_L_0_M_1_W_1 */
3753 {
3754 { "knotq", { MaskG, MaskE }, 0 },
3755 { Bad_Opcode },
3756 { "knotd", { MaskG, MaskE }, 0 },
3757 },
3758
3759 /* PREFIX_VEX_0F45_L_1_M_1_W_0 */
3760 {
3761 { "korw", { MaskG, MaskVex, MaskE }, 0 },
3762 { Bad_Opcode },
3763 { "korb", { MaskG, MaskVex, MaskE }, 0 },
3764 },
3765
3766 /* PREFIX_VEX_0F45_L_1_M_1_W_1 */
3767 {
3768 { "korq", { MaskG, MaskVex, MaskE }, 0 },
3769 { Bad_Opcode },
3770 { "kord", { MaskG, MaskVex, MaskE }, 0 },
3771 },
3772
3773 /* PREFIX_VEX_0F46_L_1_M_1_W_0 */
3774 {
3775 { "kxnorw", { MaskG, MaskVex, MaskE }, 0 },
3776 { Bad_Opcode },
3777 { "kxnorb", { MaskG, MaskVex, MaskE }, 0 },
3778 },
3779
3780 /* PREFIX_VEX_0F46_L_1_M_1_W_1 */
3781 {
3782 { "kxnorq", { MaskG, MaskVex, MaskE }, 0 },
3783 { Bad_Opcode },
3784 { "kxnord", { MaskG, MaskVex, MaskE }, 0 },
3785 },
3786
3787 /* PREFIX_VEX_0F47_L_1_M_1_W_0 */
3788 {
3789 { "kxorw", { MaskG, MaskVex, MaskE }, 0 },
3790 { Bad_Opcode },
3791 { "kxorb", { MaskG, MaskVex, MaskE }, 0 },
3792 },
3793
3794 /* PREFIX_VEX_0F47_L_1_M_1_W_1 */
3795 {
3796 { "kxorq", { MaskG, MaskVex, MaskE }, 0 },
3797 { Bad_Opcode },
3798 { "kxord", { MaskG, MaskVex, MaskE }, 0 },
3799 },
3800
3801 /* PREFIX_VEX_0F4A_L_1_M_1_W_0 */
3802 {
3803 { "kaddw", { MaskG, MaskVex, MaskE }, 0 },
3804 { Bad_Opcode },
3805 { "kaddb", { MaskG, MaskVex, MaskE }, 0 },
3806 },
3807
3808 /* PREFIX_VEX_0F4A_L_1_M_1_W_1 */
3809 {
3810 { "kaddq", { MaskG, MaskVex, MaskE }, 0 },
3811 { Bad_Opcode },
3812 { "kaddd", { MaskG, MaskVex, MaskE }, 0 },
3813 },
3814
3815 /* PREFIX_VEX_0F4B_L_1_M_1_W_0 */
3816 {
3817 { "kunpckwd", { MaskG, MaskVex, MaskE }, 0 },
3818 { Bad_Opcode },
3819 { "kunpckbw", { MaskG, MaskVex, MaskE }, 0 },
3820 },
3821
3822 /* PREFIX_VEX_0F4B_L_1_M_1_W_1 */
3823 {
3824 { "kunpckdq", { MaskG, MaskVex, MaskE }, 0 },
3825 },
3826
3827 /* PREFIX_VEX_0F51 */
3828 {
3829 { "%XEvsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3830 { "%XEvsqrts%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3831 { "%XEvsqrtpX", { XM, EXx, EXxEVexR }, 0 },
3832 { "%XEvsqrts%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3833 },
3834
3835 /* PREFIX_VEX_0F52 */
3836 {
3837 { "vrsqrtps", { XM, EXx }, 0 },
3838 { "vrsqrtss", { XMScalar, VexScalar, EXd }, 0 },
3839 },
3840
3841 /* PREFIX_VEX_0F53 */
3842 {
3843 { "vrcpps", { XM, EXx }, 0 },
3844 { "vrcpss", { XMScalar, VexScalar, EXd }, 0 },
3845 },
3846
3847 /* PREFIX_VEX_0F58 */
3848 {
3849 { "%XEvaddpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3850 { "%XEvadds%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3851 { "%XEvaddpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3852 { "%XEvadds%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3853 },
3854
3855 /* PREFIX_VEX_0F59 */
3856 {
3857 { "%XEvmulpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3858 { "%XEvmuls%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3859 { "%XEvmulpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3860 { "%XEvmuls%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3861 },
3862
3863 /* PREFIX_VEX_0F5A */
3864 {
3865 { "%XEvcvtp%XS2pd", { XM, EXEvexHalfBcstXmmq, EXxEVexS }, 0 },
3866 { "%XEvcvts%XS2sd", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3867 { "%XEvcvtp%XD2ps%XY", { XMxmmq, EXx, EXxEVexR }, 0 },
3868 { "%XEvcvts%XD2ss", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3869 },
3870
3871 /* PREFIX_VEX_0F5B */
3872 {
3873 { "vcvtdq2ps", { XM, EXx }, 0 },
3874 { "vcvttps2dq", { XM, EXx }, 0 },
3875 { "vcvtps2dq", { XM, EXx }, 0 },
3876 },
3877
3878 /* PREFIX_VEX_0F5C */
3879 {
3880 { "%XEvsubpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3881 { "%XEvsubs%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3882 { "%XEvsubpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3883 { "%XEvsubs%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3884 },
3885
3886 /* PREFIX_VEX_0F5D */
3887 {
3888 { "%XEvminpX", { XM, Vex, EXx, EXxEVexS }, 0 },
3889 { "%XEvmins%XS", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3890 { "%XEvminpX", { XM, Vex, EXx, EXxEVexS }, 0 },
3891 { "%XEvmins%XD", { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3892 },
3893
3894 /* PREFIX_VEX_0F5E */
3895 {
3896 { "%XEvdivpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3897 { "%XEvdivs%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
3898 { "%XEvdivpX", { XM, Vex, EXx, EXxEVexR }, 0 },
3899 { "%XEvdivs%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
3900 },
3901
3902 /* PREFIX_VEX_0F5F */
3903 {
3904 { "%XEvmaxpX", { XM, Vex, EXx, EXxEVexS }, 0 },
3905 { "%XEvmaxs%XS", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
3906 { "%XEvmaxpX", { XM, Vex, EXx, EXxEVexS }, 0 },
3907 { "%XEvmaxs%XD", { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
3908 },
3909
3910 /* PREFIX_VEX_0F6F */
3911 {
3912 { Bad_Opcode },
3913 { "vmovdqu", { XM, EXx }, 0 },
3914 { "vmovdqa", { XM, EXx }, 0 },
3915 },
3916
3917 /* PREFIX_VEX_0F70 */
3918 {
3919 { Bad_Opcode },
3920 { "vpshufhw", { XM, EXx, Ib }, 0 },
3921 { "vpshufd", { XM, EXx, Ib }, 0 },
3922 { "vpshuflw", { XM, EXx, Ib }, 0 },
3923 },
3924
3925 /* PREFIX_VEX_0F7C */
3926 {
3927 { Bad_Opcode },
3928 { Bad_Opcode },
3929 { "vhaddpd", { XM, Vex, EXx }, 0 },
3930 { "vhaddps", { XM, Vex, EXx }, 0 },
3931 },
3932
3933 /* PREFIX_VEX_0F7D */
3934 {
3935 { Bad_Opcode },
3936 { Bad_Opcode },
3937 { "vhsubpd", { XM, Vex, EXx }, 0 },
3938 { "vhsubps", { XM, Vex, EXx }, 0 },
3939 },
3940
3941 /* PREFIX_VEX_0F7E */
3942 {
3943 { Bad_Opcode },
3944 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
3945 { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
3946 },
3947
3948 /* PREFIX_VEX_0F7F */
3949 {
3950 { Bad_Opcode },
3951 { "vmovdqu", { EXxS, XM }, 0 },
3952 { "vmovdqa", { EXxS, XM }, 0 },
3953 },
3954
3955 /* PREFIX_VEX_0F90_L_0_W_0 */
3956 {
3957 { "kmovw", { MaskG, MaskE }, 0 },
3958 { Bad_Opcode },
3959 { "kmovb", { MaskG, MaskBDE }, 0 },
3960 },
3961
3962 /* PREFIX_VEX_0F90_L_0_W_1 */
3963 {
3964 { "kmovq", { MaskG, MaskE }, 0 },
3965 { Bad_Opcode },
3966 { "kmovd", { MaskG, MaskBDE }, 0 },
3967 },
3968
3969 /* PREFIX_VEX_0F91_L_0_M_0_W_0 */
3970 {
3971 { "kmovw", { Ew, MaskG }, 0 },
3972 { Bad_Opcode },
3973 { "kmovb", { Eb, MaskG }, 0 },
3974 },
3975
3976 /* PREFIX_VEX_0F91_L_0_M_0_W_1 */
3977 {
3978 { "kmovq", { Eq, MaskG }, 0 },
3979 { Bad_Opcode },
3980 { "kmovd", { Ed, MaskG }, 0 },
3981 },
3982
3983 /* PREFIX_VEX_0F92_L_0_M_1_W_0 */
3984 {
3985 { "kmovw", { MaskG, Edq }, 0 },
3986 { Bad_Opcode },
3987 { "kmovb", { MaskG, Edq }, 0 },
3988 { "kmovd", { MaskG, Edq }, 0 },
3989 },
3990
3991 /* PREFIX_VEX_0F92_L_0_M_1_W_1 */
3992 {
3993 { Bad_Opcode },
3994 { Bad_Opcode },
3995 { Bad_Opcode },
3996 { "kmovK", { MaskG, Edq }, 0 },
3997 },
3998
3999 /* PREFIX_VEX_0F93_L_0_M_1_W_0 */
4000 {
4001 { "kmovw", { Gdq, MaskE }, 0 },
4002 { Bad_Opcode },
4003 { "kmovb", { Gdq, MaskE }, 0 },
4004 { "kmovd", { Gdq, MaskE }, 0 },
4005 },
4006
4007 /* PREFIX_VEX_0F93_L_0_M_1_W_1 */
4008 {
4009 { Bad_Opcode },
4010 { Bad_Opcode },
4011 { Bad_Opcode },
4012 { "kmovK", { Gdq, MaskE }, 0 },
4013 },
4014
4015 /* PREFIX_VEX_0F98_L_0_M_1_W_0 */
4016 {
4017 { "kortestw", { MaskG, MaskE }, 0 },
4018 { Bad_Opcode },
4019 { "kortestb", { MaskG, MaskE }, 0 },
4020 },
4021
4022 /* PREFIX_VEX_0F98_L_0_M_1_W_1 */
4023 {
4024 { "kortestq", { MaskG, MaskE }, 0 },
4025 { Bad_Opcode },
4026 { "kortestd", { MaskG, MaskE }, 0 },
4027 },
4028
4029 /* PREFIX_VEX_0F99_L_0_M_1_W_0 */
4030 {
4031 { "ktestw", { MaskG, MaskE }, 0 },
4032 { Bad_Opcode },
4033 { "ktestb", { MaskG, MaskE }, 0 },
4034 },
4035
4036 /* PREFIX_VEX_0F99_L_0_M_1_W_1 */
4037 {
4038 { "ktestq", { MaskG, MaskE }, 0 },
4039 { Bad_Opcode },
4040 { "ktestd", { MaskG, MaskE }, 0 },
4041 },
4042
4043 /* PREFIX_VEX_0FC2 */
4044 {
4045 { "vcmpps", { XM, Vex, EXx, CMP }, 0 },
4046 { "vcmpss", { XMScalar, VexScalar, EXd, CMP }, 0 },
4047 { "vcmppd", { XM, Vex, EXx, CMP }, 0 },
4048 { "vcmpsd", { XMScalar, VexScalar, EXq, CMP }, 0 },
4049 },
4050
4051 /* PREFIX_VEX_0FD0 */
4052 {
4053 { Bad_Opcode },
4054 { Bad_Opcode },
4055 { "vaddsubpd", { XM, Vex, EXx }, 0 },
4056 { "vaddsubps", { XM, Vex, EXx }, 0 },
4057 },
4058
4059 /* PREFIX_VEX_0FE6 */
4060 {
4061 { Bad_Opcode },
4062 { "vcvtdq2pd", { XM, EXxmmq }, 0 },
4063 { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
4064 { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
4065 },
4066
4067 /* PREFIX_VEX_0FF0 */
4068 {
4069 { Bad_Opcode },
4070 { Bad_Opcode },
4071 { Bad_Opcode },
4072 { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
4073 },
4074
4075 /* PREFIX_VEX_0F3849_X86_64 */
4076 {
4077 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0) },
4078 { Bad_Opcode },
4079 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2) },
4080 { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3) },
4081 },
4082
4083 /* PREFIX_VEX_0F384B_X86_64 */
4084 {
4085 { Bad_Opcode },
4086 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1) },
4087 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2) },
4088 { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3) },
4089 },
4090
4091 /* PREFIX_VEX_0F3850_W_0 */
4092 {
4093 { "vpdpbuud", { XM, Vex, EXx }, 0 },
4094 { "vpdpbsud", { XM, Vex, EXx }, 0 },
4095 { "%XVvpdpbusd", { XM, Vex, EXx }, 0 },
4096 { "vpdpbssd", { XM, Vex, EXx }, 0 },
4097 },
4098
4099 /* PREFIX_VEX_0F3851_W_0 */
4100 {
4101 { "vpdpbuuds", { XM, Vex, EXx }, 0 },
4102 { "vpdpbsuds", { XM, Vex, EXx }, 0 },
4103 { "%XVvpdpbusds", { XM, Vex, EXx }, 0 },
4104 { "vpdpbssds", { XM, Vex, EXx }, 0 },
4105 },
4106 /* PREFIX_VEX_0F385C_X86_64 */
4107 {
4108 { Bad_Opcode },
4109 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1) },
4110 { Bad_Opcode },
4111 { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_3) },
4112 },
4113
4114 /* PREFIX_VEX_0F385E_X86_64 */
4115 {
4116 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0) },
4117 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1) },
4118 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2) },
4119 { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3) },
4120 },
4121
4122 /* PREFIX_VEX_0F3872 */
4123 {
4124 { Bad_Opcode },
4125 { VEX_W_TABLE (VEX_W_0F3872_P_1) },
4126 },
4127
4128 /* PREFIX_VEX_0F38B0_W_0 */
4129 {
4130 { "vcvtneoph2ps", { XM, Mx }, 0 },
4131 { "vcvtneebf162ps", { XM, Mx }, 0 },
4132 { "vcvtneeph2ps", { XM, Mx }, 0 },
4133 { "vcvtneobf162ps", { XM, Mx }, 0 },
4134 },
4135
4136 /* PREFIX_VEX_0F38B1_W_0 */
4137 {
4138 { Bad_Opcode },
4139 { "vbcstnebf162ps", { XM, Mw }, 0 },
4140 { "vbcstnesh2ps", { XM, Mw }, 0 },
4141 },
4142
4143 /* PREFIX_VEX_0F38F5_L_0 */
4144 {
4145 { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
4146 { "pextS", { Gdq, VexGdq, Edq }, 0 },
4147 { Bad_Opcode },
4148 { "pdepS", { Gdq, VexGdq, Edq }, 0 },
4149 },
4150
4151 /* PREFIX_VEX_0F38F6_L_0 */
4152 {
4153 { Bad_Opcode },
4154 { Bad_Opcode },
4155 { Bad_Opcode },
4156 { "mulxS", { Gdq, VexGdq, Edq }, 0 },
4157 },
4158
4159 /* PREFIX_VEX_0F38F7_L_0 */
4160 {
4161 { "bextrS", { Gdq, Edq, VexGdq }, 0 },
4162 { "sarxS", { Gdq, Edq, VexGdq }, 0 },
4163 { "shlxS", { Gdq, Edq, VexGdq }, 0 },
4164 { "shrxS", { Gdq, Edq, VexGdq }, 0 },
4165 },
4166
4167 /* PREFIX_VEX_0F3AF0_L_0 */
4168 {
4169 { Bad_Opcode },
4170 { Bad_Opcode },
4171 { Bad_Opcode },
4172 { "rorxS", { Gdq, Edq, Ib }, 0 },
4173 },
4174
4175 #include "i386-dis-evex-prefix.h"
4176 };
4177
4178 static const struct dis386 x86_64_table[][2] = {
4179 /* X86_64_06 */
4180 {
4181 { "pushP", { es }, 0 },
4182 },
4183
4184 /* X86_64_07 */
4185 {
4186 { "popP", { es }, 0 },
4187 },
4188
4189 /* X86_64_0E */
4190 {
4191 { "pushP", { cs }, 0 },
4192 },
4193
4194 /* X86_64_16 */
4195 {
4196 { "pushP", { ss }, 0 },
4197 },
4198
4199 /* X86_64_17 */
4200 {
4201 { "popP", { ss }, 0 },
4202 },
4203
4204 /* X86_64_1E */
4205 {
4206 { "pushP", { ds }, 0 },
4207 },
4208
4209 /* X86_64_1F */
4210 {
4211 { "popP", { ds }, 0 },
4212 },
4213
4214 /* X86_64_27 */
4215 {
4216 { "daa", { XX }, 0 },
4217 },
4218
4219 /* X86_64_2F */
4220 {
4221 { "das", { XX }, 0 },
4222 },
4223
4224 /* X86_64_37 */
4225 {
4226 { "aaa", { XX }, 0 },
4227 },
4228
4229 /* X86_64_3F */
4230 {
4231 { "aas", { XX }, 0 },
4232 },
4233
4234 /* X86_64_60 */
4235 {
4236 { "pushaP", { XX }, 0 },
4237 },
4238
4239 /* X86_64_61 */
4240 {
4241 { "popaP", { XX }, 0 },
4242 },
4243
4244 /* X86_64_62 */
4245 {
4246 { MOD_TABLE (MOD_62_32BIT) },
4247 { EVEX_TABLE (EVEX_0F) },
4248 },
4249
4250 /* X86_64_63 */
4251 {
4252 { "arpl", { Ew, Gw }, 0 },
4253 { "movs", { Gv, { MOVSXD_Fixup, movsxd_mode } }, 0 },
4254 },
4255
4256 /* X86_64_6D */
4257 {
4258 { "ins{R|}", { Yzr, indirDX }, 0 },
4259 { "ins{G|}", { Yzr, indirDX }, 0 },
4260 },
4261
4262 /* X86_64_6F */
4263 {
4264 { "outs{R|}", { indirDXr, Xz }, 0 },
4265 { "outs{G|}", { indirDXr, Xz }, 0 },
4266 },
4267
4268 /* X86_64_82 */
4269 {
4270 /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
4271 { REG_TABLE (REG_80) },
4272 },
4273
4274 /* X86_64_9A */
4275 {
4276 { "{l|}call{P|}", { Ap }, 0 },
4277 },
4278
4279 /* X86_64_C2 */
4280 {
4281 { "retP", { Iw, BND }, 0 },
4282 { "ret@", { Iw, BND }, 0 },
4283 },
4284
4285 /* X86_64_C3 */
4286 {
4287 { "retP", { BND }, 0 },
4288 { "ret@", { BND }, 0 },
4289 },
4290
4291 /* X86_64_C4 */
4292 {
4293 { MOD_TABLE (MOD_C4_32BIT) },
4294 { VEX_C4_TABLE (VEX_0F) },
4295 },
4296
4297 /* X86_64_C5 */
4298 {
4299 { MOD_TABLE (MOD_C5_32BIT) },
4300 { VEX_C5_TABLE (VEX_0F) },
4301 },
4302
4303 /* X86_64_CE */
4304 {
4305 { "into", { XX }, 0 },
4306 },
4307
4308 /* X86_64_D4 */
4309 {
4310 { "aam", { Ib }, 0 },
4311 },
4312
4313 /* X86_64_D5 */
4314 {
4315 { "aad", { Ib }, 0 },
4316 },
4317
4318 /* X86_64_E8 */
4319 {
4320 { "callP", { Jv, BND }, 0 },
4321 { "call@", { Jv, BND }, 0 }
4322 },
4323
4324 /* X86_64_E9 */
4325 {
4326 { "jmpP", { Jv, BND }, 0 },
4327 { "jmp@", { Jv, BND }, 0 }
4328 },
4329
4330 /* X86_64_EA */
4331 {
4332 { "{l|}jmp{P|}", { Ap }, 0 },
4333 },
4334
4335 /* X86_64_0F01_REG_0 */
4336 {
4337 { "sgdt{Q|Q}", { M }, 0 },
4338 { "sgdt", { M }, 0 },
4339 },
4340
4341 /* X86_64_0F01_REG_0_MOD_3_RM_6_P_1 */
4342 {
4343 { Bad_Opcode },
4344 { "wrmsrlist", { Skip_MODRM }, 0 },
4345 },
4346
4347 /* X86_64_0F01_REG_0_MOD_3_RM_6_P_3 */
4348 {
4349 { Bad_Opcode },
4350 { "rdmsrlist", { Skip_MODRM }, 0 },
4351 },
4352
4353 /* X86_64_0F01_REG_1 */
4354 {
4355 { "sidt{Q|Q}", { M }, 0 },
4356 { "sidt", { M }, 0 },
4357 },
4358
4359 /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
4360 {
4361 { Bad_Opcode },
4362 { "seamret", { Skip_MODRM }, 0 },
4363 },
4364
4365 /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
4366 {
4367 { Bad_Opcode },
4368 { "seamops", { Skip_MODRM }, 0 },
4369 },
4370
4371 /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
4372 {
4373 { Bad_Opcode },
4374 { "seamcall", { Skip_MODRM }, 0 },
4375 },
4376
4377 /* X86_64_0F01_REG_2 */
4378 {
4379 { "lgdt{Q|Q}", { M }, 0 },
4380 { "lgdt", { M }, 0 },
4381 },
4382
4383 /* X86_64_0F01_REG_3 */
4384 {
4385 { "lidt{Q|Q}", { M }, 0 },
4386 { "lidt", { M }, 0 },
4387 },
4388
4389 /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
4390 {
4391 { Bad_Opcode },
4392 { "uiret", { Skip_MODRM }, 0 },
4393 },
4394
4395 /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
4396 {
4397 { Bad_Opcode },
4398 { "testui", { Skip_MODRM }, 0 },
4399 },
4400
4401 /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
4402 {
4403 { Bad_Opcode },
4404 { "clui", { Skip_MODRM }, 0 },
4405 },
4406
4407 /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
4408 {
4409 { Bad_Opcode },
4410 { "stui", { Skip_MODRM }, 0 },
4411 },
4412
4413 /* X86_64_0F01_REG_7_MOD_3_RM_5_PREFIX_1 */
4414 {
4415 { Bad_Opcode },
4416 { "rmpquery", { Skip_MODRM }, 0 },
4417 },
4418
4419 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
4420 {
4421 { Bad_Opcode },
4422 { "rmpadjust", { Skip_MODRM }, 0 },
4423 },
4424
4425 /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
4426 {
4427 { Bad_Opcode },
4428 { "rmpupdate", { Skip_MODRM }, 0 },
4429 },
4430
4431 /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
4432 {
4433 { Bad_Opcode },
4434 { "psmash", { Skip_MODRM }, 0 },
4435 },
4436
4437 /* X86_64_0F18_REG_6_MOD_0 */
4438 {
4439 { "nopQ", { Ev }, 0 },
4440 { PREFIX_TABLE (PREFIX_0F18_REG_6_MOD_0_X86_64) },
4441 },
4442
4443 /* X86_64_0F18_REG_7_MOD_0 */
4444 {
4445 { "nopQ", { Ev }, 0 },
4446 { PREFIX_TABLE (PREFIX_0F18_REG_7_MOD_0_X86_64) },
4447 },
4448
4449 {
4450 /* X86_64_0F24 */
4451 { "movZ", { Em, Td }, 0 },
4452 },
4453
4454 {
4455 /* X86_64_0F26 */
4456 { "movZ", { Td, Em }, 0 },
4457 },
4458
4459 /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
4460 {
4461 { Bad_Opcode },
4462 { "senduipi", { Eq }, 0 },
4463 },
4464
4465 /* X86_64_VEX_0F3849 */
4466 {
4467 { Bad_Opcode },
4468 { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64) },
4469 },
4470
4471 /* X86_64_VEX_0F384B */
4472 {
4473 { Bad_Opcode },
4474 { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64) },
4475 },
4476
4477 /* X86_64_VEX_0F385C */
4478 {
4479 { Bad_Opcode },
4480 { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64) },
4481 },
4482
4483 /* X86_64_VEX_0F385E */
4484 {
4485 { Bad_Opcode },
4486 { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64) },
4487 },
4488
4489 /* X86_64_VEX_0F38E0 */
4490 {
4491 { Bad_Opcode },
4492 { "cmpoxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4493 },
4494
4495 /* X86_64_VEX_0F38E1 */
4496 {
4497 { Bad_Opcode },
4498 { "cmpnoxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4499 },
4500
4501 /* X86_64_VEX_0F38E2 */
4502 {
4503 { Bad_Opcode },
4504 { "cmpbxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4505 },
4506
4507 /* X86_64_VEX_0F38E3 */
4508 {
4509 { Bad_Opcode },
4510 { "cmpnbxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4511 },
4512
4513 /* X86_64_VEX_0F38E4 */
4514 {
4515 { Bad_Opcode },
4516 { "cmpzxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4517 },
4518
4519 /* X86_64_VEX_0F38E5 */
4520 {
4521 { Bad_Opcode },
4522 { "cmpnzxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4523 },
4524
4525 /* X86_64_VEX_0F38E6 */
4526 {
4527 { Bad_Opcode },
4528 { "cmpbexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4529 },
4530
4531 /* X86_64_VEX_0F38E7 */
4532 {
4533 { Bad_Opcode },
4534 { "cmpnbexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4535 },
4536
4537 /* X86_64_VEX_0F38E8 */
4538 {
4539 { Bad_Opcode },
4540 { "cmpsxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4541 },
4542
4543 /* X86_64_VEX_0F38E9 */
4544 {
4545 { Bad_Opcode },
4546 { "cmpnsxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4547 },
4548
4549 /* X86_64_VEX_0F38EA */
4550 {
4551 { Bad_Opcode },
4552 { "cmppxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4553 },
4554
4555 /* X86_64_VEX_0F38EB */
4556 {
4557 { Bad_Opcode },
4558 { "cmpnpxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4559 },
4560
4561 /* X86_64_VEX_0F38EC */
4562 {
4563 { Bad_Opcode },
4564 { "cmplxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4565 },
4566
4567 /* X86_64_VEX_0F38ED */
4568 {
4569 { Bad_Opcode },
4570 { "cmpnlxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4571 },
4572
4573 /* X86_64_VEX_0F38EE */
4574 {
4575 { Bad_Opcode },
4576 { "cmplexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4577 },
4578
4579 /* X86_64_VEX_0F38EF */
4580 {
4581 { Bad_Opcode },
4582 { "cmpnlexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA },
4583 },
4584 };
4585
4586 static const struct dis386 three_byte_table[][256] = {
4587
4588 /* THREE_BYTE_0F38 */
4589 {
4590 /* 00 */
4591 { "pshufb", { MX, EM }, PREFIX_OPCODE },
4592 { "phaddw", { MX, EM }, PREFIX_OPCODE },
4593 { "phaddd", { MX, EM }, PREFIX_OPCODE },
4594 { "phaddsw", { MX, EM }, PREFIX_OPCODE },
4595 { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
4596 { "phsubw", { MX, EM }, PREFIX_OPCODE },
4597 { "phsubd", { MX, EM }, PREFIX_OPCODE },
4598 { "phsubsw", { MX, EM }, PREFIX_OPCODE },
4599 /* 08 */
4600 { "psignb", { MX, EM }, PREFIX_OPCODE },
4601 { "psignw", { MX, EM }, PREFIX_OPCODE },
4602 { "psignd", { MX, EM }, PREFIX_OPCODE },
4603 { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
4604 { Bad_Opcode },
4605 { Bad_Opcode },
4606 { Bad_Opcode },
4607 { Bad_Opcode },
4608 /* 10 */
4609 { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
4610 { Bad_Opcode },
4611 { Bad_Opcode },
4612 { Bad_Opcode },
4613 { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
4614 { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
4615 { Bad_Opcode },
4616 { "ptest", { XM, EXx }, PREFIX_DATA },
4617 /* 18 */
4618 { Bad_Opcode },
4619 { Bad_Opcode },
4620 { Bad_Opcode },
4621 { Bad_Opcode },
4622 { "pabsb", { MX, EM }, PREFIX_OPCODE },
4623 { "pabsw", { MX, EM }, PREFIX_OPCODE },
4624 { "pabsd", { MX, EM }, PREFIX_OPCODE },
4625 { Bad_Opcode },
4626 /* 20 */
4627 { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
4628 { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
4629 { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
4630 { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
4631 { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
4632 { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
4633 { Bad_Opcode },
4634 { Bad_Opcode },
4635 /* 28 */
4636 { "pmuldq", { XM, EXx }, PREFIX_DATA },
4637 { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
4638 { MOD_TABLE (MOD_0F382A) },
4639 { "packusdw", { XM, EXx }, PREFIX_DATA },
4640 { Bad_Opcode },
4641 { Bad_Opcode },
4642 { Bad_Opcode },
4643 { Bad_Opcode },
4644 /* 30 */
4645 { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
4646 { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
4647 { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
4648 { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
4649 { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
4650 { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
4651 { Bad_Opcode },
4652 { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
4653 /* 38 */
4654 { "pminsb", { XM, EXx }, PREFIX_DATA },
4655 { "pminsd", { XM, EXx }, PREFIX_DATA },
4656 { "pminuw", { XM, EXx }, PREFIX_DATA },
4657 { "pminud", { XM, EXx }, PREFIX_DATA },
4658 { "pmaxsb", { XM, EXx }, PREFIX_DATA },
4659 { "pmaxsd", { XM, EXx }, PREFIX_DATA },
4660 { "pmaxuw", { XM, EXx }, PREFIX_DATA },
4661 { "pmaxud", { XM, EXx }, PREFIX_DATA },
4662 /* 40 */
4663 { "pmulld", { XM, EXx }, PREFIX_DATA },
4664 { "phminposuw", { XM, EXx }, PREFIX_DATA },
4665 { Bad_Opcode },
4666 { Bad_Opcode },
4667 { Bad_Opcode },
4668 { Bad_Opcode },
4669 { Bad_Opcode },
4670 { Bad_Opcode },
4671 /* 48 */
4672 { Bad_Opcode },
4673 { Bad_Opcode },
4674 { Bad_Opcode },
4675 { Bad_Opcode },
4676 { Bad_Opcode },
4677 { Bad_Opcode },
4678 { Bad_Opcode },
4679 { Bad_Opcode },
4680 /* 50 */
4681 { Bad_Opcode },
4682 { Bad_Opcode },
4683 { Bad_Opcode },
4684 { Bad_Opcode },
4685 { Bad_Opcode },
4686 { Bad_Opcode },
4687 { Bad_Opcode },
4688 { Bad_Opcode },
4689 /* 58 */
4690 { Bad_Opcode },
4691 { Bad_Opcode },
4692 { Bad_Opcode },
4693 { Bad_Opcode },
4694 { Bad_Opcode },
4695 { Bad_Opcode },
4696 { Bad_Opcode },
4697 { Bad_Opcode },
4698 /* 60 */
4699 { Bad_Opcode },
4700 { Bad_Opcode },
4701 { Bad_Opcode },
4702 { Bad_Opcode },
4703 { Bad_Opcode },
4704 { Bad_Opcode },
4705 { Bad_Opcode },
4706 { Bad_Opcode },
4707 /* 68 */
4708 { Bad_Opcode },
4709 { Bad_Opcode },
4710 { Bad_Opcode },
4711 { Bad_Opcode },
4712 { Bad_Opcode },
4713 { Bad_Opcode },
4714 { Bad_Opcode },
4715 { Bad_Opcode },
4716 /* 70 */
4717 { Bad_Opcode },
4718 { Bad_Opcode },
4719 { Bad_Opcode },
4720 { Bad_Opcode },
4721 { Bad_Opcode },
4722 { Bad_Opcode },
4723 { Bad_Opcode },
4724 { Bad_Opcode },
4725 /* 78 */
4726 { Bad_Opcode },
4727 { Bad_Opcode },
4728 { Bad_Opcode },
4729 { Bad_Opcode },
4730 { Bad_Opcode },
4731 { Bad_Opcode },
4732 { Bad_Opcode },
4733 { Bad_Opcode },
4734 /* 80 */
4735 { "invept", { Gm, Mo }, PREFIX_DATA },
4736 { "invvpid", { Gm, Mo }, PREFIX_DATA },
4737 { "invpcid", { Gm, M }, PREFIX_DATA },
4738 { Bad_Opcode },
4739 { Bad_Opcode },
4740 { Bad_Opcode },
4741 { Bad_Opcode },
4742 { Bad_Opcode },
4743 /* 88 */
4744 { Bad_Opcode },
4745 { Bad_Opcode },
4746 { Bad_Opcode },
4747 { Bad_Opcode },
4748 { Bad_Opcode },
4749 { Bad_Opcode },
4750 { Bad_Opcode },
4751 { Bad_Opcode },
4752 /* 90 */
4753 { Bad_Opcode },
4754 { Bad_Opcode },
4755 { Bad_Opcode },
4756 { Bad_Opcode },
4757 { Bad_Opcode },
4758 { Bad_Opcode },
4759 { Bad_Opcode },
4760 { Bad_Opcode },
4761 /* 98 */
4762 { Bad_Opcode },
4763 { Bad_Opcode },
4764 { Bad_Opcode },
4765 { Bad_Opcode },
4766 { Bad_Opcode },
4767 { Bad_Opcode },
4768 { Bad_Opcode },
4769 { Bad_Opcode },
4770 /* a0 */
4771 { Bad_Opcode },
4772 { Bad_Opcode },
4773 { Bad_Opcode },
4774 { Bad_Opcode },
4775 { Bad_Opcode },
4776 { Bad_Opcode },
4777 { Bad_Opcode },
4778 { Bad_Opcode },
4779 /* a8 */
4780 { Bad_Opcode },
4781 { Bad_Opcode },
4782 { Bad_Opcode },
4783 { Bad_Opcode },
4784 { Bad_Opcode },
4785 { Bad_Opcode },
4786 { Bad_Opcode },
4787 { Bad_Opcode },
4788 /* b0 */
4789 { Bad_Opcode },
4790 { Bad_Opcode },
4791 { Bad_Opcode },
4792 { Bad_Opcode },
4793 { Bad_Opcode },
4794 { Bad_Opcode },
4795 { Bad_Opcode },
4796 { Bad_Opcode },
4797 /* b8 */
4798 { Bad_Opcode },
4799 { Bad_Opcode },
4800 { Bad_Opcode },
4801 { Bad_Opcode },
4802 { Bad_Opcode },
4803 { Bad_Opcode },
4804 { Bad_Opcode },
4805 { Bad_Opcode },
4806 /* c0 */
4807 { Bad_Opcode },
4808 { Bad_Opcode },
4809 { Bad_Opcode },
4810 { Bad_Opcode },
4811 { Bad_Opcode },
4812 { Bad_Opcode },
4813 { Bad_Opcode },
4814 { Bad_Opcode },
4815 /* c8 */
4816 { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
4817 { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
4818 { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
4819 { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
4820 { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
4821 { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
4822 { Bad_Opcode },
4823 { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
4824 /* d0 */
4825 { Bad_Opcode },
4826 { Bad_Opcode },
4827 { Bad_Opcode },
4828 { Bad_Opcode },
4829 { Bad_Opcode },
4830 { Bad_Opcode },
4831 { Bad_Opcode },
4832 { Bad_Opcode },
4833 /* d8 */
4834 { PREFIX_TABLE (PREFIX_0F38D8) },
4835 { Bad_Opcode },
4836 { Bad_Opcode },
4837 { "aesimc", { XM, EXx }, PREFIX_DATA },
4838 { PREFIX_TABLE (PREFIX_0F38DC) },
4839 { PREFIX_TABLE (PREFIX_0F38DD) },
4840 { PREFIX_TABLE (PREFIX_0F38DE) },
4841 { PREFIX_TABLE (PREFIX_0F38DF) },
4842 /* e0 */
4843 { Bad_Opcode },
4844 { Bad_Opcode },
4845 { Bad_Opcode },
4846 { Bad_Opcode },
4847 { Bad_Opcode },
4848 { Bad_Opcode },
4849 { Bad_Opcode },
4850 { Bad_Opcode },
4851 /* e8 */
4852 { Bad_Opcode },
4853 { Bad_Opcode },
4854 { Bad_Opcode },
4855 { Bad_Opcode },
4856 { Bad_Opcode },
4857 { Bad_Opcode },
4858 { Bad_Opcode },
4859 { Bad_Opcode },
4860 /* f0 */
4861 { PREFIX_TABLE (PREFIX_0F38F0) },
4862 { PREFIX_TABLE (PREFIX_0F38F1) },
4863 { Bad_Opcode },
4864 { Bad_Opcode },
4865 { Bad_Opcode },
4866 { MOD_TABLE (MOD_0F38F5) },
4867 { PREFIX_TABLE (PREFIX_0F38F6) },
4868 { Bad_Opcode },
4869 /* f8 */
4870 { PREFIX_TABLE (PREFIX_0F38F8) },
4871 { MOD_TABLE (MOD_0F38F9) },
4872 { PREFIX_TABLE (PREFIX_0F38FA) },
4873 { PREFIX_TABLE (PREFIX_0F38FB) },
4874 { PREFIX_TABLE (PREFIX_0F38FC) },
4875 { Bad_Opcode },
4876 { Bad_Opcode },
4877 { Bad_Opcode },
4878 },
4879 /* THREE_BYTE_0F3A */
4880 {
4881 /* 00 */
4882 { Bad_Opcode },
4883 { Bad_Opcode },
4884 { Bad_Opcode },
4885 { Bad_Opcode },
4886 { Bad_Opcode },
4887 { Bad_Opcode },
4888 { Bad_Opcode },
4889 { Bad_Opcode },
4890 /* 08 */
4891 { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
4892 { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
4893 { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
4894 { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
4895 { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
4896 { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
4897 { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
4898 { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
4899 /* 10 */
4900 { Bad_Opcode },
4901 { Bad_Opcode },
4902 { Bad_Opcode },
4903 { Bad_Opcode },
4904 { "pextrb", { Edb, XM, Ib }, PREFIX_DATA },
4905 { "pextrw", { Edw, XM, Ib }, PREFIX_DATA },
4906 { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
4907 { "extractps", { Ed, XM, Ib }, PREFIX_DATA },
4908 /* 18 */
4909 { Bad_Opcode },
4910 { Bad_Opcode },
4911 { Bad_Opcode },
4912 { Bad_Opcode },
4913 { Bad_Opcode },
4914 { Bad_Opcode },
4915 { Bad_Opcode },
4916 { Bad_Opcode },
4917 /* 20 */
4918 { "pinsrb", { XM, Edb, Ib }, PREFIX_DATA },
4919 { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
4920 { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
4921 { Bad_Opcode },
4922 { Bad_Opcode },
4923 { Bad_Opcode },
4924 { Bad_Opcode },
4925 { Bad_Opcode },
4926 /* 28 */
4927 { Bad_Opcode },
4928 { Bad_Opcode },
4929 { Bad_Opcode },
4930 { Bad_Opcode },
4931 { Bad_Opcode },
4932 { Bad_Opcode },
4933 { Bad_Opcode },
4934 { Bad_Opcode },
4935 /* 30 */
4936 { Bad_Opcode },
4937 { Bad_Opcode },
4938 { Bad_Opcode },
4939 { Bad_Opcode },
4940 { Bad_Opcode },
4941 { Bad_Opcode },
4942 { Bad_Opcode },
4943 { Bad_Opcode },
4944 /* 38 */
4945 { Bad_Opcode },
4946 { Bad_Opcode },
4947 { Bad_Opcode },
4948 { Bad_Opcode },
4949 { Bad_Opcode },
4950 { Bad_Opcode },
4951 { Bad_Opcode },
4952 { Bad_Opcode },
4953 /* 40 */
4954 { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
4955 { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
4956 { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
4957 { Bad_Opcode },
4958 { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
4959 { Bad_Opcode },
4960 { Bad_Opcode },
4961 { Bad_Opcode },
4962 /* 48 */
4963 { Bad_Opcode },
4964 { Bad_Opcode },
4965 { Bad_Opcode },
4966 { Bad_Opcode },
4967 { Bad_Opcode },
4968 { Bad_Opcode },
4969 { Bad_Opcode },
4970 { Bad_Opcode },
4971 /* 50 */
4972 { Bad_Opcode },
4973 { Bad_Opcode },
4974 { Bad_Opcode },
4975 { Bad_Opcode },
4976 { Bad_Opcode },
4977 { Bad_Opcode },
4978 { Bad_Opcode },
4979 { Bad_Opcode },
4980 /* 58 */
4981 { Bad_Opcode },
4982 { Bad_Opcode },
4983 { Bad_Opcode },
4984 { Bad_Opcode },
4985 { Bad_Opcode },
4986 { Bad_Opcode },
4987 { Bad_Opcode },
4988 { Bad_Opcode },
4989 /* 60 */
4990 { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4991 { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
4992 { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
4993 { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
4994 { Bad_Opcode },
4995 { Bad_Opcode },
4996 { Bad_Opcode },
4997 { Bad_Opcode },
4998 /* 68 */
4999 { Bad_Opcode },
5000 { Bad_Opcode },
5001 { Bad_Opcode },
5002 { Bad_Opcode },
5003 { Bad_Opcode },
5004 { Bad_Opcode },
5005 { Bad_Opcode },
5006 { Bad_Opcode },
5007 /* 70 */
5008 { Bad_Opcode },
5009 { Bad_Opcode },
5010 { Bad_Opcode },
5011 { Bad_Opcode },
5012 { Bad_Opcode },
5013 { Bad_Opcode },
5014 { Bad_Opcode },
5015 { Bad_Opcode },
5016 /* 78 */
5017 { Bad_Opcode },
5018 { Bad_Opcode },
5019 { Bad_Opcode },
5020 { Bad_Opcode },
5021 { Bad_Opcode },
5022 { Bad_Opcode },
5023 { Bad_Opcode },
5024 { Bad_Opcode },
5025 /* 80 */
5026 { Bad_Opcode },
5027 { Bad_Opcode },
5028 { Bad_Opcode },
5029 { Bad_Opcode },
5030 { Bad_Opcode },
5031 { Bad_Opcode },
5032 { Bad_Opcode },
5033 { Bad_Opcode },
5034 /* 88 */
5035 { Bad_Opcode },
5036 { Bad_Opcode },
5037 { Bad_Opcode },
5038 { Bad_Opcode },
5039 { Bad_Opcode },
5040 { Bad_Opcode },
5041 { Bad_Opcode },
5042 { Bad_Opcode },
5043 /* 90 */
5044 { Bad_Opcode },
5045 { Bad_Opcode },
5046 { Bad_Opcode },
5047 { Bad_Opcode },
5048 { Bad_Opcode },
5049 { Bad_Opcode },
5050 { Bad_Opcode },
5051 { Bad_Opcode },
5052 /* 98 */
5053 { Bad_Opcode },
5054 { Bad_Opcode },
5055 { Bad_Opcode },
5056 { Bad_Opcode },
5057 { Bad_Opcode },
5058 { Bad_Opcode },
5059 { Bad_Opcode },
5060 { Bad_Opcode },
5061 /* a0 */
5062 { Bad_Opcode },
5063 { Bad_Opcode },
5064 { Bad_Opcode },
5065 { Bad_Opcode },
5066 { Bad_Opcode },
5067 { Bad_Opcode },
5068 { Bad_Opcode },
5069 { Bad_Opcode },
5070 /* a8 */
5071 { Bad_Opcode },
5072 { Bad_Opcode },
5073 { Bad_Opcode },
5074 { Bad_Opcode },
5075 { Bad_Opcode },
5076 { Bad_Opcode },
5077 { Bad_Opcode },
5078 { Bad_Opcode },
5079 /* b0 */
5080 { Bad_Opcode },
5081 { Bad_Opcode },
5082 { Bad_Opcode },
5083 { Bad_Opcode },
5084 { Bad_Opcode },
5085 { Bad_Opcode },
5086 { Bad_Opcode },
5087 { Bad_Opcode },
5088 /* b8 */
5089 { Bad_Opcode },
5090 { Bad_Opcode },
5091 { Bad_Opcode },
5092 { Bad_Opcode },
5093 { Bad_Opcode },
5094 { Bad_Opcode },
5095 { Bad_Opcode },
5096 { Bad_Opcode },
5097 /* c0 */
5098 { Bad_Opcode },
5099 { Bad_Opcode },
5100 { Bad_Opcode },
5101 { Bad_Opcode },
5102 { Bad_Opcode },
5103 { Bad_Opcode },
5104 { Bad_Opcode },
5105 { Bad_Opcode },
5106 /* c8 */
5107 { Bad_Opcode },
5108 { Bad_Opcode },
5109 { Bad_Opcode },
5110 { Bad_Opcode },
5111 { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
5112 { Bad_Opcode },
5113 { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5114 { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
5115 /* d0 */
5116 { Bad_Opcode },
5117 { Bad_Opcode },
5118 { Bad_Opcode },
5119 { Bad_Opcode },
5120 { Bad_Opcode },
5121 { Bad_Opcode },
5122 { Bad_Opcode },
5123 { Bad_Opcode },
5124 /* d8 */
5125 { Bad_Opcode },
5126 { Bad_Opcode },
5127 { Bad_Opcode },
5128 { Bad_Opcode },
5129 { Bad_Opcode },
5130 { Bad_Opcode },
5131 { Bad_Opcode },
5132 { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
5133 /* e0 */
5134 { Bad_Opcode },
5135 { Bad_Opcode },
5136 { Bad_Opcode },
5137 { Bad_Opcode },
5138 { Bad_Opcode },
5139 { Bad_Opcode },
5140 { Bad_Opcode },
5141 { Bad_Opcode },
5142 /* e8 */
5143 { Bad_Opcode },
5144 { Bad_Opcode },
5145 { Bad_Opcode },
5146 { Bad_Opcode },
5147 { Bad_Opcode },
5148 { Bad_Opcode },
5149 { Bad_Opcode },
5150 { Bad_Opcode },
5151 /* f0 */
5152 { PREFIX_TABLE (PREFIX_0F3A0F) },
5153 { Bad_Opcode },
5154 { Bad_Opcode },
5155 { Bad_Opcode },
5156 { Bad_Opcode },
5157 { Bad_Opcode },
5158 { Bad_Opcode },
5159 { Bad_Opcode },
5160 /* f8 */
5161 { Bad_Opcode },
5162 { Bad_Opcode },
5163 { Bad_Opcode },
5164 { Bad_Opcode },
5165 { Bad_Opcode },
5166 { Bad_Opcode },
5167 { Bad_Opcode },
5168 { Bad_Opcode },
5169 },
5170 };
5171
5172 static const struct dis386 xop_table[][256] = {
5173 /* XOP_08 */
5174 {
5175 /* 00 */
5176 { Bad_Opcode },
5177 { Bad_Opcode },
5178 { Bad_Opcode },
5179 { Bad_Opcode },
5180 { Bad_Opcode },
5181 { Bad_Opcode },
5182 { Bad_Opcode },
5183 { Bad_Opcode },
5184 /* 08 */
5185 { Bad_Opcode },
5186 { Bad_Opcode },
5187 { Bad_Opcode },
5188 { Bad_Opcode },
5189 { Bad_Opcode },
5190 { Bad_Opcode },
5191 { Bad_Opcode },
5192 { Bad_Opcode },
5193 /* 10 */
5194 { Bad_Opcode },
5195 { Bad_Opcode },
5196 { Bad_Opcode },
5197 { Bad_Opcode },
5198 { Bad_Opcode },
5199 { Bad_Opcode },
5200 { Bad_Opcode },
5201 { Bad_Opcode },
5202 /* 18 */
5203 { Bad_Opcode },
5204 { Bad_Opcode },
5205 { Bad_Opcode },
5206 { Bad_Opcode },
5207 { Bad_Opcode },
5208 { Bad_Opcode },
5209 { Bad_Opcode },
5210 { Bad_Opcode },
5211 /* 20 */
5212 { Bad_Opcode },
5213 { Bad_Opcode },
5214 { Bad_Opcode },
5215 { Bad_Opcode },
5216 { Bad_Opcode },
5217 { Bad_Opcode },
5218 { Bad_Opcode },
5219 { Bad_Opcode },
5220 /* 28 */
5221 { Bad_Opcode },
5222 { Bad_Opcode },
5223 { Bad_Opcode },
5224 { Bad_Opcode },
5225 { Bad_Opcode },
5226 { Bad_Opcode },
5227 { Bad_Opcode },
5228 { Bad_Opcode },
5229 /* 30 */
5230 { Bad_Opcode },
5231 { Bad_Opcode },
5232 { Bad_Opcode },
5233 { Bad_Opcode },
5234 { Bad_Opcode },
5235 { Bad_Opcode },
5236 { Bad_Opcode },
5237 { Bad_Opcode },
5238 /* 38 */
5239 { Bad_Opcode },
5240 { Bad_Opcode },
5241 { Bad_Opcode },
5242 { Bad_Opcode },
5243 { Bad_Opcode },
5244 { Bad_Opcode },
5245 { Bad_Opcode },
5246 { Bad_Opcode },
5247 /* 40 */
5248 { Bad_Opcode },
5249 { Bad_Opcode },
5250 { Bad_Opcode },
5251 { Bad_Opcode },
5252 { Bad_Opcode },
5253 { Bad_Opcode },
5254 { Bad_Opcode },
5255 { Bad_Opcode },
5256 /* 48 */
5257 { Bad_Opcode },
5258 { Bad_Opcode },
5259 { Bad_Opcode },
5260 { Bad_Opcode },
5261 { Bad_Opcode },
5262 { Bad_Opcode },
5263 { Bad_Opcode },
5264 { Bad_Opcode },
5265 /* 50 */
5266 { Bad_Opcode },
5267 { Bad_Opcode },
5268 { Bad_Opcode },
5269 { Bad_Opcode },
5270 { Bad_Opcode },
5271 { Bad_Opcode },
5272 { Bad_Opcode },
5273 { Bad_Opcode },
5274 /* 58 */
5275 { Bad_Opcode },
5276 { Bad_Opcode },
5277 { Bad_Opcode },
5278 { Bad_Opcode },
5279 { Bad_Opcode },
5280 { Bad_Opcode },
5281 { Bad_Opcode },
5282 { Bad_Opcode },
5283 /* 60 */
5284 { Bad_Opcode },
5285 { Bad_Opcode },
5286 { Bad_Opcode },
5287 { Bad_Opcode },
5288 { Bad_Opcode },
5289 { Bad_Opcode },
5290 { Bad_Opcode },
5291 { Bad_Opcode },
5292 /* 68 */
5293 { Bad_Opcode },
5294 { Bad_Opcode },
5295 { Bad_Opcode },
5296 { Bad_Opcode },
5297 { Bad_Opcode },
5298 { Bad_Opcode },
5299 { Bad_Opcode },
5300 { Bad_Opcode },
5301 /* 70 */
5302 { Bad_Opcode },
5303 { Bad_Opcode },
5304 { Bad_Opcode },
5305 { Bad_Opcode },
5306 { Bad_Opcode },
5307 { Bad_Opcode },
5308 { Bad_Opcode },
5309 { Bad_Opcode },
5310 /* 78 */
5311 { Bad_Opcode },
5312 { Bad_Opcode },
5313 { Bad_Opcode },
5314 { Bad_Opcode },
5315 { Bad_Opcode },
5316 { Bad_Opcode },
5317 { Bad_Opcode },
5318 { Bad_Opcode },
5319 /* 80 */
5320 { Bad_Opcode },
5321 { Bad_Opcode },
5322 { Bad_Opcode },
5323 { Bad_Opcode },
5324 { Bad_Opcode },
5325 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85) },
5326 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86) },
5327 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87) },
5328 /* 88 */
5329 { Bad_Opcode },
5330 { Bad_Opcode },
5331 { Bad_Opcode },
5332 { Bad_Opcode },
5333 { Bad_Opcode },
5334 { Bad_Opcode },
5335 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E) },
5336 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F) },
5337 /* 90 */
5338 { Bad_Opcode },
5339 { Bad_Opcode },
5340 { Bad_Opcode },
5341 { Bad_Opcode },
5342 { Bad_Opcode },
5343 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95) },
5344 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96) },
5345 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97) },
5346 /* 98 */
5347 { Bad_Opcode },
5348 { Bad_Opcode },
5349 { Bad_Opcode },
5350 { Bad_Opcode },
5351 { Bad_Opcode },
5352 { Bad_Opcode },
5353 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E) },
5354 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F) },
5355 /* a0 */
5356 { Bad_Opcode },
5357 { Bad_Opcode },
5358 { "vpcmov", { XM, Vex, EXx, XMVexI4 }, 0 },
5359 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3) },
5360 { Bad_Opcode },
5361 { Bad_Opcode },
5362 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6) },
5363 { Bad_Opcode },
5364 /* a8 */
5365 { Bad_Opcode },
5366 { Bad_Opcode },
5367 { Bad_Opcode },
5368 { Bad_Opcode },
5369 { Bad_Opcode },
5370 { Bad_Opcode },
5371 { Bad_Opcode },
5372 { Bad_Opcode },
5373 /* b0 */
5374 { Bad_Opcode },
5375 { Bad_Opcode },
5376 { Bad_Opcode },
5377 { Bad_Opcode },
5378 { Bad_Opcode },
5379 { Bad_Opcode },
5380 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6) },
5381 { Bad_Opcode },
5382 /* b8 */
5383 { Bad_Opcode },
5384 { Bad_Opcode },
5385 { Bad_Opcode },
5386 { Bad_Opcode },
5387 { Bad_Opcode },
5388 { Bad_Opcode },
5389 { Bad_Opcode },
5390 { Bad_Opcode },
5391 /* c0 */
5392 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0) },
5393 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1) },
5394 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2) },
5395 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3) },
5396 { Bad_Opcode },
5397 { Bad_Opcode },
5398 { Bad_Opcode },
5399 { Bad_Opcode },
5400 /* c8 */
5401 { Bad_Opcode },
5402 { Bad_Opcode },
5403 { Bad_Opcode },
5404 { Bad_Opcode },
5405 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
5406 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
5407 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
5408 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
5409 /* d0 */
5410 { Bad_Opcode },
5411 { Bad_Opcode },
5412 { Bad_Opcode },
5413 { Bad_Opcode },
5414 { Bad_Opcode },
5415 { Bad_Opcode },
5416 { Bad_Opcode },
5417 { Bad_Opcode },
5418 /* d8 */
5419 { Bad_Opcode },
5420 { Bad_Opcode },
5421 { Bad_Opcode },
5422 { Bad_Opcode },
5423 { Bad_Opcode },
5424 { Bad_Opcode },
5425 { Bad_Opcode },
5426 { Bad_Opcode },
5427 /* e0 */
5428 { Bad_Opcode },
5429 { Bad_Opcode },
5430 { Bad_Opcode },
5431 { Bad_Opcode },
5432 { Bad_Opcode },
5433 { Bad_Opcode },
5434 { Bad_Opcode },
5435 { Bad_Opcode },
5436 /* e8 */
5437 { Bad_Opcode },
5438 { Bad_Opcode },
5439 { Bad_Opcode },
5440 { Bad_Opcode },
5441 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
5442 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
5443 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
5444 { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
5445 /* f0 */
5446 { Bad_Opcode },
5447 { Bad_Opcode },
5448 { Bad_Opcode },
5449 { Bad_Opcode },
5450 { Bad_Opcode },
5451 { Bad_Opcode },
5452 { Bad_Opcode },
5453 { Bad_Opcode },
5454 /* f8 */
5455 { Bad_Opcode },
5456 { Bad_Opcode },
5457 { Bad_Opcode },
5458 { Bad_Opcode },
5459 { Bad_Opcode },
5460 { Bad_Opcode },
5461 { Bad_Opcode },
5462 { Bad_Opcode },
5463 },
5464 /* XOP_09 */
5465 {
5466 /* 00 */
5467 { Bad_Opcode },
5468 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01) },
5469 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02) },
5470 { Bad_Opcode },
5471 { Bad_Opcode },
5472 { Bad_Opcode },
5473 { Bad_Opcode },
5474 { Bad_Opcode },
5475 /* 08 */
5476 { Bad_Opcode },
5477 { Bad_Opcode },
5478 { Bad_Opcode },
5479 { Bad_Opcode },
5480 { Bad_Opcode },
5481 { Bad_Opcode },
5482 { Bad_Opcode },
5483 { Bad_Opcode },
5484 /* 10 */
5485 { Bad_Opcode },
5486 { Bad_Opcode },
5487 { MOD_TABLE (MOD_XOP_09_12) },
5488 { Bad_Opcode },
5489 { Bad_Opcode },
5490 { Bad_Opcode },
5491 { Bad_Opcode },
5492 { Bad_Opcode },
5493 /* 18 */
5494 { Bad_Opcode },
5495 { Bad_Opcode },
5496 { Bad_Opcode },
5497 { Bad_Opcode },
5498 { Bad_Opcode },
5499 { Bad_Opcode },
5500 { Bad_Opcode },
5501 { Bad_Opcode },
5502 /* 20 */
5503 { Bad_Opcode },
5504 { Bad_Opcode },
5505 { Bad_Opcode },
5506 { Bad_Opcode },
5507 { Bad_Opcode },
5508 { Bad_Opcode },
5509 { Bad_Opcode },
5510 { Bad_Opcode },
5511 /* 28 */
5512 { Bad_Opcode },
5513 { Bad_Opcode },
5514 { Bad_Opcode },
5515 { Bad_Opcode },
5516 { Bad_Opcode },
5517 { Bad_Opcode },
5518 { Bad_Opcode },
5519 { Bad_Opcode },
5520 /* 30 */
5521 { Bad_Opcode },
5522 { Bad_Opcode },
5523 { Bad_Opcode },
5524 { Bad_Opcode },
5525 { Bad_Opcode },
5526 { Bad_Opcode },
5527 { Bad_Opcode },
5528 { Bad_Opcode },
5529 /* 38 */
5530 { Bad_Opcode },
5531 { Bad_Opcode },
5532 { Bad_Opcode },
5533 { Bad_Opcode },
5534 { Bad_Opcode },
5535 { Bad_Opcode },
5536 { Bad_Opcode },
5537 { Bad_Opcode },
5538 /* 40 */
5539 { Bad_Opcode },
5540 { Bad_Opcode },
5541 { Bad_Opcode },
5542 { Bad_Opcode },
5543 { Bad_Opcode },
5544 { Bad_Opcode },
5545 { Bad_Opcode },
5546 { Bad_Opcode },
5547 /* 48 */
5548 { Bad_Opcode },
5549 { Bad_Opcode },
5550 { Bad_Opcode },
5551 { Bad_Opcode },
5552 { Bad_Opcode },
5553 { Bad_Opcode },
5554 { Bad_Opcode },
5555 { Bad_Opcode },
5556 /* 50 */
5557 { Bad_Opcode },
5558 { Bad_Opcode },
5559 { Bad_Opcode },
5560 { Bad_Opcode },
5561 { Bad_Opcode },
5562 { Bad_Opcode },
5563 { Bad_Opcode },
5564 { Bad_Opcode },
5565 /* 58 */
5566 { Bad_Opcode },
5567 { Bad_Opcode },
5568 { Bad_Opcode },
5569 { Bad_Opcode },
5570 { Bad_Opcode },
5571 { Bad_Opcode },
5572 { Bad_Opcode },
5573 { Bad_Opcode },
5574 /* 60 */
5575 { Bad_Opcode },
5576 { Bad_Opcode },
5577 { Bad_Opcode },
5578 { Bad_Opcode },
5579 { Bad_Opcode },
5580 { Bad_Opcode },
5581 { Bad_Opcode },
5582 { Bad_Opcode },
5583 /* 68 */
5584 { Bad_Opcode },
5585 { Bad_Opcode },
5586 { Bad_Opcode },
5587 { Bad_Opcode },
5588 { Bad_Opcode },
5589 { Bad_Opcode },
5590 { Bad_Opcode },
5591 { Bad_Opcode },
5592 /* 70 */
5593 { Bad_Opcode },
5594 { Bad_Opcode },
5595 { Bad_Opcode },
5596 { Bad_Opcode },
5597 { Bad_Opcode },
5598 { Bad_Opcode },
5599 { Bad_Opcode },
5600 { Bad_Opcode },
5601 /* 78 */
5602 { Bad_Opcode },
5603 { Bad_Opcode },
5604 { Bad_Opcode },
5605 { Bad_Opcode },
5606 { Bad_Opcode },
5607 { Bad_Opcode },
5608 { Bad_Opcode },
5609 { Bad_Opcode },
5610 /* 80 */
5611 { VEX_W_TABLE (VEX_W_0FXOP_09_80) },
5612 { VEX_W_TABLE (VEX_W_0FXOP_09_81) },
5613 { VEX_W_TABLE (VEX_W_0FXOP_09_82) },
5614 { VEX_W_TABLE (VEX_W_0FXOP_09_83) },
5615 { Bad_Opcode },
5616 { Bad_Opcode },
5617 { Bad_Opcode },
5618 { Bad_Opcode },
5619 /* 88 */
5620 { Bad_Opcode },
5621 { Bad_Opcode },
5622 { Bad_Opcode },
5623 { Bad_Opcode },
5624 { Bad_Opcode },
5625 { Bad_Opcode },
5626 { Bad_Opcode },
5627 { Bad_Opcode },
5628 /* 90 */
5629 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90) },
5630 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91) },
5631 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92) },
5632 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93) },
5633 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94) },
5634 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95) },
5635 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96) },
5636 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97) },
5637 /* 98 */
5638 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98) },
5639 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99) },
5640 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A) },
5641 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B) },
5642 { Bad_Opcode },
5643 { Bad_Opcode },
5644 { Bad_Opcode },
5645 { Bad_Opcode },
5646 /* a0 */
5647 { Bad_Opcode },
5648 { Bad_Opcode },
5649 { Bad_Opcode },
5650 { Bad_Opcode },
5651 { Bad_Opcode },
5652 { Bad_Opcode },
5653 { Bad_Opcode },
5654 { Bad_Opcode },
5655 /* a8 */
5656 { Bad_Opcode },
5657 { Bad_Opcode },
5658 { Bad_Opcode },
5659 { Bad_Opcode },
5660 { Bad_Opcode },
5661 { Bad_Opcode },
5662 { Bad_Opcode },
5663 { Bad_Opcode },
5664 /* b0 */
5665 { Bad_Opcode },
5666 { Bad_Opcode },
5667 { Bad_Opcode },
5668 { Bad_Opcode },
5669 { Bad_Opcode },
5670 { Bad_Opcode },
5671 { Bad_Opcode },
5672 { Bad_Opcode },
5673 /* b8 */
5674 { Bad_Opcode },
5675 { Bad_Opcode },
5676 { Bad_Opcode },
5677 { Bad_Opcode },
5678 { Bad_Opcode },
5679 { Bad_Opcode },
5680 { Bad_Opcode },
5681 { Bad_Opcode },
5682 /* c0 */
5683 { Bad_Opcode },
5684 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1) },
5685 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2) },
5686 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3) },
5687 { Bad_Opcode },
5688 { Bad_Opcode },
5689 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6) },
5690 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7) },
5691 /* c8 */
5692 { Bad_Opcode },
5693 { Bad_Opcode },
5694 { Bad_Opcode },
5695 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB) },
5696 { Bad_Opcode },
5697 { Bad_Opcode },
5698 { Bad_Opcode },
5699 { Bad_Opcode },
5700 /* d0 */
5701 { Bad_Opcode },
5702 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1) },
5703 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2) },
5704 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3) },
5705 { Bad_Opcode },
5706 { Bad_Opcode },
5707 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6) },
5708 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7) },
5709 /* d8 */
5710 { Bad_Opcode },
5711 { Bad_Opcode },
5712 { Bad_Opcode },
5713 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB) },
5714 { Bad_Opcode },
5715 { Bad_Opcode },
5716 { Bad_Opcode },
5717 { Bad_Opcode },
5718 /* e0 */
5719 { Bad_Opcode },
5720 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1) },
5721 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2) },
5722 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3) },
5723 { Bad_Opcode },
5724 { Bad_Opcode },
5725 { Bad_Opcode },
5726 { Bad_Opcode },
5727 /* e8 */
5728 { Bad_Opcode },
5729 { Bad_Opcode },
5730 { Bad_Opcode },
5731 { Bad_Opcode },
5732 { Bad_Opcode },
5733 { Bad_Opcode },
5734 { Bad_Opcode },
5735 { Bad_Opcode },
5736 /* f0 */
5737 { Bad_Opcode },
5738 { Bad_Opcode },
5739 { Bad_Opcode },
5740 { Bad_Opcode },
5741 { Bad_Opcode },
5742 { Bad_Opcode },
5743 { Bad_Opcode },
5744 { Bad_Opcode },
5745 /* f8 */
5746 { Bad_Opcode },
5747 { Bad_Opcode },
5748 { Bad_Opcode },
5749 { Bad_Opcode },
5750 { Bad_Opcode },
5751 { Bad_Opcode },
5752 { Bad_Opcode },
5753 { Bad_Opcode },
5754 },
5755 /* XOP_0A */
5756 {
5757 /* 00 */
5758 { Bad_Opcode },
5759 { Bad_Opcode },
5760 { Bad_Opcode },
5761 { Bad_Opcode },
5762 { Bad_Opcode },
5763 { Bad_Opcode },
5764 { Bad_Opcode },
5765 { Bad_Opcode },
5766 /* 08 */
5767 { Bad_Opcode },
5768 { Bad_Opcode },
5769 { Bad_Opcode },
5770 { Bad_Opcode },
5771 { Bad_Opcode },
5772 { Bad_Opcode },
5773 { Bad_Opcode },
5774 { Bad_Opcode },
5775 /* 10 */
5776 { "bextrS", { Gdq, Edq, Id }, 0 },
5777 { Bad_Opcode },
5778 { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12) },
5779 { Bad_Opcode },
5780 { Bad_Opcode },
5781 { Bad_Opcode },
5782 { Bad_Opcode },
5783 { Bad_Opcode },
5784 /* 18 */
5785 { Bad_Opcode },
5786 { Bad_Opcode },
5787 { Bad_Opcode },
5788 { Bad_Opcode },
5789 { Bad_Opcode },
5790 { Bad_Opcode },
5791 { Bad_Opcode },
5792 { Bad_Opcode },
5793 /* 20 */
5794 { Bad_Opcode },
5795 { Bad_Opcode },
5796 { Bad_Opcode },
5797 { Bad_Opcode },
5798 { Bad_Opcode },
5799 { Bad_Opcode },
5800 { Bad_Opcode },
5801 { Bad_Opcode },
5802 /* 28 */
5803 { Bad_Opcode },
5804 { Bad_Opcode },
5805 { Bad_Opcode },
5806 { Bad_Opcode },
5807 { Bad_Opcode },
5808 { Bad_Opcode },
5809 { Bad_Opcode },
5810 { Bad_Opcode },
5811 /* 30 */
5812 { Bad_Opcode },
5813 { Bad_Opcode },
5814 { Bad_Opcode },
5815 { Bad_Opcode },
5816 { Bad_Opcode },
5817 { Bad_Opcode },
5818 { Bad_Opcode },
5819 { Bad_Opcode },
5820 /* 38 */
5821 { Bad_Opcode },
5822 { Bad_Opcode },
5823 { Bad_Opcode },
5824 { Bad_Opcode },
5825 { Bad_Opcode },
5826 { Bad_Opcode },
5827 { Bad_Opcode },
5828 { Bad_Opcode },
5829 /* 40 */
5830 { Bad_Opcode },
5831 { Bad_Opcode },
5832 { Bad_Opcode },
5833 { Bad_Opcode },
5834 { Bad_Opcode },
5835 { Bad_Opcode },
5836 { Bad_Opcode },
5837 { Bad_Opcode },
5838 /* 48 */
5839 { Bad_Opcode },
5840 { Bad_Opcode },
5841 { Bad_Opcode },
5842 { Bad_Opcode },
5843 { Bad_Opcode },
5844 { Bad_Opcode },
5845 { Bad_Opcode },
5846 { Bad_Opcode },
5847 /* 50 */
5848 { Bad_Opcode },
5849 { Bad_Opcode },
5850 { Bad_Opcode },
5851 { Bad_Opcode },
5852 { Bad_Opcode },
5853 { Bad_Opcode },
5854 { Bad_Opcode },
5855 { Bad_Opcode },
5856 /* 58 */
5857 { Bad_Opcode },
5858 { Bad_Opcode },
5859 { Bad_Opcode },
5860 { Bad_Opcode },
5861 { Bad_Opcode },
5862 { Bad_Opcode },
5863 { Bad_Opcode },
5864 { Bad_Opcode },
5865 /* 60 */
5866 { Bad_Opcode },
5867 { Bad_Opcode },
5868 { Bad_Opcode },
5869 { Bad_Opcode },
5870 { Bad_Opcode },
5871 { Bad_Opcode },
5872 { Bad_Opcode },
5873 { Bad_Opcode },
5874 /* 68 */
5875 { Bad_Opcode },
5876 { Bad_Opcode },
5877 { Bad_Opcode },
5878 { Bad_Opcode },
5879 { Bad_Opcode },
5880 { Bad_Opcode },
5881 { Bad_Opcode },
5882 { Bad_Opcode },
5883 /* 70 */
5884 { Bad_Opcode },
5885 { Bad_Opcode },
5886 { Bad_Opcode },
5887 { Bad_Opcode },
5888 { Bad_Opcode },
5889 { Bad_Opcode },
5890 { Bad_Opcode },
5891 { Bad_Opcode },
5892 /* 78 */
5893 { Bad_Opcode },
5894 { Bad_Opcode },
5895 { Bad_Opcode },
5896 { Bad_Opcode },
5897 { Bad_Opcode },
5898 { Bad_Opcode },
5899 { Bad_Opcode },
5900 { Bad_Opcode },
5901 /* 80 */
5902 { Bad_Opcode },
5903 { Bad_Opcode },
5904 { Bad_Opcode },
5905 { Bad_Opcode },
5906 { Bad_Opcode },
5907 { Bad_Opcode },
5908 { Bad_Opcode },
5909 { Bad_Opcode },
5910 /* 88 */
5911 { Bad_Opcode },
5912 { Bad_Opcode },
5913 { Bad_Opcode },
5914 { Bad_Opcode },
5915 { Bad_Opcode },
5916 { Bad_Opcode },
5917 { Bad_Opcode },
5918 { Bad_Opcode },
5919 /* 90 */
5920 { Bad_Opcode },
5921 { Bad_Opcode },
5922 { Bad_Opcode },
5923 { Bad_Opcode },
5924 { Bad_Opcode },
5925 { Bad_Opcode },
5926 { Bad_Opcode },
5927 { Bad_Opcode },
5928 /* 98 */
5929 { Bad_Opcode },
5930 { Bad_Opcode },
5931 { Bad_Opcode },
5932 { Bad_Opcode },
5933 { Bad_Opcode },
5934 { Bad_Opcode },
5935 { Bad_Opcode },
5936 { Bad_Opcode },
5937 /* a0 */
5938 { Bad_Opcode },
5939 { Bad_Opcode },
5940 { Bad_Opcode },
5941 { Bad_Opcode },
5942 { Bad_Opcode },
5943 { Bad_Opcode },
5944 { Bad_Opcode },
5945 { Bad_Opcode },
5946 /* a8 */
5947 { Bad_Opcode },
5948 { Bad_Opcode },
5949 { Bad_Opcode },
5950 { Bad_Opcode },
5951 { Bad_Opcode },
5952 { Bad_Opcode },
5953 { Bad_Opcode },
5954 { Bad_Opcode },
5955 /* b0 */
5956 { Bad_Opcode },
5957 { Bad_Opcode },
5958 { Bad_Opcode },
5959 { Bad_Opcode },
5960 { Bad_Opcode },
5961 { Bad_Opcode },
5962 { Bad_Opcode },
5963 { Bad_Opcode },
5964 /* b8 */
5965 { Bad_Opcode },
5966 { Bad_Opcode },
5967 { Bad_Opcode },
5968 { Bad_Opcode },
5969 { Bad_Opcode },
5970 { Bad_Opcode },
5971 { Bad_Opcode },
5972 { Bad_Opcode },
5973 /* c0 */
5974 { Bad_Opcode },
5975 { Bad_Opcode },
5976 { Bad_Opcode },
5977 { Bad_Opcode },
5978 { Bad_Opcode },
5979 { Bad_Opcode },
5980 { Bad_Opcode },
5981 { Bad_Opcode },
5982 /* c8 */
5983 { Bad_Opcode },
5984 { Bad_Opcode },
5985 { Bad_Opcode },
5986 { Bad_Opcode },
5987 { Bad_Opcode },
5988 { Bad_Opcode },
5989 { Bad_Opcode },
5990 { Bad_Opcode },
5991 /* d0 */
5992 { Bad_Opcode },
5993 { Bad_Opcode },
5994 { Bad_Opcode },
5995 { Bad_Opcode },
5996 { Bad_Opcode },
5997 { Bad_Opcode },
5998 { Bad_Opcode },
5999 { Bad_Opcode },
6000 /* d8 */
6001 { Bad_Opcode },
6002 { Bad_Opcode },
6003 { Bad_Opcode },
6004 { Bad_Opcode },
6005 { Bad_Opcode },
6006 { Bad_Opcode },
6007 { Bad_Opcode },
6008 { Bad_Opcode },
6009 /* e0 */
6010 { Bad_Opcode },
6011 { Bad_Opcode },
6012 { Bad_Opcode },
6013 { Bad_Opcode },
6014 { Bad_Opcode },
6015 { Bad_Opcode },
6016 { Bad_Opcode },
6017 { Bad_Opcode },
6018 /* e8 */
6019 { Bad_Opcode },
6020 { Bad_Opcode },
6021 { Bad_Opcode },
6022 { Bad_Opcode },
6023 { Bad_Opcode },
6024 { Bad_Opcode },
6025 { Bad_Opcode },
6026 { Bad_Opcode },
6027 /* f0 */
6028 { Bad_Opcode },
6029 { Bad_Opcode },
6030 { Bad_Opcode },
6031 { Bad_Opcode },
6032 { Bad_Opcode },
6033 { Bad_Opcode },
6034 { Bad_Opcode },
6035 { Bad_Opcode },
6036 /* f8 */
6037 { Bad_Opcode },
6038 { Bad_Opcode },
6039 { Bad_Opcode },
6040 { Bad_Opcode },
6041 { Bad_Opcode },
6042 { Bad_Opcode },
6043 { Bad_Opcode },
6044 { Bad_Opcode },
6045 },
6046 };
6047
6048 static const struct dis386 vex_table[][256] = {
6049 /* VEX_0F */
6050 {
6051 /* 00 */
6052 { Bad_Opcode },
6053 { Bad_Opcode },
6054 { Bad_Opcode },
6055 { Bad_Opcode },
6056 { Bad_Opcode },
6057 { Bad_Opcode },
6058 { Bad_Opcode },
6059 { Bad_Opcode },
6060 /* 08 */
6061 { Bad_Opcode },
6062 { Bad_Opcode },
6063 { Bad_Opcode },
6064 { Bad_Opcode },
6065 { Bad_Opcode },
6066 { Bad_Opcode },
6067 { Bad_Opcode },
6068 { Bad_Opcode },
6069 /* 10 */
6070 { PREFIX_TABLE (PREFIX_VEX_0F10) },
6071 { PREFIX_TABLE (PREFIX_VEX_0F11) },
6072 { PREFIX_TABLE (PREFIX_VEX_0F12) },
6073 { MOD_TABLE (MOD_VEX_0F13) },
6074 { "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6075 { "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6076 { PREFIX_TABLE (PREFIX_VEX_0F16) },
6077 { MOD_TABLE (MOD_VEX_0F17) },
6078 /* 18 */
6079 { Bad_Opcode },
6080 { Bad_Opcode },
6081 { Bad_Opcode },
6082 { Bad_Opcode },
6083 { Bad_Opcode },
6084 { Bad_Opcode },
6085 { Bad_Opcode },
6086 { Bad_Opcode },
6087 /* 20 */
6088 { Bad_Opcode },
6089 { Bad_Opcode },
6090 { Bad_Opcode },
6091 { Bad_Opcode },
6092 { Bad_Opcode },
6093 { Bad_Opcode },
6094 { Bad_Opcode },
6095 { Bad_Opcode },
6096 /* 28 */
6097 { "vmovapX", { XM, EXx }, PREFIX_OPCODE },
6098 { "vmovapX", { EXxS, XM }, PREFIX_OPCODE },
6099 { PREFIX_TABLE (PREFIX_VEX_0F2A) },
6100 { MOD_TABLE (MOD_VEX_0F2B) },
6101 { PREFIX_TABLE (PREFIX_VEX_0F2C) },
6102 { PREFIX_TABLE (PREFIX_VEX_0F2D) },
6103 { PREFIX_TABLE (PREFIX_VEX_0F2E) },
6104 { PREFIX_TABLE (PREFIX_VEX_0F2F) },
6105 /* 30 */
6106 { Bad_Opcode },
6107 { Bad_Opcode },
6108 { Bad_Opcode },
6109 { Bad_Opcode },
6110 { Bad_Opcode },
6111 { Bad_Opcode },
6112 { Bad_Opcode },
6113 { Bad_Opcode },
6114 /* 38 */
6115 { Bad_Opcode },
6116 { Bad_Opcode },
6117 { Bad_Opcode },
6118 { Bad_Opcode },
6119 { Bad_Opcode },
6120 { Bad_Opcode },
6121 { Bad_Opcode },
6122 { Bad_Opcode },
6123 /* 40 */
6124 { Bad_Opcode },
6125 { VEX_LEN_TABLE (VEX_LEN_0F41) },
6126 { VEX_LEN_TABLE (VEX_LEN_0F42) },
6127 { Bad_Opcode },
6128 { VEX_LEN_TABLE (VEX_LEN_0F44) },
6129 { VEX_LEN_TABLE (VEX_LEN_0F45) },
6130 { VEX_LEN_TABLE (VEX_LEN_0F46) },
6131 { VEX_LEN_TABLE (VEX_LEN_0F47) },
6132 /* 48 */
6133 { Bad_Opcode },
6134 { Bad_Opcode },
6135 { VEX_LEN_TABLE (VEX_LEN_0F4A) },
6136 { VEX_LEN_TABLE (VEX_LEN_0F4B) },
6137 { Bad_Opcode },
6138 { Bad_Opcode },
6139 { Bad_Opcode },
6140 { Bad_Opcode },
6141 /* 50 */
6142 { MOD_TABLE (MOD_VEX_0F50) },
6143 { PREFIX_TABLE (PREFIX_VEX_0F51) },
6144 { PREFIX_TABLE (PREFIX_VEX_0F52) },
6145 { PREFIX_TABLE (PREFIX_VEX_0F53) },
6146 { "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6147 { "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6148 { "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6149 { "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
6150 /* 58 */
6151 { PREFIX_TABLE (PREFIX_VEX_0F58) },
6152 { PREFIX_TABLE (PREFIX_VEX_0F59) },
6153 { PREFIX_TABLE (PREFIX_VEX_0F5A) },
6154 { PREFIX_TABLE (PREFIX_VEX_0F5B) },
6155 { PREFIX_TABLE (PREFIX_VEX_0F5C) },
6156 { PREFIX_TABLE (PREFIX_VEX_0F5D) },
6157 { PREFIX_TABLE (PREFIX_VEX_0F5E) },
6158 { PREFIX_TABLE (PREFIX_VEX_0F5F) },
6159 /* 60 */
6160 { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
6161 { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
6162 { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
6163 { "vpacksswb", { XM, Vex, EXx }, PREFIX_DATA },
6164 { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
6165 { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
6166 { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
6167 { "vpackuswb", { XM, Vex, EXx }, PREFIX_DATA },
6168 /* 68 */
6169 { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
6170 { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
6171 { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
6172 { "vpackssdw", { XM, Vex, EXx }, PREFIX_DATA },
6173 { "vpunpcklqdq", { XM, Vex, EXx }, PREFIX_DATA },
6174 { "vpunpckhqdq", { XM, Vex, EXx }, PREFIX_DATA },
6175 { VEX_LEN_TABLE (VEX_LEN_0F6E) },
6176 { PREFIX_TABLE (PREFIX_VEX_0F6F) },
6177 /* 70 */
6178 { PREFIX_TABLE (PREFIX_VEX_0F70) },
6179 { MOD_TABLE (MOD_VEX_0F71) },
6180 { MOD_TABLE (MOD_VEX_0F72) },
6181 { MOD_TABLE (MOD_VEX_0F73) },
6182 { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
6183 { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
6184 { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
6185 { VEX_LEN_TABLE (VEX_LEN_0F77) },
6186 /* 78 */
6187 { Bad_Opcode },
6188 { Bad_Opcode },
6189 { Bad_Opcode },
6190 { Bad_Opcode },
6191 { PREFIX_TABLE (PREFIX_VEX_0F7C) },
6192 { PREFIX_TABLE (PREFIX_VEX_0F7D) },
6193 { PREFIX_TABLE (PREFIX_VEX_0F7E) },
6194 { PREFIX_TABLE (PREFIX_VEX_0F7F) },
6195 /* 80 */
6196 { Bad_Opcode },
6197 { Bad_Opcode },
6198 { Bad_Opcode },
6199 { Bad_Opcode },
6200 { Bad_Opcode },
6201 { Bad_Opcode },
6202 { Bad_Opcode },
6203 { Bad_Opcode },
6204 /* 88 */
6205 { Bad_Opcode },
6206 { Bad_Opcode },
6207 { Bad_Opcode },
6208 { Bad_Opcode },
6209 { Bad_Opcode },
6210 { Bad_Opcode },
6211 { Bad_Opcode },
6212 { Bad_Opcode },
6213 /* 90 */
6214 { VEX_LEN_TABLE (VEX_LEN_0F90) },
6215 { VEX_LEN_TABLE (VEX_LEN_0F91) },
6216 { VEX_LEN_TABLE (VEX_LEN_0F92) },
6217 { VEX_LEN_TABLE (VEX_LEN_0F93) },
6218 { Bad_Opcode },
6219 { Bad_Opcode },
6220 { Bad_Opcode },
6221 { Bad_Opcode },
6222 /* 98 */
6223 { VEX_LEN_TABLE (VEX_LEN_0F98) },
6224 { VEX_LEN_TABLE (VEX_LEN_0F99) },
6225 { Bad_Opcode },
6226 { Bad_Opcode },
6227 { Bad_Opcode },
6228 { Bad_Opcode },
6229 { Bad_Opcode },
6230 { Bad_Opcode },
6231 /* a0 */
6232 { Bad_Opcode },
6233 { Bad_Opcode },
6234 { Bad_Opcode },
6235 { Bad_Opcode },
6236 { Bad_Opcode },
6237 { Bad_Opcode },
6238 { Bad_Opcode },
6239 { Bad_Opcode },
6240 /* a8 */
6241 { Bad_Opcode },
6242 { Bad_Opcode },
6243 { Bad_Opcode },
6244 { Bad_Opcode },
6245 { Bad_Opcode },
6246 { Bad_Opcode },
6247 { REG_TABLE (REG_VEX_0FAE) },
6248 { Bad_Opcode },
6249 /* b0 */
6250 { Bad_Opcode },
6251 { Bad_Opcode },
6252 { Bad_Opcode },
6253 { Bad_Opcode },
6254 { Bad_Opcode },
6255 { Bad_Opcode },
6256 { Bad_Opcode },
6257 { Bad_Opcode },
6258 /* b8 */
6259 { Bad_Opcode },
6260 { Bad_Opcode },
6261 { Bad_Opcode },
6262 { Bad_Opcode },
6263 { Bad_Opcode },
6264 { Bad_Opcode },
6265 { Bad_Opcode },
6266 { Bad_Opcode },
6267 /* c0 */
6268 { Bad_Opcode },
6269 { Bad_Opcode },
6270 { PREFIX_TABLE (PREFIX_VEX_0FC2) },
6271 { Bad_Opcode },
6272 { VEX_LEN_TABLE (VEX_LEN_0FC4) },
6273 { VEX_LEN_TABLE (VEX_LEN_0FC5) },
6274 { "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
6275 { Bad_Opcode },
6276 /* c8 */
6277 { Bad_Opcode },
6278 { Bad_Opcode },
6279 { Bad_Opcode },
6280 { Bad_Opcode },
6281 { Bad_Opcode },
6282 { Bad_Opcode },
6283 { Bad_Opcode },
6284 { Bad_Opcode },
6285 /* d0 */
6286 { PREFIX_TABLE (PREFIX_VEX_0FD0) },
6287 { "vpsrlw", { XM, Vex, EXxmm }, PREFIX_DATA },
6288 { "vpsrld", { XM, Vex, EXxmm }, PREFIX_DATA },
6289 { "vpsrlq", { XM, Vex, EXxmm }, PREFIX_DATA },
6290 { "vpaddq", { XM, Vex, EXx }, PREFIX_DATA },
6291 { "vpmullw", { XM, Vex, EXx }, PREFIX_DATA },
6292 { VEX_LEN_TABLE (VEX_LEN_0FD6) },
6293 { MOD_TABLE (MOD_VEX_0FD7) },
6294 /* d8 */
6295 { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
6296 { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
6297 { "vpminub", { XM, Vex, EXx }, PREFIX_DATA },
6298 { "vpand", { XM, Vex, EXx }, PREFIX_DATA },
6299 { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
6300 { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
6301 { "vpmaxub", { XM, Vex, EXx }, PREFIX_DATA },
6302 { "vpandn", { XM, Vex, EXx }, PREFIX_DATA },
6303 /* e0 */
6304 { "vpavgb", { XM, Vex, EXx }, PREFIX_DATA },
6305 { "vpsraw", { XM, Vex, EXxmm }, PREFIX_DATA },
6306 { "vpsrad", { XM, Vex, EXxmm }, PREFIX_DATA },
6307 { "vpavgw", { XM, Vex, EXx }, PREFIX_DATA },
6308 { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
6309 { "vpmulhw", { XM, Vex, EXx }, PREFIX_DATA },
6310 { PREFIX_TABLE (PREFIX_VEX_0FE6) },
6311 { MOD_TABLE (MOD_VEX_0FE7) },
6312 /* e8 */
6313 { "vpsubsb", { XM, Vex, EXx }, PREFIX_DATA },
6314 { "vpsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6315 { "vpminsw", { XM, Vex, EXx }, PREFIX_DATA },
6316 { "vpor", { XM, Vex, EXx }, PREFIX_DATA },
6317 { "vpaddsb", { XM, Vex, EXx }, PREFIX_DATA },
6318 { "vpaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6319 { "vpmaxsw", { XM, Vex, EXx }, PREFIX_DATA },
6320 { "vpxor", { XM, Vex, EXx }, PREFIX_DATA },
6321 /* f0 */
6322 { PREFIX_TABLE (PREFIX_VEX_0FF0) },
6323 { "vpsllw", { XM, Vex, EXxmm }, PREFIX_DATA },
6324 { "vpslld", { XM, Vex, EXxmm }, PREFIX_DATA },
6325 { "vpsllq", { XM, Vex, EXxmm }, PREFIX_DATA },
6326 { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
6327 { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
6328 { "vpsadbw", { XM, Vex, EXx }, PREFIX_DATA },
6329 { VEX_LEN_TABLE (VEX_LEN_0FF7) },
6330 /* f8 */
6331 { "vpsubb", { XM, Vex, EXx }, PREFIX_DATA },
6332 { "vpsubw", { XM, Vex, EXx }, PREFIX_DATA },
6333 { "vpsubd", { XM, Vex, EXx }, PREFIX_DATA },
6334 { "vpsubq", { XM, Vex, EXx }, PREFIX_DATA },
6335 { "vpaddb", { XM, Vex, EXx }, PREFIX_DATA },
6336 { "vpaddw", { XM, Vex, EXx }, PREFIX_DATA },
6337 { "vpaddd", { XM, Vex, EXx }, PREFIX_DATA },
6338 { Bad_Opcode },
6339 },
6340 /* VEX_0F38 */
6341 {
6342 /* 00 */
6343 { "vpshufb", { XM, Vex, EXx }, PREFIX_DATA },
6344 { "vphaddw", { XM, Vex, EXx }, PREFIX_DATA },
6345 { "vphaddd", { XM, Vex, EXx }, PREFIX_DATA },
6346 { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
6347 { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
6348 { "vphsubw", { XM, Vex, EXx }, PREFIX_DATA },
6349 { "vphsubd", { XM, Vex, EXx }, PREFIX_DATA },
6350 { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
6351 /* 08 */
6352 { "vpsignb", { XM, Vex, EXx }, PREFIX_DATA },
6353 { "vpsignw", { XM, Vex, EXx }, PREFIX_DATA },
6354 { "vpsignd", { XM, Vex, EXx }, PREFIX_DATA },
6355 { "vpmulhrsw", { XM, Vex, EXx }, PREFIX_DATA },
6356 { VEX_W_TABLE (VEX_W_0F380C) },
6357 { VEX_W_TABLE (VEX_W_0F380D) },
6358 { VEX_W_TABLE (VEX_W_0F380E) },
6359 { VEX_W_TABLE (VEX_W_0F380F) },
6360 /* 10 */
6361 { Bad_Opcode },
6362 { Bad_Opcode },
6363 { Bad_Opcode },
6364 { VEX_W_TABLE (VEX_W_0F3813) },
6365 { Bad_Opcode },
6366 { Bad_Opcode },
6367 { VEX_LEN_TABLE (VEX_LEN_0F3816) },
6368 { "vptest", { XM, EXx }, PREFIX_DATA },
6369 /* 18 */
6370 { VEX_W_TABLE (VEX_W_0F3818) },
6371 { VEX_LEN_TABLE (VEX_LEN_0F3819) },
6372 { MOD_TABLE (MOD_VEX_0F381A) },
6373 { Bad_Opcode },
6374 { "vpabsb", { XM, EXx }, PREFIX_DATA },
6375 { "vpabsw", { XM, EXx }, PREFIX_DATA },
6376 { "vpabsd", { XM, EXx }, PREFIX_DATA },
6377 { Bad_Opcode },
6378 /* 20 */
6379 { "vpmovsxbw", { XM, EXxmmq }, PREFIX_DATA },
6380 { "vpmovsxbd", { XM, EXxmmqd }, PREFIX_DATA },
6381 { "vpmovsxbq", { XM, EXxmmdw }, PREFIX_DATA },
6382 { "vpmovsxwd", { XM, EXxmmq }, PREFIX_DATA },
6383 { "vpmovsxwq", { XM, EXxmmqd }, PREFIX_DATA },
6384 { "vpmovsxdq", { XM, EXxmmq }, PREFIX_DATA },
6385 { Bad_Opcode },
6386 { Bad_Opcode },
6387 /* 28 */
6388 { "vpmuldq", { XM, Vex, EXx }, PREFIX_DATA },
6389 { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
6390 { MOD_TABLE (MOD_VEX_0F382A) },
6391 { "vpackusdw", { XM, Vex, EXx }, PREFIX_DATA },
6392 { MOD_TABLE (MOD_VEX_0F382C) },
6393 { MOD_TABLE (MOD_VEX_0F382D) },
6394 { MOD_TABLE (MOD_VEX_0F382E) },
6395 { MOD_TABLE (MOD_VEX_0F382F) },
6396 /* 30 */
6397 { "vpmovzxbw", { XM, EXxmmq }, PREFIX_DATA },
6398 { "vpmovzxbd", { XM, EXxmmqd }, PREFIX_DATA },
6399 { "vpmovzxbq", { XM, EXxmmdw }, PREFIX_DATA },
6400 { "vpmovzxwd", { XM, EXxmmq }, PREFIX_DATA },
6401 { "vpmovzxwq", { XM, EXxmmqd }, PREFIX_DATA },
6402 { "vpmovzxdq", { XM, EXxmmq }, PREFIX_DATA },
6403 { VEX_LEN_TABLE (VEX_LEN_0F3836) },
6404 { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
6405 /* 38 */
6406 { "vpminsb", { XM, Vex, EXx }, PREFIX_DATA },
6407 { "vpminsd", { XM, Vex, EXx }, PREFIX_DATA },
6408 { "vpminuw", { XM, Vex, EXx }, PREFIX_DATA },
6409 { "vpminud", { XM, Vex, EXx }, PREFIX_DATA },
6410 { "vpmaxsb", { XM, Vex, EXx }, PREFIX_DATA },
6411 { "vpmaxsd", { XM, Vex, EXx }, PREFIX_DATA },
6412 { "vpmaxuw", { XM, Vex, EXx }, PREFIX_DATA },
6413 { "vpmaxud", { XM, Vex, EXx }, PREFIX_DATA },
6414 /* 40 */
6415 { "vpmulld", { XM, Vex, EXx }, PREFIX_DATA },
6416 { VEX_LEN_TABLE (VEX_LEN_0F3841) },
6417 { Bad_Opcode },
6418 { Bad_Opcode },
6419 { Bad_Opcode },
6420 { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6421 { VEX_W_TABLE (VEX_W_0F3846) },
6422 { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
6423 /* 48 */
6424 { Bad_Opcode },
6425 { X86_64_TABLE (X86_64_VEX_0F3849) },
6426 { Bad_Opcode },
6427 { X86_64_TABLE (X86_64_VEX_0F384B) },
6428 { Bad_Opcode },
6429 { Bad_Opcode },
6430 { Bad_Opcode },
6431 { Bad_Opcode },
6432 /* 50 */
6433 { VEX_W_TABLE (VEX_W_0F3850) },
6434 { VEX_W_TABLE (VEX_W_0F3851) },
6435 { VEX_W_TABLE (VEX_W_0F3852) },
6436 { VEX_W_TABLE (VEX_W_0F3853) },
6437 { Bad_Opcode },
6438 { Bad_Opcode },
6439 { Bad_Opcode },
6440 { Bad_Opcode },
6441 /* 58 */
6442 { VEX_W_TABLE (VEX_W_0F3858) },
6443 { VEX_W_TABLE (VEX_W_0F3859) },
6444 { MOD_TABLE (MOD_VEX_0F385A) },
6445 { Bad_Opcode },
6446 { X86_64_TABLE (X86_64_VEX_0F385C) },
6447 { Bad_Opcode },
6448 { X86_64_TABLE (X86_64_VEX_0F385E) },
6449 { Bad_Opcode },
6450 /* 60 */
6451 { Bad_Opcode },
6452 { Bad_Opcode },
6453 { Bad_Opcode },
6454 { Bad_Opcode },
6455 { Bad_Opcode },
6456 { Bad_Opcode },
6457 { Bad_Opcode },
6458 { Bad_Opcode },
6459 /* 68 */
6460 { Bad_Opcode },
6461 { Bad_Opcode },
6462 { Bad_Opcode },
6463 { Bad_Opcode },
6464 { Bad_Opcode },
6465 { Bad_Opcode },
6466 { Bad_Opcode },
6467 { Bad_Opcode },
6468 /* 70 */
6469 { Bad_Opcode },
6470 { Bad_Opcode },
6471 { PREFIX_TABLE (PREFIX_VEX_0F3872) },
6472 { Bad_Opcode },
6473 { Bad_Opcode },
6474 { Bad_Opcode },
6475 { Bad_Opcode },
6476 { Bad_Opcode },
6477 /* 78 */
6478 { VEX_W_TABLE (VEX_W_0F3878) },
6479 { VEX_W_TABLE (VEX_W_0F3879) },
6480 { Bad_Opcode },
6481 { Bad_Opcode },
6482 { Bad_Opcode },
6483 { Bad_Opcode },
6484 { Bad_Opcode },
6485 { Bad_Opcode },
6486 /* 80 */
6487 { Bad_Opcode },
6488 { Bad_Opcode },
6489 { Bad_Opcode },
6490 { Bad_Opcode },
6491 { Bad_Opcode },
6492 { Bad_Opcode },
6493 { Bad_Opcode },
6494 { Bad_Opcode },
6495 /* 88 */
6496 { Bad_Opcode },
6497 { Bad_Opcode },
6498 { Bad_Opcode },
6499 { Bad_Opcode },
6500 { MOD_TABLE (MOD_VEX_0F388C) },
6501 { Bad_Opcode },
6502 { MOD_TABLE (MOD_VEX_0F388E) },
6503 { Bad_Opcode },
6504 /* 90 */
6505 { "vpgatherd%DQ", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6506 { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6507 { "vgatherdp%XW", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
6508 { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
6509 { Bad_Opcode },
6510 { Bad_Opcode },
6511 { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6512 { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6513 /* 98 */
6514 { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6515 { "vfmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6516 { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6517 { "vfmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6518 { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6519 { "vfnmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6520 { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6521 { "vfnmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6522 /* a0 */
6523 { Bad_Opcode },
6524 { Bad_Opcode },
6525 { Bad_Opcode },
6526 { Bad_Opcode },
6527 { Bad_Opcode },
6528 { Bad_Opcode },
6529 { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6530 { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6531 /* a8 */
6532 { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6533 { "vfmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6534 { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6535 { "vfmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6536 { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6537 { "vfnmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6538 { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6539 { "vfnmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6540 /* b0 */
6541 { VEX_W_TABLE (VEX_W_0F38B0) },
6542 { VEX_W_TABLE (VEX_W_0F38B1) },
6543 { Bad_Opcode },
6544 { Bad_Opcode },
6545 { VEX_W_TABLE (VEX_W_0F38B4) },
6546 { VEX_W_TABLE (VEX_W_0F38B5) },
6547 { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6548 { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6549 /* b8 */
6550 { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6551 { "vfmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6552 { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6553 { "vfmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6554 { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6555 { "vfnmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6556 { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
6557 { "vfnmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
6558 /* c0 */
6559 { Bad_Opcode },
6560 { Bad_Opcode },
6561 { Bad_Opcode },
6562 { Bad_Opcode },
6563 { Bad_Opcode },
6564 { Bad_Opcode },
6565 { Bad_Opcode },
6566 { Bad_Opcode },
6567 /* c8 */
6568 { Bad_Opcode },
6569 { Bad_Opcode },
6570 { Bad_Opcode },
6571 { Bad_Opcode },
6572 { Bad_Opcode },
6573 { Bad_Opcode },
6574 { Bad_Opcode },
6575 { VEX_W_TABLE (VEX_W_0F38CF) },
6576 /* d0 */
6577 { Bad_Opcode },
6578 { Bad_Opcode },
6579 { Bad_Opcode },
6580 { Bad_Opcode },
6581 { Bad_Opcode },
6582 { Bad_Opcode },
6583 { Bad_Opcode },
6584 { Bad_Opcode },
6585 /* d8 */
6586 { Bad_Opcode },
6587 { Bad_Opcode },
6588 { Bad_Opcode },
6589 { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
6590 { "vaesenc", { XM, Vex, EXx }, PREFIX_DATA },
6591 { "vaesenclast", { XM, Vex, EXx }, PREFIX_DATA },
6592 { "vaesdec", { XM, Vex, EXx }, PREFIX_DATA },
6593 { "vaesdeclast", { XM, Vex, EXx }, PREFIX_DATA },
6594 /* e0 */
6595 { X86_64_TABLE (X86_64_VEX_0F38E0) },
6596 { X86_64_TABLE (X86_64_VEX_0F38E1) },
6597 { X86_64_TABLE (X86_64_VEX_0F38E2) },
6598 { X86_64_TABLE (X86_64_VEX_0F38E3) },
6599 { X86_64_TABLE (X86_64_VEX_0F38E4) },
6600 { X86_64_TABLE (X86_64_VEX_0F38E5) },
6601 { X86_64_TABLE (X86_64_VEX_0F38E6) },
6602 { X86_64_TABLE (X86_64_VEX_0F38E7) },
6603 /* e8 */
6604 { X86_64_TABLE (X86_64_VEX_0F38E8) },
6605 { X86_64_TABLE (X86_64_VEX_0F38E9) },
6606 { X86_64_TABLE (X86_64_VEX_0F38EA) },
6607 { X86_64_TABLE (X86_64_VEX_0F38EB) },
6608 { X86_64_TABLE (X86_64_VEX_0F38EC) },
6609 { X86_64_TABLE (X86_64_VEX_0F38ED) },
6610 { X86_64_TABLE (X86_64_VEX_0F38EE) },
6611 { X86_64_TABLE (X86_64_VEX_0F38EF) },
6612 /* f0 */
6613 { Bad_Opcode },
6614 { Bad_Opcode },
6615 { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
6616 { VEX_LEN_TABLE (VEX_LEN_0F38F3) },
6617 { Bad_Opcode },
6618 { VEX_LEN_TABLE (VEX_LEN_0F38F5) },
6619 { VEX_LEN_TABLE (VEX_LEN_0F38F6) },
6620 { VEX_LEN_TABLE (VEX_LEN_0F38F7) },
6621 /* f8 */
6622 { Bad_Opcode },
6623 { Bad_Opcode },
6624 { Bad_Opcode },
6625 { Bad_Opcode },
6626 { Bad_Opcode },
6627 { Bad_Opcode },
6628 { Bad_Opcode },
6629 { Bad_Opcode },
6630 },
6631 /* VEX_0F3A */
6632 {
6633 /* 00 */
6634 { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
6635 { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
6636 { VEX_W_TABLE (VEX_W_0F3A02) },
6637 { Bad_Opcode },
6638 { VEX_W_TABLE (VEX_W_0F3A04) },
6639 { VEX_W_TABLE (VEX_W_0F3A05) },
6640 { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
6641 { Bad_Opcode },
6642 /* 08 */
6643 { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
6644 { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
6645 { "vroundss", { XMScalar, VexScalar, EXd, Ib }, PREFIX_DATA },
6646 { "vroundsd", { XMScalar, VexScalar, EXq, Ib }, PREFIX_DATA },
6647 { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6648 { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6649 { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6650 { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6651 /* 10 */
6652 { Bad_Opcode },
6653 { Bad_Opcode },
6654 { Bad_Opcode },
6655 { Bad_Opcode },
6656 { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
6657 { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
6658 { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
6659 { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
6660 /* 18 */
6661 { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
6662 { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
6663 { Bad_Opcode },
6664 { Bad_Opcode },
6665 { Bad_Opcode },
6666 { VEX_W_TABLE (VEX_W_0F3A1D) },
6667 { Bad_Opcode },
6668 { Bad_Opcode },
6669 /* 20 */
6670 { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
6671 { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
6672 { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
6673 { Bad_Opcode },
6674 { Bad_Opcode },
6675 { Bad_Opcode },
6676 { Bad_Opcode },
6677 { Bad_Opcode },
6678 /* 28 */
6679 { Bad_Opcode },
6680 { Bad_Opcode },
6681 { Bad_Opcode },
6682 { Bad_Opcode },
6683 { Bad_Opcode },
6684 { Bad_Opcode },
6685 { Bad_Opcode },
6686 { Bad_Opcode },
6687 /* 30 */
6688 { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
6689 { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
6690 { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
6691 { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
6692 { Bad_Opcode },
6693 { Bad_Opcode },
6694 { Bad_Opcode },
6695 { Bad_Opcode },
6696 /* 38 */
6697 { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
6698 { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
6699 { Bad_Opcode },
6700 { Bad_Opcode },
6701 { Bad_Opcode },
6702 { Bad_Opcode },
6703 { Bad_Opcode },
6704 { Bad_Opcode },
6705 /* 40 */
6706 { "vdpps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6707 { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
6708 { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
6709 { Bad_Opcode },
6710 { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
6711 { Bad_Opcode },
6712 { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
6713 { Bad_Opcode },
6714 /* 48 */
6715 { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6716 { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
6717 { VEX_W_TABLE (VEX_W_0F3A4A) },
6718 { VEX_W_TABLE (VEX_W_0F3A4B) },
6719 { VEX_W_TABLE (VEX_W_0F3A4C) },
6720 { Bad_Opcode },
6721 { Bad_Opcode },
6722 { Bad_Opcode },
6723 /* 50 */
6724 { Bad_Opcode },
6725 { Bad_Opcode },
6726 { Bad_Opcode },
6727 { Bad_Opcode },
6728 { Bad_Opcode },
6729 { Bad_Opcode },
6730 { Bad_Opcode },
6731 { Bad_Opcode },
6732 /* 58 */
6733 { Bad_Opcode },
6734 { Bad_Opcode },
6735 { Bad_Opcode },
6736 { Bad_Opcode },
6737 { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6738 { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6739 { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6740 { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6741 /* 60 */
6742 { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
6743 { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
6744 { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
6745 { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
6746 { Bad_Opcode },
6747 { Bad_Opcode },
6748 { Bad_Opcode },
6749 { Bad_Opcode },
6750 /* 68 */
6751 { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6752 { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6753 { "vfmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6754 { "vfmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6755 { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6756 { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6757 { "vfmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6758 { "vfmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6759 /* 70 */
6760 { Bad_Opcode },
6761 { Bad_Opcode },
6762 { Bad_Opcode },
6763 { Bad_Opcode },
6764 { Bad_Opcode },
6765 { Bad_Opcode },
6766 { Bad_Opcode },
6767 { Bad_Opcode },
6768 /* 78 */
6769 { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6770 { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6771 { "vfnmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6772 { "vfnmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6773 { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6774 { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
6775 { "vfnmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
6776 { "vfnmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
6777 /* 80 */
6778 { Bad_Opcode },
6779 { Bad_Opcode },
6780 { Bad_Opcode },
6781 { Bad_Opcode },
6782 { Bad_Opcode },
6783 { Bad_Opcode },
6784 { Bad_Opcode },
6785 { Bad_Opcode },
6786 /* 88 */
6787 { Bad_Opcode },
6788 { Bad_Opcode },
6789 { Bad_Opcode },
6790 { Bad_Opcode },
6791 { Bad_Opcode },
6792 { Bad_Opcode },
6793 { Bad_Opcode },
6794 { Bad_Opcode },
6795 /* 90 */
6796 { Bad_Opcode },
6797 { Bad_Opcode },
6798 { Bad_Opcode },
6799 { Bad_Opcode },
6800 { Bad_Opcode },
6801 { Bad_Opcode },
6802 { Bad_Opcode },
6803 { Bad_Opcode },
6804 /* 98 */
6805 { Bad_Opcode },
6806 { Bad_Opcode },
6807 { Bad_Opcode },
6808 { Bad_Opcode },
6809 { Bad_Opcode },
6810 { Bad_Opcode },
6811 { Bad_Opcode },
6812 { Bad_Opcode },
6813 /* a0 */
6814 { Bad_Opcode },
6815 { Bad_Opcode },
6816 { Bad_Opcode },
6817 { Bad_Opcode },
6818 { Bad_Opcode },
6819 { Bad_Opcode },
6820 { Bad_Opcode },
6821 { Bad_Opcode },
6822 /* a8 */
6823 { Bad_Opcode },
6824 { Bad_Opcode },
6825 { Bad_Opcode },
6826 { Bad_Opcode },
6827 { Bad_Opcode },
6828 { Bad_Opcode },
6829 { Bad_Opcode },
6830 { Bad_Opcode },
6831 /* b0 */
6832 { Bad_Opcode },
6833 { Bad_Opcode },
6834 { Bad_Opcode },
6835 { Bad_Opcode },
6836 { Bad_Opcode },
6837 { Bad_Opcode },
6838 { Bad_Opcode },
6839 { Bad_Opcode },
6840 /* b8 */
6841 { Bad_Opcode },
6842 { Bad_Opcode },
6843 { Bad_Opcode },
6844 { Bad_Opcode },
6845 { Bad_Opcode },
6846 { Bad_Opcode },
6847 { Bad_Opcode },
6848 { Bad_Opcode },
6849 /* c0 */
6850 { Bad_Opcode },
6851 { Bad_Opcode },
6852 { Bad_Opcode },
6853 { Bad_Opcode },
6854 { Bad_Opcode },
6855 { Bad_Opcode },
6856 { Bad_Opcode },
6857 { Bad_Opcode },
6858 /* c8 */
6859 { Bad_Opcode },
6860 { Bad_Opcode },
6861 { Bad_Opcode },
6862 { Bad_Opcode },
6863 { Bad_Opcode },
6864 { Bad_Opcode },
6865 { VEX_W_TABLE (VEX_W_0F3ACE) },
6866 { VEX_W_TABLE (VEX_W_0F3ACF) },
6867 /* d0 */
6868 { Bad_Opcode },
6869 { Bad_Opcode },
6870 { Bad_Opcode },
6871 { Bad_Opcode },
6872 { Bad_Opcode },
6873 { Bad_Opcode },
6874 { Bad_Opcode },
6875 { Bad_Opcode },
6876 /* d8 */
6877 { Bad_Opcode },
6878 { Bad_Opcode },
6879 { Bad_Opcode },
6880 { Bad_Opcode },
6881 { Bad_Opcode },
6882 { Bad_Opcode },
6883 { Bad_Opcode },
6884 { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
6885 /* e0 */
6886 { Bad_Opcode },
6887 { Bad_Opcode },
6888 { Bad_Opcode },
6889 { Bad_Opcode },
6890 { Bad_Opcode },
6891 { Bad_Opcode },
6892 { Bad_Opcode },
6893 { Bad_Opcode },
6894 /* e8 */
6895 { Bad_Opcode },
6896 { Bad_Opcode },
6897 { Bad_Opcode },
6898 { Bad_Opcode },
6899 { Bad_Opcode },
6900 { Bad_Opcode },
6901 { Bad_Opcode },
6902 { Bad_Opcode },
6903 /* f0 */
6904 { VEX_LEN_TABLE (VEX_LEN_0F3AF0) },
6905 { Bad_Opcode },
6906 { Bad_Opcode },
6907 { Bad_Opcode },
6908 { Bad_Opcode },
6909 { Bad_Opcode },
6910 { Bad_Opcode },
6911 { Bad_Opcode },
6912 /* f8 */
6913 { Bad_Opcode },
6914 { Bad_Opcode },
6915 { Bad_Opcode },
6916 { Bad_Opcode },
6917 { Bad_Opcode },
6918 { Bad_Opcode },
6919 { Bad_Opcode },
6920 { Bad_Opcode },
6921 },
6922 };
6923
6924 #include "i386-dis-evex.h"
6925
6926 static const struct dis386 vex_len_table[][2] = {
6927 /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
6928 {
6929 { "%XEvmovlpX", { XM, Vex, EXq }, 0 },
6930 },
6931
6932 /* VEX_LEN_0F12_P_0_M_1 */
6933 {
6934 { "%XEvmovhlp%XS", { XM, Vex, EXq }, 0 },
6935 },
6936
6937 /* VEX_LEN_0F13_M_0 */
6938 {
6939 { "%XEvmovlpX", { EXq, XM }, PREFIX_OPCODE },
6940 },
6941
6942 /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
6943 {
6944 { "%XEvmovhpX", { XM, Vex, EXq }, 0 },
6945 },
6946
6947 /* VEX_LEN_0F16_P_0_M_1 */
6948 {
6949 { "%XEvmovlhp%XS", { XM, Vex, EXq }, 0 },
6950 },
6951
6952 /* VEX_LEN_0F17_M_0 */
6953 {
6954 { "%XEvmovhpX", { EXq, XM }, PREFIX_OPCODE },
6955 },
6956
6957 /* VEX_LEN_0F41 */
6958 {
6959 { Bad_Opcode },
6960 { MOD_TABLE (MOD_VEX_0F41_L_1) },
6961 },
6962
6963 /* VEX_LEN_0F42 */
6964 {
6965 { Bad_Opcode },
6966 { MOD_TABLE (MOD_VEX_0F42_L_1) },
6967 },
6968
6969 /* VEX_LEN_0F44 */
6970 {
6971 { MOD_TABLE (MOD_VEX_0F44_L_0) },
6972 },
6973
6974 /* VEX_LEN_0F45 */
6975 {
6976 { Bad_Opcode },
6977 { MOD_TABLE (MOD_VEX_0F45_L_1) },
6978 },
6979
6980 /* VEX_LEN_0F46 */
6981 {
6982 { Bad_Opcode },
6983 { MOD_TABLE (MOD_VEX_0F46_L_1) },
6984 },
6985
6986 /* VEX_LEN_0F47 */
6987 {
6988 { Bad_Opcode },
6989 { MOD_TABLE (MOD_VEX_0F47_L_1) },
6990 },
6991
6992 /* VEX_LEN_0F4A */
6993 {
6994 { Bad_Opcode },
6995 { MOD_TABLE (MOD_VEX_0F4A_L_1) },
6996 },
6997
6998 /* VEX_LEN_0F4B */
6999 {
7000 { Bad_Opcode },
7001 { MOD_TABLE (MOD_VEX_0F4B_L_1) },
7002 },
7003
7004 /* VEX_LEN_0F6E */
7005 {
7006 { "%XEvmovK", { XMScalar, Edq }, PREFIX_DATA },
7007 },
7008
7009 /* VEX_LEN_0F77 */
7010 {
7011 { "vzeroupper", { XX }, 0 },
7012 { "vzeroall", { XX }, 0 },
7013 },
7014
7015 /* VEX_LEN_0F7E_P_1 */
7016 {
7017 { "%XEvmovq", { XMScalar, EXq }, 0 },
7018 },
7019
7020 /* VEX_LEN_0F7E_P_2 */
7021 {
7022 { "%XEvmovK", { Edq, XMScalar }, 0 },
7023 },
7024
7025 /* VEX_LEN_0F90 */
7026 {
7027 { VEX_W_TABLE (VEX_W_0F90_L_0) },
7028 },
7029
7030 /* VEX_LEN_0F91 */
7031 {
7032 { MOD_TABLE (MOD_VEX_0F91_L_0) },
7033 },
7034
7035 /* VEX_LEN_0F92 */
7036 {
7037 { MOD_TABLE (MOD_VEX_0F92_L_0) },
7038 },
7039
7040 /* VEX_LEN_0F93 */
7041 {
7042 { MOD_TABLE (MOD_VEX_0F93_L_0) },
7043 },
7044
7045 /* VEX_LEN_0F98 */
7046 {
7047 { MOD_TABLE (MOD_VEX_0F98_L_0) },
7048 },
7049
7050 /* VEX_LEN_0F99 */
7051 {
7052 { MOD_TABLE (MOD_VEX_0F99_L_0) },
7053 },
7054
7055 /* VEX_LEN_0FAE_R_2_M_0 */
7056 {
7057 { "vldmxcsr", { Md }, 0 },
7058 },
7059
7060 /* VEX_LEN_0FAE_R_3_M_0 */
7061 {
7062 { "vstmxcsr", { Md }, 0 },
7063 },
7064
7065 /* VEX_LEN_0FC4 */
7066 {
7067 { "%XEvpinsrw", { XM, Vex, Edw, Ib }, PREFIX_DATA },
7068 },
7069
7070 /* VEX_LEN_0FC5 */
7071 {
7072 { "%XEvpextrw", { Gd, XS, Ib }, PREFIX_DATA },
7073 },
7074
7075 /* VEX_LEN_0FD6 */
7076 {
7077 { "%XEvmovq", { EXqS, XMScalar }, PREFIX_DATA },
7078 },
7079
7080 /* VEX_LEN_0FF7 */
7081 {
7082 { "vmaskmovdqu", { XM, XS }, PREFIX_DATA },
7083 },
7084
7085 /* VEX_LEN_0F3816 */
7086 {
7087 { Bad_Opcode },
7088 { VEX_W_TABLE (VEX_W_0F3816_L_1) },
7089 },
7090
7091 /* VEX_LEN_0F3819 */
7092 {
7093 { Bad_Opcode },
7094 { VEX_W_TABLE (VEX_W_0F3819_L_1) },
7095 },
7096
7097 /* VEX_LEN_0F381A_M_0 */
7098 {
7099 { Bad_Opcode },
7100 { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1) },
7101 },
7102
7103 /* VEX_LEN_0F3836 */
7104 {
7105 { Bad_Opcode },
7106 { VEX_W_TABLE (VEX_W_0F3836) },
7107 },
7108
7109 /* VEX_LEN_0F3841 */
7110 {
7111 { "vphminposuw", { XM, EXx }, PREFIX_DATA },
7112 },
7113
7114 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
7115 {
7116 { "ldtilecfg", { M }, 0 },
7117 },
7118
7119 /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
7120 {
7121 { "tilerelease", { Skip_MODRM }, 0 },
7122 },
7123
7124 /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
7125 {
7126 { "sttilecfg", { M }, 0 },
7127 },
7128
7129 /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
7130 {
7131 { "tilezero", { TMM, Skip_MODRM }, 0 },
7132 },
7133
7134 /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
7135 {
7136 { "tilestored", { MVexSIBMEM, TMM }, 0 },
7137 },
7138 /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
7139 {
7140 { "tileloaddt1", { TMM, MVexSIBMEM }, 0 },
7141 },
7142
7143 /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
7144 {
7145 { "tileloadd", { TMM, MVexSIBMEM }, 0 },
7146 },
7147
7148 /* VEX_LEN_0F385A_M_0 */
7149 {
7150 { Bad_Opcode },
7151 { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0) },
7152 },
7153
7154 /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
7155 {
7156 { "tdpbf16ps", { TMM, EXtmm, VexTmm }, 0 },
7157 },
7158
7159 /* VEX_LEN_0F385C_X86_64_P_3_W_0_M_0 */
7160 {
7161 { "tdpfp16ps", { TMM, EXtmm, VexTmm }, 0 },
7162 },
7163
7164 /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
7165 {
7166 { "tdpbuud", {TMM, EXtmm, VexTmm }, 0 },
7167 },
7168
7169 /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
7170 {
7171 { "tdpbsud", {TMM, EXtmm, VexTmm }, 0 },
7172 },
7173
7174 /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
7175 {
7176 { "tdpbusd", {TMM, EXtmm, VexTmm }, 0 },
7177 },
7178
7179 /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
7180 {
7181 { "tdpbssd", {TMM, EXtmm, VexTmm }, 0 },
7182 },
7183
7184 /* VEX_LEN_0F38DB */
7185 {
7186 { "vaesimc", { XM, EXx }, PREFIX_DATA },
7187 },
7188
7189 /* VEX_LEN_0F38F2 */
7190 {
7191 { "andnS", { Gdq, VexGdq, Edq }, PREFIX_OPCODE },
7192 },
7193
7194 /* VEX_LEN_0F38F3 */
7195 {
7196 { REG_TABLE(REG_VEX_0F38F3_L_0) },
7197 },
7198
7199 /* VEX_LEN_0F38F5 */
7200 {
7201 { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0) },
7202 },
7203
7204 /* VEX_LEN_0F38F6 */
7205 {
7206 { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0) },
7207 },
7208
7209 /* VEX_LEN_0F38F7 */
7210 {
7211 { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0) },
7212 },
7213
7214 /* VEX_LEN_0F3A00 */
7215 {
7216 { Bad_Opcode },
7217 { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
7218 },
7219
7220 /* VEX_LEN_0F3A01 */
7221 {
7222 { Bad_Opcode },
7223 { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
7224 },
7225
7226 /* VEX_LEN_0F3A06 */
7227 {
7228 { Bad_Opcode },
7229 { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
7230 },
7231
7232 /* VEX_LEN_0F3A14 */
7233 {
7234 { "%XEvpextrb", { Edb, XM, Ib }, PREFIX_DATA },
7235 },
7236
7237 /* VEX_LEN_0F3A15 */
7238 {
7239 { "%XEvpextrw", { Edw, XM, Ib }, PREFIX_DATA },
7240 },
7241
7242 /* VEX_LEN_0F3A16 */
7243 {
7244 { "%XEvpextrK", { Edq, XM, Ib }, PREFIX_DATA },
7245 },
7246
7247 /* VEX_LEN_0F3A17 */
7248 {
7249 { "%XEvextractps", { Ed, XM, Ib }, PREFIX_DATA },
7250 },
7251
7252 /* VEX_LEN_0F3A18 */
7253 {
7254 { Bad_Opcode },
7255 { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
7256 },
7257
7258 /* VEX_LEN_0F3A19 */
7259 {
7260 { Bad_Opcode },
7261 { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
7262 },
7263
7264 /* VEX_LEN_0F3A20 */
7265 {
7266 { "%XEvpinsrb", { XM, Vex, Edb, Ib }, PREFIX_DATA },
7267 },
7268
7269 /* VEX_LEN_0F3A21 */
7270 {
7271 { "%XEvinsertps", { XM, Vex, EXd, Ib }, PREFIX_DATA },
7272 },
7273
7274 /* VEX_LEN_0F3A22 */
7275 {
7276 { "%XEvpinsrK", { XM, Vex, Edq, Ib }, PREFIX_DATA },
7277 },
7278
7279 /* VEX_LEN_0F3A30 */
7280 {
7281 { MOD_TABLE (MOD_VEX_0F3A30_L_0) },
7282 },
7283
7284 /* VEX_LEN_0F3A31 */
7285 {
7286 { MOD_TABLE (MOD_VEX_0F3A31_L_0) },
7287 },
7288
7289 /* VEX_LEN_0F3A32 */
7290 {
7291 { MOD_TABLE (MOD_VEX_0F3A32_L_0) },
7292 },
7293
7294 /* VEX_LEN_0F3A33 */
7295 {
7296 { MOD_TABLE (MOD_VEX_0F3A33_L_0) },
7297 },
7298
7299 /* VEX_LEN_0F3A38 */
7300 {
7301 { Bad_Opcode },
7302 { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
7303 },
7304
7305 /* VEX_LEN_0F3A39 */
7306 {
7307 { Bad_Opcode },
7308 { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
7309 },
7310
7311 /* VEX_LEN_0F3A41 */
7312 {
7313 { "vdppd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7314 },
7315
7316 /* VEX_LEN_0F3A46 */
7317 {
7318 { Bad_Opcode },
7319 { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
7320 },
7321
7322 /* VEX_LEN_0F3A60 */
7323 {
7324 { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7325 },
7326
7327 /* VEX_LEN_0F3A61 */
7328 {
7329 { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
7330 },
7331
7332 /* VEX_LEN_0F3A62 */
7333 {
7334 { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
7335 },
7336
7337 /* VEX_LEN_0F3A63 */
7338 {
7339 { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
7340 },
7341
7342 /* VEX_LEN_0F3ADF */
7343 {
7344 { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
7345 },
7346
7347 /* VEX_LEN_0F3AF0 */
7348 {
7349 { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) },
7350 },
7351
7352 /* VEX_LEN_0FXOP_08_85 */
7353 {
7354 { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0) },
7355 },
7356
7357 /* VEX_LEN_0FXOP_08_86 */
7358 {
7359 { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0) },
7360 },
7361
7362 /* VEX_LEN_0FXOP_08_87 */
7363 {
7364 { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0) },
7365 },
7366
7367 /* VEX_LEN_0FXOP_08_8E */
7368 {
7369 { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0) },
7370 },
7371
7372 /* VEX_LEN_0FXOP_08_8F */
7373 {
7374 { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0) },
7375 },
7376
7377 /* VEX_LEN_0FXOP_08_95 */
7378 {
7379 { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0) },
7380 },
7381
7382 /* VEX_LEN_0FXOP_08_96 */
7383 {
7384 { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0) },
7385 },
7386
7387 /* VEX_LEN_0FXOP_08_97 */
7388 {
7389 { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0) },
7390 },
7391
7392 /* VEX_LEN_0FXOP_08_9E */
7393 {
7394 { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0) },
7395 },
7396
7397 /* VEX_LEN_0FXOP_08_9F */
7398 {
7399 { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0) },
7400 },
7401
7402 /* VEX_LEN_0FXOP_08_A3 */
7403 {
7404 { "vpperm", { XM, Vex, EXx, XMVexI4 }, 0 },
7405 },
7406
7407 /* VEX_LEN_0FXOP_08_A6 */
7408 {
7409 { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0) },
7410 },
7411
7412 /* VEX_LEN_0FXOP_08_B6 */
7413 {
7414 { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0) },
7415 },
7416
7417 /* VEX_LEN_0FXOP_08_C0 */
7418 {
7419 { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0) },
7420 },
7421
7422 /* VEX_LEN_0FXOP_08_C1 */
7423 {
7424 { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0) },
7425 },
7426
7427 /* VEX_LEN_0FXOP_08_C2 */
7428 {
7429 { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0) },
7430 },
7431
7432 /* VEX_LEN_0FXOP_08_C3 */
7433 {
7434 { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0) },
7435 },
7436
7437 /* VEX_LEN_0FXOP_08_CC */
7438 {
7439 { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0) },
7440 },
7441
7442 /* VEX_LEN_0FXOP_08_CD */
7443 {
7444 { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0) },
7445 },
7446
7447 /* VEX_LEN_0FXOP_08_CE */
7448 {
7449 { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0) },
7450 },
7451
7452 /* VEX_LEN_0FXOP_08_CF */
7453 {
7454 { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0) },
7455 },
7456
7457 /* VEX_LEN_0FXOP_08_EC */
7458 {
7459 { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0) },
7460 },
7461
7462 /* VEX_LEN_0FXOP_08_ED */
7463 {
7464 { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0) },
7465 },
7466
7467 /* VEX_LEN_0FXOP_08_EE */
7468 {
7469 { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0) },
7470 },
7471
7472 /* VEX_LEN_0FXOP_08_EF */
7473 {
7474 { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0) },
7475 },
7476
7477 /* VEX_LEN_0FXOP_09_01 */
7478 {
7479 { REG_TABLE (REG_XOP_09_01_L_0) },
7480 },
7481
7482 /* VEX_LEN_0FXOP_09_02 */
7483 {
7484 { REG_TABLE (REG_XOP_09_02_L_0) },
7485 },
7486
7487 /* VEX_LEN_0FXOP_09_12_M_1 */
7488 {
7489 { REG_TABLE (REG_XOP_09_12_M_1_L_0) },
7490 },
7491
7492 /* VEX_LEN_0FXOP_09_82_W_0 */
7493 {
7494 { "vfrczss", { XM, EXd }, 0 },
7495 },
7496
7497 /* VEX_LEN_0FXOP_09_83_W_0 */
7498 {
7499 { "vfrczsd", { XM, EXq }, 0 },
7500 },
7501
7502 /* VEX_LEN_0FXOP_09_90 */
7503 {
7504 { "vprotb", { XM, EXx, VexW }, 0 },
7505 },
7506
7507 /* VEX_LEN_0FXOP_09_91 */
7508 {
7509 { "vprotw", { XM, EXx, VexW }, 0 },
7510 },
7511
7512 /* VEX_LEN_0FXOP_09_92 */
7513 {
7514 { "vprotd", { XM, EXx, VexW }, 0 },
7515 },
7516
7517 /* VEX_LEN_0FXOP_09_93 */
7518 {
7519 { "vprotq", { XM, EXx, VexW }, 0 },
7520 },
7521
7522 /* VEX_LEN_0FXOP_09_94 */
7523 {
7524 { "vpshlb", { XM, EXx, VexW }, 0 },
7525 },
7526
7527 /* VEX_LEN_0FXOP_09_95 */
7528 {
7529 { "vpshlw", { XM, EXx, VexW }, 0 },
7530 },
7531
7532 /* VEX_LEN_0FXOP_09_96 */
7533 {
7534 { "vpshld", { XM, EXx, VexW }, 0 },
7535 },
7536
7537 /* VEX_LEN_0FXOP_09_97 */
7538 {
7539 { "vpshlq", { XM, EXx, VexW }, 0 },
7540 },
7541
7542 /* VEX_LEN_0FXOP_09_98 */
7543 {
7544 { "vpshab", { XM, EXx, VexW }, 0 },
7545 },
7546
7547 /* VEX_LEN_0FXOP_09_99 */
7548 {
7549 { "vpshaw", { XM, EXx, VexW }, 0 },
7550 },
7551
7552 /* VEX_LEN_0FXOP_09_9A */
7553 {
7554 { "vpshad", { XM, EXx, VexW }, 0 },
7555 },
7556
7557 /* VEX_LEN_0FXOP_09_9B */
7558 {
7559 { "vpshaq", { XM, EXx, VexW }, 0 },
7560 },
7561
7562 /* VEX_LEN_0FXOP_09_C1 */
7563 {
7564 { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0) },
7565 },
7566
7567 /* VEX_LEN_0FXOP_09_C2 */
7568 {
7569 { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0) },
7570 },
7571
7572 /* VEX_LEN_0FXOP_09_C3 */
7573 {
7574 { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0) },
7575 },
7576
7577 /* VEX_LEN_0FXOP_09_C6 */
7578 {
7579 { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0) },
7580 },
7581
7582 /* VEX_LEN_0FXOP_09_C7 */
7583 {
7584 { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0) },
7585 },
7586
7587 /* VEX_LEN_0FXOP_09_CB */
7588 {
7589 { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0) },
7590 },
7591
7592 /* VEX_LEN_0FXOP_09_D1 */
7593 {
7594 { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0) },
7595 },
7596
7597 /* VEX_LEN_0FXOP_09_D2 */
7598 {
7599 { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0) },
7600 },
7601
7602 /* VEX_LEN_0FXOP_09_D3 */
7603 {
7604 { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0) },
7605 },
7606
7607 /* VEX_LEN_0FXOP_09_D6 */
7608 {
7609 { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0) },
7610 },
7611
7612 /* VEX_LEN_0FXOP_09_D7 */
7613 {
7614 { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0) },
7615 },
7616
7617 /* VEX_LEN_0FXOP_09_DB */
7618 {
7619 { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0) },
7620 },
7621
7622 /* VEX_LEN_0FXOP_09_E1 */
7623 {
7624 { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0) },
7625 },
7626
7627 /* VEX_LEN_0FXOP_09_E2 */
7628 {
7629 { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0) },
7630 },
7631
7632 /* VEX_LEN_0FXOP_09_E3 */
7633 {
7634 { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0) },
7635 },
7636
7637 /* VEX_LEN_0FXOP_0A_12 */
7638 {
7639 { REG_TABLE (REG_XOP_0A_12_L_0) },
7640 },
7641 };
7642
7643 #include "i386-dis-evex-len.h"
7644
7645 static const struct dis386 vex_w_table[][2] = {
7646 {
7647 /* VEX_W_0F41_L_1_M_1 */
7648 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_0) },
7649 { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_1) },
7650 },
7651 {
7652 /* VEX_W_0F42_L_1_M_1 */
7653 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_0) },
7654 { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_1) },
7655 },
7656 {
7657 /* VEX_W_0F44_L_0_M_1 */
7658 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_0) },
7659 { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_1) },
7660 },
7661 {
7662 /* VEX_W_0F45_L_1_M_1 */
7663 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_0) },
7664 { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_1) },
7665 },
7666 {
7667 /* VEX_W_0F46_L_1_M_1 */
7668 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_0) },
7669 { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_1) },
7670 },
7671 {
7672 /* VEX_W_0F47_L_1_M_1 */
7673 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_0) },
7674 { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_1) },
7675 },
7676 {
7677 /* VEX_W_0F4A_L_1_M_1 */
7678 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_0) },
7679 { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_1) },
7680 },
7681 {
7682 /* VEX_W_0F4B_L_1_M_1 */
7683 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_0) },
7684 { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_1) },
7685 },
7686 {
7687 /* VEX_W_0F90_L_0 */
7688 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0) },
7689 { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1) },
7690 },
7691 {
7692 /* VEX_W_0F91_L_0_M_0 */
7693 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_0) },
7694 { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_1) },
7695 },
7696 {
7697 /* VEX_W_0F92_L_0_M_1 */
7698 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_0) },
7699 { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_1) },
7700 },
7701 {
7702 /* VEX_W_0F93_L_0_M_1 */
7703 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_0) },
7704 { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_1) },
7705 },
7706 {
7707 /* VEX_W_0F98_L_0_M_1 */
7708 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_0) },
7709 { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_1) },
7710 },
7711 {
7712 /* VEX_W_0F99_L_0_M_1 */
7713 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_0) },
7714 { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_1) },
7715 },
7716 {
7717 /* VEX_W_0F380C */
7718 { "%XEvpermilps", { XM, Vex, EXx }, PREFIX_DATA },
7719 },
7720 {
7721 /* VEX_W_0F380D */
7722 { "vpermilpd", { XM, Vex, EXx }, PREFIX_DATA },
7723 },
7724 {
7725 /* VEX_W_0F380E */
7726 { "vtestps", { XM, EXx }, PREFIX_DATA },
7727 },
7728 {
7729 /* VEX_W_0F380F */
7730 { "vtestpd", { XM, EXx }, PREFIX_DATA },
7731 },
7732 {
7733 /* VEX_W_0F3813 */
7734 { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
7735 },
7736 {
7737 /* VEX_W_0F3816_L_1 */
7738 { "vpermps", { XM, Vex, EXx }, PREFIX_DATA },
7739 },
7740 {
7741 /* VEX_W_0F3818 */
7742 { "%XEvbroadcastss", { XM, EXd }, PREFIX_DATA },
7743 },
7744 {
7745 /* VEX_W_0F3819_L_1 */
7746 { "vbroadcastsd", { XM, EXq }, PREFIX_DATA },
7747 },
7748 {
7749 /* VEX_W_0F381A_M_0_L_1 */
7750 { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
7751 },
7752 {
7753 /* VEX_W_0F382C_M_0 */
7754 { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
7755 },
7756 {
7757 /* VEX_W_0F382D_M_0 */
7758 { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
7759 },
7760 {
7761 /* VEX_W_0F382E_M_0 */
7762 { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
7763 },
7764 {
7765 /* VEX_W_0F382F_M_0 */
7766 { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
7767 },
7768 {
7769 /* VEX_W_0F3836 */
7770 { "vpermd", { XM, Vex, EXx }, PREFIX_DATA },
7771 },
7772 {
7773 /* VEX_W_0F3846 */
7774 { "vpsravd", { XM, Vex, EXx }, PREFIX_DATA },
7775 },
7776 {
7777 /* VEX_W_0F3849_X86_64_P_0 */
7778 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0) },
7779 },
7780 {
7781 /* VEX_W_0F3849_X86_64_P_2 */
7782 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0) },
7783 },
7784 {
7785 /* VEX_W_0F3849_X86_64_P_3 */
7786 { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0) },
7787 },
7788 {
7789 /* VEX_W_0F384B_X86_64_P_1 */
7790 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0) },
7791 },
7792 {
7793 /* VEX_W_0F384B_X86_64_P_2 */
7794 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0) },
7795 },
7796 {
7797 /* VEX_W_0F384B_X86_64_P_3 */
7798 { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_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_M_0_L_0 */
7826 { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
7827 },
7828 {
7829 /* VEX_W_0F385C_X86_64_P_1 */
7830 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0) },
7831 },
7832 {
7833 /* VEX_W_0F385C_X86_64_P_3 */
7834 { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_3_W_0) },
7835 },
7836 {
7837 /* VEX_W_0F385E_X86_64_P_0 */
7838 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0) },
7839 },
7840 {
7841 /* VEX_W_0F385E_X86_64_P_1 */
7842 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0) },
7843 },
7844 {
7845 /* VEX_W_0F385E_X86_64_P_2 */
7846 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0) },
7847 },
7848 {
7849 /* VEX_W_0F385E_X86_64_P_3 */
7850 { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0) },
7851 },
7852 {
7853 /* VEX_W_0F3872_P_1 */
7854 { "%XVvcvtneps2bf16%XY", { XMM, EXx }, 0 },
7855 },
7856 {
7857 /* VEX_W_0F3878 */
7858 { "%XEvpbroadcastb", { XM, EXb }, PREFIX_DATA },
7859 },
7860 {
7861 /* VEX_W_0F3879 */
7862 { "%XEvpbroadcastw", { XM, EXw }, PREFIX_DATA },
7863 },
7864 {
7865 /* VEX_W_0F38B0 */
7866 { PREFIX_TABLE (PREFIX_VEX_0F38B0_W_0) },
7867 },
7868 {
7869 /* VEX_W_0F38B1 */
7870 { PREFIX_TABLE (PREFIX_VEX_0F38B1_W_0) },
7871 },
7872 {
7873 /* VEX_W_0F38B4 */
7874 { Bad_Opcode },
7875 { "%XVvpmadd52luq", { XM, Vex, EXx }, PREFIX_DATA },
7876 },
7877 {
7878 /* VEX_W_0F38B5 */
7879 { Bad_Opcode },
7880 { "%XVvpmadd52huq", { XM, Vex, EXx }, PREFIX_DATA },
7881 },
7882 {
7883 /* VEX_W_0F38CF */
7884 { "%XEvgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
7885 },
7886 {
7887 /* VEX_W_0F3A00_L_1 */
7888 { Bad_Opcode },
7889 { "%XEvpermq", { XM, EXx, Ib }, PREFIX_DATA },
7890 },
7891 {
7892 /* VEX_W_0F3A01_L_1 */
7893 { Bad_Opcode },
7894 { "%XEvpermpd", { XM, EXx, Ib }, PREFIX_DATA },
7895 },
7896 {
7897 /* VEX_W_0F3A02 */
7898 { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7899 },
7900 {
7901 /* VEX_W_0F3A04 */
7902 { "%XEvpermilps", { XM, EXx, Ib }, PREFIX_DATA },
7903 },
7904 {
7905 /* VEX_W_0F3A05 */
7906 { "vpermilpd", { XM, EXx, Ib }, PREFIX_DATA },
7907 },
7908 {
7909 /* VEX_W_0F3A06_L_1 */
7910 { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7911 },
7912 {
7913 /* VEX_W_0F3A18_L_1 */
7914 { "vinsertf128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
7915 },
7916 {
7917 /* VEX_W_0F3A19_L_1 */
7918 { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
7919 },
7920 {
7921 /* VEX_W_0F3A1D */
7922 { "%XEvcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
7923 },
7924 {
7925 /* VEX_W_0F3A38_L_1 */
7926 { "vinserti128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
7927 },
7928 {
7929 /* VEX_W_0F3A39_L_1 */
7930 { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
7931 },
7932 {
7933 /* VEX_W_0F3A46_L_1 */
7934 { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7935 },
7936 {
7937 /* VEX_W_0F3A4A */
7938 { "vblendvps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7939 },
7940 {
7941 /* VEX_W_0F3A4B */
7942 { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7943 },
7944 {
7945 /* VEX_W_0F3A4C */
7946 { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
7947 },
7948 {
7949 /* VEX_W_0F3ACE */
7950 { Bad_Opcode },
7951 { "%XEvgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7952 },
7953 {
7954 /* VEX_W_0F3ACF */
7955 { Bad_Opcode },
7956 { "%XEvgf2p8affineinvqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
7957 },
7958 /* VEX_W_0FXOP_08_85_L_0 */
7959 {
7960 { "vpmacssww", { XM, Vex, EXx, XMVexI4 }, 0 },
7961 },
7962 /* VEX_W_0FXOP_08_86_L_0 */
7963 {
7964 { "vpmacsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7965 },
7966 /* VEX_W_0FXOP_08_87_L_0 */
7967 {
7968 { "vpmacssdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7969 },
7970 /* VEX_W_0FXOP_08_8E_L_0 */
7971 {
7972 { "vpmacssdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7973 },
7974 /* VEX_W_0FXOP_08_8F_L_0 */
7975 {
7976 { "vpmacssdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7977 },
7978 /* VEX_W_0FXOP_08_95_L_0 */
7979 {
7980 { "vpmacsww", { XM, Vex, EXx, XMVexI4 }, 0 },
7981 },
7982 /* VEX_W_0FXOP_08_96_L_0 */
7983 {
7984 { "vpmacswd", { XM, Vex, EXx, XMVexI4 }, 0 },
7985 },
7986 /* VEX_W_0FXOP_08_97_L_0 */
7987 {
7988 { "vpmacsdql", { XM, Vex, EXx, XMVexI4 }, 0 },
7989 },
7990 /* VEX_W_0FXOP_08_9E_L_0 */
7991 {
7992 { "vpmacsdd", { XM, Vex, EXx, XMVexI4 }, 0 },
7993 },
7994 /* VEX_W_0FXOP_08_9F_L_0 */
7995 {
7996 { "vpmacsdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
7997 },
7998 /* VEX_W_0FXOP_08_A6_L_0 */
7999 {
8000 { "vpmadcsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
8001 },
8002 /* VEX_W_0FXOP_08_B6_L_0 */
8003 {
8004 { "vpmadcswd", { XM, Vex, EXx, XMVexI4 }, 0 },
8005 },
8006 /* VEX_W_0FXOP_08_C0_L_0 */
8007 {
8008 { "vprotb", { XM, EXx, Ib }, 0 },
8009 },
8010 /* VEX_W_0FXOP_08_C1_L_0 */
8011 {
8012 { "vprotw", { XM, EXx, Ib }, 0 },
8013 },
8014 /* VEX_W_0FXOP_08_C2_L_0 */
8015 {
8016 { "vprotd", { XM, EXx, Ib }, 0 },
8017 },
8018 /* VEX_W_0FXOP_08_C3_L_0 */
8019 {
8020 { "vprotq", { XM, EXx, Ib }, 0 },
8021 },
8022 /* VEX_W_0FXOP_08_CC_L_0 */
8023 {
8024 { "vpcomb", { XM, Vex, EXx, VPCOM }, 0 },
8025 },
8026 /* VEX_W_0FXOP_08_CD_L_0 */
8027 {
8028 { "vpcomw", { XM, Vex, EXx, VPCOM }, 0 },
8029 },
8030 /* VEX_W_0FXOP_08_CE_L_0 */
8031 {
8032 { "vpcomd", { XM, Vex, EXx, VPCOM }, 0 },
8033 },
8034 /* VEX_W_0FXOP_08_CF_L_0 */
8035 {
8036 { "vpcomq", { XM, Vex, EXx, VPCOM }, 0 },
8037 },
8038 /* VEX_W_0FXOP_08_EC_L_0 */
8039 {
8040 { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
8041 },
8042 /* VEX_W_0FXOP_08_ED_L_0 */
8043 {
8044 { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
8045 },
8046 /* VEX_W_0FXOP_08_EE_L_0 */
8047 {
8048 { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
8049 },
8050 /* VEX_W_0FXOP_08_EF_L_0 */
8051 {
8052 { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
8053 },
8054 /* VEX_W_0FXOP_09_80 */
8055 {
8056 { "vfrczps", { XM, EXx }, 0 },
8057 },
8058 /* VEX_W_0FXOP_09_81 */
8059 {
8060 { "vfrczpd", { XM, EXx }, 0 },
8061 },
8062 /* VEX_W_0FXOP_09_82 */
8063 {
8064 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0) },
8065 },
8066 /* VEX_W_0FXOP_09_83 */
8067 {
8068 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0) },
8069 },
8070 /* VEX_W_0FXOP_09_C1_L_0 */
8071 {
8072 { "vphaddbw", { XM, EXxmm }, 0 },
8073 },
8074 /* VEX_W_0FXOP_09_C2_L_0 */
8075 {
8076 { "vphaddbd", { XM, EXxmm }, 0 },
8077 },
8078 /* VEX_W_0FXOP_09_C3_L_0 */
8079 {
8080 { "vphaddbq", { XM, EXxmm }, 0 },
8081 },
8082 /* VEX_W_0FXOP_09_C6_L_0 */
8083 {
8084 { "vphaddwd", { XM, EXxmm }, 0 },
8085 },
8086 /* VEX_W_0FXOP_09_C7_L_0 */
8087 {
8088 { "vphaddwq", { XM, EXxmm }, 0 },
8089 },
8090 /* VEX_W_0FXOP_09_CB_L_0 */
8091 {
8092 { "vphadddq", { XM, EXxmm }, 0 },
8093 },
8094 /* VEX_W_0FXOP_09_D1_L_0 */
8095 {
8096 { "vphaddubw", { XM, EXxmm }, 0 },
8097 },
8098 /* VEX_W_0FXOP_09_D2_L_0 */
8099 {
8100 { "vphaddubd", { XM, EXxmm }, 0 },
8101 },
8102 /* VEX_W_0FXOP_09_D3_L_0 */
8103 {
8104 { "vphaddubq", { XM, EXxmm }, 0 },
8105 },
8106 /* VEX_W_0FXOP_09_D6_L_0 */
8107 {
8108 { "vphadduwd", { XM, EXxmm }, 0 },
8109 },
8110 /* VEX_W_0FXOP_09_D7_L_0 */
8111 {
8112 { "vphadduwq", { XM, EXxmm }, 0 },
8113 },
8114 /* VEX_W_0FXOP_09_DB_L_0 */
8115 {
8116 { "vphaddudq", { XM, EXxmm }, 0 },
8117 },
8118 /* VEX_W_0FXOP_09_E1_L_0 */
8119 {
8120 { "vphsubbw", { XM, EXxmm }, 0 },
8121 },
8122 /* VEX_W_0FXOP_09_E2_L_0 */
8123 {
8124 { "vphsubwd", { XM, EXxmm }, 0 },
8125 },
8126 /* VEX_W_0FXOP_09_E3_L_0 */
8127 {
8128 { "vphsubdq", { XM, EXxmm }, 0 },
8129 },
8130
8131 #include "i386-dis-evex-w.h"
8132 };
8133
8134 static const struct dis386 mod_table[][2] = {
8135 {
8136 /* MOD_62_32BIT */
8137 { "bound{S|}", { Gv, Ma }, 0 },
8138 { EVEX_TABLE (EVEX_0F) },
8139 },
8140 {
8141 /* MOD_8D */
8142 { "leaS", { Gv, M }, 0 },
8143 },
8144 {
8145 /* MOD_C4_32BIT */
8146 { "lesS", { Gv, Mp }, 0 },
8147 { VEX_C4_TABLE (VEX_0F) },
8148 },
8149 {
8150 /* MOD_C5_32BIT */
8151 { "ldsS", { Gv, Mp }, 0 },
8152 { VEX_C5_TABLE (VEX_0F) },
8153 },
8154 {
8155 /* MOD_C6_REG_7 */
8156 { Bad_Opcode },
8157 { RM_TABLE (RM_C6_REG_7) },
8158 },
8159 {
8160 /* MOD_C7_REG_7 */
8161 { Bad_Opcode },
8162 { RM_TABLE (RM_C7_REG_7) },
8163 },
8164 {
8165 /* MOD_FF_REG_3 */
8166 { "{l|}call^", { indirEp }, 0 },
8167 },
8168 {
8169 /* MOD_FF_REG_5 */
8170 { "{l|}jmp^", { indirEp }, 0 },
8171 },
8172 {
8173 /* MOD_0F01_REG_0 */
8174 { X86_64_TABLE (X86_64_0F01_REG_0) },
8175 { RM_TABLE (RM_0F01_REG_0) },
8176 },
8177 {
8178 /* MOD_0F01_REG_1 */
8179 { X86_64_TABLE (X86_64_0F01_REG_1) },
8180 { RM_TABLE (RM_0F01_REG_1) },
8181 },
8182 {
8183 /* MOD_0F01_REG_2 */
8184 { X86_64_TABLE (X86_64_0F01_REG_2) },
8185 { RM_TABLE (RM_0F01_REG_2) },
8186 },
8187 {
8188 /* MOD_0F01_REG_3 */
8189 { X86_64_TABLE (X86_64_0F01_REG_3) },
8190 { RM_TABLE (RM_0F01_REG_3) },
8191 },
8192 {
8193 /* MOD_0F01_REG_5 */
8194 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
8195 { RM_TABLE (RM_0F01_REG_5_MOD_3) },
8196 },
8197 {
8198 /* MOD_0F01_REG_7 */
8199 { "invlpg", { Mb }, 0 },
8200 { RM_TABLE (RM_0F01_REG_7_MOD_3) },
8201 },
8202 {
8203 /* MOD_0F02 */
8204 { "larS", { Gv, Mw }, 0 },
8205 { "larS", { Gv, Ev }, 0 },
8206 },
8207 {
8208 /* MOD_0F03 */
8209 { "lslS", { Gv, Mw }, 0 },
8210 { "lslS", { Gv, Ev }, 0 },
8211 },
8212 {
8213 /* MOD_0F12_PREFIX_0 */
8214 { "movlpX", { XM, EXq }, 0 },
8215 { "movhlps", { XM, EXq }, 0 },
8216 },
8217 {
8218 /* MOD_0F12_PREFIX_2 */
8219 { "movlpX", { XM, EXq }, 0 },
8220 },
8221 {
8222 /* MOD_0F13 */
8223 { "movlpX", { EXq, XM }, PREFIX_OPCODE },
8224 },
8225 {
8226 /* MOD_0F16_PREFIX_0 */
8227 { "movhpX", { XM, EXq }, 0 },
8228 { "movlhps", { XM, EXq }, 0 },
8229 },
8230 {
8231 /* MOD_0F16_PREFIX_2 */
8232 { "movhpX", { XM, EXq }, 0 },
8233 },
8234 {
8235 /* MOD_0F17 */
8236 { "movhpX", { EXq, XM }, PREFIX_OPCODE },
8237 },
8238 {
8239 /* MOD_0F18_REG_0 */
8240 { "prefetchnta", { Mb }, 0 },
8241 { "nopQ", { Ev }, 0 },
8242 },
8243 {
8244 /* MOD_0F18_REG_1 */
8245 { "prefetcht0", { Mb }, 0 },
8246 { "nopQ", { Ev }, 0 },
8247 },
8248 {
8249 /* MOD_0F18_REG_2 */
8250 { "prefetcht1", { Mb }, 0 },
8251 { "nopQ", { Ev }, 0 },
8252 },
8253 {
8254 /* MOD_0F18_REG_3 */
8255 { "prefetcht2", { Mb }, 0 },
8256 { "nopQ", { Ev }, 0 },
8257 },
8258 {
8259 /* MOD_0F18_REG_6 */
8260 { X86_64_TABLE (X86_64_0F18_REG_6_MOD_0) },
8261 { "nopQ", { Ev }, 0 },
8262 },
8263 {
8264 /* MOD_0F18_REG_7 */
8265 { X86_64_TABLE (X86_64_0F18_REG_7_MOD_0) },
8266 { "nopQ", { Ev }, 0 },
8267 },
8268 {
8269 /* MOD_0F1A_PREFIX_0 */
8270 { "bndldx", { Gbnd, Mv_bnd }, 0 },
8271 { "nopQ", { Ev }, 0 },
8272 },
8273 {
8274 /* MOD_0F1B_PREFIX_0 */
8275 { "bndstx", { Mv_bnd, Gbnd }, 0 },
8276 { "nopQ", { Ev }, 0 },
8277 },
8278 {
8279 /* MOD_0F1B_PREFIX_1 */
8280 { "bndmk", { Gbnd, Mv_bnd }, 0 },
8281 { "nopQ", { Ev }, PREFIX_IGNORED },
8282 },
8283 {
8284 /* MOD_0F1C_PREFIX_0 */
8285 { REG_TABLE (REG_0F1C_P_0_MOD_0) },
8286 { "nopQ", { Ev }, 0 },
8287 },
8288 {
8289 /* MOD_0F1E_PREFIX_1 */
8290 { "nopQ", { Ev }, PREFIX_IGNORED },
8291 { REG_TABLE (REG_0F1E_P_1_MOD_3) },
8292 },
8293 {
8294 /* MOD_0F2B_PREFIX_0 */
8295 {"movntps", { Mx, XM }, PREFIX_OPCODE },
8296 },
8297 {
8298 /* MOD_0F2B_PREFIX_1 */
8299 {"movntss", { Md, XM }, PREFIX_OPCODE },
8300 },
8301 {
8302 /* MOD_0F2B_PREFIX_2 */
8303 {"movntpd", { Mx, XM }, PREFIX_OPCODE },
8304 },
8305 {
8306 /* MOD_0F2B_PREFIX_3 */
8307 {"movntsd", { Mq, XM }, PREFIX_OPCODE },
8308 },
8309 {
8310 /* MOD_0F50 */
8311 { Bad_Opcode },
8312 { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
8313 },
8314 {
8315 /* MOD_0F71 */
8316 { Bad_Opcode },
8317 { REG_TABLE (REG_0F71_MOD_0) },
8318 },
8319 {
8320 /* MOD_0F72 */
8321 { Bad_Opcode },
8322 { REG_TABLE (REG_0F72_MOD_0) },
8323 },
8324 {
8325 /* MOD_0F73 */
8326 { Bad_Opcode },
8327 { REG_TABLE (REG_0F73_MOD_0) },
8328 },
8329 {
8330 /* MOD_0FAE_REG_0 */
8331 { "fxsave", { FXSAVE }, 0 },
8332 { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
8333 },
8334 {
8335 /* MOD_0FAE_REG_1 */
8336 { "fxrstor", { FXSAVE }, 0 },
8337 { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
8338 },
8339 {
8340 /* MOD_0FAE_REG_2 */
8341 { "ldmxcsr", { Md }, 0 },
8342 { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
8343 },
8344 {
8345 /* MOD_0FAE_REG_3 */
8346 { "stmxcsr", { Md }, 0 },
8347 { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
8348 },
8349 {
8350 /* MOD_0FAE_REG_4 */
8351 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
8352 { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
8353 },
8354 {
8355 /* MOD_0FAE_REG_5 */
8356 { "xrstor", { FXSAVE }, PREFIX_OPCODE },
8357 { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
8358 },
8359 {
8360 /* MOD_0FAE_REG_6 */
8361 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
8362 { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
8363 },
8364 {
8365 /* MOD_0FAE_REG_7 */
8366 { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
8367 { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
8368 },
8369 {
8370 /* MOD_0FB2 */
8371 { "lssS", { Gv, Mp }, 0 },
8372 },
8373 {
8374 /* MOD_0FB4 */
8375 { "lfsS", { Gv, Mp }, 0 },
8376 },
8377 {
8378 /* MOD_0FB5 */
8379 { "lgsS", { Gv, Mp }, 0 },
8380 },
8381 {
8382 /* MOD_0FC3 */
8383 { "movntiS", { Edq, Gdq }, PREFIX_OPCODE },
8384 },
8385 {
8386 /* MOD_0FC7_REG_3 */
8387 { "xrstors", { FXSAVE }, 0 },
8388 },
8389 {
8390 /* MOD_0FC7_REG_4 */
8391 { "xsavec", { FXSAVE }, 0 },
8392 },
8393 {
8394 /* MOD_0FC7_REG_5 */
8395 { "xsaves", { FXSAVE }, 0 },
8396 },
8397 {
8398 /* MOD_0FC7_REG_6 */
8399 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
8400 { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
8401 },
8402 {
8403 /* MOD_0FC7_REG_7 */
8404 { "vmptrst", { Mq }, 0 },
8405 { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
8406 },
8407 {
8408 /* MOD_0FD7 */
8409 { Bad_Opcode },
8410 { "pmovmskb", { Gdq, MS }, 0 },
8411 },
8412 {
8413 /* MOD_0FE7_PREFIX_2 */
8414 { "movntdq", { Mx, XM }, 0 },
8415 },
8416 {
8417 /* MOD_0FF0_PREFIX_3 */
8418 { "lddqu", { XM, M }, 0 },
8419 },
8420 {
8421 /* MOD_0F382A */
8422 { "movntdqa", { XM, Mx }, PREFIX_DATA },
8423 },
8424 {
8425 /* MOD_0F38DC_PREFIX_1 */
8426 { "aesenc128kl", { XM, M }, 0 },
8427 { "loadiwkey", { XM, EXx }, 0 },
8428 },
8429 {
8430 /* MOD_0F38DD_PREFIX_1 */
8431 { "aesdec128kl", { XM, M }, 0 },
8432 },
8433 {
8434 /* MOD_0F38DE_PREFIX_1 */
8435 { "aesenc256kl", { XM, M }, 0 },
8436 },
8437 {
8438 /* MOD_0F38DF_PREFIX_1 */
8439 { "aesdec256kl", { XM, M }, 0 },
8440 },
8441 {
8442 /* MOD_0F38F5 */
8443 { "wrussK", { M, Gdq }, PREFIX_DATA },
8444 },
8445 {
8446 /* MOD_0F38F6_PREFIX_0 */
8447 { "wrssK", { M, Gdq }, PREFIX_OPCODE },
8448 },
8449 {
8450 /* MOD_0F38F8_PREFIX_1 */
8451 { "enqcmds", { Gva, M }, PREFIX_OPCODE },
8452 },
8453 {
8454 /* MOD_0F38F8_PREFIX_2 */
8455 { "movdir64b", { Gva, M }, PREFIX_OPCODE },
8456 },
8457 {
8458 /* MOD_0F38F8_PREFIX_3 */
8459 { "enqcmd", { Gva, M }, PREFIX_OPCODE },
8460 },
8461 {
8462 /* MOD_0F38F9 */
8463 { "movdiri", { Edq, Gdq }, PREFIX_OPCODE },
8464 },
8465 {
8466 /* MOD_0F38FA_PREFIX_1 */
8467 { Bad_Opcode },
8468 { "encodekey128", { Gd, Ed }, 0 },
8469 },
8470 {
8471 /* MOD_0F38FB_PREFIX_1 */
8472 { Bad_Opcode },
8473 { "encodekey256", { Gd, Ed }, 0 },
8474 },
8475 {
8476 /* MOD_0F3A0F_PREFIX_1 */
8477 { Bad_Opcode },
8478 { REG_TABLE (REG_0F3A0F_PREFIX_1_MOD_3) },
8479 },
8480 {
8481 /* MOD_VEX_0F12_PREFIX_0 */
8482 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
8483 { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
8484 },
8485 {
8486 /* MOD_VEX_0F12_PREFIX_2 */
8487 { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0) },
8488 },
8489 {
8490 /* MOD_VEX_0F13 */
8491 { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
8492 },
8493 {
8494 /* MOD_VEX_0F16_PREFIX_0 */
8495 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
8496 { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
8497 },
8498 {
8499 /* MOD_VEX_0F16_PREFIX_2 */
8500 { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0) },
8501 },
8502 {
8503 /* MOD_VEX_0F17 */
8504 { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
8505 },
8506 {
8507 /* MOD_VEX_0F2B */
8508 { "%XEvmovntpX", { Mx, XM }, PREFIX_OPCODE },
8509 },
8510 {
8511 /* MOD_VEX_0F41_L_1 */
8512 { Bad_Opcode },
8513 { VEX_W_TABLE (VEX_W_0F41_L_1_M_1) },
8514 },
8515 {
8516 /* MOD_VEX_0F42_L_1 */
8517 { Bad_Opcode },
8518 { VEX_W_TABLE (VEX_W_0F42_L_1_M_1) },
8519 },
8520 {
8521 /* MOD_VEX_0F44_L_0 */
8522 { Bad_Opcode },
8523 { VEX_W_TABLE (VEX_W_0F44_L_0_M_1) },
8524 },
8525 {
8526 /* MOD_VEX_0F45_L_1 */
8527 { Bad_Opcode },
8528 { VEX_W_TABLE (VEX_W_0F45_L_1_M_1) },
8529 },
8530 {
8531 /* MOD_VEX_0F46_L_1 */
8532 { Bad_Opcode },
8533 { VEX_W_TABLE (VEX_W_0F46_L_1_M_1) },
8534 },
8535 {
8536 /* MOD_VEX_0F47_L_1 */
8537 { Bad_Opcode },
8538 { VEX_W_TABLE (VEX_W_0F47_L_1_M_1) },
8539 },
8540 {
8541 /* MOD_VEX_0F4A_L_1 */
8542 { Bad_Opcode },
8543 { VEX_W_TABLE (VEX_W_0F4A_L_1_M_1) },
8544 },
8545 {
8546 /* MOD_VEX_0F4B_L_1 */
8547 { Bad_Opcode },
8548 { VEX_W_TABLE (VEX_W_0F4B_L_1_M_1) },
8549 },
8550 {
8551 /* MOD_VEX_0F50 */
8552 { Bad_Opcode },
8553 { "vmovmskpX", { Gdq, XS }, PREFIX_OPCODE },
8554 },
8555 {
8556 /* MOD_VEX_0F71 */
8557 { Bad_Opcode },
8558 { REG_TABLE (REG_VEX_0F71_M_0) },
8559 },
8560 {
8561 /* MOD_VEX_0F72 */
8562 { Bad_Opcode },
8563 { REG_TABLE (REG_VEX_0F72_M_0) },
8564 },
8565 {
8566 /* MOD_VEX_0F73 */
8567 { Bad_Opcode },
8568 { REG_TABLE (REG_VEX_0F73_M_0) },
8569 },
8570 {
8571 /* MOD_VEX_0F91_L_0 */
8572 { VEX_W_TABLE (VEX_W_0F91_L_0_M_0) },
8573 },
8574 {
8575 /* MOD_VEX_0F92_L_0 */
8576 { Bad_Opcode },
8577 { VEX_W_TABLE (VEX_W_0F92_L_0_M_1) },
8578 },
8579 {
8580 /* MOD_VEX_0F93_L_0 */
8581 { Bad_Opcode },
8582 { VEX_W_TABLE (VEX_W_0F93_L_0_M_1) },
8583 },
8584 {
8585 /* MOD_VEX_0F98_L_0 */
8586 { Bad_Opcode },
8587 { VEX_W_TABLE (VEX_W_0F98_L_0_M_1) },
8588 },
8589 {
8590 /* MOD_VEX_0F99_L_0 */
8591 { Bad_Opcode },
8592 { VEX_W_TABLE (VEX_W_0F99_L_0_M_1) },
8593 },
8594 {
8595 /* MOD_VEX_0FAE_REG_2 */
8596 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
8597 },
8598 {
8599 /* MOD_VEX_0FAE_REG_3 */
8600 { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
8601 },
8602 {
8603 /* MOD_VEX_0FD7 */
8604 { Bad_Opcode },
8605 { "vpmovmskb", { Gdq, XS }, PREFIX_DATA },
8606 },
8607 {
8608 /* MOD_VEX_0FE7 */
8609 { "vmovntdq", { Mx, XM }, PREFIX_DATA },
8610 },
8611 {
8612 /* MOD_VEX_0FF0_PREFIX_3 */
8613 { "vlddqu", { XM, M }, 0 },
8614 },
8615 {
8616 /* MOD_VEX_0F381A */
8617 { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0) },
8618 },
8619 {
8620 /* MOD_VEX_0F382A */
8621 { "vmovntdqa", { XM, Mx }, PREFIX_DATA },
8622 },
8623 {
8624 /* MOD_VEX_0F382C */
8625 { VEX_W_TABLE (VEX_W_0F382C_M_0) },
8626 },
8627 {
8628 /* MOD_VEX_0F382D */
8629 { VEX_W_TABLE (VEX_W_0F382D_M_0) },
8630 },
8631 {
8632 /* MOD_VEX_0F382E */
8633 { VEX_W_TABLE (VEX_W_0F382E_M_0) },
8634 },
8635 {
8636 /* MOD_VEX_0F382F */
8637 { VEX_W_TABLE (VEX_W_0F382F_M_0) },
8638 },
8639 {
8640 /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
8641 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0) },
8642 { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1) },
8643 },
8644 {
8645 /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
8646 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0) },
8647 },
8648 {
8649 /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
8650 { Bad_Opcode },
8651 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0) },
8652 },
8653 {
8654 /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
8655 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0) },
8656 },
8657 {
8658 /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
8659 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0) },
8660 },
8661 {
8662 /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
8663 { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0) },
8664 },
8665 {
8666 /* MOD_VEX_0F385A */
8667 { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0) },
8668 },
8669 {
8670 /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
8671 { Bad_Opcode },
8672 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0) },
8673 },
8674 {
8675 /* MOD_VEX_0F385C_X86_64_P_3_W_0 */
8676 { Bad_Opcode },
8677 { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_3_W_0_M_0) },
8678 },
8679 {
8680 /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
8681 { Bad_Opcode },
8682 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0) },
8683 },
8684 {
8685 /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
8686 { Bad_Opcode },
8687 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0) },
8688 },
8689 {
8690 /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
8691 { Bad_Opcode },
8692 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0) },
8693 },
8694 {
8695 /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
8696 { Bad_Opcode },
8697 { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0) },
8698 },
8699 {
8700 /* MOD_VEX_0F388C */
8701 { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
8702 },
8703 {
8704 /* MOD_VEX_0F388E */
8705 { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
8706 },
8707 {
8708 /* MOD_VEX_0F3A30_L_0 */
8709 { Bad_Opcode },
8710 { "kshiftr%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
8711 },
8712 {
8713 /* MOD_VEX_0F3A31_L_0 */
8714 { Bad_Opcode },
8715 { "kshiftr%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
8716 },
8717 {
8718 /* MOD_VEX_0F3A32_L_0 */
8719 { Bad_Opcode },
8720 { "kshiftl%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
8721 },
8722 {
8723 /* MOD_VEX_0F3A33_L_0 */
8724 { Bad_Opcode },
8725 { "kshiftl%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
8726 },
8727 {
8728 /* MOD_XOP_09_12 */
8729 { Bad_Opcode },
8730 { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1) },
8731 },
8732
8733 #include "i386-dis-evex-mod.h"
8734 };
8735
8736 static const struct dis386 rm_table[][8] = {
8737 {
8738 /* RM_C6_REG_7 */
8739 { "xabort", { Skip_MODRM, Ib }, 0 },
8740 },
8741 {
8742 /* RM_C7_REG_7 */
8743 { "xbeginT", { Skip_MODRM, Jdqw }, 0 },
8744 },
8745 {
8746 /* RM_0F01_REG_0 */
8747 { "enclv", { Skip_MODRM }, 0 },
8748 { "vmcall", { Skip_MODRM }, 0 },
8749 { "vmlaunch", { Skip_MODRM }, 0 },
8750 { "vmresume", { Skip_MODRM }, 0 },
8751 { "vmxoff", { Skip_MODRM }, 0 },
8752 { "pconfig", { Skip_MODRM }, 0 },
8753 { PREFIX_TABLE (PREFIX_0F01_REG_0_MOD_3_RM_6) },
8754 },
8755 {
8756 /* RM_0F01_REG_1 */
8757 { "monitor", { { OP_Monitor, 0 } }, 0 },
8758 { "mwait", { { OP_Mwait, 0 } }, 0 },
8759 { "clac", { Skip_MODRM }, 0 },
8760 { "stac", { Skip_MODRM }, 0 },
8761 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4) },
8762 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5) },
8763 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6) },
8764 { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7) },
8765 },
8766 {
8767 /* RM_0F01_REG_2 */
8768 { "xgetbv", { Skip_MODRM }, 0 },
8769 { "xsetbv", { Skip_MODRM }, 0 },
8770 { Bad_Opcode },
8771 { Bad_Opcode },
8772 { "vmfunc", { Skip_MODRM }, 0 },
8773 { "xend", { Skip_MODRM }, 0 },
8774 { "xtest", { Skip_MODRM }, 0 },
8775 { "enclu", { Skip_MODRM }, 0 },
8776 },
8777 {
8778 /* RM_0F01_REG_3 */
8779 { "vmrun", { Skip_MODRM }, 0 },
8780 { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
8781 { "vmload", { Skip_MODRM }, 0 },
8782 { "vmsave", { Skip_MODRM }, 0 },
8783 { "stgi", { Skip_MODRM }, 0 },
8784 { "clgi", { Skip_MODRM }, 0 },
8785 { "skinit", { Skip_MODRM }, 0 },
8786 { "invlpga", { Skip_MODRM }, 0 },
8787 },
8788 {
8789 /* RM_0F01_REG_5_MOD_3 */
8790 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
8791 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
8792 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
8793 { Bad_Opcode },
8794 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4) },
8795 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5) },
8796 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6) },
8797 { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7) },
8798 },
8799 {
8800 /* RM_0F01_REG_7_MOD_3 */
8801 { "swapgs", { Skip_MODRM }, 0 },
8802 { "rdtscp", { Skip_MODRM }, 0 },
8803 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
8804 { "mwaitx", { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
8805 { "clzero", { Skip_MODRM }, 0 },
8806 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_5) },
8807 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6) },
8808 { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7) },
8809 },
8810 {
8811 /* RM_0F1E_P_1_MOD_3_REG_7 */
8812 { "nopQ", { Ev }, PREFIX_IGNORED },
8813 { "nopQ", { Ev }, PREFIX_IGNORED },
8814 { "endbr64", { Skip_MODRM }, 0 },
8815 { "endbr32", { Skip_MODRM }, 0 },
8816 { "nopQ", { Ev }, PREFIX_IGNORED },
8817 { "nopQ", { Ev }, PREFIX_IGNORED },
8818 { "nopQ", { Ev }, PREFIX_IGNORED },
8819 { "nopQ", { Ev }, PREFIX_IGNORED },
8820 },
8821 {
8822 /* RM_0FAE_REG_6_MOD_3 */
8823 { "mfence", { Skip_MODRM }, 0 },
8824 },
8825 {
8826 /* RM_0FAE_REG_7_MOD_3 */
8827 { "sfence", { Skip_MODRM }, 0 },
8828 },
8829 {
8830 /* RM_0F3A0F_P_1_MOD_3_REG_0 */
8831 { "hreset", { Skip_MODRM, Ib }, 0 },
8832 },
8833 {
8834 /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
8835 { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0) },
8836 },
8837 };
8838
8839 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
8840
8841 /* The values used here must be non-zero, fit in 'unsigned char', and not be
8842 in conflict with actual prefix opcodes. */
8843 #define REP_PREFIX 0x01
8844 #define XACQUIRE_PREFIX 0x02
8845 #define XRELEASE_PREFIX 0x03
8846 #define BND_PREFIX 0x04
8847 #define NOTRACK_PREFIX 0x05
8848
8849 static int
8850 ckprefix (instr_info *ins)
8851 {
8852 int newrex, i, length;
8853
8854 i = 0;
8855 length = 0;
8856 /* The maximum instruction length is 15bytes. */
8857 while (length < MAX_CODE_LENGTH - 1)
8858 {
8859 FETCH_DATA (ins->info, ins->codep + 1);
8860 newrex = 0;
8861 switch (*ins->codep)
8862 {
8863 /* REX prefixes family. */
8864 case 0x40:
8865 case 0x41:
8866 case 0x42:
8867 case 0x43:
8868 case 0x44:
8869 case 0x45:
8870 case 0x46:
8871 case 0x47:
8872 case 0x48:
8873 case 0x49:
8874 case 0x4a:
8875 case 0x4b:
8876 case 0x4c:
8877 case 0x4d:
8878 case 0x4e:
8879 case 0x4f:
8880 if (ins->address_mode == mode_64bit)
8881 newrex = *ins->codep;
8882 else
8883 return 1;
8884 ins->last_rex_prefix = i;
8885 break;
8886 case 0xf3:
8887 ins->prefixes |= PREFIX_REPZ;
8888 ins->last_repz_prefix = i;
8889 break;
8890 case 0xf2:
8891 ins->prefixes |= PREFIX_REPNZ;
8892 ins->last_repnz_prefix = i;
8893 break;
8894 case 0xf0:
8895 ins->prefixes |= PREFIX_LOCK;
8896 ins->last_lock_prefix = i;
8897 break;
8898 case 0x2e:
8899 ins->prefixes |= PREFIX_CS;
8900 ins->last_seg_prefix = i;
8901 if (ins->address_mode != mode_64bit)
8902 ins->active_seg_prefix = PREFIX_CS;
8903 break;
8904 case 0x36:
8905 ins->prefixes |= PREFIX_SS;
8906 ins->last_seg_prefix = i;
8907 if (ins->address_mode != mode_64bit)
8908 ins->active_seg_prefix = PREFIX_SS;
8909 break;
8910 case 0x3e:
8911 ins->prefixes |= PREFIX_DS;
8912 ins->last_seg_prefix = i;
8913 if (ins->address_mode != mode_64bit)
8914 ins->active_seg_prefix = PREFIX_DS;
8915 break;
8916 case 0x26:
8917 ins->prefixes |= PREFIX_ES;
8918 ins->last_seg_prefix = i;
8919 if (ins->address_mode != mode_64bit)
8920 ins->active_seg_prefix = PREFIX_ES;
8921 break;
8922 case 0x64:
8923 ins->prefixes |= PREFIX_FS;
8924 ins->last_seg_prefix = i;
8925 ins->active_seg_prefix = PREFIX_FS;
8926 break;
8927 case 0x65:
8928 ins->prefixes |= PREFIX_GS;
8929 ins->last_seg_prefix = i;
8930 ins->active_seg_prefix = PREFIX_GS;
8931 break;
8932 case 0x66:
8933 ins->prefixes |= PREFIX_DATA;
8934 ins->last_data_prefix = i;
8935 break;
8936 case 0x67:
8937 ins->prefixes |= PREFIX_ADDR;
8938 ins->last_addr_prefix = i;
8939 break;
8940 case FWAIT_OPCODE:
8941 /* fwait is really an instruction. If there are prefixes
8942 before the fwait, they belong to the fwait, *not* to the
8943 following instruction. */
8944 ins->fwait_prefix = i;
8945 if (ins->prefixes || ins->rex)
8946 {
8947 ins->prefixes |= PREFIX_FWAIT;
8948 ins->codep++;
8949 /* This ensures that the previous REX prefixes are noticed
8950 as unused prefixes, as in the return case below. */
8951 ins->rex_used = ins->rex;
8952 return 1;
8953 }
8954 ins->prefixes = PREFIX_FWAIT;
8955 break;
8956 default:
8957 return 1;
8958 }
8959 /* Rex is ignored when followed by another prefix. */
8960 if (ins->rex)
8961 {
8962 ins->rex_used = ins->rex;
8963 return 1;
8964 }
8965 if (*ins->codep != FWAIT_OPCODE)
8966 ins->all_prefixes[i++] = *ins->codep;
8967 ins->rex = newrex;
8968 ins->codep++;
8969 length++;
8970 }
8971 return 0;
8972 }
8973
8974 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
8975 prefix byte. */
8976
8977 static const char *
8978 prefix_name (instr_info *ins, int pref, int sizeflag)
8979 {
8980 static const char *rexes [16] =
8981 {
8982 "rex", /* 0x40 */
8983 "rex.B", /* 0x41 */
8984 "rex.X", /* 0x42 */
8985 "rex.XB", /* 0x43 */
8986 "rex.R", /* 0x44 */
8987 "rex.RB", /* 0x45 */
8988 "rex.RX", /* 0x46 */
8989 "rex.RXB", /* 0x47 */
8990 "rex.W", /* 0x48 */
8991 "rex.WB", /* 0x49 */
8992 "rex.WX", /* 0x4a */
8993 "rex.WXB", /* 0x4b */
8994 "rex.WR", /* 0x4c */
8995 "rex.WRB", /* 0x4d */
8996 "rex.WRX", /* 0x4e */
8997 "rex.WRXB", /* 0x4f */
8998 };
8999
9000 switch (pref)
9001 {
9002 /* REX prefixes family. */
9003 case 0x40:
9004 case 0x41:
9005 case 0x42:
9006 case 0x43:
9007 case 0x44:
9008 case 0x45:
9009 case 0x46:
9010 case 0x47:
9011 case 0x48:
9012 case 0x49:
9013 case 0x4a:
9014 case 0x4b:
9015 case 0x4c:
9016 case 0x4d:
9017 case 0x4e:
9018 case 0x4f:
9019 return rexes [pref - 0x40];
9020 case 0xf3:
9021 return "repz";
9022 case 0xf2:
9023 return "repnz";
9024 case 0xf0:
9025 return "lock";
9026 case 0x2e:
9027 return "cs";
9028 case 0x36:
9029 return "ss";
9030 case 0x3e:
9031 return "ds";
9032 case 0x26:
9033 return "es";
9034 case 0x64:
9035 return "fs";
9036 case 0x65:
9037 return "gs";
9038 case 0x66:
9039 return (sizeflag & DFLAG) ? "data16" : "data32";
9040 case 0x67:
9041 if (ins->address_mode == mode_64bit)
9042 return (sizeflag & AFLAG) ? "addr32" : "addr64";
9043 else
9044 return (sizeflag & AFLAG) ? "addr16" : "addr32";
9045 case FWAIT_OPCODE:
9046 return "fwait";
9047 case REP_PREFIX:
9048 return "rep";
9049 case XACQUIRE_PREFIX:
9050 return "xacquire";
9051 case XRELEASE_PREFIX:
9052 return "xrelease";
9053 case BND_PREFIX:
9054 return "bnd";
9055 case NOTRACK_PREFIX:
9056 return "notrack";
9057 default:
9058 return NULL;
9059 }
9060 }
9061
9062 void
9063 print_i386_disassembler_options (FILE *stream)
9064 {
9065 fprintf (stream, _("\n\
9066 The following i386/x86-64 specific disassembler options are supported for use\n\
9067 with the -M switch (multiple options should be separated by commas):\n"));
9068
9069 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
9070 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
9071 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
9072 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
9073 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
9074 fprintf (stream, _(" att-mnemonic\n"
9075 " Display instruction in AT&T mnemonic\n"));
9076 fprintf (stream, _(" intel-mnemonic\n"
9077 " Display instruction in Intel mnemonic\n"));
9078 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
9079 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
9080 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
9081 fprintf (stream, _(" data32 Assume 32bit data size\n"));
9082 fprintf (stream, _(" data16 Assume 16bit data size\n"));
9083 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
9084 fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
9085 fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
9086 }
9087
9088 /* Bad opcode. */
9089 static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
9090
9091 /* Get a pointer to struct dis386 with a valid name. */
9092
9093 static const struct dis386 *
9094 get_valid_dis386 (const struct dis386 *dp, instr_info *ins)
9095 {
9096 int vindex, vex_table_index;
9097
9098 if (dp->name != NULL)
9099 return dp;
9100
9101 switch (dp->op[0].bytemode)
9102 {
9103 case USE_REG_TABLE:
9104 dp = &reg_table[dp->op[1].bytemode][ins->modrm.reg];
9105 break;
9106
9107 case USE_MOD_TABLE:
9108 vindex = ins->modrm.mod == 0x3 ? 1 : 0;
9109 dp = &mod_table[dp->op[1].bytemode][vindex];
9110 break;
9111
9112 case USE_RM_TABLE:
9113 dp = &rm_table[dp->op[1].bytemode][ins->modrm.rm];
9114 break;
9115
9116 case USE_PREFIX_TABLE:
9117 if (ins->need_vex)
9118 {
9119 /* The prefix in VEX is implicit. */
9120 switch (ins->vex.prefix)
9121 {
9122 case 0:
9123 vindex = 0;
9124 break;
9125 case REPE_PREFIX_OPCODE:
9126 vindex = 1;
9127 break;
9128 case DATA_PREFIX_OPCODE:
9129 vindex = 2;
9130 break;
9131 case REPNE_PREFIX_OPCODE:
9132 vindex = 3;
9133 break;
9134 default:
9135 abort ();
9136 break;
9137 }
9138 }
9139 else
9140 {
9141 int last_prefix = -1;
9142 int prefix = 0;
9143 vindex = 0;
9144 /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
9145 When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
9146 last one wins. */
9147 if ((ins->prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
9148 {
9149 if (ins->last_repz_prefix > ins->last_repnz_prefix)
9150 {
9151 vindex = 1;
9152 prefix = PREFIX_REPZ;
9153 last_prefix = ins->last_repz_prefix;
9154 }
9155 else
9156 {
9157 vindex = 3;
9158 prefix = PREFIX_REPNZ;
9159 last_prefix = ins->last_repnz_prefix;
9160 }
9161
9162 /* Check if prefix should be ignored. */
9163 if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
9164 & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
9165 & prefix) != 0
9166 && !prefix_table[dp->op[1].bytemode][vindex].name)
9167 vindex = 0;
9168 }
9169
9170 if (vindex == 0 && (ins->prefixes & PREFIX_DATA) != 0)
9171 {
9172 vindex = 2;
9173 prefix = PREFIX_DATA;
9174 last_prefix = ins->last_data_prefix;
9175 }
9176
9177 if (vindex != 0)
9178 {
9179 ins->used_prefixes |= prefix;
9180 ins->all_prefixes[last_prefix] = 0;
9181 }
9182 }
9183 dp = &prefix_table[dp->op[1].bytemode][vindex];
9184 break;
9185
9186 case USE_X86_64_TABLE:
9187 vindex = ins->address_mode == mode_64bit ? 1 : 0;
9188 dp = &x86_64_table[dp->op[1].bytemode][vindex];
9189 break;
9190
9191 case USE_3BYTE_TABLE:
9192 FETCH_DATA (ins->info, ins->codep + 2);
9193 vindex = *ins->codep++;
9194 dp = &three_byte_table[dp->op[1].bytemode][vindex];
9195 ins->end_codep = ins->codep;
9196 ins->modrm.mod = (*ins->codep >> 6) & 3;
9197 ins->modrm.reg = (*ins->codep >> 3) & 7;
9198 ins->modrm.rm = *ins->codep & 7;
9199 break;
9200
9201 case USE_VEX_LEN_TABLE:
9202 if (!ins->need_vex)
9203 abort ();
9204
9205 switch (ins->vex.length)
9206 {
9207 case 128:
9208 vindex = 0;
9209 break;
9210 case 512:
9211 /* This allows re-using in particular table entries where only
9212 128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid. */
9213 if (ins->vex.evex)
9214 {
9215 case 256:
9216 vindex = 1;
9217 break;
9218 }
9219 /* Fall through. */
9220 default:
9221 abort ();
9222 break;
9223 }
9224
9225 dp = &vex_len_table[dp->op[1].bytemode][vindex];
9226 break;
9227
9228 case USE_EVEX_LEN_TABLE:
9229 if (!ins->vex.evex)
9230 abort ();
9231
9232 switch (ins->vex.length)
9233 {
9234 case 128:
9235 vindex = 0;
9236 break;
9237 case 256:
9238 vindex = 1;
9239 break;
9240 case 512:
9241 vindex = 2;
9242 break;
9243 default:
9244 abort ();
9245 break;
9246 }
9247
9248 dp = &evex_len_table[dp->op[1].bytemode][vindex];
9249 break;
9250
9251 case USE_XOP_8F_TABLE:
9252 FETCH_DATA (ins->info, ins->codep + 3);
9253 ins->rex = ~(*ins->codep >> 5) & 0x7;
9254
9255 /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
9256 switch ((*ins->codep & 0x1f))
9257 {
9258 default:
9259 dp = &bad_opcode;
9260 return dp;
9261 case 0x8:
9262 vex_table_index = XOP_08;
9263 break;
9264 case 0x9:
9265 vex_table_index = XOP_09;
9266 break;
9267 case 0xa:
9268 vex_table_index = XOP_0A;
9269 break;
9270 }
9271 ins->codep++;
9272 ins->vex.w = *ins->codep & 0x80;
9273 if (ins->vex.w && ins->address_mode == mode_64bit)
9274 ins->rex |= REX_W;
9275
9276 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9277 if (ins->address_mode != mode_64bit)
9278 {
9279 /* In 16/32-bit mode REX_B is silently ignored. */
9280 ins->rex &= ~REX_B;
9281 }
9282
9283 ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9284 switch ((*ins->codep & 0x3))
9285 {
9286 case 0:
9287 break;
9288 case 1:
9289 ins->vex.prefix = DATA_PREFIX_OPCODE;
9290 break;
9291 case 2:
9292 ins->vex.prefix = REPE_PREFIX_OPCODE;
9293 break;
9294 case 3:
9295 ins->vex.prefix = REPNE_PREFIX_OPCODE;
9296 break;
9297 }
9298 ins->need_vex = true;
9299 ins->codep++;
9300 vindex = *ins->codep++;
9301 dp = &xop_table[vex_table_index][vindex];
9302
9303 ins->end_codep = ins->codep;
9304 FETCH_DATA (ins->info, ins->codep + 1);
9305 ins->modrm.mod = (*ins->codep >> 6) & 3;
9306 ins->modrm.reg = (*ins->codep >> 3) & 7;
9307 ins->modrm.rm = *ins->codep & 7;
9308
9309 /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
9310 having to decode the bits for every otherwise valid encoding. */
9311 if (ins->vex.prefix)
9312 return &bad_opcode;
9313 break;
9314
9315 case USE_VEX_C4_TABLE:
9316 /* VEX prefix. */
9317 FETCH_DATA (ins->info, ins->codep + 3);
9318 ins->rex = ~(*ins->codep >> 5) & 0x7;
9319 switch ((*ins->codep & 0x1f))
9320 {
9321 default:
9322 dp = &bad_opcode;
9323 return dp;
9324 case 0x1:
9325 vex_table_index = VEX_0F;
9326 break;
9327 case 0x2:
9328 vex_table_index = VEX_0F38;
9329 break;
9330 case 0x3:
9331 vex_table_index = VEX_0F3A;
9332 break;
9333 }
9334 ins->codep++;
9335 ins->vex.w = *ins->codep & 0x80;
9336 if (ins->address_mode == mode_64bit)
9337 {
9338 if (ins->vex.w)
9339 ins->rex |= REX_W;
9340 }
9341 else
9342 {
9343 /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
9344 is ignored, other REX bits are 0 and the highest bit in
9345 VEX.vvvv is also ignored (but we mustn't clear it here). */
9346 ins->rex = 0;
9347 }
9348 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9349 ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9350 switch ((*ins->codep & 0x3))
9351 {
9352 case 0:
9353 break;
9354 case 1:
9355 ins->vex.prefix = DATA_PREFIX_OPCODE;
9356 break;
9357 case 2:
9358 ins->vex.prefix = REPE_PREFIX_OPCODE;
9359 break;
9360 case 3:
9361 ins->vex.prefix = REPNE_PREFIX_OPCODE;
9362 break;
9363 }
9364 ins->need_vex = true;
9365 ins->codep++;
9366 vindex = *ins->codep++;
9367 dp = &vex_table[vex_table_index][vindex];
9368 ins->end_codep = ins->codep;
9369 /* There is no MODRM byte for VEX0F 77. */
9370 if (vex_table_index != VEX_0F || vindex != 0x77)
9371 {
9372 FETCH_DATA (ins->info, ins->codep + 1);
9373 ins->modrm.mod = (*ins->codep >> 6) & 3;
9374 ins->modrm.reg = (*ins->codep >> 3) & 7;
9375 ins->modrm.rm = *ins->codep & 7;
9376 }
9377 break;
9378
9379 case USE_VEX_C5_TABLE:
9380 /* VEX prefix. */
9381 FETCH_DATA (ins->info, ins->codep + 2);
9382 ins->rex = (*ins->codep & 0x80) ? 0 : REX_R;
9383
9384 /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
9385 VEX.vvvv is 1. */
9386 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9387 ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
9388 switch ((*ins->codep & 0x3))
9389 {
9390 case 0:
9391 break;
9392 case 1:
9393 ins->vex.prefix = DATA_PREFIX_OPCODE;
9394 break;
9395 case 2:
9396 ins->vex.prefix = REPE_PREFIX_OPCODE;
9397 break;
9398 case 3:
9399 ins->vex.prefix = REPNE_PREFIX_OPCODE;
9400 break;
9401 }
9402 ins->need_vex = true;
9403 ins->codep++;
9404 vindex = *ins->codep++;
9405 dp = &vex_table[dp->op[1].bytemode][vindex];
9406 ins->end_codep = ins->codep;
9407 /* There is no MODRM byte for VEX 77. */
9408 if (vindex != 0x77)
9409 {
9410 FETCH_DATA (ins->info, ins->codep + 1);
9411 ins->modrm.mod = (*ins->codep >> 6) & 3;
9412 ins->modrm.reg = (*ins->codep >> 3) & 7;
9413 ins->modrm.rm = *ins->codep & 7;
9414 }
9415 break;
9416
9417 case USE_VEX_W_TABLE:
9418 if (!ins->need_vex)
9419 abort ();
9420
9421 dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w];
9422 break;
9423
9424 case USE_EVEX_TABLE:
9425 ins->two_source_ops = false;
9426 /* EVEX prefix. */
9427 ins->vex.evex = true;
9428 FETCH_DATA (ins->info, ins->codep + 4);
9429 /* The first byte after 0x62. */
9430 ins->rex = ~(*ins->codep >> 5) & 0x7;
9431 ins->vex.r = *ins->codep & 0x10;
9432 switch ((*ins->codep & 0xf))
9433 {
9434 default:
9435 return &bad_opcode;
9436 case 0x1:
9437 vex_table_index = EVEX_0F;
9438 break;
9439 case 0x2:
9440 vex_table_index = EVEX_0F38;
9441 break;
9442 case 0x3:
9443 vex_table_index = EVEX_0F3A;
9444 break;
9445 case 0x5:
9446 vex_table_index = EVEX_MAP5;
9447 break;
9448 case 0x6:
9449 vex_table_index = EVEX_MAP6;
9450 break;
9451 }
9452
9453 /* The second byte after 0x62. */
9454 ins->codep++;
9455 ins->vex.w = *ins->codep & 0x80;
9456 if (ins->vex.w && ins->address_mode == mode_64bit)
9457 ins->rex |= REX_W;
9458
9459 ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
9460
9461 /* The U bit. */
9462 if (!(*ins->codep & 0x4))
9463 return &bad_opcode;
9464
9465 switch ((*ins->codep & 0x3))
9466 {
9467 case 0:
9468 break;
9469 case 1:
9470 ins->vex.prefix = DATA_PREFIX_OPCODE;
9471 break;
9472 case 2:
9473 ins->vex.prefix = REPE_PREFIX_OPCODE;
9474 break;
9475 case 3:
9476 ins->vex.prefix = REPNE_PREFIX_OPCODE;
9477 break;
9478 }
9479
9480 /* The third byte after 0x62. */
9481 ins->codep++;
9482
9483 /* Remember the static rounding bits. */
9484 ins->vex.ll = (*ins->codep >> 5) & 3;
9485 ins->vex.b = *ins->codep & 0x10;
9486
9487 ins->vex.v = *ins->codep & 0x8;
9488 ins->vex.mask_register_specifier = *ins->codep & 0x7;
9489 ins->vex.zeroing = *ins->codep & 0x80;
9490
9491 if (ins->address_mode != mode_64bit)
9492 {
9493 /* In 16/32-bit mode silently ignore following bits. */
9494 ins->rex &= ~REX_B;
9495 ins->vex.r = true;
9496 }
9497
9498 ins->need_vex = true;
9499 ins->codep++;
9500 vindex = *ins->codep++;
9501 dp = &evex_table[vex_table_index][vindex];
9502 ins->end_codep = ins->codep;
9503 FETCH_DATA (ins->info, ins->codep + 1);
9504 ins->modrm.mod = (*ins->codep >> 6) & 3;
9505 ins->modrm.reg = (*ins->codep >> 3) & 7;
9506 ins->modrm.rm = *ins->codep & 7;
9507
9508 /* Set vector length. */
9509 if (ins->modrm.mod == 3 && ins->vex.b)
9510 ins->vex.length = 512;
9511 else
9512 {
9513 switch (ins->vex.ll)
9514 {
9515 case 0x0:
9516 ins->vex.length = 128;
9517 break;
9518 case 0x1:
9519 ins->vex.length = 256;
9520 break;
9521 case 0x2:
9522 ins->vex.length = 512;
9523 break;
9524 default:
9525 return &bad_opcode;
9526 }
9527 }
9528 break;
9529
9530 case 0:
9531 dp = &bad_opcode;
9532 break;
9533
9534 default:
9535 abort ();
9536 }
9537
9538 if (dp->name != NULL)
9539 return dp;
9540 else
9541 return get_valid_dis386 (dp, ins);
9542 }
9543
9544 static void
9545 get_sib (instr_info *ins, int sizeflag)
9546 {
9547 /* If modrm.mod == 3, operand must be register. */
9548 if (ins->need_modrm
9549 && ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
9550 && ins->modrm.mod != 3
9551 && ins->modrm.rm == 4)
9552 {
9553 FETCH_DATA (ins->info, ins->codep + 2);
9554 ins->sib.index = (ins->codep[1] >> 3) & 7;
9555 ins->sib.scale = (ins->codep[1] >> 6) & 3;
9556 ins->sib.base = ins->codep[1] & 7;
9557 ins->has_sib = true;
9558 }
9559 else
9560 ins->has_sib = false;
9561 }
9562
9563 /* Like oappend (below), but S is a string starting with '%'. In
9564 Intel syntax, the '%' is elided. */
9565
9566 static void
9567 oappend_register (instr_info *ins, const char *s)
9568 {
9569 oappend_with_style (ins, s + ins->intel_syntax, dis_style_register);
9570 }
9571
9572 /* Wrap around a call to INS->info->fprintf_styled_func, printing FMT.
9573 STYLE is the default style to use in the fprintf_styled_func calls,
9574 however, FMT might include embedded style markers (see oappend_style),
9575 these embedded markers are not printed, but instead change the style
9576 used in the next fprintf_styled_func call. */
9577
9578 static void ATTRIBUTE_PRINTF_3
9579 i386_dis_printf (instr_info *ins, enum disassembler_style style,
9580 const char *fmt, ...)
9581 {
9582 va_list ap;
9583 enum disassembler_style curr_style = style;
9584 const char *start, *curr;
9585 char staging_area[40];
9586
9587 va_start (ap, fmt);
9588 /* In particular print_insn()'s processing of op_txt[] can hand rather long
9589 strings here. Bypass vsnprintf() in such cases to avoid capacity issues
9590 with the staging area. */
9591 if (strcmp (fmt, "%s"))
9592 {
9593 int res = vsnprintf (staging_area, sizeof (staging_area), fmt, ap);
9594
9595 va_end (ap);
9596
9597 if (res < 0)
9598 return;
9599
9600 if ((size_t) res >= sizeof (staging_area))
9601 abort ();
9602
9603 start = curr = staging_area;
9604 }
9605 else
9606 {
9607 start = curr = va_arg (ap, const char *);
9608 va_end (ap);
9609 }
9610
9611 do
9612 {
9613 if (*curr == '\0'
9614 || (*curr == STYLE_MARKER_CHAR
9615 && ISXDIGIT (*(curr + 1))
9616 && *(curr + 2) == STYLE_MARKER_CHAR))
9617 {
9618 /* Output content between our START position and CURR. */
9619 int len = curr - start;
9620 int n = (*ins->info->fprintf_styled_func) (ins->info->stream,
9621 curr_style,
9622 "%.*s", len, start);
9623 if (n < 0)
9624 break;
9625
9626 if (*curr == '\0')
9627 break;
9628
9629 /* Skip over the initial STYLE_MARKER_CHAR. */
9630 ++curr;
9631
9632 /* Update the CURR_STYLE. As there are less than 16 styles, it
9633 is possible, that if the input is corrupted in some way, that
9634 we might set CURR_STYLE to an invalid value. Don't worry
9635 though, we check for this situation. */
9636 if (*curr >= '0' && *curr <= '9')
9637 curr_style = (enum disassembler_style) (*curr - '0');
9638 else if (*curr >= 'a' && *curr <= 'f')
9639 curr_style = (enum disassembler_style) (*curr - 'a' + 10);
9640 else
9641 curr_style = dis_style_text;
9642
9643 /* Check for an invalid style having been selected. This should
9644 never happen, but it doesn't hurt to be a little paranoid. */
9645 if (curr_style > dis_style_comment_start)
9646 curr_style = dis_style_text;
9647
9648 /* Skip the hex character, and the closing STYLE_MARKER_CHAR. */
9649 curr += 2;
9650
9651 /* Reset the START to after the style marker. */
9652 start = curr;
9653 }
9654 else
9655 ++curr;
9656 }
9657 while (true);
9658 }
9659
9660 static int
9661 print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax)
9662 {
9663 const struct dis386 *dp;
9664 int i;
9665 char *op_txt[MAX_OPERANDS];
9666 int needcomma;
9667 bool intel_swap_2_3;
9668 int sizeflag, orig_sizeflag;
9669 const char *p;
9670 struct dis_private priv;
9671 int prefix_length;
9672 int op_count;
9673 instr_info ins = {
9674 .info = info,
9675 .intel_syntax = intel_syntax >= 0
9676 ? intel_syntax
9677 : (info->mach & bfd_mach_i386_intel_syntax) != 0,
9678 .intel_mnemonic = !SYSV386_COMPAT,
9679 .op_index[0 ... MAX_OPERANDS - 1] = -1,
9680 .start_pc = pc,
9681 .start_codep = priv.the_buffer,
9682 .codep = priv.the_buffer,
9683 .obufp = ins.obuf,
9684 .last_lock_prefix = -1,
9685 .last_repz_prefix = -1,
9686 .last_repnz_prefix = -1,
9687 .last_data_prefix = -1,
9688 .last_addr_prefix = -1,
9689 .last_rex_prefix = -1,
9690 .last_seg_prefix = -1,
9691 .fwait_prefix = -1,
9692 };
9693 char op_out[MAX_OPERANDS][MAX_OPERAND_BUFFER_SIZE];
9694
9695 priv.orig_sizeflag = AFLAG | DFLAG;
9696 if ((info->mach & bfd_mach_i386_i386) != 0)
9697 ins.address_mode = mode_32bit;
9698 else if (info->mach == bfd_mach_i386_i8086)
9699 {
9700 ins.address_mode = mode_16bit;
9701 priv.orig_sizeflag = 0;
9702 }
9703 else
9704 ins.address_mode = mode_64bit;
9705
9706 for (p = info->disassembler_options; p != NULL;)
9707 {
9708 if (startswith (p, "amd64"))
9709 ins.isa64 = amd64;
9710 else if (startswith (p, "intel64"))
9711 ins.isa64 = intel64;
9712 else if (startswith (p, "x86-64"))
9713 {
9714 ins.address_mode = mode_64bit;
9715 priv.orig_sizeflag |= AFLAG | DFLAG;
9716 }
9717 else if (startswith (p, "i386"))
9718 {
9719 ins.address_mode = mode_32bit;
9720 priv.orig_sizeflag |= AFLAG | DFLAG;
9721 }
9722 else if (startswith (p, "i8086"))
9723 {
9724 ins.address_mode = mode_16bit;
9725 priv.orig_sizeflag &= ~(AFLAG | DFLAG);
9726 }
9727 else if (startswith (p, "intel"))
9728 {
9729 ins.intel_syntax = 1;
9730 if (startswith (p + 5, "-mnemonic"))
9731 ins.intel_mnemonic = true;
9732 }
9733 else if (startswith (p, "att"))
9734 {
9735 ins.intel_syntax = 0;
9736 if (startswith (p + 3, "-mnemonic"))
9737 ins.intel_mnemonic = false;
9738 }
9739 else if (startswith (p, "addr"))
9740 {
9741 if (ins.address_mode == mode_64bit)
9742 {
9743 if (p[4] == '3' && p[5] == '2')
9744 priv.orig_sizeflag &= ~AFLAG;
9745 else if (p[4] == '6' && p[5] == '4')
9746 priv.orig_sizeflag |= AFLAG;
9747 }
9748 else
9749 {
9750 if (p[4] == '1' && p[5] == '6')
9751 priv.orig_sizeflag &= ~AFLAG;
9752 else if (p[4] == '3' && p[5] == '2')
9753 priv.orig_sizeflag |= AFLAG;
9754 }
9755 }
9756 else if (startswith (p, "data"))
9757 {
9758 if (p[4] == '1' && p[5] == '6')
9759 priv.orig_sizeflag &= ~DFLAG;
9760 else if (p[4] == '3' && p[5] == '2')
9761 priv.orig_sizeflag |= DFLAG;
9762 }
9763 else if (startswith (p, "suffix"))
9764 priv.orig_sizeflag |= SUFFIX_ALWAYS;
9765
9766 p = strchr (p, ',');
9767 if (p != NULL)
9768 p++;
9769 }
9770
9771 if (ins.address_mode == mode_64bit && sizeof (bfd_vma) < 8)
9772 {
9773 i386_dis_printf (&ins, dis_style_text, _("64-bit address is disabled"));
9774 return -1;
9775 }
9776
9777 if (ins.intel_syntax)
9778 {
9779 ins.open_char = '[';
9780 ins.close_char = ']';
9781 ins.separator_char = '+';
9782 ins.scale_char = '*';
9783 }
9784 else
9785 {
9786 ins.open_char = '(';
9787 ins.close_char = ')';
9788 ins.separator_char = ',';
9789 ins.scale_char = ',';
9790 }
9791
9792 /* The output looks better if we put 7 bytes on a line, since that
9793 puts most long word instructions on a single line. */
9794 info->bytes_per_line = 7;
9795
9796 info->private_data = &priv;
9797 priv.max_fetched = priv.the_buffer;
9798 priv.insn_start = pc;
9799
9800 for (i = 0; i < MAX_OPERANDS; ++i)
9801 {
9802 op_out[i][0] = 0;
9803 ins.op_out[i] = op_out[i];
9804 }
9805
9806 if (OPCODES_SIGSETJMP (priv.bailout) != 0)
9807 {
9808 /* Getting here means we tried for data but didn't get it. That
9809 means we have an incomplete instruction of some sort. Just
9810 print the first byte as a prefix or a .byte pseudo-op. */
9811 if (ins.codep > priv.the_buffer)
9812 {
9813 const char *name = NULL;
9814
9815 if (ins.prefixes || ins.fwait_prefix >= 0 || (ins.rex & REX_OPCODE))
9816 name = prefix_name (&ins, priv.the_buffer[0], priv.orig_sizeflag);
9817 if (name != NULL)
9818 i386_dis_printf (&ins, dis_style_mnemonic, "%s", name);
9819 else
9820 {
9821 /* Just print the first byte as a .byte instruction. */
9822 i386_dis_printf (&ins, dis_style_assembler_directive,
9823 ".byte ");
9824 i386_dis_printf (&ins, dis_style_immediate, "0x%x",
9825 (unsigned int) priv.the_buffer[0]);
9826 }
9827
9828 return 1;
9829 }
9830
9831 return -1;
9832 }
9833
9834 sizeflag = priv.orig_sizeflag;
9835
9836 if (!ckprefix (&ins) || ins.rex_used)
9837 {
9838 /* Too many prefixes or unused REX prefixes. */
9839 for (i = 0;
9840 i < (int) ARRAY_SIZE (ins.all_prefixes) && ins.all_prefixes[i];
9841 i++)
9842 i386_dis_printf (&ins, dis_style_mnemonic, "%s%s",
9843 (i == 0 ? "" : " "),
9844 prefix_name (&ins, ins.all_prefixes[i], sizeflag));
9845 return i;
9846 }
9847
9848 ins.insn_codep = ins.codep;
9849
9850 FETCH_DATA (info, ins.codep + 1);
9851 ins.two_source_ops = (*ins.codep == 0x62) || (*ins.codep == 0xc8);
9852
9853 if (((ins.prefixes & PREFIX_FWAIT)
9854 && ((*ins.codep < 0xd8) || (*ins.codep > 0xdf))))
9855 {
9856 /* Handle ins.prefixes before fwait. */
9857 for (i = 0; i < ins.fwait_prefix && ins.all_prefixes[i];
9858 i++)
9859 i386_dis_printf (&ins, dis_style_mnemonic, "%s ",
9860 prefix_name (&ins, ins.all_prefixes[i], sizeflag));
9861 i386_dis_printf (&ins, dis_style_mnemonic, "fwait");
9862 return i + 1;
9863 }
9864
9865 if (*ins.codep == 0x0f)
9866 {
9867 unsigned char threebyte;
9868
9869 ins.codep++;
9870 FETCH_DATA (info, ins.codep + 1);
9871 threebyte = *ins.codep;
9872 dp = &dis386_twobyte[threebyte];
9873 ins.need_modrm = twobyte_has_modrm[threebyte];
9874 ins.codep++;
9875 }
9876 else
9877 {
9878 dp = &dis386[*ins.codep];
9879 ins.need_modrm = onebyte_has_modrm[*ins.codep];
9880 ins.codep++;
9881 }
9882
9883 /* Save sizeflag for printing the extra ins.prefixes later before updating
9884 it for mnemonic and operand processing. The prefix names depend
9885 only on the address mode. */
9886 orig_sizeflag = sizeflag;
9887 if (ins.prefixes & PREFIX_ADDR)
9888 sizeflag ^= AFLAG;
9889 if ((ins.prefixes & PREFIX_DATA))
9890 sizeflag ^= DFLAG;
9891
9892 ins.end_codep = ins.codep;
9893 if (ins.need_modrm)
9894 {
9895 FETCH_DATA (info, ins.codep + 1);
9896 ins.modrm.mod = (*ins.codep >> 6) & 3;
9897 ins.modrm.reg = (*ins.codep >> 3) & 7;
9898 ins.modrm.rm = *ins.codep & 7;
9899 }
9900
9901 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
9902 {
9903 get_sib (&ins, sizeflag);
9904 dofloat (&ins, sizeflag);
9905 }
9906 else
9907 {
9908 dp = get_valid_dis386 (dp, &ins);
9909 if (dp != NULL && putop (&ins, dp->name, sizeflag) == 0)
9910 {
9911 get_sib (&ins, sizeflag);
9912 for (i = 0; i < MAX_OPERANDS; ++i)
9913 {
9914 ins.obufp = ins.op_out[i];
9915 ins.op_ad = MAX_OPERANDS - 1 - i;
9916 if (dp->op[i].rtn)
9917 (*dp->op[i].rtn) (&ins, dp->op[i].bytemode, sizeflag);
9918 /* For EVEX instruction after the last operand masking
9919 should be printed. */
9920 if (i == 0 && ins.vex.evex)
9921 {
9922 /* Don't print {%k0}. */
9923 if (ins.vex.mask_register_specifier)
9924 {
9925 const char *reg_name
9926 = att_names_mask[ins.vex.mask_register_specifier];
9927
9928 oappend (&ins, "{");
9929 oappend_register (&ins, reg_name);
9930 oappend (&ins, "}");
9931 }
9932 if (ins.vex.zeroing)
9933 oappend (&ins, "{z}");
9934
9935 /* S/G insns require a mask and don't allow
9936 zeroing-masking. */
9937 if ((dp->op[0].bytemode == vex_vsib_d_w_dq_mode
9938 || dp->op[0].bytemode == vex_vsib_q_w_dq_mode)
9939 && (ins.vex.mask_register_specifier == 0
9940 || ins.vex.zeroing))
9941 oappend (&ins, "/(bad)");
9942 }
9943 }
9944
9945 /* Check whether rounding control was enabled for an insn not
9946 supporting it. */
9947 if (ins.modrm.mod == 3 && ins.vex.b
9948 && !(ins.evex_used & EVEX_b_used))
9949 {
9950 for (i = 0; i < MAX_OPERANDS; ++i)
9951 {
9952 ins.obufp = ins.op_out[i];
9953 if (*ins.obufp)
9954 continue;
9955 oappend (&ins, names_rounding[ins.vex.ll]);
9956 oappend (&ins, "bad}");
9957 break;
9958 }
9959 }
9960 }
9961 }
9962
9963 /* Clear instruction information. */
9964 info->insn_info_valid = 0;
9965 info->branch_delay_insns = 0;
9966 info->data_size = 0;
9967 info->insn_type = dis_noninsn;
9968 info->target = 0;
9969 info->target2 = 0;
9970
9971 /* Reset jump operation indicator. */
9972 ins.op_is_jump = false;
9973 {
9974 int jump_detection = 0;
9975
9976 /* Extract flags. */
9977 for (i = 0; i < MAX_OPERANDS; ++i)
9978 {
9979 if ((dp->op[i].rtn == OP_J)
9980 || (dp->op[i].rtn == OP_indirE))
9981 jump_detection |= 1;
9982 else if ((dp->op[i].rtn == BND_Fixup)
9983 || (!dp->op[i].rtn && !dp->op[i].bytemode))
9984 jump_detection |= 2;
9985 else if ((dp->op[i].bytemode == cond_jump_mode)
9986 || (dp->op[i].bytemode == loop_jcxz_mode))
9987 jump_detection |= 4;
9988 }
9989
9990 /* Determine if this is a jump or branch. */
9991 if ((jump_detection & 0x3) == 0x3)
9992 {
9993 ins.op_is_jump = true;
9994 if (jump_detection & 0x4)
9995 info->insn_type = dis_condbranch;
9996 else
9997 info->insn_type = (dp->name && !strncmp (dp->name, "call", 4))
9998 ? dis_jsr : dis_branch;
9999 }
10000 }
10001
10002 /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
10003 are all 0s in inverted form. */
10004 if (ins.need_vex && ins.vex.register_specifier != 0)
10005 {
10006 i386_dis_printf (&ins, dis_style_text, "(bad)");
10007 return ins.end_codep - priv.the_buffer;
10008 }
10009
10010 /* If EVEX.z is set, there must be an actual mask register in use. */
10011 if (ins.vex.zeroing && ins.vex.mask_register_specifier == 0)
10012 {
10013 i386_dis_printf (&ins, dis_style_text, "(bad)");
10014 return ins.end_codep - priv.the_buffer;
10015 }
10016
10017 switch (dp->prefix_requirement)
10018 {
10019 case PREFIX_DATA:
10020 /* If only the data prefix is marked as mandatory, its absence renders
10021 the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
10022 if (ins.need_vex ? !ins.vex.prefix : !(ins.prefixes & PREFIX_DATA))
10023 {
10024 i386_dis_printf (&ins, dis_style_text, "(bad)");
10025 return ins.end_codep - priv.the_buffer;
10026 }
10027 ins.used_prefixes |= PREFIX_DATA;
10028 /* Fall through. */
10029 case PREFIX_OPCODE:
10030 /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
10031 unused, opcode is invalid. Since the PREFIX_DATA prefix may be
10032 used by putop and MMX/SSE operand and may be overridden by the
10033 PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
10034 separately. */
10035 if (((ins.need_vex
10036 ? ins.vex.prefix == REPE_PREFIX_OPCODE
10037 || ins.vex.prefix == REPNE_PREFIX_OPCODE
10038 : (ins.prefixes
10039 & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
10040 && (ins.used_prefixes
10041 & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
10042 || (((ins.need_vex
10043 ? ins.vex.prefix == DATA_PREFIX_OPCODE
10044 : ((ins.prefixes
10045 & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
10046 == PREFIX_DATA))
10047 && (ins.used_prefixes & PREFIX_DATA) == 0))
10048 || (ins.vex.evex && dp->prefix_requirement != PREFIX_DATA
10049 && !ins.vex.w != !(ins.used_prefixes & PREFIX_DATA)))
10050 {
10051 i386_dis_printf (&ins, dis_style_text, "(bad)");
10052 return ins.end_codep - priv.the_buffer;
10053 }
10054 break;
10055
10056 case PREFIX_IGNORED:
10057 /* Zap data size and rep prefixes from used_prefixes and reinstate their
10058 origins in all_prefixes. */
10059 ins.used_prefixes &= ~PREFIX_OPCODE;
10060 if (ins.last_data_prefix >= 0)
10061 ins.all_prefixes[ins.last_data_prefix] = 0x66;
10062 if (ins.last_repz_prefix >= 0)
10063 ins.all_prefixes[ins.last_repz_prefix] = 0xf3;
10064 if (ins.last_repnz_prefix >= 0)
10065 ins.all_prefixes[ins.last_repnz_prefix] = 0xf2;
10066 break;
10067 }
10068
10069 /* Check if the REX prefix is used. */
10070 if ((ins.rex ^ ins.rex_used) == 0
10071 && !ins.need_vex && ins.last_rex_prefix >= 0)
10072 ins.all_prefixes[ins.last_rex_prefix] = 0;
10073
10074 /* Check if the SEG prefix is used. */
10075 if ((ins.prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
10076 | PREFIX_FS | PREFIX_GS)) != 0
10077 && (ins.used_prefixes & ins.active_seg_prefix) != 0)
10078 ins.all_prefixes[ins.last_seg_prefix] = 0;
10079
10080 /* Check if the ADDR prefix is used. */
10081 if ((ins.prefixes & PREFIX_ADDR) != 0
10082 && (ins.used_prefixes & PREFIX_ADDR) != 0)
10083 ins.all_prefixes[ins.last_addr_prefix] = 0;
10084
10085 /* Check if the DATA prefix is used. */
10086 if ((ins.prefixes & PREFIX_DATA) != 0
10087 && (ins.used_prefixes & PREFIX_DATA) != 0
10088 && !ins.need_vex)
10089 ins.all_prefixes[ins.last_data_prefix] = 0;
10090
10091 /* Print the extra ins.prefixes. */
10092 prefix_length = 0;
10093 for (i = 0; i < (int) ARRAY_SIZE (ins.all_prefixes); i++)
10094 if (ins.all_prefixes[i])
10095 {
10096 const char *name;
10097 name = prefix_name (&ins, ins.all_prefixes[i], orig_sizeflag);
10098 if (name == NULL)
10099 abort ();
10100 prefix_length += strlen (name) + 1;
10101 i386_dis_printf (&ins, dis_style_mnemonic, "%s ", name);
10102 }
10103
10104 /* Check maximum code length. */
10105 if ((ins.codep - ins.start_codep) > MAX_CODE_LENGTH)
10106 {
10107 i386_dis_printf (&ins, dis_style_text, "(bad)");
10108 return MAX_CODE_LENGTH;
10109 }
10110
10111 /* Calculate the number of operands this instruction has. */
10112 op_count = 0;
10113 for (i = 0; i < MAX_OPERANDS; ++i)
10114 if (*ins.op_out[i] != '\0')
10115 ++op_count;
10116
10117 /* Calculate the number of spaces to print after the mnemonic. */
10118 ins.obufp = ins.mnemonicendp;
10119 if (op_count > 0)
10120 {
10121 i = strlen (ins.obuf) + prefix_length;
10122 if (i < 7)
10123 i = 7 - i;
10124 else
10125 i = 1;
10126 }
10127 else
10128 i = 0;
10129
10130 /* Print the instruction mnemonic along with any trailing whitespace. */
10131 i386_dis_printf (&ins, dis_style_mnemonic, "%s%*s", ins.obuf, i, "");
10132
10133 /* The enter and bound instructions are printed with operands in the same
10134 order as the intel book; everything else is printed in reverse order. */
10135 intel_swap_2_3 = false;
10136 if (ins.intel_syntax || ins.two_source_ops)
10137 {
10138 for (i = 0; i < MAX_OPERANDS; ++i)
10139 op_txt[i] = ins.op_out[i];
10140
10141 if (ins.intel_syntax && dp && dp->op[2].rtn == OP_Rounding
10142 && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
10143 {
10144 op_txt[2] = ins.op_out[3];
10145 op_txt[3] = ins.op_out[2];
10146 intel_swap_2_3 = true;
10147 }
10148
10149 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
10150 {
10151 bool riprel;
10152
10153 ins.op_ad = ins.op_index[i];
10154 ins.op_index[i] = ins.op_index[MAX_OPERANDS - 1 - i];
10155 ins.op_index[MAX_OPERANDS - 1 - i] = ins.op_ad;
10156 riprel = ins.op_riprel[i];
10157 ins.op_riprel[i] = ins.op_riprel[MAX_OPERANDS - 1 - i];
10158 ins.op_riprel[MAX_OPERANDS - 1 - i] = riprel;
10159 }
10160 }
10161 else
10162 {
10163 for (i = 0; i < MAX_OPERANDS; ++i)
10164 op_txt[MAX_OPERANDS - 1 - i] = ins.op_out[i];
10165 }
10166
10167 needcomma = 0;
10168 for (i = 0; i < MAX_OPERANDS; ++i)
10169 if (*op_txt[i])
10170 {
10171 /* In Intel syntax embedded rounding / SAE are not separate operands.
10172 Instead they're attached to the prior register operand. Simply
10173 suppress emission of the comma to achieve that effect. */
10174 switch (i & -(ins.intel_syntax && dp))
10175 {
10176 case 2:
10177 if (dp->op[2].rtn == OP_Rounding && !intel_swap_2_3)
10178 needcomma = 0;
10179 break;
10180 case 3:
10181 if (dp->op[3].rtn == OP_Rounding || intel_swap_2_3)
10182 needcomma = 0;
10183 break;
10184 }
10185 if (needcomma)
10186 i386_dis_printf (&ins, dis_style_text, ",");
10187 if (ins.op_index[i] != -1 && !ins.op_riprel[i])
10188 {
10189 bfd_vma target = (bfd_vma) ins.op_address[ins.op_index[i]];
10190
10191 if (ins.op_is_jump)
10192 {
10193 info->insn_info_valid = 1;
10194 info->branch_delay_insns = 0;
10195 info->data_size = 0;
10196 info->target = target;
10197 info->target2 = 0;
10198 }
10199 (*info->print_address_func) (target, info);
10200 }
10201 else
10202 i386_dis_printf (&ins, dis_style_text, "%s", op_txt[i]);
10203 needcomma = 1;
10204 }
10205
10206 for (i = 0; i < MAX_OPERANDS; i++)
10207 if (ins.op_index[i] != -1 && ins.op_riprel[i])
10208 {
10209 i386_dis_printf (&ins, dis_style_comment_start, " # ");
10210 (*info->print_address_func)
10211 ((bfd_vma)(ins.start_pc + (ins.codep - ins.start_codep)
10212 + ins.op_address[ins.op_index[i]]),
10213 info);
10214 break;
10215 }
10216 return ins.codep - priv.the_buffer;
10217 }
10218
10219 /* Here for backwards compatibility. When gdb stops using
10220 print_insn_i386_att and print_insn_i386_intel these functions can
10221 disappear, and print_insn_i386 be merged into print_insn. */
10222 int
10223 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
10224 {
10225 return print_insn (pc, info, 0);
10226 }
10227
10228 int
10229 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
10230 {
10231 return print_insn (pc, info, 1);
10232 }
10233
10234 int
10235 print_insn_i386 (bfd_vma pc, disassemble_info *info)
10236 {
10237 return print_insn (pc, info, -1);
10238 }
10239
10240 static const char *float_mem[] = {
10241 /* d8 */
10242 "fadd{s|}",
10243 "fmul{s|}",
10244 "fcom{s|}",
10245 "fcomp{s|}",
10246 "fsub{s|}",
10247 "fsubr{s|}",
10248 "fdiv{s|}",
10249 "fdivr{s|}",
10250 /* d9 */
10251 "fld{s|}",
10252 "(bad)",
10253 "fst{s|}",
10254 "fstp{s|}",
10255 "fldenv{C|C}",
10256 "fldcw",
10257 "fNstenv{C|C}",
10258 "fNstcw",
10259 /* da */
10260 "fiadd{l|}",
10261 "fimul{l|}",
10262 "ficom{l|}",
10263 "ficomp{l|}",
10264 "fisub{l|}",
10265 "fisubr{l|}",
10266 "fidiv{l|}",
10267 "fidivr{l|}",
10268 /* db */
10269 "fild{l|}",
10270 "fisttp{l|}",
10271 "fist{l|}",
10272 "fistp{l|}",
10273 "(bad)",
10274 "fld{t|}",
10275 "(bad)",
10276 "fstp{t|}",
10277 /* dc */
10278 "fadd{l|}",
10279 "fmul{l|}",
10280 "fcom{l|}",
10281 "fcomp{l|}",
10282 "fsub{l|}",
10283 "fsubr{l|}",
10284 "fdiv{l|}",
10285 "fdivr{l|}",
10286 /* dd */
10287 "fld{l|}",
10288 "fisttp{ll|}",
10289 "fst{l||}",
10290 "fstp{l|}",
10291 "frstor{C|C}",
10292 "(bad)",
10293 "fNsave{C|C}",
10294 "fNstsw",
10295 /* de */
10296 "fiadd{s|}",
10297 "fimul{s|}",
10298 "ficom{s|}",
10299 "ficomp{s|}",
10300 "fisub{s|}",
10301 "fisubr{s|}",
10302 "fidiv{s|}",
10303 "fidivr{s|}",
10304 /* df */
10305 "fild{s|}",
10306 "fisttp{s|}",
10307 "fist{s|}",
10308 "fistp{s|}",
10309 "fbld",
10310 "fild{ll|}",
10311 "fbstp",
10312 "fistp{ll|}",
10313 };
10314
10315 static const unsigned char float_mem_mode[] = {
10316 /* d8 */
10317 d_mode,
10318 d_mode,
10319 d_mode,
10320 d_mode,
10321 d_mode,
10322 d_mode,
10323 d_mode,
10324 d_mode,
10325 /* d9 */
10326 d_mode,
10327 0,
10328 d_mode,
10329 d_mode,
10330 0,
10331 w_mode,
10332 0,
10333 w_mode,
10334 /* da */
10335 d_mode,
10336 d_mode,
10337 d_mode,
10338 d_mode,
10339 d_mode,
10340 d_mode,
10341 d_mode,
10342 d_mode,
10343 /* db */
10344 d_mode,
10345 d_mode,
10346 d_mode,
10347 d_mode,
10348 0,
10349 t_mode,
10350 0,
10351 t_mode,
10352 /* dc */
10353 q_mode,
10354 q_mode,
10355 q_mode,
10356 q_mode,
10357 q_mode,
10358 q_mode,
10359 q_mode,
10360 q_mode,
10361 /* dd */
10362 q_mode,
10363 q_mode,
10364 q_mode,
10365 q_mode,
10366 0,
10367 0,
10368 0,
10369 w_mode,
10370 /* de */
10371 w_mode,
10372 w_mode,
10373 w_mode,
10374 w_mode,
10375 w_mode,
10376 w_mode,
10377 w_mode,
10378 w_mode,
10379 /* df */
10380 w_mode,
10381 w_mode,
10382 w_mode,
10383 w_mode,
10384 t_mode,
10385 q_mode,
10386 t_mode,
10387 q_mode
10388 };
10389
10390 #define ST { OP_ST, 0 }
10391 #define STi { OP_STi, 0 }
10392
10393 #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
10394 #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
10395 #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
10396 #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
10397 #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
10398 #define FGRPda_5 NULL, { { NULL, 6 } }, 0
10399 #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
10400 #define FGRPde_3 NULL, { { NULL, 8 } }, 0
10401 #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
10402
10403 static const struct dis386 float_reg[][8] = {
10404 /* d8 */
10405 {
10406 { "fadd", { ST, STi }, 0 },
10407 { "fmul", { ST, STi }, 0 },
10408 { "fcom", { STi }, 0 },
10409 { "fcomp", { STi }, 0 },
10410 { "fsub", { ST, STi }, 0 },
10411 { "fsubr", { ST, STi }, 0 },
10412 { "fdiv", { ST, STi }, 0 },
10413 { "fdivr", { ST, STi }, 0 },
10414 },
10415 /* d9 */
10416 {
10417 { "fld", { STi }, 0 },
10418 { "fxch", { STi }, 0 },
10419 { FGRPd9_2 },
10420 { Bad_Opcode },
10421 { FGRPd9_4 },
10422 { FGRPd9_5 },
10423 { FGRPd9_6 },
10424 { FGRPd9_7 },
10425 },
10426 /* da */
10427 {
10428 { "fcmovb", { ST, STi }, 0 },
10429 { "fcmove", { ST, STi }, 0 },
10430 { "fcmovbe",{ ST, STi }, 0 },
10431 { "fcmovu", { ST, STi }, 0 },
10432 { Bad_Opcode },
10433 { FGRPda_5 },
10434 { Bad_Opcode },
10435 { Bad_Opcode },
10436 },
10437 /* db */
10438 {
10439 { "fcmovnb",{ ST, STi }, 0 },
10440 { "fcmovne",{ ST, STi }, 0 },
10441 { "fcmovnbe",{ ST, STi }, 0 },
10442 { "fcmovnu",{ ST, STi }, 0 },
10443 { FGRPdb_4 },
10444 { "fucomi", { ST, STi }, 0 },
10445 { "fcomi", { ST, STi }, 0 },
10446 { Bad_Opcode },
10447 },
10448 /* dc */
10449 {
10450 { "fadd", { STi, ST }, 0 },
10451 { "fmul", { STi, ST }, 0 },
10452 { Bad_Opcode },
10453 { Bad_Opcode },
10454 { "fsub{!M|r}", { STi, ST }, 0 },
10455 { "fsub{M|}", { STi, ST }, 0 },
10456 { "fdiv{!M|r}", { STi, ST }, 0 },
10457 { "fdiv{M|}", { STi, ST }, 0 },
10458 },
10459 /* dd */
10460 {
10461 { "ffree", { STi }, 0 },
10462 { Bad_Opcode },
10463 { "fst", { STi }, 0 },
10464 { "fstp", { STi }, 0 },
10465 { "fucom", { STi }, 0 },
10466 { "fucomp", { STi }, 0 },
10467 { Bad_Opcode },
10468 { Bad_Opcode },
10469 },
10470 /* de */
10471 {
10472 { "faddp", { STi, ST }, 0 },
10473 { "fmulp", { STi, ST }, 0 },
10474 { Bad_Opcode },
10475 { FGRPde_3 },
10476 { "fsub{!M|r}p", { STi, ST }, 0 },
10477 { "fsub{M|}p", { STi, ST }, 0 },
10478 { "fdiv{!M|r}p", { STi, ST }, 0 },
10479 { "fdiv{M|}p", { STi, ST }, 0 },
10480 },
10481 /* df */
10482 {
10483 { "ffreep", { STi }, 0 },
10484 { Bad_Opcode },
10485 { Bad_Opcode },
10486 { Bad_Opcode },
10487 { FGRPdf_4 },
10488 { "fucomip", { ST, STi }, 0 },
10489 { "fcomip", { ST, STi }, 0 },
10490 { Bad_Opcode },
10491 },
10492 };
10493
10494 static const char *const fgrps[][8] = {
10495 /* Bad opcode 0 */
10496 {
10497 "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10498 },
10499
10500 /* d9_2 1 */
10501 {
10502 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10503 },
10504
10505 /* d9_4 2 */
10506 {
10507 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
10508 },
10509
10510 /* d9_5 3 */
10511 {
10512 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
10513 },
10514
10515 /* d9_6 4 */
10516 {
10517 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
10518 },
10519
10520 /* d9_7 5 */
10521 {
10522 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
10523 },
10524
10525 /* da_5 6 */
10526 {
10527 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10528 },
10529
10530 /* db_4 7 */
10531 {
10532 "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
10533 "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
10534 },
10535
10536 /* de_3 8 */
10537 {
10538 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10539 },
10540
10541 /* df_4 9 */
10542 {
10543 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
10544 },
10545 };
10546
10547 static void
10548 swap_operand (instr_info *ins)
10549 {
10550 ins->mnemonicendp[0] = '.';
10551 ins->mnemonicendp[1] = 's';
10552 ins->mnemonicendp[2] = '\0';
10553 ins->mnemonicendp += 2;
10554 }
10555
10556 static void
10557 OP_Skip_MODRM (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10558 int sizeflag ATTRIBUTE_UNUSED)
10559 {
10560 /* Skip mod/rm byte. */
10561 MODRM_CHECK;
10562 ins->codep++;
10563 }
10564
10565 static void
10566 dofloat (instr_info *ins, int sizeflag)
10567 {
10568 const struct dis386 *dp;
10569 unsigned char floatop;
10570
10571 floatop = ins->codep[-1];
10572
10573 if (ins->modrm.mod != 3)
10574 {
10575 int fp_indx = (floatop - 0xd8) * 8 + ins->modrm.reg;
10576
10577 putop (ins, float_mem[fp_indx], sizeflag);
10578 ins->obufp = ins->op_out[0];
10579 ins->op_ad = 2;
10580 OP_E (ins, float_mem_mode[fp_indx], sizeflag);
10581 return;
10582 }
10583 /* Skip mod/rm byte. */
10584 MODRM_CHECK;
10585 ins->codep++;
10586
10587 dp = &float_reg[floatop - 0xd8][ins->modrm.reg];
10588 if (dp->name == NULL)
10589 {
10590 putop (ins, fgrps[dp->op[0].bytemode][ins->modrm.rm], sizeflag);
10591
10592 /* Instruction fnstsw is only one with strange arg. */
10593 if (floatop == 0xdf && ins->codep[-1] == 0xe0)
10594 strcpy (ins->op_out[0], att_names16[0] + ins->intel_syntax);
10595 }
10596 else
10597 {
10598 putop (ins, dp->name, sizeflag);
10599
10600 ins->obufp = ins->op_out[0];
10601 ins->op_ad = 2;
10602 if (dp->op[0].rtn)
10603 (*dp->op[0].rtn) (ins, dp->op[0].bytemode, sizeflag);
10604
10605 ins->obufp = ins->op_out[1];
10606 ins->op_ad = 1;
10607 if (dp->op[1].rtn)
10608 (*dp->op[1].rtn) (ins, dp->op[1].bytemode, sizeflag);
10609 }
10610 }
10611
10612 static void
10613 OP_ST (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10614 int sizeflag ATTRIBUTE_UNUSED)
10615 {
10616 oappend_register (ins, "%st");
10617 }
10618
10619 static void
10620 OP_STi (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
10621 int sizeflag ATTRIBUTE_UNUSED)
10622 {
10623 char scratch[8];
10624 int res = snprintf (scratch, ARRAY_SIZE (scratch), "%%st(%d)", ins->modrm.rm);
10625
10626 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
10627 abort ();
10628 oappend_register (ins, scratch);
10629 }
10630
10631 /* Capital letters in template are macros. */
10632 static int
10633 putop (instr_info *ins, const char *in_template, int sizeflag)
10634 {
10635 const char *p;
10636 int alt = 0;
10637 int cond = 1;
10638 unsigned int l = 0, len = 0;
10639 char last[4];
10640
10641 for (p = in_template; *p; p++)
10642 {
10643 if (len > l)
10644 {
10645 if (l >= sizeof (last) || !ISUPPER (*p))
10646 abort ();
10647 last[l++] = *p;
10648 continue;
10649 }
10650 switch (*p)
10651 {
10652 default:
10653 *ins->obufp++ = *p;
10654 break;
10655 case '%':
10656 len++;
10657 break;
10658 case '!':
10659 cond = 0;
10660 break;
10661 case '{':
10662 if (ins->intel_syntax)
10663 {
10664 while (*++p != '|')
10665 if (*p == '}' || *p == '\0')
10666 abort ();
10667 alt = 1;
10668 }
10669 break;
10670 case '|':
10671 while (*++p != '}')
10672 {
10673 if (*p == '\0')
10674 abort ();
10675 }
10676 break;
10677 case '}':
10678 alt = 0;
10679 break;
10680 case 'A':
10681 if (ins->intel_syntax)
10682 break;
10683 if ((ins->need_modrm && ins->modrm.mod != 3)
10684 || (sizeflag & SUFFIX_ALWAYS))
10685 *ins->obufp++ = 'b';
10686 break;
10687 case 'B':
10688 if (l == 0)
10689 {
10690 case_B:
10691 if (ins->intel_syntax)
10692 break;
10693 if (sizeflag & SUFFIX_ALWAYS)
10694 *ins->obufp++ = 'b';
10695 }
10696 else if (l == 1 && last[0] == 'L')
10697 {
10698 if (ins->address_mode == mode_64bit
10699 && !(ins->prefixes & PREFIX_ADDR))
10700 {
10701 *ins->obufp++ = 'a';
10702 *ins->obufp++ = 'b';
10703 *ins->obufp++ = 's';
10704 }
10705
10706 goto case_B;
10707 }
10708 else
10709 abort ();
10710 break;
10711 case 'C':
10712 if (ins->intel_syntax && !alt)
10713 break;
10714 if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
10715 {
10716 if (sizeflag & DFLAG)
10717 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10718 else
10719 *ins->obufp++ = ins->intel_syntax ? 'w' : 's';
10720 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10721 }
10722 break;
10723 case 'D':
10724 if (l == 1)
10725 {
10726 switch (last[0])
10727 {
10728 case 'X':
10729 if (!ins->vex.evex || ins->vex.w)
10730 *ins->obufp++ = 'd';
10731 else
10732 oappend (ins, "{bad}");
10733 break;
10734 default:
10735 abort ();
10736 }
10737 break;
10738 }
10739 if (l)
10740 abort ();
10741 if (ins->intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
10742 break;
10743 USED_REX (REX_W);
10744 if (ins->modrm.mod == 3)
10745 {
10746 if (ins->rex & REX_W)
10747 *ins->obufp++ = 'q';
10748 else
10749 {
10750 if (sizeflag & DFLAG)
10751 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10752 else
10753 *ins->obufp++ = 'w';
10754 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10755 }
10756 }
10757 else
10758 *ins->obufp++ = 'w';
10759 break;
10760 case 'E':
10761 if (l == 1)
10762 {
10763 switch (last[0])
10764 {
10765 case 'X':
10766 if (!ins->vex.evex || ins->vex.b || ins->vex.ll >= 2
10767 || !ins->vex.r
10768 || (ins->modrm.mod == 3 && (ins->rex & REX_X))
10769 || !ins->vex.v || ins->vex.mask_register_specifier)
10770 break;
10771 /* AVX512 extends a number of V*D insns to also have V*Q variants,
10772 merely distinguished by EVEX.W. Look for a use of the
10773 respective macro. */
10774 if (ins->vex.w)
10775 {
10776 const char *pct = strchr (p + 1, '%');
10777
10778 if (pct != NULL && pct[1] == 'D' && pct[2] == 'Q')
10779 break;
10780 }
10781 *ins->obufp++ = '{';
10782 *ins->obufp++ = 'e';
10783 *ins->obufp++ = 'v';
10784 *ins->obufp++ = 'e';
10785 *ins->obufp++ = 'x';
10786 *ins->obufp++ = '}';
10787 *ins->obufp++ = ' ';
10788 break;
10789 default:
10790 abort ();
10791 }
10792 break;
10793 }
10794 /* For jcxz/jecxz */
10795 if (ins->address_mode == mode_64bit)
10796 {
10797 if (sizeflag & AFLAG)
10798 *ins->obufp++ = 'r';
10799 else
10800 *ins->obufp++ = 'e';
10801 }
10802 else
10803 if (sizeflag & AFLAG)
10804 *ins->obufp++ = 'e';
10805 ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
10806 break;
10807 case 'F':
10808 if (ins->intel_syntax)
10809 break;
10810 if ((ins->prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
10811 {
10812 if (sizeflag & AFLAG)
10813 *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
10814 else
10815 *ins->obufp++ = ins->address_mode == mode_64bit ? 'l' : 'w';
10816 ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
10817 }
10818 break;
10819 case 'G':
10820 if (ins->intel_syntax || (ins->obufp[-1] != 's'
10821 && !(sizeflag & SUFFIX_ALWAYS)))
10822 break;
10823 if ((ins->rex & REX_W) || (sizeflag & DFLAG))
10824 *ins->obufp++ = 'l';
10825 else
10826 *ins->obufp++ = 'w';
10827 if (!(ins->rex & REX_W))
10828 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10829 break;
10830 case 'H':
10831 if (l == 0)
10832 {
10833 if (ins->intel_syntax)
10834 break;
10835 if ((ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
10836 || (ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
10837 {
10838 ins->used_prefixes |= ins->prefixes & (PREFIX_CS | PREFIX_DS);
10839 *ins->obufp++ = ',';
10840 *ins->obufp++ = 'p';
10841
10842 /* Set active_seg_prefix even if not set in 64-bit mode
10843 because here it is a valid branch hint. */
10844 if (ins->prefixes & PREFIX_DS)
10845 {
10846 ins->active_seg_prefix = PREFIX_DS;
10847 *ins->obufp++ = 't';
10848 }
10849 else
10850 {
10851 ins->active_seg_prefix = PREFIX_CS;
10852 *ins->obufp++ = 'n';
10853 }
10854 }
10855 }
10856 else if (l == 1 && last[0] == 'X')
10857 {
10858 if (!ins->vex.w)
10859 *ins->obufp++ = 'h';
10860 else
10861 oappend (ins, "{bad}");
10862 }
10863 else
10864 abort ();
10865 break;
10866 case 'K':
10867 USED_REX (REX_W);
10868 if (ins->rex & REX_W)
10869 *ins->obufp++ = 'q';
10870 else
10871 *ins->obufp++ = 'd';
10872 break;
10873 case 'L':
10874 abort ();
10875 case 'M':
10876 if (ins->intel_mnemonic != cond)
10877 *ins->obufp++ = 'r';
10878 break;
10879 case 'N':
10880 if ((ins->prefixes & PREFIX_FWAIT) == 0)
10881 *ins->obufp++ = 'n';
10882 else
10883 ins->used_prefixes |= PREFIX_FWAIT;
10884 break;
10885 case 'O':
10886 USED_REX (REX_W);
10887 if (ins->rex & REX_W)
10888 *ins->obufp++ = 'o';
10889 else if (ins->intel_syntax && (sizeflag & DFLAG))
10890 *ins->obufp++ = 'q';
10891 else
10892 *ins->obufp++ = 'd';
10893 if (!(ins->rex & REX_W))
10894 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10895 break;
10896 case '@':
10897 if (ins->address_mode == mode_64bit
10898 && (ins->isa64 == intel64 || (ins->rex & REX_W)
10899 || !(ins->prefixes & PREFIX_DATA)))
10900 {
10901 if (sizeflag & SUFFIX_ALWAYS)
10902 *ins->obufp++ = 'q';
10903 break;
10904 }
10905 /* Fall through. */
10906 case 'P':
10907 if (l == 0)
10908 {
10909 if ((ins->modrm.mod == 3 || !cond)
10910 && !(sizeflag & SUFFIX_ALWAYS))
10911 break;
10912 /* Fall through. */
10913 case 'T':
10914 if ((!(ins->rex & REX_W) && (ins->prefixes & PREFIX_DATA))
10915 || ((sizeflag & SUFFIX_ALWAYS)
10916 && ins->address_mode != mode_64bit))
10917 {
10918 *ins->obufp++ = (sizeflag & DFLAG)
10919 ? ins->intel_syntax ? 'd' : 'l' : 'w';
10920 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10921 }
10922 else if (sizeflag & SUFFIX_ALWAYS)
10923 *ins->obufp++ = 'q';
10924 }
10925 else if (l == 1 && last[0] == 'L')
10926 {
10927 if ((ins->prefixes & PREFIX_DATA)
10928 || (ins->rex & REX_W)
10929 || (sizeflag & SUFFIX_ALWAYS))
10930 {
10931 USED_REX (REX_W);
10932 if (ins->rex & REX_W)
10933 *ins->obufp++ = 'q';
10934 else
10935 {
10936 if (sizeflag & DFLAG)
10937 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10938 else
10939 *ins->obufp++ = 'w';
10940 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10941 }
10942 }
10943 }
10944 else
10945 abort ();
10946 break;
10947 case 'Q':
10948 if (l == 0)
10949 {
10950 if (ins->intel_syntax && !alt)
10951 break;
10952 USED_REX (REX_W);
10953 if ((ins->need_modrm && ins->modrm.mod != 3)
10954 || (sizeflag & SUFFIX_ALWAYS))
10955 {
10956 if (ins->rex & REX_W)
10957 *ins->obufp++ = 'q';
10958 else
10959 {
10960 if (sizeflag & DFLAG)
10961 *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
10962 else
10963 *ins->obufp++ = 'w';
10964 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
10965 }
10966 }
10967 }
10968 else if (l == 1 && last[0] == 'D')
10969 *ins->obufp++ = ins->vex.w ? 'q' : 'd';
10970 else if (l == 1 && last[0] == 'L')
10971 {
10972 if (cond ? ins->modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
10973 : ins->address_mode != mode_64bit)
10974 break;
10975 if ((ins->rex & REX_W))
10976 {
10977 USED_REX (REX_W);
10978 *ins->obufp++ = 'q';
10979 }
10980 else if ((ins->address_mode == mode_64bit && cond)
10981 || (sizeflag & SUFFIX_ALWAYS))
10982 *ins->obufp++ = ins->intel_syntax? 'd' : 'l';
10983 }
10984 else
10985 abort ();
10986 break;
10987 case 'R':
10988 USED_REX (REX_W);
10989 if (ins->rex & REX_W)
10990 *ins->obufp++ = 'q';
10991 else if (sizeflag & DFLAG)
10992 {
10993 if (ins->intel_syntax)
10994 *ins->obufp++ = 'd';
10995 else
10996 *ins->obufp++ = 'l';
10997 }
10998 else
10999 *ins->obufp++ = 'w';
11000 if (ins->intel_syntax && !p[1]
11001 && ((ins->rex & REX_W) || (sizeflag & DFLAG)))
11002 *ins->obufp++ = 'e';
11003 if (!(ins->rex & REX_W))
11004 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11005 break;
11006 case 'S':
11007 if (l == 0)
11008 {
11009 case_S:
11010 if (ins->intel_syntax)
11011 break;
11012 if (sizeflag & SUFFIX_ALWAYS)
11013 {
11014 if (ins->rex & REX_W)
11015 *ins->obufp++ = 'q';
11016 else
11017 {
11018 if (sizeflag & DFLAG)
11019 *ins->obufp++ = 'l';
11020 else
11021 *ins->obufp++ = 'w';
11022 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11023 }
11024 }
11025 break;
11026 }
11027 if (l != 1)
11028 abort ();
11029 switch (last[0])
11030 {
11031 case 'L':
11032 if (ins->address_mode == mode_64bit
11033 && !(ins->prefixes & PREFIX_ADDR))
11034 {
11035 *ins->obufp++ = 'a';
11036 *ins->obufp++ = 'b';
11037 *ins->obufp++ = 's';
11038 }
11039
11040 goto case_S;
11041 case 'X':
11042 if (!ins->vex.evex || !ins->vex.w)
11043 *ins->obufp++ = 's';
11044 else
11045 oappend (ins, "{bad}");
11046 break;
11047 default:
11048 abort ();
11049 }
11050 break;
11051 case 'V':
11052 if (l == 0)
11053 abort ();
11054 else if (l == 1)
11055 {
11056 switch (last[0])
11057 {
11058 case 'X':
11059 if (ins->vex.evex)
11060 break;
11061 *ins->obufp++ = '{';
11062 *ins->obufp++ = 'v';
11063 *ins->obufp++ = 'e';
11064 *ins->obufp++ = 'x';
11065 *ins->obufp++ = '}';
11066 *ins->obufp++ = ' ';
11067 break;
11068 case 'L':
11069 if (!(ins->rex & REX_W))
11070 break;
11071 *ins->obufp++ = 'a';
11072 *ins->obufp++ = 'b';
11073 *ins->obufp++ = 's';
11074 break;
11075 default:
11076 abort ();
11077 }
11078 }
11079 else
11080 abort ();
11081 goto case_S;
11082 case 'W':
11083 if (l == 0)
11084 {
11085 /* operand size flag for cwtl, cbtw */
11086 USED_REX (REX_W);
11087 if (ins->rex & REX_W)
11088 {
11089 if (ins->intel_syntax)
11090 *ins->obufp++ = 'd';
11091 else
11092 *ins->obufp++ = 'l';
11093 }
11094 else if (sizeflag & DFLAG)
11095 *ins->obufp++ = 'w';
11096 else
11097 *ins->obufp++ = 'b';
11098 if (!(ins->rex & REX_W))
11099 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11100 }
11101 else if (l == 1)
11102 {
11103 if (!ins->need_vex)
11104 abort ();
11105 if (last[0] == 'X')
11106 *ins->obufp++ = ins->vex.w ? 'd': 's';
11107 else if (last[0] == 'B')
11108 *ins->obufp++ = ins->vex.w ? 'w': 'b';
11109 else
11110 abort ();
11111 }
11112 else
11113 abort ();
11114 break;
11115 case 'X':
11116 if (l != 0)
11117 abort ();
11118 if (ins->need_vex
11119 ? ins->vex.prefix == DATA_PREFIX_OPCODE
11120 : ins->prefixes & PREFIX_DATA)
11121 {
11122 *ins->obufp++ = 'd';
11123 ins->used_prefixes |= PREFIX_DATA;
11124 }
11125 else
11126 *ins->obufp++ = 's';
11127 break;
11128 case 'Y':
11129 if (l == 1 && last[0] == 'X')
11130 {
11131 if (!ins->need_vex)
11132 abort ();
11133 if (ins->intel_syntax
11134 || ((ins->modrm.mod == 3 || ins->vex.b)
11135 && !(sizeflag & SUFFIX_ALWAYS)))
11136 break;
11137 switch (ins->vex.length)
11138 {
11139 case 128:
11140 *ins->obufp++ = 'x';
11141 break;
11142 case 256:
11143 *ins->obufp++ = 'y';
11144 break;
11145 case 512:
11146 if (!ins->vex.evex)
11147 default:
11148 abort ();
11149 }
11150 }
11151 else
11152 abort ();
11153 break;
11154 case 'Z':
11155 if (l == 0)
11156 {
11157 /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
11158 ins->modrm.mod = 3;
11159 if (!ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
11160 *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
11161 }
11162 else if (l == 1 && last[0] == 'X')
11163 {
11164 if (!ins->vex.evex)
11165 abort ();
11166 if (ins->intel_syntax
11167 || ((ins->modrm.mod == 3 || ins->vex.b)
11168 && !(sizeflag & SUFFIX_ALWAYS)))
11169 break;
11170 switch (ins->vex.length)
11171 {
11172 case 128:
11173 *ins->obufp++ = 'x';
11174 break;
11175 case 256:
11176 *ins->obufp++ = 'y';
11177 break;
11178 case 512:
11179 *ins->obufp++ = 'z';
11180 break;
11181 default:
11182 abort ();
11183 }
11184 }
11185 else
11186 abort ();
11187 break;
11188 case '^':
11189 if (ins->intel_syntax)
11190 break;
11191 if (ins->isa64 == intel64 && (ins->rex & REX_W))
11192 {
11193 USED_REX (REX_W);
11194 *ins->obufp++ = 'q';
11195 break;
11196 }
11197 if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
11198 {
11199 if (sizeflag & DFLAG)
11200 *ins->obufp++ = 'l';
11201 else
11202 *ins->obufp++ = 'w';
11203 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11204 }
11205 break;
11206 }
11207
11208 if (len == l)
11209 len = l = 0;
11210 }
11211 *ins->obufp = 0;
11212 ins->mnemonicendp = ins->obufp;
11213 return 0;
11214 }
11215
11216 /* Add a style marker to *INS->obufp that encodes STYLE. This assumes that
11217 the buffer pointed to by INS->obufp has space. A style marker is made
11218 from the STYLE_MARKER_CHAR followed by STYLE converted to a single hex
11219 digit, followed by another STYLE_MARKER_CHAR. This function assumes
11220 that the number of styles is not greater than 16. */
11221
11222 static void
11223 oappend_insert_style (instr_info *ins, enum disassembler_style style)
11224 {
11225 unsigned num = (unsigned) style;
11226
11227 /* We currently assume that STYLE can be encoded as a single hex
11228 character. If more styles are added then this might start to fail,
11229 and we'll need to expand this code. */
11230 if (num > 0xf)
11231 abort ();
11232
11233 *ins->obufp++ = STYLE_MARKER_CHAR;
11234 *ins->obufp++ = (num < 10 ? ('0' + num)
11235 : ((num < 16) ? ('a' + (num - 10)) : '0'));
11236 *ins->obufp++ = STYLE_MARKER_CHAR;
11237
11238 /* This final null character is not strictly necessary, after inserting a
11239 style marker we should always be inserting some additional content.
11240 However, having the buffer null terminated doesn't cost much, and make
11241 it easier to debug what's going on. Also, if we do ever forget to add
11242 any additional content after this style marker, then the buffer will
11243 still be well formed. */
11244 *ins->obufp = '\0';
11245 }
11246
11247 static void
11248 oappend_with_style (instr_info *ins, const char *s,
11249 enum disassembler_style style)
11250 {
11251 oappend_insert_style (ins, style);
11252 ins->obufp = stpcpy (ins->obufp, s);
11253 }
11254
11255 /* Like oappend_with_style but always with text style. */
11256
11257 static void
11258 oappend (instr_info *ins, const char *s)
11259 {
11260 oappend_with_style (ins, s, dis_style_text);
11261 }
11262
11263 /* Add a single character C to the buffer pointer to by INS->obufp, marking
11264 the style for the character as STYLE. */
11265
11266 static void
11267 oappend_char_with_style (instr_info *ins, const char c,
11268 enum disassembler_style style)
11269 {
11270 oappend_insert_style (ins, style);
11271 *ins->obufp++ = c;
11272 *ins->obufp = '\0';
11273 }
11274
11275 /* Like oappend_char_with_style, but always uses dis_style_text. */
11276
11277 static void
11278 oappend_char (instr_info *ins, const char c)
11279 {
11280 oappend_char_with_style (ins, c, dis_style_text);
11281 }
11282
11283 static void
11284 append_seg (instr_info *ins)
11285 {
11286 /* Only print the active segment register. */
11287 if (!ins->active_seg_prefix)
11288 return;
11289
11290 ins->used_prefixes |= ins->active_seg_prefix;
11291 switch (ins->active_seg_prefix)
11292 {
11293 case PREFIX_CS:
11294 oappend_register (ins, "%cs");
11295 break;
11296 case PREFIX_DS:
11297 oappend_register (ins, "%ds");
11298 break;
11299 case PREFIX_SS:
11300 oappend_register (ins, "%ss");
11301 break;
11302 case PREFIX_ES:
11303 oappend_register (ins, "%es");
11304 break;
11305 case PREFIX_FS:
11306 oappend_register (ins, "%fs");
11307 break;
11308 case PREFIX_GS:
11309 oappend_register (ins, "%gs");
11310 break;
11311 default:
11312 break;
11313 }
11314 oappend_char (ins, ':');
11315 }
11316
11317 static void
11318 OP_indirE (instr_info *ins, int bytemode, int sizeflag)
11319 {
11320 if (!ins->intel_syntax)
11321 oappend (ins, "*");
11322 OP_E (ins, bytemode, sizeflag);
11323 }
11324
11325 static void
11326 print_operand_value (instr_info *ins, bfd_vma disp,
11327 enum disassembler_style style)
11328 {
11329 char tmp[30];
11330
11331 if (ins->address_mode == mode_64bit)
11332 sprintf (tmp, "0x%" PRIx64, (uint64_t) disp);
11333 else
11334 sprintf (tmp, "0x%x", (unsigned int) disp);
11335 oappend_with_style (ins, tmp, style);
11336 }
11337
11338 /* Like oappend, but called for immediate operands. */
11339
11340 static void
11341 oappend_immediate (instr_info *ins, bfd_vma imm)
11342 {
11343 if (!ins->intel_syntax)
11344 oappend_char_with_style (ins, '$', dis_style_immediate);
11345 print_operand_value (ins, imm, dis_style_immediate);
11346 }
11347
11348 /* Put DISP in BUF as signed hex number. */
11349
11350 static void
11351 print_displacement (instr_info *ins, bfd_vma disp)
11352 {
11353 bfd_signed_vma val = disp;
11354 char tmp[30];
11355
11356 if (val < 0)
11357 {
11358 oappend_char_with_style (ins, '-', dis_style_address_offset);
11359 val = -disp;
11360
11361 /* Check for possible overflow. */
11362 if (val < 0)
11363 {
11364 switch (ins->address_mode)
11365 {
11366 case mode_64bit:
11367 oappend_with_style (ins, "0x8000000000000000",
11368 dis_style_address_offset);
11369 break;
11370 case mode_32bit:
11371 oappend_with_style (ins, "0x80000000",
11372 dis_style_address_offset);
11373 break;
11374 case mode_16bit:
11375 oappend_with_style (ins, "0x8000",
11376 dis_style_address_offset);
11377 break;
11378 }
11379 return;
11380 }
11381 }
11382
11383 sprintf (tmp, "0x%" PRIx64, (int64_t) val);
11384 oappend_with_style (ins, tmp, dis_style_address_offset);
11385 }
11386
11387 static void
11388 intel_operand_size (instr_info *ins, int bytemode, int sizeflag)
11389 {
11390 if (ins->vex.b)
11391 {
11392 if (!ins->vex.no_broadcast)
11393 switch (bytemode)
11394 {
11395 case x_mode:
11396 case evex_half_bcst_xmmq_mode:
11397 if (ins->vex.w)
11398 oappend (ins, "QWORD BCST ");
11399 else
11400 oappend (ins, "DWORD BCST ");
11401 break;
11402 case xh_mode:
11403 case evex_half_bcst_xmmqh_mode:
11404 case evex_half_bcst_xmmqdh_mode:
11405 oappend (ins, "WORD BCST ");
11406 break;
11407 default:
11408 ins->vex.no_broadcast = true;
11409 break;
11410 }
11411 return;
11412 }
11413 switch (bytemode)
11414 {
11415 case b_mode:
11416 case b_swap_mode:
11417 case db_mode:
11418 oappend (ins, "BYTE PTR ");
11419 break;
11420 case w_mode:
11421 case w_swap_mode:
11422 case dw_mode:
11423 oappend (ins, "WORD PTR ");
11424 break;
11425 case indir_v_mode:
11426 if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
11427 {
11428 oappend (ins, "QWORD PTR ");
11429 break;
11430 }
11431 /* Fall through. */
11432 case stack_v_mode:
11433 if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
11434 || (ins->rex & REX_W)))
11435 {
11436 oappend (ins, "QWORD PTR ");
11437 break;
11438 }
11439 /* Fall through. */
11440 case v_mode:
11441 case v_swap_mode:
11442 case dq_mode:
11443 USED_REX (REX_W);
11444 if (ins->rex & REX_W)
11445 oappend (ins, "QWORD PTR ");
11446 else if (bytemode == dq_mode)
11447 oappend (ins, "DWORD PTR ");
11448 else
11449 {
11450 if (sizeflag & DFLAG)
11451 oappend (ins, "DWORD PTR ");
11452 else
11453 oappend (ins, "WORD PTR ");
11454 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11455 }
11456 break;
11457 case z_mode:
11458 if ((ins->rex & REX_W) || (sizeflag & DFLAG))
11459 *ins->obufp++ = 'D';
11460 oappend (ins, "WORD PTR ");
11461 if (!(ins->rex & REX_W))
11462 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11463 break;
11464 case a_mode:
11465 if (sizeflag & DFLAG)
11466 oappend (ins, "QWORD PTR ");
11467 else
11468 oappend (ins, "DWORD PTR ");
11469 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11470 break;
11471 case movsxd_mode:
11472 if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
11473 oappend (ins, "WORD PTR ");
11474 else
11475 oappend (ins, "DWORD PTR ");
11476 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11477 break;
11478 case d_mode:
11479 case d_swap_mode:
11480 oappend (ins, "DWORD PTR ");
11481 break;
11482 case q_mode:
11483 case q_swap_mode:
11484 oappend (ins, "QWORD PTR ");
11485 break;
11486 case m_mode:
11487 if (ins->address_mode == mode_64bit)
11488 oappend (ins, "QWORD PTR ");
11489 else
11490 oappend (ins, "DWORD PTR ");
11491 break;
11492 case f_mode:
11493 if (sizeflag & DFLAG)
11494 oappend (ins, "FWORD PTR ");
11495 else
11496 oappend (ins, "DWORD PTR ");
11497 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11498 break;
11499 case t_mode:
11500 oappend (ins, "TBYTE PTR ");
11501 break;
11502 case x_mode:
11503 case xh_mode:
11504 case x_swap_mode:
11505 case evex_x_gscat_mode:
11506 case evex_x_nobcst_mode:
11507 case bw_unit_mode:
11508 if (ins->need_vex)
11509 {
11510 switch (ins->vex.length)
11511 {
11512 case 128:
11513 oappend (ins, "XMMWORD PTR ");
11514 break;
11515 case 256:
11516 oappend (ins, "YMMWORD PTR ");
11517 break;
11518 case 512:
11519 oappend (ins, "ZMMWORD PTR ");
11520 break;
11521 default:
11522 abort ();
11523 }
11524 }
11525 else
11526 oappend (ins, "XMMWORD PTR ");
11527 break;
11528 case xmm_mode:
11529 oappend (ins, "XMMWORD PTR ");
11530 break;
11531 case ymm_mode:
11532 oappend (ins, "YMMWORD PTR ");
11533 break;
11534 case xmmq_mode:
11535 case evex_half_bcst_xmmqh_mode:
11536 case evex_half_bcst_xmmq_mode:
11537 if (!ins->need_vex)
11538 abort ();
11539
11540 switch (ins->vex.length)
11541 {
11542 case 128:
11543 oappend (ins, "QWORD PTR ");
11544 break;
11545 case 256:
11546 oappend (ins, "XMMWORD PTR ");
11547 break;
11548 case 512:
11549 oappend (ins, "YMMWORD PTR ");
11550 break;
11551 default:
11552 abort ();
11553 }
11554 break;
11555 case xmmdw_mode:
11556 if (!ins->need_vex)
11557 abort ();
11558
11559 switch (ins->vex.length)
11560 {
11561 case 128:
11562 oappend (ins, "WORD PTR ");
11563 break;
11564 case 256:
11565 oappend (ins, "DWORD PTR ");
11566 break;
11567 case 512:
11568 oappend (ins, "QWORD PTR ");
11569 break;
11570 default:
11571 abort ();
11572 }
11573 break;
11574 case xmmqd_mode:
11575 case evex_half_bcst_xmmqdh_mode:
11576 if (!ins->need_vex)
11577 abort ();
11578
11579 switch (ins->vex.length)
11580 {
11581 case 128:
11582 oappend (ins, "DWORD PTR ");
11583 break;
11584 case 256:
11585 oappend (ins, "QWORD PTR ");
11586 break;
11587 case 512:
11588 oappend (ins, "XMMWORD PTR ");
11589 break;
11590 default:
11591 abort ();
11592 }
11593 break;
11594 case ymmq_mode:
11595 if (!ins->need_vex)
11596 abort ();
11597
11598 switch (ins->vex.length)
11599 {
11600 case 128:
11601 oappend (ins, "QWORD PTR ");
11602 break;
11603 case 256:
11604 oappend (ins, "YMMWORD PTR ");
11605 break;
11606 case 512:
11607 oappend (ins, "ZMMWORD PTR ");
11608 break;
11609 default:
11610 abort ();
11611 }
11612 break;
11613 case o_mode:
11614 oappend (ins, "OWORD PTR ");
11615 break;
11616 case vex_vsib_d_w_dq_mode:
11617 case vex_vsib_q_w_dq_mode:
11618 if (!ins->need_vex)
11619 abort ();
11620 if (ins->vex.w)
11621 oappend (ins, "QWORD PTR ");
11622 else
11623 oappend (ins, "DWORD PTR ");
11624 break;
11625 case mask_bd_mode:
11626 if (!ins->need_vex || ins->vex.length != 128)
11627 abort ();
11628 if (ins->vex.w)
11629 oappend (ins, "DWORD PTR ");
11630 else
11631 oappend (ins, "BYTE PTR ");
11632 break;
11633 case mask_mode:
11634 if (!ins->need_vex)
11635 abort ();
11636 if (ins->vex.w)
11637 oappend (ins, "QWORD PTR ");
11638 else
11639 oappend (ins, "WORD PTR ");
11640 break;
11641 case v_bnd_mode:
11642 case v_bndmk_mode:
11643 default:
11644 break;
11645 }
11646 }
11647
11648 static void
11649 print_register (instr_info *ins, unsigned int reg, unsigned int rexmask,
11650 int bytemode, int sizeflag)
11651 {
11652 const char *const *names;
11653
11654 USED_REX (rexmask);
11655 if (ins->rex & rexmask)
11656 reg += 8;
11657
11658 switch (bytemode)
11659 {
11660 case b_mode:
11661 case b_swap_mode:
11662 if (reg & 4)
11663 USED_REX (0);
11664 if (ins->rex)
11665 names = att_names8rex;
11666 else
11667 names = att_names8;
11668 break;
11669 case w_mode:
11670 names = att_names16;
11671 break;
11672 case d_mode:
11673 case dw_mode:
11674 case db_mode:
11675 names = att_names32;
11676 break;
11677 case q_mode:
11678 names = att_names64;
11679 break;
11680 case m_mode:
11681 case v_bnd_mode:
11682 names = ins->address_mode == mode_64bit ? att_names64 : att_names32;
11683 break;
11684 case bnd_mode:
11685 case bnd_swap_mode:
11686 if (reg > 0x3)
11687 {
11688 oappend (ins, "(bad)");
11689 return;
11690 }
11691 names = att_names_bnd;
11692 break;
11693 case indir_v_mode:
11694 if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
11695 {
11696 names = att_names64;
11697 break;
11698 }
11699 /* Fall through. */
11700 case stack_v_mode:
11701 if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
11702 || (ins->rex & REX_W)))
11703 {
11704 names = att_names64;
11705 break;
11706 }
11707 bytemode = v_mode;
11708 /* Fall through. */
11709 case v_mode:
11710 case v_swap_mode:
11711 case dq_mode:
11712 USED_REX (REX_W);
11713 if (ins->rex & REX_W)
11714 names = att_names64;
11715 else if (bytemode != v_mode && bytemode != v_swap_mode)
11716 names = att_names32;
11717 else
11718 {
11719 if (sizeflag & DFLAG)
11720 names = att_names32;
11721 else
11722 names = att_names16;
11723 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11724 }
11725 break;
11726 case movsxd_mode:
11727 if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
11728 names = att_names16;
11729 else
11730 names = att_names32;
11731 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
11732 break;
11733 case va_mode:
11734 names = (ins->address_mode == mode_64bit
11735 ? att_names64 : att_names32);
11736 if (!(ins->prefixes & PREFIX_ADDR))
11737 names = (ins->address_mode == mode_16bit
11738 ? att_names16 : names);
11739 else
11740 {
11741 /* Remove "addr16/addr32". */
11742 ins->all_prefixes[ins->last_addr_prefix] = 0;
11743 names = (ins->address_mode != mode_32bit
11744 ? att_names32 : att_names16);
11745 ins->used_prefixes |= PREFIX_ADDR;
11746 }
11747 break;
11748 case mask_bd_mode:
11749 case mask_mode:
11750 if (reg > 0x7)
11751 {
11752 oappend (ins, "(bad)");
11753 return;
11754 }
11755 names = att_names_mask;
11756 break;
11757 case 0:
11758 return;
11759 default:
11760 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
11761 return;
11762 }
11763 oappend_register (ins, names[reg]);
11764 }
11765
11766 static void
11767 OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
11768 {
11769 bfd_vma disp = 0;
11770 int add = (ins->rex & REX_B) ? 8 : 0;
11771 int riprel = 0;
11772 int shift;
11773
11774 if (ins->vex.evex)
11775 {
11776 switch (bytemode)
11777 {
11778 case dw_mode:
11779 case w_mode:
11780 case w_swap_mode:
11781 shift = 1;
11782 break;
11783 case db_mode:
11784 case b_mode:
11785 shift = 0;
11786 break;
11787 case dq_mode:
11788 if (ins->address_mode != mode_64bit)
11789 {
11790 case d_mode:
11791 case d_swap_mode:
11792 shift = 2;
11793 break;
11794 }
11795 /* fall through */
11796 case vex_vsib_d_w_dq_mode:
11797 case vex_vsib_q_w_dq_mode:
11798 case evex_x_gscat_mode:
11799 shift = ins->vex.w ? 3 : 2;
11800 break;
11801 case xh_mode:
11802 case evex_half_bcst_xmmqh_mode:
11803 case evex_half_bcst_xmmqdh_mode:
11804 if (ins->vex.b)
11805 {
11806 shift = ins->vex.w ? 2 : 1;
11807 break;
11808 }
11809 /* Fall through. */
11810 case x_mode:
11811 case evex_half_bcst_xmmq_mode:
11812 if (ins->vex.b)
11813 {
11814 shift = ins->vex.w ? 3 : 2;
11815 break;
11816 }
11817 /* Fall through. */
11818 case xmmqd_mode:
11819 case xmmdw_mode:
11820 case xmmq_mode:
11821 case ymmq_mode:
11822 case evex_x_nobcst_mode:
11823 case x_swap_mode:
11824 switch (ins->vex.length)
11825 {
11826 case 128:
11827 shift = 4;
11828 break;
11829 case 256:
11830 shift = 5;
11831 break;
11832 case 512:
11833 shift = 6;
11834 break;
11835 default:
11836 abort ();
11837 }
11838 /* Make necessary corrections to shift for modes that need it. */
11839 if (bytemode == xmmq_mode
11840 || bytemode == evex_half_bcst_xmmqh_mode
11841 || bytemode == evex_half_bcst_xmmq_mode
11842 || (bytemode == ymmq_mode && ins->vex.length == 128))
11843 shift -= 1;
11844 else if (bytemode == xmmqd_mode
11845 || bytemode == evex_half_bcst_xmmqdh_mode)
11846 shift -= 2;
11847 else if (bytemode == xmmdw_mode)
11848 shift -= 3;
11849 break;
11850 case ymm_mode:
11851 shift = 5;
11852 break;
11853 case xmm_mode:
11854 shift = 4;
11855 break;
11856 case q_mode:
11857 case q_swap_mode:
11858 shift = 3;
11859 break;
11860 case bw_unit_mode:
11861 shift = ins->vex.w ? 1 : 0;
11862 break;
11863 default:
11864 abort ();
11865 }
11866 }
11867 else
11868 shift = 0;
11869
11870 USED_REX (REX_B);
11871 if (ins->intel_syntax)
11872 intel_operand_size (ins, bytemode, sizeflag);
11873 append_seg (ins);
11874
11875 if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
11876 {
11877 /* 32/64 bit address mode */
11878 int havedisp;
11879 int havebase;
11880 int needindex;
11881 int needaddr32;
11882 int base, rbase;
11883 int vindex = 0;
11884 int scale = 0;
11885 int addr32flag = !((sizeflag & AFLAG)
11886 || bytemode == v_bnd_mode
11887 || bytemode == v_bndmk_mode
11888 || bytemode == bnd_mode
11889 || bytemode == bnd_swap_mode);
11890 bool check_gather = false;
11891 const char *const *indexes = NULL;
11892
11893 havebase = 1;
11894 base = ins->modrm.rm;
11895
11896 if (base == 4)
11897 {
11898 vindex = ins->sib.index;
11899 USED_REX (REX_X);
11900 if (ins->rex & REX_X)
11901 vindex += 8;
11902 switch (bytemode)
11903 {
11904 case vex_vsib_d_w_dq_mode:
11905 case vex_vsib_q_w_dq_mode:
11906 if (!ins->need_vex)
11907 abort ();
11908 if (ins->vex.evex)
11909 {
11910 if (!ins->vex.v)
11911 vindex += 16;
11912 check_gather = ins->obufp == ins->op_out[1];
11913 }
11914
11915 switch (ins->vex.length)
11916 {
11917 case 128:
11918 indexes = att_names_xmm;
11919 break;
11920 case 256:
11921 if (!ins->vex.w
11922 || bytemode == vex_vsib_q_w_dq_mode)
11923 indexes = att_names_ymm;
11924 else
11925 indexes = att_names_xmm;
11926 break;
11927 case 512:
11928 if (!ins->vex.w
11929 || bytemode == vex_vsib_q_w_dq_mode)
11930 indexes = att_names_zmm;
11931 else
11932 indexes = att_names_ymm;
11933 break;
11934 default:
11935 abort ();
11936 }
11937 break;
11938 default:
11939 if (vindex != 4)
11940 indexes = ins->address_mode == mode_64bit && !addr32flag
11941 ? att_names64 : att_names32;
11942 break;
11943 }
11944 scale = ins->sib.scale;
11945 base = ins->sib.base;
11946 ins->codep++;
11947 }
11948 else
11949 {
11950 /* Check for mandatory SIB. */
11951 if (bytemode == vex_vsib_d_w_dq_mode
11952 || bytemode == vex_vsib_q_w_dq_mode
11953 || bytemode == vex_sibmem_mode)
11954 {
11955 oappend (ins, "(bad)");
11956 return;
11957 }
11958 }
11959 rbase = base + add;
11960
11961 switch (ins->modrm.mod)
11962 {
11963 case 0:
11964 if (base == 5)
11965 {
11966 havebase = 0;
11967 if (ins->address_mode == mode_64bit && !ins->has_sib)
11968 riprel = 1;
11969 disp = get32s (ins);
11970 if (riprel && bytemode == v_bndmk_mode)
11971 {
11972 oappend (ins, "(bad)");
11973 return;
11974 }
11975 }
11976 break;
11977 case 1:
11978 FETCH_DATA (ins->info, ins->codep + 1);
11979 disp = *ins->codep++;
11980 if ((disp & 0x80) != 0)
11981 disp -= 0x100;
11982 if (ins->vex.evex && shift > 0)
11983 disp <<= shift;
11984 break;
11985 case 2:
11986 disp = get32s (ins);
11987 break;
11988 }
11989
11990 needindex = 0;
11991 needaddr32 = 0;
11992 if (ins->has_sib
11993 && !havebase
11994 && !indexes
11995 && ins->address_mode != mode_16bit)
11996 {
11997 if (ins->address_mode == mode_64bit)
11998 {
11999 if (addr32flag)
12000 {
12001 /* Without base nor index registers, zero-extend the
12002 lower 32-bit displacement to 64 bits. */
12003 disp = (unsigned int) disp;
12004 needindex = 1;
12005 }
12006 needaddr32 = 1;
12007 }
12008 else
12009 {
12010 /* In 32-bit mode, we need index register to tell [offset]
12011 from [eiz*1 + offset]. */
12012 needindex = 1;
12013 }
12014 }
12015
12016 havedisp = (havebase
12017 || needindex
12018 || (ins->has_sib && (indexes || scale != 0)));
12019
12020 if (!ins->intel_syntax)
12021 if (ins->modrm.mod != 0 || base == 5)
12022 {
12023 if (havedisp || riprel)
12024 print_displacement (ins, disp);
12025 else
12026 print_operand_value (ins, disp, dis_style_address_offset);
12027 if (riprel)
12028 {
12029 set_op (ins, disp, true);
12030 oappend_char (ins, '(');
12031 oappend_with_style (ins, !addr32flag ? "%rip" : "%eip",
12032 dis_style_register);
12033 oappend_char (ins, ')');
12034 }
12035 }
12036
12037 if ((havebase || indexes || needindex || needaddr32 || riprel)
12038 && (ins->address_mode != mode_64bit
12039 || ((bytemode != v_bnd_mode)
12040 && (bytemode != v_bndmk_mode)
12041 && (bytemode != bnd_mode)
12042 && (bytemode != bnd_swap_mode))))
12043 ins->used_prefixes |= PREFIX_ADDR;
12044
12045 if (havedisp || (ins->intel_syntax && riprel))
12046 {
12047 oappend_char (ins, ins->open_char);
12048 if (ins->intel_syntax && riprel)
12049 {
12050 set_op (ins, disp, true);
12051 oappend_with_style (ins, !addr32flag ? "rip" : "eip",
12052 dis_style_register);
12053 }
12054 if (havebase)
12055 oappend_register
12056 (ins,
12057 (ins->address_mode == mode_64bit && !addr32flag
12058 ? att_names64 : att_names32)[rbase]);
12059 if (ins->has_sib)
12060 {
12061 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
12062 print index to tell base + index from base. */
12063 if (scale != 0
12064 || needindex
12065 || indexes
12066 || (havebase && base != ESP_REG_NUM))
12067 {
12068 if (!ins->intel_syntax || havebase)
12069 oappend_char (ins, ins->separator_char);
12070 if (indexes)
12071 {
12072 if (ins->address_mode == mode_64bit || vindex < 16)
12073 oappend_register (ins, indexes[vindex]);
12074 else
12075 oappend (ins, "(bad)");
12076 }
12077 else
12078 oappend_register (ins,
12079 ins->address_mode == mode_64bit
12080 && !addr32flag
12081 ? att_index64
12082 : att_index32);
12083
12084 oappend_char (ins, ins->scale_char);
12085 oappend_char_with_style (ins, '0' + (1 << scale),
12086 dis_style_immediate);
12087 }
12088 }
12089 if (ins->intel_syntax
12090 && (disp || ins->modrm.mod != 0 || base == 5))
12091 {
12092 if (!havedisp || (bfd_signed_vma) disp >= 0)
12093 oappend_char (ins, '+');
12094 else if (ins->modrm.mod != 1 && disp != -disp)
12095 {
12096 oappend_char (ins, '-');
12097 disp = -disp;
12098 }
12099
12100 if (havedisp)
12101 print_displacement (ins, disp);
12102 else
12103 print_operand_value (ins, disp, dis_style_address_offset);
12104 }
12105
12106 oappend_char (ins, ins->close_char);
12107
12108 if (check_gather)
12109 {
12110 /* Both XMM/YMM/ZMM registers must be distinct. */
12111 int modrm_reg = ins->modrm.reg;
12112
12113 if (ins->rex & REX_R)
12114 modrm_reg += 8;
12115 if (!ins->vex.r)
12116 modrm_reg += 16;
12117 if (vindex == modrm_reg)
12118 oappend (ins, "/(bad)");
12119 }
12120 }
12121 else if (ins->intel_syntax)
12122 {
12123 if (ins->modrm.mod != 0 || base == 5)
12124 {
12125 if (!ins->active_seg_prefix)
12126 {
12127 oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12128 oappend (ins, ":");
12129 }
12130 print_operand_value (ins, disp, dis_style_text);
12131 }
12132 }
12133 }
12134 else if (bytemode == v_bnd_mode
12135 || bytemode == v_bndmk_mode
12136 || bytemode == bnd_mode
12137 || bytemode == bnd_swap_mode
12138 || bytemode == vex_vsib_d_w_dq_mode
12139 || bytemode == vex_vsib_q_w_dq_mode)
12140 {
12141 oappend (ins, "(bad)");
12142 return;
12143 }
12144 else
12145 {
12146 /* 16 bit address mode */
12147 ins->used_prefixes |= ins->prefixes & PREFIX_ADDR;
12148 switch (ins->modrm.mod)
12149 {
12150 case 0:
12151 if (ins->modrm.rm == 6)
12152 {
12153 disp = get16 (ins);
12154 if ((disp & 0x8000) != 0)
12155 disp -= 0x10000;
12156 }
12157 break;
12158 case 1:
12159 FETCH_DATA (ins->info, ins->codep + 1);
12160 disp = *ins->codep++;
12161 if ((disp & 0x80) != 0)
12162 disp -= 0x100;
12163 if (ins->vex.evex && shift > 0)
12164 disp <<= shift;
12165 break;
12166 case 2:
12167 disp = get16 (ins);
12168 if ((disp & 0x8000) != 0)
12169 disp -= 0x10000;
12170 break;
12171 }
12172
12173 if (!ins->intel_syntax)
12174 if (ins->modrm.mod != 0 || ins->modrm.rm == 6)
12175 print_displacement (ins, disp);
12176
12177 if (ins->modrm.mod != 0 || ins->modrm.rm != 6)
12178 {
12179 oappend_char (ins, ins->open_char);
12180 oappend (ins, (ins->intel_syntax ? intel_index16
12181 : att_index16)[ins->modrm.rm]);
12182 if (ins->intel_syntax
12183 && (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6))
12184 {
12185 if ((bfd_signed_vma) disp >= 0)
12186 oappend_char (ins, '+');
12187 else if (ins->modrm.mod != 1)
12188 {
12189 oappend_char (ins, '-');
12190 disp = -disp;
12191 }
12192
12193 print_displacement (ins, disp);
12194 }
12195
12196 oappend_char (ins, ins->close_char);
12197 }
12198 else if (ins->intel_syntax)
12199 {
12200 if (!ins->active_seg_prefix)
12201 {
12202 oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12203 oappend (ins, ":");
12204 }
12205 print_operand_value (ins, disp & 0xffff, dis_style_text);
12206 }
12207 }
12208 if (ins->vex.b)
12209 {
12210 ins->evex_used |= EVEX_b_used;
12211
12212 /* Broadcast can only ever be valid for memory sources. */
12213 if (ins->obufp == ins->op_out[0])
12214 ins->vex.no_broadcast = true;
12215
12216 if (!ins->vex.no_broadcast
12217 && (!ins->intel_syntax || !(ins->evex_used & EVEX_len_used)))
12218 {
12219 if (bytemode == xh_mode)
12220 {
12221 switch (ins->vex.length)
12222 {
12223 case 128:
12224 oappend (ins, "{1to8}");
12225 break;
12226 case 256:
12227 oappend (ins, "{1to16}");
12228 break;
12229 case 512:
12230 oappend (ins, "{1to32}");
12231 break;
12232 default:
12233 abort ();
12234 }
12235 }
12236 else if (bytemode == q_mode
12237 || bytemode == ymmq_mode)
12238 ins->vex.no_broadcast = true;
12239 else if (ins->vex.w
12240 || bytemode == evex_half_bcst_xmmqdh_mode
12241 || bytemode == evex_half_bcst_xmmq_mode)
12242 {
12243 switch (ins->vex.length)
12244 {
12245 case 128:
12246 oappend (ins, "{1to2}");
12247 break;
12248 case 256:
12249 oappend (ins, "{1to4}");
12250 break;
12251 case 512:
12252 oappend (ins, "{1to8}");
12253 break;
12254 default:
12255 abort ();
12256 }
12257 }
12258 else if (bytemode == x_mode
12259 || bytemode == evex_half_bcst_xmmqh_mode)
12260 {
12261 switch (ins->vex.length)
12262 {
12263 case 128:
12264 oappend (ins, "{1to4}");
12265 break;
12266 case 256:
12267 oappend (ins, "{1to8}");
12268 break;
12269 case 512:
12270 oappend (ins, "{1to16}");
12271 break;
12272 default:
12273 abort ();
12274 }
12275 }
12276 else
12277 ins->vex.no_broadcast = true;
12278 }
12279 if (ins->vex.no_broadcast)
12280 oappend (ins, "{bad}");
12281 }
12282 }
12283
12284 static void
12285 OP_E (instr_info *ins, int bytemode, int sizeflag)
12286 {
12287 /* Skip mod/rm byte. */
12288 MODRM_CHECK;
12289 ins->codep++;
12290
12291 if (ins->modrm.mod == 3)
12292 {
12293 if ((sizeflag & SUFFIX_ALWAYS)
12294 && (bytemode == b_swap_mode
12295 || bytemode == bnd_swap_mode
12296 || bytemode == v_swap_mode))
12297 swap_operand (ins);
12298
12299 print_register (ins, ins->modrm.rm, REX_B, bytemode, sizeflag);
12300 }
12301 else
12302 OP_E_memory (ins, bytemode, sizeflag);
12303 }
12304
12305 static void
12306 OP_G (instr_info *ins, int bytemode, int sizeflag)
12307 {
12308 if (ins->vex.evex && !ins->vex.r && ins->address_mode == mode_64bit)
12309 {
12310 oappend (ins, "(bad)");
12311 return;
12312 }
12313
12314 print_register (ins, ins->modrm.reg, REX_R, bytemode, sizeflag);
12315 }
12316
12317 #ifdef BFD64
12318 static bfd_vma
12319 get64 (instr_info *ins)
12320 {
12321 bfd_vma x;
12322 unsigned int a;
12323 unsigned int b;
12324
12325 FETCH_DATA (ins->info, ins->codep + 8);
12326 a = *ins->codep++ & 0xff;
12327 a |= (*ins->codep++ & 0xff) << 8;
12328 a |= (*ins->codep++ & 0xff) << 16;
12329 a |= (*ins->codep++ & 0xffu) << 24;
12330 b = *ins->codep++ & 0xff;
12331 b |= (*ins->codep++ & 0xff) << 8;
12332 b |= (*ins->codep++ & 0xff) << 16;
12333 b |= (*ins->codep++ & 0xffu) << 24;
12334 x = a + ((bfd_vma) b << 32);
12335 return x;
12336 }
12337 #else
12338 static bfd_vma
12339 get64 (instr_info *ins ATTRIBUTE_UNUSED)
12340 {
12341 abort ();
12342 return 0;
12343 }
12344 #endif
12345
12346 static bfd_signed_vma
12347 get32 (instr_info *ins)
12348 {
12349 bfd_vma x = 0;
12350
12351 FETCH_DATA (ins->info, ins->codep + 4);
12352 x = *ins->codep++ & (bfd_vma) 0xff;
12353 x |= (*ins->codep++ & (bfd_vma) 0xff) << 8;
12354 x |= (*ins->codep++ & (bfd_vma) 0xff) << 16;
12355 x |= (*ins->codep++ & (bfd_vma) 0xff) << 24;
12356 return x;
12357 }
12358
12359 static bfd_signed_vma
12360 get32s (instr_info *ins)
12361 {
12362 bfd_vma x = 0;
12363
12364 FETCH_DATA (ins->info, ins->codep + 4);
12365 x = *ins->codep++ & (bfd_vma) 0xff;
12366 x |= (*ins->codep++ & (bfd_vma) 0xff) << 8;
12367 x |= (*ins->codep++ & (bfd_vma) 0xff) << 16;
12368 x |= (*ins->codep++ & (bfd_vma) 0xff) << 24;
12369
12370 x = (x ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
12371
12372 return x;
12373 }
12374
12375 static int
12376 get16 (instr_info *ins)
12377 {
12378 int x = 0;
12379
12380 FETCH_DATA (ins->info, ins->codep + 2);
12381 x = *ins->codep++ & 0xff;
12382 x |= (*ins->codep++ & 0xff) << 8;
12383 return x;
12384 }
12385
12386 static void
12387 set_op (instr_info *ins, bfd_vma op, bool riprel)
12388 {
12389 ins->op_index[ins->op_ad] = ins->op_ad;
12390 if (ins->address_mode == mode_64bit)
12391 ins->op_address[ins->op_ad] = op;
12392 else /* Mask to get a 32-bit address. */
12393 ins->op_address[ins->op_ad] = op & 0xffffffff;
12394 ins->op_riprel[ins->op_ad] = riprel;
12395 }
12396
12397 static void
12398 OP_REG (instr_info *ins, int code, int sizeflag)
12399 {
12400 const char *s;
12401 int add;
12402
12403 switch (code)
12404 {
12405 case es_reg: case ss_reg: case cs_reg:
12406 case ds_reg: case fs_reg: case gs_reg:
12407 oappend_register (ins, att_names_seg[code - es_reg]);
12408 return;
12409 }
12410
12411 USED_REX (REX_B);
12412 if (ins->rex & REX_B)
12413 add = 8;
12414 else
12415 add = 0;
12416
12417 switch (code)
12418 {
12419 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12420 case sp_reg: case bp_reg: case si_reg: case di_reg:
12421 s = att_names16[code - ax_reg + add];
12422 break;
12423 case ah_reg: case ch_reg: case dh_reg: case bh_reg:
12424 USED_REX (0);
12425 /* Fall through. */
12426 case al_reg: case cl_reg: case dl_reg: case bl_reg:
12427 if (ins->rex)
12428 s = att_names8rex[code - al_reg + add];
12429 else
12430 s = att_names8[code - al_reg];
12431 break;
12432 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12433 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12434 if (ins->address_mode == mode_64bit
12435 && ((sizeflag & DFLAG) || (ins->rex & REX_W)))
12436 {
12437 s = att_names64[code - rAX_reg + add];
12438 break;
12439 }
12440 code += eAX_reg - rAX_reg;
12441 /* Fall through. */
12442 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12443 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12444 USED_REX (REX_W);
12445 if (ins->rex & REX_W)
12446 s = att_names64[code - eAX_reg + add];
12447 else
12448 {
12449 if (sizeflag & DFLAG)
12450 s = att_names32[code - eAX_reg + add];
12451 else
12452 s = att_names16[code - eAX_reg + add];
12453 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12454 }
12455 break;
12456 default:
12457 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12458 return;
12459 }
12460 oappend_register (ins, s);
12461 }
12462
12463 static void
12464 OP_IMREG (instr_info *ins, int code, int sizeflag)
12465 {
12466 const char *s;
12467
12468 switch (code)
12469 {
12470 case indir_dx_reg:
12471 if (!ins->intel_syntax)
12472 {
12473 oappend (ins, "(%dx)");
12474 return;
12475 }
12476 s = att_names16[dx_reg - ax_reg];
12477 break;
12478 case al_reg: case cl_reg:
12479 s = att_names8[code - al_reg];
12480 break;
12481 case eAX_reg:
12482 USED_REX (REX_W);
12483 if (ins->rex & REX_W)
12484 {
12485 s = *att_names64;
12486 break;
12487 }
12488 /* Fall through. */
12489 case z_mode_ax_reg:
12490 if ((ins->rex & REX_W) || (sizeflag & DFLAG))
12491 s = *att_names32;
12492 else
12493 s = *att_names16;
12494 if (!(ins->rex & REX_W))
12495 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12496 break;
12497 default:
12498 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12499 return;
12500 }
12501 oappend_register (ins, s);
12502 }
12503
12504 static void
12505 OP_I (instr_info *ins, int bytemode, int sizeflag)
12506 {
12507 bfd_signed_vma op;
12508 bfd_signed_vma mask = -1;
12509
12510 switch (bytemode)
12511 {
12512 case b_mode:
12513 FETCH_DATA (ins->info, ins->codep + 1);
12514 op = *ins->codep++;
12515 mask = 0xff;
12516 break;
12517 case v_mode:
12518 USED_REX (REX_W);
12519 if (ins->rex & REX_W)
12520 op = get32s (ins);
12521 else
12522 {
12523 if (sizeflag & DFLAG)
12524 {
12525 op = get32 (ins);
12526 mask = 0xffffffff;
12527 }
12528 else
12529 {
12530 op = get16 (ins);
12531 mask = 0xfffff;
12532 }
12533 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12534 }
12535 break;
12536 case d_mode:
12537 mask = 0xffffffff;
12538 op = get32 (ins);
12539 break;
12540 case w_mode:
12541 mask = 0xfffff;
12542 op = get16 (ins);
12543 break;
12544 case const_1_mode:
12545 if (ins->intel_syntax)
12546 oappend (ins, "1");
12547 return;
12548 default:
12549 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12550 return;
12551 }
12552
12553 op &= mask;
12554 oappend_immediate (ins, op);
12555 }
12556
12557 static void
12558 OP_I64 (instr_info *ins, int bytemode, int sizeflag)
12559 {
12560 if (bytemode != v_mode || ins->address_mode != mode_64bit
12561 || !(ins->rex & REX_W))
12562 {
12563 OP_I (ins, bytemode, sizeflag);
12564 return;
12565 }
12566
12567 USED_REX (REX_W);
12568
12569 oappend_immediate (ins, get64 (ins));
12570 }
12571
12572 static void
12573 OP_sI (instr_info *ins, int bytemode, int sizeflag)
12574 {
12575 bfd_signed_vma op;
12576
12577 switch (bytemode)
12578 {
12579 case b_mode:
12580 case b_T_mode:
12581 FETCH_DATA (ins->info, ins->codep + 1);
12582 op = *ins->codep++;
12583 if ((op & 0x80) != 0)
12584 op -= 0x100;
12585 if (bytemode == b_T_mode)
12586 {
12587 if (ins->address_mode != mode_64bit
12588 || !((sizeflag & DFLAG) || (ins->rex & REX_W)))
12589 {
12590 /* The operand-size prefix is overridden by a REX prefix. */
12591 if ((sizeflag & DFLAG) || (ins->rex & REX_W))
12592 op &= 0xffffffff;
12593 else
12594 op &= 0xffff;
12595 }
12596 }
12597 else
12598 {
12599 if (!(ins->rex & REX_W))
12600 {
12601 if (sizeflag & DFLAG)
12602 op &= 0xffffffff;
12603 else
12604 op &= 0xffff;
12605 }
12606 }
12607 break;
12608 case v_mode:
12609 /* The operand-size prefix is overridden by a REX prefix. */
12610 if ((sizeflag & DFLAG) || (ins->rex & REX_W))
12611 op = get32s (ins);
12612 else
12613 op = get16 (ins);
12614 break;
12615 default:
12616 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12617 return;
12618 }
12619
12620 oappend_immediate (ins, op);
12621 }
12622
12623 static void
12624 OP_J (instr_info *ins, int bytemode, int sizeflag)
12625 {
12626 bfd_vma disp;
12627 bfd_vma mask = -1;
12628 bfd_vma segment = 0;
12629
12630 switch (bytemode)
12631 {
12632 case b_mode:
12633 FETCH_DATA (ins->info, ins->codep + 1);
12634 disp = *ins->codep++;
12635 if ((disp & 0x80) != 0)
12636 disp -= 0x100;
12637 break;
12638 case v_mode:
12639 case dqw_mode:
12640 if ((sizeflag & DFLAG)
12641 || (ins->address_mode == mode_64bit
12642 && ((ins->isa64 == intel64 && bytemode != dqw_mode)
12643 || (ins->rex & REX_W))))
12644 disp = get32s (ins);
12645 else
12646 {
12647 disp = get16 (ins);
12648 if ((disp & 0x8000) != 0)
12649 disp -= 0x10000;
12650 /* In 16bit mode, address is wrapped around at 64k within
12651 the same segment. Otherwise, a data16 prefix on a jump
12652 instruction means that the pc is masked to 16 bits after
12653 the displacement is added! */
12654 mask = 0xffff;
12655 if ((ins->prefixes & PREFIX_DATA) == 0)
12656 segment = ((ins->start_pc + (ins->codep - ins->start_codep))
12657 & ~((bfd_vma) 0xffff));
12658 }
12659 if (ins->address_mode != mode_64bit
12660 || (ins->isa64 != intel64 && !(ins->rex & REX_W)))
12661 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12662 break;
12663 default:
12664 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
12665 return;
12666 }
12667 disp = ((ins->start_pc + (ins->codep - ins->start_codep) + disp) & mask)
12668 | segment;
12669 set_op (ins, disp, false);
12670 print_operand_value (ins, disp, dis_style_text);
12671 }
12672
12673 static void
12674 OP_SEG (instr_info *ins, int bytemode, int sizeflag)
12675 {
12676 if (bytemode == w_mode)
12677 oappend_register (ins, att_names_seg[ins->modrm.reg]);
12678 else
12679 OP_E (ins, ins->modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12680 }
12681
12682 static void
12683 OP_DIR (instr_info *ins, int dummy ATTRIBUTE_UNUSED, int sizeflag)
12684 {
12685 int seg, offset, res;
12686 char scratch[24];
12687
12688 if (sizeflag & DFLAG)
12689 {
12690 offset = get32 (ins);
12691 seg = get16 (ins);
12692 }
12693 else
12694 {
12695 offset = get16 (ins);
12696 seg = get16 (ins);
12697 }
12698 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12699
12700 res = snprintf (scratch, ARRAY_SIZE (scratch),
12701 ins->intel_syntax ? "0x%x:0x%x" : "$0x%x,$0x%x",
12702 seg, offset);
12703 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12704 abort ();
12705 oappend (ins, scratch);
12706 }
12707
12708 static void
12709 OP_OFF (instr_info *ins, int bytemode, int sizeflag)
12710 {
12711 bfd_vma off;
12712
12713 if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12714 intel_operand_size (ins, bytemode, sizeflag);
12715 append_seg (ins);
12716
12717 if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
12718 off = get32 (ins);
12719 else
12720 off = get16 (ins);
12721
12722 if (ins->intel_syntax)
12723 {
12724 if (!ins->active_seg_prefix)
12725 {
12726 oappend_register (ins, att_names_seg[ds_reg - es_reg]);
12727 oappend (ins, ":");
12728 }
12729 }
12730 print_operand_value (ins, off, dis_style_address_offset);
12731 }
12732
12733 static void
12734 OP_OFF64 (instr_info *ins, int bytemode, int sizeflag)
12735 {
12736 bfd_vma off;
12737
12738 if (ins->address_mode != mode_64bit
12739 || (ins->prefixes & PREFIX_ADDR))
12740 {
12741 OP_OFF (ins, bytemode, sizeflag);
12742 return;
12743 }
12744
12745 if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12746 intel_operand_size (ins, bytemode, sizeflag);
12747 append_seg (ins);
12748
12749 off = get64 (ins);
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 }
12761
12762 static void
12763 ptr_reg (instr_info *ins, int code, int sizeflag)
12764 {
12765 const char *s;
12766
12767 *ins->obufp++ = ins->open_char;
12768 ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
12769 if (ins->address_mode == mode_64bit)
12770 {
12771 if (!(sizeflag & AFLAG))
12772 s = att_names32[code - eAX_reg];
12773 else
12774 s = att_names64[code - eAX_reg];
12775 }
12776 else if (sizeflag & AFLAG)
12777 s = att_names32[code - eAX_reg];
12778 else
12779 s = att_names16[code - eAX_reg];
12780 oappend_register (ins, s);
12781 oappend_char (ins, ins->close_char);
12782 }
12783
12784 static void
12785 OP_ESreg (instr_info *ins, int code, int sizeflag)
12786 {
12787 if (ins->intel_syntax)
12788 {
12789 switch (ins->codep[-1])
12790 {
12791 case 0x6d: /* insw/insl */
12792 intel_operand_size (ins, z_mode, sizeflag);
12793 break;
12794 case 0xa5: /* movsw/movsl/movsq */
12795 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12796 case 0xab: /* stosw/stosl */
12797 case 0xaf: /* scasw/scasl */
12798 intel_operand_size (ins, v_mode, sizeflag);
12799 break;
12800 default:
12801 intel_operand_size (ins, b_mode, sizeflag);
12802 }
12803 }
12804 oappend_register (ins, "%es");
12805 oappend_char (ins, ':');
12806 ptr_reg (ins, code, sizeflag);
12807 }
12808
12809 static void
12810 OP_DSreg (instr_info *ins, int code, int sizeflag)
12811 {
12812 if (ins->intel_syntax)
12813 {
12814 switch (ins->codep[-1])
12815 {
12816 case 0x6f: /* outsw/outsl */
12817 intel_operand_size (ins, z_mode, sizeflag);
12818 break;
12819 case 0xa5: /* movsw/movsl/movsq */
12820 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12821 case 0xad: /* lodsw/lodsl/lodsq */
12822 intel_operand_size (ins, v_mode, sizeflag);
12823 break;
12824 default:
12825 intel_operand_size (ins, b_mode, sizeflag);
12826 }
12827 }
12828 /* Set ins->active_seg_prefix to PREFIX_DS if it is unset so that the
12829 default segment register DS is printed. */
12830 if (!ins->active_seg_prefix)
12831 ins->active_seg_prefix = PREFIX_DS;
12832 append_seg (ins);
12833 ptr_reg (ins, code, sizeflag);
12834 }
12835
12836 static void
12837 OP_C (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
12838 int sizeflag ATTRIBUTE_UNUSED)
12839 {
12840 int add, res;
12841 char scratch[8];
12842
12843 if (ins->rex & REX_R)
12844 {
12845 USED_REX (REX_R);
12846 add = 8;
12847 }
12848 else if (ins->address_mode != mode_64bit && (ins->prefixes & PREFIX_LOCK))
12849 {
12850 ins->all_prefixes[ins->last_lock_prefix] = 0;
12851 ins->used_prefixes |= PREFIX_LOCK;
12852 add = 8;
12853 }
12854 else
12855 add = 0;
12856 res = snprintf (scratch, ARRAY_SIZE (scratch), "%%cr%d",
12857 ins->modrm.reg + add);
12858 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12859 abort ();
12860 oappend_register (ins, scratch);
12861 }
12862
12863 static void
12864 OP_D (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
12865 int sizeflag ATTRIBUTE_UNUSED)
12866 {
12867 int add, res;
12868 char scratch[8];
12869
12870 USED_REX (REX_R);
12871 if (ins->rex & REX_R)
12872 add = 8;
12873 else
12874 add = 0;
12875 res = snprintf (scratch, ARRAY_SIZE (scratch),
12876 ins->intel_syntax ? "dr%d" : "%%db%d",
12877 ins->modrm.reg + add);
12878 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12879 abort ();
12880 oappend (ins, scratch);
12881 }
12882
12883 static void
12884 OP_T (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
12885 int sizeflag ATTRIBUTE_UNUSED)
12886 {
12887 int res;
12888 char scratch[8];
12889
12890 res = snprintf (scratch, ARRAY_SIZE (scratch), "%%tr%d", ins->modrm.reg);
12891 if (res < 0 || (size_t) res >= ARRAY_SIZE (scratch))
12892 abort ();
12893 oappend_register (ins, scratch);
12894 }
12895
12896 static void
12897 OP_MMX (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
12898 int sizeflag ATTRIBUTE_UNUSED)
12899 {
12900 int reg = ins->modrm.reg;
12901 const char *const *names;
12902
12903 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
12904 if (ins->prefixes & PREFIX_DATA)
12905 {
12906 names = att_names_xmm;
12907 USED_REX (REX_R);
12908 if (ins->rex & REX_R)
12909 reg += 8;
12910 }
12911 else
12912 names = att_names_mm;
12913 oappend_register (ins, names[reg]);
12914 }
12915
12916 static void
12917 print_vector_reg (instr_info *ins, unsigned int reg, int bytemode)
12918 {
12919 const char *const *names;
12920
12921 if (bytemode == xmmq_mode
12922 || bytemode == evex_half_bcst_xmmqh_mode
12923 || bytemode == evex_half_bcst_xmmq_mode)
12924 {
12925 switch (ins->vex.length)
12926 {
12927 case 128:
12928 case 256:
12929 names = att_names_xmm;
12930 break;
12931 case 512:
12932 names = att_names_ymm;
12933 ins->evex_used |= EVEX_len_used;
12934 break;
12935 default:
12936 abort ();
12937 }
12938 }
12939 else if (bytemode == ymm_mode)
12940 names = att_names_ymm;
12941 else if (bytemode == tmm_mode)
12942 {
12943 if (reg >= 8)
12944 {
12945 oappend (ins, "(bad)");
12946 return;
12947 }
12948 names = att_names_tmm;
12949 }
12950 else if (ins->need_vex
12951 && bytemode != xmm_mode
12952 && bytemode != scalar_mode
12953 && bytemode != xmmdw_mode
12954 && bytemode != xmmqd_mode
12955 && bytemode != evex_half_bcst_xmmqdh_mode
12956 && bytemode != w_swap_mode
12957 && bytemode != b_mode
12958 && bytemode != w_mode
12959 && bytemode != d_mode
12960 && bytemode != q_mode)
12961 {
12962 ins->evex_used |= EVEX_len_used;
12963 switch (ins->vex.length)
12964 {
12965 case 128:
12966 names = att_names_xmm;
12967 break;
12968 case 256:
12969 if (ins->vex.w
12970 || bytemode != vex_vsib_q_w_dq_mode)
12971 names = att_names_ymm;
12972 else
12973 names = att_names_xmm;
12974 break;
12975 case 512:
12976 if (ins->vex.w
12977 || bytemode != vex_vsib_q_w_dq_mode)
12978 names = att_names_zmm;
12979 else
12980 names = att_names_ymm;
12981 break;
12982 default:
12983 abort ();
12984 }
12985 }
12986 else
12987 names = att_names_xmm;
12988 oappend_register (ins, names[reg]);
12989 }
12990
12991 static void
12992 OP_XMM (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
12993 {
12994 unsigned int reg = ins->modrm.reg;
12995
12996 USED_REX (REX_R);
12997 if (ins->rex & REX_R)
12998 reg += 8;
12999 if (ins->vex.evex)
13000 {
13001 if (!ins->vex.r)
13002 reg += 16;
13003 }
13004
13005 if (bytemode == tmm_mode)
13006 ins->modrm.reg = reg;
13007 else if (bytemode == scalar_mode)
13008 ins->vex.no_broadcast = true;
13009
13010 print_vector_reg (ins, reg, bytemode);
13011 }
13012
13013 static void
13014 OP_EM (instr_info *ins, int bytemode, int sizeflag)
13015 {
13016 int reg;
13017 const char *const *names;
13018
13019 if (ins->modrm.mod != 3)
13020 {
13021 if (ins->intel_syntax
13022 && (bytemode == v_mode || bytemode == v_swap_mode))
13023 {
13024 bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13025 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13026 }
13027 OP_E (ins, bytemode, sizeflag);
13028 return;
13029 }
13030
13031 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
13032 swap_operand (ins);
13033
13034 /* Skip mod/rm byte. */
13035 MODRM_CHECK;
13036 ins->codep++;
13037 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13038 reg = ins->modrm.rm;
13039 if (ins->prefixes & PREFIX_DATA)
13040 {
13041 names = att_names_xmm;
13042 USED_REX (REX_B);
13043 if (ins->rex & REX_B)
13044 reg += 8;
13045 }
13046 else
13047 names = att_names_mm;
13048 oappend_register (ins, names[reg]);
13049 }
13050
13051 /* cvt* are the only instructions in sse2 which have
13052 both SSE and MMX operands and also have 0x66 prefix
13053 in their opcode. 0x66 was originally used to differentiate
13054 between SSE and MMX instruction(operands). So we have to handle the
13055 cvt* separately using OP_EMC and OP_MXC */
13056 static void
13057 OP_EMC (instr_info *ins, int bytemode, int sizeflag)
13058 {
13059 if (ins->modrm.mod != 3)
13060 {
13061 if (ins->intel_syntax && bytemode == v_mode)
13062 {
13063 bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
13064 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13065 }
13066 OP_E (ins, bytemode, sizeflag);
13067 return;
13068 }
13069
13070 /* Skip mod/rm byte. */
13071 MODRM_CHECK;
13072 ins->codep++;
13073 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13074 oappend_register (ins, att_names_mm[ins->modrm.rm]);
13075 }
13076
13077 static void
13078 OP_MXC (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13079 int sizeflag ATTRIBUTE_UNUSED)
13080 {
13081 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
13082 oappend_register (ins, att_names_mm[ins->modrm.reg]);
13083 }
13084
13085 static void
13086 OP_EX (instr_info *ins, int bytemode, int sizeflag)
13087 {
13088 int reg;
13089
13090 /* Skip mod/rm byte. */
13091 MODRM_CHECK;
13092 ins->codep++;
13093
13094 if (bytemode == dq_mode)
13095 bytemode = ins->vex.w ? q_mode : d_mode;
13096
13097 if (ins->modrm.mod != 3)
13098 {
13099 OP_E_memory (ins, bytemode, sizeflag);
13100 return;
13101 }
13102
13103 reg = ins->modrm.rm;
13104 USED_REX (REX_B);
13105 if (ins->rex & REX_B)
13106 reg += 8;
13107 if (ins->vex.evex)
13108 {
13109 USED_REX (REX_X);
13110 if ((ins->rex & REX_X))
13111 reg += 16;
13112 }
13113
13114 if ((sizeflag & SUFFIX_ALWAYS)
13115 && (bytemode == x_swap_mode
13116 || bytemode == w_swap_mode
13117 || bytemode == d_swap_mode
13118 || bytemode == q_swap_mode))
13119 swap_operand (ins);
13120
13121 if (bytemode == tmm_mode)
13122 ins->modrm.rm = reg;
13123
13124 print_vector_reg (ins, reg, bytemode);
13125 }
13126
13127 static void
13128 OP_MS (instr_info *ins, int bytemode, int sizeflag)
13129 {
13130 if (ins->modrm.mod == 3)
13131 OP_EM (ins, bytemode, sizeflag);
13132 else
13133 BadOp (ins);
13134 }
13135
13136 static void
13137 OP_XS (instr_info *ins, int bytemode, int sizeflag)
13138 {
13139 if (ins->modrm.mod == 3)
13140 OP_EX (ins, bytemode, sizeflag);
13141 else
13142 BadOp (ins);
13143 }
13144
13145 static void
13146 OP_M (instr_info *ins, int bytemode, int sizeflag)
13147 {
13148 if (ins->modrm.mod == 3)
13149 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
13150 BadOp (ins);
13151 else
13152 OP_E (ins, bytemode, sizeflag);
13153 }
13154
13155 static void
13156 OP_0f07 (instr_info *ins, int bytemode, int sizeflag)
13157 {
13158 if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
13159 BadOp (ins);
13160 else
13161 OP_E (ins, bytemode, sizeflag);
13162 }
13163
13164 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
13165 32bit mode and "xchg %rax,%rax" in 64bit mode. */
13166
13167 static void
13168 NOP_Fixup (instr_info *ins, int opnd, int sizeflag)
13169 {
13170 if ((ins->prefixes & PREFIX_DATA) == 0 && (ins->rex & REX_B) == 0)
13171 ins->mnemonicendp = stpcpy (ins->obuf, "nop");
13172 else if (opnd == 0)
13173 OP_REG (ins, eAX_reg, sizeflag);
13174 else
13175 OP_IMREG (ins, eAX_reg, sizeflag);
13176 }
13177
13178 static const char *const Suffix3DNow[] = {
13179 /* 00 */ NULL, NULL, NULL, NULL,
13180 /* 04 */ NULL, NULL, NULL, NULL,
13181 /* 08 */ NULL, NULL, NULL, NULL,
13182 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
13183 /* 10 */ NULL, NULL, NULL, NULL,
13184 /* 14 */ NULL, NULL, NULL, NULL,
13185 /* 18 */ NULL, NULL, NULL, NULL,
13186 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
13187 /* 20 */ NULL, NULL, NULL, NULL,
13188 /* 24 */ NULL, NULL, NULL, NULL,
13189 /* 28 */ NULL, NULL, NULL, NULL,
13190 /* 2C */ NULL, NULL, NULL, NULL,
13191 /* 30 */ NULL, NULL, NULL, NULL,
13192 /* 34 */ NULL, NULL, NULL, NULL,
13193 /* 38 */ NULL, NULL, NULL, NULL,
13194 /* 3C */ NULL, NULL, NULL, NULL,
13195 /* 40 */ NULL, NULL, NULL, NULL,
13196 /* 44 */ NULL, NULL, NULL, NULL,
13197 /* 48 */ NULL, NULL, NULL, NULL,
13198 /* 4C */ NULL, NULL, NULL, NULL,
13199 /* 50 */ NULL, NULL, NULL, NULL,
13200 /* 54 */ NULL, NULL, NULL, NULL,
13201 /* 58 */ NULL, NULL, NULL, NULL,
13202 /* 5C */ NULL, NULL, NULL, NULL,
13203 /* 60 */ NULL, NULL, NULL, NULL,
13204 /* 64 */ NULL, NULL, NULL, NULL,
13205 /* 68 */ NULL, NULL, NULL, NULL,
13206 /* 6C */ NULL, NULL, NULL, NULL,
13207 /* 70 */ NULL, NULL, NULL, NULL,
13208 /* 74 */ NULL, NULL, NULL, NULL,
13209 /* 78 */ NULL, NULL, NULL, NULL,
13210 /* 7C */ NULL, NULL, NULL, NULL,
13211 /* 80 */ NULL, NULL, NULL, NULL,
13212 /* 84 */ NULL, NULL, NULL, NULL,
13213 /* 88 */ NULL, NULL, "pfnacc", NULL,
13214 /* 8C */ NULL, NULL, "pfpnacc", NULL,
13215 /* 90 */ "pfcmpge", NULL, NULL, NULL,
13216 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
13217 /* 98 */ NULL, NULL, "pfsub", NULL,
13218 /* 9C */ NULL, NULL, "pfadd", NULL,
13219 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
13220 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
13221 /* A8 */ NULL, NULL, "pfsubr", NULL,
13222 /* AC */ NULL, NULL, "pfacc", NULL,
13223 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
13224 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
13225 /* B8 */ NULL, NULL, NULL, "pswapd",
13226 /* BC */ NULL, NULL, NULL, "pavgusb",
13227 /* C0 */ NULL, NULL, NULL, NULL,
13228 /* C4 */ NULL, NULL, NULL, NULL,
13229 /* C8 */ NULL, NULL, NULL, NULL,
13230 /* CC */ NULL, NULL, NULL, NULL,
13231 /* D0 */ NULL, NULL, NULL, NULL,
13232 /* D4 */ NULL, NULL, NULL, NULL,
13233 /* D8 */ NULL, NULL, NULL, NULL,
13234 /* DC */ NULL, NULL, NULL, NULL,
13235 /* E0 */ NULL, NULL, NULL, NULL,
13236 /* E4 */ NULL, NULL, NULL, NULL,
13237 /* E8 */ NULL, NULL, NULL, NULL,
13238 /* EC */ NULL, NULL, NULL, NULL,
13239 /* F0 */ NULL, NULL, NULL, NULL,
13240 /* F4 */ NULL, NULL, NULL, NULL,
13241 /* F8 */ NULL, NULL, NULL, NULL,
13242 /* FC */ NULL, NULL, NULL, NULL,
13243 };
13244
13245 static void
13246 OP_3DNowSuffix (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13247 int sizeflag ATTRIBUTE_UNUSED)
13248 {
13249 const char *mnemonic;
13250
13251 FETCH_DATA (ins->info, ins->codep + 1);
13252 /* AMD 3DNow! instructions are specified by an opcode suffix in the
13253 place where an 8-bit immediate would normally go. ie. the last
13254 byte of the instruction. */
13255 ins->obufp = ins->mnemonicendp;
13256 mnemonic = Suffix3DNow[*ins->codep++ & 0xff];
13257 if (mnemonic)
13258 ins->obufp = stpcpy (ins->obufp, mnemonic);
13259 else
13260 {
13261 /* Since a variable sized ins->modrm/ins->sib chunk is between the start
13262 of the opcode (0x0f0f) and the opcode suffix, we need to do
13263 all the ins->modrm processing first, and don't know until now that
13264 we have a bad opcode. This necessitates some cleaning up. */
13265 ins->op_out[0][0] = '\0';
13266 ins->op_out[1][0] = '\0';
13267 BadOp (ins);
13268 }
13269 ins->mnemonicendp = ins->obufp;
13270 }
13271
13272 static const struct op simd_cmp_op[] =
13273 {
13274 { STRING_COMMA_LEN ("eq") },
13275 { STRING_COMMA_LEN ("lt") },
13276 { STRING_COMMA_LEN ("le") },
13277 { STRING_COMMA_LEN ("unord") },
13278 { STRING_COMMA_LEN ("neq") },
13279 { STRING_COMMA_LEN ("nlt") },
13280 { STRING_COMMA_LEN ("nle") },
13281 { STRING_COMMA_LEN ("ord") }
13282 };
13283
13284 static const struct op vex_cmp_op[] =
13285 {
13286 { STRING_COMMA_LEN ("eq_uq") },
13287 { STRING_COMMA_LEN ("nge") },
13288 { STRING_COMMA_LEN ("ngt") },
13289 { STRING_COMMA_LEN ("false") },
13290 { STRING_COMMA_LEN ("neq_oq") },
13291 { STRING_COMMA_LEN ("ge") },
13292 { STRING_COMMA_LEN ("gt") },
13293 { STRING_COMMA_LEN ("true") },
13294 { STRING_COMMA_LEN ("eq_os") },
13295 { STRING_COMMA_LEN ("lt_oq") },
13296 { STRING_COMMA_LEN ("le_oq") },
13297 { STRING_COMMA_LEN ("unord_s") },
13298 { STRING_COMMA_LEN ("neq_us") },
13299 { STRING_COMMA_LEN ("nlt_uq") },
13300 { STRING_COMMA_LEN ("nle_uq") },
13301 { STRING_COMMA_LEN ("ord_s") },
13302 { STRING_COMMA_LEN ("eq_us") },
13303 { STRING_COMMA_LEN ("nge_uq") },
13304 { STRING_COMMA_LEN ("ngt_uq") },
13305 { STRING_COMMA_LEN ("false_os") },
13306 { STRING_COMMA_LEN ("neq_os") },
13307 { STRING_COMMA_LEN ("ge_oq") },
13308 { STRING_COMMA_LEN ("gt_oq") },
13309 { STRING_COMMA_LEN ("true_us") },
13310 };
13311
13312 static void
13313 CMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13314 int sizeflag ATTRIBUTE_UNUSED)
13315 {
13316 unsigned int cmp_type;
13317
13318 FETCH_DATA (ins->info, ins->codep + 1);
13319 cmp_type = *ins->codep++ & 0xff;
13320 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
13321 {
13322 char suffix[3];
13323 char *p = ins->mnemonicendp - 2;
13324 suffix[0] = p[0];
13325 suffix[1] = p[1];
13326 suffix[2] = '\0';
13327 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13328 ins->mnemonicendp += simd_cmp_op[cmp_type].len;
13329 }
13330 else if (ins->need_vex
13331 && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13332 {
13333 char suffix[3];
13334 char *p = ins->mnemonicendp - 2;
13335 suffix[0] = p[0];
13336 suffix[1] = p[1];
13337 suffix[2] = '\0';
13338 cmp_type -= ARRAY_SIZE (simd_cmp_op);
13339 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13340 ins->mnemonicendp += vex_cmp_op[cmp_type].len;
13341 }
13342 else
13343 {
13344 /* We have a reserved extension byte. Output it directly. */
13345 oappend_immediate (ins, cmp_type);
13346 }
13347 }
13348
13349 static void
13350 OP_Mwait (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13351 {
13352 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
13353 if (!ins->intel_syntax)
13354 {
13355 strcpy (ins->op_out[0], att_names32[0] + ins->intel_syntax);
13356 strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13357 if (bytemode == eBX_reg)
13358 strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax);
13359 ins->two_source_ops = true;
13360 }
13361 /* Skip mod/rm byte. */
13362 MODRM_CHECK;
13363 ins->codep++;
13364 }
13365
13366 static void
13367 OP_Monitor (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13368 int sizeflag ATTRIBUTE_UNUSED)
13369 {
13370 /* monitor %{e,r,}ax,%ecx,%edx" */
13371 if (!ins->intel_syntax)
13372 {
13373 const char *const *names = (ins->address_mode == mode_64bit
13374 ? att_names64 : att_names32);
13375
13376 if (ins->prefixes & PREFIX_ADDR)
13377 {
13378 /* Remove "addr16/addr32". */
13379 ins->all_prefixes[ins->last_addr_prefix] = 0;
13380 names = (ins->address_mode != mode_32bit
13381 ? att_names32 : att_names16);
13382 ins->used_prefixes |= PREFIX_ADDR;
13383 }
13384 else if (ins->address_mode == mode_16bit)
13385 names = att_names16;
13386 strcpy (ins->op_out[0], names[0] + ins->intel_syntax);
13387 strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
13388 strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax);
13389 ins->two_source_ops = true;
13390 }
13391 /* Skip mod/rm byte. */
13392 MODRM_CHECK;
13393 ins->codep++;
13394 }
13395
13396 static void
13397 BadOp (instr_info *ins)
13398 {
13399 /* Throw away prefixes and 1st. opcode byte. */
13400 ins->codep = ins->insn_codep + 1;
13401 ins->obufp = stpcpy (ins->obufp, "(bad)");
13402 }
13403
13404 static void
13405 REP_Fixup (instr_info *ins, int bytemode, int sizeflag)
13406 {
13407 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13408 lods and stos. */
13409 if (ins->prefixes & PREFIX_REPZ)
13410 ins->all_prefixes[ins->last_repz_prefix] = REP_PREFIX;
13411
13412 switch (bytemode)
13413 {
13414 case al_reg:
13415 case eAX_reg:
13416 case indir_dx_reg:
13417 OP_IMREG (ins, bytemode, sizeflag);
13418 break;
13419 case eDI_reg:
13420 OP_ESreg (ins, bytemode, sizeflag);
13421 break;
13422 case eSI_reg:
13423 OP_DSreg (ins, bytemode, sizeflag);
13424 break;
13425 default:
13426 abort ();
13427 break;
13428 }
13429 }
13430
13431 static void
13432 SEP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13433 int sizeflag ATTRIBUTE_UNUSED)
13434 {
13435 if (ins->isa64 != amd64)
13436 return;
13437
13438 ins->obufp = ins->obuf;
13439 BadOp (ins);
13440 ins->mnemonicendp = ins->obufp;
13441 ++ins->codep;
13442 }
13443
13444 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
13445 "bnd". */
13446
13447 static void
13448 BND_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13449 int sizeflag ATTRIBUTE_UNUSED)
13450 {
13451 if (ins->prefixes & PREFIX_REPNZ)
13452 ins->all_prefixes[ins->last_repnz_prefix] = BND_PREFIX;
13453 }
13454
13455 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13456 "notrack". */
13457
13458 static void
13459 NOTRACK_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13460 int sizeflag ATTRIBUTE_UNUSED)
13461 {
13462 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13463 we've seen a PREFIX_DS. */
13464 if ((ins->prefixes & PREFIX_DS) != 0
13465 && (ins->address_mode != mode_64bit || ins->last_data_prefix < 0))
13466 {
13467 /* NOTRACK prefix is only valid on indirect branch instructions.
13468 NB: DATA prefix is unsupported for Intel64. */
13469 ins->active_seg_prefix = 0;
13470 ins->all_prefixes[ins->last_seg_prefix] = NOTRACK_PREFIX;
13471 }
13472 }
13473
13474 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13475 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13476 */
13477
13478 static void
13479 HLE_Fixup1 (instr_info *ins, int bytemode, int sizeflag)
13480 {
13481 if (ins->modrm.mod != 3
13482 && (ins->prefixes & PREFIX_LOCK) != 0)
13483 {
13484 if (ins->prefixes & PREFIX_REPZ)
13485 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13486 if (ins->prefixes & PREFIX_REPNZ)
13487 ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13488 }
13489
13490 OP_E (ins, bytemode, sizeflag);
13491 }
13492
13493 /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
13494 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13495 */
13496
13497 static void
13498 HLE_Fixup2 (instr_info *ins, int bytemode, int sizeflag)
13499 {
13500 if (ins->modrm.mod != 3)
13501 {
13502 if (ins->prefixes & PREFIX_REPZ)
13503 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13504 if (ins->prefixes & PREFIX_REPNZ)
13505 ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13506 }
13507
13508 OP_E (ins, bytemode, sizeflag);
13509 }
13510
13511 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13512 "xrelease" for memory operand. No check for LOCK prefix. */
13513
13514 static void
13515 HLE_Fixup3 (instr_info *ins, int bytemode, int sizeflag)
13516 {
13517 if (ins->modrm.mod != 3
13518 && ins->last_repz_prefix > ins->last_repnz_prefix
13519 && (ins->prefixes & PREFIX_REPZ) != 0)
13520 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13521
13522 OP_E (ins, bytemode, sizeflag);
13523 }
13524
13525 static void
13526 CMPXCHG8B_Fixup (instr_info *ins, int bytemode, int sizeflag)
13527 {
13528 USED_REX (REX_W);
13529 if (ins->rex & REX_W)
13530 {
13531 /* Change cmpxchg8b to cmpxchg16b. */
13532 char *p = ins->mnemonicendp - 2;
13533 ins->mnemonicendp = stpcpy (p, "16b");
13534 bytemode = o_mode;
13535 }
13536 else if ((ins->prefixes & PREFIX_LOCK) != 0)
13537 {
13538 if (ins->prefixes & PREFIX_REPZ)
13539 ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
13540 if (ins->prefixes & PREFIX_REPNZ)
13541 ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
13542 }
13543
13544 OP_M (ins, bytemode, sizeflag);
13545 }
13546
13547 static void
13548 XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED)
13549 {
13550 const char *const *names = att_names_xmm;
13551
13552 if (ins->need_vex)
13553 {
13554 switch (ins->vex.length)
13555 {
13556 case 128:
13557 break;
13558 case 256:
13559 names = att_names_ymm;
13560 break;
13561 default:
13562 abort ();
13563 }
13564 }
13565 oappend_register (ins, names[reg]);
13566 }
13567
13568 static void
13569 FXSAVE_Fixup (instr_info *ins, int bytemode, int sizeflag)
13570 {
13571 /* Add proper suffix to "fxsave" and "fxrstor". */
13572 USED_REX (REX_W);
13573 if (ins->rex & REX_W)
13574 {
13575 char *p = ins->mnemonicendp;
13576 *p++ = '6';
13577 *p++ = '4';
13578 *p = '\0';
13579 ins->mnemonicendp = p;
13580 }
13581 OP_M (ins, bytemode, sizeflag);
13582 }
13583
13584 /* Display the destination register operand for instructions with
13585 VEX. */
13586
13587 static void
13588 OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13589 {
13590 int reg, modrm_reg, sib_index = -1;
13591 const char *const *names;
13592
13593 if (!ins->need_vex)
13594 abort ();
13595
13596 reg = ins->vex.register_specifier;
13597 ins->vex.register_specifier = 0;
13598 if (ins->address_mode != mode_64bit)
13599 {
13600 if (ins->vex.evex && !ins->vex.v)
13601 {
13602 oappend (ins, "(bad)");
13603 return;
13604 }
13605
13606 reg &= 7;
13607 }
13608 else if (ins->vex.evex && !ins->vex.v)
13609 reg += 16;
13610
13611 switch (bytemode)
13612 {
13613 case scalar_mode:
13614 oappend_register (ins, att_names_xmm[reg]);
13615 return;
13616
13617 case vex_vsib_d_w_dq_mode:
13618 case vex_vsib_q_w_dq_mode:
13619 /* This must be the 3rd operand. */
13620 if (ins->obufp != ins->op_out[2])
13621 abort ();
13622 if (ins->vex.length == 128
13623 || (bytemode != vex_vsib_d_w_dq_mode
13624 && !ins->vex.w))
13625 oappend_register (ins, att_names_xmm[reg]);
13626 else
13627 oappend_register (ins, att_names_ymm[reg]);
13628
13629 /* All 3 XMM/YMM registers must be distinct. */
13630 modrm_reg = ins->modrm.reg;
13631 if (ins->rex & REX_R)
13632 modrm_reg += 8;
13633
13634 if (ins->has_sib && ins->modrm.rm == 4)
13635 {
13636 sib_index = ins->sib.index;
13637 if (ins->rex & REX_X)
13638 sib_index += 8;
13639 }
13640
13641 if (reg == modrm_reg || reg == sib_index)
13642 strcpy (ins->obufp, "/(bad)");
13643 if (modrm_reg == sib_index || modrm_reg == reg)
13644 strcat (ins->op_out[0], "/(bad)");
13645 if (sib_index == modrm_reg || sib_index == reg)
13646 strcat (ins->op_out[1], "/(bad)");
13647
13648 return;
13649
13650 case tmm_mode:
13651 /* All 3 TMM registers must be distinct. */
13652 if (reg >= 8)
13653 oappend (ins, "(bad)");
13654 else
13655 {
13656 /* This must be the 3rd operand. */
13657 if (ins->obufp != ins->op_out[2])
13658 abort ();
13659 oappend_register (ins, att_names_tmm[reg]);
13660 if (reg == ins->modrm.reg || reg == ins->modrm.rm)
13661 strcpy (ins->obufp, "/(bad)");
13662 }
13663
13664 if (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg
13665 || ins->modrm.rm == reg)
13666 {
13667 if (ins->modrm.reg <= 8
13668 && (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg))
13669 strcat (ins->op_out[0], "/(bad)");
13670 if (ins->modrm.rm <= 8
13671 && (ins->modrm.rm == ins->modrm.reg || ins->modrm.rm == reg))
13672 strcat (ins->op_out[1], "/(bad)");
13673 }
13674
13675 return;
13676 }
13677
13678 switch (ins->vex.length)
13679 {
13680 case 128:
13681 switch (bytemode)
13682 {
13683 case x_mode:
13684 names = att_names_xmm;
13685 ins->evex_used |= EVEX_len_used;
13686 break;
13687 case dq_mode:
13688 if (ins->rex & REX_W)
13689 names = att_names64;
13690 else
13691 names = att_names32;
13692 break;
13693 case mask_bd_mode:
13694 case mask_mode:
13695 if (reg > 0x7)
13696 {
13697 oappend (ins, "(bad)");
13698 return;
13699 }
13700 names = att_names_mask;
13701 break;
13702 default:
13703 abort ();
13704 return;
13705 }
13706 break;
13707 case 256:
13708 switch (bytemode)
13709 {
13710 case x_mode:
13711 names = att_names_ymm;
13712 ins->evex_used |= EVEX_len_used;
13713 break;
13714 case mask_bd_mode:
13715 case mask_mode:
13716 if (reg > 0x7)
13717 {
13718 oappend (ins, "(bad)");
13719 return;
13720 }
13721 names = att_names_mask;
13722 break;
13723 default:
13724 /* See PR binutils/20893 for a reproducer. */
13725 oappend (ins, "(bad)");
13726 return;
13727 }
13728 break;
13729 case 512:
13730 names = att_names_zmm;
13731 ins->evex_used |= EVEX_len_used;
13732 break;
13733 default:
13734 abort ();
13735 break;
13736 }
13737 oappend_register (ins, names[reg]);
13738 }
13739
13740 static void
13741 OP_VexR (instr_info *ins, int bytemode, int sizeflag)
13742 {
13743 if (ins->modrm.mod == 3)
13744 OP_VEX (ins, bytemode, sizeflag);
13745 }
13746
13747 static void
13748 OP_VexW (instr_info *ins, int bytemode, int sizeflag)
13749 {
13750 OP_VEX (ins, bytemode, sizeflag);
13751
13752 if (ins->vex.w)
13753 {
13754 /* Swap 2nd and 3rd operands. */
13755 char *tmp = ins->op_out[2];
13756
13757 ins->op_out[2] = ins->op_out[1];
13758 ins->op_out[1] = tmp;
13759 }
13760 }
13761
13762 static void
13763 OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13764 {
13765 int reg;
13766 const char *const *names = att_names_xmm;
13767
13768 FETCH_DATA (ins->info, ins->codep + 1);
13769 reg = *ins->codep++;
13770
13771 if (bytemode != x_mode && bytemode != scalar_mode)
13772 abort ();
13773
13774 reg >>= 4;
13775 if (ins->address_mode != mode_64bit)
13776 reg &= 7;
13777
13778 if (bytemode == x_mode && ins->vex.length == 256)
13779 names = att_names_ymm;
13780
13781 oappend_register (ins, names[reg]);
13782
13783 if (ins->vex.w)
13784 {
13785 /* Swap 3rd and 4th operands. */
13786 char *tmp = ins->op_out[3];
13787
13788 ins->op_out[3] = ins->op_out[2];
13789 ins->op_out[2] = tmp;
13790 }
13791 }
13792
13793 static void
13794 OP_VexI4 (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13795 int sizeflag ATTRIBUTE_UNUSED)
13796 {
13797 oappend_immediate (ins, ins->codep[-1] & 0xf);
13798 }
13799
13800 static void
13801 VPCMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13802 int sizeflag ATTRIBUTE_UNUSED)
13803 {
13804 unsigned int cmp_type;
13805
13806 if (!ins->vex.evex)
13807 abort ();
13808
13809 FETCH_DATA (ins->info, ins->codep + 1);
13810 cmp_type = *ins->codep++ & 0xff;
13811 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13812 If it's the case, print suffix, otherwise - print the immediate. */
13813 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
13814 && cmp_type != 3
13815 && cmp_type != 7)
13816 {
13817 char suffix[3];
13818 char *p = ins->mnemonicendp - 2;
13819
13820 /* vpcmp* can have both one- and two-lettered suffix. */
13821 if (p[0] == 'p')
13822 {
13823 p++;
13824 suffix[0] = p[0];
13825 suffix[1] = '\0';
13826 }
13827 else
13828 {
13829 suffix[0] = p[0];
13830 suffix[1] = p[1];
13831 suffix[2] = '\0';
13832 }
13833
13834 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13835 ins->mnemonicendp += simd_cmp_op[cmp_type].len;
13836 }
13837 else
13838 {
13839 /* We have a reserved extension byte. Output it directly. */
13840 oappend_immediate (ins, cmp_type);
13841 }
13842 }
13843
13844 static const struct op xop_cmp_op[] =
13845 {
13846 { STRING_COMMA_LEN ("lt") },
13847 { STRING_COMMA_LEN ("le") },
13848 { STRING_COMMA_LEN ("gt") },
13849 { STRING_COMMA_LEN ("ge") },
13850 { STRING_COMMA_LEN ("eq") },
13851 { STRING_COMMA_LEN ("neq") },
13852 { STRING_COMMA_LEN ("false") },
13853 { STRING_COMMA_LEN ("true") }
13854 };
13855
13856 static void
13857 VPCOM_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13858 int sizeflag ATTRIBUTE_UNUSED)
13859 {
13860 unsigned int cmp_type;
13861
13862 FETCH_DATA (ins->info, ins->codep + 1);
13863 cmp_type = *ins->codep++ & 0xff;
13864 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
13865 {
13866 char suffix[3];
13867 char *p = ins->mnemonicendp - 2;
13868
13869 /* vpcom* can have both one- and two-lettered suffix. */
13870 if (p[0] == 'm')
13871 {
13872 p++;
13873 suffix[0] = p[0];
13874 suffix[1] = '\0';
13875 }
13876 else
13877 {
13878 suffix[0] = p[0];
13879 suffix[1] = p[1];
13880 suffix[2] = '\0';
13881 }
13882
13883 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
13884 ins->mnemonicendp += xop_cmp_op[cmp_type].len;
13885 }
13886 else
13887 {
13888 /* We have a reserved extension byte. Output it directly. */
13889 oappend_immediate (ins, cmp_type);
13890 }
13891 }
13892
13893 static const struct op pclmul_op[] =
13894 {
13895 { STRING_COMMA_LEN ("lql") },
13896 { STRING_COMMA_LEN ("hql") },
13897 { STRING_COMMA_LEN ("lqh") },
13898 { STRING_COMMA_LEN ("hqh") }
13899 };
13900
13901 static void
13902 PCLMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
13903 int sizeflag ATTRIBUTE_UNUSED)
13904 {
13905 unsigned int pclmul_type;
13906
13907 FETCH_DATA (ins->info, ins->codep + 1);
13908 pclmul_type = *ins->codep++ & 0xff;
13909 switch (pclmul_type)
13910 {
13911 case 0x10:
13912 pclmul_type = 2;
13913 break;
13914 case 0x11:
13915 pclmul_type = 3;
13916 break;
13917 default:
13918 break;
13919 }
13920 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13921 {
13922 char suffix[4];
13923 char *p = ins->mnemonicendp - 3;
13924 suffix[0] = p[0];
13925 suffix[1] = p[1];
13926 suffix[2] = p[2];
13927 suffix[3] = '\0';
13928 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
13929 ins->mnemonicendp += pclmul_op[pclmul_type].len;
13930 }
13931 else
13932 {
13933 /* We have a reserved extension byte. Output it directly. */
13934 oappend_immediate (ins, pclmul_type);
13935 }
13936 }
13937
13938 static void
13939 MOVSXD_Fixup (instr_info *ins, int bytemode, int sizeflag)
13940 {
13941 /* Add proper suffix to "movsxd". */
13942 char *p = ins->mnemonicendp;
13943
13944 switch (bytemode)
13945 {
13946 case movsxd_mode:
13947 if (!ins->intel_syntax)
13948 {
13949 USED_REX (REX_W);
13950 if (ins->rex & REX_W)
13951 {
13952 *p++ = 'l';
13953 *p++ = 'q';
13954 break;
13955 }
13956 }
13957
13958 *p++ = 'x';
13959 *p++ = 'd';
13960 break;
13961 default:
13962 oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
13963 break;
13964 }
13965
13966 ins->mnemonicendp = p;
13967 *p = '\0';
13968 OP_E (ins, bytemode, sizeflag);
13969 }
13970
13971 static void
13972 DistinctDest_Fixup (instr_info *ins, int bytemode, int sizeflag)
13973 {
13974 unsigned int reg = ins->vex.register_specifier;
13975 unsigned int modrm_reg = ins->modrm.reg;
13976 unsigned int modrm_rm = ins->modrm.rm;
13977
13978 /* Calc destination register number. */
13979 if (ins->rex & REX_R)
13980 modrm_reg += 8;
13981 if (!ins->vex.r)
13982 modrm_reg += 16;
13983
13984 /* Calc src1 register number. */
13985 if (ins->address_mode != mode_64bit)
13986 reg &= 7;
13987 else if (ins->vex.evex && !ins->vex.v)
13988 reg += 16;
13989
13990 /* Calc src2 register number. */
13991 if (ins->modrm.mod == 3)
13992 {
13993 if (ins->rex & REX_B)
13994 modrm_rm += 8;
13995 if (ins->rex & REX_X)
13996 modrm_rm += 16;
13997 }
13998
13999 /* Destination and source registers must be distinct, output bad if
14000 dest == src1 or dest == src2. */
14001 if (modrm_reg == reg
14002 || (ins->modrm.mod == 3
14003 && modrm_reg == modrm_rm))
14004 {
14005 oappend (ins, "(bad)");
14006 }
14007 else
14008 OP_XMM (ins, bytemode, sizeflag);
14009 }
14010
14011 static void
14012 OP_Rounding (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
14013 {
14014 if (ins->modrm.mod != 3 || !ins->vex.b)
14015 return;
14016
14017 switch (bytemode)
14018 {
14019 case evex_rounding_64_mode:
14020 if (ins->address_mode != mode_64bit || !ins->vex.w)
14021 return;
14022 /* Fall through. */
14023 case evex_rounding_mode:
14024 ins->evex_used |= EVEX_b_used;
14025 oappend (ins, names_rounding[ins->vex.ll]);
14026 break;
14027 case evex_sae_mode:
14028 ins->evex_used |= EVEX_b_used;
14029 oappend (ins, "{");
14030 break;
14031 default:
14032 abort ();
14033 }
14034 oappend (ins, "sae}");
14035 }
14036
14037 static void
14038 PREFETCHI_Fixup (instr_info *ins, int bytemode, int sizeflag)
14039 {
14040 if (ins->modrm.mod != 0 || ins->modrm.rm != 5)
14041 {
14042 if (ins->intel_syntax)
14043 {
14044 ins->mnemonicendp = stpcpy (ins->obuf, "nop ");
14045 }
14046 else
14047 {
14048 USED_REX (REX_W);
14049 if (ins->rex & REX_W)
14050 ins->mnemonicendp = stpcpy (ins->obuf, "nopq ");
14051 else
14052 {
14053 if (sizeflag & DFLAG)
14054 ins->mnemonicendp = stpcpy (ins->obuf, "nopl ");
14055 else
14056 ins->mnemonicendp = stpcpy (ins->obuf, "nopw ");
14057 ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
14058 }
14059 }
14060 bytemode = v_mode;
14061 }
14062
14063 OP_M (ins, bytemode, sizeflag);
14064 }