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