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