* i386-dis.c (FWAIT_OPCODE): Define.
[platform/upstream/binutils.git] / opcodes / i386-dis.c
1 /* Print i386 instructions for GDB, the GNU debugger.
2    Copyright (C) 1988, 89, 91, 93, 94, 95, 96, 97, 98, 1999
3    Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program 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 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 /*
22  * 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
23  * July 1988
24  *  modified by John Hassey (hassey@dg-rtp.dg.com)
25  */
26
27 /*
28  * The main tables describing the instructions is essentially a copy
29  * of the "Opcode Map" chapter (Appendix A) of the Intel 80386
30  * Programmers Manual.  Usually, there is a capital letter, followed
31  * by a small letter.  The capital letter tell the addressing mode,
32  * and the small letter tells about the operand size.  Refer to
33  * the Intel manual for details.
34  */
35
36 #include "dis-asm.h"
37 #include "sysdep.h"
38 #include "opintl.h"
39
40 #define MAXLEN 20
41
42 #include <setjmp.h>
43
44 #ifndef UNIXWARE_COMPAT
45 /* Set non-zero for broken, compatible instructions.  Set to zero for
46    non-broken opcodes.  */
47 #define UNIXWARE_COMPAT 1
48 #endif
49
50 static int fetch_data PARAMS ((struct disassemble_info *, bfd_byte *));
51
52 struct dis_private
53 {
54   /* Points to first byte not fetched.  */
55   bfd_byte *max_fetched;
56   bfd_byte the_buffer[MAXLEN];
57   bfd_vma insn_start;
58   jmp_buf bailout;
59 };
60
61 /* The opcode for the fwait instruction, which we treat as a prefix
62    when we can.  */
63 #define FWAIT_OPCODE (0x9b)
64
65 /* Flags for the prefixes for the current instruction.  See below.  */
66 static int prefixes;
67
68 /* Flags stored in PREFIXES.  */
69 #define PREFIX_REPZ 1
70 #define PREFIX_REPNZ 2
71 #define PREFIX_LOCK 4
72 #define PREFIX_CS 8
73 #define PREFIX_SS 0x10
74 #define PREFIX_DS 0x20
75 #define PREFIX_ES 0x40
76 #define PREFIX_FS 0x80
77 #define PREFIX_GS 0x100
78 #define PREFIX_DATA 0x200
79 #define PREFIX_ADDR 0x400
80 #define PREFIX_FWAIT 0x800
81
82 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
83    to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
84    on error.  */
85 #define FETCH_DATA(info, addr) \
86   ((addr) <= ((struct dis_private *)(info->private_data))->max_fetched \
87    ? 1 : fetch_data ((info), (addr)))
88
89 static int
90 fetch_data (info, addr)
91      struct disassemble_info *info;
92      bfd_byte *addr;
93 {
94   int status;
95   struct dis_private *priv = (struct dis_private *)info->private_data;
96   bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
97
98   status = (*info->read_memory_func) (start,
99                                       priv->max_fetched,
100                                       addr - priv->max_fetched,
101                                       info);
102   if (status != 0)
103     {
104       /* If we have found an fwait prefix and an fwait opcode, then
105          print_insn_i386 will arrange to print an instruction after we
106          longjmp, and we don't want to print an error message here.
107          This hack is required because we treat fwait as a prefix, but
108          since fwait is really an instruction we want to print a
109          standalone fwait correctly.  */
110       if ((prefixes & PREFIX_FWAIT) == 0
111           || memchr (priv->the_buffer, FWAIT_OPCODE,
112                      priv->max_fetched - priv->the_buffer) == NULL)
113         (*info->memory_error_func) (status, start, info);
114       longjmp (priv->bailout, 1);
115     }
116   else
117     priv->max_fetched = addr;
118   return 1;
119 }
120
121 #define Eb OP_E, b_mode
122 #define indirEb OP_indirE, b_mode
123 #define Gb OP_G, b_mode
124 #define Ev OP_E, v_mode
125 #define Ed OP_E, d_mode
126 #define indirEv OP_indirE, v_mode
127 #define Ew OP_E, w_mode
128 #define Ma OP_E, v_mode
129 #define M OP_E, 0               /* lea */
130 #define Mp OP_E, 0              /* 32 or 48 bit memory operand for LDS, LES etc */
131 #define Gv OP_G, v_mode
132 #define Gw OP_G, w_mode
133 #define Rd OP_Rd, d_mode
134 #define Ib OP_I, b_mode
135 #define sIb OP_sI, b_mode       /* sign extened byte */
136 #define Iv OP_I, v_mode
137 #define Iw OP_I, w_mode
138 #define Jb OP_J, b_mode
139 #define Jv OP_J, v_mode
140 #define Cd OP_C, d_mode
141 #define Dd OP_D, d_mode
142 #define Td OP_T, d_mode
143
144 #define eAX OP_REG, eAX_reg
145 #define eBX OP_REG, eBX_reg
146 #define eCX OP_REG, eCX_reg
147 #define eDX OP_REG, eDX_reg
148 #define eSP OP_REG, eSP_reg
149 #define eBP OP_REG, eBP_reg
150 #define eSI OP_REG, eSI_reg
151 #define eDI OP_REG, eDI_reg
152 #define AL OP_REG, al_reg
153 #define CL OP_REG, cl_reg
154 #define DL OP_REG, dl_reg
155 #define BL OP_REG, bl_reg
156 #define AH OP_REG, ah_reg
157 #define CH OP_REG, ch_reg
158 #define DH OP_REG, dh_reg
159 #define BH OP_REG, bh_reg
160 #define AX OP_REG, ax_reg
161 #define DX OP_REG, dx_reg
162 #define indirDX OP_REG, indir_dx_reg
163
164 #define Sw OP_SEG, w_mode
165 #define Ap OP_DIR, 0
166 #define Ob OP_OFF, b_mode
167 #define Ov OP_OFF, v_mode
168 #define Xb OP_DSreg, eSI_reg
169 #define Xv OP_DSreg, eSI_reg
170 #define Yb OP_ESreg, eDI_reg
171 #define Yv OP_ESreg, eDI_reg
172 #define DSBX OP_DSreg, eBX_reg
173
174 #define es OP_REG, es_reg
175 #define ss OP_REG, ss_reg
176 #define cs OP_REG, cs_reg
177 #define ds OP_REG, ds_reg
178 #define fs OP_REG, fs_reg
179 #define gs OP_REG, gs_reg
180
181 #define MX OP_MMX, 0
182 #define XM OP_XMM, 0
183 #define EM OP_EM, v_mode
184 #define EX OP_EX, v_mode
185 #define MS OP_MS, v_mode
186 #define None OP_E, 0
187 #define OPSUF OP_3DNowSuffix, 0
188 #define OPSIMD OP_SIMD_Suffix, 0
189
190 /* bits in sizeflag */
191 #if 0 /* leave undefined until someone adds the extra flag to objdump */
192 #define SUFFIX_ALWAYS 4
193 #endif
194 #define AFLAG 2
195 #define DFLAG 1
196
197 typedef void (*op_rtn) PARAMS ((int bytemode, int sizeflag));
198
199 static void OP_E PARAMS ((int, int));
200 static void OP_G PARAMS ((int, int));
201 static void OP_I PARAMS ((int, int));
202 static void OP_indirE PARAMS ((int, int));
203 static void OP_sI PARAMS ((int, int));
204 static void OP_REG PARAMS ((int, int));
205 static void OP_J PARAMS ((int, int));
206 static void OP_DIR PARAMS ((int, int));
207 static void OP_OFF PARAMS ((int, int));
208 static void OP_ESreg PARAMS ((int, int));
209 static void OP_DSreg PARAMS ((int, int));
210 static void OP_SEG PARAMS ((int, int));
211 static void OP_C PARAMS ((int, int));
212 static void OP_D PARAMS ((int, int));
213 static void OP_T PARAMS ((int, int));
214 static void OP_Rd PARAMS ((int, int));
215 static void OP_ST PARAMS ((int, int));
216 static void OP_STi  PARAMS ((int, int));
217 static void OP_MMX PARAMS ((int, int));
218 static void OP_XMM PARAMS ((int, int));
219 static void OP_EM PARAMS ((int, int));
220 static void OP_EX PARAMS ((int, int));
221 static void OP_MS PARAMS ((int, int));
222 static void OP_3DNowSuffix PARAMS ((int, int));
223 static void OP_SIMD_Suffix PARAMS ((int, int));
224 static void SIMD_Fixup PARAMS ((int, int));
225
226 static void append_seg PARAMS ((void));
227 static void set_op PARAMS ((unsigned int op));
228 static void putop PARAMS ((const char *template, int sizeflag));
229 static void dofloat PARAMS ((int sizeflag));
230 static int get16 PARAMS ((void));
231 static int get32 PARAMS ((void));
232 static void ckprefix PARAMS ((void));
233 static void ptr_reg PARAMS ((int, int));
234 static void BadOp PARAMS ((void));
235
236 #define b_mode 1
237 #define v_mode 2
238 #define w_mode 3
239 #define d_mode 4
240 #define x_mode 5
241
242 #define es_reg 100
243 #define cs_reg 101
244 #define ss_reg 102
245 #define ds_reg 103
246 #define fs_reg 104
247 #define gs_reg 105
248
249 #define eAX_reg 108
250 #define eCX_reg 109
251 #define eDX_reg 110
252 #define eBX_reg 111
253 #define eSP_reg 112
254 #define eBP_reg 113
255 #define eSI_reg 114
256 #define eDI_reg 115
257
258 #define al_reg 116
259 #define cl_reg 117
260 #define dl_reg 118
261 #define bl_reg 119
262 #define ah_reg 120
263 #define ch_reg 121
264 #define dh_reg 122
265 #define bh_reg 123
266
267 #define ax_reg 124
268 #define cx_reg 125
269 #define dx_reg 126
270 #define bx_reg 127
271 #define sp_reg 128
272 #define bp_reg 129
273 #define si_reg 130
274 #define di_reg 131
275
276 #define indir_dx_reg 150
277
278 #define USE_GROUPS 1
279 #define USE_PREFIX_USER_TABLE 2
280
281 #define GRP1b NULL, NULL, 0, NULL, USE_GROUPS
282 #define GRP1S NULL, NULL, 1, NULL, USE_GROUPS
283 #define GRP1Ss NULL, NULL, 2, NULL, USE_GROUPS
284 #define GRP2b NULL, NULL, 3, NULL, USE_GROUPS
285 #define GRP2S NULL, NULL, 4, NULL, USE_GROUPS
286 #define GRP2b_one NULL, NULL, 5, NULL, USE_GROUPS
287 #define GRP2S_one NULL, NULL, 6, NULL, USE_GROUPS
288 #define GRP2b_cl NULL, NULL, 7, NULL, USE_GROUPS
289 #define GRP2S_cl NULL, NULL, 8, NULL, USE_GROUPS
290 #define GRP3b NULL, NULL, 9, NULL, USE_GROUPS
291 #define GRP3S NULL, NULL, 10, NULL, USE_GROUPS
292 #define GRP4  NULL, NULL, 11, NULL, USE_GROUPS
293 #define GRP5  NULL, NULL, 12, NULL, USE_GROUPS
294 #define GRP6  NULL, NULL, 13, NULL, USE_GROUPS
295 #define GRP7 NULL, NULL, 14, NULL, USE_GROUPS
296 #define GRP8 NULL, NULL, 15, NULL, USE_GROUPS
297 #define GRP9 NULL, NULL, 16, NULL, USE_GROUPS
298 #define GRP10 NULL, NULL, 17, NULL, USE_GROUPS
299 #define GRP11 NULL, NULL, 18, NULL, USE_GROUPS
300 #define GRP12 NULL, NULL, 19, NULL, USE_GROUPS
301 #define GRP13 NULL, NULL, 20, NULL, USE_GROUPS
302 #define GRP14 NULL, NULL, 21, NULL, USE_GROUPS
303 #define GRPAMD NULL, NULL, 22, NULL, USE_GROUPS
304
305 #define PREGRP0 NULL, NULL, 0, NULL, USE_PREFIX_USER_TABLE
306 #define PREGRP1 NULL, NULL, 1, NULL, USE_PREFIX_USER_TABLE
307 #define PREGRP2 NULL, NULL, 2, NULL, USE_PREFIX_USER_TABLE
308 #define PREGRP3 NULL, NULL, 3, NULL, USE_PREFIX_USER_TABLE
309 #define PREGRP4 NULL, NULL, 4, NULL, USE_PREFIX_USER_TABLE
310 #define PREGRP5 NULL, NULL, 5, NULL, USE_PREFIX_USER_TABLE
311 #define PREGRP6 NULL, NULL, 6, NULL, USE_PREFIX_USER_TABLE
312 #define PREGRP7 NULL, NULL, 7, NULL, USE_PREFIX_USER_TABLE
313 #define PREGRP8 NULL, NULL, 8, NULL, USE_PREFIX_USER_TABLE
314 #define PREGRP9 NULL, NULL, 9, NULL, USE_PREFIX_USER_TABLE
315 #define PREGRP10 NULL, NULL, 10, NULL, USE_PREFIX_USER_TABLE
316 #define PREGRP11 NULL, NULL, 11, NULL, USE_PREFIX_USER_TABLE
317 #define PREGRP12 NULL, NULL, 12, NULL, USE_PREFIX_USER_TABLE
318 #define PREGRP13 NULL, NULL, 13, NULL, USE_PREFIX_USER_TABLE
319 #define PREGRP14 NULL, NULL, 14, NULL, USE_PREFIX_USER_TABLE
320
321 #define FLOATCODE 50
322 #define FLOAT NULL, NULL, FLOATCODE
323
324 struct dis386 {
325   const char *name;
326   op_rtn op1;
327   int bytemode1;
328   op_rtn op2;
329   int bytemode2;
330   op_rtn op3;
331   int bytemode3;
332 };
333
334 /* Upper case letters in the instruction names here are macros.
335    'A' => print 'b' if no register operands or suffix_always is true
336    'B' => print 'b' if suffix_always is true
337    'E' => print 'e' if 32-bit form of jcxz
338    'L' => print 'l' if suffix_always is true
339    'N' => print 'n' if instruction has no wait "prefix"
340    'P' => print 'w' or 'l' if instruction has an operand size prefix,
341                               or suffix_always is true
342    'Q' => print 'w' or 'l' if no register operands or suffix_always is true
343    'R' => print 'w' or 'l'
344    'S' => print 'w' or 'l' if suffix_always is true
345    'W' => print 'b' or 'w'
346 */
347
348 static const struct dis386 dis386_att[] = {
349   /* 00 */
350   { "addB",     Eb, Gb },
351   { "addS",     Ev, Gv },
352   { "addB",     Gb, Eb },
353   { "addS",     Gv, Ev },
354   { "addB",     AL, Ib },
355   { "addS",     eAX, Iv },
356   { "pushP",    es },
357   { "popP",     es },
358   /* 08 */
359   { "orB",      Eb, Gb },
360   { "orS",      Ev, Gv },
361   { "orB",      Gb, Eb },
362   { "orS",      Gv, Ev },
363   { "orB",      AL, Ib },
364   { "orS",      eAX, Iv },
365   { "pushP",    cs },
366   { "(bad)" },  /* 0x0f extended opcode escape */
367   /* 10 */
368   { "adcB",     Eb, Gb },
369   { "adcS",     Ev, Gv },
370   { "adcB",     Gb, Eb },
371   { "adcS",     Gv, Ev },
372   { "adcB",     AL, Ib },
373   { "adcS",     eAX, Iv },
374   { "pushP",    ss },
375   { "popP",     ss },
376   /* 18 */
377   { "sbbB",     Eb, Gb },
378   { "sbbS",     Ev, Gv },
379   { "sbbB",     Gb, Eb },
380   { "sbbS",     Gv, Ev },
381   { "sbbB",     AL, Ib },
382   { "sbbS",     eAX, Iv },
383   { "pushP",    ds },
384   { "popP",     ds },
385   /* 20 */
386   { "andB",     Eb, Gb },
387   { "andS",     Ev, Gv },
388   { "andB",     Gb, Eb },
389   { "andS",     Gv, Ev },
390   { "andB",     AL, Ib },
391   { "andS",     eAX, Iv },
392   { "(bad)" },                  /* SEG ES prefix */
393   { "daa" },
394   /* 28 */
395   { "subB",     Eb, Gb },
396   { "subS",     Ev, Gv },
397   { "subB",     Gb, Eb },
398   { "subS",     Gv, Ev },
399   { "subB",     AL, Ib },
400   { "subS",     eAX, Iv },
401   { "(bad)" },                  /* SEG CS prefix */
402   { "das" },
403   /* 30 */
404   { "xorB",     Eb, Gb },
405   { "xorS",     Ev, Gv },
406   { "xorB",     Gb, Eb },
407   { "xorS",     Gv, Ev },
408   { "xorB",     AL, Ib },
409   { "xorS",     eAX, Iv },
410   { "(bad)" },                  /* SEG SS prefix */
411   { "aaa" },
412   /* 38 */
413   { "cmpB",     Eb, Gb },
414   { "cmpS",     Ev, Gv },
415   { "cmpB",     Gb, Eb },
416   { "cmpS",     Gv, Ev },
417   { "cmpB",     AL, Ib },
418   { "cmpS",     eAX, Iv },
419   { "(bad)" },                  /* SEG DS prefix */
420   { "aas" },
421   /* 40 */
422   { "incS",     eAX },
423   { "incS",     eCX },
424   { "incS",     eDX },
425   { "incS",     eBX },
426   { "incS",     eSP },
427   { "incS",     eBP },
428   { "incS",     eSI },
429   { "incS",     eDI },
430   /* 48 */
431   { "decS",     eAX },
432   { "decS",     eCX },
433   { "decS",     eDX },
434   { "decS",     eBX },
435   { "decS",     eSP },
436   { "decS",     eBP },
437   { "decS",     eSI },
438   { "decS",     eDI },
439   /* 50 */
440   { "pushS",    eAX },
441   { "pushS",    eCX },
442   { "pushS",    eDX },
443   { "pushS",    eBX },
444   { "pushS",    eSP },
445   { "pushS",    eBP },
446   { "pushS",    eSI },
447   { "pushS",    eDI },
448   /* 58 */
449   { "popS",     eAX },
450   { "popS",     eCX },
451   { "popS",     eDX },
452   { "popS",     eBX },
453   { "popS",     eSP },
454   { "popS",     eBP },
455   { "popS",     eSI },
456   { "popS",     eDI },
457   /* 60 */
458   { "pushaP" },
459   { "popaP" },
460   { "boundS",   Gv, Ma },
461   { "arpl",     Ew, Gw },
462   { "(bad)" },                  /* seg fs */
463   { "(bad)" },                  /* seg gs */
464   { "(bad)" },                  /* op size prefix */
465   { "(bad)" },                  /* adr size prefix */
466   /* 68 */
467   { "pushP",    Iv },           /* 386 book wrong */
468   { "imulS",    Gv, Ev, Iv },
469   { "pushP",    sIb },          /* push of byte really pushes 2 or 4 bytes */
470   { "imulS",    Gv, Ev, sIb },
471   { "insb",     Yb, indirDX },
472   { "insR",     Yv, indirDX },
473   { "outsb",    indirDX, Xb },
474   { "outsR",    indirDX, Xv },
475   /* 70 */
476   { "jo",       Jb },
477   { "jno",      Jb },
478   { "jb",       Jb },
479   { "jae",      Jb },
480   { "je",       Jb },
481   { "jne",      Jb },
482   { "jbe",      Jb },
483   { "ja",       Jb },
484   /* 78 */
485   { "js",       Jb },
486   { "jns",      Jb },
487   { "jp",       Jb },
488   { "jnp",      Jb },
489   { "jl",       Jb },
490   { "jge",      Jb },
491   { "jle",      Jb },
492   { "jg",       Jb },
493   /* 80 */
494   { GRP1b },
495   { GRP1S },
496   { "(bad)" },
497   { GRP1Ss },
498   { "testB",    Eb, Gb },
499   { "testS",    Ev, Gv },
500   { "xchgB",    Eb, Gb },
501   { "xchgS",    Ev, Gv },
502   /* 88 */
503   { "movB",     Eb, Gb },
504   { "movS",     Ev, Gv },
505   { "movB",     Gb, Eb },
506   { "movS",     Gv, Ev },
507   { "movQ",     Ev, Sw },
508   { "leaS",     Gv, M },
509   { "movQ",     Sw, Ev },
510   { "popQ",     Ev },
511   /* 90 */
512   { "nop" },
513   { "xchgS",    eCX, eAX },
514   { "xchgS",    eDX, eAX },
515   { "xchgS",    eBX, eAX },
516   { "xchgS",    eSP, eAX },
517   { "xchgS",    eBP, eAX },
518   { "xchgS",    eSI, eAX },
519   { "xchgS",    eDI, eAX },
520   /* 98 */
521   { "cWtR" },
522   { "cRtd" },
523   { "lcallP",   Ap },
524   { "(bad)" },          /* fwait */
525   { "pushfP" },
526   { "popfP" },
527   { "sahf" },
528   { "lahf" },
529   /* a0 */
530   { "movB",     AL, Ob },
531   { "movS",     eAX, Ov },
532   { "movB",     Ob, AL },
533   { "movS",     Ov, eAX },
534   { "movsb",    Yb, Xb },
535   { "movsR",    Yv, Xv },
536   { "cmpsb",    Xb, Yb },
537   { "cmpsR",    Xv, Yv },
538   /* a8 */
539   { "testB",    AL, Ib },
540   { "testS",    eAX, Iv },
541   { "stosB",    Yb, AL },
542   { "stosS",    Yv, eAX },
543   { "lodsB",    AL, Xb },
544   { "lodsS",    eAX, Xv },
545   { "scasB",    AL, Yb },
546   { "scasS",    eAX, Yv },
547   /* b0 */
548   { "movB",     AL, Ib },
549   { "movB",     CL, Ib },
550   { "movB",     DL, Ib },
551   { "movB",     BL, Ib },
552   { "movB",     AH, Ib },
553   { "movB",     CH, Ib },
554   { "movB",     DH, Ib },
555   { "movB",     BH, Ib },
556   /* b8 */
557   { "movS",     eAX, Iv },
558   { "movS",     eCX, Iv },
559   { "movS",     eDX, Iv },
560   { "movS",     eBX, Iv },
561   { "movS",     eSP, Iv },
562   { "movS",     eBP, Iv },
563   { "movS",     eSI, Iv },
564   { "movS",     eDI, Iv },
565   /* c0 */
566   { GRP2b },
567   { GRP2S },
568   { "retP",     Iw },
569   { "retP" },
570   { "lesS",     Gv, Mp },
571   { "ldsS",     Gv, Mp },
572   { "movA",     Eb, Ib },
573   { "movQ",     Ev, Iv },
574   /* c8 */
575   { "enterP",   Iw, Ib },
576   { "leaveP" },
577   { "lretP",    Iw },
578   { "lretP" },
579   { "int3" },
580   { "int",      Ib },
581   { "into" },
582   { "iretP" },
583   /* d0 */
584   { GRP2b_one },
585   { GRP2S_one },
586   { GRP2b_cl },
587   { GRP2S_cl },
588   { "aam",      sIb },
589   { "aad",      sIb },
590   { "(bad)" },
591   { "xlat",     DSBX },
592   /* d8 */
593   { FLOAT },
594   { FLOAT },
595   { FLOAT },
596   { FLOAT },
597   { FLOAT },
598   { FLOAT },
599   { FLOAT },
600   { FLOAT },
601   /* e0 */
602   { "loopne",   Jb },
603   { "loope",    Jb },
604   { "loop",     Jb },
605   { "jEcxz",    Jb },
606   { "inB",      AL, Ib },
607   { "inS",      eAX, Ib },
608   { "outB",     Ib, AL },
609   { "outS",     Ib, eAX },
610   /* e8 */
611   { "callP",    Jv },
612   { "jmpP",     Jv },
613   { "ljmpP",    Ap },
614   { "jmp",      Jb },
615   { "inB",      AL, indirDX },
616   { "inS",      eAX, indirDX },
617   { "outB",     indirDX, AL },
618   { "outS",     indirDX, eAX },
619   /* f0 */
620   { "(bad)" },                  /* lock prefix */
621   { "(bad)" },
622   { "(bad)" },                  /* repne */
623   { "(bad)" },                  /* repz */
624   { "hlt" },
625   { "cmc" },
626   { GRP3b },
627   { GRP3S },
628   /* f8 */
629   { "clc" },
630   { "stc" },
631   { "cli" },
632   { "sti" },
633   { "cld" },
634   { "std" },
635   { GRP4 },
636   { GRP5 },
637 };
638
639 static const struct dis386 dis386_intel[] = {
640   /* 00 */
641   { "add",      Eb, Gb },
642   { "add",      Ev, Gv },
643   { "add",      Gb, Eb },
644   { "add",      Gv, Ev },
645   { "add",      AL, Ib },
646   { "add",      eAX, Iv },
647   { "push",     es },
648   { "pop",      es },
649   /* 08 */
650   { "or",       Eb, Gb },
651   { "or",       Ev, Gv },
652   { "or",       Gb, Eb },
653   { "or",       Gv, Ev },
654   { "or",       AL, Ib },
655   { "or",       eAX, Iv },
656   { "push",     cs },
657   { "(bad)" },  /* 0x0f extended opcode escape */
658   /* 10 */
659   { "adc",      Eb, Gb },
660   { "adc",      Ev, Gv },
661   { "adc",      Gb, Eb },
662   { "adc",      Gv, Ev },
663   { "adc",      AL, Ib },
664   { "adc",      eAX, Iv },
665   { "push",     ss },
666   { "pop",      ss },
667   /* 18 */
668   { "sbb",      Eb, Gb },
669   { "sbb",      Ev, Gv },
670   { "sbb",      Gb, Eb },
671   { "sbb",      Gv, Ev },
672   { "sbb",      AL, Ib },
673   { "sbb",      eAX, Iv },
674   { "push",     ds },
675   { "pop",      ds },
676   /* 20 */
677   { "and",      Eb, Gb },
678   { "and",      Ev, Gv },
679   { "and",      Gb, Eb },
680   { "and",      Gv, Ev },
681   { "and",      AL, Ib },
682   { "and",      eAX, Iv },
683   { "(bad)" },                  /* SEG ES prefix */
684   { "daa" },
685   /* 28 */
686   { "sub",      Eb, Gb },
687   { "sub",      Ev, Gv },
688   { "sub",      Gb, Eb },
689   { "sub",      Gv, Ev },
690   { "sub",      AL, Ib },
691   { "sub",      eAX, Iv },
692   { "(bad)" },                  /* SEG CS prefix */
693   { "das" },
694   /* 30 */
695   { "xor",      Eb, Gb },
696   { "xor",      Ev, Gv },
697   { "xor",      Gb, Eb },
698   { "xor",      Gv, Ev },
699   { "xor",      AL, Ib },
700   { "xor",      eAX, Iv },
701   { "(bad)" },                  /* SEG SS prefix */
702   { "aaa" },
703   /* 38 */
704   { "cmp",      Eb, Gb },
705   { "cmp",      Ev, Gv },
706   { "cmp",      Gb, Eb },
707   { "cmp",      Gv, Ev },
708   { "cmp",      AL, Ib },
709   { "cmp",      eAX, Iv },
710   { "(bad)" },                  /* SEG DS prefix */
711   { "aas" },
712   /* 40 */
713   { "inc",      eAX },
714   { "inc",      eCX },
715   { "inc",      eDX },
716   { "inc",      eBX },
717   { "inc",      eSP },
718   { "inc",      eBP },
719   { "inc",      eSI },
720   { "inc",      eDI },
721   /* 48 */
722   { "dec",      eAX },
723   { "dec",      eCX },
724   { "dec",      eDX },
725   { "dec",      eBX },
726   { "dec",      eSP },
727   { "dec",      eBP },
728   { "dec",      eSI },
729   { "dec",      eDI },
730   /* 50 */
731   { "push",     eAX },
732   { "push",     eCX },
733   { "push",     eDX },
734   { "push",     eBX },
735   { "push",     eSP },
736   { "push",     eBP },
737   { "push",     eSI },
738   { "push",     eDI },
739   /* 58 */
740   { "pop",      eAX },
741   { "pop",      eCX },
742   { "pop",      eDX },
743   { "pop",      eBX },
744   { "pop",      eSP },
745   { "pop",      eBP },
746   { "pop",      eSI },
747   { "pop",      eDI },
748   /* 60 */
749   { "pusha" },
750   { "popa" },
751   { "bound",    Gv, Ma },
752   { "arpl",     Ew, Gw },
753   { "(bad)" },                  /* seg fs */
754   { "(bad)" },                  /* seg gs */
755   { "(bad)" },                  /* op size prefix */
756   { "(bad)" },                  /* adr size prefix */
757   /* 68 */
758   { "push",     Iv },           /* 386 book wrong */
759   { "imul",     Gv, Ev, Iv },
760   { "push",     sIb },          /* push of byte really pushes 2 or 4 bytes */
761   { "imul",     Gv, Ev, sIb },
762   { "ins",      Yb, indirDX },
763   { "ins",      Yv, indirDX },
764   { "outs",     indirDX, Xb },
765   { "outs",     indirDX, Xv },
766   /* 70 */
767   { "jo",       Jb },
768   { "jno",      Jb },
769   { "jb",       Jb },
770   { "jae",      Jb },
771   { "je",       Jb },
772   { "jne",      Jb },
773   { "jbe",      Jb },
774   { "ja",       Jb },
775   /* 78 */
776   { "js",       Jb },
777   { "jns",      Jb },
778   { "jp",       Jb },
779   { "jnp",      Jb },
780   { "jl",       Jb },
781   { "jge",      Jb },
782   { "jle",      Jb },
783   { "jg",       Jb },
784   /* 80 */
785   { GRP1b },
786   { GRP1S },
787   { "(bad)" },
788   { GRP1Ss },
789   { "test",     Eb, Gb },
790   { "test",     Ev, Gv },
791   { "xchg",     Eb, Gb },
792   { "xchg",     Ev, Gv },
793   /* 88 */
794   { "mov",      Eb, Gb },
795   { "mov",      Ev, Gv },
796   { "mov",      Gb, Eb },
797   { "mov",      Gv, Ev },
798   { "mov",      Ev, Sw },
799   { "lea",      Gv, M },
800   { "mov",      Sw, Ev },
801   { "pop",      Ev },
802   /* 90 */
803   { "nop" },
804   { "xchg",     eCX, eAX },
805   { "xchg",     eDX, eAX },
806   { "xchg",     eBX, eAX },
807   { "xchg",     eSP, eAX },
808   { "xchg",     eBP, eAX },
809   { "xchg",     eSI, eAX },
810   { "xchg",     eDI, eAX },
811   /* 98 */
812   { "cW" },             /* cwde and cbw */
813   { "cR" },             /* cdq and cwd */
814   { "lcall",    Ap },
815   { "(bad)" },          /* fwait */
816   { "pushf" },
817   { "popf" },
818   { "sahf" },
819   { "lahf" },
820   /* a0 */
821   { "mov",      AL, Ob },
822   { "mov",      eAX, Ov },
823   { "mov",      Ob, AL },
824   { "mov",      Ov, eAX },
825   { "movs",     Yb, Xb },
826   { "movs",     Yv, Xv },
827   { "cmps",     Xb, Yb },
828   { "cmps",     Xv, Yv },
829   /* a8 */
830   { "test",     AL, Ib },
831   { "test",     eAX, Iv },
832   { "stos",     Yb, AL },
833   { "stos",     Yv, eAX },
834   { "lods",     AL, Xb },
835   { "lods",     eAX, Xv },
836   { "scas",     AL, Yb },
837   { "scas",     eAX, Yv },
838   /* b0 */
839   { "mov",      AL, Ib },
840   { "mov",      CL, Ib },
841   { "mov",      DL, Ib },
842   { "mov",      BL, Ib },
843   { "mov",      AH, Ib },
844   { "mov",      CH, Ib },
845   { "mov",      DH, Ib },
846   { "mov",      BH, Ib },
847   /* b8 */
848   { "mov",      eAX, Iv },
849   { "mov",      eCX, Iv },
850   { "mov",      eDX, Iv },
851   { "mov",      eBX, Iv },
852   { "mov",      eSP, Iv },
853   { "mov",      eBP, Iv },
854   { "mov",      eSI, Iv },
855   { "mov",      eDI, Iv },
856   /* c0 */
857   { GRP2b },
858   { GRP2S },
859   { "ret",      Iw },
860   { "ret" },
861   { "les",      Gv, Mp },
862   { "lds",      Gv, Mp },
863   { "mov",      Eb, Ib },
864   { "mov",      Ev, Iv },
865   /* c8 */
866   { "enter",    Iw, Ib },
867   { "leave" },
868   { "lret",     Iw },
869   { "lret" },
870   { "int3" },
871   { "int",      Ib },
872   { "into" },
873   { "iret" },
874   /* d0 */
875   { GRP2b_one },
876   { GRP2S_one },
877   { GRP2b_cl },
878   { GRP2S_cl },
879   { "aam",      sIb },
880   { "aad",      sIb },
881   { "(bad)" },
882   { "xlat",     DSBX },
883   /* d8 */
884   { FLOAT },
885   { FLOAT },
886   { FLOAT },
887   { FLOAT },
888   { FLOAT },
889   { FLOAT },
890   { FLOAT },
891   { FLOAT },
892   /* e0 */
893   { "loopne",   Jb },
894   { "loope",    Jb },
895   { "loop",     Jb },
896   { "jEcxz",    Jb },
897   { "in",       AL, Ib },
898   { "in",       eAX, Ib },
899   { "out",      Ib, AL },
900   { "out",      Ib, eAX },
901   /* e8 */
902   { "call",     Jv },
903   { "jmp",      Jv },
904   { "ljmp",     Ap },
905   { "jmp",      Jb },
906   { "in",       AL, indirDX },
907   { "in",       eAX, indirDX },
908   { "out",      indirDX, AL },
909   { "out",      indirDX, eAX },
910   /* f0 */
911   { "(bad)" },                  /* lock prefix */
912   { "(bad)" },
913   { "(bad)" },                  /* repne */
914   { "(bad)" },                  /* repz */
915   { "hlt" },
916   { "cmc" },
917   { GRP3b },
918   { GRP3S },
919   /* f8 */
920   { "clc" },
921   { "stc" },
922   { "cli" },
923   { "sti" },
924   { "cld" },
925   { "std" },
926   { GRP4 },
927   { GRP5 },
928 };
929
930 static const struct dis386 dis386_twobyte_att[] = {
931   /* 00 */
932   { GRP6 },
933   { GRP7 },
934   { "larS", Gv, Ew },
935   { "lslS", Gv, Ew },
936   { "(bad)" },
937   { "(bad)" },
938   { "clts" },
939   { "(bad)" },
940   /* 08 */
941   { "invd" },
942   { "wbinvd" },
943   { "(bad)" },
944   { "ud2a" },
945   { "(bad)" },
946   { GRPAMD },
947   { "femms" },
948   { "", MX, EM, OPSUF }, /* See OP_3DNowSuffix */
949   /* 10 */
950   { PREGRP8 },
951   { PREGRP9 },
952   { "movlps", XM, EX, SIMD_Fixup, 'h' },  /* really only 2 operands */
953   { "movlps", EX, XM, SIMD_Fixup, 'h' },
954   { "unpcklps", XM, EX },
955   { "unpckhps", XM, EX },
956   { "movhps", XM, EX, SIMD_Fixup, 'l' },
957   { "movhps", EX, XM, SIMD_Fixup, 'l' },
958   /* 18 */
959   { GRP14 },
960   { "(bad)" },  { "(bad)" },  { "(bad)" },
961   { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },
962   /* 20 */
963   /* these are all backward in appendix A of the intel book */
964   { "movL", Rd, Cd },
965   { "movL", Rd, Dd },
966   { "movL", Cd, Rd },
967   { "movL", Dd, Rd },
968   { "movL", Rd, Td },
969   { "(bad)" },
970   { "movL", Td, Rd },
971   { "(bad)" },
972   /* 28 */
973   { "movaps", XM, EX },
974   { "movaps", EX, XM },
975   { PREGRP2 },
976   { "movntps", Ev, XM },
977   { PREGRP4 },
978   { PREGRP3 },
979   { "ucomiss", XM, EX },
980   { "comiss", XM, EX },
981   /* 30 */
982   { "wrmsr" },  { "rdtsc" },  { "rdmsr" },  { "rdpmc" },
983   { "sysenter" },  { "sysexit" },  { "(bad)" },  { "(bad)" },
984   /* 38 */
985   { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },
986   { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },
987   /* 40 */
988   { "cmovo", Gv,Ev }, { "cmovno", Gv,Ev }, { "cmovb", Gv,Ev }, { "cmovae", Gv,Ev },
989   { "cmove", Gv,Ev }, { "cmovne", Gv,Ev }, { "cmovbe", Gv,Ev }, { "cmova", Gv,Ev },
990   /* 48 */
991   { "cmovs", Gv,Ev }, { "cmovns", Gv,Ev }, { "cmovp", Gv,Ev }, { "cmovnp", Gv,Ev },
992   { "cmovl", Gv,Ev }, { "cmovge", Gv,Ev }, { "cmovle", Gv,Ev }, { "cmovg", Gv,Ev },
993   /* 50 */
994   { "movmskps", Gv, EX },
995   { PREGRP13 },
996   { PREGRP12 },
997   { PREGRP11 },
998   { "andps", XM, EX },
999   { "andnps", XM, EX },
1000   { "orps", XM, EX },
1001   { "xorps", XM, EX },
1002   /* 58 */
1003   { PREGRP0 },
1004   { PREGRP10 },
1005   { "(bad)" },
1006   { "(bad)" },
1007   { PREGRP14 },
1008   { PREGRP7 },
1009   { PREGRP5 },
1010   { PREGRP6 },
1011   /* 60 */
1012   { "punpcklbw", MX, EM },
1013   { "punpcklwd", MX, EM },
1014   { "punpckldq", MX, EM },
1015   { "packsswb", MX, EM },
1016   { "pcmpgtb", MX, EM },
1017   { "pcmpgtw", MX, EM },
1018   { "pcmpgtd", MX, EM },
1019   { "packuswb", MX, EM },
1020   /* 68 */
1021   { "punpckhbw", MX, EM },
1022   { "punpckhwd", MX, EM },
1023   { "punpckhdq", MX, EM },
1024   { "packssdw", MX, EM },
1025   { "(bad)" },  { "(bad)" },
1026   { "movd", MX, Ed },
1027   { "movq", MX, EM },
1028   /* 70 */
1029   { "pshufw", MX, EM, Ib },
1030   { GRP10 },
1031   { GRP11 },
1032   { GRP12 },
1033   { "pcmpeqb", MX, EM },
1034   { "pcmpeqw", MX, EM },
1035   { "pcmpeqd", MX, EM },
1036   { "emms" },
1037   /* 78 */
1038   { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },
1039   { "(bad)" },  { "(bad)" },
1040   { "movd", Ed, MX },
1041   { "movq", EM, MX },
1042   /* 80 */
1043   { "jo", Jv },
1044   { "jno", Jv },
1045   { "jb", Jv },
1046   { "jae", Jv },
1047   { "je", Jv },
1048   { "jne", Jv },
1049   { "jbe", Jv },
1050   { "ja", Jv },
1051   /* 88 */
1052   { "js", Jv },
1053   { "jns", Jv },
1054   { "jp", Jv },
1055   { "jnp", Jv },
1056   { "jl", Jv },
1057   { "jge", Jv },
1058   { "jle", Jv },
1059   { "jg", Jv },
1060   /* 90 */
1061   { "seto", Eb },
1062   { "setno", Eb },
1063   { "setb", Eb },
1064   { "setae", Eb },
1065   { "sete", Eb },
1066   { "setne", Eb },
1067   { "setbe", Eb },
1068   { "seta", Eb },
1069   /* 98 */
1070   { "sets", Eb },
1071   { "setns", Eb },
1072   { "setp", Eb },
1073   { "setnp", Eb },
1074   { "setl", Eb },
1075   { "setge", Eb },
1076   { "setle", Eb },
1077   { "setg", Eb },
1078   /* a0 */
1079   { "pushP", fs },
1080   { "popP", fs },
1081   { "cpuid" },
1082   { "btS", Ev, Gv },
1083   { "shldS", Ev, Gv, Ib },
1084   { "shldS", Ev, Gv, CL },
1085   { "(bad)" },
1086   { "(bad)" },
1087   /* a8 */
1088   { "pushP", gs },
1089   { "popP", gs },
1090   { "rsm" },
1091   { "btsS", Ev, Gv },
1092   { "shrdS", Ev, Gv, Ib },
1093   { "shrdS", Ev, Gv, CL },
1094   { GRP13 },
1095   { "imulS", Gv, Ev },
1096   /* b0 */
1097   { "cmpxchgB", Eb, Gb },
1098   { "cmpxchgS", Ev, Gv },
1099   { "lssS", Gv, Mp },
1100   { "btrS", Ev, Gv },
1101   { "lfsS", Gv, Mp },
1102   { "lgsS", Gv, Mp },
1103   { "movzbR", Gv, Eb },
1104   { "movzwR", Gv, Ew }, /* yes, there really is movzww ! */
1105   /* b8 */
1106   { "(bad)" },
1107   { "ud2b" },
1108   { GRP8 },
1109   { "btcS", Ev, Gv },
1110   { "bsfS", Gv, Ev },
1111   { "bsrS", Gv, Ev },
1112   { "movsbR", Gv, Eb },
1113   { "movswR", Gv, Ew }, /* yes, there really is movsww ! */
1114   /* c0 */
1115   { "xaddB", Eb, Gb },
1116   { "xaddS", Ev, Gv },
1117   { PREGRP1 },
1118   { "(bad)" },
1119   { "pinsrw", MX, Ev, Ib },
1120   { "pextrw", Ev, MX, Ib },
1121   { "shufps", XM, EX, Ib },
1122   { GRP9 },
1123   /* c8 */
1124   { "bswap", eAX },     /* bswap doesn't support 16 bit regs */
1125   { "bswap", eCX },
1126   { "bswap", eDX },
1127   { "bswap", eBX },
1128   { "bswap", eSP },
1129   { "bswap", eBP },
1130   { "bswap", eSI },
1131   { "bswap", eDI },
1132   /* d0 */
1133   { "(bad)" },
1134   { "psrlw", MX, EM },
1135   { "psrld", MX, EM },
1136   { "psrlq", MX, EM },
1137   { "(bad)" },
1138   { "pmullw", MX, EM },
1139   { "(bad)" },
1140   { "pmovmskb", Ev, MX },
1141   /* d8 */
1142   { "psubusb", MX, EM },
1143   { "psubusw", MX, EM },
1144   { "pminub", MX, EM },
1145   { "pand", MX, EM },
1146   { "paddusb", MX, EM },
1147   { "paddusw", MX, EM },
1148   { "pmaxub", MX, EM },
1149   { "pandn", MX, EM },
1150   /* e0 */
1151   { "pavgb", MX, EM },
1152   { "psraw", MX, EM },
1153   { "psrad", MX, EM },
1154   { "pavgw", MX, EM },
1155   { "pmulhuw", MX, EM },
1156   { "pmulhw", MX, EM },
1157   { "(bad)" },
1158   { "movntq", Ev, MX },
1159   /* e8 */
1160   { "psubsb", MX, EM },
1161   { "psubsw", MX, EM },
1162   { "pminsw", MX, EM },
1163   { "por", MX, EM },
1164   { "paddsb", MX, EM },
1165   { "paddsw", MX, EM },
1166   { "pmaxsw", MX, EM },
1167   { "pxor", MX, EM },
1168   /* f0 */
1169   { "(bad)" },
1170   { "psllw", MX, EM },
1171   { "pslld", MX, EM },
1172   { "psllq", MX, EM },
1173   { "(bad)" },
1174   { "pmaddwd", MX, EM },
1175   { "psadbw", MX, EM },
1176   { "maskmovq", MX, EM },
1177   /* f8 */
1178   { "psubb", MX, EM },
1179   { "psubw", MX, EM },
1180   { "psubd", MX, EM },
1181   { "(bad)" },
1182   { "paddb", MX, EM },
1183   { "paddw", MX, EM },
1184   { "paddd", MX, EM },
1185   { "(bad)" }
1186 };
1187
1188 static const struct dis386 dis386_twobyte_intel[] = {
1189   /* 00 */
1190   { GRP6 },
1191   { GRP7 },
1192   { "lar", Gv, Ew },
1193   { "lsl", Gv, Ew },
1194   { "(bad)" },
1195   { "(bad)" },
1196   { "clts" },
1197   { "(bad)" },
1198   /* 08 */
1199   { "invd" },
1200   { "wbinvd" },
1201   { "(bad)" },
1202   { "ud2a" },
1203   { "(bad)" },
1204   { GRPAMD },
1205   { "femms" },
1206   { "", MX, EM, OPSUF }, /* See OP_3DNowSuffix */
1207   /* 10 */
1208   { PREGRP8 },
1209   { PREGRP9 },
1210   { "movlps", XM, EX, SIMD_Fixup, 'h' },  /* really only 2 operands */
1211   { "movlps", EX, XM, SIMD_Fixup, 'h' },
1212   { "unpcklps", XM, EX },
1213   { "unpckhps", XM, EX },
1214   { "movhps", XM, EX, SIMD_Fixup, 'l' },
1215   { "movhps", EX, XM, SIMD_Fixup, 'l' },
1216   /* 18 */
1217   { GRP14 },
1218   { "(bad)" },  { "(bad)" },  { "(bad)" },
1219   { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },
1220   /* 20 */
1221   /* these are all backward in appendix A of the intel book */
1222   { "mov", Rd, Cd },
1223   { "mov", Rd, Dd },
1224   { "mov", Cd, Rd },
1225   { "mov", Dd, Rd },
1226   { "mov", Rd, Td },
1227   { "(bad)" },
1228   { "mov", Td, Rd },
1229   { "(bad)" },
1230   /* 28 */
1231   { "movaps", XM, EX },
1232   { "movaps", EX, XM },
1233   { PREGRP2 },
1234   { "movntps", Ev, XM },
1235   { PREGRP4 },
1236   { PREGRP3 },
1237   { "ucomiss", XM, EX },
1238   { "comiss", XM, EX },
1239   /* 30 */
1240   { "wrmsr" },  { "rdtsc" },  { "rdmsr" },  { "rdpmc" },
1241   { "sysenter" },  { "sysexit" },  { "(bad)" },  { "(bad)" },
1242   /* 38 */
1243   { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },
1244   { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },
1245   /* 40 */
1246   { "cmovo", Gv,Ev }, { "cmovno", Gv,Ev }, { "cmovb", Gv,Ev }, { "cmovae", Gv,Ev },
1247   { "cmove", Gv,Ev }, { "cmovne", Gv,Ev }, { "cmovbe", Gv,Ev }, { "cmova", Gv,Ev },
1248   /* 48 */
1249   { "cmovs", Gv,Ev }, { "cmovns", Gv,Ev }, { "cmovp", Gv,Ev }, { "cmovnp", Gv,Ev },
1250   { "cmovl", Gv,Ev }, { "cmovge", Gv,Ev }, { "cmovle", Gv,Ev }, { "cmovg", Gv,Ev },
1251   /* 50 */
1252   { "movmskps", Gv, EX },
1253   { PREGRP13 },
1254   { PREGRP12 },
1255   { PREGRP11 },
1256   { "andps", XM, EX },
1257   { "andnps", XM, EX },
1258   { "orps", XM, EX },
1259   { "xorps", XM, EX },
1260   /* 58 */
1261   { PREGRP0 },
1262   { PREGRP10 },
1263   { "(bad)" },
1264   { "(bad)" },
1265   { PREGRP14 },
1266   { PREGRP7 },
1267   { PREGRP5 },
1268   { PREGRP6 },
1269   /* 60 */
1270   { "punpcklbw", MX, EM },
1271   { "punpcklwd", MX, EM },
1272   { "punpckldq", MX, EM },
1273   { "packsswb", MX, EM },
1274   { "pcmpgtb", MX, EM },
1275   { "pcmpgtw", MX, EM },
1276   { "pcmpgtd", MX, EM },
1277   { "packuswb", MX, EM },
1278   /* 68 */
1279   { "punpckhbw", MX, EM },
1280   { "punpckhwd", MX, EM },
1281   { "punpckhdq", MX, EM },
1282   { "packssdw", MX, EM },
1283   { "(bad)" },  { "(bad)" },
1284   { "movd", MX, Ed },
1285   { "movq", MX, EM },
1286   /* 70 */
1287   { "pshufw", MX, EM, Ib },
1288   { GRP10 },
1289   { GRP11 },
1290   { GRP12 },
1291   { "pcmpeqb", MX, EM },
1292   { "pcmpeqw", MX, EM },
1293   { "pcmpeqd", MX, EM },
1294   { "emms" },
1295   /* 78 */
1296   { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },
1297   { "(bad)" },  { "(bad)" },
1298   { "movd", Ed, MX },
1299   { "movq", EM, MX },
1300   /* 80 */
1301   { "jo", Jv },
1302   { "jno", Jv },
1303   { "jb", Jv },
1304   { "jae", Jv },
1305   { "je", Jv },
1306   { "jne", Jv },
1307   { "jbe", Jv },
1308   { "ja", Jv },
1309   /* 88 */
1310   { "js", Jv },
1311   { "jns", Jv },
1312   { "jp", Jv },
1313   { "jnp", Jv },
1314   { "jl", Jv },
1315   { "jge", Jv },
1316   { "jle", Jv },
1317   { "jg", Jv },
1318   /* 90 */
1319   { "seto", Eb },
1320   { "setno", Eb },
1321   { "setb", Eb },
1322   { "setae", Eb },
1323   { "sete", Eb },
1324   { "setne", Eb },
1325   { "setbe", Eb },
1326   { "seta", Eb },
1327   /* 98 */
1328   { "sets", Eb },
1329   { "setns", Eb },
1330   { "setp", Eb },
1331   { "setnp", Eb },
1332   { "setl", Eb },
1333   { "setge", Eb },
1334   { "setle", Eb },
1335   { "setg", Eb },
1336   /* a0 */
1337   { "push", fs },
1338   { "pop", fs },
1339   { "cpuid" },
1340   { "bt", Ev, Gv },
1341   { "shld", Ev, Gv, Ib },
1342   { "shld", Ev, Gv, CL },
1343   { "(bad)" },
1344   { "(bad)" },
1345   /* a8 */
1346   { "push", gs },
1347   { "pop", gs },
1348   { "rsm" },
1349   { "bts", Ev, Gv },
1350   { "shrd", Ev, Gv, Ib },
1351   { "shrd", Ev, Gv, CL },
1352   { GRP13 },
1353   { "imul", Gv, Ev },
1354   /* b0 */
1355   { "cmpxchg", Eb, Gb },
1356   { "cmpxchg", Ev, Gv },
1357   { "lss", Gv, Mp },
1358   { "btr", Ev, Gv },
1359   { "lfs", Gv, Mp },
1360   { "lgs", Gv, Mp },
1361   { "movzx", Gv, Eb },
1362   { "movzx", Gv, Ew },
1363   /* b8 */
1364   { "(bad)" },
1365   { "ud2b" },
1366   { GRP8 },
1367   { "btc", Ev, Gv },
1368   { "bsf", Gv, Ev },
1369   { "bsr", Gv, Ev },
1370   { "movsx", Gv, Eb },
1371   { "movsx", Gv, Ew },
1372   /* c0 */
1373   { "xadd", Eb, Gb },
1374   { "xadd", Ev, Gv },
1375   { PREGRP1 },
1376   { "(bad)" },
1377   { "pinsrw", MX, Ev, Ib },
1378   { "pextrw", Ev, MX, Ib },
1379   { "shufps", XM, EX, Ib },
1380   { GRP9 },
1381   /* c8 */
1382   { "bswap", eAX },     /* bswap doesn't support 16 bit regs */
1383   { "bswap", eCX },
1384   { "bswap", eDX },
1385   { "bswap", eBX },
1386   { "bswap", eSP },
1387   { "bswap", eBP },
1388   { "bswap", eSI },
1389   { "bswap", eDI },
1390   /* d0 */
1391   { "(bad)" },
1392   { "psrlw", MX, EM },
1393   { "psrld", MX, EM },
1394   { "psrlq", MX, EM },
1395   { "(bad)" },
1396   { "pmullw", MX, EM },
1397   { "(bad)" },
1398   { "pmovmskb", Ev, MX },
1399   /* d8 */
1400   { "psubusb", MX, EM },
1401   { "psubusw", MX, EM },
1402   { "pminub", MX, EM },
1403   { "pand", MX, EM },
1404   { "paddusb", MX, EM },
1405   { "paddusw", MX, EM },
1406   { "pmaxub", MX, EM },
1407   { "pandn", MX, EM },
1408   /* e0 */
1409   { "pavgb", MX, EM },
1410   { "psraw", MX, EM },
1411   { "psrad", MX, EM },
1412   { "pavgw", MX, EM },
1413   { "pmulhuw", MX, EM },
1414   { "pmulhw", MX, EM },
1415   { "(bad)" },
1416   { "movntq", Ev, MX },
1417   /* e8 */
1418   { "psubsb", MX, EM },
1419   { "psubsw", MX, EM },
1420   { "pminsw", MX, EM },
1421   { "por", MX, EM },
1422   { "paddsb", MX, EM },
1423   { "paddsw", MX, EM },
1424   { "pmaxsw", MX, EM },
1425   { "pxor", MX, EM },
1426   /* f0 */
1427   { "(bad)" },
1428   { "psllw", MX, EM },
1429   { "pslld", MX, EM },
1430   { "psllq", MX, EM },
1431   { "(bad)" },
1432   { "pmaddwd", MX, EM },
1433   { "psadbw", MX, EM },
1434   { "maskmovq", MX, EM },
1435   /* f8 */
1436   { "psubb", MX, EM },
1437   { "psubw", MX, EM },
1438   { "psubd", MX, EM },
1439   { "(bad)" },
1440   { "paddb", MX, EM },
1441   { "paddw", MX, EM },
1442   { "paddd", MX, EM },
1443   { "(bad)" }
1444 };
1445
1446 static const unsigned char onebyte_has_modrm[256] = {
1447   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1448   /*       -------------------------------        */
1449   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
1450   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
1451   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
1452   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
1453   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
1454   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
1455   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
1456   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
1457   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
1458   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
1459   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
1460   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
1461   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
1462   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
1463   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
1464   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
1465   /*       -------------------------------        */
1466   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1467 };
1468
1469 static const unsigned char twobyte_has_modrm[256] = {
1470   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1471   /*       -------------------------------        */
1472   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
1473   /* 10 */ 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, /* 1f */
1474   /* 20 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 2f */
1475   /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
1476   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
1477   /* 50 */ 1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1, /* 5f */
1478   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1, /* 6f */
1479   /* 70 */ 1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1, /* 7f */
1480   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1481   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
1482   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
1483   /* b0 */ 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1, /* bf */
1484   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
1485   /* d0 */ 0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1, /* df */
1486   /* e0 */ 1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1, /* ef */
1487   /* f0 */ 0,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0  /* ff */
1488   /*       -------------------------------        */
1489   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1490 };
1491
1492 static const unsigned char twobyte_uses_f3_prefix[256] = {
1493   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1494   /*       -------------------------------        */
1495   /* 00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0f */
1496   /* 10 */ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1f */
1497   /* 20 */ 0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0, /* 2f */
1498   /* 30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 3f */
1499   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 4f */
1500   /* 50 */ 0,1,1,1,0,0,0,0,1,1,0,0,1,1,1,1, /* 5f */
1501   /* 60 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 6f */
1502   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 7f */
1503   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
1504   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 9f */
1505   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* af */
1506   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* bf */
1507   /* c0 */ 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, /* cf */
1508   /* d0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* df */
1509   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ef */
1510   /* f0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  /* ff */
1511   /*       -------------------------------        */
1512   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
1513 };
1514
1515 static char obuf[100];
1516 static char *obufp;
1517 static char scratchbuf[100];
1518 static unsigned char *start_codep;
1519 static unsigned char *insn_codep;
1520 static unsigned char *codep;
1521 static disassemble_info *the_info;
1522 static int mod;
1523 static int rm;
1524 static int reg;
1525 static void oappend PARAMS ((const char *s));
1526
1527 static const char *names32[]={
1528   "%eax","%ecx","%edx","%ebx", "%esp","%ebp","%esi","%edi",
1529 };
1530 static const char *names16[] = {
1531   "%ax","%cx","%dx","%bx","%sp","%bp","%si","%di",
1532 };
1533 static const char *names8[] = {
1534   "%al","%cl","%dl","%bl","%ah","%ch","%dh","%bh",
1535 };
1536 static const char *names_seg[] = {
1537   "%es","%cs","%ss","%ds","%fs","%gs","%?","%?",
1538 };
1539 static const char *index16[] = {
1540   "%bx,%si","%bx,%di","%bp,%si","%bp,%di","%si","%di","%bp","%bx"
1541 };
1542
1543 static const struct dis386 grps[][8] = {
1544   /* GRP1b */
1545   {
1546     { "addA",   Eb, Ib },
1547     { "orA",    Eb, Ib },
1548     { "adcA",   Eb, Ib },
1549     { "sbbA",   Eb, Ib },
1550     { "andA",   Eb, Ib },
1551     { "subA",   Eb, Ib },
1552     { "xorA",   Eb, Ib },
1553     { "cmpA",   Eb, Ib }
1554   },
1555   /* GRP1S */
1556   {
1557     { "addQ",   Ev, Iv },
1558     { "orQ",    Ev, Iv },
1559     { "adcQ",   Ev, Iv },
1560     { "sbbQ",   Ev, Iv },
1561     { "andQ",   Ev, Iv },
1562     { "subQ",   Ev, Iv },
1563     { "xorQ",   Ev, Iv },
1564     { "cmpQ",   Ev, Iv }
1565   },
1566   /* GRP1Ss */
1567   {
1568     { "addQ",   Ev, sIb },
1569     { "orQ",    Ev, sIb },
1570     { "adcQ",   Ev, sIb },
1571     { "sbbQ",   Ev, sIb },
1572     { "andQ",   Ev, sIb },
1573     { "subQ",   Ev, sIb },
1574     { "xorQ",   Ev, sIb },
1575     { "cmpQ",   Ev, sIb }
1576   },
1577   /* GRP2b */
1578   {
1579     { "rolA",   Eb, Ib },
1580     { "rorA",   Eb, Ib },
1581     { "rclA",   Eb, Ib },
1582     { "rcrA",   Eb, Ib },
1583     { "shlA",   Eb, Ib },
1584     { "shrA",   Eb, Ib },
1585     { "(bad)" },
1586     { "sarA",   Eb, Ib },
1587   },
1588   /* GRP2S */
1589   {
1590     { "rolQ",   Ev, Ib },
1591     { "rorQ",   Ev, Ib },
1592     { "rclQ",   Ev, Ib },
1593     { "rcrQ",   Ev, Ib },
1594     { "shlQ",   Ev, Ib },
1595     { "shrQ",   Ev, Ib },
1596     { "(bad)" },
1597     { "sarQ",   Ev, Ib },
1598   },
1599   /* GRP2b_one */
1600   {
1601     { "rolA",   Eb },
1602     { "rorA",   Eb },
1603     { "rclA",   Eb },
1604     { "rcrA",   Eb },
1605     { "shlA",   Eb },
1606     { "shrA",   Eb },
1607     { "(bad)" },
1608     { "sarA",   Eb },
1609   },
1610   /* GRP2S_one */
1611   {
1612     { "rolQ",   Ev },
1613     { "rorQ",   Ev },
1614     { "rclQ",   Ev },
1615     { "rcrQ",   Ev },
1616     { "shlQ",   Ev },
1617     { "shrQ",   Ev },
1618     { "(bad)" },
1619     { "sarQ",   Ev },
1620   },
1621   /* GRP2b_cl */
1622   {
1623     { "rolA",   Eb, CL },
1624     { "rorA",   Eb, CL },
1625     { "rclA",   Eb, CL },
1626     { "rcrA",   Eb, CL },
1627     { "shlA",   Eb, CL },
1628     { "shrA",   Eb, CL },
1629     { "(bad)" },
1630     { "sarA",   Eb, CL },
1631   },
1632   /* GRP2S_cl */
1633   {
1634     { "rolQ",   Ev, CL },
1635     { "rorQ",   Ev, CL },
1636     { "rclQ",   Ev, CL },
1637     { "rcrQ",   Ev, CL },
1638     { "shlQ",   Ev, CL },
1639     { "shrQ",   Ev, CL },
1640     { "(bad)" },
1641     { "sarQ",   Ev, CL }
1642   },
1643   /* GRP3b */
1644   {
1645     { "testA",  Eb, Ib },
1646     { "(bad)",  Eb },
1647     { "notA",   Eb },
1648     { "negA",   Eb },
1649     { "mulB",   AL, Eb },
1650     { "imulB",  AL, Eb },
1651     { "divB",   AL, Eb },
1652     { "idivB",  AL, Eb }
1653   },
1654   /* GRP3S */
1655   {
1656     { "testQ",  Ev, Iv },
1657     { "(bad)" },
1658     { "notQ",   Ev },
1659     { "negQ",   Ev },
1660     { "mulS",   eAX, Ev },
1661     { "imulS",  eAX, Ev },
1662     { "divS",   eAX, Ev },
1663     { "idivS",  eAX, Ev },
1664   },
1665   /* GRP4 */
1666   {
1667     { "incA", Eb },
1668     { "decA", Eb },
1669     { "(bad)" },
1670     { "(bad)" },
1671     { "(bad)" },
1672     { "(bad)" },
1673     { "(bad)" },
1674     { "(bad)" },
1675   },
1676   /* GRP5 */
1677   {
1678     { "incQ",   Ev },
1679     { "decQ",   Ev },
1680     { "callP",  indirEv },
1681     { "callP",  indirEv },
1682     { "jmpP",   indirEv },
1683     { "ljmpP",  indirEv },
1684     { "pushQ",  Ev },
1685     { "(bad)" },
1686   },
1687   /* GRP6 */
1688   {
1689     { "sldt",   Ew },
1690     { "str",    Ew },
1691     { "lldt",   Ew },
1692     { "ltr",    Ew },
1693     { "verr",   Ew },
1694     { "verw",   Ew },
1695     { "(bad)" },
1696     { "(bad)" }
1697   },
1698   /* GRP7 */
1699   {
1700     { "sgdt", Ew },
1701     { "sidt", Ew },
1702     { "lgdt", Ew },
1703     { "lidt", Ew },
1704     { "smsw", Ew },
1705     { "(bad)" },
1706     { "lmsw", Ew },
1707     { "invlpg", Ew },
1708   },
1709   /* GRP8 */
1710   {
1711     { "(bad)" },
1712     { "(bad)" },
1713     { "(bad)" },
1714     { "(bad)" },
1715     { "btQ",    Ev, Ib },
1716     { "btsQ",   Ev, Ib },
1717     { "btrQ",   Ev, Ib },
1718     { "btcQ",   Ev, Ib },
1719   },
1720   /* GRP9 */
1721   {
1722     { "(bad)" },
1723     { "cmpxchg8b", Ev },
1724     { "(bad)" },
1725     { "(bad)" },
1726     { "(bad)" },
1727     { "(bad)" },
1728     { "(bad)" },
1729     { "(bad)" },
1730   },
1731   /* GRP10 */
1732   {
1733     { "(bad)" },
1734     { "(bad)" },
1735     { "psrlw", MS, Ib },
1736     { "(bad)" },
1737     { "psraw", MS, Ib },
1738     { "(bad)" },
1739     { "psllw", MS, Ib },
1740     { "(bad)" },
1741   },
1742   /* GRP11 */
1743   {
1744     { "(bad)" },
1745     { "(bad)" },
1746     { "psrld", MS, Ib },
1747     { "(bad)" },
1748     { "psrad", MS, Ib },
1749     { "(bad)" },
1750     { "pslld", MS, Ib },
1751     { "(bad)" },
1752   },
1753   /* GRP12 */
1754   {
1755     { "(bad)" },
1756     { "(bad)" },
1757     { "psrlq", MS, Ib },
1758     { "(bad)" },
1759     { "(bad)" },
1760     { "(bad)" },
1761     { "psllq", MS, Ib },
1762     { "(bad)" },
1763   },
1764   /* GRP13 */
1765   {
1766     { "fxsave", Ev },
1767     { "fxrstor", Ev },
1768     { "ldmxcsr", Ev },
1769     { "stmxcsr", Ev },
1770     { "(bad)" },
1771     { "(bad)" },
1772     { "(bad)" },
1773     { "sfence", None },
1774   },
1775   /* GRP14 */
1776   {
1777     { "prefetchnta", Ev },
1778     { "prefetcht0", Ev },
1779     { "prefetcht1", Ev },
1780     { "prefetcht2", Ev },
1781     { "(bad)" },
1782     { "(bad)" },
1783     { "(bad)" },
1784     { "(bad)" },
1785   },
1786   /* GRPAMD */
1787   {
1788     { "prefetch", Eb },
1789     { "prefetchw", Eb },
1790     { "(bad)" },
1791     { "(bad)" },
1792     { "(bad)" },
1793     { "(bad)" },
1794     { "(bad)" },
1795     { "(bad)" },
1796   }
1797
1798 };
1799
1800 static const struct dis386 prefix_user_table[][2] = {
1801   /* PREGRP0 */
1802   {
1803     { "addps", XM, EX },
1804     { "addss", XM, EX },
1805   },
1806   /* PREGRP1 */
1807   {
1808     { "", XM, EX, OPSIMD },     /* See OP_SIMD_SUFFIX */
1809     { "", XM, EX, OPSIMD },
1810   },
1811   /* PREGRP2 */
1812   {
1813     { "cvtpi2ps", XM, EM },
1814     { "cvtsi2ss", XM, Ev },
1815   },
1816   /* PREGRP3 */
1817   {
1818     { "cvtps2pi", MX, EX },
1819     { "cvtss2si", Gv, EX },
1820   },
1821   /* PREGRP4 */
1822   {
1823     { "cvttps2pi", MX, EX },
1824     { "cvttss2si", Gv, EX },
1825   },
1826   /* PREGRP5 */
1827   {
1828     { "divps", XM, EX },
1829     { "divss", XM, EX },
1830   },
1831   /* PREGRP6 */
1832   {
1833     { "maxps", XM, EX },
1834     { "maxss", XM, EX },
1835   },
1836   /* PREGRP7 */
1837   {
1838     { "minps", XM, EX },
1839     { "minss", XM, EX },
1840   },
1841   /* PREGRP8 */
1842   {
1843     { "movups", XM, EX },
1844     { "movss", XM, EX },
1845   },
1846   /* PREGRP9 */
1847   {
1848     { "movups", EX, XM },
1849     { "movss", EX, XM },
1850   },
1851   /* PREGRP10 */
1852   {
1853     { "mulps", XM, EX },
1854     { "mulss", XM, EX },
1855   },
1856   /* PREGRP11 */
1857   {
1858     { "rcpps", XM, EX },
1859     { "rcpss", XM, EX },
1860   },
1861   /* PREGRP12 */
1862   {
1863     { "rsqrtps", XM, EX },
1864     { "rsqrtss", XM, EX },
1865   },
1866   /* PREGRP13 */
1867   {
1868     { "sqrtps", XM, EX },
1869     { "sqrtss", XM, EX },
1870   },
1871   /* PREGRP14 */
1872   {
1873     { "subps", XM, EX },
1874     { "subss", XM, EX },
1875   }
1876 };
1877
1878 #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
1879
1880 static void
1881 ckprefix ()
1882 {
1883   prefixes = 0;
1884   while (1)
1885     {
1886       FETCH_DATA (the_info, codep + 1);
1887       switch (*codep)
1888         {
1889         case 0xf3:
1890           prefixes |= PREFIX_REPZ;
1891           break;
1892         case 0xf2:
1893           prefixes |= PREFIX_REPNZ;
1894           break;
1895         case 0xf0:
1896           prefixes |= PREFIX_LOCK;
1897           break;
1898         case 0x2e:
1899           prefixes |= PREFIX_CS;
1900           break;
1901         case 0x36:
1902           prefixes |= PREFIX_SS;
1903           break;
1904         case 0x3e:
1905           prefixes |= PREFIX_DS;
1906           break;
1907         case 0x26:
1908           prefixes |= PREFIX_ES;
1909           break;
1910         case 0x64:
1911           prefixes |= PREFIX_FS;
1912           break;
1913         case 0x65:
1914           prefixes |= PREFIX_GS;
1915           break;
1916         case 0x66:
1917           prefixes |= PREFIX_DATA;
1918           break;
1919         case 0x67:
1920           prefixes |= PREFIX_ADDR;
1921           break;
1922         case FWAIT_OPCODE:
1923           /* fwait is really an instruction.  If there are prefixes
1924              before the fwait, they belong to the fwait, *not* to the
1925              following instruction.  */
1926           if (prefixes)
1927             {
1928               prefixes |= PREFIX_FWAIT;
1929               codep++;
1930               return;
1931             }
1932           prefixes = PREFIX_FWAIT;
1933           break;
1934         default:
1935           return;
1936         }
1937       codep++;
1938     }
1939 }
1940
1941 static char op1out[100], op2out[100], op3out[100];
1942 static int op_ad, op_index[3];
1943 static unsigned int op_address[3];
1944 static unsigned int start_pc;
1945
1946 \f
1947 /*
1948  *   On the 386's of 1988, the maximum length of an instruction is 15 bytes.
1949  *   (see topic "Redundant prefixes" in the "Differences from 8086"
1950  *   section of the "Virtual 8086 Mode" chapter.)
1951  * 'pc' should be the address of this instruction, it will
1952  *   be used to print the target address if this is a relative jump or call
1953  * The function returns the length of this instruction in bytes.
1954  */
1955
1956 static int print_insn_i386
1957   PARAMS ((bfd_vma pc, disassemble_info *info));
1958
1959 static char intel_syntax;
1960 static char open_char;
1961 static char close_char;
1962 static char separator_char;
1963 static char scale_char;
1964
1965 int
1966 print_insn_i386_att (pc, info)
1967      bfd_vma pc;
1968      disassemble_info *info;
1969 {
1970   intel_syntax = 0;
1971   open_char = '(';
1972   close_char =  ')';
1973   separator_char = ',';
1974   scale_char = ',';
1975
1976   return print_insn_i386 (pc, info);
1977 }
1978
1979 int
1980 print_insn_i386_intel (pc, info)
1981      bfd_vma pc;
1982      disassemble_info *info;
1983 {
1984   intel_syntax = 1;
1985   open_char = '[';
1986   close_char = ']';
1987   separator_char = '+';
1988   scale_char = '*';
1989
1990   return print_insn_i386 (pc, info);
1991 }
1992
1993 static int
1994 print_insn_i386 (pc, info)
1995      bfd_vma pc;
1996      disassemble_info *info;
1997 {
1998   const struct dis386 *dp;
1999   int i;
2000   int two_source_ops;
2001   char *first, *second, *third;
2002   int needcomma;
2003   unsigned char need_modrm;
2004   unsigned char uses_f3_prefix;
2005   int sizeflag;
2006
2007   struct dis_private priv;
2008   bfd_byte *inbuf = priv.the_buffer;
2009
2010   if (info->mach == bfd_mach_i386_i386
2011       || info->mach == bfd_mach_i386_i386_intel_syntax)
2012     sizeflag = AFLAG|DFLAG;
2013   else if (info->mach == bfd_mach_i386_i8086)
2014     sizeflag = 0;
2015   else
2016     abort ();
2017
2018   /* The output looks better if we put 6 bytes on a line, since that
2019      puts most long word instructions on a single line.  */
2020   info->bytes_per_line = 6;
2021
2022   info->private_data = (PTR) &priv;
2023   priv.max_fetched = priv.the_buffer;
2024   priv.insn_start = pc;
2025
2026   obuf[0] = 0;
2027   op1out[0] = 0;
2028   op2out[0] = 0;
2029   op3out[0] = 0;
2030
2031   op_index[0] = op_index[1] = op_index[2] = -1;
2032
2033   the_info = info;
2034   start_pc = pc;
2035   start_codep = inbuf;
2036   codep = inbuf;
2037
2038   if (setjmp (priv.bailout) != 0)
2039     {
2040       /* Getting here means we tried for data but didn't get it.  That
2041          means we have an incomplete instruction of some sort.
2042          However, we need to check at least one case here: fwait is a
2043          complete instruction, although we treat it as a prefix.  */
2044       if (prefixes & PREFIX_FWAIT)
2045         {
2046           unsigned char *p;
2047
2048           p = memchr (inbuf, FWAIT_OPCODE, codep - inbuf);
2049           if (p != NULL)
2050             {
2051               (*info->fprintf_func) (info->stream, "fwait");
2052               return (p + 1) - inbuf;
2053             }
2054         }
2055
2056       if (codep > inbuf)
2057         {
2058           /* This will at least let objdump print the bytes followed
2059              by the error message generated by fetch_data.  */
2060           return codep - inbuf;
2061         }
2062
2063       return -1;
2064     }
2065
2066   ckprefix ();
2067
2068   insn_codep = codep;
2069
2070   FETCH_DATA (info, codep + 1);
2071   two_source_ops = (*codep == 0x62) || (*codep == 0xc8);
2072
2073   obufp = obuf;
2074
2075   if ((prefixes & PREFIX_FWAIT)
2076       && ((*codep < 0xd8) || (*codep > 0xdf)))
2077     {
2078       /* fwait not followed by floating point instruction.  */
2079       (*info->fprintf_func) (info->stream, "fwait");
2080       /* There may be other prefixes.  Skip any before the fwait.  */
2081       return codep - inbuf;
2082     }
2083
2084   if (*codep == 0x0f)
2085     {
2086       FETCH_DATA (info, codep + 2);
2087       if (intel_syntax)
2088         dp = &dis386_twobyte_intel[*++codep];
2089       else
2090         dp = &dis386_twobyte_att[*++codep];
2091       need_modrm = twobyte_has_modrm[*codep];
2092       uses_f3_prefix = twobyte_uses_f3_prefix[*codep];
2093     }
2094   else
2095     {
2096       if (intel_syntax)
2097         dp = &dis386_intel[*codep];
2098       else
2099         dp = &dis386_att[*codep];
2100       need_modrm = onebyte_has_modrm[*codep];
2101       uses_f3_prefix = 0;
2102     }
2103   codep++;
2104
2105   if (!uses_f3_prefix && (prefixes & PREFIX_REPZ))
2106     oappend ("repz ");
2107   if (prefixes & PREFIX_REPNZ)
2108     oappend ("repnz ");
2109   if (prefixes & PREFIX_LOCK)
2110     oappend ("lock ");
2111
2112   if (prefixes & PREFIX_DATA)
2113     sizeflag ^= DFLAG;
2114
2115   if (prefixes & PREFIX_ADDR)
2116     {
2117       sizeflag ^= AFLAG;
2118       if (sizeflag & AFLAG)
2119         oappend ("addr32 ");
2120       else
2121         oappend ("addr16 ");
2122     }
2123
2124   if (need_modrm)
2125     {
2126       FETCH_DATA (info, codep + 1);
2127       mod = (*codep >> 6) & 3;
2128       reg = (*codep >> 3) & 7;
2129       rm = *codep & 7;
2130     }
2131
2132   if (dp->name == NULL && dp->bytemode1 == FLOATCODE)
2133     {
2134       dofloat (sizeflag);
2135     }
2136   else
2137     {
2138       if (dp->name == NULL)
2139         {
2140           switch(dp->bytemode2)
2141             {
2142               case USE_GROUPS:
2143                 dp = &grps[dp->bytemode1][reg];
2144                 break;
2145               case USE_PREFIX_USER_TABLE:
2146                 dp = &prefix_user_table[dp->bytemode1][prefixes & PREFIX_REPZ ? 1 : 0];
2147                 break;
2148               default:
2149                 oappend (INTERNAL_DISASSEMBLER_ERROR);
2150                 break;
2151             }
2152         }
2153
2154       putop (dp->name, sizeflag);
2155
2156       obufp = op1out;
2157       op_ad = 2;
2158       if (dp->op1)
2159         (*dp->op1)(dp->bytemode1, sizeflag);
2160
2161       obufp = op2out;
2162       op_ad = 1;
2163       if (dp->op2)
2164         (*dp->op2)(dp->bytemode2, sizeflag);
2165
2166       obufp = op3out;
2167       op_ad = 0;
2168       if (dp->op3)
2169         (*dp->op3)(dp->bytemode3, sizeflag);
2170     }
2171
2172   obufp = obuf + strlen (obuf);
2173   for (i = strlen (obuf); i < 6; i++)
2174     oappend (" ");
2175   oappend (" ");
2176   (*info->fprintf_func) (info->stream, "%s", obuf);
2177
2178   /* The enter and bound instructions are printed with operands in the same
2179      order as the intel book; everything else is printed in reverse order.  */
2180   if (intel_syntax || two_source_ops)
2181     {
2182       first = op1out;
2183       second = op2out;
2184       third = op3out;
2185       op_ad = op_index[0];
2186       op_index[0] = op_index[2];
2187       op_index[2] = op_ad;
2188     }
2189   else
2190     {
2191       first = op3out;
2192       second = op2out;
2193       third = op1out;
2194     }
2195   needcomma = 0;
2196   if (*first)
2197     {
2198       if (op_index[0] != -1)
2199         (*info->print_address_func) ((bfd_vma) op_address[op_index[0]], info);
2200       else
2201         (*info->fprintf_func) (info->stream, "%s", first);
2202       needcomma = 1;
2203     }
2204   if (*second)
2205     {
2206       if (needcomma)
2207         (*info->fprintf_func) (info->stream, ",");
2208       if (op_index[1] != -1)
2209         (*info->print_address_func) ((bfd_vma) op_address[op_index[1]], info);
2210       else
2211         (*info->fprintf_func) (info->stream, "%s", second);
2212       needcomma = 1;
2213     }
2214   if (*third)
2215     {
2216       if (needcomma)
2217         (*info->fprintf_func) (info->stream, ",");
2218       if (op_index[2] != -1)
2219         (*info->print_address_func) ((bfd_vma) op_address[op_index[2]], info);
2220       else
2221         (*info->fprintf_func) (info->stream, "%s", third);
2222     }
2223   return codep - inbuf;
2224 }
2225
2226 static const char *float_mem_att[] = {
2227   /* d8 */
2228   "fadds",
2229   "fmuls",
2230   "fcoms",
2231   "fcomps",
2232   "fsubs",
2233   "fsubrs",
2234   "fdivs",
2235   "fdivrs",
2236   /*  d9 */
2237   "flds",
2238   "(bad)",
2239   "fsts",
2240   "fstps",
2241   "fldenv",
2242   "fldcw",
2243   "fNstenv",
2244   "fNstcw",
2245   /* da */
2246   "fiaddl",
2247   "fimull",
2248   "ficoml",
2249   "ficompl",
2250   "fisubl",
2251   "fisubrl",
2252   "fidivl",
2253   "fidivrl",
2254   /* db */
2255   "fildl",
2256   "(bad)",
2257   "fistl",
2258   "fistpl",
2259   "(bad)",
2260   "fldt",
2261   "(bad)",
2262   "fstpt",
2263   /* dc */
2264   "faddl",
2265   "fmull",
2266   "fcoml",
2267   "fcompl",
2268   "fsubl",
2269   "fsubrl",
2270   "fdivl",
2271   "fdivrl",
2272   /* dd */
2273   "fldl",
2274   "(bad)",
2275   "fstl",
2276   "fstpl",
2277   "frstor",
2278   "(bad)",
2279   "fNsave",
2280   "fNstsw",
2281   /* de */
2282   "fiadd",
2283   "fimul",
2284   "ficom",
2285   "ficomp",
2286   "fisub",
2287   "fisubr",
2288   "fidiv",
2289   "fidivr",
2290   /* df */
2291   "fild",
2292   "(bad)",
2293   "fist",
2294   "fistp",
2295   "fbld",
2296   "fildll",
2297   "fbstp",
2298   "fistpll",
2299 };
2300
2301 static const char *float_mem_intel[] = {
2302   /* d8 */
2303   "fadd",
2304   "fmul",
2305   "fcom",
2306   "fcomp",
2307   "fsub",
2308   "fsubr",
2309   "fdiv",
2310   "fdivr",
2311   /*  d9 */
2312   "fld",
2313   "(bad)",
2314   "fst",
2315   "fstp",
2316   "fldenv",
2317   "fldcw",
2318   "fNstenv",
2319   "fNstcw",
2320   /* da */
2321   "fiadd",
2322   "fimul",
2323   "ficom",
2324   "ficomp",
2325   "fisub",
2326   "fisubr",
2327   "fidiv",
2328   "fidivr",
2329   /* db */
2330   "fild",
2331   "(bad)",
2332   "fist",
2333   "fistp",
2334   "(bad)",
2335   "fld",
2336   "(bad)",
2337   "fstp",
2338   /* dc */
2339   "fadd",
2340   "fmul",
2341   "fcom",
2342   "fcomp",
2343   "fsub",
2344   "fsubr",
2345   "fdiv",
2346   "fdivr",
2347   /* dd */
2348   "fld",
2349   "(bad)",
2350   "fst",
2351   "fstp",
2352   "frstor",
2353   "(bad)",
2354   "fNsave",
2355   "fNstsw",
2356   /* de */
2357   "fiadd",
2358   "fimul",
2359   "ficom",
2360   "ficomp",
2361   "fisub",
2362   "fisubr",
2363   "fidiv",
2364   "fidivr",
2365   /* df */
2366   "fild",
2367   "(bad)",
2368   "fist",
2369   "fistp",
2370   "fbld",
2371   "fild",
2372   "fbstp",
2373   "fistpll",
2374 };
2375
2376 #define ST OP_ST, 0
2377 #define STi OP_STi, 0
2378
2379 #define FGRPd9_2 NULL, NULL, 0
2380 #define FGRPd9_4 NULL, NULL, 1
2381 #define FGRPd9_5 NULL, NULL, 2
2382 #define FGRPd9_6 NULL, NULL, 3
2383 #define FGRPd9_7 NULL, NULL, 4
2384 #define FGRPda_5 NULL, NULL, 5
2385 #define FGRPdb_4 NULL, NULL, 6
2386 #define FGRPde_3 NULL, NULL, 7
2387 #define FGRPdf_4 NULL, NULL, 8
2388
2389 static const struct dis386 float_reg[][8] = {
2390   /* d8 */
2391   {
2392     { "fadd",   ST, STi },
2393     { "fmul",   ST, STi },
2394     { "fcom",   STi },
2395     { "fcomp",  STi },
2396     { "fsub",   ST, STi },
2397     { "fsubr",  ST, STi },
2398     { "fdiv",   ST, STi },
2399     { "fdivr",  ST, STi },
2400   },
2401   /* d9 */
2402   {
2403     { "fld",    STi },
2404     { "fxch",   STi },
2405     { FGRPd9_2 },
2406     { "(bad)" },
2407     { FGRPd9_4 },
2408     { FGRPd9_5 },
2409     { FGRPd9_6 },
2410     { FGRPd9_7 },
2411   },
2412   /* da */
2413   {
2414     { "fcmovb", ST, STi },
2415     { "fcmove", ST, STi },
2416     { "fcmovbe",ST, STi },
2417     { "fcmovu", ST, STi },
2418     { "(bad)" },
2419     { FGRPda_5 },
2420     { "(bad)" },
2421     { "(bad)" },
2422   },
2423   /* db */
2424   {
2425     { "fcmovnb",ST, STi },
2426     { "fcmovne",ST, STi },
2427     { "fcmovnbe",ST, STi },
2428     { "fcmovnu",ST, STi },
2429     { FGRPdb_4 },
2430     { "fucomi", ST, STi },
2431     { "fcomi",  ST, STi },
2432     { "(bad)" },
2433   },
2434   /* dc */
2435   {
2436     { "fadd",   STi, ST },
2437     { "fmul",   STi, ST },
2438     { "(bad)" },
2439     { "(bad)" },
2440 #if UNIXWARE_COMPAT
2441     { "fsub",   STi, ST },
2442     { "fsubr",  STi, ST },
2443     { "fdiv",   STi, ST },
2444     { "fdivr",  STi, ST },
2445 #else
2446     { "fsubr",  STi, ST },
2447     { "fsub",   STi, ST },
2448     { "fdivr",  STi, ST },
2449     { "fdiv",   STi, ST },
2450 #endif
2451   },
2452   /* dd */
2453   {
2454     { "ffree",  STi },
2455     { "(bad)" },
2456     { "fst",    STi },
2457     { "fstp",   STi },
2458     { "fucom",  STi },
2459     { "fucomp", STi },
2460     { "(bad)" },
2461     { "(bad)" },
2462   },
2463   /* de */
2464   {
2465     { "faddp",  STi, ST },
2466     { "fmulp",  STi, ST },
2467     { "(bad)" },
2468     { FGRPde_3 },
2469 #if UNIXWARE_COMPAT
2470     { "fsubp",  STi, ST },
2471     { "fsubrp", STi, ST },
2472     { "fdivp",  STi, ST },
2473     { "fdivrp", STi, ST },
2474 #else
2475     { "fsubrp", STi, ST },
2476     { "fsubp",  STi, ST },
2477     { "fdivrp", STi, ST },
2478     { "fdivp",  STi, ST },
2479 #endif
2480   },
2481   /* df */
2482   {
2483     { "(bad)" },
2484     { "(bad)" },
2485     { "(bad)" },
2486     { "(bad)" },
2487     { FGRPdf_4 },
2488     { "fucomip",ST, STi },
2489     { "fcomip", ST, STi },
2490     { "(bad)" },
2491   },
2492 };
2493
2494
2495 static char *fgrps[][8] = {
2496   /* d9_2  0 */
2497   {
2498     "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
2499   },
2500
2501   /* d9_4  1 */
2502   {
2503     "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
2504   },
2505
2506   /* d9_5  2 */
2507   {
2508     "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
2509   },
2510
2511   /* d9_6  3 */
2512   {
2513     "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
2514   },
2515
2516   /* d9_7  4 */
2517   {
2518     "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
2519   },
2520
2521   /* da_5  5 */
2522   {
2523     "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
2524   },
2525
2526   /* db_4  6 */
2527   {
2528     "feni(287 only)","fdisi(287 only)","fNclex","fNinit",
2529     "fNsetpm(287 only)","(bad)","(bad)","(bad)",
2530   },
2531
2532   /* de_3  7 */
2533   {
2534     "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
2535   },
2536
2537   /* df_4  8 */
2538   {
2539     "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
2540   },
2541 };
2542
2543 static void
2544 dofloat (sizeflag)
2545      int sizeflag;
2546 {
2547   const struct dis386 *dp;
2548   unsigned char floatop;
2549
2550   floatop = codep[-1];
2551
2552   if (mod != 3)
2553     {
2554       if (intel_syntax)
2555         putop (float_mem_intel[(floatop - 0xd8 ) * 8 + reg], sizeflag);
2556       else
2557         putop (float_mem_att[(floatop - 0xd8 ) * 8 + reg], sizeflag);
2558       obufp = op1out;
2559       if (floatop == 0xdb)
2560         OP_E (x_mode, sizeflag);
2561       else if (floatop == 0xdd)
2562         OP_E (d_mode, sizeflag);
2563       else
2564         OP_E (v_mode, sizeflag);
2565       return;
2566     }
2567   codep++;
2568
2569   dp = &float_reg[floatop - 0xd8][reg];
2570   if (dp->name == NULL)
2571     {
2572       putop (fgrps[dp->bytemode1][rm], sizeflag);
2573
2574       /* instruction fnstsw is only one with strange arg */
2575       if (floatop == 0xdf && codep[-1] == 0xe0)
2576         strcpy (op1out, names16[0]);
2577     }
2578   else
2579     {
2580       putop (dp->name, sizeflag);
2581
2582       obufp = op1out;
2583       if (dp->op1)
2584         (*dp->op1)(dp->bytemode1, sizeflag);
2585       obufp = op2out;
2586       if (dp->op2)
2587         (*dp->op2)(dp->bytemode2, sizeflag);
2588     }
2589 }
2590
2591 /* ARGSUSED */
2592 static void
2593 OP_ST (ignore, sizeflag)
2594      int ignore;
2595      int sizeflag;
2596 {
2597   oappend ("%st");
2598 }
2599
2600 /* ARGSUSED */
2601 static void
2602 OP_STi (ignore, sizeflag)
2603      int ignore;
2604      int sizeflag;
2605 {
2606   sprintf (scratchbuf, "%%st(%d)", rm);
2607   oappend (scratchbuf);
2608 }
2609
2610
2611 /* capital letters in template are macros */
2612 static void
2613 putop (template, sizeflag)
2614      const char *template;
2615      int sizeflag;
2616 {
2617   const char *p;
2618
2619   for (p = template; *p; p++)
2620     {
2621       switch (*p)
2622         {
2623         default:
2624           *obufp++ = *p;
2625           break;
2626         case 'A':
2627           if (intel_syntax)
2628             break;
2629           if (mod != 3
2630 #ifdef SUFFIX_ALWAYS
2631               || (sizeflag & SUFFIX_ALWAYS)
2632 #endif
2633               )
2634             *obufp++ = 'b';
2635           break;
2636         case 'B':
2637           if (intel_syntax)
2638             break;
2639 #ifdef SUFFIX_ALWAYS
2640           if (sizeflag & SUFFIX_ALWAYS)
2641             *obufp++ = 'b';
2642 #endif
2643           break;
2644         case 'E':               /* For jcxz/jecxz */
2645           if (sizeflag & AFLAG)
2646             *obufp++ = 'e';
2647           break;
2648         case 'L':
2649           if (intel_syntax)
2650             break;
2651 #ifdef SUFFIX_ALWAYS
2652           if (sizeflag & SUFFIX_ALWAYS)
2653             *obufp++ = 'l';
2654 #endif
2655           break;
2656         case 'N':
2657           if ((prefixes & PREFIX_FWAIT) == 0)
2658             *obufp++ = 'n';
2659           break;
2660         case 'P':
2661           if (intel_syntax)
2662             break;
2663           if ((prefixes & PREFIX_DATA)
2664 #ifdef SUFFIX_ALWAYS
2665               || (sizeflag & SUFFIX_ALWAYS)
2666 #endif
2667               )
2668             {
2669               if (sizeflag & DFLAG)
2670                 *obufp++ = 'l';
2671               else
2672                 *obufp++ = 'w';
2673             }
2674           break;
2675         case 'Q':
2676           if (intel_syntax)
2677             break;
2678           if (mod != 3
2679 #ifdef SUFFIX_ALWAYS
2680               || (sizeflag & SUFFIX_ALWAYS)
2681 #endif
2682               )
2683             {
2684               if (sizeflag & DFLAG)
2685                 *obufp++ = 'l';
2686               else
2687                 *obufp++ = 'w';
2688             }
2689           break;
2690         case 'R':
2691           if (intel_syntax)
2692             {
2693               if (sizeflag & DFLAG)
2694                 {
2695                   *obufp++ = 'd';
2696                   *obufp++ = 'q';
2697                 }
2698               else
2699                 {
2700                   *obufp++ = 'w';
2701                   *obufp++ = 'd';
2702                 }
2703             }
2704           else
2705             {
2706               if (sizeflag & DFLAG)
2707                 *obufp++ = 'l';
2708               else
2709                 *obufp++ = 'w';
2710             }
2711           break;
2712         case 'S':
2713           if (intel_syntax)
2714             break;
2715 #ifdef SUFFIX_ALWAYS
2716           if (sizeflag & SUFFIX_ALWAYS)
2717             {
2718               if (sizeflag & DFLAG)
2719                 *obufp++ = 'l';
2720               else
2721                 *obufp++ = 'w';
2722             }
2723 #endif
2724           break;
2725         case 'W':
2726           /* operand size flag for cwtl, cbtw */
2727           if (sizeflag & DFLAG)
2728             *obufp++ = 'w';
2729           else
2730             *obufp++ = 'b';
2731           if (intel_syntax)
2732             {
2733               if (sizeflag & DFLAG)
2734                 {
2735                   *obufp++ = 'd';
2736                   *obufp++ = 'e';
2737                 }
2738               else
2739                 {
2740                   *obufp++ = 'w';
2741                 }
2742             }
2743           break;
2744         }
2745     }
2746   *obufp = 0;
2747 }
2748
2749 static void
2750 oappend (s)
2751      const char *s;
2752 {
2753   strcpy (obufp, s);
2754   obufp += strlen (s);
2755 }
2756
2757 static void
2758 append_seg ()
2759 {
2760   if (prefixes & PREFIX_CS)
2761     oappend ("%cs:");
2762   if (prefixes & PREFIX_DS)
2763     oappend ("%ds:");
2764   if (prefixes & PREFIX_SS)
2765     oappend ("%ss:");
2766   if (prefixes & PREFIX_ES)
2767     oappend ("%es:");
2768   if (prefixes & PREFIX_FS)
2769     oappend ("%fs:");
2770   if (prefixes & PREFIX_GS)
2771     oappend ("%gs:");
2772 }
2773
2774 static void
2775 OP_indirE (bytemode, sizeflag)
2776      int bytemode;
2777      int sizeflag;
2778 {
2779   if (!intel_syntax)
2780     oappend ("*");
2781   OP_E (bytemode, sizeflag);
2782 }
2783
2784 static void
2785 OP_E (bytemode, sizeflag)
2786      int bytemode;
2787      int sizeflag;
2788 {
2789   int disp;
2790
2791   /* skip mod/rm byte */
2792   codep++;
2793
2794   if (mod == 3)
2795     {
2796       switch (bytemode)
2797         {
2798         case b_mode:
2799           oappend (names8[rm]);
2800           break;
2801         case w_mode:
2802           oappend (names16[rm]);
2803           break;
2804         case d_mode:
2805           oappend (names32[rm]);
2806           break;
2807         case v_mode:
2808           if (sizeflag & DFLAG)
2809             oappend (names32[rm]);
2810           else
2811             oappend (names16[rm]);
2812           break;
2813         case 0:
2814           if ( !(codep[-2] == 0xAE && codep[-1] == 0xF8 /* sfence */))
2815             BadOp();    /* bad sfence,lea,lds,les,lfs,lgs,lss modrm */
2816           break;
2817         default:
2818           oappend (INTERNAL_DISASSEMBLER_ERROR);
2819           break;
2820         }
2821       return;
2822     }
2823
2824   disp = 0;
2825   append_seg ();
2826
2827   if (sizeflag & AFLAG) /* 32 bit address mode */
2828     {
2829       int havesib;
2830       int havebase;
2831       int base;
2832       int index = 0;
2833       int scale = 0;
2834
2835       havesib = 0;
2836       havebase = 1;
2837       base = rm;
2838
2839       if (base == 4)
2840         {
2841           havesib = 1;
2842           FETCH_DATA (the_info, codep + 1);
2843           scale = (*codep >> 6) & 3;
2844           index = (*codep >> 3) & 7;
2845           base = *codep & 7;
2846           codep++;
2847         }
2848
2849       switch (mod)
2850         {
2851         case 0:
2852           if (base == 5)
2853             {
2854               havebase = 0;
2855               disp = get32 ();
2856             }
2857           break;
2858         case 1:
2859           FETCH_DATA (the_info, codep + 1);
2860           disp = *codep++;
2861           if ((disp & 0x80) != 0)
2862             disp -= 0x100;
2863           break;
2864         case 2:
2865           disp = get32 ();
2866           break;
2867         }
2868
2869       if (!intel_syntax)
2870         if (mod != 0 || base == 5)
2871           {
2872             sprintf (scratchbuf, "0x%x", disp);
2873             oappend (scratchbuf);
2874           }
2875
2876       if (havebase || (havesib && (index != 4 || scale != 0)))
2877         {
2878           if (intel_syntax)
2879             {
2880               switch (bytemode)
2881                 {
2882                 case b_mode:
2883                   oappend("BYTE PTR ");
2884                   break;
2885                 case w_mode:
2886                   oappend("WORD PTR ");
2887                   break;
2888                 case v_mode:
2889                   oappend("DWORD PTR ");
2890                   break;
2891                 case d_mode:
2892                   oappend("QWORD PTR ");
2893                   break;
2894                 case x_mode:
2895                   oappend("XWORD PTR ");
2896                   break;
2897                 default:
2898                   break;
2899                 }
2900              }
2901           *obufp++ = open_char;
2902           *obufp = '\0';
2903           if (havebase)
2904             oappend (names32[base]);
2905           if (havesib)
2906             {
2907               if (index != 4)
2908                 {
2909                   if (intel_syntax)
2910                     {
2911                       if (havebase)
2912                         {
2913                           *obufp++ = separator_char;
2914                           *obufp = '\0';
2915                         }
2916                       sprintf (scratchbuf, "%s", names32[index]);
2917                     }
2918                   else
2919                     sprintf (scratchbuf, ",%s", names32[index]);
2920                   oappend (scratchbuf);
2921                 }
2922               if (!intel_syntax
2923                   || (intel_syntax
2924                       && bytemode != b_mode
2925                       && bytemode != w_mode
2926                       && bytemode != v_mode))
2927                 {
2928                   *obufp++ = scale_char;
2929                   *obufp = '\0';
2930                   sprintf (scratchbuf, "%d", 1 << scale);
2931                   oappend (scratchbuf);
2932                 }
2933             }
2934           if (intel_syntax)
2935             if (mod != 0 || base == 5)
2936               {
2937                 /* Don't print zero displacements */
2938                 if (disp > 0)
2939                   {
2940                     sprintf (scratchbuf, "+%d", disp);
2941                     oappend (scratchbuf);
2942                   }
2943                 else if (disp < 0)
2944                   {
2945                     sprintf (scratchbuf, "%d", disp);
2946                     oappend (scratchbuf);
2947                   }
2948               }
2949
2950           *obufp++ = close_char;
2951           *obufp = '\0';
2952         }
2953       else if (intel_syntax)
2954         {
2955           if (mod != 0 || base == 5)
2956             {
2957               if (prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
2958                               | PREFIX_ES | PREFIX_FS | PREFIX_GS))
2959                 ;
2960               else
2961                 {
2962                   oappend (names_seg[3]);
2963                   oappend (":");
2964                 }
2965               sprintf (scratchbuf, "0x%x", disp);
2966               oappend (scratchbuf);
2967             }
2968         }
2969     }
2970   else
2971     { /* 16 bit address mode */
2972       switch (mod)
2973         {
2974         case 0:
2975           if (rm == 6)
2976             {
2977               disp = get16 ();
2978               if ((disp & 0x8000) != 0)
2979                 disp -= 0x10000;
2980             }
2981           break;
2982         case 1:
2983           FETCH_DATA (the_info, codep + 1);
2984           disp = *codep++;
2985           if ((disp & 0x80) != 0)
2986             disp -= 0x100;
2987           break;
2988         case 2:
2989           disp = get16 ();
2990           if ((disp & 0x8000) != 0)
2991             disp -= 0x10000;
2992           break;
2993         }
2994
2995       if (!intel_syntax)
2996         if (mod != 0 || rm == 6)
2997           {
2998             sprintf (scratchbuf, "%d", disp);
2999             oappend (scratchbuf);
3000           }
3001
3002       if (mod != 0 || rm != 6)
3003         {
3004           *obufp++ = open_char;
3005           *obufp = '\0';
3006           oappend (index16[rm]);
3007           *obufp++ = close_char;
3008           *obufp = '\0';
3009         }
3010     }
3011 }
3012
3013 static void
3014 OP_G (bytemode, sizeflag)
3015      int bytemode;
3016      int sizeflag;
3017 {
3018   switch (bytemode)
3019     {
3020     case b_mode:
3021       oappend (names8[reg]);
3022       break;
3023     case w_mode:
3024       oappend (names16[reg]);
3025       break;
3026     case d_mode:
3027       oappend (names32[reg]);
3028       break;
3029     case v_mode:
3030       if (sizeflag & DFLAG)
3031         oappend (names32[reg]);
3032       else
3033         oappend (names16[reg]);
3034       break;
3035     default:
3036       oappend (INTERNAL_DISASSEMBLER_ERROR);
3037       break;
3038     }
3039 }
3040
3041 static int
3042 get32 ()
3043 {
3044   int x = 0;
3045
3046   FETCH_DATA (the_info, codep + 4);
3047   x = *codep++ & 0xff;
3048   x |= (*codep++ & 0xff) << 8;
3049   x |= (*codep++ & 0xff) << 16;
3050   x |= (*codep++ & 0xff) << 24;
3051   return x;
3052 }
3053
3054 static int
3055 get16 ()
3056 {
3057   int x = 0;
3058
3059   FETCH_DATA (the_info, codep + 2);
3060   x = *codep++ & 0xff;
3061   x |= (*codep++ & 0xff) << 8;
3062   return x;
3063 }
3064
3065 static void
3066 set_op (op)
3067      unsigned int op;
3068 {
3069   op_index[op_ad] = op_ad;
3070   op_address[op_ad] = op;
3071 }
3072
3073 static void
3074 OP_REG (code, sizeflag)
3075      int code;
3076      int sizeflag;
3077 {
3078   const char *s;
3079
3080   switch (code)
3081     {
3082     case indir_dx_reg:
3083       s = "(%dx)";
3084       break;
3085     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
3086     case sp_reg: case bp_reg: case si_reg: case di_reg:
3087       s = names16[code - ax_reg];
3088       break;
3089     case es_reg: case ss_reg: case cs_reg:
3090     case ds_reg: case fs_reg: case gs_reg:
3091       s = names_seg[code - es_reg];
3092       break;
3093     case al_reg: case ah_reg: case cl_reg: case ch_reg:
3094     case dl_reg: case dh_reg: case bl_reg: case bh_reg:
3095       s = names8[code - al_reg];
3096       break;
3097     case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
3098     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
3099       if (sizeflag & DFLAG)
3100         s = names32[code - eAX_reg];
3101       else
3102         s = names16[code - eAX_reg];
3103       break;
3104     default:
3105       s = INTERNAL_DISASSEMBLER_ERROR;
3106       break;
3107     }
3108   oappend (s);
3109 }
3110
3111 static void
3112 OP_I (bytemode, sizeflag)
3113      int bytemode;
3114      int sizeflag;
3115 {
3116   int op;
3117
3118   switch (bytemode)
3119     {
3120     case b_mode:
3121       FETCH_DATA (the_info, codep + 1);
3122       op = *codep++ & 0xff;
3123       break;
3124     case v_mode:
3125       if (sizeflag & DFLAG)
3126         op = get32 ();
3127       else
3128         op = get16 ();
3129       break;
3130     case w_mode:
3131       op = get16 ();
3132       break;
3133     default:
3134       oappend (INTERNAL_DISASSEMBLER_ERROR);
3135       return;
3136     }
3137
3138   if (intel_syntax)
3139     sprintf (scratchbuf, "0x%x", op);
3140   else
3141     sprintf (scratchbuf, "$0x%x", op);
3142   oappend (scratchbuf);
3143   scratchbuf[0] = '\0';
3144 }
3145
3146 static void
3147 OP_sI (bytemode, sizeflag)
3148      int bytemode;
3149      int sizeflag;
3150 {
3151   int op;
3152
3153   switch (bytemode)
3154     {
3155     case b_mode:
3156       FETCH_DATA (the_info, codep + 1);
3157       op = *codep++;
3158       if ((op & 0x80) != 0)
3159         op -= 0x100;
3160       break;
3161     case v_mode:
3162       if (sizeflag & DFLAG)
3163         op = get32 ();
3164       else
3165         {
3166           op = get16();
3167           if ((op & 0x8000) != 0)
3168             op -= 0x10000;
3169         }
3170       break;
3171     case w_mode:
3172       op = get16 ();
3173       if ((op & 0x8000) != 0)
3174         op -= 0x10000;
3175       break;
3176     default:
3177       oappend (INTERNAL_DISASSEMBLER_ERROR);
3178       return;
3179     }
3180   if (intel_syntax)
3181     sprintf (scratchbuf, "%d", op);
3182   else
3183     sprintf (scratchbuf, "$0x%x", op);
3184   oappend (scratchbuf);
3185 }
3186
3187 static void
3188 OP_J (bytemode, sizeflag)
3189      int bytemode;
3190      int sizeflag;
3191 {
3192   int disp;
3193   int mask = -1;
3194
3195   switch (bytemode)
3196     {
3197     case b_mode:
3198       FETCH_DATA (the_info, codep + 1);
3199       disp = *codep++;
3200       if ((disp & 0x80) != 0)
3201         disp -= 0x100;
3202       break;
3203     case v_mode:
3204       if (sizeflag & DFLAG)
3205         disp = get32 ();
3206       else
3207         {
3208           disp = get16 ();
3209           /* for some reason, a data16 prefix on a jump instruction
3210              means that the pc is masked to 16 bits after the
3211              displacement is added!  */
3212           mask = 0xffff;
3213         }
3214       break;
3215     default:
3216       oappend (INTERNAL_DISASSEMBLER_ERROR);
3217       return;
3218     }
3219   disp = (start_pc + codep - start_codep + disp) & mask;
3220   set_op (disp);
3221   sprintf (scratchbuf, "0x%x", disp);
3222   oappend (scratchbuf);
3223 }
3224
3225 /* ARGSUSED */
3226 static void
3227 OP_SEG (dummy, sizeflag)
3228      int dummy;
3229      int sizeflag;
3230 {
3231   static char *sreg[] = {
3232     "%es","%cs","%ss","%ds","%fs","%gs","%?","%?",
3233   };
3234
3235   oappend (sreg[reg]);
3236 }
3237
3238 /* ARGSUSED */
3239 static void
3240 OP_DIR (dummy, sizeflag)
3241      int dummy;
3242      int sizeflag;
3243 {
3244   int seg, offset;
3245
3246   if (sizeflag & DFLAG)
3247     {
3248       offset = get32 ();
3249       seg = get16 ();
3250     }
3251   else
3252     {
3253       offset = get16 ();
3254       seg = get16 ();
3255     }
3256   sprintf (scratchbuf, "$0x%x,$0x%x", seg, offset);
3257   oappend (scratchbuf);
3258 }
3259
3260 /* ARGSUSED */
3261 static void
3262 OP_OFF (ignore, sizeflag)
3263      int ignore;
3264      int sizeflag;
3265 {
3266   int off;
3267
3268   append_seg ();
3269
3270   if (sizeflag & AFLAG)
3271     off = get32 ();
3272   else
3273     off = get16 ();
3274
3275   if (intel_syntax)
3276     {
3277       if (!(prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS
3278                         | PREFIX_ES | PREFIX_FS | PREFIX_GS)))
3279         {
3280           oappend (names_seg[3]);
3281           oappend (":");
3282         }
3283     }
3284   sprintf (scratchbuf, "0x%x", off);
3285   oappend (scratchbuf);
3286 }
3287
3288 static void
3289 ptr_reg (code, sizeflag)
3290      int code;
3291      int sizeflag;
3292 {
3293   const char *s;
3294   oappend ("(");
3295   if (sizeflag & AFLAG)
3296     s = names32[code - eAX_reg];
3297   else
3298     s = names16[code - eAX_reg];
3299   oappend (s);
3300   oappend (")");
3301 }
3302
3303 static void
3304 OP_ESreg (code, sizeflag)
3305      int code;
3306      int sizeflag;
3307 {
3308   oappend ("%es:");
3309   ptr_reg (code, sizeflag);
3310 }
3311
3312 static void
3313 OP_DSreg (code, sizeflag)
3314      int code;
3315      int sizeflag;
3316 {
3317   if ((prefixes
3318        & (PREFIX_CS
3319           | PREFIX_DS
3320           | PREFIX_SS
3321           | PREFIX_ES
3322           | PREFIX_FS
3323           | PREFIX_GS)) == 0)
3324     prefixes |= PREFIX_DS;
3325   append_seg();
3326   ptr_reg (code, sizeflag);
3327 }
3328
3329 /* ARGSUSED */
3330 static void
3331 OP_C (dummy, sizeflag)
3332      int dummy;
3333      int sizeflag;
3334 {
3335   sprintf (scratchbuf, "%%cr%d", reg);
3336   oappend (scratchbuf);
3337 }
3338
3339 /* ARGSUSED */
3340 static void
3341 OP_D (dummy, sizeflag)
3342      int dummy;
3343      int sizeflag;
3344 {
3345   sprintf (scratchbuf, "%%db%d", reg);
3346   oappend (scratchbuf);
3347 }
3348
3349 /* ARGSUSED */
3350 static void
3351 OP_T (dummy, sizeflag)
3352      int dummy;
3353      int sizeflag;
3354 {
3355   sprintf (scratchbuf, "%%tr%d", reg);
3356   oappend (scratchbuf);
3357 }
3358
3359 static void
3360 OP_Rd (bytemode, sizeflag)
3361      int bytemode;
3362      int sizeflag;
3363 {
3364   if (mod == 3)
3365     OP_E (bytemode, sizeflag);
3366   else
3367     BadOp();
3368 }
3369
3370 static void
3371 OP_MMX (ignore, sizeflag)
3372      int ignore;
3373      int sizeflag;
3374 {
3375   sprintf (scratchbuf, "%%mm%d", reg);
3376   oappend (scratchbuf);
3377 }
3378
3379 static void
3380 OP_XMM (bytemode, sizeflag)
3381      int bytemode;
3382      int sizeflag;
3383 {
3384   sprintf (scratchbuf, "%%xmm%d", reg);
3385   oappend (scratchbuf);
3386 }
3387
3388 static void
3389 OP_EM (bytemode, sizeflag)
3390      int bytemode;
3391      int sizeflag;
3392 {
3393   if (mod != 3)
3394     {
3395       OP_E (bytemode, sizeflag);
3396       return;
3397     }
3398
3399   codep++;
3400   sprintf (scratchbuf, "%%mm%d", rm);
3401   oappend (scratchbuf);
3402 }
3403
3404 static void
3405 OP_EX (bytemode, sizeflag)
3406      int bytemode;
3407      int sizeflag;
3408 {
3409   if (mod != 3)
3410     {
3411       OP_E (bytemode, sizeflag);
3412       return;
3413     }
3414
3415   codep++;
3416   sprintf (scratchbuf, "%%xmm%d", rm);
3417   oappend (scratchbuf);
3418 }
3419
3420 static void
3421 OP_MS (bytemode, sizeflag)
3422      int bytemode;
3423      int sizeflag;
3424 {
3425   if (mod == 3)
3426     OP_EM (bytemode, sizeflag);
3427   else
3428     BadOp();
3429 }
3430
3431 static const char *Suffix3DNow[] = {
3432 /* 00 */        NULL,           NULL,           NULL,           NULL,
3433 /* 04 */        NULL,           NULL,           NULL,           NULL,
3434 /* 08 */        NULL,           NULL,           NULL,           NULL,
3435 /* 0C */        NULL,           "pi2fd",        NULL,           NULL,
3436 /* 10 */        NULL,           NULL,           NULL,           NULL,
3437 /* 14 */        NULL,           NULL,           NULL,           NULL,
3438 /* 18 */        NULL,           NULL,           NULL,           NULL,
3439 /* 1C */        NULL,           "pf2id",        NULL,           NULL,
3440 /* 20 */        NULL,           NULL,           NULL,           NULL,
3441 /* 24 */        NULL,           NULL,           NULL,           NULL,
3442 /* 28 */        NULL,           NULL,           NULL,           NULL,
3443 /* 2C */        NULL,           NULL,           NULL,           NULL,
3444 /* 30 */        NULL,           NULL,           NULL,           NULL,
3445 /* 34 */        NULL,           NULL,           NULL,           NULL,
3446 /* 38 */        NULL,           NULL,           NULL,           NULL,
3447 /* 3C */        NULL,           NULL,           NULL,           NULL,
3448 /* 40 */        NULL,           NULL,           NULL,           NULL,
3449 /* 44 */        NULL,           NULL,           NULL,           NULL,
3450 /* 48 */        NULL,           NULL,           NULL,           NULL,
3451 /* 4C */        NULL,           NULL,           NULL,           NULL,
3452 /* 50 */        NULL,           NULL,           NULL,           NULL,
3453 /* 54 */        NULL,           NULL,           NULL,           NULL,
3454 /* 58 */        NULL,           NULL,           NULL,           NULL,
3455 /* 5C */        NULL,           NULL,           NULL,           NULL,
3456 /* 60 */        NULL,           NULL,           NULL,           NULL,
3457 /* 64 */        NULL,           NULL,           NULL,           NULL,
3458 /* 68 */        NULL,           NULL,           NULL,           NULL,
3459 /* 6C */        NULL,           NULL,           NULL,           NULL,
3460 /* 70 */        NULL,           NULL,           NULL,           NULL,
3461 /* 74 */        NULL,           NULL,           NULL,           NULL,
3462 /* 78 */        NULL,           NULL,           NULL,           NULL,
3463 /* 7C */        NULL,           NULL,           NULL,           NULL,
3464 /* 80 */        NULL,           NULL,           NULL,           NULL,
3465 /* 84 */        NULL,           NULL,           NULL,           NULL,
3466 /* 88 */        NULL,           NULL,           NULL,           NULL,
3467 /* 8C */        NULL,           NULL,           NULL,           NULL,
3468 /* 90 */        "pfcmpge",      NULL,           NULL,           NULL,
3469 /* 94 */        "pfmin",        NULL,           "pfrcp",        "pfrsqrt",
3470 /* 98 */        NULL,           NULL,           "pfsub",        NULL,
3471 /* 9C */        NULL,           NULL,           "pfadd",        NULL,
3472 /* A0 */        "pfcmpgt",      NULL,           NULL,           NULL,
3473 /* A4 */        "pfmax",        NULL,           "pfrcpit1",     "pfrsqit1",
3474 /* A8 */        NULL,           NULL,           "pfsubr",       NULL,
3475 /* AC */        NULL,           NULL,           "pfacc",        NULL,
3476 /* B0 */        "pfcmpeq",      NULL,           NULL,           NULL,
3477 /* B4 */        "pfmul",        NULL,           "pfrcpit2",     "pfmulhrw",
3478 /* B8 */        NULL,           NULL,           NULL,           NULL,
3479 /* BC */        NULL,           NULL,           NULL,           "pavgusb",
3480 /* C0 */        NULL,           NULL,           NULL,           NULL,
3481 /* C4 */        NULL,           NULL,           NULL,           NULL,
3482 /* C8 */        NULL,           NULL,           NULL,           NULL,
3483 /* CC */        NULL,           NULL,           NULL,           NULL,
3484 /* D0 */        NULL,           NULL,           NULL,           NULL,
3485 /* D4 */        NULL,           NULL,           NULL,           NULL,
3486 /* D8 */        NULL,           NULL,           NULL,           NULL,
3487 /* DC */        NULL,           NULL,           NULL,           NULL,
3488 /* E0 */        NULL,           NULL,           NULL,           NULL,
3489 /* E4 */        NULL,           NULL,           NULL,           NULL,
3490 /* E8 */        NULL,           NULL,           NULL,           NULL,
3491 /* EC */        NULL,           NULL,           NULL,           NULL,
3492 /* F0 */        NULL,           NULL,           NULL,           NULL,
3493 /* F4 */        NULL,           NULL,           NULL,           NULL,
3494 /* F8 */        NULL,           NULL,           NULL,           NULL,
3495 /* FC */        NULL,           NULL,           NULL,           NULL,
3496 };
3497
3498 static void
3499 OP_3DNowSuffix (bytemode, sizeflag)
3500      int bytemode;
3501      int sizeflag;
3502 {
3503   const char *mnemonic;
3504
3505   FETCH_DATA (the_info, codep + 1);
3506   /* AMD 3DNow! instructions are specified by an opcode suffix in the
3507      place where an 8-bit immediate would normally go.  ie. the last
3508      byte of the instruction.  */
3509   obufp = obuf + strlen(obuf);
3510   mnemonic = Suffix3DNow[*codep++ & 0xff];
3511   if (mnemonic)
3512     oappend (mnemonic);
3513   else
3514     {
3515       /* Since a variable sized modrm/sib chunk is between the start
3516          of the opcode (0x0f0f) and the opcode suffix, we need to do
3517          all the modrm processing first, and don't know until now that
3518          we have a bad opcode.  This necessitates some cleaning up.  */
3519       op1out[0] = '\0';
3520       op2out[0] = '\0';
3521       BadOp();
3522     }
3523 }
3524
3525
3526 static const char *simd_cmp_op [] = {
3527   "eq",
3528   "lt",
3529   "le",
3530   "unord",
3531   "neq",
3532   "nlt",
3533   "nle",
3534   "ord"
3535 };
3536
3537 static void
3538 OP_SIMD_Suffix (bytemode, sizeflag)
3539      int bytemode;
3540      int sizeflag;
3541 {
3542   unsigned int cmp_type;
3543
3544   FETCH_DATA (the_info, codep + 1);
3545   obufp = obuf + strlen(obuf);
3546   cmp_type = *codep++ & 0xff;
3547   if (cmp_type < 8)
3548     {
3549       sprintf (scratchbuf, "cmp%s%cs",
3550                simd_cmp_op[cmp_type],
3551                prefixes & PREFIX_REPZ ? 's' : 'p');
3552       oappend (scratchbuf);
3553     }
3554   else
3555     {
3556       /* We have a bad extension byte.  Clean up.  */
3557       op1out[0] = '\0';
3558       op2out[0] = '\0';
3559       BadOp();
3560     }
3561 }
3562
3563 static void
3564 SIMD_Fixup (extrachar, sizeflag)
3565      int extrachar;
3566      int sizeflag;
3567 {
3568   /* Change movlps/movhps to movhlps/movlhps for 2 register operand
3569      forms of these instructions.  */
3570   if (mod == 3)
3571     {
3572       char *p = obuf + strlen(obuf);
3573       *(p+1) = '\0';
3574       *p     = *(p-1);
3575       *(p-1) = *(p-2);
3576       *(p-2) = *(p-3);
3577       *(p-3) = extrachar;
3578     }
3579 }
3580
3581 static void BadOp (void)
3582 {
3583   codep = insn_codep + 1;       /* throw away prefixes and 1st. opcode byte */
3584   oappend ("(bad)");
3585 }