6300ab9d7b13b120801de404e16b832e7866eaae
[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 (CONST_STRNEQ (p, "amd64"))
9417 isa64 = amd64;
9418 else if (CONST_STRNEQ (p, "intel64"))
9419 isa64 = intel64;
9420 else if (CONST_STRNEQ (p, "x86-64"))
9421 {
9422 address_mode = mode_64bit;
9423 priv.orig_sizeflag |= AFLAG | DFLAG;
9424 }
9425 else if (CONST_STRNEQ (p, "i386"))
9426 {
9427 address_mode = mode_32bit;
9428 priv.orig_sizeflag |= AFLAG | DFLAG;
9429 }
9430 else if (CONST_STRNEQ (p, "i8086"))
9431 {
9432 address_mode = mode_16bit;
9433 priv.orig_sizeflag &= ~(AFLAG | DFLAG);
9434 }
9435 else if (CONST_STRNEQ (p, "intel"))
9436 {
9437 intel_syntax = 1;
9438 if (CONST_STRNEQ (p + 5, "-mnemonic"))
9439 intel_mnemonic = 1;
9440 }
9441 else if (CONST_STRNEQ (p, "att"))
9442 {
9443 intel_syntax = 0;
9444 if (CONST_STRNEQ (p + 3, "-mnemonic"))
9445 intel_mnemonic = 0;
9446 }
9447 else if (CONST_STRNEQ (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 (CONST_STRNEQ (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 (CONST_STRNEQ (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_repz_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 (!need_vex || !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.evex
10955 && vex.b
10956 && (bytemode == x_mode
10957 || bytemode == evex_half_bcst_xmmq_mode))
10958 {
10959 if (vex.w)
10960 oappend ("QWORD PTR ");
10961 else
10962 oappend ("DWORD PTR ");
10963 return;
10964 }
10965 switch (bytemode)
10966 {
10967 case b_mode:
10968 case b_swap_mode:
10969 case dqb_mode:
10970 case db_mode:
10971 oappend ("BYTE PTR ");
10972 break;
10973 case w_mode:
10974 case dw_mode:
10975 case dqw_mode:
10976 oappend ("WORD PTR ");
10977 break;
10978 case indir_v_mode:
10979 if (address_mode == mode_64bit && isa64 == intel64)
10980 {
10981 oappend ("QWORD PTR ");
10982 break;
10983 }
10984 /* Fall through. */
10985 case stack_v_mode:
10986 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
10987 {
10988 oappend ("QWORD PTR ");
10989 break;
10990 }
10991 /* Fall through. */
10992 case v_mode:
10993 case v_swap_mode:
10994 case dq_mode:
10995 USED_REX (REX_W);
10996 if (rex & REX_W)
10997 oappend ("QWORD PTR ");
10998 else if (bytemode == dq_mode)
10999 oappend ("DWORD PTR ");
11000 else
11001 {
11002 if (sizeflag & DFLAG)
11003 oappend ("DWORD PTR ");
11004 else
11005 oappend ("WORD PTR ");
11006 used_prefixes |= (prefixes & PREFIX_DATA);
11007 }
11008 break;
11009 case z_mode:
11010 if ((rex & REX_W) || (sizeflag & DFLAG))
11011 *obufp++ = 'D';
11012 oappend ("WORD PTR ");
11013 if (!(rex & REX_W))
11014 used_prefixes |= (prefixes & PREFIX_DATA);
11015 break;
11016 case a_mode:
11017 if (sizeflag & DFLAG)
11018 oappend ("QWORD PTR ");
11019 else
11020 oappend ("DWORD PTR ");
11021 used_prefixes |= (prefixes & PREFIX_DATA);
11022 break;
11023 case movsxd_mode:
11024 if (!(sizeflag & DFLAG) && isa64 == intel64)
11025 oappend ("WORD PTR ");
11026 else
11027 oappend ("DWORD PTR ");
11028 used_prefixes |= (prefixes & PREFIX_DATA);
11029 break;
11030 case d_mode:
11031 case d_swap_mode:
11032 case dqd_mode:
11033 oappend ("DWORD PTR ");
11034 break;
11035 case q_mode:
11036 case q_swap_mode:
11037 oappend ("QWORD PTR ");
11038 break;
11039 case m_mode:
11040 if (address_mode == mode_64bit)
11041 oappend ("QWORD PTR ");
11042 else
11043 oappend ("DWORD PTR ");
11044 break;
11045 case f_mode:
11046 if (sizeflag & DFLAG)
11047 oappend ("FWORD PTR ");
11048 else
11049 oappend ("DWORD PTR ");
11050 used_prefixes |= (prefixes & PREFIX_DATA);
11051 break;
11052 case t_mode:
11053 oappend ("TBYTE PTR ");
11054 break;
11055 case x_mode:
11056 case x_swap_mode:
11057 case evex_x_gscat_mode:
11058 case evex_x_nobcst_mode:
11059 case bw_unit_mode:
11060 if (need_vex)
11061 {
11062 switch (vex.length)
11063 {
11064 case 128:
11065 oappend ("XMMWORD PTR ");
11066 break;
11067 case 256:
11068 oappend ("YMMWORD PTR ");
11069 break;
11070 case 512:
11071 oappend ("ZMMWORD PTR ");
11072 break;
11073 default:
11074 abort ();
11075 }
11076 }
11077 else
11078 oappend ("XMMWORD PTR ");
11079 break;
11080 case xmm_mode:
11081 oappend ("XMMWORD PTR ");
11082 break;
11083 case ymm_mode:
11084 oappend ("YMMWORD PTR ");
11085 break;
11086 case xmmq_mode:
11087 case evex_half_bcst_xmmq_mode:
11088 if (!need_vex)
11089 abort ();
11090
11091 switch (vex.length)
11092 {
11093 case 128:
11094 oappend ("QWORD PTR ");
11095 break;
11096 case 256:
11097 oappend ("XMMWORD PTR ");
11098 break;
11099 case 512:
11100 oappend ("YMMWORD PTR ");
11101 break;
11102 default:
11103 abort ();
11104 }
11105 break;
11106 case xmm_mb_mode:
11107 if (!need_vex)
11108 abort ();
11109
11110 switch (vex.length)
11111 {
11112 case 128:
11113 case 256:
11114 case 512:
11115 oappend ("BYTE PTR ");
11116 break;
11117 default:
11118 abort ();
11119 }
11120 break;
11121 case xmm_mw_mode:
11122 if (!need_vex)
11123 abort ();
11124
11125 switch (vex.length)
11126 {
11127 case 128:
11128 case 256:
11129 case 512:
11130 oappend ("WORD PTR ");
11131 break;
11132 default:
11133 abort ();
11134 }
11135 break;
11136 case xmm_md_mode:
11137 if (!need_vex)
11138 abort ();
11139
11140 switch (vex.length)
11141 {
11142 case 128:
11143 case 256:
11144 case 512:
11145 oappend ("DWORD PTR ");
11146 break;
11147 default:
11148 abort ();
11149 }
11150 break;
11151 case xmm_mq_mode:
11152 if (!need_vex)
11153 abort ();
11154
11155 switch (vex.length)
11156 {
11157 case 128:
11158 case 256:
11159 case 512:
11160 oappend ("QWORD PTR ");
11161 break;
11162 default:
11163 abort ();
11164 }
11165 break;
11166 case xmmdw_mode:
11167 if (!need_vex)
11168 abort ();
11169
11170 switch (vex.length)
11171 {
11172 case 128:
11173 oappend ("WORD PTR ");
11174 break;
11175 case 256:
11176 oappend ("DWORD PTR ");
11177 break;
11178 case 512:
11179 oappend ("QWORD PTR ");
11180 break;
11181 default:
11182 abort ();
11183 }
11184 break;
11185 case xmmqd_mode:
11186 if (!need_vex)
11187 abort ();
11188
11189 switch (vex.length)
11190 {
11191 case 128:
11192 oappend ("DWORD PTR ");
11193 break;
11194 case 256:
11195 oappend ("QWORD PTR ");
11196 break;
11197 case 512:
11198 oappend ("XMMWORD PTR ");
11199 break;
11200 default:
11201 abort ();
11202 }
11203 break;
11204 case ymmq_mode:
11205 if (!need_vex)
11206 abort ();
11207
11208 switch (vex.length)
11209 {
11210 case 128:
11211 oappend ("QWORD PTR ");
11212 break;
11213 case 256:
11214 oappend ("YMMWORD PTR ");
11215 break;
11216 case 512:
11217 oappend ("ZMMWORD PTR ");
11218 break;
11219 default:
11220 abort ();
11221 }
11222 break;
11223 case ymmxmm_mode:
11224 if (!need_vex)
11225 abort ();
11226
11227 switch (vex.length)
11228 {
11229 case 128:
11230 case 256:
11231 oappend ("XMMWORD PTR ");
11232 break;
11233 default:
11234 abort ();
11235 }
11236 break;
11237 case o_mode:
11238 oappend ("OWORD PTR ");
11239 break;
11240 case vex_scalar_w_dq_mode:
11241 if (!need_vex)
11242 abort ();
11243
11244 if (vex.w)
11245 oappend ("QWORD PTR ");
11246 else
11247 oappend ("DWORD PTR ");
11248 break;
11249 case vex_vsib_d_w_dq_mode:
11250 case vex_vsib_q_w_dq_mode:
11251 if (!need_vex)
11252 abort ();
11253
11254 if (vex.w)
11255 oappend ("QWORD PTR ");
11256 else
11257 oappend ("DWORD PTR ");
11258 break;
11259 case mask_bd_mode:
11260 if (!need_vex || vex.length != 128)
11261 abort ();
11262 if (vex.w)
11263 oappend ("DWORD PTR ");
11264 else
11265 oappend ("BYTE PTR ");
11266 break;
11267 case mask_mode:
11268 if (!need_vex)
11269 abort ();
11270 if (vex.w)
11271 oappend ("QWORD PTR ");
11272 else
11273 oappend ("WORD PTR ");
11274 break;
11275 case v_bnd_mode:
11276 case v_bndmk_mode:
11277 default:
11278 break;
11279 }
11280 }
11281
11282 static void
11283 OP_E_register (int bytemode, int sizeflag)
11284 {
11285 int reg = modrm.rm;
11286 const char **names;
11287
11288 USED_REX (REX_B);
11289 if ((rex & REX_B))
11290 reg += 8;
11291
11292 if ((sizeflag & SUFFIX_ALWAYS)
11293 && (bytemode == b_swap_mode
11294 || bytemode == bnd_swap_mode
11295 || bytemode == v_swap_mode))
11296 swap_operand ();
11297
11298 switch (bytemode)
11299 {
11300 case b_mode:
11301 case b_swap_mode:
11302 if (reg & 4)
11303 USED_REX (0);
11304 if (rex)
11305 names = names8rex;
11306 else
11307 names = names8;
11308 break;
11309 case w_mode:
11310 names = names16;
11311 break;
11312 case d_mode:
11313 case dw_mode:
11314 case db_mode:
11315 names = names32;
11316 break;
11317 case q_mode:
11318 names = names64;
11319 break;
11320 case m_mode:
11321 case v_bnd_mode:
11322 names = address_mode == mode_64bit ? names64 : names32;
11323 break;
11324 case bnd_mode:
11325 case bnd_swap_mode:
11326 if (reg > 0x3)
11327 {
11328 oappend ("(bad)");
11329 return;
11330 }
11331 names = names_bnd;
11332 break;
11333 case indir_v_mode:
11334 if (address_mode == mode_64bit && isa64 == intel64)
11335 {
11336 names = names64;
11337 break;
11338 }
11339 /* Fall through. */
11340 case stack_v_mode:
11341 if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
11342 {
11343 names = names64;
11344 break;
11345 }
11346 bytemode = v_mode;
11347 /* Fall through. */
11348 case v_mode:
11349 case v_swap_mode:
11350 case dq_mode:
11351 case dqb_mode:
11352 case dqd_mode:
11353 case dqw_mode:
11354 USED_REX (REX_W);
11355 if (rex & REX_W)
11356 names = names64;
11357 else if (bytemode != v_mode && bytemode != v_swap_mode)
11358 names = names32;
11359 else
11360 {
11361 if (sizeflag & DFLAG)
11362 names = names32;
11363 else
11364 names = names16;
11365 used_prefixes |= (prefixes & PREFIX_DATA);
11366 }
11367 break;
11368 case movsxd_mode:
11369 if (!(sizeflag & DFLAG) && isa64 == intel64)
11370 names = names16;
11371 else
11372 names = names32;
11373 used_prefixes |= (prefixes & PREFIX_DATA);
11374 break;
11375 case va_mode:
11376 names = (address_mode == mode_64bit
11377 ? names64 : names32);
11378 if (!(prefixes & PREFIX_ADDR))
11379 names = (address_mode == mode_16bit
11380 ? names16 : names);
11381 else
11382 {
11383 /* Remove "addr16/addr32". */
11384 all_prefixes[last_addr_prefix] = 0;
11385 names = (address_mode != mode_32bit
11386 ? names32 : names16);
11387 used_prefixes |= PREFIX_ADDR;
11388 }
11389 break;
11390 case mask_bd_mode:
11391 case mask_mode:
11392 if (reg > 0x7)
11393 {
11394 oappend ("(bad)");
11395 return;
11396 }
11397 names = names_mask;
11398 break;
11399 case 0:
11400 return;
11401 default:
11402 oappend (INTERNAL_DISASSEMBLER_ERROR);
11403 return;
11404 }
11405 oappend (names[reg]);
11406 }
11407
11408 static void
11409 OP_E_memory (int bytemode, int sizeflag)
11410 {
11411 bfd_vma disp = 0;
11412 int add = (rex & REX_B) ? 8 : 0;
11413 int riprel = 0;
11414 int shift;
11415
11416 if (vex.evex)
11417 {
11418 /* In EVEX, if operand doesn't allow broadcast, vex.b should be 0. */
11419 if (vex.b
11420 && bytemode != x_mode
11421 && bytemode != xmmq_mode
11422 && bytemode != evex_half_bcst_xmmq_mode)
11423 {
11424 BadOp ();
11425 return;
11426 }
11427 switch (bytemode)
11428 {
11429 case dqw_mode:
11430 case dw_mode:
11431 case xmm_mw_mode:
11432 shift = 1;
11433 break;
11434 case dqb_mode:
11435 case db_mode:
11436 case xmm_mb_mode:
11437 shift = 0;
11438 break;
11439 case dq_mode:
11440 if (address_mode != mode_64bit)
11441 {
11442 case dqd_mode:
11443 case xmm_md_mode:
11444 case d_mode:
11445 case d_swap_mode:
11446 shift = 2;
11447 break;
11448 }
11449 /* fall through */
11450 case vex_scalar_w_dq_mode:
11451 case vex_vsib_d_w_dq_mode:
11452 case vex_vsib_q_w_dq_mode:
11453 case evex_x_gscat_mode:
11454 shift = vex.w ? 3 : 2;
11455 break;
11456 case x_mode:
11457 case evex_half_bcst_xmmq_mode:
11458 case xmmq_mode:
11459 if (vex.b)
11460 {
11461 shift = vex.w ? 3 : 2;
11462 break;
11463 }
11464 /* Fall through. */
11465 case xmmqd_mode:
11466 case xmmdw_mode:
11467 case ymmq_mode:
11468 case evex_x_nobcst_mode:
11469 case x_swap_mode:
11470 switch (vex.length)
11471 {
11472 case 128:
11473 shift = 4;
11474 break;
11475 case 256:
11476 shift = 5;
11477 break;
11478 case 512:
11479 shift = 6;
11480 break;
11481 default:
11482 abort ();
11483 }
11484 /* Make necessary corrections to shift for modes that need it. */
11485 if (bytemode == xmmq_mode
11486 || bytemode == evex_half_bcst_xmmq_mode
11487 || (bytemode == ymmq_mode && vex.length == 128))
11488 shift -= 1;
11489 else if (bytemode == xmmqd_mode)
11490 shift -= 2;
11491 else if (bytemode == xmmdw_mode)
11492 shift -= 3;
11493 break;
11494 case ymm_mode:
11495 shift = 5;
11496 break;
11497 case xmm_mode:
11498 shift = 4;
11499 break;
11500 case xmm_mq_mode:
11501 case q_mode:
11502 case q_swap_mode:
11503 shift = 3;
11504 break;
11505 case bw_unit_mode:
11506 shift = vex.w ? 1 : 0;
11507 break;
11508 default:
11509 abort ();
11510 }
11511 }
11512 else
11513 shift = 0;
11514
11515 USED_REX (REX_B);
11516 if (intel_syntax)
11517 intel_operand_size (bytemode, sizeflag);
11518 append_seg ();
11519
11520 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
11521 {
11522 /* 32/64 bit address mode */
11523 int havedisp;
11524 int havesib;
11525 int havebase;
11526 int haveindex;
11527 int needindex;
11528 int needaddr32;
11529 int base, rbase;
11530 int vindex = 0;
11531 int scale = 0;
11532 int addr32flag = !((sizeflag & AFLAG)
11533 || bytemode == v_bnd_mode
11534 || bytemode == v_bndmk_mode
11535 || bytemode == bnd_mode
11536 || bytemode == bnd_swap_mode);
11537 const char **indexes64 = names64;
11538 const char **indexes32 = names32;
11539
11540 havesib = 0;
11541 havebase = 1;
11542 haveindex = 0;
11543 base = modrm.rm;
11544
11545 if (base == 4)
11546 {
11547 havesib = 1;
11548 vindex = sib.index;
11549 USED_REX (REX_X);
11550 if (rex & REX_X)
11551 vindex += 8;
11552 switch (bytemode)
11553 {
11554 case vex_vsib_d_w_dq_mode:
11555 case vex_vsib_q_w_dq_mode:
11556 if (!need_vex)
11557 abort ();
11558 if (vex.evex)
11559 {
11560 if (!vex.v)
11561 vindex += 16;
11562 }
11563
11564 haveindex = 1;
11565 switch (vex.length)
11566 {
11567 case 128:
11568 indexes64 = indexes32 = names_xmm;
11569 break;
11570 case 256:
11571 if (!vex.w
11572 || bytemode == vex_vsib_q_w_dq_mode)
11573 indexes64 = indexes32 = names_ymm;
11574 else
11575 indexes64 = indexes32 = names_xmm;
11576 break;
11577 case 512:
11578 if (!vex.w
11579 || bytemode == vex_vsib_q_w_dq_mode)
11580 indexes64 = indexes32 = names_zmm;
11581 else
11582 indexes64 = indexes32 = names_ymm;
11583 break;
11584 default:
11585 abort ();
11586 }
11587 break;
11588 default:
11589 haveindex = vindex != 4;
11590 break;
11591 }
11592 scale = sib.scale;
11593 base = sib.base;
11594 codep++;
11595 }
11596 else
11597 {
11598 /* mandatory non-vector SIB must have sib */
11599 if (bytemode == vex_sibmem_mode)
11600 {
11601 oappend ("(bad)");
11602 return;
11603 }
11604 }
11605 rbase = base + add;
11606
11607 switch (modrm.mod)
11608 {
11609 case 0:
11610 if (base == 5)
11611 {
11612 havebase = 0;
11613 if (address_mode == mode_64bit && !havesib)
11614 riprel = 1;
11615 disp = get32s ();
11616 if (riprel && bytemode == v_bndmk_mode)
11617 {
11618 oappend ("(bad)");
11619 return;
11620 }
11621 }
11622 break;
11623 case 1:
11624 FETCH_DATA (the_info, codep + 1);
11625 disp = *codep++;
11626 if ((disp & 0x80) != 0)
11627 disp -= 0x100;
11628 if (vex.evex && shift > 0)
11629 disp <<= shift;
11630 break;
11631 case 2:
11632 disp = get32s ();
11633 break;
11634 }
11635
11636 needindex = 0;
11637 needaddr32 = 0;
11638 if (havesib
11639 && !havebase
11640 && !haveindex
11641 && address_mode != mode_16bit)
11642 {
11643 if (address_mode == mode_64bit)
11644 {
11645 if (addr32flag)
11646 {
11647 /* Without base nor index registers, zero-extend the
11648 lower 32-bit displacement to 64 bits. */
11649 disp = (unsigned int) disp;
11650 needindex = 1;
11651 }
11652 needaddr32 = 1;
11653 }
11654 else
11655 {
11656 /* In 32-bit mode, we need index register to tell [offset]
11657 from [eiz*1 + offset]. */
11658 needindex = 1;
11659 }
11660 }
11661
11662 havedisp = (havebase
11663 || needindex
11664 || (havesib && (haveindex || scale != 0)));
11665
11666 if (!intel_syntax)
11667 if (modrm.mod != 0 || base == 5)
11668 {
11669 if (havedisp || riprel)
11670 print_displacement (scratchbuf, disp);
11671 else
11672 print_operand_value (scratchbuf, 1, disp);
11673 oappend (scratchbuf);
11674 if (riprel)
11675 {
11676 set_op (disp, 1);
11677 oappend (!addr32flag ? "(%rip)" : "(%eip)");
11678 }
11679 }
11680
11681 if ((havebase || haveindex || needindex || needaddr32 || riprel)
11682 && (address_mode != mode_64bit
11683 || ((bytemode != v_bnd_mode)
11684 && (bytemode != v_bndmk_mode)
11685 && (bytemode != bnd_mode)
11686 && (bytemode != bnd_swap_mode))))
11687 used_prefixes |= PREFIX_ADDR;
11688
11689 if (havedisp || (intel_syntax && riprel))
11690 {
11691 *obufp++ = open_char;
11692 if (intel_syntax && riprel)
11693 {
11694 set_op (disp, 1);
11695 oappend (!addr32flag ? "rip" : "eip");
11696 }
11697 *obufp = '\0';
11698 if (havebase)
11699 oappend (address_mode == mode_64bit && !addr32flag
11700 ? names64[rbase] : names32[rbase]);
11701 if (havesib)
11702 {
11703 /* ESP/RSP won't allow index. If base isn't ESP/RSP,
11704 print index to tell base + index from base. */
11705 if (scale != 0
11706 || needindex
11707 || haveindex
11708 || (havebase && base != ESP_REG_NUM))
11709 {
11710 if (!intel_syntax || havebase)
11711 {
11712 *obufp++ = separator_char;
11713 *obufp = '\0';
11714 }
11715 if (haveindex)
11716 oappend (address_mode == mode_64bit && !addr32flag
11717 ? indexes64[vindex] : indexes32[vindex]);
11718 else
11719 oappend (address_mode == mode_64bit && !addr32flag
11720 ? index64 : index32);
11721
11722 *obufp++ = scale_char;
11723 *obufp = '\0';
11724 sprintf (scratchbuf, "%d", 1 << scale);
11725 oappend (scratchbuf);
11726 }
11727 }
11728 if (intel_syntax
11729 && (disp || modrm.mod != 0 || base == 5))
11730 {
11731 if (!havedisp || (bfd_signed_vma) disp >= 0)
11732 {
11733 *obufp++ = '+';
11734 *obufp = '\0';
11735 }
11736 else if (modrm.mod != 1 && disp != -disp)
11737 {
11738 *obufp++ = '-';
11739 *obufp = '\0';
11740 disp = -disp;
11741 }
11742
11743 if (havedisp)
11744 print_displacement (scratchbuf, disp);
11745 else
11746 print_operand_value (scratchbuf, 1, disp);
11747 oappend (scratchbuf);
11748 }
11749
11750 *obufp++ = close_char;
11751 *obufp = '\0';
11752 }
11753 else if (intel_syntax)
11754 {
11755 if (modrm.mod != 0 || base == 5)
11756 {
11757 if (!active_seg_prefix)
11758 {
11759 oappend (names_seg[ds_reg - es_reg]);
11760 oappend (":");
11761 }
11762 print_operand_value (scratchbuf, 1, disp);
11763 oappend (scratchbuf);
11764 }
11765 }
11766 }
11767 else if (bytemode == v_bnd_mode
11768 || bytemode == v_bndmk_mode
11769 || bytemode == bnd_mode
11770 || bytemode == bnd_swap_mode)
11771 {
11772 oappend ("(bad)");
11773 return;
11774 }
11775 else
11776 {
11777 /* 16 bit address mode */
11778 used_prefixes |= prefixes & PREFIX_ADDR;
11779 switch (modrm.mod)
11780 {
11781 case 0:
11782 if (modrm.rm == 6)
11783 {
11784 disp = get16 ();
11785 if ((disp & 0x8000) != 0)
11786 disp -= 0x10000;
11787 }
11788 break;
11789 case 1:
11790 FETCH_DATA (the_info, codep + 1);
11791 disp = *codep++;
11792 if ((disp & 0x80) != 0)
11793 disp -= 0x100;
11794 if (vex.evex && shift > 0)
11795 disp <<= shift;
11796 break;
11797 case 2:
11798 disp = get16 ();
11799 if ((disp & 0x8000) != 0)
11800 disp -= 0x10000;
11801 break;
11802 }
11803
11804 if (!intel_syntax)
11805 if (modrm.mod != 0 || modrm.rm == 6)
11806 {
11807 print_displacement (scratchbuf, disp);
11808 oappend (scratchbuf);
11809 }
11810
11811 if (modrm.mod != 0 || modrm.rm != 6)
11812 {
11813 *obufp++ = open_char;
11814 *obufp = '\0';
11815 oappend (index16[modrm.rm]);
11816 if (intel_syntax
11817 && (disp || modrm.mod != 0 || modrm.rm == 6))
11818 {
11819 if ((bfd_signed_vma) disp >= 0)
11820 {
11821 *obufp++ = '+';
11822 *obufp = '\0';
11823 }
11824 else if (modrm.mod != 1)
11825 {
11826 *obufp++ = '-';
11827 *obufp = '\0';
11828 disp = -disp;
11829 }
11830
11831 print_displacement (scratchbuf, disp);
11832 oappend (scratchbuf);
11833 }
11834
11835 *obufp++ = close_char;
11836 *obufp = '\0';
11837 }
11838 else if (intel_syntax)
11839 {
11840 if (!active_seg_prefix)
11841 {
11842 oappend (names_seg[ds_reg - es_reg]);
11843 oappend (":");
11844 }
11845 print_operand_value (scratchbuf, 1, disp & 0xffff);
11846 oappend (scratchbuf);
11847 }
11848 }
11849 if (vex.evex && vex.b
11850 && (bytemode == x_mode
11851 || bytemode == xmmq_mode
11852 || bytemode == evex_half_bcst_xmmq_mode))
11853 {
11854 if (vex.w
11855 || bytemode == xmmq_mode
11856 || bytemode == evex_half_bcst_xmmq_mode)
11857 {
11858 switch (vex.length)
11859 {
11860 case 128:
11861 oappend ("{1to2}");
11862 break;
11863 case 256:
11864 oappend ("{1to4}");
11865 break;
11866 case 512:
11867 oappend ("{1to8}");
11868 break;
11869 default:
11870 abort ();
11871 }
11872 }
11873 else
11874 {
11875 switch (vex.length)
11876 {
11877 case 128:
11878 oappend ("{1to4}");
11879 break;
11880 case 256:
11881 oappend ("{1to8}");
11882 break;
11883 case 512:
11884 oappend ("{1to16}");
11885 break;
11886 default:
11887 abort ();
11888 }
11889 }
11890 }
11891 }
11892
11893 static void
11894 OP_E (int bytemode, int sizeflag)
11895 {
11896 /* Skip mod/rm byte. */
11897 MODRM_CHECK;
11898 codep++;
11899
11900 if (modrm.mod == 3)
11901 OP_E_register (bytemode, sizeflag);
11902 else
11903 OP_E_memory (bytemode, sizeflag);
11904 }
11905
11906 static void
11907 OP_G (int bytemode, int sizeflag)
11908 {
11909 int add = 0;
11910 const char **names;
11911 USED_REX (REX_R);
11912 if (rex & REX_R)
11913 add += 8;
11914 switch (bytemode)
11915 {
11916 case b_mode:
11917 if (modrm.reg & 4)
11918 USED_REX (0);
11919 if (rex)
11920 oappend (names8rex[modrm.reg + add]);
11921 else
11922 oappend (names8[modrm.reg + add]);
11923 break;
11924 case w_mode:
11925 oappend (names16[modrm.reg + add]);
11926 break;
11927 case d_mode:
11928 case db_mode:
11929 case dw_mode:
11930 oappend (names32[modrm.reg + add]);
11931 break;
11932 case q_mode:
11933 oappend (names64[modrm.reg + add]);
11934 break;
11935 case bnd_mode:
11936 if (modrm.reg > 0x3)
11937 {
11938 oappend ("(bad)");
11939 return;
11940 }
11941 oappend (names_bnd[modrm.reg]);
11942 break;
11943 case v_mode:
11944 case dq_mode:
11945 case dqb_mode:
11946 case dqd_mode:
11947 case dqw_mode:
11948 case movsxd_mode:
11949 USED_REX (REX_W);
11950 if (rex & REX_W)
11951 oappend (names64[modrm.reg + add]);
11952 else if (bytemode != v_mode && bytemode != movsxd_mode)
11953 oappend (names32[modrm.reg + add]);
11954 else
11955 {
11956 if (sizeflag & DFLAG)
11957 oappend (names32[modrm.reg + add]);
11958 else
11959 oappend (names16[modrm.reg + add]);
11960 used_prefixes |= (prefixes & PREFIX_DATA);
11961 }
11962 break;
11963 case va_mode:
11964 names = (address_mode == mode_64bit
11965 ? names64 : names32);
11966 if (!(prefixes & PREFIX_ADDR))
11967 {
11968 if (address_mode == mode_16bit)
11969 names = names16;
11970 }
11971 else
11972 {
11973 /* Remove "addr16/addr32". */
11974 all_prefixes[last_addr_prefix] = 0;
11975 names = (address_mode != mode_32bit
11976 ? names32 : names16);
11977 used_prefixes |= PREFIX_ADDR;
11978 }
11979 oappend (names[modrm.reg + add]);
11980 break;
11981 case m_mode:
11982 if (address_mode == mode_64bit)
11983 oappend (names64[modrm.reg + add]);
11984 else
11985 oappend (names32[modrm.reg + add]);
11986 break;
11987 case mask_bd_mode:
11988 case mask_mode:
11989 if ((modrm.reg + add) > 0x7)
11990 {
11991 oappend ("(bad)");
11992 return;
11993 }
11994 oappend (names_mask[modrm.reg + add]);
11995 break;
11996 default:
11997 oappend (INTERNAL_DISASSEMBLER_ERROR);
11998 break;
11999 }
12000 }
12001
12002 static bfd_vma
12003 get64 (void)
12004 {
12005 bfd_vma x;
12006 #ifdef BFD64
12007 unsigned int a;
12008 unsigned int b;
12009
12010 FETCH_DATA (the_info, codep + 8);
12011 a = *codep++ & 0xff;
12012 a |= (*codep++ & 0xff) << 8;
12013 a |= (*codep++ & 0xff) << 16;
12014 a |= (*codep++ & 0xffu) << 24;
12015 b = *codep++ & 0xff;
12016 b |= (*codep++ & 0xff) << 8;
12017 b |= (*codep++ & 0xff) << 16;
12018 b |= (*codep++ & 0xffu) << 24;
12019 x = a + ((bfd_vma) b << 32);
12020 #else
12021 abort ();
12022 x = 0;
12023 #endif
12024 return x;
12025 }
12026
12027 static bfd_signed_vma
12028 get32 (void)
12029 {
12030 bfd_vma x = 0;
12031
12032 FETCH_DATA (the_info, codep + 4);
12033 x = *codep++ & (bfd_vma) 0xff;
12034 x |= (*codep++ & (bfd_vma) 0xff) << 8;
12035 x |= (*codep++ & (bfd_vma) 0xff) << 16;
12036 x |= (*codep++ & (bfd_vma) 0xff) << 24;
12037 return x;
12038 }
12039
12040 static bfd_signed_vma
12041 get32s (void)
12042 {
12043 bfd_vma x = 0;
12044
12045 FETCH_DATA (the_info, codep + 4);
12046 x = *codep++ & (bfd_vma) 0xff;
12047 x |= (*codep++ & (bfd_vma) 0xff) << 8;
12048 x |= (*codep++ & (bfd_vma) 0xff) << 16;
12049 x |= (*codep++ & (bfd_vma) 0xff) << 24;
12050
12051 x = (x ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31);
12052
12053 return x;
12054 }
12055
12056 static int
12057 get16 (void)
12058 {
12059 int x = 0;
12060
12061 FETCH_DATA (the_info, codep + 2);
12062 x = *codep++ & 0xff;
12063 x |= (*codep++ & 0xff) << 8;
12064 return x;
12065 }
12066
12067 static void
12068 set_op (bfd_vma op, int riprel)
12069 {
12070 op_index[op_ad] = op_ad;
12071 if (address_mode == mode_64bit)
12072 {
12073 op_address[op_ad] = op;
12074 op_riprel[op_ad] = riprel;
12075 }
12076 else
12077 {
12078 /* Mask to get a 32-bit address. */
12079 op_address[op_ad] = op & 0xffffffff;
12080 op_riprel[op_ad] = riprel & 0xffffffff;
12081 }
12082 }
12083
12084 static void
12085 OP_REG (int code, int sizeflag)
12086 {
12087 const char *s;
12088 int add;
12089
12090 switch (code)
12091 {
12092 case es_reg: case ss_reg: case cs_reg:
12093 case ds_reg: case fs_reg: case gs_reg:
12094 oappend (names_seg[code - es_reg]);
12095 return;
12096 }
12097
12098 USED_REX (REX_B);
12099 if (rex & REX_B)
12100 add = 8;
12101 else
12102 add = 0;
12103
12104 switch (code)
12105 {
12106 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
12107 case sp_reg: case bp_reg: case si_reg: case di_reg:
12108 s = names16[code - ax_reg + add];
12109 break;
12110 case ah_reg: case ch_reg: case dh_reg: case bh_reg:
12111 USED_REX (0);
12112 /* Fall through. */
12113 case al_reg: case cl_reg: case dl_reg: case bl_reg:
12114 if (rex)
12115 s = names8rex[code - al_reg + add];
12116 else
12117 s = names8[code - al_reg];
12118 break;
12119 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
12120 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
12121 if (address_mode == mode_64bit
12122 && ((sizeflag & DFLAG) || (rex & REX_W)))
12123 {
12124 s = names64[code - rAX_reg + add];
12125 break;
12126 }
12127 code += eAX_reg - rAX_reg;
12128 /* Fall through. */
12129 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
12130 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
12131 USED_REX (REX_W);
12132 if (rex & REX_W)
12133 s = names64[code - eAX_reg + add];
12134 else
12135 {
12136 if (sizeflag & DFLAG)
12137 s = names32[code - eAX_reg + add];
12138 else
12139 s = names16[code - eAX_reg + add];
12140 used_prefixes |= (prefixes & PREFIX_DATA);
12141 }
12142 break;
12143 default:
12144 s = INTERNAL_DISASSEMBLER_ERROR;
12145 break;
12146 }
12147 oappend (s);
12148 }
12149
12150 static void
12151 OP_IMREG (int code, int sizeflag)
12152 {
12153 const char *s;
12154
12155 switch (code)
12156 {
12157 case indir_dx_reg:
12158 if (intel_syntax)
12159 s = "dx";
12160 else
12161 s = "(%dx)";
12162 break;
12163 case al_reg: case cl_reg:
12164 s = names8[code - al_reg];
12165 break;
12166 case eAX_reg:
12167 USED_REX (REX_W);
12168 if (rex & REX_W)
12169 {
12170 s = *names64;
12171 break;
12172 }
12173 /* Fall through. */
12174 case z_mode_ax_reg:
12175 if ((rex & REX_W) || (sizeflag & DFLAG))
12176 s = *names32;
12177 else
12178 s = *names16;
12179 if (!(rex & REX_W))
12180 used_prefixes |= (prefixes & PREFIX_DATA);
12181 break;
12182 default:
12183 s = INTERNAL_DISASSEMBLER_ERROR;
12184 break;
12185 }
12186 oappend (s);
12187 }
12188
12189 static void
12190 OP_I (int bytemode, int sizeflag)
12191 {
12192 bfd_signed_vma op;
12193 bfd_signed_vma mask = -1;
12194
12195 switch (bytemode)
12196 {
12197 case b_mode:
12198 FETCH_DATA (the_info, codep + 1);
12199 op = *codep++;
12200 mask = 0xff;
12201 break;
12202 case v_mode:
12203 USED_REX (REX_W);
12204 if (rex & REX_W)
12205 op = get32s ();
12206 else
12207 {
12208 if (sizeflag & DFLAG)
12209 {
12210 op = get32 ();
12211 mask = 0xffffffff;
12212 }
12213 else
12214 {
12215 op = get16 ();
12216 mask = 0xfffff;
12217 }
12218 used_prefixes |= (prefixes & PREFIX_DATA);
12219 }
12220 break;
12221 case d_mode:
12222 mask = 0xffffffff;
12223 op = get32 ();
12224 break;
12225 case w_mode:
12226 mask = 0xfffff;
12227 op = get16 ();
12228 break;
12229 case const_1_mode:
12230 if (intel_syntax)
12231 oappend ("1");
12232 return;
12233 default:
12234 oappend (INTERNAL_DISASSEMBLER_ERROR);
12235 return;
12236 }
12237
12238 op &= mask;
12239 scratchbuf[0] = '$';
12240 print_operand_value (scratchbuf + 1, 1, op);
12241 oappend_maybe_intel (scratchbuf);
12242 scratchbuf[0] = '\0';
12243 }
12244
12245 static void
12246 OP_I64 (int bytemode, int sizeflag)
12247 {
12248 if (bytemode != v_mode || address_mode != mode_64bit || !(rex & REX_W))
12249 {
12250 OP_I (bytemode, sizeflag);
12251 return;
12252 }
12253
12254 USED_REX (REX_W);
12255
12256 scratchbuf[0] = '$';
12257 print_operand_value (scratchbuf + 1, 1, get64 ());
12258 oappend_maybe_intel (scratchbuf);
12259 scratchbuf[0] = '\0';
12260 }
12261
12262 static void
12263 OP_sI (int bytemode, int sizeflag)
12264 {
12265 bfd_signed_vma op;
12266
12267 switch (bytemode)
12268 {
12269 case b_mode:
12270 case b_T_mode:
12271 FETCH_DATA (the_info, codep + 1);
12272 op = *codep++;
12273 if ((op & 0x80) != 0)
12274 op -= 0x100;
12275 if (bytemode == b_T_mode)
12276 {
12277 if (address_mode != mode_64bit
12278 || !((sizeflag & DFLAG) || (rex & REX_W)))
12279 {
12280 /* The operand-size prefix is overridden by a REX prefix. */
12281 if ((sizeflag & DFLAG) || (rex & REX_W))
12282 op &= 0xffffffff;
12283 else
12284 op &= 0xffff;
12285 }
12286 }
12287 else
12288 {
12289 if (!(rex & REX_W))
12290 {
12291 if (sizeflag & DFLAG)
12292 op &= 0xffffffff;
12293 else
12294 op &= 0xffff;
12295 }
12296 }
12297 break;
12298 case v_mode:
12299 /* The operand-size prefix is overridden by a REX prefix. */
12300 if ((sizeflag & DFLAG) || (rex & REX_W))
12301 op = get32s ();
12302 else
12303 op = get16 ();
12304 break;
12305 default:
12306 oappend (INTERNAL_DISASSEMBLER_ERROR);
12307 return;
12308 }
12309
12310 scratchbuf[0] = '$';
12311 print_operand_value (scratchbuf + 1, 1, op);
12312 oappend_maybe_intel (scratchbuf);
12313 }
12314
12315 static void
12316 OP_J (int bytemode, int sizeflag)
12317 {
12318 bfd_vma disp;
12319 bfd_vma mask = -1;
12320 bfd_vma segment = 0;
12321
12322 switch (bytemode)
12323 {
12324 case b_mode:
12325 FETCH_DATA (the_info, codep + 1);
12326 disp = *codep++;
12327 if ((disp & 0x80) != 0)
12328 disp -= 0x100;
12329 break;
12330 case v_mode:
12331 case dqw_mode:
12332 if ((sizeflag & DFLAG)
12333 || (address_mode == mode_64bit
12334 && ((isa64 == intel64 && bytemode != dqw_mode)
12335 || (rex & REX_W))))
12336 disp = get32s ();
12337 else
12338 {
12339 disp = get16 ();
12340 if ((disp & 0x8000) != 0)
12341 disp -= 0x10000;
12342 /* In 16bit mode, address is wrapped around at 64k within
12343 the same segment. Otherwise, a data16 prefix on a jump
12344 instruction means that the pc is masked to 16 bits after
12345 the displacement is added! */
12346 mask = 0xffff;
12347 if ((prefixes & PREFIX_DATA) == 0)
12348 segment = ((start_pc + (codep - start_codep))
12349 & ~((bfd_vma) 0xffff));
12350 }
12351 if (address_mode != mode_64bit
12352 || (isa64 != intel64 && !(rex & REX_W)))
12353 used_prefixes |= (prefixes & PREFIX_DATA);
12354 break;
12355 default:
12356 oappend (INTERNAL_DISASSEMBLER_ERROR);
12357 return;
12358 }
12359 disp = ((start_pc + (codep - start_codep) + disp) & mask) | segment;
12360 set_op (disp, 0);
12361 print_operand_value (scratchbuf, 1, disp);
12362 oappend (scratchbuf);
12363 }
12364
12365 static void
12366 OP_SEG (int bytemode, int sizeflag)
12367 {
12368 if (bytemode == w_mode)
12369 oappend (names_seg[modrm.reg]);
12370 else
12371 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
12372 }
12373
12374 static void
12375 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
12376 {
12377 int seg, offset;
12378
12379 if (sizeflag & DFLAG)
12380 {
12381 offset = get32 ();
12382 seg = get16 ();
12383 }
12384 else
12385 {
12386 offset = get16 ();
12387 seg = get16 ();
12388 }
12389 used_prefixes |= (prefixes & PREFIX_DATA);
12390 if (intel_syntax)
12391 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
12392 else
12393 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
12394 oappend (scratchbuf);
12395 }
12396
12397 static void
12398 OP_OFF (int bytemode, int sizeflag)
12399 {
12400 bfd_vma off;
12401
12402 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12403 intel_operand_size (bytemode, sizeflag);
12404 append_seg ();
12405
12406 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
12407 off = get32 ();
12408 else
12409 off = get16 ();
12410
12411 if (intel_syntax)
12412 {
12413 if (!active_seg_prefix)
12414 {
12415 oappend (names_seg[ds_reg - es_reg]);
12416 oappend (":");
12417 }
12418 }
12419 print_operand_value (scratchbuf, 1, off);
12420 oappend (scratchbuf);
12421 }
12422
12423 static void
12424 OP_OFF64 (int bytemode, int sizeflag)
12425 {
12426 bfd_vma off;
12427
12428 if (address_mode != mode_64bit
12429 || (prefixes & PREFIX_ADDR))
12430 {
12431 OP_OFF (bytemode, sizeflag);
12432 return;
12433 }
12434
12435 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
12436 intel_operand_size (bytemode, sizeflag);
12437 append_seg ();
12438
12439 off = get64 ();
12440
12441 if (intel_syntax)
12442 {
12443 if (!active_seg_prefix)
12444 {
12445 oappend (names_seg[ds_reg - es_reg]);
12446 oappend (":");
12447 }
12448 }
12449 print_operand_value (scratchbuf, 1, off);
12450 oappend (scratchbuf);
12451 }
12452
12453 static void
12454 ptr_reg (int code, int sizeflag)
12455 {
12456 const char *s;
12457
12458 *obufp++ = open_char;
12459 used_prefixes |= (prefixes & PREFIX_ADDR);
12460 if (address_mode == mode_64bit)
12461 {
12462 if (!(sizeflag & AFLAG))
12463 s = names32[code - eAX_reg];
12464 else
12465 s = names64[code - eAX_reg];
12466 }
12467 else if (sizeflag & AFLAG)
12468 s = names32[code - eAX_reg];
12469 else
12470 s = names16[code - eAX_reg];
12471 oappend (s);
12472 *obufp++ = close_char;
12473 *obufp = 0;
12474 }
12475
12476 static void
12477 OP_ESreg (int code, int sizeflag)
12478 {
12479 if (intel_syntax)
12480 {
12481 switch (codep[-1])
12482 {
12483 case 0x6d: /* insw/insl */
12484 intel_operand_size (z_mode, sizeflag);
12485 break;
12486 case 0xa5: /* movsw/movsl/movsq */
12487 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12488 case 0xab: /* stosw/stosl */
12489 case 0xaf: /* scasw/scasl */
12490 intel_operand_size (v_mode, sizeflag);
12491 break;
12492 default:
12493 intel_operand_size (b_mode, sizeflag);
12494 }
12495 }
12496 oappend_maybe_intel ("%es:");
12497 ptr_reg (code, sizeflag);
12498 }
12499
12500 static void
12501 OP_DSreg (int code, int sizeflag)
12502 {
12503 if (intel_syntax)
12504 {
12505 switch (codep[-1])
12506 {
12507 case 0x6f: /* outsw/outsl */
12508 intel_operand_size (z_mode, sizeflag);
12509 break;
12510 case 0xa5: /* movsw/movsl/movsq */
12511 case 0xa7: /* cmpsw/cmpsl/cmpsq */
12512 case 0xad: /* lodsw/lodsl/lodsq */
12513 intel_operand_size (v_mode, sizeflag);
12514 break;
12515 default:
12516 intel_operand_size (b_mode, sizeflag);
12517 }
12518 }
12519 /* Set active_seg_prefix to PREFIX_DS if it is unset so that the
12520 default segment register DS is printed. */
12521 if (!active_seg_prefix)
12522 active_seg_prefix = PREFIX_DS;
12523 append_seg ();
12524 ptr_reg (code, sizeflag);
12525 }
12526
12527 static void
12528 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12529 {
12530 int add;
12531 if (rex & REX_R)
12532 {
12533 USED_REX (REX_R);
12534 add = 8;
12535 }
12536 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
12537 {
12538 all_prefixes[last_lock_prefix] = 0;
12539 used_prefixes |= PREFIX_LOCK;
12540 add = 8;
12541 }
12542 else
12543 add = 0;
12544 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
12545 oappend_maybe_intel (scratchbuf);
12546 }
12547
12548 static void
12549 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12550 {
12551 int add;
12552 USED_REX (REX_R);
12553 if (rex & REX_R)
12554 add = 8;
12555 else
12556 add = 0;
12557 if (intel_syntax)
12558 sprintf (scratchbuf, "dr%d", modrm.reg + add);
12559 else
12560 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
12561 oappend (scratchbuf);
12562 }
12563
12564 static void
12565 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12566 {
12567 sprintf (scratchbuf, "%%tr%d", modrm.reg);
12568 oappend_maybe_intel (scratchbuf);
12569 }
12570
12571 static void
12572 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12573 {
12574 int reg = modrm.reg;
12575 const char **names;
12576
12577 used_prefixes |= (prefixes & PREFIX_DATA);
12578 if (prefixes & PREFIX_DATA)
12579 {
12580 names = names_xmm;
12581 USED_REX (REX_R);
12582 if (rex & REX_R)
12583 reg += 8;
12584 }
12585 else
12586 names = names_mm;
12587 oappend (names[reg]);
12588 }
12589
12590 static void
12591 OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
12592 {
12593 int reg = modrm.reg;
12594 const char **names;
12595
12596 USED_REX (REX_R);
12597 if (rex & REX_R)
12598 reg += 8;
12599 if (vex.evex)
12600 {
12601 if (!vex.r)
12602 reg += 16;
12603 }
12604
12605 if (need_vex
12606 && bytemode != xmm_mode
12607 && bytemode != xmmq_mode
12608 && bytemode != evex_half_bcst_xmmq_mode
12609 && bytemode != ymm_mode
12610 && bytemode != tmm_mode
12611 && bytemode != scalar_mode)
12612 {
12613 switch (vex.length)
12614 {
12615 case 128:
12616 names = names_xmm;
12617 break;
12618 case 256:
12619 if (vex.w
12620 || bytemode != vex_vsib_q_w_dq_mode)
12621 names = names_ymm;
12622 else
12623 names = names_xmm;
12624 break;
12625 case 512:
12626 if (vex.w
12627 || bytemode != vex_vsib_q_w_dq_mode)
12628 names = names_zmm;
12629 else
12630 names = names_ymm;
12631 break;
12632 default:
12633 abort ();
12634 }
12635 }
12636 else if (bytemode == xmmq_mode
12637 || bytemode == evex_half_bcst_xmmq_mode)
12638 {
12639 switch (vex.length)
12640 {
12641 case 128:
12642 case 256:
12643 names = names_xmm;
12644 break;
12645 case 512:
12646 names = names_ymm;
12647 break;
12648 default:
12649 abort ();
12650 }
12651 }
12652 else if (bytemode == tmm_mode)
12653 {
12654 modrm.reg = reg;
12655 if (reg >= 8)
12656 {
12657 oappend ("(bad)");
12658 return;
12659 }
12660 names = names_tmm;
12661 }
12662 else if (bytemode == ymm_mode)
12663 names = names_ymm;
12664 else
12665 names = names_xmm;
12666 oappend (names[reg]);
12667 }
12668
12669 static void
12670 OP_EM (int bytemode, int sizeflag)
12671 {
12672 int reg;
12673 const char **names;
12674
12675 if (modrm.mod != 3)
12676 {
12677 if (intel_syntax
12678 && (bytemode == v_mode || bytemode == v_swap_mode))
12679 {
12680 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12681 used_prefixes |= (prefixes & PREFIX_DATA);
12682 }
12683 OP_E (bytemode, sizeflag);
12684 return;
12685 }
12686
12687 if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
12688 swap_operand ();
12689
12690 /* Skip mod/rm byte. */
12691 MODRM_CHECK;
12692 codep++;
12693 used_prefixes |= (prefixes & PREFIX_DATA);
12694 reg = modrm.rm;
12695 if (prefixes & PREFIX_DATA)
12696 {
12697 names = names_xmm;
12698 USED_REX (REX_B);
12699 if (rex & REX_B)
12700 reg += 8;
12701 }
12702 else
12703 names = names_mm;
12704 oappend (names[reg]);
12705 }
12706
12707 /* cvt* are the only instructions in sse2 which have
12708 both SSE and MMX operands and also have 0x66 prefix
12709 in their opcode. 0x66 was originally used to differentiate
12710 between SSE and MMX instruction(operands). So we have to handle the
12711 cvt* separately using OP_EMC and OP_MXC */
12712 static void
12713 OP_EMC (int bytemode, int sizeflag)
12714 {
12715 if (modrm.mod != 3)
12716 {
12717 if (intel_syntax && bytemode == v_mode)
12718 {
12719 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
12720 used_prefixes |= (prefixes & PREFIX_DATA);
12721 }
12722 OP_E (bytemode, sizeflag);
12723 return;
12724 }
12725
12726 /* Skip mod/rm byte. */
12727 MODRM_CHECK;
12728 codep++;
12729 used_prefixes |= (prefixes & PREFIX_DATA);
12730 oappend (names_mm[modrm.rm]);
12731 }
12732
12733 static void
12734 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12735 {
12736 used_prefixes |= (prefixes & PREFIX_DATA);
12737 oappend (names_mm[modrm.reg]);
12738 }
12739
12740 static void
12741 OP_EX (int bytemode, int sizeflag)
12742 {
12743 int reg;
12744 const char **names;
12745
12746 /* Skip mod/rm byte. */
12747 MODRM_CHECK;
12748 codep++;
12749
12750 if (modrm.mod != 3)
12751 {
12752 OP_E_memory (bytemode, sizeflag);
12753 return;
12754 }
12755
12756 reg = modrm.rm;
12757 USED_REX (REX_B);
12758 if (rex & REX_B)
12759 reg += 8;
12760 if (vex.evex)
12761 {
12762 USED_REX (REX_X);
12763 if ((rex & REX_X))
12764 reg += 16;
12765 }
12766
12767 if ((sizeflag & SUFFIX_ALWAYS)
12768 && (bytemode == x_swap_mode
12769 || bytemode == d_swap_mode
12770 || bytemode == q_swap_mode))
12771 swap_operand ();
12772
12773 if (need_vex
12774 && bytemode != xmm_mode
12775 && bytemode != xmmdw_mode
12776 && bytemode != xmmqd_mode
12777 && bytemode != xmm_mb_mode
12778 && bytemode != xmm_mw_mode
12779 && bytemode != xmm_md_mode
12780 && bytemode != xmm_mq_mode
12781 && bytemode != xmmq_mode
12782 && bytemode != evex_half_bcst_xmmq_mode
12783 && bytemode != ymm_mode
12784 && bytemode != tmm_mode
12785 && bytemode != vex_scalar_w_dq_mode)
12786 {
12787 switch (vex.length)
12788 {
12789 case 128:
12790 names = names_xmm;
12791 break;
12792 case 256:
12793 names = names_ymm;
12794 break;
12795 case 512:
12796 names = names_zmm;
12797 break;
12798 default:
12799 abort ();
12800 }
12801 }
12802 else if (bytemode == xmmq_mode
12803 || bytemode == evex_half_bcst_xmmq_mode)
12804 {
12805 switch (vex.length)
12806 {
12807 case 128:
12808 case 256:
12809 names = names_xmm;
12810 break;
12811 case 512:
12812 names = names_ymm;
12813 break;
12814 default:
12815 abort ();
12816 }
12817 }
12818 else if (bytemode == tmm_mode)
12819 {
12820 modrm.rm = reg;
12821 if (reg >= 8)
12822 {
12823 oappend ("(bad)");
12824 return;
12825 }
12826 names = names_tmm;
12827 }
12828 else if (bytemode == ymm_mode)
12829 names = names_ymm;
12830 else
12831 names = names_xmm;
12832 oappend (names[reg]);
12833 }
12834
12835 static void
12836 OP_MS (int bytemode, int sizeflag)
12837 {
12838 if (modrm.mod == 3)
12839 OP_EM (bytemode, sizeflag);
12840 else
12841 BadOp ();
12842 }
12843
12844 static void
12845 OP_XS (int bytemode, int sizeflag)
12846 {
12847 if (modrm.mod == 3)
12848 OP_EX (bytemode, sizeflag);
12849 else
12850 BadOp ();
12851 }
12852
12853 static void
12854 OP_M (int bytemode, int sizeflag)
12855 {
12856 if (modrm.mod == 3)
12857 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
12858 BadOp ();
12859 else
12860 OP_E (bytemode, sizeflag);
12861 }
12862
12863 static void
12864 OP_0f07 (int bytemode, int sizeflag)
12865 {
12866 if (modrm.mod != 3 || modrm.rm != 0)
12867 BadOp ();
12868 else
12869 OP_E (bytemode, sizeflag);
12870 }
12871
12872 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
12873 32bit mode and "xchg %rax,%rax" in 64bit mode. */
12874
12875 static void
12876 NOP_Fixup1 (int bytemode, int sizeflag)
12877 {
12878 if ((prefixes & PREFIX_DATA) != 0
12879 || (rex != 0
12880 && rex != 0x48
12881 && address_mode == mode_64bit))
12882 OP_REG (bytemode, sizeflag);
12883 else
12884 strcpy (obuf, "nop");
12885 }
12886
12887 static void
12888 NOP_Fixup2 (int bytemode, int sizeflag)
12889 {
12890 if ((prefixes & PREFIX_DATA) != 0
12891 || (rex != 0
12892 && rex != 0x48
12893 && address_mode == mode_64bit))
12894 OP_IMREG (bytemode, sizeflag);
12895 }
12896
12897 static const char *const Suffix3DNow[] = {
12898 /* 00 */ NULL, NULL, NULL, NULL,
12899 /* 04 */ NULL, NULL, NULL, NULL,
12900 /* 08 */ NULL, NULL, NULL, NULL,
12901 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
12902 /* 10 */ NULL, NULL, NULL, NULL,
12903 /* 14 */ NULL, NULL, NULL, NULL,
12904 /* 18 */ NULL, NULL, NULL, NULL,
12905 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
12906 /* 20 */ NULL, NULL, NULL, NULL,
12907 /* 24 */ NULL, NULL, NULL, NULL,
12908 /* 28 */ NULL, NULL, NULL, NULL,
12909 /* 2C */ NULL, NULL, NULL, NULL,
12910 /* 30 */ NULL, NULL, NULL, NULL,
12911 /* 34 */ NULL, NULL, NULL, NULL,
12912 /* 38 */ NULL, NULL, NULL, NULL,
12913 /* 3C */ NULL, NULL, NULL, NULL,
12914 /* 40 */ NULL, NULL, NULL, NULL,
12915 /* 44 */ NULL, NULL, NULL, NULL,
12916 /* 48 */ NULL, NULL, NULL, NULL,
12917 /* 4C */ NULL, NULL, NULL, NULL,
12918 /* 50 */ NULL, NULL, NULL, NULL,
12919 /* 54 */ NULL, NULL, NULL, NULL,
12920 /* 58 */ NULL, NULL, NULL, NULL,
12921 /* 5C */ NULL, NULL, NULL, NULL,
12922 /* 60 */ NULL, NULL, NULL, NULL,
12923 /* 64 */ NULL, NULL, NULL, NULL,
12924 /* 68 */ NULL, NULL, NULL, NULL,
12925 /* 6C */ NULL, NULL, NULL, NULL,
12926 /* 70 */ NULL, NULL, NULL, NULL,
12927 /* 74 */ NULL, NULL, NULL, NULL,
12928 /* 78 */ NULL, NULL, NULL, NULL,
12929 /* 7C */ NULL, NULL, NULL, NULL,
12930 /* 80 */ NULL, NULL, NULL, NULL,
12931 /* 84 */ NULL, NULL, NULL, NULL,
12932 /* 88 */ NULL, NULL, "pfnacc", NULL,
12933 /* 8C */ NULL, NULL, "pfpnacc", NULL,
12934 /* 90 */ "pfcmpge", NULL, NULL, NULL,
12935 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
12936 /* 98 */ NULL, NULL, "pfsub", NULL,
12937 /* 9C */ NULL, NULL, "pfadd", NULL,
12938 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
12939 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
12940 /* A8 */ NULL, NULL, "pfsubr", NULL,
12941 /* AC */ NULL, NULL, "pfacc", NULL,
12942 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
12943 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
12944 /* B8 */ NULL, NULL, NULL, "pswapd",
12945 /* BC */ NULL, NULL, NULL, "pavgusb",
12946 /* C0 */ NULL, NULL, NULL, NULL,
12947 /* C4 */ NULL, NULL, NULL, NULL,
12948 /* C8 */ NULL, NULL, NULL, NULL,
12949 /* CC */ NULL, NULL, NULL, NULL,
12950 /* D0 */ NULL, NULL, NULL, NULL,
12951 /* D4 */ NULL, NULL, NULL, NULL,
12952 /* D8 */ NULL, NULL, NULL, NULL,
12953 /* DC */ NULL, NULL, NULL, NULL,
12954 /* E0 */ NULL, NULL, NULL, NULL,
12955 /* E4 */ NULL, NULL, NULL, NULL,
12956 /* E8 */ NULL, NULL, NULL, NULL,
12957 /* EC */ NULL, NULL, NULL, NULL,
12958 /* F0 */ NULL, NULL, NULL, NULL,
12959 /* F4 */ NULL, NULL, NULL, NULL,
12960 /* F8 */ NULL, NULL, NULL, NULL,
12961 /* FC */ NULL, NULL, NULL, NULL,
12962 };
12963
12964 static void
12965 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
12966 {
12967 const char *mnemonic;
12968
12969 FETCH_DATA (the_info, codep + 1);
12970 /* AMD 3DNow! instructions are specified by an opcode suffix in the
12971 place where an 8-bit immediate would normally go. ie. the last
12972 byte of the instruction. */
12973 obufp = mnemonicendp;
12974 mnemonic = Suffix3DNow[*codep++ & 0xff];
12975 if (mnemonic)
12976 oappend (mnemonic);
12977 else
12978 {
12979 /* Since a variable sized modrm/sib chunk is between the start
12980 of the opcode (0x0f0f) and the opcode suffix, we need to do
12981 all the modrm processing first, and don't know until now that
12982 we have a bad opcode. This necessitates some cleaning up. */
12983 op_out[0][0] = '\0';
12984 op_out[1][0] = '\0';
12985 BadOp ();
12986 }
12987 mnemonicendp = obufp;
12988 }
12989
12990 static const struct op simd_cmp_op[] =
12991 {
12992 { STRING_COMMA_LEN ("eq") },
12993 { STRING_COMMA_LEN ("lt") },
12994 { STRING_COMMA_LEN ("le") },
12995 { STRING_COMMA_LEN ("unord") },
12996 { STRING_COMMA_LEN ("neq") },
12997 { STRING_COMMA_LEN ("nlt") },
12998 { STRING_COMMA_LEN ("nle") },
12999 { STRING_COMMA_LEN ("ord") }
13000 };
13001
13002 static const struct op vex_cmp_op[] =
13003 {
13004 { STRING_COMMA_LEN ("eq_uq") },
13005 { STRING_COMMA_LEN ("nge") },
13006 { STRING_COMMA_LEN ("ngt") },
13007 { STRING_COMMA_LEN ("false") },
13008 { STRING_COMMA_LEN ("neq_oq") },
13009 { STRING_COMMA_LEN ("ge") },
13010 { STRING_COMMA_LEN ("gt") },
13011 { STRING_COMMA_LEN ("true") },
13012 { STRING_COMMA_LEN ("eq_os") },
13013 { STRING_COMMA_LEN ("lt_oq") },
13014 { STRING_COMMA_LEN ("le_oq") },
13015 { STRING_COMMA_LEN ("unord_s") },
13016 { STRING_COMMA_LEN ("neq_us") },
13017 { STRING_COMMA_LEN ("nlt_uq") },
13018 { STRING_COMMA_LEN ("nle_uq") },
13019 { STRING_COMMA_LEN ("ord_s") },
13020 { STRING_COMMA_LEN ("eq_us") },
13021 { STRING_COMMA_LEN ("nge_uq") },
13022 { STRING_COMMA_LEN ("ngt_uq") },
13023 { STRING_COMMA_LEN ("false_os") },
13024 { STRING_COMMA_LEN ("neq_os") },
13025 { STRING_COMMA_LEN ("ge_oq") },
13026 { STRING_COMMA_LEN ("gt_oq") },
13027 { STRING_COMMA_LEN ("true_us") },
13028 };
13029
13030 static void
13031 CMP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13032 {
13033 unsigned int cmp_type;
13034
13035 FETCH_DATA (the_info, codep + 1);
13036 cmp_type = *codep++ & 0xff;
13037 if (cmp_type < ARRAY_SIZE (simd_cmp_op))
13038 {
13039 char suffix [3];
13040 char *p = mnemonicendp - 2;
13041 suffix[0] = p[0];
13042 suffix[1] = p[1];
13043 suffix[2] = '\0';
13044 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13045 mnemonicendp += simd_cmp_op[cmp_type].len;
13046 }
13047 else if (need_vex
13048 && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
13049 {
13050 char suffix [3];
13051 char *p = mnemonicendp - 2;
13052 suffix[0] = p[0];
13053 suffix[1] = p[1];
13054 suffix[2] = '\0';
13055 cmp_type -= ARRAY_SIZE (simd_cmp_op);
13056 sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
13057 mnemonicendp += vex_cmp_op[cmp_type].len;
13058 }
13059 else
13060 {
13061 /* We have a reserved extension byte. Output it directly. */
13062 scratchbuf[0] = '$';
13063 print_operand_value (scratchbuf + 1, 1, cmp_type);
13064 oappend_maybe_intel (scratchbuf);
13065 scratchbuf[0] = '\0';
13066 }
13067 }
13068
13069 static void
13070 OP_Mwait (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13071 {
13072 /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
13073 if (!intel_syntax)
13074 {
13075 strcpy (op_out[0], names32[0]);
13076 strcpy (op_out[1], names32[1]);
13077 if (bytemode == eBX_reg)
13078 strcpy (op_out[2], names32[3]);
13079 two_source_ops = 1;
13080 }
13081 /* Skip mod/rm byte. */
13082 MODRM_CHECK;
13083 codep++;
13084 }
13085
13086 static void
13087 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
13088 int sizeflag ATTRIBUTE_UNUSED)
13089 {
13090 /* monitor %{e,r,}ax,%ecx,%edx" */
13091 if (!intel_syntax)
13092 {
13093 const char **names = (address_mode == mode_64bit
13094 ? names64 : names32);
13095
13096 if (prefixes & PREFIX_ADDR)
13097 {
13098 /* Remove "addr16/addr32". */
13099 all_prefixes[last_addr_prefix] = 0;
13100 names = (address_mode != mode_32bit
13101 ? names32 : names16);
13102 used_prefixes |= PREFIX_ADDR;
13103 }
13104 else if (address_mode == mode_16bit)
13105 names = names16;
13106 strcpy (op_out[0], names[0]);
13107 strcpy (op_out[1], names32[1]);
13108 strcpy (op_out[2], names32[2]);
13109 two_source_ops = 1;
13110 }
13111 /* Skip mod/rm byte. */
13112 MODRM_CHECK;
13113 codep++;
13114 }
13115
13116 static void
13117 BadOp (void)
13118 {
13119 /* Throw away prefixes and 1st. opcode byte. */
13120 codep = insn_codep + 1;
13121 oappend ("(bad)");
13122 }
13123
13124 static void
13125 REP_Fixup (int bytemode, int sizeflag)
13126 {
13127 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
13128 lods and stos. */
13129 if (prefixes & PREFIX_REPZ)
13130 all_prefixes[last_repz_prefix] = REP_PREFIX;
13131
13132 switch (bytemode)
13133 {
13134 case al_reg:
13135 case eAX_reg:
13136 case indir_dx_reg:
13137 OP_IMREG (bytemode, sizeflag);
13138 break;
13139 case eDI_reg:
13140 OP_ESreg (bytemode, sizeflag);
13141 break;
13142 case eSI_reg:
13143 OP_DSreg (bytemode, sizeflag);
13144 break;
13145 default:
13146 abort ();
13147 break;
13148 }
13149 }
13150
13151 static void
13152 SEP_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13153 {
13154 if ( isa64 != amd64 )
13155 return;
13156
13157 obufp = obuf;
13158 BadOp ();
13159 mnemonicendp = obufp;
13160 ++codep;
13161 }
13162
13163 /* For BND-prefixed instructions 0xF2 prefix should be displayed as
13164 "bnd". */
13165
13166 static void
13167 BND_Fixup (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
13168 {
13169 if (prefixes & PREFIX_REPNZ)
13170 all_prefixes[last_repnz_prefix] = BND_PREFIX;
13171 }
13172
13173 /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
13174 "notrack". */
13175
13176 static void
13177 NOTRACK_Fixup (int bytemode ATTRIBUTE_UNUSED,
13178 int sizeflag ATTRIBUTE_UNUSED)
13179 {
13180
13181 /* Since active_seg_prefix is not set in 64-bit mode, check whether
13182 we've seen a PREFIX_DS. */
13183 if ((prefixes & PREFIX_DS) != 0
13184 && (address_mode != mode_64bit || last_data_prefix < 0))
13185 {
13186 /* NOTRACK prefix is only valid on indirect branch instructions.
13187 NB: DATA prefix is unsupported for Intel64. */
13188 active_seg_prefix = 0;
13189 all_prefixes[last_seg_prefix] = NOTRACK_PREFIX;
13190 }
13191 }
13192
13193 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13194 "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
13195 */
13196
13197 static void
13198 HLE_Fixup1 (int bytemode, int sizeflag)
13199 {
13200 if (modrm.mod != 3
13201 && (prefixes & PREFIX_LOCK) != 0)
13202 {
13203 if (prefixes & PREFIX_REPZ)
13204 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13205 if (prefixes & PREFIX_REPNZ)
13206 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13207 }
13208
13209 OP_E (bytemode, sizeflag);
13210 }
13211
13212 /* Similar to OP_E. But the 0xf2/0xf3 prefixes should be displayed as
13213 "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
13214 */
13215
13216 static void
13217 HLE_Fixup2 (int bytemode, int sizeflag)
13218 {
13219 if (modrm.mod != 3)
13220 {
13221 if (prefixes & PREFIX_REPZ)
13222 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13223 if (prefixes & PREFIX_REPNZ)
13224 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13225 }
13226
13227 OP_E (bytemode, sizeflag);
13228 }
13229
13230 /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
13231 "xrelease" for memory operand. No check for LOCK prefix. */
13232
13233 static void
13234 HLE_Fixup3 (int bytemode, int sizeflag)
13235 {
13236 if (modrm.mod != 3
13237 && last_repz_prefix > last_repnz_prefix
13238 && (prefixes & PREFIX_REPZ) != 0)
13239 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13240
13241 OP_E (bytemode, sizeflag);
13242 }
13243
13244 static void
13245 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
13246 {
13247 USED_REX (REX_W);
13248 if (rex & REX_W)
13249 {
13250 /* Change cmpxchg8b to cmpxchg16b. */
13251 char *p = mnemonicendp - 2;
13252 mnemonicendp = stpcpy (p, "16b");
13253 bytemode = o_mode;
13254 }
13255 else if ((prefixes & PREFIX_LOCK) != 0)
13256 {
13257 if (prefixes & PREFIX_REPZ)
13258 all_prefixes[last_repz_prefix] = XRELEASE_PREFIX;
13259 if (prefixes & PREFIX_REPNZ)
13260 all_prefixes[last_repnz_prefix] = XACQUIRE_PREFIX;
13261 }
13262
13263 OP_M (bytemode, sizeflag);
13264 }
13265
13266 static void
13267 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
13268 {
13269 const char **names;
13270
13271 if (need_vex)
13272 {
13273 switch (vex.length)
13274 {
13275 case 128:
13276 names = names_xmm;
13277 break;
13278 case 256:
13279 names = names_ymm;
13280 break;
13281 default:
13282 abort ();
13283 }
13284 }
13285 else
13286 names = names_xmm;
13287 oappend (names[reg]);
13288 }
13289
13290 static void
13291 FXSAVE_Fixup (int bytemode, int sizeflag)
13292 {
13293 /* Add proper suffix to "fxsave" and "fxrstor". */
13294 USED_REX (REX_W);
13295 if (rex & REX_W)
13296 {
13297 char *p = mnemonicendp;
13298 *p++ = '6';
13299 *p++ = '4';
13300 *p = '\0';
13301 mnemonicendp = p;
13302 }
13303 OP_M (bytemode, sizeflag);
13304 }
13305
13306 /* Display the destination register operand for instructions with
13307 VEX. */
13308
13309 static void
13310 OP_VEX (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13311 {
13312 int reg;
13313 const char **names;
13314
13315 if (!need_vex)
13316 abort ();
13317
13318 reg = vex.register_specifier;
13319 vex.register_specifier = 0;
13320 if (address_mode != mode_64bit)
13321 reg &= 7;
13322 else if (vex.evex && !vex.v)
13323 reg += 16;
13324
13325 if (bytemode == vex_scalar_mode)
13326 {
13327 oappend (names_xmm[reg]);
13328 return;
13329 }
13330
13331 if (bytemode == tmm_mode)
13332 {
13333 /* All 3 TMM registers must be distinct. */
13334 if (reg >= 8)
13335 oappend ("(bad)");
13336 else
13337 {
13338 /* This must be the 3rd operand. */
13339 if (obufp != op_out[2])
13340 abort ();
13341 oappend (names_tmm[reg]);
13342 if (reg == modrm.reg || reg == modrm.rm)
13343 strcpy (obufp, "/(bad)");
13344 }
13345
13346 if (modrm.reg == modrm.rm || modrm.reg == reg || modrm.rm == reg)
13347 {
13348 if (modrm.reg <= 8
13349 && (modrm.reg == modrm.rm || modrm.reg == reg))
13350 strcat (op_out[0], "/(bad)");
13351 if (modrm.rm <= 8
13352 && (modrm.rm == modrm.reg || modrm.rm == reg))
13353 strcat (op_out[1], "/(bad)");
13354 }
13355
13356 return;
13357 }
13358
13359 switch (vex.length)
13360 {
13361 case 128:
13362 switch (bytemode)
13363 {
13364 case vex_mode:
13365 case vex_vsib_q_w_dq_mode:
13366 names = names_xmm;
13367 break;
13368 case dq_mode:
13369 if (rex & REX_W)
13370 names = names64;
13371 else
13372 names = names32;
13373 break;
13374 case mask_bd_mode:
13375 case mask_mode:
13376 if (reg > 0x7)
13377 {
13378 oappend ("(bad)");
13379 return;
13380 }
13381 names = names_mask;
13382 break;
13383 default:
13384 abort ();
13385 return;
13386 }
13387 break;
13388 case 256:
13389 switch (bytemode)
13390 {
13391 case vex_mode:
13392 names = names_ymm;
13393 break;
13394 case vex_vsib_q_w_dq_mode:
13395 names = vex.w ? names_ymm : names_xmm;
13396 break;
13397 case mask_bd_mode:
13398 case mask_mode:
13399 if (reg > 0x7)
13400 {
13401 oappend ("(bad)");
13402 return;
13403 }
13404 names = names_mask;
13405 break;
13406 default:
13407 /* See PR binutils/20893 for a reproducer. */
13408 oappend ("(bad)");
13409 return;
13410 }
13411 break;
13412 case 512:
13413 names = names_zmm;
13414 break;
13415 default:
13416 abort ();
13417 break;
13418 }
13419 oappend (names[reg]);
13420 }
13421
13422 static void
13423 OP_VexR (int bytemode, int sizeflag)
13424 {
13425 if (modrm.mod == 3)
13426 OP_VEX (bytemode, sizeflag);
13427 }
13428
13429 static void
13430 OP_VexW (int bytemode, int sizeflag)
13431 {
13432 OP_VEX (bytemode, sizeflag);
13433
13434 if (vex.w)
13435 {
13436 /* Swap 2nd and 3rd operands. */
13437 strcpy (scratchbuf, op_out[2]);
13438 strcpy (op_out[2], op_out[1]);
13439 strcpy (op_out[1], scratchbuf);
13440 }
13441 }
13442
13443 static void
13444 OP_REG_VexI4 (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13445 {
13446 int reg;
13447 const char **names = names_xmm;
13448
13449 FETCH_DATA (the_info, codep + 1);
13450 reg = *codep++;
13451
13452 if (bytemode != x_mode && bytemode != scalar_mode)
13453 abort ();
13454
13455 reg >>= 4;
13456 if (address_mode != mode_64bit)
13457 reg &= 7;
13458
13459 if (bytemode == x_mode && vex.length == 256)
13460 names = names_ymm;
13461
13462 oappend (names[reg]);
13463
13464 if (vex.w)
13465 {
13466 /* Swap 3rd and 4th operands. */
13467 strcpy (scratchbuf, op_out[3]);
13468 strcpy (op_out[3], op_out[2]);
13469 strcpy (op_out[2], scratchbuf);
13470 }
13471 }
13472
13473 static void
13474 OP_VexI4 (int bytemode ATTRIBUTE_UNUSED,
13475 int sizeflag ATTRIBUTE_UNUSED)
13476 {
13477 scratchbuf[0] = '$';
13478 print_operand_value (scratchbuf + 1, 1, codep[-1] & 0xf);
13479 oappend_maybe_intel (scratchbuf);
13480 }
13481
13482 static void
13483 VPCMP_Fixup (int bytemode ATTRIBUTE_UNUSED,
13484 int sizeflag ATTRIBUTE_UNUSED)
13485 {
13486 unsigned int cmp_type;
13487
13488 if (!vex.evex)
13489 abort ();
13490
13491 FETCH_DATA (the_info, codep + 1);
13492 cmp_type = *codep++ & 0xff;
13493 /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
13494 If it's the case, print suffix, otherwise - print the immediate. */
13495 if (cmp_type < ARRAY_SIZE (simd_cmp_op)
13496 && cmp_type != 3
13497 && cmp_type != 7)
13498 {
13499 char suffix [3];
13500 char *p = mnemonicendp - 2;
13501
13502 /* vpcmp* can have both one- and two-lettered suffix. */
13503 if (p[0] == 'p')
13504 {
13505 p++;
13506 suffix[0] = p[0];
13507 suffix[1] = '\0';
13508 }
13509 else
13510 {
13511 suffix[0] = p[0];
13512 suffix[1] = p[1];
13513 suffix[2] = '\0';
13514 }
13515
13516 sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
13517 mnemonicendp += simd_cmp_op[cmp_type].len;
13518 }
13519 else
13520 {
13521 /* We have a reserved extension byte. Output it directly. */
13522 scratchbuf[0] = '$';
13523 print_operand_value (scratchbuf + 1, 1, cmp_type);
13524 oappend_maybe_intel (scratchbuf);
13525 scratchbuf[0] = '\0';
13526 }
13527 }
13528
13529 static const struct op xop_cmp_op[] =
13530 {
13531 { STRING_COMMA_LEN ("lt") },
13532 { STRING_COMMA_LEN ("le") },
13533 { STRING_COMMA_LEN ("gt") },
13534 { STRING_COMMA_LEN ("ge") },
13535 { STRING_COMMA_LEN ("eq") },
13536 { STRING_COMMA_LEN ("neq") },
13537 { STRING_COMMA_LEN ("false") },
13538 { STRING_COMMA_LEN ("true") }
13539 };
13540
13541 static void
13542 VPCOM_Fixup (int bytemode ATTRIBUTE_UNUSED,
13543 int sizeflag ATTRIBUTE_UNUSED)
13544 {
13545 unsigned int cmp_type;
13546
13547 FETCH_DATA (the_info, codep + 1);
13548 cmp_type = *codep++ & 0xff;
13549 if (cmp_type < ARRAY_SIZE (xop_cmp_op))
13550 {
13551 char suffix[3];
13552 char *p = mnemonicendp - 2;
13553
13554 /* vpcom* can have both one- and two-lettered suffix. */
13555 if (p[0] == 'm')
13556 {
13557 p++;
13558 suffix[0] = p[0];
13559 suffix[1] = '\0';
13560 }
13561 else
13562 {
13563 suffix[0] = p[0];
13564 suffix[1] = p[1];
13565 suffix[2] = '\0';
13566 }
13567
13568 sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
13569 mnemonicendp += xop_cmp_op[cmp_type].len;
13570 }
13571 else
13572 {
13573 /* We have a reserved extension byte. Output it directly. */
13574 scratchbuf[0] = '$';
13575 print_operand_value (scratchbuf + 1, 1, cmp_type);
13576 oappend_maybe_intel (scratchbuf);
13577 scratchbuf[0] = '\0';
13578 }
13579 }
13580
13581 static const struct op pclmul_op[] =
13582 {
13583 { STRING_COMMA_LEN ("lql") },
13584 { STRING_COMMA_LEN ("hql") },
13585 { STRING_COMMA_LEN ("lqh") },
13586 { STRING_COMMA_LEN ("hqh") }
13587 };
13588
13589 static void
13590 PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED,
13591 int sizeflag ATTRIBUTE_UNUSED)
13592 {
13593 unsigned int pclmul_type;
13594
13595 FETCH_DATA (the_info, codep + 1);
13596 pclmul_type = *codep++ & 0xff;
13597 switch (pclmul_type)
13598 {
13599 case 0x10:
13600 pclmul_type = 2;
13601 break;
13602 case 0x11:
13603 pclmul_type = 3;
13604 break;
13605 default:
13606 break;
13607 }
13608 if (pclmul_type < ARRAY_SIZE (pclmul_op))
13609 {
13610 char suffix [4];
13611 char *p = mnemonicendp - 3;
13612 suffix[0] = p[0];
13613 suffix[1] = p[1];
13614 suffix[2] = p[2];
13615 suffix[3] = '\0';
13616 sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
13617 mnemonicendp += pclmul_op[pclmul_type].len;
13618 }
13619 else
13620 {
13621 /* We have a reserved extension byte. Output it directly. */
13622 scratchbuf[0] = '$';
13623 print_operand_value (scratchbuf + 1, 1, pclmul_type);
13624 oappend_maybe_intel (scratchbuf);
13625 scratchbuf[0] = '\0';
13626 }
13627 }
13628
13629 static void
13630 MOVSXD_Fixup (int bytemode, int sizeflag)
13631 {
13632 /* Add proper suffix to "movsxd". */
13633 char *p = mnemonicendp;
13634
13635 switch (bytemode)
13636 {
13637 case movsxd_mode:
13638 if (intel_syntax)
13639 {
13640 *p++ = 'x';
13641 *p++ = 'd';
13642 goto skip;
13643 }
13644
13645 USED_REX (REX_W);
13646 if (rex & REX_W)
13647 {
13648 *p++ = 'l';
13649 *p++ = 'q';
13650 }
13651 else
13652 {
13653 *p++ = 'x';
13654 *p++ = 'd';
13655 }
13656 break;
13657 default:
13658 oappend (INTERNAL_DISASSEMBLER_ERROR);
13659 break;
13660 }
13661
13662 skip:
13663 mnemonicendp = p;
13664 *p = '\0';
13665 OP_E (bytemode, sizeflag);
13666 }
13667
13668 static void
13669 OP_Mask (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13670 {
13671 if (!vex.evex
13672 || (bytemode != mask_mode && bytemode != mask_bd_mode))
13673 abort ();
13674
13675 USED_REX (REX_R);
13676 if ((rex & REX_R) != 0 || !vex.r)
13677 {
13678 BadOp ();
13679 return;
13680 }
13681
13682 oappend (names_mask [modrm.reg]);
13683 }
13684
13685 static void
13686 OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
13687 {
13688 if (modrm.mod == 3 && vex.b)
13689 switch (bytemode)
13690 {
13691 case evex_rounding_64_mode:
13692 if (address_mode != mode_64bit)
13693 {
13694 oappend ("(bad)");
13695 break;
13696 }
13697 /* Fall through. */
13698 case evex_rounding_mode:
13699 oappend (names_rounding[vex.ll]);
13700 break;
13701 case evex_sae_mode:
13702 oappend ("{sae}");
13703 break;
13704 default:
13705 abort ();
13706 break;
13707 }
13708 }