Add AMD SSE5 support
[deliverable/binutils-gdb.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2 Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
4
5 This file is part of the GNU opcodes library.
6
7 This library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 It is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
21
22
23 /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
24 July 1988
25 modified by John Hassey (hassey@dg-rtp.dg.com)
26 x86-64 support added by Jan Hubicka (jh@suse.cz)
27 VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
28
29 /* The main tables describing the instructions is essentially a copy
30 of the "Opcode Map" chapter (Appendix A) of the Intel 80386
31 Programmers Manual. Usually, there is a capital letter, followed
32 by a small letter. The capital letter tell the addressing mode,
33 and the small letter tells about the operand size. Refer to
34 the Intel manual for details. */
35
36 #include "sysdep.h"
37 #include "dis-asm.h"
38 #include "opintl.h"
39 #include "opcode/i386.h"
40 #include "libiberty.h"
41
42 #include <setjmp.h>
43
44 static int fetch_data (struct disassemble_info *, bfd_byte *);
45 static void ckprefix (void);
46 static const char *prefix_name (int, int);
47 static int print_insn (bfd_vma, disassemble_info *);
48 static void dofloat (int);
49 static void OP_ST (int, int);
50 static void OP_STi (int, int);
51 static int putop (const char *, int);
52 static void oappend (const char *);
53 static void append_seg (void);
54 static void OP_indirE (int, int);
55 static void print_operand_value (char *, int, bfd_vma);
56 static void OP_E_extended (int, int, int);
57 static void print_displacement (char *, bfd_vma);
58 static void OP_E (int, int);
59 static void OP_G (int, int);
60 static bfd_vma get64 (void);
61 static bfd_signed_vma get32 (void);
62 static bfd_signed_vma get32s (void);
63 static int get16 (void);
64 static void set_op (bfd_vma, int);
65 static void OP_Skip_MODRM (int, int);
66 static void OP_REG (int, int);
67 static void OP_IMREG (int, int);
68 static void OP_I (int, int);
69 static void OP_I64 (int, int);
70 static void OP_sI (int, int);
71 static void OP_J (int, int);
72 static void OP_SEG (int, int);
73 static void OP_DIR (int, int);
74 static void OP_OFF (int, int);
75 static void OP_OFF64 (int, int);
76 static void ptr_reg (int, int);
77 static void OP_ESreg (int, int);
78 static void OP_DSreg (int, int);
79 static void OP_C (int, int);
80 static void OP_D (int, int);
81 static void OP_T (int, int);
82 static void OP_R (int, int);
83 static void OP_MMX (int, int);
84 static void OP_XMM (int, int);
85 static void OP_EM (int, int);
86 static void OP_EX (int, int);
87 static void OP_EMC (int,int);
88 static void OP_MXC (int,int);
89 static void OP_MS (int, int);
90 static void OP_XS (int, int);
91 static void OP_M (int, int);
92 static void OP_0f07 (int, int);
93 static void OP_Monitor (int, int);
94 static void OP_Mwait (int, int);
95 static void NOP_Fixup1 (int, int);
96 static void NOP_Fixup2 (int, int);
97 static void OP_3DNowSuffix (int, int);
98 static void OP_SIMD_Suffix (int, int);
99 static void BadOp (void);
100 static void REP_Fixup (int, int);
101 static void CMPXCHG8B_Fixup (int, int);
102 static void XMM_Fixup (int, int);
103 static void CRC32_Fixup (int, int);
104 static void print_drex_arg (unsigned int, int, int);
105 static void OP_DREX4 (int, int);
106 static void OP_DREX3 (int, int);
107 static void OP_DREX_ICMP (int, int);
108 static void OP_DREX_FCMP (int, int);
109
110 struct dis_private {
111 /* Points to first byte not fetched. */
112 bfd_byte *max_fetched;
113 bfd_byte the_buffer[MAX_MNEM_SIZE];
114 bfd_vma insn_start;
115 int orig_sizeflag;
116 jmp_buf bailout;
117 };
118
119 enum address_mode
120 {
121 mode_16bit,
122 mode_32bit,
123 mode_64bit
124 };
125
126 enum address_mode address_mode;
127
128 /* Flags for the prefixes for the current instruction. See below. */
129 static int prefixes;
130
131 /* REX prefix the current instruction. See below. */
132 static int rex;
133 /* Bits of REX we've already used. */
134 static int rex_used;
135 /* Mark parts used in the REX prefix. When we are testing for
136 empty prefix (for 8bit register REX extension), just mask it
137 out. Otherwise test for REX bit is excuse for existence of REX
138 only in case value is nonzero. */
139 #define USED_REX(value) \
140 { \
141 if (value) \
142 { \
143 if ((rex & value)) \
144 rex_used |= (value) | REX_OPCODE; \
145 } \
146 else \
147 rex_used |= REX_OPCODE; \
148 }
149
150 /* Special 'registers' for DREX handling */
151 #define DREX_REG_UNKNOWN 1000 /* not initialized */
152 #define DREX_REG_MEMORY 1001 /* use MODRM/SIB/OFFSET memory */
153
154 /* The DREX byte has the following fields:
155 Bits 7-4 -- DREX.Dest, xmm destination register
156 Bit 3 -- DREX.OC0, operand config bit defines operand order
157 Bit 2 -- DREX.R, equivalent to REX_R bit, to extend ModRM register
158 Bit 1 -- DREX.X, equivalent to REX_X bit, to extend SIB index field
159 Bit 0 -- DREX.W, equivalent to REX_B bit, to extend ModRM r/m field,
160 SIB base field, or opcode reg field. */
161 #define DREX_XMM(drex) ((drex >> 4) & 0xf)
162 #define DREX_OC0(drex) ((drex >> 3) & 0x1)
163
164 /* Flags for prefixes which we somehow handled when printing the
165 current instruction. */
166 static int used_prefixes;
167
168 /* Flags stored in PREFIXES. */
169 #define PREFIX_REPZ 1
170 #define PREFIX_REPNZ 2
171 #define PREFIX_LOCK 4
172 #define PREFIX_CS 8
173 #define PREFIX_SS 0x10
174 #define PREFIX_DS 0x20
175 #define PREFIX_ES 0x40
176 #define PREFIX_FS 0x80
177 #define PREFIX_GS 0x100
178 #define PREFIX_DATA 0x200
179 #define PREFIX_ADDR 0x400
180 #define PREFIX_FWAIT 0x800
181
182 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
183 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
184 on error. */
185 #define FETCH_DATA(info, addr) \
186 ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
187 ? 1 : fetch_data ((info), (addr)))
188
189 static int
190 fetch_data (struct disassemble_info *info, bfd_byte *addr)
191 {
192 int status;
193 struct dis_private *priv = (struct dis_private *) info->private_data;
194 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
195
196 if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
197 status = (*info->read_memory_func) (start,
198 priv->max_fetched,
199 addr - priv->max_fetched,
200 info);
201 else
202 status = -1;
203 if (status != 0)
204 {
205 /* If we did manage to read at least one byte, then
206 print_insn_i386 will do something sensible. Otherwise, print
207 an error. We do that here because this is where we know
208 STATUS. */
209 if (priv->max_fetched == priv->the_buffer)
210 (*info->memory_error_func) (status, start, info);
211 longjmp (priv->bailout, 1);
212 }
213 else
214 priv->max_fetched = addr;
215 return 1;
216 }
217
218 #define XX { NULL, 0 }
219
220 #define Eb { OP_E, b_mode }
221 #define Ev { OP_E, v_mode }
222 #define Ed { OP_E, d_mode }
223 #define Edq { OP_E, dq_mode }
224 #define Edqw { OP_E, dqw_mode }
225 #define Edqb { OP_E, dqb_mode }
226 #define Edqd { OP_E, dqd_mode }
227 #define Eq { OP_E, q_mode }
228 #define indirEv { OP_indirE, stack_v_mode }
229 #define indirEp { OP_indirE, f_mode }
230 #define stackEv { OP_E, stack_v_mode }
231 #define Em { OP_E, m_mode }
232 #define Ew { OP_E, w_mode }
233 #define M { OP_M, 0 } /* lea, lgdt, etc. */
234 #define Ma { OP_M, v_mode }
235 #define Mb { OP_M, b_mode }
236 #define Md { OP_M, d_mode }
237 #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
238 #define Mq { OP_M, q_mode }
239 #define Gb { OP_G, b_mode }
240 #define Gv { OP_G, v_mode }
241 #define Gd { OP_G, d_mode }
242 #define Gdq { OP_G, dq_mode }
243 #define Gm { OP_G, m_mode }
244 #define Gw { OP_G, w_mode }
245 #define Rd { OP_R, d_mode }
246 #define Rm { OP_R, m_mode }
247 #define Ib { OP_I, b_mode }
248 #define sIb { OP_sI, b_mode } /* sign extened byte */
249 #define Iv { OP_I, v_mode }
250 #define Iq { OP_I, q_mode }
251 #define Iv64 { OP_I64, v_mode }
252 #define Iw { OP_I, w_mode }
253 #define I1 { OP_I, const_1_mode }
254 #define Jb { OP_J, b_mode }
255 #define Jv { OP_J, v_mode }
256 #define Cm { OP_C, m_mode }
257 #define Dm { OP_D, m_mode }
258 #define Td { OP_T, d_mode }
259 #define Skip_MODRM { OP_Skip_MODRM, 0 }
260
261 #define RMeAX { OP_REG, eAX_reg }
262 #define RMeBX { OP_REG, eBX_reg }
263 #define RMeCX { OP_REG, eCX_reg }
264 #define RMeDX { OP_REG, eDX_reg }
265 #define RMeSP { OP_REG, eSP_reg }
266 #define RMeBP { OP_REG, eBP_reg }
267 #define RMeSI { OP_REG, eSI_reg }
268 #define RMeDI { OP_REG, eDI_reg }
269 #define RMrAX { OP_REG, rAX_reg }
270 #define RMrBX { OP_REG, rBX_reg }
271 #define RMrCX { OP_REG, rCX_reg }
272 #define RMrDX { OP_REG, rDX_reg }
273 #define RMrSP { OP_REG, rSP_reg }
274 #define RMrBP { OP_REG, rBP_reg }
275 #define RMrSI { OP_REG, rSI_reg }
276 #define RMrDI { OP_REG, rDI_reg }
277 #define RMAL { OP_REG, al_reg }
278 #define RMAL { OP_REG, al_reg }
279 #define RMCL { OP_REG, cl_reg }
280 #define RMDL { OP_REG, dl_reg }
281 #define RMBL { OP_REG, bl_reg }
282 #define RMAH { OP_REG, ah_reg }
283 #define RMCH { OP_REG, ch_reg }
284 #define RMDH { OP_REG, dh_reg }
285 #define RMBH { OP_REG, bh_reg }
286 #define RMAX { OP_REG, ax_reg }
287 #define RMDX { OP_REG, dx_reg }
288
289 #define eAX { OP_IMREG, eAX_reg }
290 #define eBX { OP_IMREG, eBX_reg }
291 #define eCX { OP_IMREG, eCX_reg }
292 #define eDX { OP_IMREG, eDX_reg }
293 #define eSP { OP_IMREG, eSP_reg }
294 #define eBP { OP_IMREG, eBP_reg }
295 #define eSI { OP_IMREG, eSI_reg }
296 #define eDI { OP_IMREG, eDI_reg }
297 #define AL { OP_IMREG, al_reg }
298 #define CL { OP_IMREG, cl_reg }
299 #define DL { OP_IMREG, dl_reg }
300 #define BL { OP_IMREG, bl_reg }
301 #define AH { OP_IMREG, ah_reg }
302 #define CH { OP_IMREG, ch_reg }
303 #define DH { OP_IMREG, dh_reg }
304 #define BH { OP_IMREG, bh_reg }
305 #define AX { OP_IMREG, ax_reg }
306 #define DX { OP_IMREG, dx_reg }
307 #define zAX { OP_IMREG, z_mode_ax_reg }
308 #define indirDX { OP_IMREG, indir_dx_reg }
309
310 #define Sw { OP_SEG, w_mode }
311 #define Sv { OP_SEG, v_mode }
312 #define Ap { OP_DIR, 0 }
313 #define Ob { OP_OFF64, b_mode }
314 #define Ov { OP_OFF64, v_mode }
315 #define Xb { OP_DSreg, eSI_reg }
316 #define Xv { OP_DSreg, eSI_reg }
317 #define Xz { OP_DSreg, eSI_reg }
318 #define Yb { OP_ESreg, eDI_reg }
319 #define Yv { OP_ESreg, eDI_reg }
320 #define DSBX { OP_DSreg, eBX_reg }
321
322 #define es { OP_REG, es_reg }
323 #define ss { OP_REG, ss_reg }
324 #define cs { OP_REG, cs_reg }
325 #define ds { OP_REG, ds_reg }
326 #define fs { OP_REG, fs_reg }
327 #define gs { OP_REG, gs_reg }
328
329 #define MX { OP_MMX, 0 }
330 #define XM { OP_XMM, 0 }
331 #define EM { OP_EM, v_mode }
332 #define EMd { OP_EM, d_mode }
333 #define EMx { OP_EM, x_mode }
334 #define EXw { OP_EX, w_mode }
335 #define EXd { OP_EX, d_mode }
336 #define EXq { OP_EX, q_mode }
337 #define EXx { OP_EX, x_mode }
338 #define MS { OP_MS, v_mode }
339 #define XS { OP_XS, v_mode }
340 #define EMCq { OP_EMC, q_mode }
341 #define MXC { OP_MXC, 0 }
342 #define OPSUF { OP_3DNowSuffix, 0 }
343 #define OPSIMD { OP_SIMD_Suffix, 0 }
344 #define XMM0 { XMM_Fixup, 0 }
345
346 /* Used handle "rep" prefix for string instructions. */
347 #define Xbr { REP_Fixup, eSI_reg }
348 #define Xvr { REP_Fixup, eSI_reg }
349 #define Ybr { REP_Fixup, eDI_reg }
350 #define Yvr { REP_Fixup, eDI_reg }
351 #define Yzr { REP_Fixup, eDI_reg }
352 #define indirDXr { REP_Fixup, indir_dx_reg }
353 #define ALr { REP_Fixup, al_reg }
354 #define eAXr { REP_Fixup, eAX_reg }
355
356 #define cond_jump_flag { NULL, cond_jump_mode }
357 #define loop_jcxz_flag { NULL, loop_jcxz_mode }
358
359 /* bits in sizeflag */
360 #define SUFFIX_ALWAYS 4
361 #define AFLAG 2
362 #define DFLAG 1
363
364 #define b_mode 1 /* byte operand */
365 #define v_mode 2 /* operand size depends on prefixes */
366 #define w_mode 3 /* word operand */
367 #define d_mode 4 /* double word operand */
368 #define q_mode 5 /* quad word operand */
369 #define t_mode 6 /* ten-byte operand */
370 #define x_mode 7 /* 16-byte XMM operand */
371 #define m_mode 8 /* d_mode in 32bit, q_mode in 64bit mode. */
372 #define cond_jump_mode 9
373 #define loop_jcxz_mode 10
374 #define dq_mode 11 /* operand size depends on REX prefixes. */
375 #define dqw_mode 12 /* registers like dq_mode, memory like w_mode. */
376 #define f_mode 13 /* 4- or 6-byte pointer operand */
377 #define const_1_mode 14
378 #define stack_v_mode 15 /* v_mode for stack-related opcodes. */
379 #define z_mode 16 /* non-quad operand size depends on prefixes */
380 #define o_mode 17 /* 16-byte operand */
381 #define dqb_mode 18 /* registers like dq_mode, memory like b_mode. */
382 #define dqd_mode 19 /* registers like dq_mode, memory like d_mode. */
383
384 /* Flags that are OR'ed into the bytemode field to pass extra information. */
385 #define DREX_OC1 0x4000 /* OC1 bit set */
386 #define DREX_NO_OC0 0x2000 /* OC0 bit not used */
387 #define DREX_MASK 0x6000 /* mask to delete */
388
389 #define es_reg 100
390 #define cs_reg 101
391 #define ss_reg 102
392 #define ds_reg 103
393 #define fs_reg 104
394 #define gs_reg 105
395
396 #define eAX_reg 108
397 #define eCX_reg 109
398 #define eDX_reg 110
399 #define eBX_reg 111
400 #define eSP_reg 112
401 #define eBP_reg 113
402 #define eSI_reg 114
403 #define eDI_reg 115
404
405 #define al_reg 116
406 #define cl_reg 117
407 #define dl_reg 118
408 #define bl_reg 119
409 #define ah_reg 120
410 #define ch_reg 121
411 #define dh_reg 122
412 #define bh_reg 123
413
414 #define ax_reg 124
415 #define cx_reg 125
416 #define dx_reg 126
417 #define bx_reg 127
418 #define sp_reg 128
419 #define bp_reg 129
420 #define si_reg 130
421 #define di_reg 131
422
423 #define rAX_reg 132
424 #define rCX_reg 133
425 #define rDX_reg 134
426 #define rBX_reg 135
427 #define rSP_reg 136
428 #define rBP_reg 137
429 #define rSI_reg 138
430 #define rDI_reg 139
431
432 #define z_mode_ax_reg 149
433 #define indir_dx_reg 150
434
435 #define FLOATCODE 1
436 #define USE_GROUPS 2
437 #define USE_PREFIX_USER_TABLE 3
438 #define X86_64_SPECIAL 4
439 #define IS_3BYTE_OPCODE 5
440 #define USE_OPC_EXT_TABLE 6
441 #define USE_OPC_EXT_RM_TABLE 7
442
443 #define FLOAT NULL, { { NULL, FLOATCODE } }
444
445 #define GRP1a NULL, { { NULL, USE_GROUPS }, { NULL, 0 } }
446 #define GRP1b NULL, { { NULL, USE_GROUPS }, { NULL, 1 } }
447 #define GRP1S NULL, { { NULL, USE_GROUPS }, { NULL, 2 } }
448 #define GRP1Ss NULL, { { NULL, USE_GROUPS }, { NULL, 3 } }
449 #define GRP2b NULL, { { NULL, USE_GROUPS }, { NULL, 4 } }
450 #define GRP2S NULL, { { NULL, USE_GROUPS }, { NULL, 5 } }
451 #define GRP2b_one NULL, { { NULL, USE_GROUPS }, { NULL, 6 } }
452 #define GRP2S_one NULL, { { NULL, USE_GROUPS }, { NULL, 7 } }
453 #define GRP2b_cl NULL, { { NULL, USE_GROUPS }, { NULL, 8 } }
454 #define GRP2S_cl NULL, { { NULL, USE_GROUPS }, { NULL, 9 } }
455 #define GRP3b NULL, { { NULL, USE_GROUPS }, { NULL, 10 } }
456 #define GRP3S NULL, { { NULL, USE_GROUPS }, { NULL, 11 } }
457 #define GRP4 NULL, { { NULL, USE_GROUPS }, { NULL, 12 } }
458 #define GRP5 NULL, { { NULL, USE_GROUPS }, { NULL, 13 } }
459 #define GRP6 NULL, { { NULL, USE_GROUPS }, { NULL, 14 } }
460 #define GRP7 NULL, { { NULL, USE_GROUPS }, { NULL, 15 } }
461 #define GRP8 NULL, { { NULL, USE_GROUPS }, { NULL, 16 } }
462 #define GRP9 NULL, { { NULL, USE_GROUPS }, { NULL, 17 } }
463 #define GRP11_C6 NULL, { { NULL, USE_GROUPS }, { NULL, 18 } }
464 #define GRP11_C7 NULL, { { NULL, USE_GROUPS }, { NULL, 19 } }
465 #define GRP12 NULL, { { NULL, USE_GROUPS }, { NULL, 20 } }
466 #define GRP13 NULL, { { NULL, USE_GROUPS }, { NULL, 21 } }
467 #define GRP14 NULL, { { NULL, USE_GROUPS }, { NULL, 22 } }
468 #define GRP15 NULL, { { NULL, USE_GROUPS }, { NULL, 23 } }
469 #define GRP16 NULL, { { NULL, USE_GROUPS }, { NULL, 24 } }
470 #define GRPAMD NULL, { { NULL, USE_GROUPS }, { NULL, 25 } }
471 #define GRPPADLCK1 NULL, { { NULL, USE_GROUPS }, { NULL, 26 } }
472 #define GRPPADLCK2 NULL, { { NULL, USE_GROUPS }, { NULL, 27 } }
473
474 #define PREGRP0 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 0 } }
475 #define PREGRP1 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 1 } }
476 #define PREGRP2 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 2 } }
477 #define PREGRP3 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 3 } }
478 #define PREGRP4 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 4 } }
479 #define PREGRP5 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 5 } }
480 #define PREGRP6 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 6 } }
481 #define PREGRP7 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 7 } }
482 #define PREGRP8 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 8 } }
483 #define PREGRP9 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 9 } }
484 #define PREGRP10 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 10 } }
485 #define PREGRP11 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 11 } }
486 #define PREGRP12 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 12 } }
487 #define PREGRP13 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 13 } }
488 #define PREGRP14 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 14 } }
489 #define PREGRP15 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 15 } }
490 #define PREGRP16 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 16 } }
491 #define PREGRP17 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 17 } }
492 #define PREGRP18 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 18 } }
493 #define PREGRP19 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 19 } }
494 #define PREGRP20 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 20 } }
495 #define PREGRP21 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 21 } }
496 #define PREGRP22 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 22 } }
497 #define PREGRP23 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 23 } }
498 #define PREGRP24 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 24 } }
499 #define PREGRP25 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 25 } }
500 #define PREGRP26 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 26 } }
501 #define PREGRP27 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 27 } }
502 #define PREGRP28 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 28 } }
503 #define PREGRP29 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 29 } }
504 #define PREGRP30 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 30 } }
505 #define PREGRP31 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 31 } }
506 #define PREGRP32 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 32 } }
507 #define PREGRP33 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 33 } }
508 #define PREGRP34 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 34 } }
509 #define PREGRP35 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 35 } }
510 #define PREGRP36 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 36 } }
511 #define PREGRP37 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 37 } }
512 #define PREGRP38 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 38 } }
513 #define PREGRP39 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 39 } }
514 #define PREGRP40 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 40 } }
515 #define PREGRP41 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 41 } }
516 #define PREGRP42 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 42 } }
517 #define PREGRP43 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 43 } }
518 #define PREGRP44 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 44 } }
519 #define PREGRP45 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 45 } }
520 #define PREGRP46 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 46 } }
521 #define PREGRP47 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 47 } }
522 #define PREGRP48 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 48 } }
523 #define PREGRP49 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 49 } }
524 #define PREGRP50 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 50 } }
525 #define PREGRP51 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 51 } }
526 #define PREGRP52 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 52 } }
527 #define PREGRP53 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 53 } }
528 #define PREGRP54 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 54 } }
529 #define PREGRP55 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 55 } }
530 #define PREGRP56 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 56 } }
531 #define PREGRP57 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 57 } }
532 #define PREGRP58 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 58 } }
533 #define PREGRP59 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 59 } }
534 #define PREGRP60 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 60 } }
535 #define PREGRP61 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 61 } }
536 #define PREGRP62 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 62 } }
537 #define PREGRP63 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 63 } }
538 #define PREGRP64 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 64 } }
539 #define PREGRP65 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 65 } }
540 #define PREGRP66 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 66 } }
541 #define PREGRP67 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 67 } }
542 #define PREGRP68 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 68 } }
543 #define PREGRP69 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 69 } }
544 #define PREGRP70 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 70 } }
545 #define PREGRP71 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 71 } }
546 #define PREGRP72 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 72 } }
547 #define PREGRP73 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 73 } }
548 #define PREGRP74 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 74 } }
549 #define PREGRP75 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 75 } }
550 #define PREGRP76 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 76 } }
551 #define PREGRP77 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 77 } }
552 #define PREGRP78 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 78 } }
553 #define PREGRP79 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 79 } }
554 #define PREGRP80 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 80 } }
555 #define PREGRP81 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 81 } }
556 #define PREGRP82 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 82 } }
557 #define PREGRP83 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 83 } }
558 #define PREGRP84 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 84 } }
559 #define PREGRP85 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 85 } }
560 #define PREGRP86 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 86 } }
561 #define PREGRP87 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 87 } }
562 #define PREGRP88 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 88 } }
563 #define PREGRP89 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 89 } }
564 #define PREGRP90 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 90 } }
565 #define PREGRP91 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 91 } }
566 #define PREGRP92 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 92 } }
567 #define PREGRP93 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 93 } }
568 #define PREGRP94 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 94 } }
569 #define PREGRP95 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 95 } }
570 #define PREGRP96 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 96 } }
571 #define PREGRP97 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 97 } }
572 #define PREGRP98 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 98 } }
573 #define PREGRP99 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 99 } }
574 #define PREGRP100 NULL, { { NULL, USE_PREFIX_USER_TABLE }, { NULL, 100 } }
575
576
577 #define X86_64_0 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 0 } }
578 #define X86_64_1 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 1 } }
579 #define X86_64_2 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 2 } }
580 #define X86_64_3 NULL, { { NULL, X86_64_SPECIAL }, { NULL, 3 } }
581
582 #define THREE_BYTE_0 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 0 } }
583 #define THREE_BYTE_1 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 1 } }
584 #define THREE_BYTE_SSE5_0F24 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 2 } }
585 #define THREE_BYTE_SSE5_0F25 NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 3 } }
586 #define THREE_BYTE_SSE5_0F7A NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 4 } }
587 #define THREE_BYTE_SSE5_0F7B NULL, { { NULL, IS_3BYTE_OPCODE }, { NULL, 5 } }
588
589 #define OPC_EXT_0 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 0 } }
590 #define OPC_EXT_1 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 1 } }
591 #define OPC_EXT_2 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 2 } }
592 #define OPC_EXT_3 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 3 } }
593 #define OPC_EXT_4 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 4 } }
594 #define OPC_EXT_5 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 5 } }
595 #define OPC_EXT_6 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 6 } }
596 #define OPC_EXT_7 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 7 } }
597 #define OPC_EXT_8 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 8 } }
598 #define OPC_EXT_9 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 9 } }
599 #define OPC_EXT_10 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 10 } }
600 #define OPC_EXT_11 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 11 } }
601 #define OPC_EXT_12 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 12 } }
602 #define OPC_EXT_13 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 13 } }
603 #define OPC_EXT_14 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 14 } }
604 #define OPC_EXT_15 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 15 } }
605 #define OPC_EXT_16 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 16 } }
606 #define OPC_EXT_17 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 17 } }
607 #define OPC_EXT_18 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 18 } }
608 #define OPC_EXT_19 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 19 } }
609 #define OPC_EXT_20 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 20 } }
610 #define OPC_EXT_21 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 21 } }
611 #define OPC_EXT_22 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 22 } }
612 #define OPC_EXT_23 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 23 } }
613 #define OPC_EXT_24 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 24 } }
614 #define OPC_EXT_25 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 25 } }
615 #define OPC_EXT_26 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 26 } }
616 #define OPC_EXT_27 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 27 } }
617 #define OPC_EXT_28 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 28 } }
618 #define OPC_EXT_29 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 29 } }
619 #define OPC_EXT_30 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 30 } }
620 #define OPC_EXT_31 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 31 } }
621 #define OPC_EXT_32 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 32 } }
622 #define OPC_EXT_33 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 33 } }
623 #define OPC_EXT_34 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 34 } }
624 #define OPC_EXT_35 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 35 } }
625 #define OPC_EXT_36 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 36 } }
626 #define OPC_EXT_37 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 37 } }
627 #define OPC_EXT_38 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 38 } }
628 #define OPC_EXT_39 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 39 } }
629 #define OPC_EXT_40 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 40 } }
630 #define OPC_EXT_41 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 41 } }
631 #define OPC_EXT_42 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 42 } }
632 #define OPC_EXT_43 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 43 } }
633 #define OPC_EXT_44 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 44 } }
634 #define OPC_EXT_45 NULL, { { NULL, USE_OPC_EXT_TABLE }, { NULL, 45 } }
635
636 #define OPC_EXT_RM_0 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 0 } }
637 #define OPC_EXT_RM_1 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 1 } }
638 #define OPC_EXT_RM_2 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 2 } }
639 #define OPC_EXT_RM_3 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 3 } }
640 #define OPC_EXT_RM_4 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 4 } }
641 #define OPC_EXT_RM_5 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 5 } }
642 #define OPC_EXT_RM_6 NULL, { { NULL, USE_OPC_EXT_RM_TABLE }, { NULL, 6 } }
643
644 typedef void (*op_rtn) (int bytemode, int sizeflag);
645
646 struct dis386 {
647 const char *name;
648 struct
649 {
650 op_rtn rtn;
651 int bytemode;
652 } op[MAX_OPERANDS];
653 };
654
655 /* Upper case letters in the instruction names here are macros.
656 'A' => print 'b' if no register operands or suffix_always is true
657 'B' => print 'b' if suffix_always is true
658 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
659 . size prefix
660 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
661 . suffix_always is true
662 'E' => print 'e' if 32-bit form of jcxz
663 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
664 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
665 'H' => print ",pt" or ",pn" branch hint
666 'I' => honor following macro letter even in Intel mode (implemented only
667 . for some of the macro letters)
668 'J' => print 'l'
669 'K' => print 'd' or 'q' if rex prefix is present.
670 'L' => print 'l' if suffix_always is true
671 'N' => print 'n' if instruction has no wait "prefix"
672 'O' => print 'd' or 'o' (or 'q' in Intel mode)
673 'P' => print 'w', 'l' or 'q' if instruction has an operand size prefix,
674 . or suffix_always is true. print 'q' if rex prefix is present.
675 'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always
676 . is true
677 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
678 'S' => print 'w', 'l' or 'q' if suffix_always is true
679 'T' => print 'q' in 64bit mode and behave as 'P' otherwise
680 'U' => print 'q' in 64bit mode and behave as 'Q' otherwise
681 'V' => print 'q' in 64bit mode and behave as 'S' otherwise
682 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
683 'X' => print 's', 'd' depending on data16 prefix (for XMM)
684 'Y' => 'q' if instruction has an REX 64bit overwrite prefix
685 'Z' => print 'q' in 64bit mode and behave as 'L' otherwise
686
687 Many of the above letters print nothing in Intel mode. See "putop"
688 for the details.
689
690 Braces '{' and '}', and vertical bars '|', indicate alternative
691 mnemonic strings for AT&T, Intel, X86_64 AT&T, and X86_64 Intel
692 modes. In cases where there are only two alternatives, the X86_64
693 instruction is reserved, and "(bad)" is printed.
694 */
695
696 static const struct dis386 dis386[] = {
697 /* 00 */
698 { "addB", { Eb, Gb } },
699 { "addS", { Ev, Gv } },
700 { "addB", { Gb, Eb } },
701 { "addS", { Gv, Ev } },
702 { "addB", { AL, Ib } },
703 { "addS", { eAX, Iv } },
704 { "push{T|}", { es } },
705 { "pop{T|}", { es } },
706 /* 08 */
707 { "orB", { Eb, Gb } },
708 { "orS", { Ev, Gv } },
709 { "orB", { Gb, Eb } },
710 { "orS", { Gv, Ev } },
711 { "orB", { AL, Ib } },
712 { "orS", { eAX, Iv } },
713 { "push{T|}", { cs } },
714 { "(bad)", { XX } }, /* 0x0f extended opcode escape */
715 /* 10 */
716 { "adcB", { Eb, Gb } },
717 { "adcS", { Ev, Gv } },
718 { "adcB", { Gb, Eb } },
719 { "adcS", { Gv, Ev } },
720 { "adcB", { AL, Ib } },
721 { "adcS", { eAX, Iv } },
722 { "push{T|}", { ss } },
723 { "pop{T|}", { ss } },
724 /* 18 */
725 { "sbbB", { Eb, Gb } },
726 { "sbbS", { Ev, Gv } },
727 { "sbbB", { Gb, Eb } },
728 { "sbbS", { Gv, Ev } },
729 { "sbbB", { AL, Ib } },
730 { "sbbS", { eAX, Iv } },
731 { "push{T|}", { ds } },
732 { "pop{T|}", { ds } },
733 /* 20 */
734 { "andB", { Eb, Gb } },
735 { "andS", { Ev, Gv } },
736 { "andB", { Gb, Eb } },
737 { "andS", { Gv, Ev } },
738 { "andB", { AL, Ib } },
739 { "andS", { eAX, Iv } },
740 { "(bad)", { XX } }, /* SEG ES prefix */
741 { "daa{|}", { XX } },
742 /* 28 */
743 { "subB", { Eb, Gb } },
744 { "subS", { Ev, Gv } },
745 { "subB", { Gb, Eb } },
746 { "subS", { Gv, Ev } },
747 { "subB", { AL, Ib } },
748 { "subS", { eAX, Iv } },
749 { "(bad)", { XX } }, /* SEG CS prefix */
750 { "das{|}", { XX } },
751 /* 30 */
752 { "xorB", { Eb, Gb } },
753 { "xorS", { Ev, Gv } },
754 { "xorB", { Gb, Eb } },
755 { "xorS", { Gv, Ev } },
756 { "xorB", { AL, Ib } },
757 { "xorS", { eAX, Iv } },
758 { "(bad)", { XX } }, /* SEG SS prefix */
759 { "aaa{|}", { XX } },
760 /* 38 */
761 { "cmpB", { Eb, Gb } },
762 { "cmpS", { Ev, Gv } },
763 { "cmpB", { Gb, Eb } },
764 { "cmpS", { Gv, Ev } },
765 { "cmpB", { AL, Ib } },
766 { "cmpS", { eAX, Iv } },
767 { "(bad)", { XX } }, /* SEG DS prefix */
768 { "aas{|}", { XX } },
769 /* 40 */
770 { "inc{S|}", { RMeAX } },
771 { "inc{S|}", { RMeCX } },
772 { "inc{S|}", { RMeDX } },
773 { "inc{S|}", { RMeBX } },
774 { "inc{S|}", { RMeSP } },
775 { "inc{S|}", { RMeBP } },
776 { "inc{S|}", { RMeSI } },
777 { "inc{S|}", { RMeDI } },
778 /* 48 */
779 { "dec{S|}", { RMeAX } },
780 { "dec{S|}", { RMeCX } },
781 { "dec{S|}", { RMeDX } },
782 { "dec{S|}", { RMeBX } },
783 { "dec{S|}", { RMeSP } },
784 { "dec{S|}", { RMeBP } },
785 { "dec{S|}", { RMeSI } },
786 { "dec{S|}", { RMeDI } },
787 /* 50 */
788 { "pushV", { RMrAX } },
789 { "pushV", { RMrCX } },
790 { "pushV", { RMrDX } },
791 { "pushV", { RMrBX } },
792 { "pushV", { RMrSP } },
793 { "pushV", { RMrBP } },
794 { "pushV", { RMrSI } },
795 { "pushV", { RMrDI } },
796 /* 58 */
797 { "popV", { RMrAX } },
798 { "popV", { RMrCX } },
799 { "popV", { RMrDX } },
800 { "popV", { RMrBX } },
801 { "popV", { RMrSP } },
802 { "popV", { RMrBP } },
803 { "popV", { RMrSI } },
804 { "popV", { RMrDI } },
805 /* 60 */
806 { X86_64_0 },
807 { X86_64_1 },
808 { X86_64_2 },
809 { X86_64_3 },
810 { "(bad)", { XX } }, /* seg fs */
811 { "(bad)", { XX } }, /* seg gs */
812 { "(bad)", { XX } }, /* op size prefix */
813 { "(bad)", { XX } }, /* adr size prefix */
814 /* 68 */
815 { "pushT", { Iq } },
816 { "imulS", { Gv, Ev, Iv } },
817 { "pushT", { sIb } },
818 { "imulS", { Gv, Ev, sIb } },
819 { "ins{b||b|}", { Ybr, indirDX } },
820 { "ins{R||G|}", { Yzr, indirDX } },
821 { "outs{b||b|}", { indirDXr, Xb } },
822 { "outs{R||G|}", { indirDXr, Xz } },
823 /* 70 */
824 { "joH", { Jb, XX, cond_jump_flag } },
825 { "jnoH", { Jb, XX, cond_jump_flag } },
826 { "jbH", { Jb, XX, cond_jump_flag } },
827 { "jaeH", { Jb, XX, cond_jump_flag } },
828 { "jeH", { Jb, XX, cond_jump_flag } },
829 { "jneH", { Jb, XX, cond_jump_flag } },
830 { "jbeH", { Jb, XX, cond_jump_flag } },
831 { "jaH", { Jb, XX, cond_jump_flag } },
832 /* 78 */
833 { "jsH", { Jb, XX, cond_jump_flag } },
834 { "jnsH", { Jb, XX, cond_jump_flag } },
835 { "jpH", { Jb, XX, cond_jump_flag } },
836 { "jnpH", { Jb, XX, cond_jump_flag } },
837 { "jlH", { Jb, XX, cond_jump_flag } },
838 { "jgeH", { Jb, XX, cond_jump_flag } },
839 { "jleH", { Jb, XX, cond_jump_flag } },
840 { "jgH", { Jb, XX, cond_jump_flag } },
841 /* 80 */
842 { GRP1b },
843 { GRP1S },
844 { "(bad)", { XX } },
845 { GRP1Ss },
846 { "testB", { Eb, Gb } },
847 { "testS", { Ev, Gv } },
848 { "xchgB", { Eb, Gb } },
849 { "xchgS", { Ev, Gv } },
850 /* 88 */
851 { "movB", { Eb, Gb } },
852 { "movS", { Ev, Gv } },
853 { "movB", { Gb, Eb } },
854 { "movS", { Gv, Ev } },
855 { "movD", { Sv, Sw } },
856 { OPC_EXT_0 },
857 { "movD", { Sw, Sv } },
858 { GRP1a },
859 /* 90 */
860 { PREGRP38 },
861 { "xchgS", { RMeCX, eAX } },
862 { "xchgS", { RMeDX, eAX } },
863 { "xchgS", { RMeBX, eAX } },
864 { "xchgS", { RMeSP, eAX } },
865 { "xchgS", { RMeBP, eAX } },
866 { "xchgS", { RMeSI, eAX } },
867 { "xchgS", { RMeDI, eAX } },
868 /* 98 */
869 { "cW{t||t|}R", { XX } },
870 { "cR{t||t|}O", { XX } },
871 { "Jcall{T|}", { Ap } },
872 { "(bad)", { XX } }, /* fwait */
873 { "pushfT", { XX } },
874 { "popfT", { XX } },
875 { "sahf{|}", { XX } },
876 { "lahf{|}", { XX } },
877 /* a0 */
878 { "movB", { AL, Ob } },
879 { "movS", { eAX, Ov } },
880 { "movB", { Ob, AL } },
881 { "movS", { Ov, eAX } },
882 { "movs{b||b|}", { Ybr, Xb } },
883 { "movs{R||R|}", { Yvr, Xv } },
884 { "cmps{b||b|}", { Xb, Yb } },
885 { "cmps{R||R|}", { Xv, Yv } },
886 /* a8 */
887 { "testB", { AL, Ib } },
888 { "testS", { eAX, Iv } },
889 { "stosB", { Ybr, AL } },
890 { "stosS", { Yvr, eAX } },
891 { "lodsB", { ALr, Xb } },
892 { "lodsS", { eAXr, Xv } },
893 { "scasB", { AL, Yb } },
894 { "scasS", { eAX, Yv } },
895 /* b0 */
896 { "movB", { RMAL, Ib } },
897 { "movB", { RMCL, Ib } },
898 { "movB", { RMDL, Ib } },
899 { "movB", { RMBL, Ib } },
900 { "movB", { RMAH, Ib } },
901 { "movB", { RMCH, Ib } },
902 { "movB", { RMDH, Ib } },
903 { "movB", { RMBH, Ib } },
904 /* b8 */
905 { "movS", { RMeAX, Iv64 } },
906 { "movS", { RMeCX, Iv64 } },
907 { "movS", { RMeDX, Iv64 } },
908 { "movS", { RMeBX, Iv64 } },
909 { "movS", { RMeSP, Iv64 } },
910 { "movS", { RMeBP, Iv64 } },
911 { "movS", { RMeSI, Iv64 } },
912 { "movS", { RMeDI, Iv64 } },
913 /* c0 */
914 { GRP2b },
915 { GRP2S },
916 { "retT", { Iw } },
917 { "retT", { XX } },
918 { OPC_EXT_1 },
919 { OPC_EXT_2 },
920 { GRP11_C6 },
921 { GRP11_C7 },
922 /* c8 */
923 { "enterT", { Iw, Ib } },
924 { "leaveT", { XX } },
925 { "lretP", { Iw } },
926 { "lretP", { XX } },
927 { "int3", { XX } },
928 { "int", { Ib } },
929 { "into{|}", { XX } },
930 { "iretP", { XX } },
931 /* d0 */
932 { GRP2b_one },
933 { GRP2S_one },
934 { GRP2b_cl },
935 { GRP2S_cl },
936 { "aam{|}", { sIb } },
937 { "aad{|}", { sIb } },
938 { "(bad)", { XX } },
939 { "xlat", { DSBX } },
940 /* d8 */
941 { FLOAT },
942 { FLOAT },
943 { FLOAT },
944 { FLOAT },
945 { FLOAT },
946 { FLOAT },
947 { FLOAT },
948 { FLOAT },
949 /* e0 */
950 { "loopneFH", { Jb, XX, loop_jcxz_flag } },
951 { "loopeFH", { Jb, XX, loop_jcxz_flag } },
952 { "loopFH", { Jb, XX, loop_jcxz_flag } },
953 { "jEcxzH", { Jb, XX, loop_jcxz_flag } },
954 { "inB", { AL, Ib } },
955 { "inG", { zAX, Ib } },
956 { "outB", { Ib, AL } },
957 { "outG", { Ib, zAX } },
958 /* e8 */
959 { "callT", { Jv } },
960 { "jmpT", { Jv } },
961 { "Jjmp{T|}", { Ap } },
962 { "jmp", { Jb } },
963 { "inB", { AL, indirDX } },
964 { "inG", { zAX, indirDX } },
965 { "outB", { indirDX, AL } },
966 { "outG", { indirDX, zAX } },
967 /* f0 */
968 { "(bad)", { XX } }, /* lock prefix */
969 { "icebp", { XX } },
970 { "(bad)", { XX } }, /* repne */
971 { "(bad)", { XX } }, /* repz */
972 { "hlt", { XX } },
973 { "cmc", { XX } },
974 { GRP3b },
975 { GRP3S },
976 /* f8 */
977 { "clc", { XX } },
978 { "stc", { XX } },
979 { "cli", { XX } },
980 { "sti", { XX } },
981 { "cld", { XX } },
982 { "std", { XX } },
983 { GRP4 },
984 { GRP5 },
985 };
986
987 static const struct dis386 dis386_twobyte[] = {
988 /* 00 */
989 { GRP6 },
990 { GRP7 },
991 { "larS", { Gv, Ew } },
992 { "lslS", { Gv, Ew } },
993 { "(bad)", { XX } },
994 { "syscall", { XX } },
995 { "clts", { XX } },
996 { "sysretP", { XX } },
997 /* 08 */
998 { "invd", { XX } },
999 { "wbinvd", { XX } },
1000 { "(bad)", { XX } },
1001 { "ud2a", { XX } },
1002 { "(bad)", { XX } },
1003 { GRPAMD },
1004 { "femms", { XX } },
1005 { "", { MX, EM, OPSUF } }, /* See OP_3DNowSuffix. */
1006 /* 10 */
1007 { PREGRP8 },
1008 { PREGRP9 },
1009 { PREGRP30 },
1010 { OPC_EXT_34 },
1011 { "unpcklpX", { XM, EXq } },
1012 { "unpckhpX", { XM, EXq } },
1013 { PREGRP31 },
1014 { OPC_EXT_35 },
1015 /* 18 */
1016 { GRP16 },
1017 { "(bad)", { XX } },
1018 { "(bad)", { XX } },
1019 { "(bad)", { XX } },
1020 { "(bad)", { XX } },
1021 { "(bad)", { XX } },
1022 { "(bad)", { XX } },
1023 { "nopQ", { Ev } },
1024 /* 20 */
1025 { OPC_EXT_40 },
1026 { OPC_EXT_41 },
1027 { OPC_EXT_42 },
1028 { OPC_EXT_43 },
1029 { OPC_EXT_44 },
1030 { THREE_BYTE_SSE5_0F25 },
1031 { OPC_EXT_45 },
1032 { "(bad)", { XX } },
1033 /* 28 */
1034 { "movapX", { XM, EXx } },
1035 { "movapX", { EXx, XM } },
1036 { PREGRP2 },
1037 { PREGRP33 },
1038 { PREGRP4 },
1039 { PREGRP3 },
1040 { PREGRP93 },
1041 { PREGRP94 },
1042 /* 30 */
1043 { "wrmsr", { XX } },
1044 { "rdtsc", { XX } },
1045 { "rdmsr", { XX } },
1046 { "rdpmc", { XX } },
1047 { "sysenter", { XX } },
1048 { "sysexit", { XX } },
1049 { "(bad)", { XX } },
1050 { "(bad)", { XX } },
1051 /* 38 */
1052 { THREE_BYTE_0 },
1053 { "(bad)", { XX } },
1054 { THREE_BYTE_1 },
1055 { "(bad)", { XX } },
1056 { "(bad)", { XX } },
1057 { "(bad)", { XX } },
1058 { "(bad)", { XX } },
1059 { "(bad)", { XX } },
1060 /* 40 */
1061 { "cmovo", { Gv, Ev } },
1062 { "cmovno", { Gv, Ev } },
1063 { "cmovb", { Gv, Ev } },
1064 { "cmovae", { Gv, Ev } },
1065 { "cmove", { Gv, Ev } },
1066 { "cmovne", { Gv, Ev } },
1067 { "cmovbe", { Gv, Ev } },
1068 { "cmova", { Gv, Ev } },
1069 /* 48 */
1070 { "cmovs", { Gv, Ev } },
1071 { "cmovns", { Gv, Ev } },
1072 { "cmovp", { Gv, Ev } },
1073 { "cmovnp", { Gv, Ev } },
1074 { "cmovl", { Gv, Ev } },
1075 { "cmovge", { Gv, Ev } },
1076 { "cmovle", { Gv, Ev } },
1077 { "cmovg", { Gv, Ev } },
1078 /* 50 */
1079 { "movmskpX", { Gdq, XS } },
1080 { PREGRP13 },
1081 { PREGRP12 },
1082 { PREGRP11 },
1083 { "andpX", { XM, EXx } },
1084 { "andnpX", { XM, EXx } },
1085 { "orpX", { XM, EXx } },
1086 { "xorpX", { XM, EXx } },
1087 /* 58 */
1088 { PREGRP0 },
1089 { PREGRP10 },
1090 { PREGRP17 },
1091 { PREGRP16 },
1092 { PREGRP14 },
1093 { PREGRP7 },
1094 { PREGRP5 },
1095 { PREGRP6 },
1096 /* 60 */
1097 { PREGRP95 },
1098 { PREGRP96 },
1099 { PREGRP97 },
1100 { "packsswb", { MX, EM } },
1101 { "pcmpgtb", { MX, EM } },
1102 { "pcmpgtw", { MX, EM } },
1103 { "pcmpgtd", { MX, EM } },
1104 { "packuswb", { MX, EM } },
1105 /* 68 */
1106 { "punpckhbw", { MX, EM } },
1107 { "punpckhwd", { MX, EM } },
1108 { "punpckhdq", { MX, EM } },
1109 { "packssdw", { MX, EM } },
1110 { PREGRP26 },
1111 { PREGRP24 },
1112 { "movK", { MX, Edq } },
1113 { PREGRP19 },
1114 /* 70 */
1115 { PREGRP22 },
1116 { GRP12 },
1117 { GRP13 },
1118 { GRP14 },
1119 { "pcmpeqb", { MX, EM } },
1120 { "pcmpeqw", { MX, EM } },
1121 { "pcmpeqd", { MX, EM } },
1122 { "emms", { XX } },
1123 /* 78 */
1124 { PREGRP34 },
1125 { PREGRP35 },
1126 { THREE_BYTE_SSE5_0F7A },
1127 { THREE_BYTE_SSE5_0F7B },
1128 { PREGRP28 },
1129 { PREGRP29 },
1130 { PREGRP23 },
1131 { PREGRP20 },
1132 /* 80 */
1133 { "joH", { Jv, XX, cond_jump_flag } },
1134 { "jnoH", { Jv, XX, cond_jump_flag } },
1135 { "jbH", { Jv, XX, cond_jump_flag } },
1136 { "jaeH", { Jv, XX, cond_jump_flag } },
1137 { "jeH", { Jv, XX, cond_jump_flag } },
1138 { "jneH", { Jv, XX, cond_jump_flag } },
1139 { "jbeH", { Jv, XX, cond_jump_flag } },
1140 { "jaH", { Jv, XX, cond_jump_flag } },
1141 /* 88 */
1142 { "jsH", { Jv, XX, cond_jump_flag } },
1143 { "jnsH", { Jv, XX, cond_jump_flag } },
1144 { "jpH", { Jv, XX, cond_jump_flag } },
1145 { "jnpH", { Jv, XX, cond_jump_flag } },
1146 { "jlH", { Jv, XX, cond_jump_flag } },
1147 { "jgeH", { Jv, XX, cond_jump_flag } },
1148 { "jleH", { Jv, XX, cond_jump_flag } },
1149 { "jgH", { Jv, XX, cond_jump_flag } },
1150 /* 90 */
1151 { "seto", { Eb } },
1152 { "setno", { Eb } },
1153 { "setb", { Eb } },
1154 { "setae", { Eb } },
1155 { "sete", { Eb } },
1156 { "setne", { Eb } },
1157 { "setbe", { Eb } },
1158 { "seta", { Eb } },
1159 /* 98 */
1160 { "sets", { Eb } },
1161 { "setns", { Eb } },
1162 { "setp", { Eb } },
1163 { "setnp", { Eb } },
1164 { "setl", { Eb } },
1165 { "setge", { Eb } },
1166 { "setle", { Eb } },
1167 { "setg", { Eb } },
1168 /* a0 */
1169 { "pushT", { fs } },
1170 { "popT", { fs } },
1171 { "cpuid", { XX } },
1172 { "btS", { Ev, Gv } },
1173 { "shldS", { Ev, Gv, Ib } },
1174 { "shldS", { Ev, Gv, CL } },
1175 { GRPPADLCK2 },
1176 { GRPPADLCK1 },
1177 /* a8 */
1178 { "pushT", { gs } },
1179 { "popT", { gs } },
1180 { "rsm", { XX } },
1181 { "btsS", { Ev, Gv } },
1182 { "shrdS", { Ev, Gv, Ib } },
1183 { "shrdS", { Ev, Gv, CL } },
1184 { GRP15 },
1185 { "imulS", { Gv, Ev } },
1186 /* b0 */
1187 { "cmpxchgB", { Eb, Gb } },
1188 { "cmpxchgS", { Ev, Gv } },
1189 { OPC_EXT_3 },
1190 { "btrS", { Ev, Gv } },
1191 { OPC_EXT_4 },
1192 { OPC_EXT_5 },
1193 { "movz{bR|x|bR|x}", { Gv, Eb } },
1194 { "movz{wR|x|wR|x}", { Gv, Ew } }, /* yes, there really is movzww ! */
1195 /* b8 */
1196 { PREGRP37 },
1197 { "ud2b", { XX } },
1198 { GRP8 },
1199 { "btcS", { Ev, Gv } },
1200 { "bsfS", { Gv, Ev } },
1201 { PREGRP36 },
1202 { "movs{bR|x|bR|x}", { Gv, Eb } },
1203 { "movs{wR|x|wR|x}", { Gv, Ew } }, /* yes, there really is movsww ! */
1204 /* c0 */
1205 { "xaddB", { Eb, Gb } },
1206 { "xaddS", { Ev, Gv } },
1207 { PREGRP1 },
1208 { "movntiS", { Ev, Gv } },
1209 { "pinsrw", { MX, Edqw, Ib } },
1210 { "pextrw", { Gdq, MS, Ib } },
1211 { "shufpX", { XM, EXx, Ib } },
1212 { GRP9 },
1213 /* c8 */
1214 { "bswap", { RMeAX } },
1215 { "bswap", { RMeCX } },
1216 { "bswap", { RMeDX } },
1217 { "bswap", { RMeBX } },
1218 { "bswap", { RMeSP } },
1219 { "bswap", { RMeBP } },
1220 { "bswap", { RMeSI } },
1221 { "bswap", { RMeDI } },
1222 /* d0 */
1223 { PREGRP27 },
1224 { "psrlw", { MX, EM } },
1225 { "psrld", { MX, EM } },
1226 { "psrlq", { MX, EM } },
1227 { "paddq", { MX, EM } },
1228 { "pmullw", { MX, EM } },
1229 { PREGRP21 },
1230 { "pmovmskb", { Gdq, MS } },
1231 /* d8 */
1232 { "psubusb", { MX, EM } },
1233 { "psubusw", { MX, EM } },
1234 { "pminub", { MX, EM } },
1235 { "pand", { MX, EM } },
1236 { "paddusb", { MX, EM } },
1237 { "paddusw", { MX, EM } },
1238 { "pmaxub", { MX, EM } },
1239 { "pandn", { MX, EM } },
1240 /* e0 */
1241 { "pavgb", { MX, EM } },
1242 { "psraw", { MX, EM } },
1243 { "psrad", { MX, EM } },
1244 { "pavgw", { MX, EM } },
1245 { "pmulhuw", { MX, EM } },
1246 { "pmulhw", { MX, EM } },
1247 { PREGRP15 },
1248 { PREGRP25 },
1249 /* e8 */
1250 { "psubsb", { MX, EM } },
1251 { "psubsw", { MX, EM } },
1252 { "pminsw", { MX, EM } },
1253 { "por", { MX, EM } },
1254 { "paddsb", { MX, EM } },
1255 { "paddsw", { MX, EM } },
1256 { "pmaxsw", { MX, EM } },
1257 { "pxor", { MX, EM } },
1258 /* f0 */
1259 { PREGRP32 },
1260 { "psllw", { MX, EM } },
1261 { "pslld", { MX, EM } },
1262 { "psllq", { MX, EM } },
1263 { "pmuludq", { MX, EM } },
1264 { "pmaddwd", { MX, EM } },
1265 { "psadbw", { MX, EM } },
1266 { PREGRP18 },
1267 /* f8 */
1268 { "psubb", { MX, EM } },
1269 { "psubw", { MX, EM } },
1270 { "psubd", { MX, EM } },
1271 { "psubq", { MX, EM } },
1272 { "paddb", { MX, EM } },
1273 { "paddw", { MX, EM } },
1274 { "paddd", { MX, EM } },
1275 { "(bad)", { XX } },
1276 };
1277
1278 static const unsigned char onebyte_has_modrm[256] = {
1279 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1280 /* ------------------------------- */
1281 /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1282 /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1283 /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1284 /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1285 /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1286 /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1287 /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1288 /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1289 /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1290 /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1291 /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1292 /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1293 /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1294 /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1295 /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1296 /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
1297 /* ------------------------------- */
1298 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1299 };
1300
1301 static const unsigned char twobyte_has_modrm[256] = {
1302 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1303 /* ------------------------------- */
1304 /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1305 /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1, /* 1f */
1306 /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
1307 /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
1308 /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1309 /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
1310 /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
1311 /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
1312 /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1313 /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1314 /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1315 /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
1316 /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1317 /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
1318 /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
1319 /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* ff */
1320 /* ------------------------------- */
1321 /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
1322 };
1323
1324 static char obuf[100];
1325 static char *obufp;
1326 static char scratchbuf[100];
1327 static unsigned char *start_codep;
1328 static unsigned char *insn_codep;
1329 static unsigned char *codep;
1330 static const char *lock_prefix;
1331 static const char *data_prefix;
1332 static const char *addr_prefix;
1333 static const char *repz_prefix;
1334 static const char *repnz_prefix;
1335 static disassemble_info *the_info;
1336 static struct
1337 {
1338 int mod;
1339 int reg;
1340 int rm;
1341 }
1342 modrm;
1343 static unsigned char need_modrm;
1344
1345 /* If we are accessing mod/rm/reg without need_modrm set, then the
1346 values are stale. Hitting this abort likely indicates that you
1347 need to update onebyte_has_modrm or twobyte_has_modrm. */
1348 #define MODRM_CHECK if (!need_modrm) abort ()
1349
1350 static const char **names64;
1351 static const char **names32;
1352 static const char **names16;
1353 static const char **names8;
1354 static const char **names8rex;
1355 static const char **names_seg;
1356 static const char **index16;
1357
1358 static const char *intel_names64[] = {
1359 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
1360 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
1361 };
1362 static const char *intel_names32[] = {
1363 "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
1364 "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
1365 };
1366 static const char *intel_names16[] = {
1367 "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
1368 "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
1369 };
1370 static const char *intel_names8[] = {
1371 "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
1372 };
1373 static const char *intel_names8rex[] = {
1374 "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
1375 "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
1376 };
1377 static const char *intel_names_seg[] = {
1378 "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
1379 };
1380 static const char *intel_index16[] = {
1381 "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
1382 };
1383
1384 static const char *att_names64[] = {
1385 "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
1386 "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
1387 };
1388 static const char *att_names32[] = {
1389 "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
1390 "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
1391 };
1392 static const char *att_names16[] = {
1393 "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
1394 "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
1395 };
1396 static const char *att_names8[] = {
1397 "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
1398 };
1399 static const char *att_names8rex[] = {
1400 "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
1401 "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
1402 };
1403 static const char *att_names_seg[] = {
1404 "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
1405 };
1406 static const char *att_index16[] = {
1407 "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
1408 };
1409
1410 static const struct dis386 grps[][8] = {
1411 /* GRP1a */
1412 {
1413 { "popU", { stackEv } },
1414 { "(bad)", { XX } },
1415 { "(bad)", { XX } },
1416 { "(bad)", { XX } },
1417 { "(bad)", { XX } },
1418 { "(bad)", { XX } },
1419 { "(bad)", { XX } },
1420 { "(bad)", { XX } },
1421 },
1422 /* GRP1b */
1423 {
1424 { "addA", { Eb, Ib } },
1425 { "orA", { Eb, Ib } },
1426 { "adcA", { Eb, Ib } },
1427 { "sbbA", { Eb, Ib } },
1428 { "andA", { Eb, Ib } },
1429 { "subA", { Eb, Ib } },
1430 { "xorA", { Eb, Ib } },
1431 { "cmpA", { Eb, Ib } },
1432 },
1433 /* GRP1S */
1434 {
1435 { "addQ", { Ev, Iv } },
1436 { "orQ", { Ev, Iv } },
1437 { "adcQ", { Ev, Iv } },
1438 { "sbbQ", { Ev, Iv } },
1439 { "andQ", { Ev, Iv } },
1440 { "subQ", { Ev, Iv } },
1441 { "xorQ", { Ev, Iv } },
1442 { "cmpQ", { Ev, Iv } },
1443 },
1444 /* GRP1Ss */
1445 {
1446 { "addQ", { Ev, sIb } },
1447 { "orQ", { Ev, sIb } },
1448 { "adcQ", { Ev, sIb } },
1449 { "sbbQ", { Ev, sIb } },
1450 { "andQ", { Ev, sIb } },
1451 { "subQ", { Ev, sIb } },
1452 { "xorQ", { Ev, sIb } },
1453 { "cmpQ", { Ev, sIb } },
1454 },
1455 /* GRP2b */
1456 {
1457 { "rolA", { Eb, Ib } },
1458 { "rorA", { Eb, Ib } },
1459 { "rclA", { Eb, Ib } },
1460 { "rcrA", { Eb, Ib } },
1461 { "shlA", { Eb, Ib } },
1462 { "shrA", { Eb, Ib } },
1463 { "(bad)", { XX } },
1464 { "sarA", { Eb, Ib } },
1465 },
1466 /* GRP2S */
1467 {
1468 { "rolQ", { Ev, Ib } },
1469 { "rorQ", { Ev, Ib } },
1470 { "rclQ", { Ev, Ib } },
1471 { "rcrQ", { Ev, Ib } },
1472 { "shlQ", { Ev, Ib } },
1473 { "shrQ", { Ev, Ib } },
1474 { "(bad)", { XX } },
1475 { "sarQ", { Ev, Ib } },
1476 },
1477 /* GRP2b_one */
1478 {
1479 { "rolA", { Eb, I1 } },
1480 { "rorA", { Eb, I1 } },
1481 { "rclA", { Eb, I1 } },
1482 { "rcrA", { Eb, I1 } },
1483 { "shlA", { Eb, I1 } },
1484 { "shrA", { Eb, I1 } },
1485 { "(bad)", { XX } },
1486 { "sarA", { Eb, I1 } },
1487 },
1488 /* GRP2S_one */
1489 {
1490 { "rolQ", { Ev, I1 } },
1491 { "rorQ", { Ev, I1 } },
1492 { "rclQ", { Ev, I1 } },
1493 { "rcrQ", { Ev, I1 } },
1494 { "shlQ", { Ev, I1 } },
1495 { "shrQ", { Ev, I1 } },
1496 { "(bad)", { XX } },
1497 { "sarQ", { Ev, I1 } },
1498 },
1499 /* GRP2b_cl */
1500 {
1501 { "rolA", { Eb, CL } },
1502 { "rorA", { Eb, CL } },
1503 { "rclA", { Eb, CL } },
1504 { "rcrA", { Eb, CL } },
1505 { "shlA", { Eb, CL } },
1506 { "shrA", { Eb, CL } },
1507 { "(bad)", { XX } },
1508 { "sarA", { Eb, CL } },
1509 },
1510 /* GRP2S_cl */
1511 {
1512 { "rolQ", { Ev, CL } },
1513 { "rorQ", { Ev, CL } },
1514 { "rclQ", { Ev, CL } },
1515 { "rcrQ", { Ev, CL } },
1516 { "shlQ", { Ev, CL } },
1517 { "shrQ", { Ev, CL } },
1518 { "(bad)", { XX } },
1519 { "sarQ", { Ev, CL } },
1520 },
1521 /* GRP3b */
1522 {
1523 { "testA", { Eb, Ib } },
1524 { "(bad)", { Eb } },
1525 { "notA", { Eb } },
1526 { "negA", { Eb } },
1527 { "mulA", { Eb } }, /* Don't print the implicit %al register, */
1528 { "imulA", { Eb } }, /* to distinguish these opcodes from other */
1529 { "divA", { Eb } }, /* mul/imul opcodes. Do the same for div */
1530 { "idivA", { Eb } }, /* and idiv for consistency. */
1531 },
1532 /* GRP3S */
1533 {
1534 { "testQ", { Ev, Iv } },
1535 { "(bad)", { XX } },
1536 { "notQ", { Ev } },
1537 { "negQ", { Ev } },
1538 { "mulQ", { Ev } }, /* Don't print the implicit register. */
1539 { "imulQ", { Ev } },
1540 { "divQ", { Ev } },
1541 { "idivQ", { Ev } },
1542 },
1543 /* GRP4 */
1544 {
1545 { "incA", { Eb } },
1546 { "decA", { Eb } },
1547 { "(bad)", { XX } },
1548 { "(bad)", { XX } },
1549 { "(bad)", { XX } },
1550 { "(bad)", { XX } },
1551 { "(bad)", { XX } },
1552 { "(bad)", { XX } },
1553 },
1554 /* GRP5 */
1555 {
1556 { "incQ", { Ev } },
1557 { "decQ", { Ev } },
1558 { "callT", { indirEv } },
1559 { "JcallT", { indirEp } },
1560 { "jmpT", { indirEv } },
1561 { "JjmpT", { indirEp } },
1562 { "pushU", { stackEv } },
1563 { "(bad)", { XX } },
1564 },
1565 /* GRP6 */
1566 {
1567 { "sldtD", { Sv } },
1568 { "strD", { Sv } },
1569 { "lldt", { Ew } },
1570 { "ltr", { Ew } },
1571 { "verr", { Ew } },
1572 { "verw", { Ew } },
1573 { "(bad)", { XX } },
1574 { "(bad)", { XX } },
1575 },
1576 /* GRP7 */
1577 {
1578 { OPC_EXT_6 },
1579 { OPC_EXT_7 },
1580 { OPC_EXT_8 },
1581 { OPC_EXT_39 },
1582 { "smswD", { Sv } },
1583 { "(bad)", { XX } },
1584 { "lmsw", { Ew } },
1585 { OPC_EXT_38 },
1586 },
1587 /* GRP8 */
1588 {
1589 { "(bad)", { XX } },
1590 { "(bad)", { XX } },
1591 { "(bad)", { XX } },
1592 { "(bad)", { XX } },
1593 { "btQ", { Ev, Ib } },
1594 { "btsQ", { Ev, Ib } },
1595 { "btrQ", { Ev, Ib } },
1596 { "btcQ", { Ev, Ib } },
1597 },
1598 /* GRP9 */
1599 {
1600 { "(bad)", { XX } },
1601 { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } } },
1602 { "(bad)", { XX } },
1603 { "(bad)", { XX } },
1604 { "(bad)", { XX } },
1605 { "(bad)", { XX } },
1606 { OPC_EXT_9 },
1607 { OPC_EXT_10 },
1608 },
1609 /* GRP11_C6 */
1610 {
1611 { "movA", { Eb, Ib } },
1612 { "(bad)", { XX } },
1613 { "(bad)", { XX } },
1614 { "(bad)", { XX } },
1615 { "(bad)", { XX } },
1616 { "(bad)", { XX } },
1617 { "(bad)", { XX } },
1618 { "(bad)", { XX } },
1619 },
1620 /* GRP11_C7 */
1621 {
1622 { "movQ", { Ev, Iv } },
1623 { "(bad)", { XX } },
1624 { "(bad)", { XX } },
1625 { "(bad)", { XX } },
1626 { "(bad)", { XX } },
1627 { "(bad)", { XX } },
1628 { "(bad)", { XX } },
1629 { "(bad)", { XX } },
1630 },
1631 /* GRP12 */
1632 {
1633 { "(bad)", { XX } },
1634 { "(bad)", { XX } },
1635 { OPC_EXT_11 },
1636 { "(bad)", { XX } },
1637 { OPC_EXT_12 },
1638 { "(bad)", { XX } },
1639 { OPC_EXT_13 },
1640 { "(bad)", { XX } },
1641 },
1642 /* GRP13 */
1643 {
1644 { "(bad)", { XX } },
1645 { "(bad)", { XX } },
1646 { OPC_EXT_14 },
1647 { "(bad)", { XX } },
1648 { OPC_EXT_15 },
1649 { "(bad)", { XX } },
1650 { OPC_EXT_16 },
1651 { "(bad)", { XX } },
1652 },
1653 /* GRP14 */
1654 {
1655 { "(bad)", { XX } },
1656 { "(bad)", { XX } },
1657 { OPC_EXT_17 },
1658 { OPC_EXT_18 },
1659 { "(bad)", { XX } },
1660 { "(bad)", { XX } },
1661 { OPC_EXT_19 },
1662 { OPC_EXT_20 },
1663 },
1664 /* GRP15 */
1665 {
1666 { OPC_EXT_21 },
1667 { OPC_EXT_22 },
1668 { OPC_EXT_23 },
1669 { OPC_EXT_24 },
1670 { "(bad)", { XX } },
1671 { OPC_EXT_25 },
1672 { OPC_EXT_26 },
1673 { OPC_EXT_27 },
1674 },
1675 /* GRP16 */
1676 {
1677 { OPC_EXT_28 },
1678 { OPC_EXT_29 },
1679 { OPC_EXT_30 },
1680 { OPC_EXT_31 },
1681 { "(bad)", { XX } },
1682 { "(bad)", { XX } },
1683 { "(bad)", { XX } },
1684 { "(bad)", { XX } },
1685 },
1686 /* GRPAMD */
1687 {
1688 { "prefetch", { Eb } },
1689 { "prefetchw", { Eb } },
1690 { "(bad)", { XX } },
1691 { "(bad)", { XX } },
1692 { "(bad)", { XX } },
1693 { "(bad)", { XX } },
1694 { "(bad)", { XX } },
1695 { "(bad)", { XX } },
1696 },
1697 /* GRPPADLCK1 */
1698 {
1699 { "xstore-rng", { { OP_0f07, 0 } } },
1700 { "xcrypt-ecb", { { OP_0f07, 0 } } },
1701 { "xcrypt-cbc", { { OP_0f07, 0 } } },
1702 { "xcrypt-ctr", { { OP_0f07, 0 } } },
1703 { "xcrypt-cfb", { { OP_0f07, 0 } } },
1704 { "xcrypt-ofb", { { OP_0f07, 0 } } },
1705 { "(bad)", { { OP_0f07, 0 } } },
1706 { "(bad)", { { OP_0f07, 0 } } },
1707 },
1708 /* GRPPADLCK2 */
1709 {
1710 { "montmul", { { OP_0f07, 0 } } },
1711 { "xsha1", { { OP_0f07, 0 } } },
1712 { "xsha256", { { OP_0f07, 0 } } },
1713 { "(bad)", { { OP_0f07, 0 } } },
1714 { "(bad)", { { OP_0f07, 0 } } },
1715 { "(bad)", { { OP_0f07, 0 } } },
1716 { "(bad)", { { OP_0f07, 0 } } },
1717 { "(bad)", { { OP_0f07, 0 } } },
1718 }
1719 };
1720
1721 static const struct dis386 prefix_user_table[][4] = {
1722 /* PREGRP0 */
1723 {
1724 { "addps", { XM, EXx } },
1725 { "addss", { XM, EXd } },
1726 { "addpd", { XM, EXx } },
1727 { "addsd", { XM, EXq } },
1728 },
1729 /* PREGRP1 */
1730 {
1731 { "", { XM, EXx, OPSIMD } }, /* See OP_SIMD_SUFFIX. */
1732 { "", { XM, EXd, OPSIMD } },
1733 { "", { XM, EXx, OPSIMD } },
1734 { "", { XM, EXq, OPSIMD } },
1735 },
1736 /* PREGRP2 */
1737 {
1738 { "cvtpi2ps", { XM, EMCq } },
1739 { "cvtsi2ssY", { XM, Ev } },
1740 { "cvtpi2pd", { XM, EMCq } },
1741 { "cvtsi2sdY", { XM, Ev } },
1742 },
1743 /* PREGRP3 */
1744 {
1745 { "cvtps2pi", { MXC, EXq } },
1746 { "cvtss2siY", { Gv, EXd } },
1747 { "cvtpd2pi", { MXC, EXx } },
1748 { "cvtsd2siY", { Gv, EXq } },
1749 },
1750 /* PREGRP4 */
1751 {
1752 { "cvttps2pi", { MXC, EXq } },
1753 { "cvttss2siY", { Gv, EXd } },
1754 { "cvttpd2pi", { MXC, EXx } },
1755 { "cvttsd2siY", { Gv, EXq } },
1756 },
1757 /* PREGRP5 */
1758 {
1759 { "divps", { XM, EXx } },
1760 { "divss", { XM, EXd } },
1761 { "divpd", { XM, EXx } },
1762 { "divsd", { XM, EXq } },
1763 },
1764 /* PREGRP6 */
1765 {
1766 { "maxps", { XM, EXx } },
1767 { "maxss", { XM, EXd } },
1768 { "maxpd", { XM, EXx } },
1769 { "maxsd", { XM, EXq } },
1770 },
1771 /* PREGRP7 */
1772 {
1773 { "minps", { XM, EXx } },
1774 { "minss", { XM, EXd } },
1775 { "minpd", { XM, EXx } },
1776 { "minsd", { XM, EXq } },
1777 },
1778 /* PREGRP8 */
1779 {
1780 { "movups", { XM, EXx } },
1781 { "movss", { XM, EXd } },
1782 { "movupd", { XM, EXx } },
1783 { "movsd", { XM, EXq } },
1784 },
1785 /* PREGRP9 */
1786 {
1787 { "movups", { EXx, XM } },
1788 { "movss", { EXd, XM } },
1789 { "movupd", { EXx, XM } },
1790 { "movsd", { EXq, XM } },
1791 },
1792 /* PREGRP10 */
1793 {
1794 { "mulps", { XM, EXx } },
1795 { "mulss", { XM, EXd } },
1796 { "mulpd", { XM, EXx } },
1797 { "mulsd", { XM, EXq } },
1798 },
1799 /* PREGRP11 */
1800 {
1801 { "rcpps", { XM, EXx } },
1802 { "rcpss", { XM, EXd } },
1803 { "(bad)", { XM, EXx } },
1804 { "(bad)", { XM, EXx } },
1805 },
1806 /* PREGRP12 */
1807 {
1808 { "rsqrtps",{ XM, EXx } },
1809 { "rsqrtss",{ XM, EXd } },
1810 { "(bad)", { XM, EXx } },
1811 { "(bad)", { XM, EXx } },
1812 },
1813 /* PREGRP13 */
1814 {
1815 { "sqrtps", { XM, EXx } },
1816 { "sqrtss", { XM, EXd } },
1817 { "sqrtpd", { XM, EXx } },
1818 { "sqrtsd", { XM, EXq } },
1819 },
1820 /* PREGRP14 */
1821 {
1822 { "subps", { XM, EXx } },
1823 { "subss", { XM, EXd } },
1824 { "subpd", { XM, EXx } },
1825 { "subsd", { XM, EXq } },
1826 },
1827 /* PREGRP15 */
1828 {
1829 { "(bad)", { XM, EXx } },
1830 { "cvtdq2pd", { XM, EXq } },
1831 { "cvttpd2dq", { XM, EXx } },
1832 { "cvtpd2dq", { XM, EXx } },
1833 },
1834 /* PREGRP16 */
1835 {
1836 { "cvtdq2ps", { XM, EXx } },
1837 { "cvttps2dq", { XM, EXx } },
1838 { "cvtps2dq", { XM, EXx } },
1839 { "(bad)", { XM, EXx } },
1840 },
1841 /* PREGRP17 */
1842 {
1843 { "cvtps2pd", { XM, EXq } },
1844 { "cvtss2sd", { XM, EXd } },
1845 { "cvtpd2ps", { XM, EXx } },
1846 { "cvtsd2ss", { XM, EXq } },
1847 },
1848 /* PREGRP18 */
1849 {
1850 { "maskmovq", { MX, MS } },
1851 { "(bad)", { XM, EXx } },
1852 { "maskmovdqu", { XM, XS } },
1853 { "(bad)", { XM, EXx } },
1854 },
1855 /* PREGRP19 */
1856 {
1857 { "movq", { MX, EM } },
1858 { "movdqu", { XM, EXx } },
1859 { "movdqa", { XM, EXx } },
1860 { "(bad)", { XM, EXx } },
1861 },
1862 /* PREGRP20 */
1863 {
1864 { "movq", { EM, MX } },
1865 { "movdqu", { EXx, XM } },
1866 { "movdqa", { EXx, XM } },
1867 { "(bad)", { EXx, XM } },
1868 },
1869 /* PREGRP21 */
1870 {
1871 { "(bad)", { EXx, XM } },
1872 { "movq2dq",{ XM, MS } },
1873 { "movq", { EXq, XM } },
1874 { "movdq2q",{ MX, XS } },
1875 },
1876 /* PREGRP22 */
1877 {
1878 { "pshufw", { MX, EM, Ib } },
1879 { "pshufhw",{ XM, EXx, Ib } },
1880 { "pshufd", { XM, EXx, Ib } },
1881 { "pshuflw",{ XM, EXx, Ib } },
1882 },
1883 /* PREGRP23 */
1884 {
1885 { "movK", { Edq, MX } },
1886 { "movq", { XM, EXq } },
1887 { "movK", { Edq, XM } },
1888 { "(bad)", { Ed, XM } },
1889 },
1890 /* PREGRP24 */
1891 {
1892 { "(bad)", { MX, EXx } },
1893 { "(bad)", { XM, EXx } },
1894 { "punpckhqdq", { XM, EXx } },
1895 { "(bad)", { XM, EXx } },
1896 },
1897 /* PREGRP25 */
1898 {
1899 { "movntq", { EM, MX } },
1900 { "(bad)", { EM, XM } },
1901 { "movntdq",{ EM, XM } },
1902 { "(bad)", { EM, XM } },
1903 },
1904 /* PREGRP26 */
1905 {
1906 { "(bad)", { MX, EXx } },
1907 { "(bad)", { XM, EXx } },
1908 { "punpcklqdq", { XM, EXx } },
1909 { "(bad)", { XM, EXx } },
1910 },
1911 /* PREGRP27 */
1912 {
1913 { "(bad)", { MX, EXx } },
1914 { "(bad)", { XM, EXx } },
1915 { "addsubpd", { XM, EXx } },
1916 { "addsubps", { XM, EXx } },
1917 },
1918 /* PREGRP28 */
1919 {
1920 { "(bad)", { MX, EXx } },
1921 { "(bad)", { XM, EXx } },
1922 { "haddpd", { XM, EXx } },
1923 { "haddps", { XM, EXx } },
1924 },
1925 /* PREGRP29 */
1926 {
1927 { "(bad)", { MX, EXx } },
1928 { "(bad)", { XM, EXx } },
1929 { "hsubpd", { XM, EXx } },
1930 { "hsubps", { XM, EXx } },
1931 },
1932 /* PREGRP30 */
1933 {
1934 { OPC_EXT_36 },
1935 { "movsldup", { XM, EXx } },
1936 { "movlpd", { XM, EXq } },
1937 { "movddup", { XM, EXq } },
1938 },
1939 /* PREGRP31 */
1940 {
1941 { OPC_EXT_37 },
1942 { "movshdup", { XM, EXx } },
1943 { "movhpd", { XM, EXq } },
1944 { "(bad)", { XM, EXq } },
1945 },
1946 /* PREGRP32 */
1947 {
1948 { "(bad)", { XM, EXx } },
1949 { "(bad)", { XM, EXx } },
1950 { "(bad)", { XM, EXx } },
1951 { OPC_EXT_32 },
1952 },
1953 /* PREGRP33 */
1954 {
1955 {"movntps", { Ev, XM } },
1956 {"movntss", { Ed, XM } },
1957 {"movntpd", { Ev, XM } },
1958 {"movntsd", { Eq, XM } },
1959 },
1960
1961 /* PREGRP34 */
1962 {
1963 {"vmread", { Em, Gm } },
1964 {"(bad)", { XX } },
1965 {"extrq", { XS, Ib, Ib } },
1966 {"insertq", { XM, XS, Ib, Ib } },
1967 },
1968
1969 /* PREGRP35 */
1970 {
1971 {"vmwrite", { Gm, Em } },
1972 {"(bad)", { XX } },
1973 {"extrq", { XM, XS } },
1974 {"insertq", { XM, XS } },
1975 },
1976
1977 /* PREGRP36 */
1978 {
1979 { "bsrS", { Gv, Ev } },
1980 { "lzcntS", { Gv, Ev } },
1981 { "bsrS", { Gv, Ev } },
1982 { "(bad)", { XX } },
1983 },
1984
1985 /* PREGRP37 */
1986 {
1987 { "(bad)", { XX } },
1988 { "popcntS", { Gv, Ev } },
1989 { "(bad)", { XX } },
1990 { "(bad)", { XX } },
1991 },
1992
1993 /* PREGRP38 */
1994 {
1995 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
1996 { "pause", { XX } },
1997 { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } } },
1998 { "(bad)", { XX } },
1999 },
2000
2001 /* PREGRP39 */
2002 {
2003 { "(bad)", { XX } },
2004 { "(bad)", { XX } },
2005 { "pblendvb", {XM, EXx, XMM0 } },
2006 { "(bad)", { XX } },
2007 },
2008
2009 /* PREGRP40 */
2010 {
2011 { "(bad)", { XX } },
2012 { "(bad)", { XX } },
2013 { "blendvps", {XM, EXx, XMM0 } },
2014 { "(bad)", { XX } },
2015 },
2016
2017 /* PREGRP41 */
2018 {
2019 { "(bad)", { XX } },
2020 { "(bad)", { XX } },
2021 { "blendvpd", { XM, EXx, XMM0 } },
2022 { "(bad)", { XX } },
2023 },
2024
2025 /* PREGRP42 */
2026 {
2027 { "(bad)", { XX } },
2028 { "(bad)", { XX } },
2029 { "ptest", { XM, EXx } },
2030 { "(bad)", { XX } },
2031 },
2032
2033 /* PREGRP43 */
2034 {
2035 { "(bad)", { XX } },
2036 { "(bad)", { XX } },
2037 { "pmovsxbw", { XM, EXq } },
2038 { "(bad)", { XX } },
2039 },
2040
2041 /* PREGRP44 */
2042 {
2043 { "(bad)", { XX } },
2044 { "(bad)", { XX } },
2045 { "pmovsxbd", { XM, EXd } },
2046 { "(bad)", { XX } },
2047 },
2048
2049 /* PREGRP45 */
2050 {
2051 { "(bad)", { XX } },
2052 { "(bad)", { XX } },
2053 { "pmovsxbq", { XM, EXw } },
2054 { "(bad)", { XX } },
2055 },
2056
2057 /* PREGRP46 */
2058 {
2059 { "(bad)", { XX } },
2060 { "(bad)", { XX } },
2061 { "pmovsxwd", { XM, EXq } },
2062 { "(bad)", { XX } },
2063 },
2064
2065 /* PREGRP47 */
2066 {
2067 { "(bad)", { XX } },
2068 { "(bad)", { XX } },
2069 { "pmovsxwq", { XM, EXd } },
2070 { "(bad)", { XX } },
2071 },
2072
2073 /* PREGRP48 */
2074 {
2075 { "(bad)", { XX } },
2076 { "(bad)", { XX } },
2077 { "pmovsxdq", { XM, EXq } },
2078 { "(bad)", { XX } },
2079 },
2080
2081 /* PREGRP49 */
2082 {
2083 { "(bad)", { XX } },
2084 { "(bad)", { XX } },
2085 { "pmuldq", { XM, EXx } },
2086 { "(bad)", { XX } },
2087 },
2088
2089 /* PREGRP50 */
2090 {
2091 { "(bad)", { XX } },
2092 { "(bad)", { XX } },
2093 { "pcmpeqq", { XM, EXx } },
2094 { "(bad)", { XX } },
2095 },
2096
2097 /* PREGRP51 */
2098 {
2099 { "(bad)", { XX } },
2100 { "(bad)", { XX } },
2101 { "movntdqa", { XM, EM } },
2102 { "(bad)", { XX } },
2103 },
2104
2105 /* PREGRP52 */
2106 {
2107 { "(bad)", { XX } },
2108 { "(bad)", { XX } },
2109 { "packusdw", { XM, EXx } },
2110 { "(bad)", { XX } },
2111 },
2112
2113 /* PREGRP53 */
2114 {
2115 { "(bad)", { XX } },
2116 { "(bad)", { XX } },
2117 { "pmovzxbw", { XM, EXq } },
2118 { "(bad)", { XX } },
2119 },
2120
2121 /* PREGRP54 */
2122 {
2123 { "(bad)", { XX } },
2124 { "(bad)", { XX } },
2125 { "pmovzxbd", { XM, EXd } },
2126 { "(bad)", { XX } },
2127 },
2128
2129 /* PREGRP55 */
2130 {
2131 { "(bad)", { XX } },
2132 { "(bad)", { XX } },
2133 { "pmovzxbq", { XM, EXw } },
2134 { "(bad)", { XX } },
2135 },
2136
2137 /* PREGRP56 */
2138 {
2139 { "(bad)", { XX } },
2140 { "(bad)", { XX } },
2141 { "pmovzxwd", { XM, EXq } },
2142 { "(bad)", { XX } },
2143 },
2144
2145 /* PREGRP57 */
2146 {
2147 { "(bad)", { XX } },
2148 { "(bad)", { XX } },
2149 { "pmovzxwq", { XM, EXd } },
2150 { "(bad)", { XX } },
2151 },
2152
2153 /* PREGRP58 */
2154 {
2155 { "(bad)", { XX } },
2156 { "(bad)", { XX } },
2157 { "pmovzxdq", { XM, EXq } },
2158 { "(bad)", { XX } },
2159 },
2160
2161 /* PREGRP59 */
2162 {
2163 { "(bad)", { XX } },
2164 { "(bad)", { XX } },
2165 { "pminsb", { XM, EXx } },
2166 { "(bad)", { XX } },
2167 },
2168
2169 /* PREGRP60 */
2170 {
2171 { "(bad)", { XX } },
2172 { "(bad)", { XX } },
2173 { "pminsd", { XM, EXx } },
2174 { "(bad)", { XX } },
2175 },
2176
2177 /* PREGRP61 */
2178 {
2179 { "(bad)", { XX } },
2180 { "(bad)", { XX } },
2181 { "pminuw", { XM, EXx } },
2182 { "(bad)", { XX } },
2183 },
2184
2185 /* PREGRP62 */
2186 {
2187 { "(bad)", { XX } },
2188 { "(bad)", { XX } },
2189 { "pminud", { XM, EXx } },
2190 { "(bad)", { XX } },
2191 },
2192
2193 /* PREGRP63 */
2194 {
2195 { "(bad)", { XX } },
2196 { "(bad)", { XX } },
2197 { "pmaxsb", { XM, EXx } },
2198 { "(bad)", { XX } },
2199 },
2200
2201 /* PREGRP64 */
2202 {
2203 { "(bad)", { XX } },
2204 { "(bad)", { XX } },
2205 { "pmaxsd", { XM, EXx } },
2206 { "(bad)", { XX } },
2207 },
2208
2209 /* PREGRP65 */
2210 {
2211 { "(bad)", { XX } },
2212 { "(bad)", { XX } },
2213 { "pmaxuw", { XM, EXx } },
2214 { "(bad)", { XX } },
2215 },
2216
2217 /* PREGRP66 */
2218 {
2219 { "(bad)", { XX } },
2220 { "(bad)", { XX } },
2221 { "pmaxud", { XM, EXx } },
2222 { "(bad)", { XX } },
2223 },
2224
2225 /* PREGRP67 */
2226 {
2227 { "(bad)", { XX } },
2228 { "(bad)", { XX } },
2229 { "pmulld", { XM, EXx } },
2230 { "(bad)", { XX } },
2231 },
2232
2233 /* PREGRP68 */
2234 {
2235 { "(bad)", { XX } },
2236 { "(bad)", { XX } },
2237 { "phminposuw", { XM, EXx } },
2238 { "(bad)", { XX } },
2239 },
2240
2241 /* PREGRP69 */
2242 {
2243 { "(bad)", { XX } },
2244 { "(bad)", { XX } },
2245 { "roundps", { XM, EXx, Ib } },
2246 { "(bad)", { XX } },
2247 },
2248
2249 /* PREGRP70 */
2250 {
2251 { "(bad)", { XX } },
2252 { "(bad)", { XX } },
2253 { "roundpd", { XM, EXx, Ib } },
2254 { "(bad)", { XX } },
2255 },
2256
2257 /* PREGRP71 */
2258 {
2259 { "(bad)", { XX } },
2260 { "(bad)", { XX } },
2261 { "roundss", { XM, EXd, Ib } },
2262 { "(bad)", { XX } },
2263 },
2264
2265 /* PREGRP72 */
2266 {
2267 { "(bad)", { XX } },
2268 { "(bad)", { XX } },
2269 { "roundsd", { XM, EXq, Ib } },
2270 { "(bad)", { XX } },
2271 },
2272
2273 /* PREGRP73 */
2274 {
2275 { "(bad)", { XX } },
2276 { "(bad)", { XX } },
2277 { "blendps", { XM, EXx, Ib } },
2278 { "(bad)", { XX } },
2279 },
2280
2281 /* PREGRP74 */
2282 {
2283 { "(bad)", { XX } },
2284 { "(bad)", { XX } },
2285 { "blendpd", { XM, EXx, Ib } },
2286 { "(bad)", { XX } },
2287 },
2288
2289 /* PREGRP75 */
2290 {
2291 { "(bad)", { XX } },
2292 { "(bad)", { XX } },
2293 { "pblendw", { XM, EXx, Ib } },
2294 { "(bad)", { XX } },
2295 },
2296
2297 /* PREGRP76 */
2298 {
2299 { "(bad)", { XX } },
2300 { "(bad)", { XX } },
2301 { "pextrb", { Edqb, XM, Ib } },
2302 { "(bad)", { XX } },
2303 },
2304
2305 /* PREGRP77 */
2306 {
2307 { "(bad)", { XX } },
2308 { "(bad)", { XX } },
2309 { "pextrw", { Edqw, XM, Ib } },
2310 { "(bad)", { XX } },
2311 },
2312
2313 /* PREGRP78 */
2314 {
2315 { "(bad)", { XX } },
2316 { "(bad)", { XX } },
2317 { "pextrK", { Edq, XM, Ib } },
2318 { "(bad)", { XX } },
2319 },
2320
2321 /* PREGRP79 */
2322 {
2323 { "(bad)", { XX } },
2324 { "(bad)", { XX } },
2325 { "extractps", { Edqd, XM, Ib } },
2326 { "(bad)", { XX } },
2327 },
2328
2329 /* PREGRP80 */
2330 {
2331 { "(bad)", { XX } },
2332 { "(bad)", { XX } },
2333 { "pinsrb", { XM, Edqb, Ib } },
2334 { "(bad)", { XX } },
2335 },
2336
2337 /* PREGRP81 */
2338 {
2339 { "(bad)", { XX } },
2340 { "(bad)", { XX } },
2341 { "insertps", { XM, EXd, Ib } },
2342 { "(bad)", { XX } },
2343 },
2344
2345 /* PREGRP82 */
2346 {
2347 { "(bad)", { XX } },
2348 { "(bad)", { XX } },
2349 { "pinsrK", { XM, Edq, Ib } },
2350 { "(bad)", { XX } },
2351 },
2352
2353 /* PREGRP83 */
2354 {
2355 { "(bad)", { XX } },
2356 { "(bad)", { XX } },
2357 { "dpps", { XM, EXx, Ib } },
2358 { "(bad)", { XX } },
2359 },
2360
2361 /* PREGRP84 */
2362 {
2363 { "(bad)", { XX } },
2364 { "(bad)", { XX } },
2365 { "dppd", { XM, EXx, Ib } },
2366 { "(bad)", { XX } },
2367 },
2368
2369 /* PREGRP85 */
2370 {
2371 { "(bad)", { XX } },
2372 { "(bad)", { XX } },
2373 { "mpsadbw", { XM, EXx, Ib } },
2374 { "(bad)", { XX } },
2375 },
2376
2377 /* PREGRP86 */
2378 {
2379 { "(bad)", { XX } },
2380 { "(bad)", { XX } },
2381 { "pcmpgtq", { XM, EXx } },
2382 { "(bad)", { XX } },
2383 },
2384
2385 /* PREGRP87 */
2386 {
2387 { "(bad)", { XX } },
2388 { "(bad)", { XX } },
2389 { "(bad)", { XX } },
2390 { "crc32", { Gdq, { CRC32_Fixup, b_mode } } },
2391 },
2392
2393 /* PREGRP88 */
2394 {
2395 { "(bad)", { XX } },
2396 { "(bad)", { XX } },
2397 { "(bad)", { XX } },
2398 { "crc32", { Gdq, { CRC32_Fixup, v_mode } } },
2399 },
2400
2401 /* PREGRP89 */
2402 {
2403 { "(bad)", { XX } },
2404 { "(bad)", { XX } },
2405 { "pcmpestrm", { XM, EXx, Ib } },
2406 { "(bad)", { XX } },
2407 },
2408
2409 /* PREGRP90 */
2410 {
2411 { "(bad)", { XX } },
2412 { "(bad)", { XX } },
2413 { "pcmpestri", { XM, EXx, Ib } },
2414 { "(bad)", { XX } },
2415 },
2416
2417 /* PREGRP91 */
2418 {
2419 { "(bad)", { XX } },
2420 { "(bad)", { XX } },
2421 { "pcmpistrm", { XM, EXx, Ib } },
2422 { "(bad)", { XX } },
2423 },
2424
2425 /* PREGRP92 */
2426 {
2427 { "(bad)", { XX } },
2428 { "(bad)", { XX } },
2429 { "pcmpistri", { XM, EXx, Ib } },
2430 { "(bad)", { XX } },
2431 },
2432
2433 /* PREGRP93 */
2434 {
2435 { "ucomiss",{ XM, EXd } },
2436 { "(bad)", { XX } },
2437 { "ucomisd",{ XM, EXq } },
2438 { "(bad)", { XX } },
2439 },
2440
2441 /* PREGRP94 */
2442 {
2443 { "comiss", { XM, EXd } },
2444 { "(bad)", { XX } },
2445 { "comisd", { XM, EXq } },
2446 { "(bad)", { XX } },
2447 },
2448
2449 /* PREGRP95 */
2450 {
2451 { "punpcklbw",{ MX, EMd } },
2452 { "(bad)", { XX } },
2453 { "punpcklbw",{ MX, EMx } },
2454 { "(bad)", { XX } },
2455 },
2456
2457 /* PREGRP96 */
2458 {
2459 { "punpcklwd",{ MX, EMd } },
2460 { "(bad)", { XX } },
2461 { "punpcklwd",{ MX, EMx } },
2462 { "(bad)", { XX } },
2463 },
2464
2465 /* PREGRP97 */
2466 {
2467 { "punpckldq",{ MX, EMd } },
2468 { "(bad)", { XX } },
2469 { "punpckldq",{ MX, EMx } },
2470 { "(bad)", { XX } },
2471 },
2472
2473 /* PREGRP98 */
2474 {
2475 { "vmptrld",{ Mq } },
2476 { "vmxon", { Mq } },
2477 { "vmclear",{ Mq } },
2478 { "(bad)", { XX } },
2479 },
2480
2481 /* PREGRP99 */
2482 {
2483 { "(bad)", { XX } },
2484 { "(bad)", { XX } },
2485 { "psrldq", { MS, Ib } },
2486 { "(bad)", { XX } },
2487 },
2488
2489 /* PREGRP100 */
2490 {
2491 { "(bad)", { XX } },
2492 { "(bad)", { XX } },
2493 { "pslldq", { MS, Ib } },
2494 { "(bad)", { XX } },
2495 },
2496 };
2497
2498 static const struct dis386 x86_64_table[][2] = {
2499 {
2500 { "pusha{P|}", { XX } },
2501 { "(bad)", { XX } },
2502 },
2503 {
2504 { "popa{P|}", { XX } },
2505 { "(bad)", { XX } },
2506 },
2507 {
2508 { OPC_EXT_33 },
2509 { "(bad)", { XX } },
2510 },
2511 {
2512 { "arpl", { Ew, Gw } },
2513 { "movs{||lq|xd}", { Gv, Ed } },
2514 },
2515 };
2516
2517 static const struct dis386 three_byte_table[][256] = {
2518 /* THREE_BYTE_0 */
2519 {
2520 /* 00 */
2521 { "pshufb", { MX, EM } },
2522 { "phaddw", { MX, EM } },
2523 { "phaddd", { MX, EM } },
2524 { "phaddsw", { MX, EM } },
2525 { "pmaddubsw", { MX, EM } },
2526 { "phsubw", { MX, EM } },
2527 { "phsubd", { MX, EM } },
2528 { "phsubsw", { MX, EM } },
2529 /* 08 */
2530 { "psignb", { MX, EM } },
2531 { "psignw", { MX, EM } },
2532 { "psignd", { MX, EM } },
2533 { "pmulhrsw", { MX, EM } },
2534 { "(bad)", { XX } },
2535 { "(bad)", { XX } },
2536 { "(bad)", { XX } },
2537 { "(bad)", { XX } },
2538 /* 10 */
2539 { PREGRP39 },
2540 { "(bad)", { XX } },
2541 { "(bad)", { XX } },
2542 { "(bad)", { XX } },
2543 { PREGRP40 },
2544 { PREGRP41 },
2545 { "(bad)", { XX } },
2546 { PREGRP42 },
2547 /* 18 */
2548 { "(bad)", { XX } },
2549 { "(bad)", { XX } },
2550 { "(bad)", { XX } },
2551 { "(bad)", { XX } },
2552 { "pabsb", { MX, EM } },
2553 { "pabsw", { MX, EM } },
2554 { "pabsd", { MX, EM } },
2555 { "(bad)", { XX } },
2556 /* 20 */
2557 { PREGRP43 },
2558 { PREGRP44 },
2559 { PREGRP45 },
2560 { PREGRP46 },
2561 { PREGRP47 },
2562 { PREGRP48 },
2563 { "(bad)", { XX } },
2564 { "(bad)", { XX } },
2565 /* 28 */
2566 { PREGRP49 },
2567 { PREGRP50 },
2568 { PREGRP51 },
2569 { PREGRP52 },
2570 { "(bad)", { XX } },
2571 { "(bad)", { XX } },
2572 { "(bad)", { XX } },
2573 { "(bad)", { XX } },
2574 /* 30 */
2575 { PREGRP53 },
2576 { PREGRP54 },
2577 { PREGRP55 },
2578 { PREGRP56 },
2579 { PREGRP57 },
2580 { PREGRP58 },
2581 { "(bad)", { XX } },
2582 { PREGRP86 },
2583 /* 38 */
2584 { PREGRP59 },
2585 { PREGRP60 },
2586 { PREGRP61 },
2587 { PREGRP62 },
2588 { PREGRP63 },
2589 { PREGRP64 },
2590 { PREGRP65 },
2591 { PREGRP66 },
2592 /* 40 */
2593 { PREGRP67 },
2594 { PREGRP68 },
2595 { "(bad)", { XX } },
2596 { "(bad)", { XX } },
2597 { "(bad)", { XX } },
2598 { "(bad)", { XX } },
2599 { "(bad)", { XX } },
2600 { "(bad)", { XX } },
2601 /* 48 */
2602 { "(bad)", { XX } },
2603 { "(bad)", { XX } },
2604 { "(bad)", { XX } },
2605 { "(bad)", { XX } },
2606 { "(bad)", { XX } },
2607 { "(bad)", { XX } },
2608 { "(bad)", { XX } },
2609 { "(bad)", { XX } },
2610 /* 50 */
2611 { "(bad)", { XX } },
2612 { "(bad)", { XX } },
2613 { "(bad)", { XX } },
2614 { "(bad)", { XX } },
2615 { "(bad)", { XX } },
2616 { "(bad)", { XX } },
2617 { "(bad)", { XX } },
2618 { "(bad)", { XX } },
2619 /* 58 */
2620 { "(bad)", { XX } },
2621 { "(bad)", { XX } },
2622 { "(bad)", { XX } },
2623 { "(bad)", { XX } },
2624 { "(bad)", { XX } },
2625 { "(bad)", { XX } },
2626 { "(bad)", { XX } },
2627 { "(bad)", { XX } },
2628 /* 60 */
2629 { "(bad)", { XX } },
2630 { "(bad)", { XX } },
2631 { "(bad)", { XX } },
2632 { "(bad)", { XX } },
2633 { "(bad)", { XX } },
2634 { "(bad)", { XX } },
2635 { "(bad)", { XX } },
2636 { "(bad)", { XX } },
2637 /* 68 */
2638 { "(bad)", { XX } },
2639 { "(bad)", { XX } },
2640 { "(bad)", { XX } },
2641 { "(bad)", { XX } },
2642 { "(bad)", { XX } },
2643 { "(bad)", { XX } },
2644 { "(bad)", { XX } },
2645 { "(bad)", { XX } },
2646 /* 70 */
2647 { "(bad)", { XX } },
2648 { "(bad)", { XX } },
2649 { "(bad)", { XX } },
2650 { "(bad)", { XX } },
2651 { "(bad)", { XX } },
2652 { "(bad)", { XX } },
2653 { "(bad)", { XX } },
2654 { "(bad)", { XX } },
2655 /* 78 */
2656 { "(bad)", { XX } },
2657 { "(bad)", { XX } },
2658 { "(bad)", { XX } },
2659 { "(bad)", { XX } },
2660 { "(bad)", { XX } },
2661 { "(bad)", { XX } },
2662 { "(bad)", { XX } },
2663 { "(bad)", { XX } },
2664 /* 80 */
2665 { "(bad)", { XX } },
2666 { "(bad)", { XX } },
2667 { "(bad)", { XX } },
2668 { "(bad)", { XX } },
2669 { "(bad)", { XX } },
2670 { "(bad)", { XX } },
2671 { "(bad)", { XX } },
2672 { "(bad)", { XX } },
2673 /* 88 */
2674 { "(bad)", { XX } },
2675 { "(bad)", { XX } },
2676 { "(bad)", { XX } },
2677 { "(bad)", { XX } },
2678 { "(bad)", { XX } },
2679 { "(bad)", { XX } },
2680 { "(bad)", { XX } },
2681 { "(bad)", { XX } },
2682 /* 90 */
2683 { "(bad)", { XX } },
2684 { "(bad)", { XX } },
2685 { "(bad)", { XX } },
2686 { "(bad)", { XX } },
2687 { "(bad)", { XX } },
2688 { "(bad)", { XX } },
2689 { "(bad)", { XX } },
2690 { "(bad)", { XX } },
2691 /* 98 */
2692 { "(bad)", { XX } },
2693 { "(bad)", { XX } },
2694 { "(bad)", { XX } },
2695 { "(bad)", { XX } },
2696 { "(bad)", { XX } },
2697 { "(bad)", { XX } },
2698 { "(bad)", { XX } },
2699 { "(bad)", { XX } },
2700 /* a0 */
2701 { "(bad)", { XX } },
2702 { "(bad)", { XX } },
2703 { "(bad)", { XX } },
2704 { "(bad)", { XX } },
2705 { "(bad)", { XX } },
2706 { "(bad)", { XX } },
2707 { "(bad)", { XX } },
2708 { "(bad)", { XX } },
2709 /* a8 */
2710 { "(bad)", { XX } },
2711 { "(bad)", { XX } },
2712 { "(bad)", { XX } },
2713 { "(bad)", { XX } },
2714 { "(bad)", { XX } },
2715 { "(bad)", { XX } },
2716 { "(bad)", { XX } },
2717 { "(bad)", { XX } },
2718 /* b0 */
2719 { "(bad)", { XX } },
2720 { "(bad)", { XX } },
2721 { "(bad)", { XX } },
2722 { "(bad)", { XX } },
2723 { "(bad)", { XX } },
2724 { "(bad)", { XX } },
2725 { "(bad)", { XX } },
2726 { "(bad)", { XX } },
2727 /* b8 */
2728 { "(bad)", { XX } },
2729 { "(bad)", { XX } },
2730 { "(bad)", { XX } },
2731 { "(bad)", { XX } },
2732 { "(bad)", { XX } },
2733 { "(bad)", { XX } },
2734 { "(bad)", { XX } },
2735 { "(bad)", { XX } },
2736 /* c0 */
2737 { "(bad)", { XX } },
2738 { "(bad)", { XX } },
2739 { "(bad)", { XX } },
2740 { "(bad)", { XX } },
2741 { "(bad)", { XX } },
2742 { "(bad)", { XX } },
2743 { "(bad)", { XX } },
2744 { "(bad)", { XX } },
2745 /* c8 */
2746 { "(bad)", { XX } },
2747 { "(bad)", { XX } },
2748 { "(bad)", { XX } },
2749 { "(bad)", { XX } },
2750 { "(bad)", { XX } },
2751 { "(bad)", { XX } },
2752 { "(bad)", { XX } },
2753 { "(bad)", { XX } },
2754 /* d0 */
2755 { "(bad)", { XX } },
2756 { "(bad)", { XX } },
2757 { "(bad)", { XX } },
2758 { "(bad)", { XX } },
2759 { "(bad)", { XX } },
2760 { "(bad)", { XX } },
2761 { "(bad)", { XX } },
2762 { "(bad)", { XX } },
2763 /* d8 */
2764 { "(bad)", { XX } },
2765 { "(bad)", { XX } },
2766 { "(bad)", { XX } },
2767 { "(bad)", { XX } },
2768 { "(bad)", { XX } },
2769 { "(bad)", { XX } },
2770 { "(bad)", { XX } },
2771 { "(bad)", { XX } },
2772 /* e0 */
2773 { "(bad)", { XX } },
2774 { "(bad)", { XX } },
2775 { "(bad)", { XX } },
2776 { "(bad)", { XX } },
2777 { "(bad)", { XX } },
2778 { "(bad)", { XX } },
2779 { "(bad)", { XX } },
2780 { "(bad)", { XX } },
2781 /* e8 */
2782 { "(bad)", { XX } },
2783 { "(bad)", { XX } },
2784 { "(bad)", { XX } },
2785 { "(bad)", { XX } },
2786 { "(bad)", { XX } },
2787 { "(bad)", { XX } },
2788 { "(bad)", { XX } },
2789 { "(bad)", { XX } },
2790 /* f0 */
2791 { PREGRP87 },
2792 { PREGRP88 },
2793 { "(bad)", { XX } },
2794 { "(bad)", { XX } },
2795 { "(bad)", { XX } },
2796 { "(bad)", { XX } },
2797 { "(bad)", { XX } },
2798 { "(bad)", { XX } },
2799 /* f8 */
2800 { "(bad)", { XX } },
2801 { "(bad)", { XX } },
2802 { "(bad)", { XX } },
2803 { "(bad)", { XX } },
2804 { "(bad)", { XX } },
2805 { "(bad)", { XX } },
2806 { "(bad)", { XX } },
2807 { "(bad)", { XX } },
2808 },
2809 /* THREE_BYTE_1 */
2810 {
2811 /* 00 */
2812 { "(bad)", { XX } },
2813 { "(bad)", { XX } },
2814 { "(bad)", { XX } },
2815 { "(bad)", { XX } },
2816 { "(bad)", { XX } },
2817 { "(bad)", { XX } },
2818 { "(bad)", { XX } },
2819 { "(bad)", { XX } },
2820 /* 08 */
2821 { PREGRP69 },
2822 { PREGRP70 },
2823 { PREGRP71 },
2824 { PREGRP72 },
2825 { PREGRP73 },
2826 { PREGRP74 },
2827 { PREGRP75 },
2828 { "palignr", { MX, EM, Ib } },
2829 /* 10 */
2830 { "(bad)", { XX } },
2831 { "(bad)", { XX } },
2832 { "(bad)", { XX } },
2833 { "(bad)", { XX } },
2834 { PREGRP76 },
2835 { PREGRP77 },
2836 { PREGRP78 },
2837 { PREGRP79 },
2838 /* 18 */
2839 { "(bad)", { XX } },
2840 { "(bad)", { XX } },
2841 { "(bad)", { XX } },
2842 { "(bad)", { XX } },
2843 { "(bad)", { XX } },
2844 { "(bad)", { XX } },
2845 { "(bad)", { XX } },
2846 { "(bad)", { XX } },
2847 /* 20 */
2848 { PREGRP80 },
2849 { PREGRP81 },
2850 { PREGRP82 },
2851 { "(bad)", { XX } },
2852 { "(bad)", { XX } },
2853 { "(bad)", { XX } },
2854 { "(bad)", { XX } },
2855 { "(bad)", { XX } },
2856 /* 28 */
2857 { "(bad)", { XX } },
2858 { "(bad)", { XX } },
2859 { "(bad)", { XX } },
2860 { "(bad)", { XX } },
2861 { "(bad)", { XX } },
2862 { "(bad)", { XX } },
2863 { "(bad)", { XX } },
2864 { "(bad)", { XX } },
2865 /* 30 */
2866 { "(bad)", { XX } },
2867 { "(bad)", { XX } },
2868 { "(bad)", { XX } },
2869 { "(bad)", { XX } },
2870 { "(bad)", { XX } },
2871 { "(bad)", { XX } },
2872 { "(bad)", { XX } },
2873 { "(bad)", { XX } },
2874 /* 38 */
2875 { "(bad)", { XX } },
2876 { "(bad)", { XX } },
2877 { "(bad)", { XX } },
2878 { "(bad)", { XX } },
2879 { "(bad)", { XX } },
2880 { "(bad)", { XX } },
2881 { "(bad)", { XX } },
2882 { "(bad)", { XX } },
2883 /* 40 */
2884 { PREGRP83 },
2885 { PREGRP84 },
2886 { PREGRP85 },
2887 { "(bad)", { XX } },
2888 { "(bad)", { XX } },
2889 { "(bad)", { XX } },
2890 { "(bad)", { XX } },
2891 { "(bad)", { XX } },
2892 /* 48 */
2893 { "(bad)", { XX } },
2894 { "(bad)", { XX } },
2895 { "(bad)", { XX } },
2896 { "(bad)", { XX } },
2897 { "(bad)", { XX } },
2898 { "(bad)", { XX } },
2899 { "(bad)", { XX } },
2900 { "(bad)", { XX } },
2901 /* 50 */
2902 { "(bad)", { XX } },
2903 { "(bad)", { XX } },
2904 { "(bad)", { XX } },
2905 { "(bad)", { XX } },
2906 { "(bad)", { XX } },
2907 { "(bad)", { XX } },
2908 { "(bad)", { XX } },
2909 { "(bad)", { XX } },
2910 /* 58 */
2911 { "(bad)", { XX } },
2912 { "(bad)", { XX } },
2913 { "(bad)", { XX } },
2914 { "(bad)", { XX } },
2915 { "(bad)", { XX } },
2916 { "(bad)", { XX } },
2917 { "(bad)", { XX } },
2918 { "(bad)", { XX } },
2919 /* 60 */
2920 { PREGRP89 },
2921 { PREGRP90 },
2922 { PREGRP91 },
2923 { PREGRP92 },
2924 { "(bad)", { XX } },
2925 { "(bad)", { XX } },
2926 { "(bad)", { XX } },
2927 { "(bad)", { XX } },
2928 /* 68 */
2929 { "(bad)", { XX } },
2930 { "(bad)", { XX } },
2931 { "(bad)", { XX } },
2932 { "(bad)", { XX } },
2933 { "(bad)", { XX } },
2934 { "(bad)", { XX } },
2935 { "(bad)", { XX } },
2936 { "(bad)", { XX } },
2937 /* 70 */
2938 { "(bad)", { XX } },
2939 { "(bad)", { XX } },
2940 { "(bad)", { XX } },
2941 { "(bad)", { XX } },
2942 { "(bad)", { XX } },
2943 { "(bad)", { XX } },
2944 { "(bad)", { XX } },
2945 { "(bad)", { XX } },
2946 /* 78 */
2947 { "(bad)", { XX } },
2948 { "(bad)", { XX } },
2949 { "(bad)", { XX } },
2950 { "(bad)", { XX } },
2951 { "(bad)", { XX } },
2952 { "(bad)", { XX } },
2953 { "(bad)", { XX } },
2954 { "(bad)", { XX } },
2955 /* 80 */
2956 { "(bad)", { XX } },
2957 { "(bad)", { XX } },
2958 { "(bad)", { XX } },
2959 { "(bad)", { XX } },
2960 { "(bad)", { XX } },
2961 { "(bad)", { XX } },
2962 { "(bad)", { XX } },
2963 { "(bad)", { XX } },
2964 /* 88 */
2965 { "(bad)", { XX } },
2966 { "(bad)", { XX } },
2967 { "(bad)", { XX } },
2968 { "(bad)", { XX } },
2969 { "(bad)", { XX } },
2970 { "(bad)", { XX } },
2971 { "(bad)", { XX } },
2972 { "(bad)", { XX } },
2973 /* 90 */
2974 { "(bad)", { XX } },
2975 { "(bad)", { XX } },
2976 { "(bad)", { XX } },
2977 { "(bad)", { XX } },
2978 { "(bad)", { XX } },
2979 { "(bad)", { XX } },
2980 { "(bad)", { XX } },
2981 { "(bad)", { XX } },
2982 /* 98 */
2983 { "(bad)", { XX } },
2984 { "(bad)", { XX } },
2985 { "(bad)", { XX } },
2986 { "(bad)", { XX } },
2987 { "(bad)", { XX } },
2988 { "(bad)", { XX } },
2989 { "(bad)", { XX } },
2990 { "(bad)", { XX } },
2991 /* a0 */
2992 { "(bad)", { XX } },
2993 { "(bad)", { XX } },
2994 { "(bad)", { XX } },
2995 { "(bad)", { XX } },
2996 { "(bad)", { XX } },
2997 { "(bad)", { XX } },
2998 { "(bad)", { XX } },
2999 { "(bad)", { XX } },
3000 /* a8 */
3001 { "(bad)", { XX } },
3002 { "(bad)", { XX } },
3003 { "(bad)", { XX } },
3004 { "(bad)", { XX } },
3005 { "(bad)", { XX } },
3006 { "(bad)", { XX } },
3007 { "(bad)", { XX } },
3008 { "(bad)", { XX } },
3009 /* b0 */
3010 { "(bad)", { XX } },
3011 { "(bad)", { XX } },
3012 { "(bad)", { XX } },
3013 { "(bad)", { XX } },
3014 { "(bad)", { XX } },
3015 { "(bad)", { XX } },
3016 { "(bad)", { XX } },
3017 { "(bad)", { XX } },
3018 /* b8 */
3019 { "(bad)", { XX } },
3020 { "(bad)", { XX } },
3021 { "(bad)", { XX } },
3022 { "(bad)", { XX } },
3023 { "(bad)", { XX } },
3024 { "(bad)", { XX } },
3025 { "(bad)", { XX } },
3026 { "(bad)", { XX } },
3027 /* c0 */
3028 { "(bad)", { XX } },
3029 { "(bad)", { XX } },
3030 { "(bad)", { XX } },
3031 { "(bad)", { XX } },
3032 { "(bad)", { XX } },
3033 { "(bad)", { XX } },
3034 { "(bad)", { XX } },
3035 { "(bad)", { XX } },
3036 /* c8 */
3037 { "(bad)", { XX } },
3038 { "(bad)", { XX } },
3039 { "(bad)", { XX } },
3040 { "(bad)", { XX } },
3041 { "(bad)", { XX } },
3042 { "(bad)", { XX } },
3043 { "(bad)", { XX } },
3044 { "(bad)", { XX } },
3045 /* d0 */
3046 { "(bad)", { XX } },
3047 { "(bad)", { XX } },
3048 { "(bad)", { XX } },
3049 { "(bad)", { XX } },
3050 { "(bad)", { XX } },
3051 { "(bad)", { XX } },
3052 { "(bad)", { XX } },
3053 { "(bad)", { XX } },
3054 /* d8 */
3055 { "(bad)", { XX } },
3056 { "(bad)", { XX } },
3057 { "(bad)", { XX } },
3058 { "(bad)", { XX } },
3059 { "(bad)", { XX } },
3060 { "(bad)", { XX } },
3061 { "(bad)", { XX } },
3062 { "(bad)", { XX } },
3063 /* e0 */
3064 { "(bad)", { XX } },
3065 { "(bad)", { XX } },
3066 { "(bad)", { XX } },
3067 { "(bad)", { XX } },
3068 { "(bad)", { XX } },
3069 { "(bad)", { XX } },
3070 { "(bad)", { XX } },
3071 { "(bad)", { XX } },
3072 /* e8 */
3073 { "(bad)", { XX } },
3074 { "(bad)", { XX } },
3075 { "(bad)", { XX } },
3076 { "(bad)", { XX } },
3077 { "(bad)", { XX } },
3078 { "(bad)", { XX } },
3079 { "(bad)", { XX } },
3080 { "(bad)", { XX } },
3081 /* f0 */
3082 { "(bad)", { XX } },
3083 { "(bad)", { XX } },
3084 { "(bad)", { XX } },
3085 { "(bad)", { XX } },
3086 { "(bad)", { XX } },
3087 { "(bad)", { XX } },
3088 { "(bad)", { XX } },
3089 { "(bad)", { XX } },
3090 /* f8 */
3091 { "(bad)", { XX } },
3092 { "(bad)", { XX } },
3093 { "(bad)", { XX } },
3094 { "(bad)", { XX } },
3095 { "(bad)", { XX } },
3096 { "(bad)", { XX } },
3097 { "(bad)", { XX } },
3098 { "(bad)", { XX } },
3099 },
3100 /* THREE_BYTE_SSE5_0F24 */
3101 {
3102 /* 00 */
3103 { "fmaddps", { { OP_DREX4, q_mode } } },
3104 { "fmaddpd", { { OP_DREX4, q_mode } } },
3105 { "fmaddss", { { OP_DREX4, w_mode } } },
3106 { "fmaddsd", { { OP_DREX4, d_mode } } },
3107 { "fmaddps", { { OP_DREX4, DREX_OC1 + q_mode } } },
3108 { "fmaddpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
3109 { "fmaddss", { { OP_DREX4, DREX_OC1 + w_mode } } },
3110 { "fmaddsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
3111 /* 08 */
3112 { "fmsubps", { { OP_DREX4, q_mode } } },
3113 { "fmsubpd", { { OP_DREX4, q_mode } } },
3114 { "fmsubss", { { OP_DREX4, w_mode } } },
3115 { "fmsubsd", { { OP_DREX4, d_mode } } },
3116 { "fmsubps", { { OP_DREX4, DREX_OC1 + q_mode } } },
3117 { "fmsubpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
3118 { "fmsubss", { { OP_DREX4, DREX_OC1 + w_mode } } },
3119 { "fmsubsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
3120 /* 10 */
3121 { "fnmaddps", { { OP_DREX4, q_mode } } },
3122 { "fnmaddpd", { { OP_DREX4, q_mode } } },
3123 { "fnmaddss", { { OP_DREX4, w_mode } } },
3124 { "fnmaddsd", { { OP_DREX4, d_mode } } },
3125 { "fnmaddps", { { OP_DREX4, DREX_OC1 + q_mode } } },
3126 { "fnmaddpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
3127 { "fnmaddss", { { OP_DREX4, DREX_OC1 + w_mode } } },
3128 { "fnmaddsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
3129 /* 18 */
3130 { "fnmsubps", { { OP_DREX4, q_mode } } },
3131 { "fnmsubpd", { { OP_DREX4, q_mode } } },
3132 { "fnmsubss", { { OP_DREX4, w_mode } } },
3133 { "fnmsubsd", { { OP_DREX4, d_mode } } },
3134 { "fnmsubps", { { OP_DREX4, DREX_OC1 + q_mode } } },
3135 { "fnmsubpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
3136 { "fnmsubss", { { OP_DREX4, DREX_OC1 + w_mode } } },
3137 { "fnmsubsd", { { OP_DREX4, DREX_OC1 + d_mode } } },
3138 /* 20 */
3139 { "permps", { { OP_DREX4, q_mode } } },
3140 { "permpd", { { OP_DREX4, q_mode } } },
3141 { "pcmov", { { OP_DREX4, q_mode } } },
3142 { "pperm", { { OP_DREX4, q_mode } } },
3143 { "permps", { { OP_DREX4, DREX_OC1 + q_mode } } },
3144 { "permpd", { { OP_DREX4, DREX_OC1 + q_mode } } },
3145 { "pcmov", { { OP_DREX4, DREX_OC1 + w_mode } } },
3146 { "pperm", { { OP_DREX4, DREX_OC1 + d_mode } } },
3147 /* 28 */
3148 { "(bad)", { XX } },
3149 { "(bad)", { XX } },
3150 { "(bad)", { XX } },
3151 { "(bad)", { XX } },
3152 { "(bad)", { XX } },
3153 { "(bad)", { XX } },
3154 { "(bad)", { XX } },
3155 { "(bad)", { XX } },
3156 /* 30 */
3157 { "(bad)", { XX } },
3158 { "(bad)", { XX } },
3159 { "(bad)", { XX } },
3160 { "(bad)", { XX } },
3161 { "(bad)", { XX } },
3162 { "(bad)", { XX } },
3163 { "(bad)", { XX } },
3164 { "(bad)", { XX } },
3165 /* 38 */
3166 { "(bad)", { XX } },
3167 { "(bad)", { XX } },
3168 { "(bad)", { XX } },
3169 { "(bad)", { XX } },
3170 { "(bad)", { XX } },
3171 { "(bad)", { XX } },
3172 { "(bad)", { XX } },
3173 { "(bad)", { XX } },
3174 /* 40 */
3175 { "protb", { { OP_DREX3, q_mode } } },
3176 { "protw", { { OP_DREX3, q_mode } } },
3177 { "protd", { { OP_DREX3, q_mode } } },
3178 { "protq", { { OP_DREX3, q_mode } } },
3179 { "pshlb", { { OP_DREX3, q_mode } } },
3180 { "pshlw", { { OP_DREX3, q_mode } } },
3181 { "pshld", { { OP_DREX3, q_mode } } },
3182 { "pshlq", { { OP_DREX3, q_mode } } },
3183 /* 48 */
3184 { "pshab", { { OP_DREX3, q_mode } } },
3185 { "pshaw", { { OP_DREX3, q_mode } } },
3186 { "pshad", { { OP_DREX3, q_mode } } },
3187 { "pshaq", { { OP_DREX3, q_mode } } },
3188 { "(bad)", { XX } },
3189 { "(bad)", { XX } },
3190 { "(bad)", { XX } },
3191 { "(bad)", { XX } },
3192 /* 50 */
3193 { "(bad)", { XX } },
3194 { "(bad)", { XX } },
3195 { "(bad)", { XX } },
3196 { "(bad)", { XX } },
3197 { "(bad)", { XX } },
3198 { "(bad)", { XX } },
3199 { "(bad)", { XX } },
3200 { "(bad)", { XX } },
3201 /* 58 */
3202 { "(bad)", { XX } },
3203 { "(bad)", { XX } },
3204 { "(bad)", { XX } },
3205 { "(bad)", { XX } },
3206 { "(bad)", { XX } },
3207 { "(bad)", { XX } },
3208 { "(bad)", { XX } },
3209 { "(bad)", { XX } },
3210 /* 60 */
3211 { "(bad)", { XX } },
3212 { "(bad)", { XX } },
3213 { "(bad)", { XX } },
3214 { "(bad)", { XX } },
3215 { "(bad)", { XX } },
3216 { "(bad)", { XX } },
3217 { "(bad)", { XX } },
3218 { "(bad)", { XX } },
3219 /* 68 */
3220 { "(bad)", { XX } },
3221 { "(bad)", { XX } },
3222 { "(bad)", { XX } },
3223 { "(bad)", { XX } },
3224 { "(bad)", { XX } },
3225 { "(bad)", { XX } },
3226 { "(bad)", { XX } },
3227 { "(bad)", { XX } },
3228 /* 70 */
3229 { "(bad)", { XX } },
3230 { "(bad)", { XX } },
3231 { "(bad)", { XX } },
3232 { "(bad)", { XX } },
3233 { "(bad)", { XX } },
3234 { "(bad)", { XX } },
3235 { "(bad)", { XX } },
3236 { "(bad)", { XX } },
3237 /* 78 */
3238 { "(bad)", { XX } },
3239 { "(bad)", { XX } },
3240 { "(bad)", { XX } },
3241 { "(bad)", { XX } },
3242 { "(bad)", { XX } },
3243 { "(bad)", { XX } },
3244 { "(bad)", { XX } },
3245 { "(bad)", { XX } },
3246 /* 80 */
3247 { "(bad)", { XX } },
3248 { "(bad)", { XX } },
3249 { "(bad)", { XX } },
3250 { "(bad)", { XX } },
3251 { "(bad)", { XX } },
3252 { "pmacssww", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
3253 { "pmacsswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
3254 { "pmacssdql", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
3255 /* 88 */
3256 { "(bad)", { XX } },
3257 { "(bad)", { XX } },
3258 { "(bad)", { XX } },
3259 { "(bad)", { XX } },
3260 { "(bad)", { XX } },
3261 { "(bad)", { XX } },
3262 { "pmacssdd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
3263 { "pmacssdqh", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
3264 /* 90 */
3265 { "(bad)", { XX } },
3266 { "(bad)", { XX } },
3267 { "(bad)", { XX } },
3268 { "(bad)", { XX } },
3269 { "(bad)", { XX } },
3270 { "pmacsww", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
3271 { "pmacswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
3272 { "pmacsdql", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
3273 /* 98 */
3274 { "(bad)", { XX } },
3275 { "(bad)", { XX } },
3276 { "(bad)", { XX } },
3277 { "(bad)", { XX } },
3278 { "(bad)", { XX } },
3279 { "(bad)", { XX } },
3280 { "pmacsdd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
3281 { "pmacsdqh", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
3282 /* a0 */
3283 { "(bad)", { XX } },
3284 { "(bad)", { XX } },
3285 { "(bad)", { XX } },
3286 { "(bad)", { XX } },
3287 { "(bad)", { XX } },
3288 { "(bad)", { XX } },
3289 { "pmadcsswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
3290 { "(bad)", { XX } },
3291 /* a8 */
3292 { "(bad)", { XX } },
3293 { "(bad)", { XX } },
3294 { "(bad)", { XX } },
3295 { "(bad)", { XX } },
3296 { "(bad)", { XX } },
3297 { "(bad)", { XX } },
3298 { "(bad)", { XX } },
3299 { "(bad)", { XX } },
3300 /* b0 */
3301 { "(bad)", { XX } },
3302 { "(bad)", { XX } },
3303 { "(bad)", { XX } },
3304 { "(bad)", { XX } },
3305 { "(bad)", { XX } },
3306 { "(bad)", { XX } },
3307 { "pmadcswd", { { OP_DREX4, DREX_OC1 + DREX_NO_OC0 + q_mode } } },
3308 { "(bad)", { XX } },
3309 /* b8 */
3310 { "(bad)", { XX } },
3311 { "(bad)", { XX } },
3312 { "(bad)", { XX } },
3313 { "(bad)", { XX } },
3314 { "(bad)", { XX } },
3315 { "(bad)", { XX } },
3316 { "(bad)", { XX } },
3317 { "(bad)", { XX } },
3318 /* c0 */
3319 { "(bad)", { XX } },
3320 { "(bad)", { XX } },
3321 { "(bad)", { XX } },
3322 { "(bad)", { XX } },
3323 { "(bad)", { XX } },
3324 { "(bad)", { XX } },
3325 { "(bad)", { XX } },
3326 { "(bad)", { XX } },
3327 /* c8 */
3328 { "(bad)", { XX } },
3329 { "(bad)", { XX } },
3330 { "(bad)", { XX } },
3331 { "(bad)", { XX } },
3332 { "(bad)", { XX } },
3333 { "(bad)", { XX } },
3334 { "(bad)", { XX } },
3335 { "(bad)", { XX } },
3336 /* d0 */
3337 { "(bad)", { XX } },
3338 { "(bad)", { XX } },
3339 { "(bad)", { XX } },
3340 { "(bad)", { XX } },
3341 { "(bad)", { XX } },
3342 { "(bad)", { XX } },
3343 { "(bad)", { XX } },
3344 { "(bad)", { XX } },
3345 /* d8 */
3346 { "(bad)", { XX } },
3347 { "(bad)", { XX } },
3348 { "(bad)", { XX } },
3349 { "(bad)", { XX } },
3350 { "(bad)", { XX } },
3351 { "(bad)", { XX } },
3352 { "(bad)", { XX } },
3353 { "(bad)", { XX } },
3354 /* e0 */
3355 { "(bad)", { XX } },
3356 { "(bad)", { XX } },
3357 { "(bad)", { XX } },
3358 { "(bad)", { XX } },
3359 { "(bad)", { XX } },
3360 { "(bad)", { XX } },
3361 { "(bad)", { XX } },
3362 { "(bad)", { XX } },
3363 /* e8 */
3364 { "(bad)", { XX } },
3365 { "(bad)", { XX } },
3366 { "(bad)", { XX } },
3367 { "(bad)", { XX } },
3368 { "(bad)", { XX } },
3369 { "(bad)", { XX } },
3370 { "(bad)", { XX } },
3371 { "(bad)", { XX } },
3372 /* f0 */
3373 { "(bad)", { XX } },
3374 { "(bad)", { XX } },
3375 { "(bad)", { XX } },
3376 { "(bad)", { XX } },
3377 { "(bad)", { XX } },
3378 { "(bad)", { XX } },
3379 { "(bad)", { XX } },
3380 { "(bad)", { XX } },
3381 /* f8 */
3382 { "(bad)", { XX } },
3383 { "(bad)", { XX } },
3384 { "(bad)", { XX } },
3385 { "(bad)", { XX } },
3386 { "(bad)", { XX } },
3387 { "(bad)", { XX } },
3388 { "(bad)", { XX } },
3389 { "(bad)", { XX } },
3390 },
3391 /* THREE_BYTE_SSE5_0F25 */
3392 {
3393 /* 00 */
3394 { "(bad)", { XX } },
3395 { "(bad)", { XX } },
3396 { "(bad)", { XX } },
3397 { "(bad)", { XX } },
3398 { "(bad)", { XX } },
3399 { "(bad)", { XX } },
3400 { "(bad)", { XX } },
3401 { "(bad)", { XX } },
3402 /* 08 */
3403 { "(bad)", { XX } },
3404 { "(bad)", { XX } },
3405 { "(bad)", { XX } },
3406 { "(bad)", { XX } },
3407 { "(bad)", { XX } },
3408 { "(bad)", { XX } },
3409 { "(bad)", { XX } },
3410 { "(bad)", { XX } },
3411 /* 10 */
3412 { "(bad)", { XX } },
3413 { "(bad)", { XX } },
3414 { "(bad)", { XX } },
3415 { "(bad)", { XX } },
3416 { "(bad)", { XX } },
3417 { "(bad)", { XX } },
3418 { "(bad)", { XX } },
3419 { "(bad)", { XX } },
3420 /* 18 */
3421 { "(bad)", { XX } },
3422 { "(bad)", { XX } },
3423 { "(bad)", { XX } },
3424 { "(bad)", { XX } },
3425 { "(bad)", { XX } },
3426 { "(bad)", { XX } },
3427 { "(bad)", { XX } },
3428 { "(bad)", { XX } },
3429 /* 20 */
3430 { "(bad)", { XX } },
3431 { "(bad)", { XX } },
3432 { "(bad)", { XX } },
3433 { "(bad)", { XX } },
3434 { "(bad)", { XX } },
3435 { "(bad)", { XX } },
3436 { "(bad)", { XX } },
3437 { "(bad)", { XX } },
3438 /* 28 */
3439 { "(bad)", { XX } },
3440 { "(bad)", { XX } },
3441 { "(bad)", { XX } },
3442 { "(bad)", { XX } },
3443 { "comps", { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
3444 { "compd", { { OP_DREX3, q_mode }, { OP_DREX_FCMP, b_mode } } },
3445 { "comss", { { OP_DREX3, w_mode }, { OP_DREX_FCMP, b_mode } } },
3446 { "comsd", { { OP_DREX3, d_mode }, { OP_DREX_FCMP, b_mode } } },
3447 /* 30 */
3448 { "(bad)", { XX } },
3449 { "(bad)", { XX } },
3450 { "(bad)", { XX } },
3451 { "(bad)", { XX } },
3452 { "(bad)", { XX } },
3453 { "(bad)", { XX } },
3454 { "(bad)", { XX } },
3455 { "(bad)", { XX } },
3456 /* 38 */
3457 { "(bad)", { XX } },
3458 { "(bad)", { XX } },
3459 { "(bad)", { XX } },
3460 { "(bad)", { XX } },
3461 { "(bad)", { XX } },
3462 { "(bad)", { XX } },
3463 { "(bad)", { XX } },
3464 { "(bad)", { XX } },
3465 /* 40 */
3466 { "(bad)", { XX } },
3467 { "(bad)", { XX } },
3468 { "(bad)", { XX } },
3469 { "(bad)", { XX } },
3470 { "(bad)", { XX } },
3471 { "(bad)", { XX } },
3472 { "(bad)", { XX } },
3473 { "(bad)", { XX } },
3474 /* 48 */
3475 { "(bad)", { XX } },
3476 { "(bad)", { XX } },
3477 { "(bad)", { XX } },
3478 { "(bad)", { XX } },
3479 { "pcomb", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3480 { "pcomw", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3481 { "pcomd", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3482 { "pcomq", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3483 /* 50 */
3484 { "(bad)", { XX } },
3485 { "(bad)", { XX } },
3486 { "(bad)", { XX } },
3487 { "(bad)", { XX } },
3488 { "(bad)", { XX } },
3489 { "(bad)", { XX } },
3490 { "(bad)", { XX } },
3491 { "(bad)", { XX } },
3492 /* 58 */
3493 { "(bad)", { XX } },
3494 { "(bad)", { XX } },
3495 { "(bad)", { XX } },
3496 { "(bad)", { XX } },
3497 { "(bad)", { XX } },
3498 { "(bad)", { XX } },
3499 { "(bad)", { XX } },
3500 { "(bad)", { XX } },
3501 /* 60 */
3502 { "(bad)", { XX } },
3503 { "(bad)", { XX } },
3504 { "(bad)", { XX } },
3505 { "(bad)", { XX } },
3506 { "(bad)", { XX } },
3507 { "(bad)", { XX } },
3508 { "(bad)", { XX } },
3509 { "(bad)", { XX } },
3510 /* 68 */
3511 { "(bad)", { XX } },
3512 { "(bad)", { XX } },
3513 { "(bad)", { XX } },
3514 { "(bad)", { XX } },
3515 { "pcomub", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3516 { "pcomuw", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3517 { "pcomud", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3518 { "pcomuq", { { OP_DREX3, q_mode }, { OP_DREX_ICMP, b_mode } } },
3519 /* 70 */
3520 { "(bad)", { XX } },
3521 { "(bad)", { XX } },
3522 { "(bad)", { XX } },
3523 { "(bad)", { XX } },
3524 { "(bad)", { XX } },
3525 { "(bad)", { XX } },
3526 { "(bad)", { XX } },
3527 { "(bad)", { XX } },
3528 /* 78 */
3529 { "(bad)", { XX } },
3530 { "(bad)", { XX } },
3531 { "(bad)", { XX } },
3532 { "(bad)", { XX } },
3533 { "(bad)", { XX } },
3534 { "(bad)", { XX } },
3535 { "(bad)", { XX } },
3536 { "(bad)", { XX } },
3537 /* 80 */
3538 { "(bad)", { XX } },
3539 { "(bad)", { XX } },
3540 { "(bad)", { XX } },
3541 { "(bad)", { XX } },
3542 { "(bad)", { XX } },
3543 { "(bad)", { XX } },
3544 { "(bad)", { XX } },
3545 { "(bad)", { XX } },
3546 /* 88 */
3547 { "(bad)", { XX } },
3548 { "(bad)", { XX } },
3549 { "(bad)", { XX } },
3550 { "(bad)", { XX } },
3551 { "(bad)", { XX } },
3552 { "(bad)", { XX } },
3553 { "(bad)", { XX } },
3554 { "(bad)", { XX } },
3555 /* 90 */
3556 { "(bad)", { XX } },
3557 { "(bad)", { XX } },
3558 { "(bad)", { XX } },
3559 { "(bad)", { XX } },
3560 { "(bad)", { XX } },
3561 { "(bad)", { XX } },
3562 { "(bad)", { XX } },
3563 { "(bad)", { XX } },
3564 /* 98 */
3565 { "(bad)", { XX } },
3566 { "(bad)", { XX } },
3567 { "(bad)", { XX } },
3568 { "(bad)", { XX } },
3569 { "(bad)", { XX } },
3570 { "(bad)", { XX } },
3571 { "(bad)", { XX } },
3572 { "(bad)", { XX } },
3573 /* a0 */
3574 { "(bad)", { XX } },
3575 { "(bad)", { XX } },
3576 { "(bad)", { XX } },
3577 { "(bad)", { XX } },
3578 { "(bad)", { XX } },
3579 { "(bad)", { XX } },
3580 { "(bad)", { XX } },
3581 { "(bad)", { XX } },
3582 /* a8 */
3583 { "(bad)", { XX } },
3584 { "(bad)", { XX } },
3585 { "(bad)", { XX } },
3586 { "(bad)", { XX } },
3587 { "(bad)", { XX } },
3588 { "(bad)", { XX } },
3589 { "(bad)", { XX } },
3590 { "(bad)", { XX } },
3591 /* b0 */
3592 { "(bad)", { XX } },
3593 { "(bad)", { XX } },
3594 { "(bad)", { XX } },
3595 { "(bad)", { XX } },
3596 { "(bad)", { XX } },
3597 { "(bad)", { XX } },
3598 { "(bad)", { XX } },
3599 { "(bad)", { XX } },
3600 /* b8 */
3601 { "(bad)", { XX } },
3602 { "(bad)", { XX } },
3603 { "(bad)", { XX } },
3604 { "(bad)", { XX } },
3605 { "(bad)", { XX } },
3606 { "(bad)", { XX } },
3607 { "(bad)", { XX } },
3608 { "(bad)", { XX } },
3609 /* c0 */
3610 { "(bad)", { XX } },
3611 { "(bad)", { XX } },
3612 { "(bad)", { XX } },
3613 { "(bad)", { XX } },
3614 { "(bad)", { XX } },
3615 { "(bad)", { XX } },
3616 { "(bad)", { XX } },
3617 { "(bad)", { XX } },
3618 /* c8 */
3619 { "(bad)", { XX } },
3620 { "(bad)", { XX } },
3621 { "(bad)", { XX } },
3622 { "(bad)", { XX } },
3623 { "(bad)", { XX } },
3624 { "(bad)", { XX } },
3625 { "(bad)", { XX } },
3626 { "(bad)", { XX } },
3627 /* d0 */
3628 { "(bad)", { XX } },
3629 { "(bad)", { XX } },
3630 { "(bad)", { XX } },
3631 { "(bad)", { XX } },
3632 { "(bad)", { XX } },
3633 { "(bad)", { XX } },
3634 { "(bad)", { XX } },
3635 { "(bad)", { XX } },
3636 /* d8 */
3637 { "(bad)", { XX } },
3638 { "(bad)", { XX } },
3639 { "(bad)", { XX } },
3640 { "(bad)", { XX } },
3641 { "(bad)", { XX } },
3642 { "(bad)", { XX } },
3643 { "(bad)", { XX } },
3644 { "(bad)", { XX } },
3645 /* e0 */
3646 { "(bad)", { XX } },
3647 { "(bad)", { XX } },
3648 { "(bad)", { XX } },
3649 { "(bad)", { XX } },
3650 { "(bad)", { XX } },
3651 { "(bad)", { XX } },
3652 { "(bad)", { XX } },
3653 { "(bad)", { XX } },
3654 /* e8 */
3655 { "(bad)", { XX } },
3656 { "(bad)", { XX } },
3657 { "(bad)", { XX } },
3658 { "(bad)", { XX } },
3659 { "(bad)", { XX } },
3660 { "(bad)", { XX } },
3661 { "(bad)", { XX } },
3662 { "(bad)", { XX } },
3663 /* f0 */
3664 { "(bad)", { XX } },
3665 { "(bad)", { XX } },
3666 { "(bad)", { XX } },
3667 { "(bad)", { XX } },
3668 { "(bad)", { XX } },
3669 { "(bad)", { XX } },
3670 { "(bad)", { XX } },
3671 { "(bad)", { XX } },
3672 /* f8 */
3673 { "(bad)", { XX } },
3674 { "(bad)", { XX } },
3675 { "(bad)", { XX } },
3676 { "(bad)", { XX } },
3677 { "(bad)", { XX } },
3678 { "(bad)", { XX } },
3679 { "(bad)", { XX } },
3680 { "(bad)", { XX } },
3681 },
3682 /* THREE_BYTE_SSE5_0F7A */
3683 {
3684 /* 00 */
3685 { "(bad)", { XX } },
3686 { "(bad)", { XX } },
3687 { "(bad)", { XX } },
3688 { "(bad)", { XX } },
3689 { "(bad)", { XX } },
3690 { "(bad)", { XX } },
3691 { "(bad)", { XX } },
3692 { "(bad)", { XX } },
3693 /* 08 */
3694 { "(bad)", { XX } },
3695 { "(bad)", { XX } },
3696 { "(bad)", { XX } },
3697 { "(bad)", { XX } },
3698 { "(bad)", { XX } },
3699 { "(bad)", { XX } },
3700 { "(bad)", { XX } },
3701 { "(bad)", { XX } },
3702 /* 10 */
3703 { "frczps", { XM, EXq } },
3704 { "frczpd", { XM, EXq } },
3705 { "frczss", { XM, EXq } },
3706 { "frczsd", { XM, EXq } },
3707 { "(bad)", { XX } },
3708 { "(bad)", { XX } },
3709 { "(bad)", { XX } },
3710 { "(bad)", { XX } },
3711 /* 18 */
3712 { "(bad)", { XX } },
3713 { "(bad)", { XX } },
3714 { "(bad)", { XX } },
3715 { "(bad)", { XX } },
3716 { "(bad)", { XX } },
3717 { "(bad)", { XX } },
3718 { "(bad)", { XX } },
3719 { "(bad)", { XX } },
3720 /* 20 */
3721 { "ptest", { XX } },
3722 { "(bad)", { XX } },
3723 { "(bad)", { XX } },
3724 { "(bad)", { XX } },
3725 { "(bad)", { XX } },
3726 { "(bad)", { XX } },
3727 { "(bad)", { XX } },
3728 { "(bad)", { XX } },
3729 /* 28 */
3730 { "(bad)", { XX } },
3731 { "(bad)", { XX } },
3732 { "(bad)", { XX } },
3733 { "(bad)", { XX } },
3734 { "(bad)", { XX } },
3735 { "(bad)", { XX } },
3736 { "(bad)", { XX } },
3737 { "(bad)", { XX } },
3738 /* 30 */
3739 { "cvtph2ps", { XM, EXd } },
3740 { "cvtps2ph", { EXd, XM } },
3741 { "(bad)", { XX } },
3742 { "(bad)", { XX } },
3743 { "(bad)", { XX } },
3744 { "(bad)", { XX } },
3745 { "(bad)", { XX } },
3746 { "(bad)", { XX } },
3747 /* 38 */
3748 { "(bad)", { XX } },
3749 { "(bad)", { XX } },
3750 { "(bad)", { XX } },
3751 { "(bad)", { XX } },
3752 { "(bad)", { XX } },
3753 { "(bad)", { XX } },
3754 { "(bad)", { XX } },
3755 { "(bad)", { XX } },
3756 /* 40 */
3757 { "(bad)", { XX } },
3758 { "phaddbw", { XM, EXq } },
3759 { "phaddbd", { XM, EXq } },
3760 { "phaddbq", { XM, EXq } },
3761 { "(bad)", { XX } },
3762 { "(bad)", { XX } },
3763 { "phaddwd", { XM, EXq } },
3764 { "phaddwq", { XM, EXq } },
3765 /* 48 */
3766 { "(bad)", { XX } },
3767 { "(bad)", { XX } },
3768 { "(bad)", { XX } },
3769 { "phadddq", { XM, EXq } },
3770 { "(bad)", { XX } },
3771 { "(bad)", { XX } },
3772 { "(bad)", { XX } },
3773 { "(bad)", { XX } },
3774 /* 50 */
3775 { "(bad)", { XX } },
3776 { "phaddubw", { XM, EXq } },
3777 { "phaddubd", { XM, EXq } },
3778 { "phaddubq", { XM, EXq } },
3779 { "(bad)", { XX } },
3780 { "(bad)", { XX } },
3781 { "phadduwd", { XM, EXq } },
3782 { "phadduwq", { XM, EXq } },
3783 /* 58 */
3784 { "(bad)", { XX } },
3785 { "(bad)", { XX } },
3786 { "(bad)", { XX } },
3787 { "phaddudq", { XM, EXq } },
3788 { "(bad)", { XX } },
3789 { "(bad)", { XX } },
3790 { "(bad)", { XX } },
3791 { "(bad)", { XX } },
3792 /* 60 */
3793 { "(bad)", { XX } },
3794 { "phsubbw", { XM, EXq } },
3795 { "phsubbd", { XM, EXq } },
3796 { "phsubbq", { XM, EXq } },
3797 { "(bad)", { XX } },
3798 { "(bad)", { XX } },
3799 { "(bad)", { XX } },
3800 { "(bad)", { XX } },
3801 /* 68 */
3802 { "(bad)", { XX } },
3803 { "(bad)", { XX } },
3804 { "(bad)", { XX } },
3805 { "(bad)", { XX } },
3806 { "(bad)", { XX } },
3807 { "(bad)", { XX } },
3808 { "(bad)", { XX } },
3809 { "(bad)", { XX } },
3810 /* 70 */
3811 { "(bad)", { XX } },
3812 { "(bad)", { XX } },
3813 { "(bad)", { XX } },
3814 { "(bad)", { XX } },
3815 { "(bad)", { XX } },
3816 { "(bad)", { XX } },
3817 { "(bad)", { XX } },
3818 { "(bad)", { XX } },
3819 /* 78 */
3820 { "(bad)", { XX } },
3821 { "(bad)", { XX } },
3822 { "(bad)", { XX } },
3823 { "(bad)", { XX } },
3824 { "(bad)", { XX } },
3825 { "(bad)", { XX } },
3826 { "(bad)", { XX } },
3827 { "(bad)", { XX } },
3828 /* 80 */
3829 { "(bad)", { XX } },
3830 { "(bad)", { XX } },
3831 { "(bad)", { XX } },
3832 { "(bad)", { XX } },
3833 { "(bad)", { XX } },
3834 { "(bad)", { XX } },
3835 { "(bad)", { XX } },
3836 { "(bad)", { XX } },
3837 /* 88 */
3838 { "(bad)", { XX } },
3839 { "(bad)", { XX } },
3840 { "(bad)", { XX } },
3841 { "(bad)", { XX } },
3842 { "(bad)", { XX } },
3843 { "(bad)", { XX } },
3844 { "(bad)", { XX } },
3845 { "(bad)", { XX } },
3846 /* 90 */
3847 { "(bad)", { XX } },
3848 { "(bad)", { XX } },
3849 { "(bad)", { XX } },
3850 { "(bad)", { XX } },
3851 { "(bad)", { XX } },
3852 { "(bad)", { XX } },
3853 { "(bad)", { XX } },
3854 { "(bad)", { XX } },
3855 /* 98 */
3856 { "(bad)", { XX } },
3857 { "(bad)", { XX } },
3858 { "(bad)", { XX } },
3859 { "(bad)", { XX } },
3860 { "(bad)", { XX } },
3861 { "(bad)", { XX } },
3862 { "(bad)", { XX } },
3863 { "(bad)", { XX } },
3864 /* a0 */
3865 { "(bad)", { XX } },
3866 { "(bad)", { XX } },
3867 { "(bad)", { XX } },
3868 { "(bad)", { XX } },
3869 { "(bad)", { XX } },
3870 { "(bad)", { XX } },
3871 { "(bad)", { XX } },
3872 { "(bad)", { XX } },
3873 /* a8 */
3874 { "(bad)", { XX } },
3875 { "(bad)", { XX } },
3876 { "(bad)", { XX } },
3877 { "(bad)", { XX } },
3878 { "(bad)", { XX } },
3879 { "(bad)", { XX } },
3880 { "(bad)", { XX } },
3881 { "(bad)", { XX } },
3882 /* b0 */
3883 { "(bad)", { XX } },
3884 { "(bad)", { XX } },
3885 { "(bad)", { XX } },
3886 { "(bad)", { XX } },
3887 { "(bad)", { XX } },
3888 { "(bad)", { XX } },
3889 { "(bad)", { XX } },
3890 { "(bad)", { XX } },
3891 /* b8 */
3892 { "(bad)", { XX } },
3893 { "(bad)", { XX } },
3894 { "(bad)", { XX } },
3895 { "(bad)", { XX } },
3896 { "(bad)", { XX } },
3897 { "(bad)", { XX } },
3898 { "(bad)", { XX } },
3899 { "(bad)", { XX } },
3900 /* c0 */
3901 { "(bad)", { XX } },
3902 { "(bad)", { XX } },
3903 { "(bad)", { XX } },
3904 { "(bad)", { XX } },
3905 { "(bad)", { XX } },
3906 { "(bad)", { XX } },
3907 { "(bad)", { XX } },
3908 { "(bad)", { XX } },
3909 /* c8 */
3910 { "(bad)", { XX } },
3911 { "(bad)", { XX } },
3912 { "(bad)", { XX } },
3913 { "(bad)", { XX } },
3914 { "(bad)", { XX } },
3915 { "(bad)", { XX } },
3916 { "(bad)", { XX } },
3917 { "(bad)", { XX } },
3918 /* d0 */
3919 { "(bad)", { XX } },
3920 { "(bad)", { XX } },
3921 { "(bad)", { XX } },
3922 { "(bad)", { XX } },
3923 { "(bad)", { XX } },
3924 { "(bad)", { XX } },
3925 { "(bad)", { XX } },
3926 { "(bad)", { XX } },
3927 /* d8 */
3928 { "(bad)", { XX } },
3929 { "(bad)", { XX } },
3930 { "(bad)", { XX } },
3931 { "(bad)", { XX } },
3932 { "(bad)", { XX } },
3933 { "(bad)", { XX } },
3934 { "(bad)", { XX } },
3935 { "(bad)", { XX } },
3936 /* e0 */
3937 { "(bad)", { XX } },
3938 { "(bad)", { XX } },
3939 { "(bad)", { XX } },
3940 { "(bad)", { XX } },
3941 { "(bad)", { XX } },
3942 { "(bad)", { XX } },
3943 { "(bad)", { XX } },
3944 { "(bad)", { XX } },
3945 /* e8 */
3946 { "(bad)", { XX } },
3947 { "(bad)", { XX } },
3948 { "(bad)", { XX } },
3949 { "(bad)", { XX } },
3950 { "(bad)", { XX } },
3951 { "(bad)", { XX } },
3952 { "(bad)", { XX } },
3953 { "(bad)", { XX } },
3954 /* f0 */
3955 { "(bad)", { XX } },
3956 { "(bad)", { XX } },
3957 { "(bad)", { XX } },
3958 { "(bad)", { XX } },
3959 { "(bad)", { XX } },
3960 { "(bad)", { XX } },
3961 { "(bad)", { XX } },
3962 { "(bad)", { XX } },
3963 /* f8 */
3964 { "(bad)", { XX } },
3965 { "(bad)", { XX } },
3966 { "(bad)", { XX } },
3967 { "(bad)", { XX } },
3968 { "(bad)", { XX } },
3969 { "(bad)", { XX } },
3970 { "(bad)", { XX } },
3971 { "(bad)", { XX } },
3972 },
3973 /* THREE_BYTE_SSE5_0F7B */
3974 {
3975 /* 00 */
3976 { "(bad)", { XX } },
3977 { "(bad)", { XX } },
3978 { "(bad)", { XX } },
3979 { "(bad)", { XX } },
3980 { "(bad)", { XX } },
3981 { "(bad)", { XX } },
3982 { "(bad)", { XX } },
3983 { "(bad)", { XX } },
3984 /* 08 */
3985 { "(bad)", { XX } },
3986 { "(bad)", { XX } },
3987 { "(bad)", { XX } },
3988 { "(bad)", { XX } },
3989 { "(bad)", { XX } },
3990 { "(bad)", { XX } },
3991 { "(bad)", { XX } },
3992 { "(bad)", { XX } },
3993 /* 10 */
3994 { "(bad)", { XX } },
3995 { "(bad)", { XX } },
3996 { "(bad)", { XX } },
3997 { "(bad)", { XX } },
3998 { "(bad)", { XX } },
3999 { "(bad)", { XX } },
4000 { "(bad)", { XX } },
4001 { "(bad)", { XX } },
4002 /* 18 */
4003 { "(bad)", { XX } },
4004 { "(bad)", { XX } },
4005 { "(bad)", { XX } },
4006 { "(bad)", { XX } },
4007 { "(bad)", { XX } },
4008 { "(bad)", { XX } },
4009 { "(bad)", { XX } },
4010 { "(bad)", { XX } },
4011 /* 20 */
4012 { "(bad)", { XX } },
4013 { "(bad)", { XX } },
4014 { "(bad)", { XX } },
4015 { "(bad)", { XX } },
4016 { "(bad)", { XX } },
4017 { "(bad)", { XX } },
4018 { "(bad)", { XX } },
4019 { "(bad)", { XX } },
4020 /* 28 */
4021 { "(bad)", { XX } },
4022 { "(bad)", { XX } },
4023 { "(bad)", { XX } },
4024 { "(bad)", { XX } },
4025 { "(bad)", { XX } },
4026 { "(bad)", { XX } },
4027 { "(bad)", { XX } },
4028 { "(bad)", { XX } },
4029 /* 30 */
4030 { "(bad)", { XX } },
4031 { "(bad)", { XX } },
4032 { "(bad)", { XX } },
4033 { "(bad)", { XX } },
4034 { "(bad)", { XX } },
4035 { "(bad)", { XX } },
4036 { "(bad)", { XX } },
4037 { "(bad)", { XX } },
4038 /* 38 */
4039 { "(bad)", { XX } },
4040 { "(bad)", { XX } },
4041 { "(bad)", { XX } },
4042 { "(bad)", { XX } },
4043 { "(bad)", { XX } },
4044 { "(bad)", { XX } },
4045 { "(bad)", { XX } },
4046 { "(bad)", { XX } },
4047 /* 40 */
4048 { "protb", { XM, EXq, Ib } },
4049 { "protw", { XM, EXq, Ib } },
4050 { "protd", { XM, EXq, Ib } },
4051 { "protq", { XM, EXq, Ib } },
4052 { "pshlb", { XM, EXq, Ib } },
4053 { "pshlw", { XM, EXq, Ib } },
4054 { "pshld", { XM, EXq, Ib } },
4055 { "pshlq", { XM, EXq, Ib } },
4056 /* 48 */
4057 { "pshab", { XM, EXq, Ib } },
4058 { "pshaw", { XM, EXq, Ib } },
4059 { "pshad", { XM, EXq, Ib } },
4060 { "pshaq", { XM, EXq, Ib } },
4061 { "(bad)", { XX } },
4062 { "(bad)", { XX } },
4063 { "(bad)", { XX } },
4064 { "(bad)", { XX } },
4065 /* 50 */
4066 { "(bad)", { XX } },
4067 { "(bad)", { XX } },
4068 { "(bad)", { XX } },
4069 { "(bad)", { XX } },
4070 { "(bad)", { XX } },
4071 { "(bad)", { XX } },
4072 { "(bad)", { XX } },
4073 { "(bad)", { XX } },
4074 /* 58 */
4075 { "(bad)", { XX } },
4076 { "(bad)", { XX } },
4077 { "(bad)", { XX } },
4078 { "(bad)", { XX } },
4079 { "(bad)", { XX } },
4080 { "(bad)", { XX } },
4081 { "(bad)", { XX } },
4082 { "(bad)", { XX } },
4083 /* 60 */
4084 { "(bad)", { XX } },
4085 { "(bad)", { XX } },
4086 { "(bad)", { XX } },
4087 { "(bad)", { XX } },
4088 { "(bad)", { XX } },
4089 { "(bad)", { XX } },
4090 { "(bad)", { XX } },
4091 { "(bad)", { XX } },
4092 /* 68 */
4093 { "(bad)", { XX } },
4094 { "(bad)", { XX } },
4095 { "(bad)", { XX } },
4096 { "(bad)", { XX } },
4097 { "(bad)", { XX } },
4098 { "(bad)", { XX } },
4099 { "(bad)", { XX } },
4100 { "(bad)", { XX } },
4101 /* 70 */
4102 { "(bad)", { XX } },
4103 { "(bad)", { XX } },
4104 { "(bad)", { XX } },
4105 { "(bad)", { XX } },
4106 { "(bad)", { XX } },
4107 { "(bad)", { XX } },
4108 { "(bad)", { XX } },
4109 { "(bad)", { XX } },
4110 /* 78 */
4111 { "(bad)", { XX } },
4112 { "(bad)", { XX } },
4113 { "(bad)", { XX } },
4114 { "(bad)", { XX } },
4115 { "(bad)", { XX } },
4116 { "(bad)", { XX } },
4117 { "(bad)", { XX } },
4118 { "(bad)", { XX } },
4119 /* 80 */
4120 { "(bad)", { XX } },
4121 { "(bad)", { XX } },
4122 { "(bad)", { XX } },
4123 { "(bad)", { XX } },
4124 { "(bad)", { XX } },
4125 { "(bad)", { XX } },
4126 { "(bad)", { XX } },
4127 { "(bad)", { XX } },
4128 /* 88 */
4129 { "(bad)", { XX } },
4130 { "(bad)", { XX } },
4131 { "(bad)", { XX } },
4132 { "(bad)", { XX } },
4133 { "(bad)", { XX } },
4134 { "(bad)", { XX } },
4135 { "(bad)", { XX } },
4136 { "(bad)", { XX } },
4137 /* 90 */
4138 { "(bad)", { XX } },
4139 { "(bad)", { XX } },
4140 { "(bad)", { XX } },
4141 { "(bad)", { XX } },
4142 { "(bad)", { XX } },
4143 { "(bad)", { XX } },
4144 { "(bad)", { XX } },
4145 { "(bad)", { XX } },
4146 /* 98 */
4147 { "(bad)", { XX } },
4148 { "(bad)", { XX } },
4149 { "(bad)", { XX } },
4150 { "(bad)", { XX } },
4151 { "(bad)", { XX } },
4152 { "(bad)", { XX } },
4153 { "(bad)", { XX } },
4154 { "(bad)", { XX } },
4155 /* a0 */
4156 { "(bad)", { XX } },
4157 { "(bad)", { XX } },
4158 { "(bad)", { XX } },
4159 { "(bad)", { XX } },
4160 { "(bad)", { XX } },
4161 { "(bad)", { XX } },
4162 { "(bad)", { XX } },
4163 { "(bad)", { XX } },
4164 /* a8 */
4165 { "(bad)", { XX } },
4166 { "(bad)", { XX } },
4167 { "(bad)", { XX } },
4168 { "(bad)", { XX } },
4169 { "(bad)", { XX } },
4170 { "(bad)", { XX } },
4171 { "(bad)", { XX } },
4172 { "(bad)", { XX } },
4173 /* b0 */
4174 { "(bad)", { XX } },
4175 { "(bad)", { XX } },
4176 { "(bad)", { XX } },
4177 { "(bad)", { XX } },
4178 { "(bad)", { XX } },
4179 { "(bad)", { XX } },
4180 { "(bad)", { XX } },
4181 { "(bad)", { XX } },
4182 /* b8 */
4183 { "(bad)", { XX } },
4184 { "(bad)", { XX } },
4185 { "(bad)", { XX } },
4186 { "(bad)", { XX } },
4187 { "(bad)", { XX } },
4188 { "(bad)", { XX } },
4189 { "(bad)", { XX } },
4190 { "(bad)", { XX } },
4191 /* c0 */
4192 { "(bad)", { XX } },
4193 { "(bad)", { XX } },
4194 { "(bad)", { XX } },
4195 { "(bad)", { XX } },
4196 { "(bad)", { XX } },
4197 { "(bad)", { XX } },
4198 { "(bad)", { XX } },
4199 { "(bad)", { XX } },
4200 /* c8 */
4201 { "(bad)", { XX } },
4202 { "(bad)", { XX } },
4203 { "(bad)", { XX } },
4204 { "(bad)", { XX } },
4205 { "(bad)", { XX } },
4206 { "(bad)", { XX } },
4207 { "(bad)", { XX } },
4208 { "(bad)", { XX } },
4209 /* d0 */
4210 { "(bad)", { XX } },
4211 { "(bad)", { XX } },
4212 { "(bad)", { XX } },
4213 { "(bad)", { XX } },
4214 { "(bad)", { XX } },
4215 { "(bad)", { XX } },
4216 { "(bad)", { XX } },
4217 { "(bad)", { XX } },
4218 /* d8 */
4219 { "(bad)", { XX } },
4220 { "(bad)", { XX } },
4221 { "(bad)", { XX } },
4222 { "(bad)", { XX } },
4223 { "(bad)", { XX } },
4224 { "(bad)", { XX } },
4225 { "(bad)", { XX } },
4226 { "(bad)", { XX } },
4227 /* e0 */
4228 { "(bad)", { XX } },
4229 { "(bad)", { XX } },
4230 { "(bad)", { XX } },
4231 { "(bad)", { XX } },
4232 { "(bad)", { XX } },
4233 { "(bad)", { XX } },
4234 { "(bad)", { XX } },
4235 { "(bad)", { XX } },
4236 /* e8 */
4237 { "(bad)", { XX } },
4238 { "(bad)", { XX } },
4239 { "(bad)", { XX } },
4240 { "(bad)", { XX } },
4241 { "(bad)", { XX } },
4242 { "(bad)", { XX } },
4243 { "(bad)", { XX } },
4244 { "(bad)", { XX } },
4245 /* f0 */
4246 { "(bad)", { XX } },
4247 { "(bad)", { XX } },
4248 { "(bad)", { XX } },
4249 { "(bad)", { XX } },
4250 { "(bad)", { XX } },
4251 { "(bad)", { XX } },
4252 { "(bad)", { XX } },
4253 { "(bad)", { XX } },
4254 /* f8 */
4255 { "(bad)", { XX } },
4256 { "(bad)", { XX } },
4257 { "(bad)", { XX } },
4258 { "(bad)", { XX } },
4259 { "(bad)", { XX } },
4260 { "(bad)", { XX } },
4261 { "(bad)", { XX } },
4262 { "(bad)", { XX } },
4263 }
4264 };
4265
4266 static const struct dis386 opc_ext_table[][2] = {
4267 {
4268 /* OPC_EXT_0 */
4269 { "leaS", { Gv, M } },
4270 { "(bad)", { XX } },
4271 },
4272 {
4273 /* OPC_EXT_1 */
4274 { "les{S|}", { Gv, Mp } },
4275 { "(bad)", { XX } },
4276 },
4277 {
4278 /* OPC_EXT_2 */
4279 { "ldsS", { Gv, Mp } },
4280 { "(bad)", { XX } },
4281 },
4282 {
4283 /* OPC_EXT_3 */
4284 { "lssS", { Gv, Mp } },
4285 { "(bad)", { XX } },
4286 },
4287 {
4288 /* OPC_EXT_4 */
4289 { "lfsS", { Gv, Mp } },
4290 { "(bad)", { XX } },
4291 },
4292 {
4293 /* OPC_EXT_5 */
4294 { "lgsS", { Gv, Mp } },
4295 { "(bad)", { XX } },
4296 },
4297 {
4298 /* OPC_EXT_6 */
4299 { "sgdt{Q|IQ||}", { M } },
4300 { OPC_EXT_RM_0 },
4301 },
4302 {
4303 /* OPC_EXT_7 */
4304 { "sidt{Q|IQ||}", { M } },
4305 { OPC_EXT_RM_1 },
4306 },
4307 {
4308 /* OPC_EXT_8 */
4309 { "lgdt{Q|Q||}", { M } },
4310 { "(bad)", { XX } },
4311 },
4312 {
4313 /* OPC_EXT_9 */
4314 { PREGRP98 },
4315 { "(bad)", { XX } },
4316 },
4317 {
4318 /* OPC_EXT_10 */
4319 { "vmptrst", { Mq } },
4320 { "(bad)", { XX } },
4321 },
4322 {
4323 /* OPC_EXT_11 */
4324 { "(bad)", { XX } },
4325 { "psrlw", { MS, Ib } },
4326 },
4327 {
4328 /* OPC_EXT_12 */
4329 { "(bad)", { XX } },
4330 { "psraw", { MS, Ib } },
4331 },
4332 {
4333 /* OPC_EXT_13 */
4334 { "(bad)", { XX } },
4335 { "psllw", { MS, Ib } },
4336 },
4337 {
4338 /* OPC_EXT_14 */
4339 { "(bad)", { XX } },
4340 { "psrld", { MS, Ib } },
4341 },
4342 {
4343 /* OPC_EXT_15 */
4344 { "(bad)", { XX } },
4345 { "psrad", { MS, Ib } },
4346 },
4347 {
4348 /* OPC_EXT_16 */
4349 { "(bad)", { XX } },
4350 { "pslld", { MS, Ib } },
4351 },
4352 {
4353 /* OPC_EXT_17 */
4354 { "(bad)", { XX } },
4355 { "psrlq", { MS, Ib } },
4356 },
4357 {
4358 /* OPC_EXT_18 */
4359 { "(bad)", { XX } },
4360 { PREGRP99 },
4361 },
4362 {
4363 /* OPC_EXT_19 */
4364 { "(bad)", { XX } },
4365 { "psllq", { MS, Ib } },
4366 },
4367 {
4368 /* OPC_EXT_20 */
4369 { "(bad)", { XX } },
4370 { PREGRP100 },
4371 },
4372 {
4373 /* OPC_EXT_21 */
4374 { "fxsave", { M } },
4375 { "(bad)", { XX } },
4376 },
4377 {
4378 /* OPC_EXT_22 */
4379 { "fxrstor", { M } },
4380 { "(bad)", { XX } },
4381 },
4382 {
4383 /* OPC_EXT_23 */
4384 { "ldmxcsr", { Md } },
4385 { "(bad)", { XX } },
4386 },
4387 {
4388 /* OPC_EXT_24 */
4389 { "stmxcsr", { Md } },
4390 { "(bad)", { XX } },
4391 },
4392 {
4393 /* OPC_EXT_25 */
4394 { "(bad)", { XX } },
4395 { OPC_EXT_RM_2 },
4396 },
4397 {
4398 /* OPC_EXT_26 */
4399 { "(bad)", { XX } },
4400 { OPC_EXT_RM_3 },
4401 },
4402 {
4403 /* OPC_EXT_27 */
4404 { "clflush", { Mb } },
4405 { OPC_EXT_RM_4 },
4406 },
4407 {
4408 /* OPC_EXT_28 */
4409 { "prefetchnta", { Mb } },
4410 { "(bad)", { XX } },
4411 },
4412 {
4413 /* OPC_EXT_29 */
4414 { "prefetcht0", { Mb } },
4415 { "(bad)", { XX } },
4416 },
4417 {
4418 /* OPC_EXT_30 */
4419 { "prefetcht1", { Mb } },
4420 { "(bad)", { XX } },
4421 },
4422 {
4423 /* OPC_EXT_31 */
4424 { "prefetcht2", { Mb } },
4425 { "(bad)", { XX } },
4426 },
4427 {
4428 /* OPC_EXT_32 */
4429 { "lddqu", { XM, M } },
4430 { "(bad)", { XX } },
4431 },
4432 {
4433 /* OPC_EXT_33 */
4434 { "bound{S|}", { Gv, Ma } },
4435 { "(bad)", { XX } },
4436 },
4437 {
4438 /* OPC_EXT_34 */
4439 { "movlpX", { EXq, XM } },
4440 { "(bad)", { XX } },
4441 },
4442 {
4443 /* OPC_EXT_35 */
4444 { "movhpX", { EXq, XM } },
4445 { "(bad)", { XX } },
4446 },
4447 {
4448 /* OPC_EXT_36 */
4449 { "movlpX", { XM, EXq } },
4450 { "movhlpX", { XM, EXq } },
4451 },
4452 {
4453 /* OPC_EXT_37 */
4454 { "movhpX", { XM, EXq } },
4455 { "movlhpX", { XM, EXq } },
4456 },
4457 {
4458 /* OPC_EXT_38 */
4459 { "invlpg", { Mb } },
4460 { OPC_EXT_RM_5 },
4461 },
4462 {
4463 /* OPC_EXT_39 */
4464 { "lidt{Q|Q||}", { M } },
4465 { OPC_EXT_RM_6 },
4466 },
4467 {
4468 /* OPC_EXT_40 */
4469 { "(bad)", { XX } },
4470 { "movZ", { Rm, Cm } },
4471 },
4472 {
4473 /* OPC_EXT_41 */
4474 { "(bad)", { XX } },
4475 { "movZ", { Rm, Dm } },
4476 },
4477 {
4478 /* OPC_EXT_42 */
4479 { "(bad)", { XX } },
4480 { "movZ", { Cm, Rm } },
4481 },
4482 {
4483 /* OPC_EXT_43 */
4484 { "(bad)", { XX } },
4485 { "movZ", { Dm, Rm } },
4486 },
4487 {
4488 /* OPC_EXT_44 */
4489 { THREE_BYTE_SSE5_0F24 },
4490 { "movL", { Rd, Td } },
4491 },
4492 {
4493 /* OPC_EXT_45 */
4494 { "(bad)", { XX } },
4495 { "movL", { Td, Rd } },
4496 },
4497 };
4498
4499 static const struct dis386 opc_ext_rm_table[][8] = {
4500 {
4501 /* OPC_EXT_RM_0 */
4502 { "(bad)", { XX } },
4503 { "vmcall", { Skip_MODRM } },
4504 { "vmlaunch", { Skip_MODRM } },
4505 { "vmresume", { Skip_MODRM } },
4506 { "vmxoff", { Skip_MODRM } },
4507 { "(bad)", { XX } },
4508 { "(bad)", { XX } },
4509 { "(bad)", { XX } },
4510 },
4511 {
4512 /* OPC_EXT_RM_1 */
4513 { "monitor", { { OP_Monitor, 0 } } },
4514 { "mwait", { { OP_Mwait, 0 } } },
4515 { "(bad)", { XX } },
4516 { "(bad)", { XX } },
4517 { "(bad)", { XX } },
4518 { "(bad)", { XX } },
4519 { "(bad)", { XX } },
4520 { "(bad)", { XX } },
4521 },
4522 {
4523 /* OPC_EXT_RM_2 */
4524 { "lfence", { Skip_MODRM } },
4525 { "(bad)", { XX } },
4526 { "(bad)", { XX } },
4527 { "(bad)", { XX } },
4528 { "(bad)", { XX } },
4529 { "(bad)", { XX } },
4530 { "(bad)", { XX } },
4531 { "(bad)", { XX } },
4532 },
4533 {
4534 /* OPC_EXT_RM_3 */
4535 { "mfence", { Skip_MODRM } },
4536 { "(bad)", { XX } },
4537 { "(bad)", { XX } },
4538 { "(bad)", { XX } },
4539 { "(bad)", { XX } },
4540 { "(bad)", { XX } },
4541 { "(bad)", { XX } },
4542 { "(bad)", { XX } },
4543 },
4544 {
4545 /* OPC_EXT_RM_4 */
4546 { "sfence", { Skip_MODRM } },
4547 { "(bad)", { XX } },
4548 { "(bad)", { XX } },
4549 { "(bad)", { XX } },
4550 { "(bad)", { XX } },
4551 { "(bad)", { XX } },
4552 { "(bad)", { XX } },
4553 { "(bad)", { XX } },
4554 },
4555 {
4556 /* OPC_EXT_RM_5 */
4557 { "swapgs", { Skip_MODRM } },
4558 { "rdtscp", { Skip_MODRM } },
4559 { "(bad)", { XX } },
4560 { "(bad)", { XX } },
4561 { "(bad)", { XX } },
4562 { "(bad)", { XX } },
4563 { "(bad)", { XX } },
4564 { "(bad)", { XX } },
4565 },
4566 {
4567 /* OPC_EXT_RM_6 */
4568 { "vmrun", { Skip_MODRM } },
4569 { "vmmcall", { Skip_MODRM } },
4570 { "vmload", { Skip_MODRM } },
4571 { "vmsave", { Skip_MODRM } },
4572 { "stgi", { Skip_MODRM } },
4573 { "clgi", { Skip_MODRM } },
4574 { "skinit", { Skip_MODRM } },
4575 { "invlpga", { Skip_MODRM } },
4576 },
4577 };
4578
4579 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
4580
4581 static void
4582 ckprefix (void)
4583 {
4584 int newrex;
4585 rex = 0;
4586 prefixes = 0;
4587 used_prefixes = 0;
4588 rex_used = 0;
4589 while (1)
4590 {
4591 FETCH_DATA (the_info, codep + 1);
4592 newrex = 0;
4593 switch (*codep)
4594 {
4595 /* REX prefixes family. */
4596 case 0x40:
4597 case 0x41:
4598 case 0x42:
4599 case 0x43:
4600 case 0x44:
4601 case 0x45:
4602 case 0x46:
4603 case 0x47:
4604 case 0x48:
4605 case 0x49:
4606 case 0x4a:
4607 case 0x4b:
4608 case 0x4c:
4609 case 0x4d:
4610 case 0x4e:
4611 case 0x4f:
4612 if (address_mode == mode_64bit)
4613 newrex = *codep;
4614 else
4615 return;
4616 break;
4617 case 0xf3:
4618 prefixes |= PREFIX_REPZ;
4619 break;
4620 case 0xf2:
4621 prefixes |= PREFIX_REPNZ;
4622 break;
4623 case 0xf0:
4624 prefixes |= PREFIX_LOCK;
4625 break;
4626 case 0x2e:
4627 prefixes |= PREFIX_CS;
4628 break;
4629 case 0x36:
4630 prefixes |= PREFIX_SS;
4631 break;
4632 case 0x3e:
4633 prefixes |= PREFIX_DS;
4634 break;
4635 case 0x26:
4636 prefixes |= PREFIX_ES;
4637 break;
4638 case 0x64:
4639 prefixes |= PREFIX_FS;
4640 break;
4641 case 0x65:
4642 prefixes |= PREFIX_GS;
4643 break;
4644 case 0x66:
4645 prefixes |= PREFIX_DATA;
4646 break;
4647 case 0x67:
4648 prefixes |= PREFIX_ADDR;
4649 break;
4650 case FWAIT_OPCODE:
4651 /* fwait is really an instruction. If there are prefixes
4652 before the fwait, they belong to the fwait, *not* to the
4653 following instruction. */
4654 if (prefixes || rex)
4655 {
4656 prefixes |= PREFIX_FWAIT;
4657 codep++;
4658 return;
4659 }
4660 prefixes = PREFIX_FWAIT;
4661 break;
4662 default:
4663 return;
4664 }
4665 /* Rex is ignored when followed by another prefix. */
4666 if (rex)
4667 {
4668 rex_used = rex;
4669 return;
4670 }
4671 rex = newrex;
4672 codep++;
4673 }
4674 }
4675
4676 /* Return the name of the prefix byte PREF, or NULL if PREF is not a
4677 prefix byte. */
4678
4679 static const char *
4680 prefix_name (int pref, int sizeflag)
4681 {
4682 static const char *rexes [16] =
4683 {
4684 "rex", /* 0x40 */
4685 "rex.B", /* 0x41 */
4686 "rex.X", /* 0x42 */
4687 "rex.XB", /* 0x43 */
4688 "rex.R", /* 0x44 */
4689 "rex.RB", /* 0x45 */
4690 "rex.RX", /* 0x46 */
4691 "rex.RXB", /* 0x47 */
4692 "rex.W", /* 0x48 */
4693 "rex.WB", /* 0x49 */
4694 "rex.WX", /* 0x4a */
4695 "rex.WXB", /* 0x4b */
4696 "rex.WR", /* 0x4c */
4697 "rex.WRB", /* 0x4d */
4698 "rex.WRX", /* 0x4e */
4699 "rex.WRXB", /* 0x4f */
4700 };
4701
4702 switch (pref)
4703 {
4704 /* REX prefixes family. */
4705 case 0x40:
4706 case 0x41:
4707 case 0x42:
4708 case 0x43:
4709 case 0x44:
4710 case 0x45:
4711 case 0x46:
4712 case 0x47:
4713 case 0x48:
4714 case 0x49:
4715 case 0x4a:
4716 case 0x4b:
4717 case 0x4c:
4718 case 0x4d:
4719 case 0x4e:
4720 case 0x4f:
4721 return rexes [pref - 0x40];
4722 case 0xf3:
4723 return "repz";
4724 case 0xf2:
4725 return "repnz";
4726 case 0xf0:
4727 return "lock";
4728 case 0x2e:
4729 return "cs";
4730 case 0x36:
4731 return "ss";
4732 case 0x3e:
4733 return "ds";
4734 case 0x26:
4735 return "es";
4736 case 0x64:
4737 return "fs";
4738 case 0x65:
4739 return "gs";
4740 case 0x66:
4741 return (sizeflag & DFLAG) ? "data16" : "data32";
4742 case 0x67:
4743 if (address_mode == mode_64bit)
4744 return (sizeflag & AFLAG) ? "addr32" : "addr64";
4745 else
4746 return (sizeflag & AFLAG) ? "addr16" : "addr32";
4747 case FWAIT_OPCODE:
4748 return "fwait";
4749 default:
4750 return NULL;
4751 }
4752 }
4753
4754 static char op_out[MAX_OPERANDS][100];
4755 static int op_ad, op_index[MAX_OPERANDS];
4756 static int two_source_ops;
4757 static bfd_vma op_address[MAX_OPERANDS];
4758 static bfd_vma op_riprel[MAX_OPERANDS];
4759 static bfd_vma start_pc;
4760
4761 /*
4762 * On the 386's of 1988, the maximum length of an instruction is 15 bytes.
4763 * (see topic "Redundant prefixes" in the "Differences from 8086"
4764 * section of the "Virtual 8086 Mode" chapter.)
4765 * 'pc' should be the address of this instruction, it will
4766 * be used to print the target address if this is a relative jump or call
4767 * The function returns the length of this instruction in bytes.
4768 */
4769
4770 static char intel_syntax;
4771 static char open_char;
4772 static char close_char;
4773 static char separator_char;
4774 static char scale_char;
4775
4776 /* Here for backwards compatibility. When gdb stops using
4777 print_insn_i386_att and print_insn_i386_intel these functions can
4778 disappear, and print_insn_i386 be merged into print_insn. */
4779 int
4780 print_insn_i386_att (bfd_vma pc, disassemble_info *info)
4781 {
4782 intel_syntax = 0;
4783
4784 return print_insn (pc, info);
4785 }
4786
4787 int
4788 print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
4789 {
4790 intel_syntax = 1;
4791
4792 return print_insn (pc, info);
4793 }
4794
4795 int
4796 print_insn_i386 (bfd_vma pc, disassemble_info *info)
4797 {
4798 intel_syntax = -1;
4799
4800 return print_insn (pc, info);
4801 }
4802
4803 void
4804 print_i386_disassembler_options (FILE *stream)
4805 {
4806 fprintf (stream, _("\n\
4807 The following i386/x86-64 specific disassembler options are supported for use\n\
4808 with the -M switch (multiple options should be separated by commas):\n"));
4809
4810 fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
4811 fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
4812 fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
4813 fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
4814 fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
4815 fprintf (stream, _(" addr64 Assume 64bit address size\n"));
4816 fprintf (stream, _(" addr32 Assume 32bit address size\n"));
4817 fprintf (stream, _(" addr16 Assume 16bit address size\n"));
4818 fprintf (stream, _(" data32 Assume 32bit data size\n"));
4819 fprintf (stream, _(" data16 Assume 16bit data size\n"));
4820 fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
4821 }
4822
4823 /* Get a pointer to struct dis386 with a valid name. */
4824
4825 static const struct dis386 *
4826 get_valid_dis386 (const struct dis386 *dp, disassemble_info *info)
4827 {
4828 int index;
4829
4830 if (dp->name != NULL)
4831 return dp;
4832
4833 switch (dp->op[0].bytemode)
4834 {
4835 case USE_GROUPS:
4836 dp = &grps[dp->op[1].bytemode][modrm.reg];
4837 break;
4838
4839 case USE_PREFIX_USER_TABLE:
4840 index = 0;
4841 used_prefixes |= (prefixes & PREFIX_REPZ);
4842 if (prefixes & PREFIX_REPZ)
4843 {
4844 index = 1;
4845 repz_prefix = NULL;
4846 }
4847 else
4848 {
4849 /* We should check PREFIX_REPNZ and PREFIX_REPZ before
4850 PREFIX_DATA. */
4851 used_prefixes |= (prefixes & PREFIX_REPNZ);
4852 if (prefixes & PREFIX_REPNZ)
4853 {
4854 index = 3;
4855 repnz_prefix = NULL;
4856 }
4857 else
4858 {
4859 used_prefixes |= (prefixes & PREFIX_DATA);
4860 if (prefixes & PREFIX_DATA)
4861 {
4862 index = 2;
4863 data_prefix = NULL;
4864 }
4865 }
4866 }
4867 dp = &prefix_user_table[dp->op[1].bytemode][index];
4868 break;
4869
4870 case X86_64_SPECIAL:
4871 index = address_mode == mode_64bit ? 1 : 0;
4872 dp = &x86_64_table[dp->op[1].bytemode][index];
4873 break;
4874
4875 case IS_3BYTE_OPCODE:
4876 FETCH_DATA (info, codep + 2);
4877 index = *codep++;
4878 dp = &three_byte_table[dp->op[1].bytemode][index];
4879 modrm.mod = (*codep >> 6) & 3;
4880 modrm.reg = (*codep >> 3) & 7;
4881 modrm.rm = *codep & 7;
4882 break;
4883
4884 case USE_OPC_EXT_TABLE:
4885 index = modrm.mod == 0x3 ? 1 : 0;
4886 dp = &opc_ext_table[dp->op[1].bytemode][index];
4887 break;
4888
4889 case USE_OPC_EXT_RM_TABLE:
4890 index = modrm.rm;
4891 dp = &opc_ext_rm_table[dp->op[1].bytemode][index];
4892 break;
4893
4894 default:
4895 oappend (INTERNAL_DISASSEMBLER_ERROR);
4896 return NULL;
4897 }
4898
4899 if (dp->name != NULL)
4900 return dp;
4901 else
4902 return get_valid_dis386 (dp, info);
4903 }
4904
4905 static int
4906 print_insn (bfd_vma pc, disassemble_info *info)
4907 {
4908 const struct dis386 *dp;
4909 int i;
4910 char *op_txt[MAX_OPERANDS];
4911 int needcomma;
4912 int sizeflag;
4913 const char *p;
4914 struct dis_private priv;
4915 unsigned char op;
4916 char prefix_obuf[32];
4917 char *prefix_obufp;
4918
4919 if (info->mach == bfd_mach_x86_64_intel_syntax
4920 || info->mach == bfd_mach_x86_64)
4921 address_mode = mode_64bit;
4922 else
4923 address_mode = mode_32bit;
4924
4925 if (intel_syntax == (char) -1)
4926 intel_syntax = (info->mach == bfd_mach_i386_i386_intel_syntax
4927 || info->mach == bfd_mach_x86_64_intel_syntax);
4928
4929 if (info->mach == bfd_mach_i386_i386
4930 || info->mach == bfd_mach_x86_64
4931 || info->mach == bfd_mach_i386_i386_intel_syntax
4932 || info->mach == bfd_mach_x86_64_intel_syntax)
4933 priv.orig_sizeflag = AFLAG | DFLAG;
4934 else if (info->mach == bfd_mach_i386_i8086)
4935 priv.orig_sizeflag = 0;
4936 else
4937 abort ();
4938
4939 for (p = info->disassembler_options; p != NULL; )
4940 {
4941 if (CONST_STRNEQ (p, "x86-64"))
4942 {
4943 address_mode = mode_64bit;
4944 priv.orig_sizeflag = AFLAG | DFLAG;
4945 }
4946 else if (CONST_STRNEQ (p, "i386"))
4947 {
4948 address_mode = mode_32bit;
4949 priv.orig_sizeflag = AFLAG | DFLAG;
4950 }
4951 else if (CONST_STRNEQ (p, "i8086"))
4952 {
4953 address_mode = mode_16bit;
4954 priv.orig_sizeflag = 0;
4955 }
4956 else if (CONST_STRNEQ (p, "intel"))
4957 {
4958 intel_syntax = 1;
4959 }
4960 else if (CONST_STRNEQ (p, "att"))
4961 {
4962 intel_syntax = 0;
4963 }
4964 else if (CONST_STRNEQ (p, "addr"))
4965 {
4966 if (address_mode == mode_64bit)
4967 {
4968 if (p[4] == '3' && p[5] == '2')
4969 priv.orig_sizeflag &= ~AFLAG;
4970 else if (p[4] == '6' && p[5] == '4')
4971 priv.orig_sizeflag |= AFLAG;
4972 }
4973 else
4974 {
4975 if (p[4] == '1' && p[5] == '6')
4976 priv.orig_sizeflag &= ~AFLAG;
4977 else if (p[4] == '3' && p[5] == '2')
4978 priv.orig_sizeflag |= AFLAG;
4979 }
4980 }
4981 else if (CONST_STRNEQ (p, "data"))
4982 {
4983 if (p[4] == '1' && p[5] == '6')
4984 priv.orig_sizeflag &= ~DFLAG;
4985 else if (p[4] == '3' && p[5] == '2')
4986 priv.orig_sizeflag |= DFLAG;
4987 }
4988 else if (CONST_STRNEQ (p, "suffix"))
4989 priv.orig_sizeflag |= SUFFIX_ALWAYS;
4990
4991 p = strchr (p, ',');
4992 if (p != NULL)
4993 p++;
4994 }
4995
4996 if (intel_syntax)
4997 {
4998 names64 = intel_names64;
4999 names32 = intel_names32;
5000 names16 = intel_names16;
5001 names8 = intel_names8;
5002 names8rex = intel_names8rex;
5003 names_seg = intel_names_seg;
5004 index16 = intel_index16;
5005 open_char = '[';
5006 close_char = ']';
5007 separator_char = '+';
5008 scale_char = '*';
5009 }
5010 else
5011 {
5012 names64 = att_names64;
5013 names32 = att_names32;
5014 names16 = att_names16;
5015 names8 = att_names8;
5016 names8rex = att_names8rex;
5017 names_seg = att_names_seg;
5018 index16 = att_index16;
5019 open_char = '(';
5020 close_char = ')';
5021 separator_char = ',';
5022 scale_char = ',';
5023 }
5024
5025 /* The output looks better if we put 7 bytes on a line, since that
5026 puts most long word instructions on a single line. */
5027 info->bytes_per_line = 7;
5028
5029 info->private_data = &priv;
5030 priv.max_fetched = priv.the_buffer;
5031 priv.insn_start = pc;
5032
5033 obuf[0] = 0;
5034 for (i = 0; i < MAX_OPERANDS; ++i)
5035 {
5036 op_out[i][0] = 0;
5037 op_index[i] = -1;
5038 }
5039
5040 the_info = info;
5041 start_pc = pc;
5042 start_codep = priv.the_buffer;
5043 codep = priv.the_buffer;
5044
5045 if (setjmp (priv.bailout) != 0)
5046 {
5047 const char *name;
5048
5049 /* Getting here means we tried for data but didn't get it. That
5050 means we have an incomplete instruction of some sort. Just
5051 print the first byte as a prefix or a .byte pseudo-op. */
5052 if (codep > priv.the_buffer)
5053 {
5054 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
5055 if (name != NULL)
5056 (*info->fprintf_func) (info->stream, "%s", name);
5057 else
5058 {
5059 /* Just print the first byte as a .byte instruction. */
5060 (*info->fprintf_func) (info->stream, ".byte 0x%x",
5061 (unsigned int) priv.the_buffer[0]);
5062 }
5063
5064 return 1;
5065 }
5066
5067 return -1;
5068 }
5069
5070 obufp = obuf;
5071 ckprefix ();
5072
5073 insn_codep = codep;
5074 sizeflag = priv.orig_sizeflag;
5075
5076 FETCH_DATA (info, codep + 1);
5077 two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
5078
5079 if (((prefixes & PREFIX_FWAIT)
5080 && ((*codep < 0xd8) || (*codep > 0xdf)))
5081 || (rex && rex_used))
5082 {
5083 const char *name;
5084
5085 /* fwait not followed by floating point instruction, or rex followed
5086 by other prefixes. Print the first prefix. */
5087 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
5088 if (name == NULL)
5089 name = INTERNAL_DISASSEMBLER_ERROR;
5090 (*info->fprintf_func) (info->stream, "%s", name);
5091 return 1;
5092 }
5093
5094 op = 0;
5095 if (*codep == 0x0f)
5096 {
5097 unsigned char threebyte;
5098 FETCH_DATA (info, codep + 2);
5099 threebyte = *++codep;
5100 dp = &dis386_twobyte[threebyte];
5101 need_modrm = twobyte_has_modrm[*codep];
5102 codep++;
5103 }
5104 else
5105 {
5106 dp = &dis386[*codep];
5107 need_modrm = onebyte_has_modrm[*codep];
5108 codep++;
5109 }
5110
5111 if ((prefixes & PREFIX_REPZ))
5112 {
5113 repz_prefix = "repz ";
5114 used_prefixes |= PREFIX_REPZ;
5115 }
5116 else
5117 repz_prefix = NULL;
5118
5119 if ((prefixes & PREFIX_REPNZ))
5120 {
5121 repnz_prefix = "repnz ";
5122 used_prefixes |= PREFIX_REPNZ;
5123 }
5124 else
5125 repnz_prefix = NULL;
5126
5127 if ((prefixes & PREFIX_LOCK))
5128 {
5129 lock_prefix = "lock ";
5130 used_prefixes |= PREFIX_LOCK;
5131 }
5132 else
5133 lock_prefix = NULL;
5134
5135 addr_prefix = NULL;
5136 if (prefixes & PREFIX_ADDR)
5137 {
5138 sizeflag ^= AFLAG;
5139 if (dp->op[2].bytemode != loop_jcxz_mode || intel_syntax)
5140 {
5141 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
5142 addr_prefix = "addr32 ";
5143 else
5144 addr_prefix = "addr16 ";
5145 used_prefixes |= PREFIX_ADDR;
5146 }
5147 }
5148
5149 data_prefix = NULL;
5150 if ((prefixes & PREFIX_DATA))
5151 {
5152 sizeflag ^= DFLAG;
5153 if (dp->op[2].bytemode == cond_jump_mode
5154 && dp->op[0].bytemode == v_mode
5155 && !intel_syntax)
5156 {
5157 if (sizeflag & DFLAG)
5158 data_prefix = "data32 ";
5159 else
5160 data_prefix = "data16 ";
5161 used_prefixes |= PREFIX_DATA;
5162 }
5163 }
5164
5165 if (need_modrm)
5166 {
5167 FETCH_DATA (info, codep + 1);
5168 modrm.mod = (*codep >> 6) & 3;
5169 modrm.reg = (*codep >> 3) & 7;
5170 modrm.rm = *codep & 7;
5171 }
5172
5173 if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
5174 {
5175 dofloat (sizeflag);
5176 }
5177 else
5178 {
5179 dp = get_valid_dis386 (dp, info);
5180 if (dp != NULL && putop (dp->name, sizeflag) == 0)
5181 {
5182 for (i = 0; i < MAX_OPERANDS; ++i)
5183 {
5184 obufp = op_out[i];
5185 op_ad = MAX_OPERANDS - 1 - i;
5186 if (dp->op[i].rtn)
5187 (*dp->op[i].rtn) (dp->op[i].bytemode, sizeflag);
5188 }
5189 }
5190 }
5191
5192 /* See if any prefixes were not used. If so, print the first one
5193 separately. If we don't do this, we'll wind up printing an
5194 instruction stream which does not precisely correspond to the
5195 bytes we are disassembling. */
5196 if ((prefixes & ~used_prefixes) != 0)
5197 {
5198 const char *name;
5199
5200 name = prefix_name (priv.the_buffer[0], priv.orig_sizeflag);
5201 if (name == NULL)
5202 name = INTERNAL_DISASSEMBLER_ERROR;
5203 (*info->fprintf_func) (info->stream, "%s", name);
5204 return 1;
5205 }
5206 if (rex & ~rex_used)
5207 {
5208 const char *name;
5209 name = prefix_name (rex | 0x40, priv.orig_sizeflag);
5210 if (name == NULL)
5211 name = INTERNAL_DISASSEMBLER_ERROR;
5212 (*info->fprintf_func) (info->stream, "%s ", name);
5213 }
5214
5215 prefix_obuf[0] = 0;
5216 prefix_obufp = prefix_obuf;
5217 if (lock_prefix)
5218 prefix_obufp = stpcpy (prefix_obufp, lock_prefix);
5219 if (repz_prefix)
5220 prefix_obufp = stpcpy (prefix_obufp, repz_prefix);
5221 if (repnz_prefix)
5222 prefix_obufp = stpcpy (prefix_obufp, repnz_prefix);
5223 if (addr_prefix)
5224 prefix_obufp = stpcpy (prefix_obufp, addr_prefix);
5225 if (data_prefix)
5226 prefix_obufp = stpcpy (prefix_obufp, data_prefix);
5227
5228 if (prefix_obuf[0] != 0)
5229 (*info->fprintf_func) (info->stream, "%s", prefix_obuf);
5230
5231 obufp = obuf + strlen (obuf);
5232 for (i = strlen (obuf) + strlen (prefix_obuf); i < 6; i++)
5233 oappend (" ");
5234 oappend (" ");
5235 (*info->fprintf_func) (info->stream, "%s", obuf);
5236
5237 /* The enter and bound instructions are printed with operands in the same
5238 order as the intel book; everything else is printed in reverse order. */
5239 if (intel_syntax || two_source_ops)
5240 {
5241 bfd_vma riprel;
5242
5243 for (i = 0; i < MAX_OPERANDS; ++i)
5244 op_txt[i] = op_out[i];
5245
5246 for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
5247 {
5248 op_ad = op_index[i];
5249 op_index[i] = op_index[MAX_OPERANDS - 1 - i];
5250 op_index[MAX_OPERANDS - 1 - i] = op_ad;
5251 riprel = op_riprel[i];
5252 op_riprel[i] = op_riprel [MAX_OPERANDS - 1 - i];
5253 op_riprel[MAX_OPERANDS - 1 - i] = riprel;
5254 }
5255 }
5256 else
5257 {
5258 for (i = 0; i < MAX_OPERANDS; ++i)
5259 op_txt[MAX_OPERANDS - 1 - i] = op_out[i];
5260 }
5261
5262 needcomma = 0;
5263 for (i = 0; i < MAX_OPERANDS; ++i)
5264 if (*op_txt[i])
5265 {
5266 if (needcomma)
5267 (*info->fprintf_func) (info->stream, ",");
5268 if (op_index[i] != -1 && !op_riprel[i])
5269 (*info->print_address_func) ((bfd_vma) op_address[op_index[i]], info);
5270 else
5271 (*info->fprintf_func) (info->stream, "%s", op_txt[i]);
5272 needcomma = 1;
5273 }
5274
5275 for (i = 0; i < MAX_OPERANDS; i++)
5276 if (op_index[i] != -1 && op_riprel[i])
5277 {
5278 (*info->fprintf_func) (info->stream, " # ");
5279 (*info->print_address_func) ((bfd_vma) (start_pc + codep - start_codep
5280 + op_address[op_index[i]]), info);
5281 break;
5282 }
5283 return codep - priv.the_buffer;
5284 }
5285
5286 static const char *float_mem[] = {
5287 /* d8 */
5288 "fadd{s||s|}",
5289 "fmul{s||s|}",
5290 "fcom{s||s|}",
5291 "fcomp{s||s|}",
5292 "fsub{s||s|}",
5293 "fsubr{s||s|}",
5294 "fdiv{s||s|}",
5295 "fdivr{s||s|}",
5296 /* d9 */
5297 "fld{s||s|}",
5298 "(bad)",
5299 "fst{s||s|}",
5300 "fstp{s||s|}",
5301 "fldenvIC",
5302 "fldcw",
5303 "fNstenvIC",
5304 "fNstcw",
5305 /* da */
5306 "fiadd{l||l|}",
5307 "fimul{l||l|}",
5308 "ficom{l||l|}",
5309 "ficomp{l||l|}",
5310 "fisub{l||l|}",
5311 "fisubr{l||l|}",
5312 "fidiv{l||l|}",
5313 "fidivr{l||l|}",
5314 /* db */
5315 "fild{l||l|}",
5316 "fisttp{l||l|}",
5317 "fist{l||l|}",
5318 "fistp{l||l|}",
5319 "(bad)",
5320 "fld{t||t|}",
5321 "(bad)",
5322 "fstp{t||t|}",
5323 /* dc */
5324 "fadd{l||l|}",
5325 "fmul{l||l|}",
5326 "fcom{l||l|}",
5327 "fcomp{l||l|}",
5328 "fsub{l||l|}",
5329 "fsubr{l||l|}",
5330 "fdiv{l||l|}",
5331 "fdivr{l||l|}",
5332 /* dd */
5333 "fld{l||l|}",
5334 "fisttp{ll||ll|}",
5335 "fst{l||l|}",
5336 "fstp{l||l|}",
5337 "frstorIC",
5338 "(bad)",
5339 "fNsaveIC",
5340 "fNstsw",
5341 /* de */
5342 "fiadd",
5343 "fimul",
5344 "ficom",
5345 "ficomp",
5346 "fisub",
5347 "fisubr",
5348 "fidiv",
5349 "fidivr",
5350 /* df */
5351 "fild",
5352 "fisttp",
5353 "fist",
5354 "fistp",
5355 "fbld",
5356 "fild{ll||ll|}",
5357 "fbstp",
5358 "fistp{ll||ll|}",
5359 };
5360
5361 static const unsigned char float_mem_mode[] = {
5362 /* d8 */
5363 d_mode,
5364 d_mode,
5365 d_mode,
5366 d_mode,
5367 d_mode,
5368 d_mode,
5369 d_mode,
5370 d_mode,
5371 /* d9 */
5372 d_mode,
5373 0,
5374 d_mode,
5375 d_mode,
5376 0,
5377 w_mode,
5378 0,
5379 w_mode,
5380 /* da */
5381 d_mode,
5382 d_mode,
5383 d_mode,
5384 d_mode,
5385 d_mode,
5386 d_mode,
5387 d_mode,
5388 d_mode,
5389 /* db */
5390 d_mode,
5391 d_mode,
5392 d_mode,
5393 d_mode,
5394 0,
5395 t_mode,
5396 0,
5397 t_mode,
5398 /* dc */
5399 q_mode,
5400 q_mode,
5401 q_mode,
5402 q_mode,
5403 q_mode,
5404 q_mode,
5405 q_mode,
5406 q_mode,
5407 /* dd */
5408 q_mode,
5409 q_mode,
5410 q_mode,
5411 q_mode,
5412 0,
5413 0,
5414 0,
5415 w_mode,
5416 /* de */
5417 w_mode,
5418 w_mode,
5419 w_mode,
5420 w_mode,
5421 w_mode,
5422 w_mode,
5423 w_mode,
5424 w_mode,
5425 /* df */
5426 w_mode,
5427 w_mode,
5428 w_mode,
5429 w_mode,
5430 t_mode,
5431 q_mode,
5432 t_mode,
5433 q_mode
5434 };
5435
5436 #define ST { OP_ST, 0 }
5437 #define STi { OP_STi, 0 }
5438
5439 #define FGRPd9_2 NULL, { { NULL, 0 } }
5440 #define FGRPd9_4 NULL, { { NULL, 1 } }
5441 #define FGRPd9_5 NULL, { { NULL, 2 } }
5442 #define FGRPd9_6 NULL, { { NULL, 3 } }
5443 #define FGRPd9_7 NULL, { { NULL, 4 } }
5444 #define FGRPda_5 NULL, { { NULL, 5 } }
5445 #define FGRPdb_4 NULL, { { NULL, 6 } }
5446 #define FGRPde_3 NULL, { { NULL, 7 } }
5447 #define FGRPdf_4 NULL, { { NULL, 8 } }
5448
5449 static const struct dis386 float_reg[][8] = {
5450 /* d8 */
5451 {
5452 { "fadd", { ST, STi } },
5453 { "fmul", { ST, STi } },
5454 { "fcom", { STi } },
5455 { "fcomp", { STi } },
5456 { "fsub", { ST, STi } },
5457 { "fsubr", { ST, STi } },
5458 { "fdiv", { ST, STi } },
5459 { "fdivr", { ST, STi } },
5460 },
5461 /* d9 */
5462 {
5463 { "fld", { STi } },
5464 { "fxch", { STi } },
5465 { FGRPd9_2 },
5466 { "(bad)", { XX } },
5467 { FGRPd9_4 },
5468 { FGRPd9_5 },
5469 { FGRPd9_6 },
5470 { FGRPd9_7 },
5471 },
5472 /* da */
5473 {
5474 { "fcmovb", { ST, STi } },
5475 { "fcmove", { ST, STi } },
5476 { "fcmovbe",{ ST, STi } },
5477 { "fcmovu", { ST, STi } },
5478 { "(bad)", { XX } },
5479 { FGRPda_5 },
5480 { "(bad)", { XX } },
5481 { "(bad)", { XX } },
5482 },
5483 /* db */
5484 {
5485 { "fcmovnb",{ ST, STi } },
5486 { "fcmovne",{ ST, STi } },
5487 { "fcmovnbe",{ ST, STi } },
5488 { "fcmovnu",{ ST, STi } },
5489 { FGRPdb_4 },
5490 { "fucomi", { ST, STi } },
5491 { "fcomi", { ST, STi } },
5492 { "(bad)", { XX } },
5493 },
5494 /* dc */
5495 {
5496 { "fadd", { STi, ST } },
5497 { "fmul", { STi, ST } },
5498 { "(bad)", { XX } },
5499 { "(bad)", { XX } },
5500 #if SYSV386_COMPAT
5501 { "fsub", { STi, ST } },
5502 { "fsubr", { STi, ST } },
5503 { "fdiv", { STi, ST } },
5504 { "fdivr", { STi, ST } },
5505 #else
5506 { "fsubr", { STi, ST } },
5507 { "fsub", { STi, ST } },
5508 { "fdivr", { STi, ST } },
5509 { "fdiv", { STi, ST } },
5510 #endif
5511 },
5512 /* dd */
5513 {
5514 { "ffree", { STi } },
5515 { "(bad)", { XX } },
5516 { "fst", { STi } },
5517 { "fstp", { STi } },
5518 { "fucom", { STi } },
5519 { "fucomp", { STi } },
5520 { "(bad)", { XX } },
5521 { "(bad)", { XX } },
5522 },
5523 /* de */
5524 {
5525 { "faddp", { STi, ST } },
5526 { "fmulp", { STi, ST } },
5527 { "(bad)", { XX } },
5528 { FGRPde_3 },
5529 #if SYSV386_COMPAT
5530 { "fsubp", { STi, ST } },
5531 { "fsubrp", { STi, ST } },
5532 { "fdivp", { STi, ST } },
5533 { "fdivrp", { STi, ST } },
5534 #else
5535 { "fsubrp", { STi, ST } },
5536 { "fsubp", { STi, ST } },
5537 { "fdivrp", { STi, ST } },
5538 { "fdivp", { STi, ST } },
5539 #endif
5540 },
5541 /* df */
5542 {
5543 { "ffreep", { STi } },
5544 { "(bad)", { XX } },
5545 { "(bad)", { XX } },
5546 { "(bad)", { XX } },
5547 { FGRPdf_4 },
5548 { "fucomip", { ST, STi } },
5549 { "fcomip", { ST, STi } },
5550 { "(bad)", { XX } },
5551 },
5552 };
5553
5554 static char *fgrps[][8] = {
5555 /* d9_2 0 */
5556 {
5557 "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5558 },
5559
5560 /* d9_4 1 */
5561 {
5562 "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
5563 },
5564
5565 /* d9_5 2 */
5566 {
5567 "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
5568 },
5569
5570 /* d9_6 3 */
5571 {
5572 "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
5573 },
5574
5575 /* d9_7 4 */
5576 {
5577 "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
5578 },
5579
5580 /* da_5 5 */
5581 {
5582 "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5583 },
5584
5585 /* db_4 6 */
5586 {
5587 "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
5588 "fNsetpm(287 only)","(bad)","(bad)","(bad)",
5589 },
5590
5591 /* de_3 7 */
5592 {
5593 "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5594 },
5595
5596 /* df_4 8 */
5597 {
5598 "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
5599 },
5600 };
5601
5602 static void
5603 OP_Skip_MODRM (int bytemode ATTRIBUTE_UNUSED,
5604 int sizeflag ATTRIBUTE_UNUSED)
5605 {
5606 /* Skip mod/rm byte. */
5607 MODRM_CHECK;
5608 codep++;
5609 }
5610
5611 static void
5612 dofloat (int sizeflag)
5613 {
5614 const struct dis386 *dp;
5615 unsigned char floatop;
5616
5617 floatop = codep[-1];
5618
5619 if (modrm.mod != 3)
5620 {
5621 int fp_indx = (floatop - 0xd8) * 8 + modrm.reg;
5622
5623 putop (float_mem[fp_indx], sizeflag);
5624 obufp = op_out[0];
5625 op_ad = 2;
5626 OP_E (float_mem_mode[fp_indx], sizeflag);
5627 return;
5628 }
5629 /* Skip mod/rm byte. */
5630 MODRM_CHECK;
5631 codep++;
5632
5633 dp = &float_reg[floatop - 0xd8][modrm.reg];
5634 if (dp->name == NULL)
5635 {
5636 putop (fgrps[dp->op[0].bytemode][modrm.rm], sizeflag);
5637
5638 /* Instruction fnstsw is only one with strange arg. */
5639 if (floatop == 0xdf && codep[-1] == 0xe0)
5640 strcpy (op_out[0], names16[0]);
5641 }
5642 else
5643 {
5644 putop (dp->name, sizeflag);
5645
5646 obufp = op_out[0];
5647 op_ad = 2;
5648 if (dp->op[0].rtn)
5649 (*dp->op[0].rtn) (dp->op[0].bytemode, sizeflag);
5650
5651 obufp = op_out[1];
5652 op_ad = 1;
5653 if (dp->op[1].rtn)
5654 (*dp->op[1].rtn) (dp->op[1].bytemode, sizeflag);
5655 }
5656 }
5657
5658 static void
5659 OP_ST (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5660 {
5661 oappend ("%st" + intel_syntax);
5662 }
5663
5664 static void
5665 OP_STi (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
5666 {
5667 sprintf (scratchbuf, "%%st(%d)", modrm.rm);
5668 oappend (scratchbuf + intel_syntax);
5669 }
5670
5671 /* Capital letters in template are macros. */
5672 static int
5673 putop (const char *template, int sizeflag)
5674 {
5675 const char *p;
5676 int alt = 0;
5677
5678 for (p = template; *p; p++)
5679 {
5680 switch (*p)
5681 {
5682 default:
5683 *obufp++ = *p;
5684 break;
5685 case '{':
5686 alt = 0;
5687 if (intel_syntax)
5688 alt += 1;
5689 if (address_mode == mode_64bit)
5690 alt += 2;
5691 while (alt != 0)
5692 {
5693 while (*++p != '|')
5694 {
5695 if (*p == '}')
5696 {
5697 /* Alternative not valid. */
5698 strcpy (obuf, "(bad)");
5699 obufp = obuf + 5;
5700 return 1;
5701 }
5702 else if (*p == '\0')
5703 abort ();
5704 }
5705 alt--;
5706 }
5707 /* Fall through. */
5708 case 'I':
5709 alt = 1;
5710 continue;
5711 case '|':
5712 while (*++p != '}')
5713 {
5714 if (*p == '\0')
5715 abort ();
5716 }
5717 break;
5718 case '}':
5719 break;
5720 case 'A':
5721 if (intel_syntax)
5722 break;
5723 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
5724 *obufp++ = 'b';
5725 break;
5726 case 'B':
5727 if (intel_syntax)
5728 break;
5729 if (sizeflag & SUFFIX_ALWAYS)
5730 *obufp++ = 'b';
5731 break;
5732 case 'C':
5733 if (intel_syntax && !alt)
5734 break;
5735 if ((prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
5736 {
5737 if (sizeflag & DFLAG)
5738 *obufp++ = intel_syntax ? 'd' : 'l';
5739 else
5740 *obufp++ = intel_syntax ? 'w' : 's';
5741 used_prefixes |= (prefixes & PREFIX_DATA);
5742 }
5743 break;
5744 case 'D':
5745 if (intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
5746 break;
5747 USED_REX (REX_W);
5748 if (modrm.mod == 3)
5749 {
5750 if (rex & REX_W)
5751 *obufp++ = 'q';
5752 else if (sizeflag & DFLAG)
5753 *obufp++ = intel_syntax ? 'd' : 'l';
5754 else
5755 *obufp++ = 'w';
5756 used_prefixes |= (prefixes & PREFIX_DATA);
5757 }
5758 else
5759 *obufp++ = 'w';
5760 break;
5761 case 'E': /* For jcxz/jecxz */
5762 if (address_mode == mode_64bit)
5763 {
5764 if (sizeflag & AFLAG)
5765 *obufp++ = 'r';
5766 else
5767 *obufp++ = 'e';
5768 }
5769 else
5770 if (sizeflag & AFLAG)
5771 *obufp++ = 'e';
5772 used_prefixes |= (prefixes & PREFIX_ADDR);
5773 break;
5774 case 'F':
5775 if (intel_syntax)
5776 break;
5777 if ((prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
5778 {
5779 if (sizeflag & AFLAG)
5780 *obufp++ = address_mode == mode_64bit ? 'q' : 'l';
5781 else
5782 *obufp++ = address_mode == mode_64bit ? 'l' : 'w';
5783 used_prefixes |= (prefixes & PREFIX_ADDR);
5784 }
5785 break;
5786 case 'G':
5787 if (intel_syntax || (obufp[-1] != 's' && !(sizeflag & SUFFIX_ALWAYS)))
5788 break;
5789 if ((rex & REX_W) || (sizeflag & DFLAG))
5790 *obufp++ = 'l';
5791 else
5792 *obufp++ = 'w';
5793 if (!(rex & REX_W))
5794 used_prefixes |= (prefixes & PREFIX_DATA);
5795 break;
5796 case 'H':
5797 if (intel_syntax)
5798 break;
5799 if ((prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
5800 || (prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
5801 {
5802 used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS);
5803 *obufp++ = ',';
5804 *obufp++ = 'p';
5805 if (prefixes & PREFIX_DS)
5806 *obufp++ = 't';
5807 else
5808 *obufp++ = 'n';
5809 }
5810 break;
5811 case 'J':
5812 if (intel_syntax)
5813 break;
5814 *obufp++ = 'l';
5815 break;
5816 case 'K':
5817 USED_REX (REX_W);
5818 if (rex & REX_W)
5819 *obufp++ = 'q';
5820 else
5821 *obufp++ = 'd';
5822 break;
5823 case 'Z':
5824 if (intel_syntax)
5825 break;
5826 if (address_mode == mode_64bit && (sizeflag & SUFFIX_ALWAYS))
5827 {
5828 *obufp++ = 'q';
5829 break;
5830 }
5831 /* Fall through. */
5832 case 'L':
5833 if (intel_syntax)
5834 break;
5835 if (sizeflag & SUFFIX_ALWAYS)
5836 *obufp++ = 'l';
5837 break;
5838 case 'N':
5839 if ((prefixes & PREFIX_FWAIT) == 0)
5840 *obufp++ = 'n';
5841 else
5842 used_prefixes |= PREFIX_FWAIT;
5843 break;
5844 case 'O':
5845 USED_REX (REX_W);
5846 if (rex & REX_W)
5847 *obufp++ = 'o';
5848 else if (intel_syntax && (sizeflag & DFLAG))
5849 *obufp++ = 'q';
5850 else
5851 *obufp++ = 'd';
5852 if (!(rex & REX_W))
5853 used_prefixes |= (prefixes & PREFIX_DATA);
5854 break;
5855 case 'T':
5856 if (intel_syntax)
5857 break;
5858 if (address_mode == mode_64bit && (sizeflag & DFLAG))
5859 {
5860 *obufp++ = 'q';
5861 break;
5862 }
5863 /* Fall through. */
5864 case 'P':
5865 if (intel_syntax)
5866 break;
5867 if ((prefixes & PREFIX_DATA)
5868 || (rex & REX_W)
5869 || (sizeflag & SUFFIX_ALWAYS))
5870 {
5871 USED_REX (REX_W);
5872 if (rex & REX_W)
5873 *obufp++ = 'q';
5874 else
5875 {
5876 if (sizeflag & DFLAG)
5877 *obufp++ = 'l';
5878 else
5879 *obufp++ = 'w';
5880 }
5881 used_prefixes |= (prefixes & PREFIX_DATA);
5882 }
5883 break;
5884 case 'U':
5885 if (intel_syntax)
5886 break;
5887 if (address_mode == mode_64bit && (sizeflag & DFLAG))
5888 {
5889 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
5890 *obufp++ = 'q';
5891 break;
5892 }
5893 /* Fall through. */
5894 case 'Q':
5895 if (intel_syntax && !alt)
5896 break;
5897 USED_REX (REX_W);
5898 if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
5899 {
5900 if (rex & REX_W)
5901 *obufp++ = 'q';
5902 else
5903 {
5904 if (sizeflag & DFLAG)
5905 *obufp++ = intel_syntax ? 'd' : 'l';
5906 else
5907 *obufp++ = 'w';
5908 }
5909 used_prefixes |= (prefixes & PREFIX_DATA);
5910 }
5911 break;
5912 case 'R':
5913 USED_REX (REX_W);
5914 if (rex & REX_W)
5915 *obufp++ = 'q';
5916 else if (sizeflag & DFLAG)
5917 {
5918 if (intel_syntax)
5919 *obufp++ = 'd';
5920 else
5921 *obufp++ = 'l';
5922 }
5923 else
5924 *obufp++ = 'w';
5925 if (intel_syntax && !p[1]
5926 && ((rex & REX_W) || (sizeflag & DFLAG)))
5927 *obufp++ = 'e';
5928 if (!(rex & REX_W))
5929 used_prefixes |= (prefixes & PREFIX_DATA);
5930 break;
5931 case 'V':
5932 if (intel_syntax)
5933 break;
5934 if (address_mode == mode_64bit && (sizeflag & DFLAG))
5935 {
5936 if (sizeflag & SUFFIX_ALWAYS)
5937 *obufp++ = 'q';
5938 break;
5939 }
5940 /* Fall through. */
5941 case 'S':
5942 if (intel_syntax)
5943 break;
5944 if (sizeflag & SUFFIX_ALWAYS)
5945 {
5946 if (rex & REX_W)
5947 *obufp++ = 'q';
5948 else
5949 {
5950 if (sizeflag & DFLAG)
5951 *obufp++ = 'l';
5952 else
5953 *obufp++ = 'w';
5954 used_prefixes |= (prefixes & PREFIX_DATA);
5955 }
5956 }
5957 break;
5958 case 'X':
5959 if (prefixes & PREFIX_DATA)
5960 *obufp++ = 'd';
5961 else
5962 *obufp++ = 's';
5963 used_prefixes |= (prefixes & PREFIX_DATA);
5964 break;
5965 case 'Y':
5966 if (intel_syntax)
5967 break;
5968 if (rex & REX_W)
5969 {
5970 USED_REX (REX_W);
5971 *obufp++ = 'q';
5972 }
5973 break;
5974 /* implicit operand size 'l' for i386 or 'q' for x86-64 */
5975 case 'W':
5976 /* operand size flag for cwtl, cbtw */
5977 USED_REX (REX_W);
5978 if (rex & REX_W)
5979 {
5980 if (intel_syntax)
5981 *obufp++ = 'd';
5982 else
5983 *obufp++ = 'l';
5984 }
5985 else if (sizeflag & DFLAG)
5986 *obufp++ = 'w';
5987 else
5988 *obufp++ = 'b';
5989 if (!(rex & REX_W))
5990 used_prefixes |= (prefixes & PREFIX_DATA);
5991 break;
5992 }
5993 alt = 0;
5994 }
5995 *obufp = 0;
5996 return 0;
5997 }
5998
5999 static void
6000 oappend (const char *s)
6001 {
6002 strcpy (obufp, s);
6003 obufp += strlen (s);
6004 }
6005
6006 static void
6007 append_seg (void)
6008 {
6009 if (prefixes & PREFIX_CS)
6010 {
6011 used_prefixes |= PREFIX_CS;
6012 oappend ("%cs:" + intel_syntax);
6013 }
6014 if (prefixes & PREFIX_DS)
6015 {
6016 used_prefixes |= PREFIX_DS;
6017 oappend ("%ds:" + intel_syntax);
6018 }
6019 if (prefixes & PREFIX_SS)
6020 {
6021 used_prefixes |= PREFIX_SS;
6022 oappend ("%ss:" + intel_syntax);
6023 }
6024 if (prefixes & PREFIX_ES)
6025 {
6026 used_prefixes |= PREFIX_ES;
6027 oappend ("%es:" + intel_syntax);
6028 }
6029 if (prefixes & PREFIX_FS)
6030 {
6031 used_prefixes |= PREFIX_FS;
6032 oappend ("%fs:" + intel_syntax);
6033 }
6034 if (prefixes & PREFIX_GS)
6035 {
6036 used_prefixes |= PREFIX_GS;
6037 oappend ("%gs:" + intel_syntax);
6038 }
6039 }
6040
6041 static void
6042 OP_indirE (int bytemode, int sizeflag)
6043 {
6044 if (!intel_syntax)
6045 oappend ("*");
6046 OP_E (bytemode, sizeflag);
6047 }
6048
6049 static void
6050 print_operand_value (char *buf, int hex, bfd_vma disp)
6051 {
6052 if (address_mode == mode_64bit)
6053 {
6054 if (hex)
6055 {
6056 char tmp[30];
6057 int i;
6058 buf[0] = '0';
6059 buf[1] = 'x';
6060 sprintf_vma (tmp, disp);
6061 for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
6062 strcpy (buf + 2, tmp + i);
6063 }
6064 else
6065 {
6066 bfd_signed_vma v = disp;
6067 char tmp[30];
6068 int i;
6069 if (v < 0)
6070 {
6071 *(buf++) = '-';
6072 v = -disp;
6073 /* Check for possible overflow on 0x8000000000000000. */
6074 if (v < 0)
6075 {
6076 strcpy (buf, "9223372036854775808");
6077 return;
6078 }
6079 }
6080 if (!v)
6081 {
6082 strcpy (buf, "0");
6083 return;
6084 }
6085
6086 i = 0;
6087 tmp[29] = 0;
6088 while (v)
6089 {
6090 tmp[28 - i] = (v % 10) + '0';
6091 v /= 10;
6092 i++;
6093 }
6094 strcpy (buf, tmp + 29 - i);
6095 }
6096 }
6097 else
6098 {
6099 if (hex)
6100 sprintf (buf, "0x%x", (unsigned int) disp);
6101 else
6102 sprintf (buf, "%d", (int) disp);
6103 }
6104 }
6105
6106 /* Put DISP in BUF as signed hex number. */
6107
6108 static void
6109 print_displacement (char *buf, bfd_vma disp)
6110 {
6111 bfd_signed_vma val = disp;
6112 char tmp[30];
6113 int i, j = 0;
6114
6115 if (val < 0)
6116 {
6117 buf[j++] = '-';
6118 val = -disp;
6119
6120 /* Check for possible overflow. */
6121 if (val < 0)
6122 {
6123 switch (address_mode)
6124 {
6125 case mode_64bit:
6126 strcpy (buf + j, "0x8000000000000000");
6127 break;
6128 case mode_32bit:
6129 strcpy (buf + j, "0x80000000");
6130 break;
6131 case mode_16bit:
6132 strcpy (buf + j, "0x8000");
6133 break;
6134 }
6135 return;
6136 }
6137 }
6138
6139 buf[j++] = '0';
6140 buf[j++] = 'x';
6141
6142 sprintf_vma (tmp, val);
6143 for (i = 0; tmp[i] == '0'; i++)
6144 continue;
6145 if (tmp[i] == '\0')
6146 i--;
6147 strcpy (buf + j, tmp + i);
6148 }
6149
6150 static void
6151 intel_operand_size (int bytemode, int sizeflag)
6152 {
6153 switch (bytemode)
6154 {
6155 case b_mode:
6156 case dqb_mode:
6157 oappend ("BYTE PTR ");
6158 break;
6159 case w_mode:
6160 case dqw_mode:
6161 oappend ("WORD PTR ");
6162 break;
6163 case stack_v_mode:
6164 if (address_mode == mode_64bit && (sizeflag & DFLAG))
6165 {
6166 oappend ("QWORD PTR ");
6167 used_prefixes |= (prefixes & PREFIX_DATA);
6168 break;
6169 }
6170 /* FALLTHRU */
6171 case v_mode:
6172 case dq_mode:
6173 USED_REX (REX_W);
6174 if (rex & REX_W)
6175 oappend ("QWORD PTR ");
6176 else if ((sizeflag & DFLAG) || bytemode == dq_mode)
6177 oappend ("DWORD PTR ");
6178 else
6179 oappend ("WORD PTR ");
6180 used_prefixes |= (prefixes & PREFIX_DATA);
6181 break;
6182 case z_mode:
6183 if ((rex & REX_W) || (sizeflag & DFLAG))
6184 *obufp++ = 'D';
6185 oappend ("WORD PTR ");
6186 if (!(rex & REX_W))
6187 used_prefixes |= (prefixes & PREFIX_DATA);
6188 break;
6189 case d_mode:
6190 case dqd_mode:
6191 oappend ("DWORD PTR ");
6192 break;
6193 case q_mode:
6194 oappend ("QWORD PTR ");
6195 break;
6196 case m_mode:
6197 if (address_mode == mode_64bit)
6198 oappend ("QWORD PTR ");
6199 else
6200 oappend ("DWORD PTR ");
6201 break;
6202 case f_mode:
6203 if (sizeflag & DFLAG)
6204 oappend ("FWORD PTR ");
6205 else
6206 oappend ("DWORD PTR ");
6207 used_prefixes |= (prefixes & PREFIX_DATA);
6208 break;
6209 case t_mode:
6210 oappend ("TBYTE PTR ");
6211 break;
6212 case x_mode:
6213 oappend ("XMMWORD PTR ");
6214 break;
6215 case o_mode:
6216 oappend ("OWORD PTR ");
6217 break;
6218 default:
6219 break;
6220 }
6221 }
6222
6223 static void
6224 OP_E_extended (int bytemode, int sizeflag, int has_drex)
6225 {
6226 bfd_vma disp;
6227 int add = 0;
6228 int riprel = 0;
6229 USED_REX (REX_B);
6230 if (rex & REX_B)
6231 add += 8;
6232
6233 /* Skip mod/rm byte. */
6234 MODRM_CHECK;
6235 codep++;
6236
6237 if (modrm.mod == 3)
6238 {
6239 switch (bytemode)
6240 {
6241 case b_mode:
6242 USED_REX (0);
6243 if (rex)
6244 oappend (names8rex[modrm.rm + add]);
6245 else
6246 oappend (names8[modrm.rm + add]);
6247 break;
6248 case w_mode:
6249 oappend (names16[modrm.rm + add]);
6250 break;
6251 case d_mode:
6252 oappend (names32[modrm.rm + add]);
6253 break;
6254 case q_mode:
6255 oappend (names64[modrm.rm + add]);
6256 break;
6257 case m_mode:
6258 if (address_mode == mode_64bit)
6259 oappend (names64[modrm.rm + add]);
6260 else
6261 oappend (names32[modrm.rm + add]);
6262 break;
6263 case stack_v_mode:
6264 if (address_mode == mode_64bit && (sizeflag & DFLAG))
6265 {
6266 oappend (names64[modrm.rm + add]);
6267 used_prefixes |= (prefixes & PREFIX_DATA);
6268 break;
6269 }
6270 bytemode = v_mode;
6271 /* FALLTHRU */
6272 case v_mode:
6273 case dq_mode:
6274 case dqb_mode:
6275 case dqd_mode:
6276 case dqw_mode:
6277 USED_REX (REX_W);
6278 if (rex & REX_W)
6279 oappend (names64[modrm.rm + add]);
6280 else if ((sizeflag & DFLAG) || bytemode != v_mode)
6281 oappend (names32[modrm.rm + add]);
6282 else
6283 oappend (names16[modrm.rm + add]);
6284 used_prefixes |= (prefixes & PREFIX_DATA);
6285 break;
6286 case 0:
6287 break;
6288 default:
6289 oappend (INTERNAL_DISASSEMBLER_ERROR);
6290 break;
6291 }
6292 return;
6293 }
6294
6295 disp = 0;
6296 if (intel_syntax)
6297 intel_operand_size (bytemode, sizeflag);
6298 append_seg ();
6299
6300 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
6301 {
6302 /* 32/64 bit address mode */
6303 int havedisp;
6304 int havesib;
6305 int havebase;
6306 int base;
6307 int index = 0;
6308 int scale = 0;
6309
6310 havesib = 0;
6311 havebase = 1;
6312 base = modrm.rm;
6313
6314 if (base == 4)
6315 {
6316 havesib = 1;
6317 FETCH_DATA (the_info, codep + 1);
6318 index = (*codep >> 3) & 7;
6319 if (address_mode == mode_64bit || index != 0x4)
6320 /* When INDEX == 0x4 in 32 bit mode, SCALE is ignored. */
6321 scale = (*codep >> 6) & 3;
6322 base = *codep & 7;
6323 USED_REX (REX_X);
6324 if (rex & REX_X)
6325 index += 8;
6326 codep++;
6327 }
6328 base += add;
6329
6330 /* If we have a DREX byte, skip it now
6331 (it has already been handled) */
6332 if (has_drex)
6333 {
6334 FETCH_DATA (the_info, codep + 1);
6335 codep++;
6336 }
6337
6338 switch (modrm.mod)
6339 {
6340 case 0:
6341 if ((base & 7) == 5)
6342 {
6343 havebase = 0;
6344 if (address_mode == mode_64bit && !havesib)
6345 riprel = 1;
6346 disp = get32s ();
6347 }
6348 break;
6349 case 1:
6350 FETCH_DATA (the_info, codep + 1);
6351 disp = *codep++;
6352 if ((disp & 0x80) != 0)
6353 disp -= 0x100;
6354 break;
6355 case 2:
6356 disp = get32s ();
6357 break;
6358 }
6359
6360 havedisp = havebase || (havesib && (index != 4 || scale != 0));
6361
6362 if (!intel_syntax)
6363 if (modrm.mod != 0 || (base & 7) == 5)
6364 {
6365 if (havedisp || riprel)
6366 print_displacement (scratchbuf, disp);
6367 else
6368 print_operand_value (scratchbuf, 1, disp);
6369 oappend (scratchbuf);
6370 if (riprel)
6371 {
6372 set_op (disp, 1);
6373 oappend ("(%rip)");
6374 }
6375 }
6376
6377 if (havedisp || (intel_syntax && riprel))
6378 {
6379 *obufp++ = open_char;
6380 if (intel_syntax && riprel)
6381 {
6382 set_op (disp, 1);
6383 oappend ("rip");
6384 }
6385 *obufp = '\0';
6386 if (havebase)
6387 oappend (address_mode == mode_64bit && (sizeflag & AFLAG)
6388 ? names64[base] : names32[base]);
6389 if (havesib)
6390 {
6391 if (index != 4)
6392 {
6393 if (!intel_syntax || havebase)
6394 {
6395 *obufp++ = separator_char;
6396 *obufp = '\0';
6397 }
6398 oappend (address_mode == mode_64bit
6399 && (sizeflag & AFLAG)
6400 ? names64[index] : names32[index]);
6401 }
6402 if (scale != 0 || (!intel_syntax && index != 4))
6403 {
6404 *obufp++ = scale_char;
6405 *obufp = '\0';
6406 sprintf (scratchbuf, "%d", 1 << scale);
6407 oappend (scratchbuf);
6408 }
6409 }
6410 if (intel_syntax
6411 && (disp || modrm.mod != 0 || (base & 7) == 5))
6412 {
6413 if ((bfd_signed_vma) disp >= 0)
6414 {
6415 *obufp++ = '+';
6416 *obufp = '\0';
6417 }
6418 else if (modrm.mod != 1)
6419 {
6420 *obufp++ = '-';
6421 *obufp = '\0';
6422 disp = - (bfd_signed_vma) disp;
6423 }
6424
6425 print_displacement (scratchbuf, disp);
6426 oappend (scratchbuf);
6427 }
6428
6429 *obufp++ = close_char;
6430 *obufp = '\0';
6431 }
6432 else if (intel_syntax)
6433 {
6434 if (modrm.mod != 0 || (base & 7) == 5)
6435 {
6436 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
6437 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
6438 ;
6439 else
6440 {
6441 oappend (names_seg[ds_reg - es_reg]);
6442 oappend (":");
6443 }
6444 print_operand_value (scratchbuf, 1, disp);
6445 oappend (scratchbuf);
6446 }
6447 }
6448 }
6449 else
6450 { /* 16 bit address mode */
6451 switch (modrm.mod)
6452 {
6453 case 0:
6454 if (modrm.rm == 6)
6455 {
6456 disp = get16 ();
6457 if ((disp & 0x8000) != 0)
6458 disp -= 0x10000;
6459 }
6460 break;
6461 case 1:
6462 FETCH_DATA (the_info, codep + 1);
6463 disp = *codep++;
6464 if ((disp & 0x80) != 0)
6465 disp -= 0x100;
6466 break;
6467 case 2:
6468 disp = get16 ();
6469 if ((disp & 0x8000) != 0)
6470 disp -= 0x10000;
6471 break;
6472 }
6473
6474 if (!intel_syntax)
6475 if (modrm.mod != 0 || modrm.rm == 6)
6476 {
6477 print_displacement (scratchbuf, disp);
6478 oappend (scratchbuf);
6479 }
6480
6481 if (modrm.mod != 0 || modrm.rm != 6)
6482 {
6483 *obufp++ = open_char;
6484 *obufp = '\0';
6485 oappend (index16[modrm.rm]);
6486 if (intel_syntax
6487 && (disp || modrm.mod != 0 || modrm.rm == 6))
6488 {
6489 if ((bfd_signed_vma) disp >= 0)
6490 {
6491 *obufp++ = '+';
6492 *obufp = '\0';
6493 }
6494 else if (modrm.mod != 1)
6495 {
6496 *obufp++ = '-';
6497 *obufp = '\0';
6498 disp = - (bfd_signed_vma) disp;
6499 }
6500
6501 print_displacement (scratchbuf, disp);
6502 oappend (scratchbuf);
6503 }
6504
6505 *obufp++ = close_char;
6506 *obufp = '\0';
6507 }
6508 else if (intel_syntax)
6509 {
6510 if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
6511 | PREFIX_ES | PREFIX_FS | PREFIX_GS))
6512 ;
6513 else
6514 {
6515 oappend (names_seg[ds_reg - es_reg]);
6516 oappend (":");
6517 }
6518 print_operand_value (scratchbuf, 1, disp & 0xffff);
6519 oappend (scratchbuf);
6520 }
6521 }
6522 }
6523
6524 static void
6525 OP_E (int bytemode, int sizeflag)
6526 {
6527 OP_E_extended (bytemode, sizeflag, 0);
6528 }
6529
6530
6531 static void
6532 OP_G (int bytemode, int sizeflag)
6533 {
6534 int add = 0;
6535 USED_REX (REX_R);
6536 if (rex & REX_R)
6537 add += 8;
6538 switch (bytemode)
6539 {
6540 case b_mode:
6541 USED_REX (0);
6542 if (rex)
6543 oappend (names8rex[modrm.reg + add]);
6544 else
6545 oappend (names8[modrm.reg + add]);
6546 break;
6547 case w_mode:
6548 oappend (names16[modrm.reg + add]);
6549 break;
6550 case d_mode:
6551 oappend (names32[modrm.reg + add]);
6552 break;
6553 case q_mode:
6554 oappend (names64[modrm.reg + add]);
6555 break;
6556 case v_mode:
6557 case dq_mode:
6558 case dqb_mode:
6559 case dqd_mode:
6560 case dqw_mode:
6561 USED_REX (REX_W);
6562 if (rex & REX_W)
6563 oappend (names64[modrm.reg + add]);
6564 else if ((sizeflag & DFLAG) || bytemode != v_mode)
6565 oappend (names32[modrm.reg + add]);
6566 else
6567 oappend (names16[modrm.reg + add]);
6568 used_prefixes |= (prefixes & PREFIX_DATA);
6569 break;
6570 case m_mode:
6571 if (address_mode == mode_64bit)
6572 oappend (names64[modrm.reg + add]);
6573 else
6574 oappend (names32[modrm.reg + add]);
6575 break;
6576 default:
6577 oappend (INTERNAL_DISASSEMBLER_ERROR);
6578 break;
6579 }
6580 }
6581
6582 static bfd_vma
6583 get64 (void)
6584 {
6585 bfd_vma x;
6586 #ifdef BFD64
6587 unsigned int a;
6588 unsigned int b;
6589
6590 FETCH_DATA (the_info, codep + 8);
6591 a = *codep++ & 0xff;
6592 a |= (*codep++ & 0xff) << 8;
6593 a |= (*codep++ & 0xff) << 16;
6594 a |= (*codep++ & 0xff) << 24;
6595 b = *codep++ & 0xff;
6596 b |= (*codep++ & 0xff) << 8;
6597 b |= (*codep++ & 0xff) << 16;
6598 b |= (*codep++ & 0xff) << 24;
6599 x = a + ((bfd_vma) b << 32);
6600 #else
6601 abort ();
6602 x = 0;
6603 #endif
6604 return x;
6605 }
6606
6607 static bfd_signed_vma
6608 get32 (void)
6609 {
6610 bfd_signed_vma x = 0;
6611
6612 FETCH_DATA (the_info, codep + 4);
6613 x = *codep++ & (bfd_signed_vma) 0xff;
6614 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
6615 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
6616 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
6617 return x;
6618 }
6619
6620 static bfd_signed_vma
6621 get32s (void)
6622 {
6623 bfd_signed_vma x = 0;
6624
6625 FETCH_DATA (the_info, codep + 4);
6626 x = *codep++ & (bfd_signed_vma) 0xff;
6627 x |= (*codep++ & (bfd_signed_vma) 0xff) << 8;
6628 x |= (*codep++ & (bfd_signed_vma) 0xff) << 16;
6629 x |= (*codep++ & (bfd_signed_vma) 0xff) << 24;
6630
6631 x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
6632
6633 return x;
6634 }
6635
6636 static int
6637 get16 (void)
6638 {
6639 int x = 0;
6640
6641 FETCH_DATA (the_info, codep + 2);
6642 x = *codep++ & 0xff;
6643 x |= (*codep++ & 0xff) << 8;
6644 return x;
6645 }
6646
6647 static void
6648 set_op (bfd_vma op, int riprel)
6649 {
6650 op_index[op_ad] = op_ad;
6651 if (address_mode == mode_64bit)
6652 {
6653 op_address[op_ad] = op;
6654 op_riprel[op_ad] = riprel;
6655 }
6656 else
6657 {
6658 /* Mask to get a 32-bit address. */
6659 op_address[op_ad] = op & 0xffffffff;
6660 op_riprel[op_ad] = riprel & 0xffffffff;
6661 }
6662 }
6663
6664 static void
6665 OP_REG (int code, int sizeflag)
6666 {
6667 const char *s;
6668 int add = 0;
6669 USED_REX (REX_B);
6670 if (rex & REX_B)
6671 add = 8;
6672
6673 switch (code)
6674 {
6675 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
6676 case sp_reg: case bp_reg: case si_reg: case di_reg:
6677 s = names16[code - ax_reg + add];
6678 break;
6679 case es_reg: case ss_reg: case cs_reg:
6680 case ds_reg: case fs_reg: case gs_reg:
6681 s = names_seg[code - es_reg + add];
6682 break;
6683 case al_reg: case ah_reg: case cl_reg: case ch_reg:
6684 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
6685 USED_REX (0);
6686 if (rex)
6687 s = names8rex[code - al_reg + add];
6688 else
6689 s = names8[code - al_reg];
6690 break;
6691 case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
6692 case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
6693 if (address_mode == mode_64bit && (sizeflag & DFLAG))
6694 {
6695 s = names64[code - rAX_reg + add];
6696 break;
6697 }
6698 code += eAX_reg - rAX_reg;
6699 /* Fall through. */
6700 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
6701 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
6702 USED_REX (REX_W);
6703 if (rex & REX_W)
6704 s = names64[code - eAX_reg + add];
6705 else if (sizeflag & DFLAG)
6706 s = names32[code - eAX_reg + add];
6707 else
6708 s = names16[code - eAX_reg + add];
6709 used_prefixes |= (prefixes & PREFIX_DATA);
6710 break;
6711 default:
6712 s = INTERNAL_DISASSEMBLER_ERROR;
6713 break;
6714 }
6715 oappend (s);
6716 }
6717
6718 static void
6719 OP_IMREG (int code, int sizeflag)
6720 {
6721 const char *s;
6722
6723 switch (code)
6724 {
6725 case indir_dx_reg:
6726 if (intel_syntax)
6727 s = "dx";
6728 else
6729 s = "(%dx)";
6730 break;
6731 case ax_reg: case cx_reg: case dx_reg: case bx_reg:
6732 case sp_reg: case bp_reg: case si_reg: case di_reg:
6733 s = names16[code - ax_reg];
6734 break;
6735 case es_reg: case ss_reg: case cs_reg:
6736 case ds_reg: case fs_reg: case gs_reg:
6737 s = names_seg[code - es_reg];
6738 break;
6739 case al_reg: case ah_reg: case cl_reg: case ch_reg:
6740 case dl_reg: case dh_reg: case bl_reg: case bh_reg:
6741 USED_REX (0);
6742 if (rex)
6743 s = names8rex[code - al_reg];
6744 else
6745 s = names8[code - al_reg];
6746 break;
6747 case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
6748 case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
6749 USED_REX (REX_W);
6750 if (rex & REX_W)
6751 s = names64[code - eAX_reg];
6752 else if (sizeflag & DFLAG)
6753 s = names32[code - eAX_reg];
6754 else
6755 s = names16[code - eAX_reg];
6756 used_prefixes |= (prefixes & PREFIX_DATA);
6757 break;
6758 case z_mode_ax_reg:
6759 if ((rex & REX_W) || (sizeflag & DFLAG))
6760 s = *names32;
6761 else
6762 s = *names16;
6763 if (!(rex & REX_W))
6764 used_prefixes |= (prefixes & PREFIX_DATA);
6765 break;
6766 default:
6767 s = INTERNAL_DISASSEMBLER_ERROR;
6768 break;
6769 }
6770 oappend (s);
6771 }
6772
6773 static void
6774 OP_I (int bytemode, int sizeflag)
6775 {
6776 bfd_signed_vma op;
6777 bfd_signed_vma mask = -1;
6778
6779 switch (bytemode)
6780 {
6781 case b_mode:
6782 FETCH_DATA (the_info, codep + 1);
6783 op = *codep++;
6784 mask = 0xff;
6785 break;
6786 case q_mode:
6787 if (address_mode == mode_64bit)
6788 {
6789 op = get32s ();
6790 break;
6791 }
6792 /* Fall through. */
6793 case v_mode:
6794 USED_REX (REX_W);
6795 if (rex & REX_W)
6796 op = get32s ();
6797 else if (sizeflag & DFLAG)
6798 {
6799 op = get32 ();
6800 mask = 0xffffffff;
6801 }
6802 else
6803 {
6804 op = get16 ();
6805 mask = 0xfffff;
6806 }
6807 used_prefixes |= (prefixes & PREFIX_DATA);
6808 break;
6809 case w_mode:
6810 mask = 0xfffff;
6811 op = get16 ();
6812 break;
6813 case const_1_mode:
6814 if (intel_syntax)
6815 oappend ("1");
6816 return;
6817 default:
6818 oappend (INTERNAL_DISASSEMBLER_ERROR);
6819 return;
6820 }
6821
6822 op &= mask;
6823 scratchbuf[0] = '$';
6824 print_operand_value (scratchbuf + 1, 1, op);
6825 oappend (scratchbuf + intel_syntax);
6826 scratchbuf[0] = '\0';
6827 }
6828
6829 static void
6830 OP_I64 (int bytemode, int sizeflag)
6831 {
6832 bfd_signed_vma op;
6833 bfd_signed_vma mask = -1;
6834
6835 if (address_mode != mode_64bit)
6836 {
6837 OP_I (bytemode, sizeflag);
6838 return;
6839 }
6840
6841 switch (bytemode)
6842 {
6843 case b_mode:
6844 FETCH_DATA (the_info, codep + 1);
6845 op = *codep++;
6846 mask = 0xff;
6847 break;
6848 case v_mode:
6849 USED_REX (REX_W);
6850 if (rex & REX_W)
6851 op = get64 ();
6852 else if (sizeflag & DFLAG)
6853 {
6854 op = get32 ();
6855 mask = 0xffffffff;
6856 }
6857 else
6858 {
6859 op = get16 ();
6860 mask = 0xfffff;
6861 }
6862 used_prefixes |= (prefixes & PREFIX_DATA);
6863 break;
6864 case w_mode:
6865 mask = 0xfffff;
6866 op = get16 ();
6867 break;
6868 default:
6869 oappend (INTERNAL_DISASSEMBLER_ERROR);
6870 return;
6871 }
6872
6873 op &= mask;
6874 scratchbuf[0] = '$';
6875 print_operand_value (scratchbuf + 1, 1, op);
6876 oappend (scratchbuf + intel_syntax);
6877 scratchbuf[0] = '\0';
6878 }
6879
6880 static void
6881 OP_sI (int bytemode, int sizeflag)
6882 {
6883 bfd_signed_vma op;
6884 bfd_signed_vma mask = -1;
6885
6886 switch (bytemode)
6887 {
6888 case b_mode:
6889 FETCH_DATA (the_info, codep + 1);
6890 op = *codep++;
6891 if ((op & 0x80) != 0)
6892 op -= 0x100;
6893 mask = 0xffffffff;
6894 break;
6895 case v_mode:
6896 USED_REX (REX_W);
6897 if (rex & REX_W)
6898 op = get32s ();
6899 else if (sizeflag & DFLAG)
6900 {
6901 op = get32s ();
6902 mask = 0xffffffff;
6903 }
6904 else
6905 {
6906 mask = 0xffffffff;
6907 op = get16 ();
6908 if ((op & 0x8000) != 0)
6909 op -= 0x10000;
6910 }
6911 used_prefixes |= (prefixes & PREFIX_DATA);
6912 break;
6913 case w_mode:
6914 op = get16 ();
6915 mask = 0xffffffff;
6916 if ((op & 0x8000) != 0)
6917 op -= 0x10000;
6918 break;
6919 default:
6920 oappend (INTERNAL_DISASSEMBLER_ERROR);
6921 return;
6922 }
6923
6924 scratchbuf[0] = '$';
6925 print_operand_value (scratchbuf + 1, 1, op);
6926 oappend (scratchbuf + intel_syntax);
6927 }
6928
6929 static void
6930 OP_J (int bytemode, int sizeflag)
6931 {
6932 bfd_vma disp;
6933 bfd_vma mask = -1;
6934 bfd_vma segment = 0;
6935
6936 switch (bytemode)
6937 {
6938 case b_mode:
6939 FETCH_DATA (the_info, codep + 1);
6940 disp = *codep++;
6941 if ((disp & 0x80) != 0)
6942 disp -= 0x100;
6943 break;
6944 case v_mode:
6945 if ((sizeflag & DFLAG) || (rex & REX_W))
6946 disp = get32s ();
6947 else
6948 {
6949 disp = get16 ();
6950 if ((disp & 0x8000) != 0)
6951 disp -= 0x10000;
6952 /* In 16bit mode, address is wrapped around at 64k within
6953 the same segment. Otherwise, a data16 prefix on a jump
6954 instruction means that the pc is masked to 16 bits after
6955 the displacement is added! */
6956 mask = 0xffff;
6957 if ((prefixes & PREFIX_DATA) == 0)
6958 segment = ((start_pc + codep - start_codep)
6959 & ~((bfd_vma) 0xffff));
6960 }
6961 used_prefixes |= (prefixes & PREFIX_DATA);
6962 break;
6963 default:
6964 oappend (INTERNAL_DISASSEMBLER_ERROR);
6965 return;
6966 }
6967 disp = ((start_pc + codep - start_codep + disp) & mask) | segment;
6968 set_op (disp, 0);
6969 print_operand_value (scratchbuf, 1, disp);
6970 oappend (scratchbuf);
6971 }
6972
6973 static void
6974 OP_SEG (int bytemode, int sizeflag)
6975 {
6976 if (bytemode == w_mode)
6977 oappend (names_seg[modrm.reg]);
6978 else
6979 OP_E (modrm.mod == 3 ? bytemode : w_mode, sizeflag);
6980 }
6981
6982 static void
6983 OP_DIR (int dummy ATTRIBUTE_UNUSED, int sizeflag)
6984 {
6985 int seg, offset;
6986
6987 if (sizeflag & DFLAG)
6988 {
6989 offset = get32 ();
6990 seg = get16 ();
6991 }
6992 else
6993 {
6994 offset = get16 ();
6995 seg = get16 ();
6996 }
6997 used_prefixes |= (prefixes & PREFIX_DATA);
6998 if (intel_syntax)
6999 sprintf (scratchbuf, "0x%x:0x%x", seg, offset);
7000 else
7001 sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
7002 oappend (scratchbuf);
7003 }
7004
7005 static void
7006 OP_OFF (int bytemode, int sizeflag)
7007 {
7008 bfd_vma off;
7009
7010 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
7011 intel_operand_size (bytemode, sizeflag);
7012 append_seg ();
7013
7014 if ((sizeflag & AFLAG) || address_mode == mode_64bit)
7015 off = get32 ();
7016 else
7017 off = get16 ();
7018
7019 if (intel_syntax)
7020 {
7021 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
7022 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
7023 {
7024 oappend (names_seg[ds_reg - es_reg]);
7025 oappend (":");
7026 }
7027 }
7028 print_operand_value (scratchbuf, 1, off);
7029 oappend (scratchbuf);
7030 }
7031
7032 static void
7033 OP_OFF64 (int bytemode, int sizeflag)
7034 {
7035 bfd_vma off;
7036
7037 if (address_mode != mode_64bit
7038 || (prefixes & PREFIX_ADDR))
7039 {
7040 OP_OFF (bytemode, sizeflag);
7041 return;
7042 }
7043
7044 if (intel_syntax && (sizeflag & SUFFIX_ALWAYS))
7045 intel_operand_size (bytemode, sizeflag);
7046 append_seg ();
7047
7048 off = get64 ();
7049
7050 if (intel_syntax)
7051 {
7052 if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
7053 | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
7054 {
7055 oappend (names_seg[ds_reg - es_reg]);
7056 oappend (":");
7057 }
7058 }
7059 print_operand_value (scratchbuf, 1, off);
7060 oappend (scratchbuf);
7061 }
7062
7063 static void
7064 ptr_reg (int code, int sizeflag)
7065 {
7066 const char *s;
7067
7068 *obufp++ = open_char;
7069 used_prefixes |= (prefixes & PREFIX_ADDR);
7070 if (address_mode == mode_64bit)
7071 {
7072 if (!(sizeflag & AFLAG))
7073 s = names32[code - eAX_reg];
7074 else
7075 s = names64[code - eAX_reg];
7076 }
7077 else if (sizeflag & AFLAG)
7078 s = names32[code - eAX_reg];
7079 else
7080 s = names16[code - eAX_reg];
7081 oappend (s);
7082 *obufp++ = close_char;
7083 *obufp = 0;
7084 }
7085
7086 static void
7087 OP_ESreg (int code, int sizeflag)
7088 {
7089 if (intel_syntax)
7090 {
7091 switch (codep[-1])
7092 {
7093 case 0x6d: /* insw/insl */
7094 intel_operand_size (z_mode, sizeflag);
7095 break;
7096 case 0xa5: /* movsw/movsl/movsq */
7097 case 0xa7: /* cmpsw/cmpsl/cmpsq */
7098 case 0xab: /* stosw/stosl */
7099 case 0xaf: /* scasw/scasl */
7100 intel_operand_size (v_mode, sizeflag);
7101 break;
7102 default:
7103 intel_operand_size (b_mode, sizeflag);
7104 }
7105 }
7106 oappend ("%es:" + intel_syntax);
7107 ptr_reg (code, sizeflag);
7108 }
7109
7110 static void
7111 OP_DSreg (int code, int sizeflag)
7112 {
7113 if (intel_syntax)
7114 {
7115 switch (codep[-1])
7116 {
7117 case 0x6f: /* outsw/outsl */
7118 intel_operand_size (z_mode, sizeflag);
7119 break;
7120 case 0xa5: /* movsw/movsl/movsq */
7121 case 0xa7: /* cmpsw/cmpsl/cmpsq */
7122 case 0xad: /* lodsw/lodsl/lodsq */
7123 intel_operand_size (v_mode, sizeflag);
7124 break;
7125 default:
7126 intel_operand_size (b_mode, sizeflag);
7127 }
7128 }
7129 if ((prefixes
7130 & (PREFIX_CS
7131 | PREFIX_DS
7132 | PREFIX_SS
7133 | PREFIX_ES
7134 | PREFIX_FS
7135 | PREFIX_GS)) == 0)
7136 prefixes |= PREFIX_DS;
7137 append_seg ();
7138 ptr_reg (code, sizeflag);
7139 }
7140
7141 static void
7142 OP_C (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7143 {
7144 int add = 0;
7145 if (rex & REX_R)
7146 {
7147 USED_REX (REX_R);
7148 add = 8;
7149 }
7150 else if (address_mode != mode_64bit && (prefixes & PREFIX_LOCK))
7151 {
7152 lock_prefix = NULL;
7153 used_prefixes |= PREFIX_LOCK;
7154 add = 8;
7155 }
7156 sprintf (scratchbuf, "%%cr%d", modrm.reg + add);
7157 oappend (scratchbuf + intel_syntax);
7158 }
7159
7160 static void
7161 OP_D (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7162 {
7163 int add = 0;
7164 USED_REX (REX_R);
7165 if (rex & REX_R)
7166 add = 8;
7167 if (intel_syntax)
7168 sprintf (scratchbuf, "db%d", modrm.reg + add);
7169 else
7170 sprintf (scratchbuf, "%%db%d", modrm.reg + add);
7171 oappend (scratchbuf);
7172 }
7173
7174 static void
7175 OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7176 {
7177 sprintf (scratchbuf, "%%tr%d", modrm.reg);
7178 oappend (scratchbuf + intel_syntax);
7179 }
7180
7181 static void
7182 OP_R (int bytemode, int sizeflag)
7183 {
7184 if (modrm.mod == 3)
7185 OP_E (bytemode, sizeflag);
7186 else
7187 BadOp ();
7188 }
7189
7190 static void
7191 OP_MMX (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7192 {
7193 used_prefixes |= (prefixes & PREFIX_DATA);
7194 if (prefixes & PREFIX_DATA)
7195 {
7196 int add = 0;
7197 USED_REX (REX_R);
7198 if (rex & REX_R)
7199 add = 8;
7200 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
7201 }
7202 else
7203 sprintf (scratchbuf, "%%mm%d", modrm.reg);
7204 oappend (scratchbuf + intel_syntax);
7205 }
7206
7207 static void
7208 OP_XMM (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7209 {
7210 int add = 0;
7211 USED_REX (REX_R);
7212 if (rex & REX_R)
7213 add = 8;
7214 sprintf (scratchbuf, "%%xmm%d", modrm.reg + add);
7215 oappend (scratchbuf + intel_syntax);
7216 }
7217
7218 static void
7219 OP_EM (int bytemode, int sizeflag)
7220 {
7221 if (modrm.mod != 3)
7222 {
7223 if (intel_syntax && bytemode == v_mode)
7224 {
7225 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
7226 used_prefixes |= (prefixes & PREFIX_DATA);
7227 }
7228 OP_E (bytemode, sizeflag);
7229 return;
7230 }
7231
7232 /* Skip mod/rm byte. */
7233 MODRM_CHECK;
7234 codep++;
7235 used_prefixes |= (prefixes & PREFIX_DATA);
7236 if (prefixes & PREFIX_DATA)
7237 {
7238 int add = 0;
7239
7240 USED_REX (REX_B);
7241 if (rex & REX_B)
7242 add = 8;
7243 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
7244 }
7245 else
7246 sprintf (scratchbuf, "%%mm%d", modrm.rm);
7247 oappend (scratchbuf + intel_syntax);
7248 }
7249
7250 /* cvt* are the only instructions in sse2 which have
7251 both SSE and MMX operands and also have 0x66 prefix
7252 in their opcode. 0x66 was originally used to differentiate
7253 between SSE and MMX instruction(operands). So we have to handle the
7254 cvt* separately using OP_EMC and OP_MXC */
7255 static void
7256 OP_EMC (int bytemode, int sizeflag)
7257 {
7258 if (modrm.mod != 3)
7259 {
7260 if (intel_syntax && bytemode == v_mode)
7261 {
7262 bytemode = (prefixes & PREFIX_DATA) ? x_mode : q_mode;
7263 used_prefixes |= (prefixes & PREFIX_DATA);
7264 }
7265 OP_E (bytemode, sizeflag);
7266 return;
7267 }
7268
7269 /* Skip mod/rm byte. */
7270 MODRM_CHECK;
7271 codep++;
7272 used_prefixes |= (prefixes & PREFIX_DATA);
7273 sprintf (scratchbuf, "%%mm%d", modrm.rm);
7274 oappend (scratchbuf + intel_syntax);
7275 }
7276
7277 static void
7278 OP_MXC (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7279 {
7280 used_prefixes |= (prefixes & PREFIX_DATA);
7281 sprintf (scratchbuf, "%%mm%d", modrm.reg);
7282 oappend (scratchbuf + intel_syntax);
7283 }
7284
7285 static void
7286 OP_EX (int bytemode, int sizeflag)
7287 {
7288 int add = 0;
7289 if (modrm.mod != 3)
7290 {
7291 OP_E (bytemode, sizeflag);
7292 return;
7293 }
7294 USED_REX (REX_B);
7295 if (rex & REX_B)
7296 add = 8;
7297
7298 /* Skip mod/rm byte. */
7299 MODRM_CHECK;
7300 codep++;
7301 sprintf (scratchbuf, "%%xmm%d", modrm.rm + add);
7302 oappend (scratchbuf + intel_syntax);
7303 }
7304
7305 static void
7306 OP_MS (int bytemode, int sizeflag)
7307 {
7308 if (modrm.mod == 3)
7309 OP_EM (bytemode, sizeflag);
7310 else
7311 BadOp ();
7312 }
7313
7314 static void
7315 OP_XS (int bytemode, int sizeflag)
7316 {
7317 if (modrm.mod == 3)
7318 OP_EX (bytemode, sizeflag);
7319 else
7320 BadOp ();
7321 }
7322
7323 static void
7324 OP_M (int bytemode, int sizeflag)
7325 {
7326 if (modrm.mod == 3)
7327 /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
7328 BadOp ();
7329 else
7330 OP_E (bytemode, sizeflag);
7331 }
7332
7333 static void
7334 OP_0f07 (int bytemode, int sizeflag)
7335 {
7336 if (modrm.mod != 3 || modrm.rm != 0)
7337 BadOp ();
7338 else
7339 OP_E (bytemode, sizeflag);
7340 }
7341
7342 /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
7343 32bit mode and "xchg %rax,%rax" in 64bit mode. */
7344
7345 static void
7346 NOP_Fixup1 (int bytemode, int sizeflag)
7347 {
7348 if ((prefixes & PREFIX_DATA) != 0
7349 || (rex != 0
7350 && rex != 0x48
7351 && address_mode == mode_64bit))
7352 OP_REG (bytemode, sizeflag);
7353 else
7354 strcpy (obuf, "nop");
7355 }
7356
7357 static void
7358 NOP_Fixup2 (int bytemode, int sizeflag)
7359 {
7360 if ((prefixes & PREFIX_DATA) != 0
7361 || (rex != 0
7362 && rex != 0x48
7363 && address_mode == mode_64bit))
7364 OP_IMREG (bytemode, sizeflag);
7365 }
7366
7367 static const char *const Suffix3DNow[] = {
7368 /* 00 */ NULL, NULL, NULL, NULL,
7369 /* 04 */ NULL, NULL, NULL, NULL,
7370 /* 08 */ NULL, NULL, NULL, NULL,
7371 /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
7372 /* 10 */ NULL, NULL, NULL, NULL,
7373 /* 14 */ NULL, NULL, NULL, NULL,
7374 /* 18 */ NULL, NULL, NULL, NULL,
7375 /* 1C */ "pf2iw", "pf2id", NULL, NULL,
7376 /* 20 */ NULL, NULL, NULL, NULL,
7377 /* 24 */ NULL, NULL, NULL, NULL,
7378 /* 28 */ NULL, NULL, NULL, NULL,
7379 /* 2C */ NULL, NULL, NULL, NULL,
7380 /* 30 */ NULL, NULL, NULL, NULL,
7381 /* 34 */ NULL, NULL, NULL, NULL,
7382 /* 38 */ NULL, NULL, NULL, NULL,
7383 /* 3C */ NULL, NULL, NULL, NULL,
7384 /* 40 */ NULL, NULL, NULL, NULL,
7385 /* 44 */ NULL, NULL, NULL, NULL,
7386 /* 48 */ NULL, NULL, NULL, NULL,
7387 /* 4C */ NULL, NULL, NULL, NULL,
7388 /* 50 */ NULL, NULL, NULL, NULL,
7389 /* 54 */ NULL, NULL, NULL, NULL,
7390 /* 58 */ NULL, NULL, NULL, NULL,
7391 /* 5C */ NULL, NULL, NULL, NULL,
7392 /* 60 */ NULL, NULL, NULL, NULL,
7393 /* 64 */ NULL, NULL, NULL, NULL,
7394 /* 68 */ NULL, NULL, NULL, NULL,
7395 /* 6C */ NULL, NULL, NULL, NULL,
7396 /* 70 */ NULL, NULL, NULL, NULL,
7397 /* 74 */ NULL, NULL, NULL, NULL,
7398 /* 78 */ NULL, NULL, NULL, NULL,
7399 /* 7C */ NULL, NULL, NULL, NULL,
7400 /* 80 */ NULL, NULL, NULL, NULL,
7401 /* 84 */ NULL, NULL, NULL, NULL,
7402 /* 88 */ NULL, NULL, "pfnacc", NULL,
7403 /* 8C */ NULL, NULL, "pfpnacc", NULL,
7404 /* 90 */ "pfcmpge", NULL, NULL, NULL,
7405 /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
7406 /* 98 */ NULL, NULL, "pfsub", NULL,
7407 /* 9C */ NULL, NULL, "pfadd", NULL,
7408 /* A0 */ "pfcmpgt", NULL, NULL, NULL,
7409 /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
7410 /* A8 */ NULL, NULL, "pfsubr", NULL,
7411 /* AC */ NULL, NULL, "pfacc", NULL,
7412 /* B0 */ "pfcmpeq", NULL, NULL, NULL,
7413 /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
7414 /* B8 */ NULL, NULL, NULL, "pswapd",
7415 /* BC */ NULL, NULL, NULL, "pavgusb",
7416 /* C0 */ NULL, NULL, NULL, NULL,
7417 /* C4 */ NULL, NULL, NULL, NULL,
7418 /* C8 */ NULL, NULL, NULL, NULL,
7419 /* CC */ NULL, NULL, NULL, NULL,
7420 /* D0 */ NULL, NULL, NULL, NULL,
7421 /* D4 */ NULL, NULL, NULL, NULL,
7422 /* D8 */ NULL, NULL, NULL, NULL,
7423 /* DC */ NULL, NULL, NULL, NULL,
7424 /* E0 */ NULL, NULL, NULL, NULL,
7425 /* E4 */ NULL, NULL, NULL, NULL,
7426 /* E8 */ NULL, NULL, NULL, NULL,
7427 /* EC */ NULL, NULL, NULL, NULL,
7428 /* F0 */ NULL, NULL, NULL, NULL,
7429 /* F4 */ NULL, NULL, NULL, NULL,
7430 /* F8 */ NULL, NULL, NULL, NULL,
7431 /* FC */ NULL, NULL, NULL, NULL,
7432 };
7433
7434 static void
7435 OP_3DNowSuffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7436 {
7437 const char *mnemonic;
7438
7439 FETCH_DATA (the_info, codep + 1);
7440 /* AMD 3DNow! instructions are specified by an opcode suffix in the
7441 place where an 8-bit immediate would normally go. ie. the last
7442 byte of the instruction. */
7443 obufp = obuf + strlen (obuf);
7444 mnemonic = Suffix3DNow[*codep++ & 0xff];
7445 if (mnemonic)
7446 oappend (mnemonic);
7447 else
7448 {
7449 /* Since a variable sized modrm/sib chunk is between the start
7450 of the opcode (0x0f0f) and the opcode suffix, we need to do
7451 all the modrm processing first, and don't know until now that
7452 we have a bad opcode. This necessitates some cleaning up. */
7453 op_out[0][0] = '\0';
7454 op_out[1][0] = '\0';
7455 BadOp ();
7456 }
7457 }
7458
7459 static const char *simd_cmp_op[] = {
7460 "eq",
7461 "lt",
7462 "le",
7463 "unord",
7464 "neq",
7465 "nlt",
7466 "nle",
7467 "ord"
7468 };
7469
7470 static void
7471 OP_SIMD_Suffix (int bytemode ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED)
7472 {
7473 unsigned int cmp_type;
7474
7475 FETCH_DATA (the_info, codep + 1);
7476 obufp = obuf + strlen (obuf);
7477 cmp_type = *codep++ & 0xff;
7478 if (cmp_type < 8)
7479 {
7480 char suffix1 = 'p', suffix2 = 's';
7481 used_prefixes |= (prefixes & PREFIX_REPZ);
7482 if (prefixes & PREFIX_REPZ)
7483 suffix1 = 's';
7484 else
7485 {
7486 used_prefixes |= (prefixes & PREFIX_DATA);
7487 if (prefixes & PREFIX_DATA)
7488 suffix2 = 'd';
7489 else
7490 {
7491 used_prefixes |= (prefixes & PREFIX_REPNZ);
7492 if (prefixes & PREFIX_REPNZ)
7493 suffix1 = 's', suffix2 = 'd';
7494 }
7495 }
7496 sprintf (scratchbuf, "cmp%s%c%c",
7497 simd_cmp_op[cmp_type], suffix1, suffix2);
7498 used_prefixes |= (prefixes & PREFIX_REPZ);
7499 oappend (scratchbuf);
7500 }
7501 else
7502 {
7503 /* We have a bad extension byte. Clean up. */
7504 op_out[0][0] = '\0';
7505 op_out[1][0] = '\0';
7506 BadOp ();
7507 }
7508 }
7509
7510 static void
7511 OP_Mwait (int bytemode ATTRIBUTE_UNUSED,
7512 int sizeflag ATTRIBUTE_UNUSED)
7513 {
7514 /* mwait %eax,%ecx */
7515 if (!intel_syntax)
7516 {
7517 const char **names = (address_mode == mode_64bit
7518 ? names64 : names32);
7519 strcpy (op_out[0], names[0]);
7520 strcpy (op_out[1], names[1]);
7521 two_source_ops = 1;
7522 }
7523 /* Skip mod/rm byte. */
7524 MODRM_CHECK;
7525 codep++;
7526 }
7527
7528 static void
7529 OP_Monitor (int bytemode ATTRIBUTE_UNUSED,
7530 int sizeflag ATTRIBUTE_UNUSED)
7531 {
7532 /* monitor %eax,%ecx,%edx" */
7533 if (!intel_syntax)
7534 {
7535 const char **op1_names;
7536 const char **names = (address_mode == mode_64bit
7537 ? names64 : names32);
7538
7539 if (!(prefixes & PREFIX_ADDR))
7540 op1_names = (address_mode == mode_16bit
7541 ? names16 : names);
7542 else
7543 {
7544 /* Remove "addr16/addr32". */
7545 addr_prefix = NULL;
7546 op1_names = (address_mode != mode_32bit
7547 ? names32 : names16);
7548 used_prefixes |= PREFIX_ADDR;
7549 }
7550 strcpy (op_out[0], op1_names[0]);
7551 strcpy (op_out[1], names[1]);
7552 strcpy (op_out[2], names[2]);
7553 two_source_ops = 1;
7554 }
7555 /* Skip mod/rm byte. */
7556 MODRM_CHECK;
7557 codep++;
7558 }
7559
7560 static void
7561 BadOp (void)
7562 {
7563 /* Throw away prefixes and 1st. opcode byte. */
7564 codep = insn_codep + 1;
7565 oappend ("(bad)");
7566 }
7567
7568 static void
7569 REP_Fixup (int bytemode, int sizeflag)
7570 {
7571 /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
7572 lods and stos. */
7573 if (prefixes & PREFIX_REPZ)
7574 repz_prefix = "rep ";
7575
7576 switch (bytemode)
7577 {
7578 case al_reg:
7579 case eAX_reg:
7580 case indir_dx_reg:
7581 OP_IMREG (bytemode, sizeflag);
7582 break;
7583 case eDI_reg:
7584 OP_ESreg (bytemode, sizeflag);
7585 break;
7586 case eSI_reg:
7587 OP_DSreg (bytemode, sizeflag);
7588 break;
7589 default:
7590 abort ();
7591 break;
7592 }
7593 }
7594
7595 static void
7596 CMPXCHG8B_Fixup (int bytemode, int sizeflag)
7597 {
7598 USED_REX (REX_W);
7599 if (rex & REX_W)
7600 {
7601 /* Change cmpxchg8b to cmpxchg16b. */
7602 char *p = obuf + strlen (obuf) - 2;
7603 strcpy (p, "16b");
7604 bytemode = o_mode;
7605 }
7606 OP_M (bytemode, sizeflag);
7607 }
7608
7609 static void
7610 XMM_Fixup (int reg, int sizeflag ATTRIBUTE_UNUSED)
7611 {
7612 sprintf (scratchbuf, "%%xmm%d", reg);
7613 oappend (scratchbuf + intel_syntax);
7614 }
7615
7616 static void
7617 CRC32_Fixup (int bytemode, int sizeflag)
7618 {
7619 /* Add proper suffix to "crc32". */
7620 char *p = obuf + strlen (obuf);
7621
7622 switch (bytemode)
7623 {
7624 case b_mode:
7625 if (intel_syntax)
7626 break;
7627
7628 *p++ = 'b';
7629 break;
7630 case v_mode:
7631 if (intel_syntax)
7632 break;
7633
7634 USED_REX (REX_W);
7635 if (rex & REX_W)
7636 *p++ = 'q';
7637 else if (sizeflag & DFLAG)
7638 *p++ = 'l';
7639 else
7640 *p++ = 'w';
7641 used_prefixes |= (prefixes & PREFIX_DATA);
7642 break;
7643 default:
7644 oappend (INTERNAL_DISASSEMBLER_ERROR);
7645 break;
7646 }
7647 *p = '\0';
7648
7649 if (modrm.mod == 3)
7650 {
7651 int add;
7652
7653 /* Skip mod/rm byte. */
7654 MODRM_CHECK;
7655 codep++;
7656
7657 USED_REX (REX_B);
7658 add = (rex & REX_B) ? 8 : 0;
7659 if (bytemode == b_mode)
7660 {
7661 USED_REX (0);
7662 if (rex)
7663 oappend (names8rex[modrm.rm + add]);
7664 else
7665 oappend (names8[modrm.rm + add]);
7666 }
7667 else
7668 {
7669 USED_REX (REX_W);
7670 if (rex & REX_W)
7671 oappend (names64[modrm.rm + add]);
7672 else if ((prefixes & PREFIX_DATA))
7673 oappend (names16[modrm.rm + add]);
7674 else
7675 oappend (names32[modrm.rm + add]);
7676 }
7677 }
7678 else
7679 OP_E (bytemode, sizeflag);
7680 }
7681
7682 /* Print a DREX argument as either a register or memory operation. */
7683 static void
7684 print_drex_arg (unsigned int reg, int bytemode, int sizeflag)
7685 {
7686 if (reg == DREX_REG_UNKNOWN)
7687 BadOp ();
7688
7689 else if (reg != DREX_REG_MEMORY)
7690 {
7691 sprintf (scratchbuf, "%%xmm%d", reg);
7692 oappend (scratchbuf + intel_syntax);
7693 }
7694
7695 else
7696 OP_E_extended (bytemode, sizeflag, 1);
7697 }
7698
7699 /* SSE5 instructions that have 4 arguments are encoded as:
7700 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset>.
7701
7702 The <sub-opcode> byte has 1 bit (0x4) that is combined with 1 bit in
7703 the DREX field (0x8) to determine how the arguments are laid out.
7704 The destination register must be the same register as one of the
7705 inputs, and it is encoded in the DREX byte. No REX prefix is used
7706 for these instructions, since the DREX field contains the 3 extension
7707 bits provided by the REX prefix.
7708
7709 The bytemode argument adds 2 extra bits for passing extra information:
7710 DREX_OC1 -- Set the OC1 bit to indicate dest == 1st arg
7711 DREX_NO_OC0 -- OC0 in DREX is invalid
7712 (but pretend it is set). */
7713
7714 static void
7715 OP_DREX4 (int flag_bytemode, int sizeflag)
7716 {
7717 unsigned int drex_byte;
7718 unsigned int regs[4];
7719 unsigned int modrm_regmem;
7720 unsigned int modrm_reg;
7721 unsigned int drex_reg;
7722 int bytemode;
7723 int rex_save = rex;
7724 int rex_used_save = rex_used;
7725 int has_sib = 0;
7726 int oc1 = (flag_bytemode & DREX_OC1) ? 2 : 0;
7727 int oc0;
7728 int i;
7729
7730 bytemode = flag_bytemode & ~ DREX_MASK;
7731
7732 for (i = 0; i < 4; i++)
7733 regs[i] = DREX_REG_UNKNOWN;
7734
7735 /* Determine if we have a SIB byte in addition to MODRM before the
7736 DREX byte. */
7737 if (((sizeflag & AFLAG) || address_mode == mode_64bit)
7738 && (modrm.mod != 3)
7739 && (modrm.rm == 4))
7740 has_sib = 1;
7741
7742 /* Get the DREX byte. */
7743 FETCH_DATA (the_info, codep + 2 + has_sib);
7744 drex_byte = codep[has_sib+1];
7745 drex_reg = DREX_XMM (drex_byte);
7746 modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
7747
7748 /* Is OC0 legal? If not, hardwire oc0 == 1. */
7749 if (flag_bytemode & DREX_NO_OC0)
7750 {
7751 oc0 = 1;
7752 if (DREX_OC0 (drex_byte))
7753 BadOp ();
7754 }
7755 else
7756 oc0 = DREX_OC0 (drex_byte);
7757
7758 if (modrm.mod == 3)
7759 {
7760 /* regmem == register */
7761 modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
7762 rex = rex_used = 0;
7763 /* skip modrm/drex since we don't call OP_E_extended */
7764 codep += 2;
7765 }
7766 else
7767 {
7768 /* regmem == memory, fill in appropriate REX bits */
7769 modrm_regmem = DREX_REG_MEMORY;
7770 rex = drex_byte & (REX_B | REX_X | REX_R);
7771 if (rex)
7772 rex |= REX_OPCODE;
7773 rex_used = rex;
7774 }
7775
7776 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
7777 order. */
7778 switch (oc0 + oc1)
7779 {
7780 default:
7781 BadOp ();
7782 return;
7783
7784 case 0:
7785 regs[0] = modrm_regmem;
7786 regs[1] = modrm_reg;
7787 regs[2] = drex_reg;
7788 regs[3] = drex_reg;
7789 break;
7790
7791 case 1:
7792 regs[0] = modrm_reg;
7793 regs[1] = modrm_regmem;
7794 regs[2] = drex_reg;
7795 regs[3] = drex_reg;
7796 break;
7797
7798 case 2:
7799 regs[0] = drex_reg;
7800 regs[1] = modrm_regmem;
7801 regs[2] = modrm_reg;
7802 regs[3] = drex_reg;
7803 break;
7804
7805 case 3:
7806 regs[0] = drex_reg;
7807 regs[1] = modrm_reg;
7808 regs[2] = modrm_regmem;
7809 regs[3] = drex_reg;
7810 break;
7811 }
7812
7813 /* Print out the arguments. */
7814 for (i = 0; i < 4; i++)
7815 {
7816 int j = (intel_syntax) ? 3 - i : i;
7817 if (i > 0)
7818 {
7819 *obufp++ = ',';
7820 *obufp = '\0';
7821 }
7822
7823 print_drex_arg (regs[j], bytemode, sizeflag);
7824 }
7825
7826 rex = rex_save;
7827 rex_used = rex_used_save;
7828 }
7829
7830 /* SSE5 instructions that have 3 arguments, and are encoded as:
7831 0f 24 <sub-opcode> <modrm> <optional-sib> <drex> <offset> (or)
7832 0f 25 <sub-opcode> <modrm> <optional-sib> <drex> <offset> <cmp-byte>
7833
7834 The DREX field has 1 bit (0x8) to determine how the arguments are
7835 laid out. The destination register is encoded in the DREX byte.
7836 No REX prefix is used for these instructions, since the DREX field
7837 contains the 3 extension bits provided by the REX prefix. */
7838
7839 static void
7840 OP_DREX3 (int flag_bytemode, int sizeflag)
7841 {
7842 unsigned int drex_byte;
7843 unsigned int regs[3];
7844 unsigned int modrm_regmem;
7845 unsigned int modrm_reg;
7846 unsigned int drex_reg;
7847 int bytemode;
7848 int rex_save = rex;
7849 int rex_used_save = rex_used;
7850 int has_sib = 0;
7851 int oc0;
7852 int i;
7853
7854 bytemode = flag_bytemode & ~ DREX_MASK;
7855
7856 for (i = 0; i < 3; i++)
7857 regs[i] = DREX_REG_UNKNOWN;
7858
7859 /* Determine if we have a SIB byte in addition to MODRM before the
7860 DREX byte. */
7861 if (((sizeflag & AFLAG) || address_mode == mode_64bit)
7862 && (modrm.mod != 3)
7863 && (modrm.rm == 4))
7864 has_sib = 1;
7865
7866 /* Get the DREX byte. */
7867 FETCH_DATA (the_info, codep + 2 + has_sib);
7868 drex_byte = codep[has_sib+1];
7869 drex_reg = DREX_XMM (drex_byte);
7870 modrm_reg = modrm.reg + ((drex_byte & REX_R) ? 8 : 0);
7871
7872 /* Is OC0 legal? If not, hardwire oc0 == 0 */
7873 oc0 = DREX_OC0 (drex_byte);
7874 if ((flag_bytemode & DREX_NO_OC0) && oc0)
7875 BadOp ();
7876
7877 if (modrm.mod == 3)
7878 {
7879 /* regmem == register */
7880 modrm_regmem = modrm.rm + ((drex_byte & REX_B) ? 8 : 0);
7881 rex = rex_used = 0;
7882 /* skip modrm/drex since we don't call OP_E_extended. */
7883 codep += 2;
7884 }
7885 else
7886 {
7887 /* regmem == memory, fill in appropriate REX bits. */
7888 modrm_regmem = DREX_REG_MEMORY;
7889 rex = drex_byte & (REX_B | REX_X | REX_R);
7890 if (rex)
7891 rex |= REX_OPCODE;
7892 rex_used = rex;
7893 }
7894
7895 /* Based on the OC1/OC0 bits, lay out the arguments in the correct
7896 order. */
7897 switch (oc0)
7898 {
7899 default:
7900 BadOp ();
7901 return;
7902
7903 case 0:
7904 regs[0] = modrm_regmem;
7905 regs[1] = modrm_reg;
7906 regs[2] = drex_reg;
7907 break;
7908
7909 case 1:
7910 regs[0] = modrm_reg;
7911 regs[1] = modrm_regmem;
7912 regs[2] = drex_reg;
7913 break;
7914 }
7915
7916 /* Print out the arguments. */
7917 for (i = 0; i < 3; i++)
7918 {
7919 int j = (intel_syntax) ? 2 - i : i;
7920 if (i > 0)
7921 {
7922 *obufp++ = ',';
7923 *obufp = '\0';
7924 }
7925
7926 print_drex_arg (regs[j], bytemode, sizeflag);
7927 }
7928
7929 rex = rex_save;
7930 rex_used = rex_used_save;
7931 }
7932
7933 /* Emit a floating point comparison for comp<xx> instructions. */
7934
7935 static void
7936 OP_DREX_FCMP (int bytemode ATTRIBUTE_UNUSED,
7937 int sizeflag ATTRIBUTE_UNUSED)
7938 {
7939 unsigned char byte;
7940
7941 static const char *const cmp_test[] = {
7942 "eq",
7943 "lt",
7944 "le",
7945 "unord",
7946 "ne",
7947 "nlt",
7948 "nle",
7949 "ord",
7950 "ueq",
7951 "ult",
7952 "ule",
7953 "false",
7954 "une",
7955 "unlt",
7956 "unle",
7957 "true"
7958 };
7959
7960 FETCH_DATA (the_info, codep + 1);
7961 byte = *codep & 0xff;
7962
7963 if (byte >= ARRAY_SIZE (cmp_test)
7964 || obuf[0] != 'c'
7965 || obuf[1] != 'o'
7966 || obuf[2] != 'm')
7967 {
7968 /* The instruction isn't one we know about, so just append the
7969 extension byte as a numeric value. */
7970 OP_I (b_mode, 0);
7971 }
7972
7973 else
7974 {
7975 sprintf (scratchbuf, "com%s%s", cmp_test[byte], obuf+3);
7976 strcpy (obuf, scratchbuf);
7977 codep++;
7978 }
7979 }
7980
7981 /* Emit an integer point comparison for pcom<xx> instructions,
7982 rewriting the instruction to have the test inside of it. */
7983
7984 static void
7985 OP_DREX_ICMP (int bytemode ATTRIBUTE_UNUSED,
7986 int sizeflag ATTRIBUTE_UNUSED)
7987 {
7988 unsigned char byte;
7989
7990 static const char *const cmp_test[] = {
7991 "lt",
7992 "le",
7993 "gt",
7994 "ge",
7995 "eq",
7996 "ne",
7997 "false",
7998 "true"
7999 };
8000
8001 FETCH_DATA (the_info, codep + 1);
8002 byte = *codep & 0xff;
8003
8004 if (byte >= ARRAY_SIZE (cmp_test)
8005 || obuf[0] != 'p'
8006 || obuf[1] != 'c'
8007 || obuf[2] != 'o'
8008 || obuf[3] != 'm')
8009 {
8010 /* The instruction isn't one we know about, so just print the
8011 comparison test byte as a numeric value. */
8012 OP_I (b_mode, 0);
8013 }
8014
8015 else
8016 {
8017 sprintf (scratchbuf, "pcom%s%s", cmp_test[byte], obuf+4);
8018 strcpy (obuf, scratchbuf);
8019 codep++;
8020 }
8021 }
This page took 0.212652 seconds and 5 git commands to generate.