qemu/m68k-dis.c
<<
>>
Prefs
   1/* This file is composed of several different files from the upstream
   2   sourceware.org CVS.  Original file boundaries marked with **** */
   3
   4#include <string.h>
   5#include <math.h>
   6#include <stdio.h>
   7
   8#include "dis-asm.h"
   9
  10/* **** floatformat.h from sourceware.org CVS 2005-08-14.  */
  11/* IEEE floating point support declarations, for GDB, the GNU Debugger.
  12   Copyright 1991, 1994, 1995, 1997, 2000, 2003 Free Software Foundation, Inc.
  13
  14This file is part of GDB.
  15
  16This program is free software; you can redistribute it and/or modify
  17it under the terms of the GNU General Public License as published by
  18the Free Software Foundation; either version 2 of the License, or
  19(at your option) any later version.
  20
  21This program is distributed in the hope that it will be useful,
  22but WITHOUT ANY WARRANTY; without even the implied warranty of
  23MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  24GNU General Public License for more details.
  25
  26You should have received a copy of the GNU General Public License
  27along with this program; if not, see <http://www.gnu.org/licenses/>.  */
  28
  29#if !defined (FLOATFORMAT_H)
  30#define FLOATFORMAT_H 1
  31
  32/*#include "ansidecl.h" */
  33
  34/* A floatformat consists of a sign bit, an exponent and a mantissa.  Once the
  35   bytes are concatenated according to the byteorder flag, then each of those
  36   fields is contiguous.  We number the bits with 0 being the most significant
  37   (i.e. BITS_BIG_ENDIAN type numbering), and specify which bits each field
  38   contains with the *_start and *_len fields.  */
  39
  40/* What is the order of the bytes. */
  41
  42enum floatformat_byteorders {
  43
  44  /* Standard little endian byte order.
  45     EX: 1.2345678e10 => 00 00 80 c5 e0 fe 06 42 */
  46
  47  floatformat_little,
  48
  49  /* Standard big endian byte order.
  50     EX: 1.2345678e10 => 42 06 fe e0 c5 80 00 00 */
  51
  52  floatformat_big,
  53
  54  /* Little endian byte order but big endian word order.
  55     EX: 1.2345678e10 => e0 fe 06 42 00 00 80 c5 */
  56
  57  floatformat_littlebyte_bigword
  58
  59};
  60
  61enum floatformat_intbit { floatformat_intbit_yes, floatformat_intbit_no };
  62
  63struct floatformat
  64{
  65  enum floatformat_byteorders byteorder;
  66  unsigned int totalsize;       /* Total size of number in bits */
  67
  68  /* Sign bit is always one bit long.  1 means negative, 0 means positive.  */
  69  unsigned int sign_start;
  70
  71  unsigned int exp_start;
  72  unsigned int exp_len;
  73  /* Bias added to a "true" exponent to form the biased exponent.  It
  74     is intentionally signed as, otherwize, -exp_bias can turn into a
  75     very large number (e.g., given the exp_bias of 0x3fff and a 64
  76     bit long, the equation (long)(1 - exp_bias) evaluates to
  77     4294950914) instead of -16382).  */
  78  int exp_bias;
  79  /* Exponent value which indicates NaN.  This is the actual value stored in
  80     the float, not adjusted by the exp_bias.  This usually consists of all
  81     one bits.  */
  82  unsigned int exp_nan;
  83
  84  unsigned int man_start;
  85  unsigned int man_len;
  86
  87  /* Is the integer bit explicit or implicit?  */
  88  enum floatformat_intbit intbit;
  89
  90  /* Internal name for debugging. */
  91  const char *name;
  92
  93  /* Validator method.  */
  94  int (*is_valid) (const struct floatformat *fmt, const char *from);
  95};
  96
  97/* floatformats for IEEE single and double, big and little endian.  */
  98
  99extern const struct floatformat floatformat_ieee_single_big;
 100extern const struct floatformat floatformat_ieee_single_little;
 101extern const struct floatformat floatformat_ieee_double_big;
 102extern const struct floatformat floatformat_ieee_double_little;
 103
 104/* floatformat for ARM IEEE double, little endian bytes and big endian words */
 105
 106extern const struct floatformat floatformat_ieee_double_littlebyte_bigword;
 107
 108/* floatformats for various extendeds.  */
 109
 110extern const struct floatformat floatformat_i387_ext;
 111extern const struct floatformat floatformat_m68881_ext;
 112extern const struct floatformat floatformat_i960_ext;
 113extern const struct floatformat floatformat_m88110_ext;
 114extern const struct floatformat floatformat_m88110_harris_ext;
 115extern const struct floatformat floatformat_arm_ext_big;
 116extern const struct floatformat floatformat_arm_ext_littlebyte_bigword;
 117/* IA-64 Floating Point register spilt into memory.  */
 118extern const struct floatformat floatformat_ia64_spill_big;
 119extern const struct floatformat floatformat_ia64_spill_little;
 120extern const struct floatformat floatformat_ia64_quad_big;
 121extern const struct floatformat floatformat_ia64_quad_little;
 122
 123/* Convert from FMT to a double.
 124   FROM is the address of the extended float.
 125   Store the double in *TO.  */
 126
 127extern void
 128floatformat_to_double (const struct floatformat *, const char *, double *);
 129
 130/* The converse: convert the double *FROM to FMT
 131   and store where TO points.  */
 132
 133extern void
 134floatformat_from_double (const struct floatformat *, const double *, char *);
 135
 136/* Return non-zero iff the data at FROM is a valid number in format FMT.  */
 137
 138extern int
 139floatformat_is_valid (const struct floatformat *fmt, const char *from);
 140
 141#endif  /* defined (FLOATFORMAT_H) */
 142/* **** End of floatformat.h */
 143/* **** m68k-dis.h from sourceware.org CVS 2005-08-14.  */
 144/* Opcode table header for m680[01234]0/m6888[12]/m68851.
 145   Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2001,
 146   2003, 2004 Free Software Foundation, Inc.
 147
 148   This file is part of GDB, GAS, and the GNU binutils.
 149
 150   GDB, GAS, and the GNU binutils are free software; you can redistribute
 151   them and/or modify them under the terms of the GNU General Public
 152   License as published by the Free Software Foundation; either version
 153   1, or (at your option) any later version.
 154
 155   GDB, GAS, and the GNU binutils are distributed in the hope that they
 156   will be useful, but WITHOUT ANY WARRANTY; without even the implied
 157   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
 158   the GNU General Public License for more details.
 159
 160   You should have received a copy of the GNU General Public License
 161   along with this file; see the file COPYING.  If not,
 162   see <http://www.gnu.org/licenses/>.  */
 163
 164/* These are used as bit flags for the arch field in the m68k_opcode
 165   structure.  */
 166#define _m68k_undef  0
 167#define m68000   0x001
 168#define m68008   m68000 /* Synonym for -m68000.  otherwise unused.  */
 169#define m68010   0x002
 170#define m68020   0x004
 171#define m68030   0x008
 172#define m68ec030 m68030 /* Similar enough to -m68030 to ignore differences;
 173                           gas will deal with the few differences.  */
 174#define m68040   0x010
 175/* There is no 68050.  */
 176#define m68060   0x020
 177#define m68881   0x040
 178#define m68882   m68881 /* Synonym for -m68881.  otherwise unused.  */
 179#define m68851   0x080
 180#define cpu32    0x100          /* e.g., 68332 */
 181
 182#define mcfmac   0x200          /* ColdFire MAC. */
 183#define mcfemac  0x400          /* ColdFire EMAC. */
 184#define cfloat   0x800          /* ColdFire FPU.  */
 185#define mcfhwdiv 0x1000         /* ColdFire hardware divide.  */
 186
 187#define mcfisa_a 0x2000         /* ColdFire ISA_A.  */
 188#define mcfisa_aa 0x4000        /* ColdFire ISA_A+.  */
 189#define mcfisa_b 0x8000         /* ColdFire ISA_B.  */
 190#define mcfusp   0x10000        /* ColdFire USP instructions.  */
 191
 192#define mcf5200  0x20000
 193#define mcf5206e 0x40000
 194#define mcf521x  0x80000
 195#define mcf5249  0x100000
 196#define mcf528x  0x200000
 197#define mcf5307  0x400000
 198#define mcf5407  0x800000
 199#define mcf5470  0x1000000
 200#define mcf5480  0x2000000
 201
 202 /* Handy aliases.  */
 203#define m68040up   (m68040 | m68060)
 204#define m68030up   (m68030 | m68040up)
 205#define m68020up   (m68020 | m68030up)
 206#define m68010up   (m68010 | cpu32 | m68020up)
 207#define m68000up   (m68000 | m68010up)
 208
 209#define mfloat  (m68881 | m68882 | m68040 | m68060)
 210#define mmmu    (m68851 | m68030 | m68040 | m68060)
 211
 212/* The structure used to hold information for an opcode.  */
 213
 214struct m68k_opcode
 215{
 216  /* The opcode name.  */
 217  const char *name;
 218  /* The pseudo-size of the instruction(in bytes).  Used to determine
 219     number of bytes necessary to disassemble the instruction.  */
 220  unsigned int size;
 221  /* The opcode itself.  */
 222  unsigned long opcode;
 223  /* The mask used by the disassembler.  */
 224  unsigned long match;
 225  /* The arguments.  */
 226  const char *args;
 227  /* The architectures which support this opcode.  */
 228  unsigned int arch;
 229};
 230
 231/* The structure used to hold information for an opcode alias.  */
 232
 233struct m68k_opcode_alias
 234{
 235  /* The alias name.  */
 236  const char *alias;
 237  /* The instruction for which this is an alias.  */
 238  const char *primary;
 239};
 240
 241/* We store four bytes of opcode for all opcodes because that is the
 242   most any of them need.  The actual length of an instruction is
 243   always at least 2 bytes, and is as much longer as necessary to hold
 244   the operands it has.
 245
 246   The match field is a mask saying which bits must match particular
 247   opcode in order for an instruction to be an instance of that
 248   opcode.
 249
 250   The args field is a string containing two characters for each
 251   operand of the instruction.  The first specifies the kind of
 252   operand; the second, the place it is stored.  */
 253
 254/* Kinds of operands:
 255   Characters used: AaBbCcDdEeFfGgHIiJkLlMmnOopQqRrSsTtU VvWwXxYyZz01234|*~%;@!&$?/<>#^+-
 256
 257   D  data register only.  Stored as 3 bits.
 258   A  address register only.  Stored as 3 bits.
 259   a  address register indirect only.  Stored as 3 bits.
 260   R  either kind of register.  Stored as 4 bits.
 261   r  either kind of register indirect only.  Stored as 4 bits.
 262      At the moment, used only for cas2 instruction.
 263   F  floating point coprocessor register only.   Stored as 3 bits.
 264   O  an offset (or width): immediate data 0-31 or data register.
 265      Stored as 6 bits in special format for BF... insns.
 266   +  autoincrement only.  Stored as 3 bits (number of the address register).
 267   -  autodecrement only.  Stored as 3 bits (number of the address register).
 268   Q  quick immediate data.  Stored as 3 bits.
 269      This matches an immediate operand only when value is in range 1 .. 8.
 270   M  moveq immediate data.  Stored as 8 bits.
 271      This matches an immediate operand only when value is in range -128..127
 272   T  trap vector immediate data.  Stored as 4 bits.
 273
 274   k  K-factor for fmove.p instruction.   Stored as a 7-bit constant or
 275      a three bit register offset, depending on the field type.
 276
 277   #  immediate data.  Stored in special places (b, w or l)
 278      which say how many bits to store.
 279   ^  immediate data for floating point instructions.   Special places
 280      are offset by 2 bytes from '#'...
 281   B  pc-relative address, converted to an offset
 282      that is treated as immediate data.
 283   d  displacement and register.  Stores the register as 3 bits
 284      and stores the displacement in the entire second word.
 285
 286   C  the CCR.  No need to store it; this is just for filtering validity.
 287   S  the SR.  No need to store, just as with CCR.
 288   U  the USP.  No need to store, just as with CCR.
 289   E  the MAC ACC.  No need to store, just as with CCR.
 290   e  the EMAC ACC[0123].
 291   G  the MAC/EMAC MACSR.  No need to store, just as with CCR.
 292   g  the EMAC ACCEXT{01,23}.
 293   H  the MASK.  No need to store, just as with CCR.
 294   i  the MAC/EMAC scale factor.
 295
 296   I  Coprocessor ID.   Not printed if 1.   The Coprocessor ID is always
 297      extracted from the 'd' field of word one, which means that an extended
 298      coprocessor opcode can be skipped using the 'i' place, if needed.
 299
 300   s  System Control register for the floating point coprocessor.
 301
 302   J  Misc register for movec instruction, stored in 'j' format.
 303        Possible values:
 304        0x000   SFC     Source Function Code reg        [60, 40, 30, 20, 10]
 305        0x001   DFC     Data Function Code reg          [60, 40, 30, 20, 10]
 306        0x002   CACR    Cache Control Register          [60, 40, 30, 20, mcf]
 307        0x003   TC      MMU Translation Control         [60, 40]
 308        0x004   ITT0    Instruction Transparent
 309                                Translation reg 0       [60, 40]
 310        0x005   ITT1    Instruction Transparent
 311                                Translation reg 1       [60, 40]
 312        0x006   DTT0    Data Transparent
 313                                Translation reg 0       [60, 40]
 314        0x007   DTT1    Data Transparent
 315                                Translation reg 1       [60, 40]
 316        0x008   BUSCR   Bus Control Register            [60]
 317        0x800   USP     User Stack Pointer              [60, 40, 30, 20, 10]
 318        0x801   VBR     Vector Base reg                 [60, 40, 30, 20, 10, mcf]
 319        0x802   CAAR    Cache Address Register          [        30, 20]
 320        0x803   MSP     Master Stack Pointer            [    40, 30, 20]
 321        0x804   ISP     Interrupt Stack Pointer         [    40, 30, 20]
 322        0x805   MMUSR   MMU Status reg                  [    40]
 323        0x806   URP     User Root Pointer               [60, 40]
 324        0x807   SRP     Supervisor Root Pointer         [60, 40]
 325        0x808   PCR     Processor Configuration reg     [60]
 326        0xC00   ROMBAR  ROM Base Address Register       [520X]
 327        0xC04   RAMBAR0 RAM Base Address Register 0     [520X]
 328        0xC05   RAMBAR1 RAM Base Address Register 0     [520X]
 329        0xC0F   MBAR0   RAM Base Address Register 0     [520X]
 330        0xC04   FLASHBAR FLASH Base Address Register    [mcf528x]
 331        0xC05   RAMBAR  Static RAM Base Address Register [mcf528x]
 332
 333    L  Register list of the type d0-d7/a0-a7 etc.
 334       (New!  Improved!  Can also hold fp0-fp7, as well!)
 335       The assembler tries to see if the registers match the insn by
 336       looking at where the insn wants them stored.
 337
 338    l  Register list like L, but with all the bits reversed.
 339       Used for going the other way. . .
 340
 341    c  cache identifier which may be "nc" for no cache, "ic"
 342       for instruction cache, "dc" for data cache, or "bc"
 343       for both caches.  Used in cinv and cpush.  Always
 344       stored in position "d".
 345
 346    u  Any register, with ``upper'' or ``lower'' specification.  Used
 347       in the mac instructions with size word.
 348
 349 The remainder are all stored as 6 bits using an address mode and a
 350 register number; they differ in which addressing modes they match.
 351
 352   *  all                                       (modes 0-6,7.0-4)
 353   ~  alterable memory                          (modes 2-6,7.0,7.1)
 354                                                (not 0,1,7.2-4)
 355   %  alterable                                 (modes 0-6,7.0,7.1)
 356                                                (not 7.2-4)
 357   ;  data                                      (modes 0,2-6,7.0-4)
 358                                                (not 1)
 359   @  data, but not immediate                   (modes 0,2-6,7.0-3)
 360                                                (not 1,7.4)
 361   !  control                                   (modes 2,5,6,7.0-3)
 362                                                (not 0,1,3,4,7.4)
 363   &  alterable control                         (modes 2,5,6,7.0,7.1)
 364                                                (not 0,1,3,4,7.2-4)
 365   $  alterable data                            (modes 0,2-6,7.0,7.1)
 366                                                (not 1,7.2-4)
 367   ?  alterable control, or data register       (modes 0,2,5,6,7.0,7.1)
 368                                                (not 1,3,4,7.2-4)
 369   /  control, or data register                 (modes 0,2,5,6,7.0-3)
 370                                                (not 1,3,4,7.4)
 371   >  *save operands                            (modes 2,4,5,6,7.0,7.1)
 372                                                (not 0,1,3,7.2-4)
 373   <  *restore operands                         (modes 2,3,5,6,7.0-3)
 374                                                (not 0,1,4,7.4)
 375
 376   coldfire move operands:
 377   m                                            (modes 0-4)
 378   n                                            (modes 5,7.2)
 379   o                                            (modes 6,7.0,7.1,7.3,7.4)
 380   p                                            (modes 0-5)
 381
 382   coldfire bset/bclr/btst/mulsl/mulul operands:
 383   q                                            (modes 0,2-5)
 384   v                                            (modes 0,2-5,7.0,7.1)
 385   b                                            (modes 0,2-5,7.2)
 386   w                                            (modes 2-5,7.2)
 387   y                                            (modes 2,5)
 388   z                                            (modes 2,5,7.2)
 389   x  mov3q immediate operand.
 390   4                                            (modes 2,3,4,5)
 391  */
 392
 393/* For the 68851:  */
 394/* I didn't use much imagination in choosing the
 395   following codes, so many of them aren't very
 396   mnemonic. -rab
 397
 398   0  32 bit pmmu register
 399        Possible values:
 400        000     TC      Translation Control Register (68030, 68851)
 401
 402   1  16 bit pmmu register
 403        111     AC      Access Control (68851)
 404
 405   2  8 bit pmmu register
 406        100     CAL     Current Access Level (68851)
 407        101     VAL     Validate Access Level (68851)
 408        110     SCC     Stack Change Control (68851)
 409
 410   3  68030-only pmmu registers (32 bit)
 411        010     TT0     Transparent Translation reg 0
 412                        (aka Access Control reg 0 -- AC0 -- on 68ec030)
 413        011     TT1     Transparent Translation reg 1
 414                        (aka Access Control reg 1 -- AC1 -- on 68ec030)
 415
 416   W  wide pmmu registers
 417        Possible values:
 418        001     DRP     Dma Root Pointer (68851)
 419        010     SRP     Supervisor Root Pointer (68030, 68851)
 420        011     CRP     Cpu Root Pointer (68030, 68851)
 421
 422   f    function code register (68030, 68851)
 423        0       SFC
 424        1       DFC
 425
 426   V    VAL register only (68851)
 427
 428   X    BADx, BACx (16 bit)
 429        100     BAD     Breakpoint Acknowledge Data (68851)
 430        101     BAC     Breakpoint Acknowledge Control (68851)
 431
 432   Y    PSR (68851) (MMUSR on 68030) (ACUSR on 68ec030)
 433   Z    PCSR (68851)
 434
 435   |    memory          (modes 2-6, 7.*)
 436
 437   t  address test level (68030 only)
 438      Stored as 3 bits, range 0-7.
 439      Also used for breakpoint instruction now.
 440
 441*/
 442
 443/* Places to put an operand, for non-general operands:
 444   Characters used: BbCcDdFfGgHhIijkLlMmNnostWw123456789/
 445
 446   s  source, low bits of first word.
 447   d  dest, shifted 9 in first word
 448   1  second word, shifted 12
 449   2  second word, shifted 6
 450   3  second word, shifted 0
 451   4  third word, shifted 12
 452   5  third word, shifted 6
 453   6  third word, shifted 0
 454   7  second word, shifted 7
 455   8  second word, shifted 10
 456   9  second word, shifted 5
 457   D  store in both place 1 and place 3; for divul and divsl.
 458   B  first word, low byte, for branch displacements
 459   W  second word (entire), for branch displacements
 460   L  second and third words (entire), for branch displacements
 461      (also overloaded for move16)
 462   b  second word, low byte
 463   w  second word (entire) [variable word/long branch offset for dbra]
 464   W  second word (entire) (must be signed 16 bit value)
 465   l  second and third word (entire)
 466   g  variable branch offset for bra and similar instructions.
 467      The place to store depends on the magnitude of offset.
 468   t  store in both place 7 and place 8; for floating point operations
 469   c  branch offset for cpBcc operations.
 470      The place to store is word two if bit six of word one is zero,
 471      and words two and three if bit six of word one is one.
 472   i  Increment by two, to skip over coprocessor extended operands.   Only
 473      works with the 'I' format.
 474   k  Dynamic K-factor field.   Bits 6-4 of word 2, used as a register number.
 475      Also used for dynamic fmovem instruction.
 476   C  floating point coprocessor constant - 7 bits.  Also used for static
 477      K-factors...
 478   j  Movec register #, stored in 12 low bits of second word.
 479   m  For M[S]ACx; 4 bits split with MSB shifted 6 bits in first word
 480      and remaining 3 bits of register shifted 9 bits in first word.
 481      Indicate upper/lower in 1 bit shifted 7 bits in second word.
 482      Use with `R' or `u' format.
 483   n  `m' withouth upper/lower indication. (For M[S]ACx; 4 bits split
 484      with MSB shifted 6 bits in first word and remaining 3 bits of
 485      register shifted 9 bits in first word.  No upper/lower
 486      indication is done.)  Use with `R' or `u' format.
 487   o  For M[S]ACw; 4 bits shifted 12 in second word (like `1').
 488      Indicate upper/lower in 1 bit shifted 7 bits in second word.
 489      Use with `R' or `u' format.
 490   M  For M[S]ACw; 4 bits in low bits of first word.  Indicate
 491      upper/lower in 1 bit shifted 6 bits in second word.  Use with
 492      `R' or `u' format.
 493   N  For M[S]ACw; 4 bits in low bits of second word.  Indicate
 494      upper/lower in 1 bit shifted 6 bits in second word.  Use with
 495      `R' or `u' format.
 496   h  shift indicator (scale factor), 1 bit shifted 10 in second word
 497
 498 Places to put operand, for general operands:
 499   d  destination, shifted 6 bits in first word
 500   b  source, at low bit of first word, and immediate uses one byte
 501   w  source, at low bit of first word, and immediate uses two bytes
 502   l  source, at low bit of first word, and immediate uses four bytes
 503   s  source, at low bit of first word.
 504      Used sometimes in contexts where immediate is not allowed anyway.
 505   f  single precision float, low bit of 1st word, immediate uses 4 bytes
 506   F  double precision float, low bit of 1st word, immediate uses 8 bytes
 507   x  extended precision float, low bit of 1st word, immediate uses 12 bytes
 508   p  packed float, low bit of 1st word, immediate uses 12 bytes
 509   G  EMAC accumulator, load  (bit 4 2nd word, !bit8 first word)
 510   H  EMAC accumulator, non load  (bit 4 2nd word, bit 8 first word)
 511   F  EMAC ACCx
 512   f  EMAC ACCy
 513   I  MAC/EMAC scale factor
 514   /  Like 's', but set 2nd word, bit 5 if trailing_ampersand set
 515   ]  first word, bit 10
 516*/
 517
 518extern const struct m68k_opcode m68k_opcodes[];
 519extern const struct m68k_opcode_alias m68k_opcode_aliases[];
 520
 521extern const int m68k_numopcodes, m68k_numaliases;
 522
 523/* **** End of m68k-opcode.h */
 524/* **** m68k-dis.c from sourceware.org CVS 2005-08-14.  */
 525/* Print Motorola 68k instructions.
 526   Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
 527   1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
 528   Free Software Foundation, Inc.
 529
 530   This file is free software; you can redistribute it and/or modify
 531   it under the terms of the GNU General Public License as published by
 532   the Free Software Foundation; either version 2 of the License, or
 533   (at your option) any later version.
 534
 535   This program is distributed in the hope that it will be useful,
 536   but WITHOUT ANY WARRANTY; without even the implied warranty of
 537   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 538   GNU General Public License for more details.
 539
 540   You should have received a copy of the GNU General Public License
 541   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
 542
 543/* Local function prototypes.  */
 544
 545static const char * const fpcr_names[] =
 546{
 547  "", "%fpiar", "%fpsr", "%fpiar/%fpsr", "%fpcr",
 548  "%fpiar/%fpcr", "%fpsr/%fpcr", "%fpiar/%fpsr/%fpcr"
 549};
 550
 551static const char *const reg_names[] =
 552{
 553  "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
 554  "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp",
 555  "%ps", "%pc"
 556};
 557
 558/* Name of register halves for MAC/EMAC.
 559   Separate from reg_names since 'spu', 'fpl' look weird.  */
 560static const char *const reg_half_names[] =
 561{
 562  "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
 563  "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7",
 564  "%ps", "%pc"
 565};
 566
 567/* Sign-extend an (unsigned char).  */
 568#if __STDC__ == 1
 569#define COERCE_SIGNED_CHAR(ch) ((signed char) (ch))
 570#else
 571#define COERCE_SIGNED_CHAR(ch) ((int) (((ch) ^ 0x80) & 0xFF) - 128)
 572#endif
 573
 574/* Get a 1 byte signed integer.  */
 575#define NEXTBYTE(p)  (p += 2, FETCH_DATA (info, p), COERCE_SIGNED_CHAR(p[-1]))
 576
 577/* Get a 2 byte signed integer.  */
 578#define COERCE16(x) ((int) (((x) ^ 0x8000) - 0x8000))
 579#define NEXTWORD(p)  \
 580  (p += 2, FETCH_DATA (info, p), \
 581   COERCE16 ((p[-2] << 8) + p[-1]))
 582
 583/* Get a 4 byte signed integer.  */
 584#define COERCE32(x) ((bfd_signed_vma) ((x) ^ 0x80000000) - 0x80000000)
 585#define NEXTLONG(p)  \
 586  (p += 4, FETCH_DATA (info, p), \
 587   (COERCE32 ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1])))
 588
 589/* Get a 4 byte unsigned integer.  */
 590#define NEXTULONG(p)  \
 591  (p += 4, FETCH_DATA (info, p), \
 592   (unsigned int) ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]))
 593
 594/* Get a single precision float.  */
 595#define NEXTSINGLE(val, p) \
 596  (p += 4, FETCH_DATA (info, p), \
 597   floatformat_to_double (&floatformat_ieee_single_big, (char *) p - 4, &val))
 598
 599/* Get a double precision float.  */
 600#define NEXTDOUBLE(val, p) \
 601  (p += 8, FETCH_DATA (info, p), \
 602   floatformat_to_double (&floatformat_ieee_double_big, (char *) p - 8, &val))
 603
 604/* Get an extended precision float.  */
 605#define NEXTEXTEND(val, p) \
 606  (p += 12, FETCH_DATA (info, p), \
 607   floatformat_to_double (&floatformat_m68881_ext, (char *) p - 12, &val))
 608
 609/* Need a function to convert from packed to double
 610   precision.   Actually, it's easier to print a
 611   packed number than a double anyway, so maybe
 612   there should be a special case to handle this... */
 613#define NEXTPACKED(p) \
 614  (p += 12, FETCH_DATA (info, p), 0.0)
 615
 616/* Maximum length of an instruction.  */
 617#define MAXLEN 22
 618
 619#include <setjmp.h>
 620
 621struct private
 622{
 623  /* Points to first byte not fetched.  */
 624  bfd_byte *max_fetched;
 625  bfd_byte the_buffer[MAXLEN];
 626  bfd_vma insn_start;
 627  jmp_buf bailout;
 628};
 629
 630/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
 631   to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
 632   on error.  */
 633#define FETCH_DATA(info, addr) \
 634  ((addr) <= ((struct private *) (info->private_data))->max_fetched \
 635   ? 1 : fetch_data ((info), (addr)))
 636
 637static int
 638fetch_data (struct disassemble_info *info, bfd_byte *addr)
 639{
 640  int status;
 641  struct private *priv = (struct private *)info->private_data;
 642  bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
 643
 644  status = (*info->read_memory_func) (start,
 645                                      priv->max_fetched,
 646                                      addr - priv->max_fetched,
 647                                      info);
 648  if (status != 0)
 649    {
 650      (*info->memory_error_func) (status, start, info);
 651      longjmp (priv->bailout, 1);
 652    }
 653  else
 654    priv->max_fetched = addr;
 655  return 1;
 656}
 657
 658/* This function is used to print to the bit-bucket.  */
 659static int
 660dummy_printer (FILE *file ATTRIBUTE_UNUSED,
 661               const char *format ATTRIBUTE_UNUSED,
 662               ...)
 663{
 664  return 0;
 665}
 666
 667static void
 668dummy_print_address (bfd_vma vma ATTRIBUTE_UNUSED,
 669                     struct disassemble_info *info ATTRIBUTE_UNUSED)
 670{
 671}
 672
 673/* Fetch BITS bits from a position in the instruction specified by CODE.
 674   CODE is a "place to put an argument", or 'x' for a destination
 675   that is a general address (mode and register).
 676   BUFFER contains the instruction.  */
 677
 678static int
 679fetch_arg (unsigned char *buffer,
 680           int code,
 681           int bits,
 682           disassemble_info *info)
 683{
 684  int val = 0;
 685
 686  switch (code)
 687    {
 688    case '/': /* MAC/EMAC mask bit.  */
 689      val = buffer[3] >> 5;
 690      break;
 691
 692    case 'G': /* EMAC ACC load.  */
 693      val = ((buffer[3] >> 3) & 0x2) | ((~buffer[1] >> 7) & 0x1);
 694      break;
 695
 696    case 'H': /* EMAC ACC !load.  */
 697      val = ((buffer[3] >> 3) & 0x2) | ((buffer[1] >> 7) & 0x1);
 698      break;
 699
 700    case ']': /* EMAC ACCEXT bit.  */
 701      val = buffer[0] >> 2;
 702      break;
 703
 704    case 'I': /* MAC/EMAC scale factor.  */
 705      val = buffer[2] >> 1;
 706      break;
 707
 708    case 'F': /* EMAC ACCx.  */
 709      val = buffer[0] >> 1;
 710      break;
 711
 712    case 'f':
 713      val = buffer[1];
 714      break;
 715
 716    case 's':
 717      val = buffer[1];
 718      break;
 719
 720    case 'd':                   /* Destination, for register or quick.  */
 721      val = (buffer[0] << 8) + buffer[1];
 722      val >>= 9;
 723      break;
 724
 725    case 'x':                   /* Destination, for general arg.  */
 726      val = (buffer[0] << 8) + buffer[1];
 727      val >>= 6;
 728      break;
 729
 730    case 'k':
 731      FETCH_DATA (info, buffer + 3);
 732      val = (buffer[3] >> 4);
 733      break;
 734
 735    case 'C':
 736      FETCH_DATA (info, buffer + 3);
 737      val = buffer[3];
 738      break;
 739
 740    case '1':
 741      FETCH_DATA (info, buffer + 3);
 742      val = (buffer[2] << 8) + buffer[3];
 743      val >>= 12;
 744      break;
 745
 746    case '2':
 747      FETCH_DATA (info, buffer + 3);
 748      val = (buffer[2] << 8) + buffer[3];
 749      val >>= 6;
 750      break;
 751
 752    case '3':
 753    case 'j':
 754      FETCH_DATA (info, buffer + 3);
 755      val = (buffer[2] << 8) + buffer[3];
 756      break;
 757
 758    case '4':
 759      FETCH_DATA (info, buffer + 5);
 760      val = (buffer[4] << 8) + buffer[5];
 761      val >>= 12;
 762      break;
 763
 764    case '5':
 765      FETCH_DATA (info, buffer + 5);
 766      val = (buffer[4] << 8) + buffer[5];
 767      val >>= 6;
 768      break;
 769
 770    case '6':
 771      FETCH_DATA (info, buffer + 5);
 772      val = (buffer[4] << 8) + buffer[5];
 773      break;
 774
 775    case '7':
 776      FETCH_DATA (info, buffer + 3);
 777      val = (buffer[2] << 8) + buffer[3];
 778      val >>= 7;
 779      break;
 780
 781    case '8':
 782      FETCH_DATA (info, buffer + 3);
 783      val = (buffer[2] << 8) + buffer[3];
 784      val >>= 10;
 785      break;
 786
 787    case '9':
 788      FETCH_DATA (info, buffer + 3);
 789      val = (buffer[2] << 8) + buffer[3];
 790      val >>= 5;
 791      break;
 792
 793    case 'e':
 794      val = (buffer[1] >> 6);
 795      break;
 796
 797    case 'm':
 798      val = (buffer[1] & 0x40 ? 0x8 : 0)
 799        | ((buffer[0] >> 1) & 0x7)
 800        | (buffer[3] & 0x80 ? 0x10 : 0);
 801      break;
 802
 803    case 'n':
 804      val = (buffer[1] & 0x40 ? 0x8 : 0) | ((buffer[0] >> 1) & 0x7);
 805      break;
 806
 807    case 'o':
 808      val = (buffer[2] >> 4) | (buffer[3] & 0x80 ? 0x10 : 0);
 809      break;
 810
 811    case 'M':
 812      val = (buffer[1] & 0xf) | (buffer[3] & 0x40 ? 0x10 : 0);
 813      break;
 814
 815    case 'N':
 816      val = (buffer[3] & 0xf) | (buffer[3] & 0x40 ? 0x10 : 0);
 817      break;
 818
 819    case 'h':
 820      val = buffer[2] >> 2;
 821      break;
 822
 823    default:
 824      abort ();
 825    }
 826
 827  switch (bits)
 828    {
 829    case 1:
 830      return val & 1;
 831    case 2:
 832      return val & 3;
 833    case 3:
 834      return val & 7;
 835    case 4:
 836      return val & 017;
 837    case 5:
 838      return val & 037;
 839    case 6:
 840      return val & 077;
 841    case 7:
 842      return val & 0177;
 843    case 8:
 844      return val & 0377;
 845    case 12:
 846      return val & 07777;
 847    default:
 848      abort ();
 849    }
 850}
 851
 852/* Check if an EA is valid for a particular code.  This is required
 853   for the EMAC instructions since the type of source address determines
 854   if it is a EMAC-load instruciton if the EA is mode 2-5, otherwise it
 855   is a non-load EMAC instruction and the bits mean register Ry.
 856   A similar case exists for the movem instructions where the register
 857   mask is interpreted differently for different EAs.  */
 858
 859static bfd_boolean
 860m68k_valid_ea (char code, int val)
 861{
 862  int mode, mask;
 863#define M(n0,n1,n2,n3,n4,n5,n6,n70,n71,n72,n73,n74) \
 864  (n0 | n1 << 1 | n2 << 2 | n3 << 3 | n4 << 4 | n5 << 5 | n6 << 6 \
 865   | n70 << 7 | n71 << 8 | n72 << 9 | n73 << 10 | n74 << 11)
 866
 867  switch (code)
 868    {
 869    case '*':
 870      mask = M (1,1,1,1,1,1,1,1,1,1,1,1);
 871      break;
 872    case '~':
 873      mask = M (0,0,1,1,1,1,1,1,1,0,0,0);
 874      break;
 875    case '%':
 876      mask = M (1,1,1,1,1,1,1,1,1,0,0,0);
 877      break;
 878    case ';':
 879      mask = M (1,0,1,1,1,1,1,1,1,1,1,1);
 880      break;
 881    case '@':
 882      mask = M (1,0,1,1,1,1,1,1,1,1,1,0);
 883      break;
 884    case '!':
 885      mask = M (0,0,1,0,0,1,1,1,1,1,1,0);
 886      break;
 887    case '&':
 888      mask = M (0,0,1,0,0,1,1,1,1,0,0,0);
 889      break;
 890    case '$':
 891      mask = M (1,0,1,1,1,1,1,1,1,0,0,0);
 892      break;
 893    case '?':
 894      mask = M (1,0,1,0,0,1,1,1,1,0,0,0);
 895      break;
 896    case '/':
 897      mask = M (1,0,1,0,0,1,1,1,1,1,1,0);
 898      break;
 899    case '|':
 900      mask = M (0,0,1,0,0,1,1,1,1,1,1,0);
 901      break;
 902    case '>':
 903      mask = M (0,0,1,0,1,1,1,1,1,0,0,0);
 904      break;
 905    case '<':
 906      mask = M (0,0,1,1,0,1,1,1,1,1,1,0);
 907      break;
 908    case 'm':
 909      mask = M (1,1,1,1,1,0,0,0,0,0,0,0);
 910      break;
 911    case 'n':
 912      mask = M (0,0,0,0,0,1,0,0,0,1,0,0);
 913      break;
 914    case 'o':
 915      mask = M (0,0,0,0,0,0,1,1,1,0,1,1);
 916      break;
 917    case 'p':
 918      mask = M (1,1,1,1,1,1,0,0,0,0,0,0);
 919      break;
 920    case 'q':
 921      mask = M (1,0,1,1,1,1,0,0,0,0,0,0);
 922      break;
 923    case 'v':
 924      mask = M (1,0,1,1,1,1,0,1,1,0,0,0);
 925      break;
 926    case 'b':
 927      mask = M (1,0,1,1,1,1,0,0,0,1,0,0);
 928      break;
 929    case 'w':
 930      mask = M (0,0,1,1,1,1,0,0,0,1,0,0);
 931      break;
 932    case 'y':
 933      mask = M (0,0,1,0,0,1,0,0,0,0,0,0);
 934      break;
 935    case 'z':
 936      mask = M (0,0,1,0,0,1,0,0,0,1,0,0);
 937      break;
 938    case '4':
 939      mask = M (0,0,1,1,1,1,0,0,0,0,0,0);
 940      break;
 941    default:
 942      abort ();
 943    }
 944#undef M
 945
 946  mode = (val >> 3) & 7;
 947  if (mode == 7)
 948    mode += val & 7;
 949  return (mask & (1 << mode)) != 0;
 950}
 951
 952/* Print a base register REGNO and displacement DISP, on INFO->STREAM.
 953   REGNO = -1 for pc, -2 for none (suppressed).  */
 954
 955static void
 956print_base (int regno, bfd_vma disp, disassemble_info *info)
 957{
 958  if (regno == -1)
 959    {
 960      (*info->fprintf_func) (info->stream, "%%pc@(");
 961      (*info->print_address_func) (disp, info);
 962    }
 963  else
 964    {
 965      char buf[50];
 966
 967      if (regno == -2)
 968        (*info->fprintf_func) (info->stream, "@(");
 969      else if (regno == -3)
 970        (*info->fprintf_func) (info->stream, "%%zpc@(");
 971      else
 972        (*info->fprintf_func) (info->stream, "%s@(", reg_names[regno]);
 973
 974      sprintf_vma (buf, disp);
 975      (*info->fprintf_func) (info->stream, "%s", buf);
 976    }
 977}
 978
 979/* Print an indexed argument.  The base register is BASEREG (-1 for pc).
 980   P points to extension word, in buffer.
 981   ADDR is the nominal core address of that extension word.  */
 982
 983static unsigned char *
 984print_indexed (int basereg,
 985               unsigned char *p,
 986               bfd_vma addr,
 987               disassemble_info *info)
 988{
 989  int word;
 990  static const char *const scales[] = { "", ":2", ":4", ":8" };
 991  bfd_vma base_disp;
 992  bfd_vma outer_disp;
 993  char buf[40];
 994  char vmabuf[50];
 995
 996  word = NEXTWORD (p);
 997
 998  /* Generate the text for the index register.
 999     Where this will be output is not yet determined.  */
1000  sprintf (buf, "%s:%c%s",
1001           reg_names[(word >> 12) & 0xf],
1002           (word & 0x800) ? 'l' : 'w',
1003           scales[(word >> 9) & 3]);
1004
1005  /* Handle the 68000 style of indexing.  */
1006
1007  if ((word & 0x100) == 0)
1008    {
1009      base_disp = word & 0xff;
1010      if ((base_disp & 0x80) != 0)
1011        base_disp -= 0x100;
1012      if (basereg == -1)
1013        base_disp += addr;
1014      print_base (basereg, base_disp, info);
1015      (*info->fprintf_func) (info->stream, ",%s)", buf);
1016      return p;
1017    }
1018
1019  /* Handle the generalized kind.  */
1020  /* First, compute the displacement to add to the base register.  */
1021  if (word & 0200)
1022    {
1023      if (basereg == -1)
1024        basereg = -3;
1025      else
1026        basereg = -2;
1027    }
1028  if (word & 0100)
1029    buf[0] = '\0';
1030  base_disp = 0;
1031  switch ((word >> 4) & 3)
1032    {
1033    case 2:
1034      base_disp = NEXTWORD (p);
1035      break;
1036    case 3:
1037      base_disp = NEXTLONG (p);
1038    }
1039  if (basereg == -1)
1040    base_disp += addr;
1041
1042  /* Handle single-level case (not indirect).  */
1043  if ((word & 7) == 0)
1044    {
1045      print_base (basereg, base_disp, info);
1046      if (buf[0] != '\0')
1047        (*info->fprintf_func) (info->stream, ",%s", buf);
1048      (*info->fprintf_func) (info->stream, ")");
1049      return p;
1050    }
1051
1052  /* Two level.  Compute displacement to add after indirection.  */
1053  outer_disp = 0;
1054  switch (word & 3)
1055    {
1056    case 2:
1057      outer_disp = NEXTWORD (p);
1058      break;
1059    case 3:
1060      outer_disp = NEXTLONG (p);
1061    }
1062
1063  print_base (basereg, base_disp, info);
1064  if ((word & 4) == 0 && buf[0] != '\0')
1065    {
1066      (*info->fprintf_func) (info->stream, ",%s", buf);
1067      buf[0] = '\0';
1068    }
1069  sprintf_vma (vmabuf, outer_disp);
1070  (*info->fprintf_func) (info->stream, ")@(%s", vmabuf);
1071  if (buf[0] != '\0')
1072    (*info->fprintf_func) (info->stream, ",%s", buf);
1073  (*info->fprintf_func) (info->stream, ")");
1074
1075  return p;
1076}
1077
1078/* Returns number of bytes "eaten" by the operand, or
1079   return -1 if an invalid operand was found, or -2 if
1080   an opcode tabe error was found.
1081   ADDR is the pc for this arg to be relative to.  */
1082
1083static int
1084print_insn_arg (const char *d,
1085                unsigned char *buffer,
1086                unsigned char *p0,
1087                bfd_vma addr,
1088                disassemble_info *info)
1089{
1090  int val = 0;
1091  int place = d[1];
1092  unsigned char *p = p0;
1093  int regno;
1094  const char *regname;
1095  unsigned char *p1;
1096  double flval;
1097  int flt_p;
1098  bfd_signed_vma disp;
1099  unsigned int uval;
1100
1101  switch (*d)
1102    {
1103    case 'c':           /* Cache identifier.  */
1104      {
1105        static const char *const cacheFieldName[] = { "nc", "dc", "ic", "bc" };
1106        val = fetch_arg (buffer, place, 2, info);
1107        (*info->fprintf_func) (info->stream, cacheFieldName[val]);
1108        break;
1109      }
1110
1111    case 'a':           /* Address register indirect only. Cf. case '+'.  */
1112      {
1113        (*info->fprintf_func)
1114          (info->stream,
1115           "%s@",
1116           reg_names[fetch_arg (buffer, place, 3, info) + 8]);
1117        break;
1118      }
1119
1120    case '_':           /* 32-bit absolute address for move16.  */
1121      {
1122        uval = NEXTULONG (p);
1123        (*info->print_address_func) (uval, info);
1124        break;
1125      }
1126
1127    case 'C':
1128      (*info->fprintf_func) (info->stream, "%%ccr");
1129      break;
1130
1131    case 'S':
1132      (*info->fprintf_func) (info->stream, "%%sr");
1133      break;
1134
1135    case 'U':
1136      (*info->fprintf_func) (info->stream, "%%usp");
1137      break;
1138
1139    case 'E':
1140      (*info->fprintf_func) (info->stream, "%%acc");
1141      break;
1142
1143    case 'G':
1144      (*info->fprintf_func) (info->stream, "%%macsr");
1145      break;
1146
1147    case 'H':
1148      (*info->fprintf_func) (info->stream, "%%mask");
1149      break;
1150
1151    case 'J':
1152      {
1153        /* FIXME: There's a problem here, different m68k processors call the
1154           same address different names. This table can't get it right
1155           because it doesn't know which processor it's disassembling for.  */
1156        static const struct { const char *name; int value; } names[]
1157          = {{"%sfc", 0x000}, {"%dfc", 0x001}, {"%cacr", 0x002},
1158             {"%tc",  0x003}, {"%itt0",0x004}, {"%itt1", 0x005},
1159             {"%dtt0",0x006}, {"%dtt1",0x007}, {"%buscr",0x008},
1160             {"%usp", 0x800}, {"%vbr", 0x801}, {"%caar", 0x802},
1161             {"%msp", 0x803}, {"%isp", 0x804},
1162             {"%flashbar", 0xc04}, {"%rambar", 0xc05}, /* mcf528x added these.  */
1163
1164             /* Should we be calling this psr like we do in case 'Y'?  */
1165             {"%mmusr",0x805},
1166
1167             {"%urp", 0x806}, {"%srp", 0x807}, {"%pcr", 0x808}};
1168
1169        val = fetch_arg (buffer, place, 12, info);
1170        for (regno = sizeof names / sizeof names[0] - 1; regno >= 0; regno--)
1171          if (names[regno].value == val)
1172            {
1173              (*info->fprintf_func) (info->stream, "%s", names[regno].name);
1174              break;
1175            }
1176        if (regno < 0)
1177          (*info->fprintf_func) (info->stream, "%d", val);
1178      }
1179      break;
1180
1181    case 'Q':
1182      val = fetch_arg (buffer, place, 3, info);
1183      /* 0 means 8, except for the bkpt instruction... */
1184      if (val == 0 && d[1] != 's')
1185        val = 8;
1186      (*info->fprintf_func) (info->stream, "#%d", val);
1187      break;
1188
1189    case 'x':
1190      val = fetch_arg (buffer, place, 3, info);
1191      /* 0 means -1.  */
1192      if (val == 0)
1193        val = -1;
1194      (*info->fprintf_func) (info->stream, "#%d", val);
1195      break;
1196
1197    case 'M':
1198      if (place == 'h')
1199        {
1200          static const char *const scalefactor_name[] = { "<<", ">>" };
1201          val = fetch_arg (buffer, place, 1, info);
1202          (*info->fprintf_func) (info->stream, scalefactor_name[val]);
1203        }
1204      else
1205        {
1206          val = fetch_arg (buffer, place, 8, info);
1207          if (val & 0x80)
1208            val = val - 0x100;
1209          (*info->fprintf_func) (info->stream, "#%d", val);
1210        }
1211      break;
1212
1213    case 'T':
1214      val = fetch_arg (buffer, place, 4, info);
1215      (*info->fprintf_func) (info->stream, "#%d", val);
1216      break;
1217
1218    case 'D':
1219      (*info->fprintf_func) (info->stream, "%s",
1220                             reg_names[fetch_arg (buffer, place, 3, info)]);
1221      break;
1222
1223    case 'A':
1224      (*info->fprintf_func)
1225        (info->stream, "%s",
1226         reg_names[fetch_arg (buffer, place, 3, info) + 010]);
1227      break;
1228
1229    case 'R':
1230      (*info->fprintf_func)
1231        (info->stream, "%s",
1232         reg_names[fetch_arg (buffer, place, 4, info)]);
1233      break;
1234
1235    case 'r':
1236      regno = fetch_arg (buffer, place, 4, info);
1237      if (regno > 7)
1238        (*info->fprintf_func) (info->stream, "%s@", reg_names[regno]);
1239      else
1240        (*info->fprintf_func) (info->stream, "@(%s)", reg_names[regno]);
1241      break;
1242
1243    case 'F':
1244      (*info->fprintf_func)
1245        (info->stream, "%%fp%d",
1246         fetch_arg (buffer, place, 3, info));
1247      break;
1248
1249    case 'O':
1250      val = fetch_arg (buffer, place, 6, info);
1251      if (val & 0x20)
1252        (*info->fprintf_func) (info->stream, "%s", reg_names[val & 7]);
1253      else
1254        (*info->fprintf_func) (info->stream, "%d", val);
1255      break;
1256
1257    case '+':
1258      (*info->fprintf_func)
1259        (info->stream, "%s@+",
1260         reg_names[fetch_arg (buffer, place, 3, info) + 8]);
1261      break;
1262
1263    case '-':
1264      (*info->fprintf_func)
1265        (info->stream, "%s@-",
1266         reg_names[fetch_arg (buffer, place, 3, info) + 8]);
1267      break;
1268
1269    case 'k':
1270      if (place == 'k')
1271        (*info->fprintf_func)
1272          (info->stream, "{%s}",
1273           reg_names[fetch_arg (buffer, place, 3, info)]);
1274      else if (place == 'C')
1275        {
1276          val = fetch_arg (buffer, place, 7, info);
1277          if (val > 63)         /* This is a signed constant.  */
1278            val -= 128;
1279          (*info->fprintf_func) (info->stream, "{#%d}", val);
1280        }
1281      else
1282        return -2;
1283      break;
1284
1285    case '#':
1286    case '^':
1287      p1 = buffer + (*d == '#' ? 2 : 4);
1288      if (place == 's')
1289        val = fetch_arg (buffer, place, 4, info);
1290      else if (place == 'C')
1291        val = fetch_arg (buffer, place, 7, info);
1292      else if (place == '8')
1293        val = fetch_arg (buffer, place, 3, info);
1294      else if (place == '3')
1295        val = fetch_arg (buffer, place, 8, info);
1296      else if (place == 'b')
1297        val = NEXTBYTE (p1);
1298      else if (place == 'w' || place == 'W')
1299        val = NEXTWORD (p1);
1300      else if (place == 'l')
1301        val = NEXTLONG (p1);
1302      else
1303        return -2;
1304      (*info->fprintf_func) (info->stream, "#%d", val);
1305      break;
1306
1307    case 'B':
1308      if (place == 'b')
1309        disp = NEXTBYTE (p);
1310      else if (place == 'B')
1311        disp = COERCE_SIGNED_CHAR (buffer[1]);
1312      else if (place == 'w' || place == 'W')
1313        disp = NEXTWORD (p);
1314      else if (place == 'l' || place == 'L' || place == 'C')
1315        disp = NEXTLONG (p);
1316      else if (place == 'g')
1317        {
1318          disp = NEXTBYTE (buffer);
1319          if (disp == 0)
1320            disp = NEXTWORD (p);
1321          else if (disp == -1)
1322            disp = NEXTLONG (p);
1323        }
1324      else if (place == 'c')
1325        {
1326          if (buffer[1] & 0x40)         /* If bit six is one, long offset.  */
1327            disp = NEXTLONG (p);
1328          else
1329            disp = NEXTWORD (p);
1330        }
1331      else
1332        return -2;
1333
1334      (*info->print_address_func) (addr + disp, info);
1335      break;
1336
1337    case 'd':
1338      val = NEXTWORD (p);
1339      (*info->fprintf_func)
1340        (info->stream, "%s@(%d)",
1341         reg_names[fetch_arg (buffer, place, 3, info) + 8], val);
1342      break;
1343
1344    case 's':
1345      (*info->fprintf_func) (info->stream, "%s",
1346                             fpcr_names[fetch_arg (buffer, place, 3, info)]);
1347      break;
1348
1349    case 'e':
1350      val = fetch_arg(buffer, place, 2, info);
1351      (*info->fprintf_func) (info->stream, "%%acc%d", val);
1352      break;
1353
1354    case 'g':
1355      val = fetch_arg(buffer, place, 1, info);
1356      (*info->fprintf_func) (info->stream, "%%accext%s", val==0 ? "01" : "23");
1357      break;
1358
1359    case 'i':
1360      val = fetch_arg(buffer, place, 2, info);
1361      if (val == 1)
1362        (*info->fprintf_func) (info->stream, "<<");
1363      else if (val == 3)
1364        (*info->fprintf_func) (info->stream, ">>");
1365      else
1366        return -1;
1367      break;
1368
1369    case 'I':
1370      /* Get coprocessor ID... */
1371      val = fetch_arg (buffer, 'd', 3, info);
1372
1373      if (val != 1)                             /* Unusual coprocessor ID?  */
1374        (*info->fprintf_func) (info->stream, "(cpid=%d) ", val);
1375      break;
1376
1377    case '4':
1378    case '*':
1379    case '~':
1380    case '%':
1381    case ';':
1382    case '@':
1383    case '!':
1384    case '$':
1385    case '?':
1386    case '/':
1387    case '&':
1388    case '|':
1389    case '<':
1390    case '>':
1391    case 'm':
1392    case 'n':
1393    case 'o':
1394    case 'p':
1395    case 'q':
1396    case 'v':
1397    case 'b':
1398    case 'w':
1399    case 'y':
1400    case 'z':
1401      if (place == 'd')
1402        {
1403          val = fetch_arg (buffer, 'x', 6, info);
1404          val = ((val & 7) << 3) + ((val >> 3) & 7);
1405        }
1406      else
1407        val = fetch_arg (buffer, 's', 6, info);
1408
1409      /* If the <ea> is invalid for *d, then reject this match.  */
1410      if (!m68k_valid_ea (*d, val))
1411        return -1;
1412
1413      /* Get register number assuming address register.  */
1414      regno = (val & 7) + 8;
1415      regname = reg_names[regno];
1416      switch (val >> 3)
1417        {
1418        case 0:
1419          (*info->fprintf_func) (info->stream, "%s", reg_names[val]);
1420          break;
1421
1422        case 1:
1423          (*info->fprintf_func) (info->stream, "%s", regname);
1424          break;
1425
1426        case 2:
1427          (*info->fprintf_func) (info->stream, "%s@", regname);
1428          break;
1429
1430        case 3:
1431          (*info->fprintf_func) (info->stream, "%s@+", regname);
1432          break;
1433
1434        case 4:
1435          (*info->fprintf_func) (info->stream, "%s@-", regname);
1436          break;
1437
1438        case 5:
1439          val = NEXTWORD (p);
1440          (*info->fprintf_func) (info->stream, "%s@(%d)", regname, val);
1441          break;
1442
1443        case 6:
1444          p = print_indexed (regno, p, addr, info);
1445          break;
1446
1447        case 7:
1448          switch (val & 7)
1449            {
1450            case 0:
1451              val = NEXTWORD (p);
1452              (*info->print_address_func) (val, info);
1453              break;
1454
1455            case 1:
1456              uval = NEXTULONG (p);
1457              (*info->print_address_func) (uval, info);
1458              break;
1459
1460            case 2:
1461              val = NEXTWORD (p);
1462              (*info->fprintf_func) (info->stream, "%%pc@(");
1463              (*info->print_address_func) (addr + val, info);
1464              (*info->fprintf_func) (info->stream, ")");
1465              break;
1466
1467            case 3:
1468              p = print_indexed (-1, p, addr, info);
1469              break;
1470
1471            case 4:
1472              flt_p = 1;        /* Assume it's a float... */
1473              switch (place)
1474              {
1475                case 'b':
1476                  val = NEXTBYTE (p);
1477                  flt_p = 0;
1478                  break;
1479
1480                case 'w':
1481                  val = NEXTWORD (p);
1482                  flt_p = 0;
1483                  break;
1484
1485                case 'l':
1486                  val = NEXTLONG (p);
1487                  flt_p = 0;
1488                  break;
1489
1490                case 'f':
1491                  NEXTSINGLE (flval, p);
1492                  break;
1493
1494                case 'F':
1495                  NEXTDOUBLE (flval, p);
1496                  break;
1497
1498                case 'x':
1499                  NEXTEXTEND (flval, p);
1500                  break;
1501
1502                case 'p':
1503                  flval = NEXTPACKED (p);
1504                  break;
1505
1506                default:
1507                  return -1;
1508              }
1509              if (flt_p)        /* Print a float? */
1510                (*info->fprintf_func) (info->stream, "#%g", flval);
1511              else
1512                (*info->fprintf_func) (info->stream, "#%d", val);
1513              break;
1514
1515            default:
1516              return -1;
1517            }
1518        }
1519
1520      /* If place is '/', then this is the case of the mask bit for
1521         mac/emac loads. Now that the arg has been printed, grab the
1522         mask bit and if set, add a '&' to the arg.  */
1523      if (place == '/')
1524        {
1525          val = fetch_arg (buffer, place, 1, info);
1526          if (val)
1527            info->fprintf_func (info->stream, "&");
1528        }
1529      break;
1530
1531    case 'L':
1532    case 'l':
1533        if (place == 'w')
1534          {
1535            char doneany;
1536            p1 = buffer + 2;
1537            val = NEXTWORD (p1);
1538            /* Move the pointer ahead if this point is farther ahead
1539               than the last.  */
1540            p = p1 > p ? p1 : p;
1541            if (val == 0)
1542              {
1543                (*info->fprintf_func) (info->stream, "#0");
1544                break;
1545              }
1546            if (*d == 'l')
1547              {
1548                int newval = 0;
1549
1550                for (regno = 0; regno < 16; ++regno)
1551                  if (val & (0x8000 >> regno))
1552                    newval |= 1 << regno;
1553                val = newval;
1554              }
1555            val &= 0xffff;
1556            doneany = 0;
1557            for (regno = 0; regno < 16; ++regno)
1558              if (val & (1 << regno))
1559                {
1560                  int first_regno;
1561
1562                  if (doneany)
1563                    (*info->fprintf_func) (info->stream, "/");
1564                  doneany = 1;
1565                  (*info->fprintf_func) (info->stream, "%s", reg_names[regno]);
1566                  first_regno = regno;
1567                  while (val & (1 << (regno + 1)))
1568                    ++regno;
1569                  if (regno > first_regno)
1570                    (*info->fprintf_func) (info->stream, "-%s",
1571                                           reg_names[regno]);
1572                }
1573          }
1574        else if (place == '3')
1575          {
1576            /* `fmovem' insn.  */
1577            char doneany;
1578            val = fetch_arg (buffer, place, 8, info);
1579            if (val == 0)
1580              {
1581                (*info->fprintf_func) (info->stream, "#0");
1582                break;
1583              }
1584            if (*d == 'l')
1585              {
1586                int newval = 0;
1587
1588                for (regno = 0; regno < 8; ++regno)
1589                  if (val & (0x80 >> regno))
1590                    newval |= 1 << regno;
1591                val = newval;
1592              }
1593            val &= 0xff;
1594            doneany = 0;
1595            for (regno = 0; regno < 8; ++regno)
1596              if (val & (1 << regno))
1597                {
1598                  int first_regno;
1599                  if (doneany)
1600                    (*info->fprintf_func) (info->stream, "/");
1601                  doneany = 1;
1602                  (*info->fprintf_func) (info->stream, "%%fp%d", regno);
1603                  first_regno = regno;
1604                  while (val & (1 << (regno + 1)))
1605                    ++regno;
1606                  if (regno > first_regno)
1607                    (*info->fprintf_func) (info->stream, "-%%fp%d", regno);
1608                }
1609          }
1610        else if (place == '8')
1611          {
1612            /* fmoveml for FP status registers.  */
1613            (*info->fprintf_func) (info->stream, "%s",
1614                                   fpcr_names[fetch_arg (buffer, place, 3,
1615                                                         info)]);
1616          }
1617        else
1618          return -2;
1619      break;
1620
1621    case 'X':
1622      place = '8';
1623    case 'Y':
1624    case 'Z':
1625    case 'W':
1626    case '0':
1627    case '1':
1628    case '2':
1629    case '3':
1630      {
1631        int val = fetch_arg (buffer, place, 5, info);
1632        const char *name = 0;
1633
1634        switch (val)
1635          {
1636          case 2: name = "%tt0"; break;
1637          case 3: name = "%tt1"; break;
1638          case 0x10: name = "%tc"; break;
1639          case 0x11: name = "%drp"; break;
1640          case 0x12: name = "%srp"; break;
1641          case 0x13: name = "%crp"; break;
1642          case 0x14: name = "%cal"; break;
1643          case 0x15: name = "%val"; break;
1644          case 0x16: name = "%scc"; break;
1645          case 0x17: name = "%ac"; break;
1646          case 0x18: name = "%psr"; break;
1647          case 0x19: name = "%pcsr"; break;
1648          case 0x1c:
1649          case 0x1d:
1650            {
1651              int break_reg = ((buffer[3] >> 2) & 7);
1652
1653              (*info->fprintf_func)
1654                (info->stream, val == 0x1c ? "%%bad%d" : "%%bac%d",
1655                 break_reg);
1656            }
1657            break;
1658          default:
1659            (*info->fprintf_func) (info->stream, "<mmu register %d>", val);
1660          }
1661        if (name)
1662          (*info->fprintf_func) (info->stream, "%s", name);
1663      }
1664      break;
1665
1666    case 'f':
1667      {
1668        int fc = fetch_arg (buffer, place, 5, info);
1669
1670        if (fc == 1)
1671          (*info->fprintf_func) (info->stream, "%%dfc");
1672        else if (fc == 0)
1673          (*info->fprintf_func) (info->stream, "%%sfc");
1674        else
1675          /* xgettext:c-format */
1676          (*info->fprintf_func) (info->stream, _("<function code %d>"), fc);
1677      }
1678      break;
1679
1680    case 'V':
1681      (*info->fprintf_func) (info->stream, "%%val");
1682      break;
1683
1684    case 't':
1685      {
1686        int level = fetch_arg (buffer, place, 3, info);
1687
1688        (*info->fprintf_func) (info->stream, "%d", level);
1689      }
1690      break;
1691
1692    case 'u':
1693      {
1694        short is_upper = 0;
1695        int reg = fetch_arg (buffer, place, 5, info);
1696
1697        if (reg & 0x10)
1698          {
1699            is_upper = 1;
1700            reg &= 0xf;
1701          }
1702        (*info->fprintf_func) (info->stream, "%s%s",
1703                               reg_half_names[reg],
1704                               is_upper ? "u" : "l");
1705      }
1706      break;
1707
1708    default:
1709      return -2;
1710    }
1711
1712  return p - p0;
1713}
1714
1715/* Try to match the current instruction to best and if so, return the
1716   number of bytes consumed from the instruction stream, else zero.  */
1717
1718static int
1719match_insn_m68k (bfd_vma memaddr,
1720                 disassemble_info * info,
1721                 const struct m68k_opcode * best,
1722                 struct private * priv)
1723{
1724  unsigned char *save_p;
1725  unsigned char *p;
1726  const char *d;
1727
1728  bfd_byte *buffer = priv->the_buffer;
1729  fprintf_ftype save_printer = info->fprintf_func;
1730  void (* save_print_address) (bfd_vma, struct disassemble_info *)
1731    = info->print_address_func;
1732
1733  /* Point at first word of argument data,
1734     and at descriptor for first argument.  */
1735  p = buffer + 2;
1736
1737  /* Figure out how long the fixed-size portion of the instruction is.
1738     The only place this is stored in the opcode table is
1739     in the arguments--look for arguments which specify fields in the 2nd
1740     or 3rd words of the instruction.  */
1741  for (d = best->args; *d; d += 2)
1742    {
1743      /* I don't think it is necessary to be checking d[0] here;
1744         I suspect all this could be moved to the case statement below.  */
1745      if (d[0] == '#')
1746        {
1747          if (d[1] == 'l' && p - buffer < 6)
1748            p = buffer + 6;
1749          else if (p - buffer < 4 && d[1] != 'C' && d[1] != '8')
1750            p = buffer + 4;
1751        }
1752
1753      if ((d[0] == 'L' || d[0] == 'l') && d[1] == 'w' && p - buffer < 4)
1754        p = buffer + 4;
1755
1756      switch (d[1])
1757        {
1758        case '1':
1759        case '2':
1760        case '3':
1761        case '7':
1762        case '8':
1763        case '9':
1764        case 'i':
1765          if (p - buffer < 4)
1766            p = buffer + 4;
1767          break;
1768        case '4':
1769        case '5':
1770        case '6':
1771          if (p - buffer < 6)
1772            p = buffer + 6;
1773          break;
1774        default:
1775          break;
1776        }
1777    }
1778
1779  /* pflusha is an exceptions.  It takes no arguments but is two words
1780     long.  Recognize it by looking at the lower 16 bits of the mask.  */
1781  if (p - buffer < 4 && (best->match & 0xFFFF) != 0)
1782    p = buffer + 4;
1783
1784  /* lpstop is another exception.  It takes a one word argument but is
1785     three words long.  */
1786  if (p - buffer < 6
1787      && (best->match & 0xffff) == 0xffff
1788      && best->args[0] == '#'
1789      && best->args[1] == 'w')
1790    {
1791      /* Copy the one word argument into the usual location for a one
1792         word argument, to simplify printing it.  We can get away with
1793         this because we know exactly what the second word is, and we
1794         aren't going to print anything based on it.  */
1795      p = buffer + 6;
1796      FETCH_DATA (info, p);
1797      buffer[2] = buffer[4];
1798      buffer[3] = buffer[5];
1799    }
1800
1801  FETCH_DATA (info, p);
1802
1803  d = best->args;
1804
1805  save_p = p;
1806  info->print_address_func = dummy_print_address;
1807  info->fprintf_func = (fprintf_ftype) dummy_printer;
1808
1809  /* We scan the operands twice.  The first time we don't print anything,
1810     but look for errors.  */
1811  for (; *d; d += 2)
1812    {
1813      int eaten = print_insn_arg (d, buffer, p, memaddr + (p - buffer), info);
1814
1815      if (eaten >= 0)
1816        p += eaten;
1817      else if (eaten == -1)
1818        {
1819          info->fprintf_func = save_printer;
1820          info->print_address_func = save_print_address;
1821          return 0;
1822        }
1823      else
1824        {
1825          info->fprintf_func (info->stream,
1826                              /* xgettext:c-format */
1827                              _("<internal error in opcode table: %s %s>\n"),
1828                              best->name,  best->args);
1829          info->fprintf_func = save_printer;
1830          info->print_address_func = save_print_address;
1831          return 2;
1832        }
1833    }
1834
1835  p = save_p;
1836  info->fprintf_func = save_printer;
1837  info->print_address_func = save_print_address;
1838
1839  d = best->args;
1840
1841  info->fprintf_func (info->stream, "%s", best->name);
1842
1843  if (*d)
1844    info->fprintf_func (info->stream, " ");
1845
1846  while (*d)
1847    {
1848      p += print_insn_arg (d, buffer, p, memaddr + (p - buffer), info);
1849      d += 2;
1850
1851      if (*d && *(d - 2) != 'I' && *d != 'k')
1852        info->fprintf_func (info->stream, ",");
1853    }
1854
1855  return p - buffer;
1856}
1857
1858/* Print the m68k instruction at address MEMADDR in debugged memory,
1859   on INFO->STREAM.  Returns length of the instruction, in bytes.  */
1860
1861int
1862print_insn_m68k (bfd_vma memaddr, disassemble_info *info)
1863{
1864  int i;
1865  const char *d;
1866  unsigned int arch_mask;
1867  struct private priv;
1868  bfd_byte *buffer = priv.the_buffer;
1869  int major_opcode;
1870  static int numopcodes[16];
1871  static const struct m68k_opcode **opcodes[16];
1872  int val;
1873
1874  if (!opcodes[0])
1875    {
1876      /* Speed up the matching by sorting the opcode
1877         table on the upper four bits of the opcode.  */
1878      const struct m68k_opcode **opc_pointer[16];
1879
1880      /* First count how many opcodes are in each of the sixteen buckets.  */
1881      for (i = 0; i < m68k_numopcodes; i++)
1882        numopcodes[(m68k_opcodes[i].opcode >> 28) & 15]++;
1883
1884      /* Then create a sorted table of pointers
1885         that point into the unsorted table.  */
1886      opc_pointer[0] = malloc (sizeof (struct m68k_opcode *)
1887                               * m68k_numopcodes);
1888      opcodes[0] = opc_pointer[0];
1889
1890      for (i = 1; i < 16; i++)
1891        {
1892          opc_pointer[i] = opc_pointer[i - 1] + numopcodes[i - 1];
1893          opcodes[i] = opc_pointer[i];
1894        }
1895
1896      for (i = 0; i < m68k_numopcodes; i++)
1897        *opc_pointer[(m68k_opcodes[i].opcode >> 28) & 15]++ = &m68k_opcodes[i];
1898    }
1899
1900  info->private_data = (PTR) &priv;
1901  /* Tell objdump to use two bytes per chunk
1902     and six bytes per line for displaying raw data.  */
1903  info->bytes_per_chunk = 2;
1904  info->bytes_per_line = 6;
1905  info->display_endian = BFD_ENDIAN_BIG;
1906  priv.max_fetched = priv.the_buffer;
1907  priv.insn_start = memaddr;
1908
1909  if (setjmp (priv.bailout) != 0)
1910    /* Error return.  */
1911    return -1;
1912
1913  switch (info->mach)
1914    {
1915    default:
1916    case 0:
1917      arch_mask = (unsigned int) -1;
1918      break;
1919    case bfd_mach_m68000:
1920      arch_mask = m68000|m68881|m68851;
1921      break;
1922    case bfd_mach_m68008:
1923      arch_mask = m68008|m68881|m68851;
1924      break;
1925    case bfd_mach_m68010:
1926      arch_mask = m68010|m68881|m68851;
1927      break;
1928    case bfd_mach_m68020:
1929      arch_mask = m68020|m68881|m68851;
1930      break;
1931    case bfd_mach_m68030:
1932      arch_mask = m68030|m68881|m68851;
1933      break;
1934    case bfd_mach_m68040:
1935      arch_mask = m68040|m68881|m68851;
1936      break;
1937    case bfd_mach_m68060:
1938      arch_mask = m68060|m68881|m68851;
1939      break;
1940    case bfd_mach_mcf5200:
1941      arch_mask = mcfisa_a;
1942      break;
1943    case bfd_mach_mcf521x:
1944    case bfd_mach_mcf528x:
1945      arch_mask = mcfisa_a|mcfhwdiv|mcfisa_aa|mcfusp|mcfemac;
1946      break;
1947    case bfd_mach_mcf5206e:
1948      arch_mask = mcfisa_a|mcfhwdiv|mcfmac;
1949      break;
1950    case bfd_mach_mcf5249:
1951      arch_mask = mcfisa_a|mcfhwdiv|mcfemac;
1952      break;
1953    case bfd_mach_mcf5307:
1954      arch_mask = mcfisa_a|mcfhwdiv|mcfmac;
1955      break;
1956    case bfd_mach_mcf5407:
1957      arch_mask = mcfisa_a|mcfhwdiv|mcfisa_b|mcfmac;
1958      break;
1959    case bfd_mach_mcf547x:
1960    case bfd_mach_mcf548x:
1961    case bfd_mach_mcfv4e:
1962      arch_mask = mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|cfloat|mcfemac;
1963      break;
1964    }
1965
1966  FETCH_DATA (info, buffer + 2);
1967  major_opcode = (buffer[0] >> 4) & 15;
1968
1969  for (i = 0; i < numopcodes[major_opcode]; i++)
1970    {
1971      const struct m68k_opcode *opc = opcodes[major_opcode][i];
1972      unsigned long opcode = opc->opcode;
1973      unsigned long match = opc->match;
1974
1975      if (((0xff & buffer[0] & (match >> 24)) == (0xff & (opcode >> 24)))
1976          && ((0xff & buffer[1] & (match >> 16)) == (0xff & (opcode >> 16)))
1977          /* Only fetch the next two bytes if we need to.  */
1978          && (((0xffff & match) == 0)
1979              ||
1980              (FETCH_DATA (info, buffer + 4)
1981               && ((0xff & buffer[2] & (match >> 8)) == (0xff & (opcode >> 8)))
1982               && ((0xff & buffer[3] & match) == (0xff & opcode)))
1983              )
1984          && (opc->arch & arch_mask) != 0)
1985        {
1986          /* Don't use for printout the variants of divul and divsl
1987             that have the same register number in two places.
1988             The more general variants will match instead.  */
1989          for (d = opc->args; *d; d += 2)
1990            if (d[1] == 'D')
1991              break;
1992
1993          /* Don't use for printout the variants of most floating
1994             point coprocessor instructions which use the same
1995             register number in two places, as above.  */
1996          if (*d == '\0')
1997            for (d = opc->args; *d; d += 2)
1998              if (d[1] == 't')
1999                break;
2000
2001          /* Don't match fmovel with more than one register;
2002             wait for fmoveml.  */
2003          if (*d == '\0')
2004            {
2005              for (d = opc->args; *d; d += 2)
2006                {
2007                  if (d[0] == 's' && d[1] == '8')
2008                    {
2009                      val = fetch_arg (buffer, d[1], 3, info);
2010                      if ((val & (val - 1)) != 0)
2011                        break;
2012                    }
2013                }
2014            }
2015
2016          if (*d == '\0')
2017            if ((val = match_insn_m68k (memaddr, info, opc, & priv)))
2018              return val;
2019        }
2020    }
2021
2022  /* Handle undefined instructions.  */
2023  info->fprintf_func (info->stream, "0%o", (buffer[0] << 8) + buffer[1]);
2024  return 2;
2025}
2026/* **** End of m68k-dis.c */
2027/* **** m68k-opc.h from sourceware.org CVS 2005-08-14.  */
2028/* Opcode table for m680[012346]0/m6888[12]/m68851/mcf5200.
2029   Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2030   2000, 2001, 2003, 2004, 2005
2031   Free Software Foundation, Inc.
2032
2033   This file is part of GDB, GAS, and the GNU binutils.
2034
2035   GDB, GAS, and the GNU binutils are free software; you can redistribute
2036   them and/or modify them under the terms of the GNU General Public
2037   License as published by the Free Software Foundation; either version
2038   1, or (at your option) any later version.
2039
2040   GDB, GAS, and the GNU binutils are distributed in the hope that they
2041   will be useful, but WITHOUT ANY WARRANTY; without even the implied
2042   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
2043   the GNU General Public License for more details.
2044
2045   You should have received a copy of the GNU General Public License
2046   along with this file; see the file COPYING.  If not,
2047   see <http://www.gnu.org/licenses/>.  */
2048
2049#define one(x) ((unsigned int) (x) << 16)
2050#define two(x, y) (((unsigned int) (x) << 16) + (y))
2051
2052/* The assembler requires that all instances of the same mnemonic must
2053   be consecutive.  If they aren't, the assembler will bomb at
2054   runtime.  */
2055
2056const struct m68k_opcode m68k_opcodes[] =
2057{
2058{"abcd", 2,     one(0140400),   one(0170770), "DsDd", m68000up },
2059{"abcd", 2,     one(0140410),   one(0170770), "-s-d", m68000up },
2060
2061{"addaw", 2,    one(0150300),   one(0170700), "*wAd", m68000up },
2062{"addal", 2,    one(0150700),   one(0170700), "*lAd", m68000up | mcfisa_a },
2063
2064{"addib", 4,    one(0003000),   one(0177700), "#b$s", m68000up },
2065{"addiw", 4,    one(0003100),   one(0177700), "#w$s", m68000up },
2066{"addil", 6,    one(0003200),   one(0177700), "#l$s", m68000up },
2067{"addil", 6,    one(0003200),   one(0177700), "#lDs", mcfisa_a },
2068
2069{"addqb", 2,    one(0050000),   one(0170700), "Qd$b", m68000up },
2070{"addqw", 2,    one(0050100),   one(0170700), "Qd%w", m68000up },
2071{"addql", 2,    one(0050200),   one(0170700), "Qd%l", m68000up | mcfisa_a },
2072
2073/* The add opcode can generate the adda, addi, and addq instructions.  */
2074{"addb", 2,     one(0050000),   one(0170700), "Qd$b", m68000up },
2075{"addb", 4,     one(0003000),   one(0177700), "#b$s", m68000up },
2076{"addb", 2,     one(0150000),   one(0170700), ";bDd", m68000up },
2077{"addb", 2,     one(0150400),   one(0170700), "Dd~b", m68000up },
2078{"addw", 2,     one(0050100),   one(0170700), "Qd%w", m68000up },
2079{"addw", 2,     one(0150300),   one(0170700), "*wAd", m68000up },
2080{"addw", 4,     one(0003100),   one(0177700), "#w$s", m68000up },
2081{"addw", 2,     one(0150100),   one(0170700), "*wDd", m68000up },
2082{"addw", 2,     one(0150500),   one(0170700), "Dd~w", m68000up },
2083{"addl", 2,     one(0050200),   one(0170700), "Qd%l", m68000up | mcfisa_a },
2084{"addl", 6,     one(0003200),   one(0177700), "#l$s", m68000up },
2085{"addl", 6,     one(0003200),   one(0177700), "#lDs", mcfisa_a },
2086{"addl", 2,     one(0150700),   one(0170700), "*lAd", m68000up | mcfisa_a },
2087{"addl", 2,     one(0150200),   one(0170700), "*lDd", m68000up | mcfisa_a },
2088{"addl", 2,     one(0150600),   one(0170700), "Dd~l", m68000up | mcfisa_a },
2089
2090{"addxb", 2,    one(0150400),   one(0170770), "DsDd", m68000up },
2091{"addxb", 2,    one(0150410),   one(0170770), "-s-d", m68000up },
2092{"addxw", 2,    one(0150500),   one(0170770), "DsDd", m68000up },
2093{"addxw", 2,    one(0150510),   one(0170770), "-s-d", m68000up },
2094{"addxl", 2,    one(0150600),   one(0170770), "DsDd", m68000up | mcfisa_a },
2095{"addxl", 2,    one(0150610),   one(0170770), "-s-d", m68000up },
2096
2097{"andib", 4,    one(0001000),   one(0177700), "#b$s", m68000up },
2098{"andib", 4,    one(0001074),   one(0177777), "#bCs", m68000up },
2099{"andiw", 4,    one(0001100),   one(0177700), "#w$s", m68000up },
2100{"andiw", 4,    one(0001174),   one(0177777), "#wSs", m68000up },
2101{"andil", 6,    one(0001200),   one(0177700), "#l$s", m68000up },
2102{"andil", 6,    one(0001200),   one(0177700), "#lDs", mcfisa_a },
2103{"andi", 4,     one(0001100),   one(0177700), "#w$s", m68000up },
2104{"andi", 4,     one(0001074),   one(0177777), "#bCs", m68000up },
2105{"andi", 4,     one(0001174),   one(0177777), "#wSs", m68000up },
2106
2107/* The and opcode can generate the andi instruction.  */
2108{"andb", 4,     one(0001000),   one(0177700), "#b$s", m68000up },
2109{"andb", 4,     one(0001074),   one(0177777), "#bCs", m68000up },
2110{"andb", 2,     one(0140000),   one(0170700), ";bDd", m68000up },
2111{"andb", 2,     one(0140400),   one(0170700), "Dd~b", m68000up },
2112{"andw", 4,     one(0001100),   one(0177700), "#w$s", m68000up },
2113{"andw", 4,     one(0001174),   one(0177777), "#wSs", m68000up },
2114{"andw", 2,     one(0140100),   one(0170700), ";wDd", m68000up },
2115{"andw", 2,     one(0140500),   one(0170700), "Dd~w", m68000up },
2116{"andl", 6,     one(0001200),   one(0177700), "#l$s", m68000up },
2117{"andl", 6,     one(0001200),   one(0177700), "#lDs", mcfisa_a },
2118{"andl", 2,     one(0140200),   one(0170700), ";lDd", m68000up | mcfisa_a },
2119{"andl", 2,     one(0140600),   one(0170700), "Dd~l", m68000up | mcfisa_a },
2120{"and", 4,      one(0001100),   one(0177700), "#w$w", m68000up },
2121{"and", 4,      one(0001074),   one(0177777), "#bCs", m68000up },
2122{"and", 4,      one(0001174),   one(0177777), "#wSs", m68000up },
2123{"and", 2,      one(0140100),   one(0170700), ";wDd", m68000up },
2124{"and", 2,      one(0140500),   one(0170700), "Dd~w", m68000up },
2125
2126{"aslb", 2,     one(0160400),   one(0170770), "QdDs", m68000up },
2127{"aslb", 2,     one(0160440),   one(0170770), "DdDs", m68000up },
2128{"aslw", 2,     one(0160500),   one(0170770), "QdDs", m68000up },
2129{"aslw", 2,     one(0160540),   one(0170770), "DdDs", m68000up },
2130{"aslw", 2,     one(0160700),   one(0177700), "~s",   m68000up },
2131{"asll", 2,     one(0160600),   one(0170770), "QdDs", m68000up | mcfisa_a },
2132{"asll", 2,     one(0160640),   one(0170770), "DdDs", m68000up | mcfisa_a },
2133
2134{"asrb", 2,     one(0160000),   one(0170770), "QdDs", m68000up },
2135{"asrb", 2,     one(0160040),   one(0170770), "DdDs", m68000up },
2136{"asrw", 2,     one(0160100),   one(0170770), "QdDs", m68000up },
2137{"asrw", 2,     one(0160140),   one(0170770), "DdDs", m68000up },
2138{"asrw", 2,     one(0160300),   one(0177700), "~s",   m68000up },
2139{"asrl", 2,     one(0160200),   one(0170770), "QdDs", m68000up | mcfisa_a },
2140{"asrl", 2,     one(0160240),   one(0170770), "DdDs", m68000up | mcfisa_a },
2141
2142{"bhiw", 2,     one(0061000),   one(0177777), "BW", m68000up | mcfisa_a },
2143{"blsw", 2,     one(0061400),   one(0177777), "BW", m68000up | mcfisa_a },
2144{"bccw", 2,     one(0062000),   one(0177777), "BW", m68000up | mcfisa_a },
2145{"bcsw", 2,     one(0062400),   one(0177777), "BW", m68000up | mcfisa_a },
2146{"bnew", 2,     one(0063000),   one(0177777), "BW", m68000up | mcfisa_a },
2147{"beqw", 2,     one(0063400),   one(0177777), "BW", m68000up | mcfisa_a },
2148{"bvcw", 2,     one(0064000),   one(0177777), "BW", m68000up | mcfisa_a },
2149{"bvsw", 2,     one(0064400),   one(0177777), "BW", m68000up | mcfisa_a },
2150{"bplw", 2,     one(0065000),   one(0177777), "BW", m68000up | mcfisa_a },
2151{"bmiw", 2,     one(0065400),   one(0177777), "BW", m68000up | mcfisa_a },
2152{"bgew", 2,     one(0066000),   one(0177777), "BW", m68000up | mcfisa_a },
2153{"bltw", 2,     one(0066400),   one(0177777), "BW", m68000up | mcfisa_a },
2154{"bgtw", 2,     one(0067000),   one(0177777), "BW", m68000up | mcfisa_a },
2155{"blew", 2,     one(0067400),   one(0177777), "BW", m68000up | mcfisa_a },
2156
2157{"bhil", 2,     one(0061377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2158{"blsl", 2,     one(0061777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2159{"bccl", 2,     one(0062377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2160{"bcsl", 2,     one(0062777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2161{"bnel", 2,     one(0063377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2162{"beql", 2,     one(0063777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2163{"bvcl", 2,     one(0064377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2164{"bvsl", 2,     one(0064777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2165{"bpll", 2,     one(0065377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2166{"bmil", 2,     one(0065777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2167{"bgel", 2,     one(0066377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2168{"bltl", 2,     one(0066777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2169{"bgtl", 2,     one(0067377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2170{"blel", 2,     one(0067777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2171
2172{"bhis", 2,     one(0061000),   one(0177400), "BB", m68000up | mcfisa_a },
2173{"blss", 2,     one(0061400),   one(0177400), "BB", m68000up | mcfisa_a },
2174{"bccs", 2,     one(0062000),   one(0177400), "BB", m68000up | mcfisa_a },
2175{"bcss", 2,     one(0062400),   one(0177400), "BB", m68000up | mcfisa_a },
2176{"bnes", 2,     one(0063000),   one(0177400), "BB", m68000up | mcfisa_a },
2177{"beqs", 2,     one(0063400),   one(0177400), "BB", m68000up | mcfisa_a },
2178{"bvcs", 2,     one(0064000),   one(0177400), "BB", m68000up | mcfisa_a },
2179{"bvss", 2,     one(0064400),   one(0177400), "BB", m68000up | mcfisa_a },
2180{"bpls", 2,     one(0065000),   one(0177400), "BB", m68000up | mcfisa_a },
2181{"bmis", 2,     one(0065400),   one(0177400), "BB", m68000up | mcfisa_a },
2182{"bges", 2,     one(0066000),   one(0177400), "BB", m68000up | mcfisa_a },
2183{"blts", 2,     one(0066400),   one(0177400), "BB", m68000up | mcfisa_a },
2184{"bgts", 2,     one(0067000),   one(0177400), "BB", m68000up | mcfisa_a },
2185{"bles", 2,     one(0067400),   one(0177400), "BB", m68000up | mcfisa_a },
2186
2187{"jhi", 2,      one(0061000),   one(0177400), "Bg", m68000up | mcfisa_a },
2188{"jls", 2,      one(0061400),   one(0177400), "Bg", m68000up | mcfisa_a },
2189{"jcc", 2,      one(0062000),   one(0177400), "Bg", m68000up | mcfisa_a },
2190{"jcs", 2,      one(0062400),   one(0177400), "Bg", m68000up | mcfisa_a },
2191{"jne", 2,      one(0063000),   one(0177400), "Bg", m68000up | mcfisa_a },
2192{"jeq", 2,      one(0063400),   one(0177400), "Bg", m68000up | mcfisa_a },
2193{"jvc", 2,      one(0064000),   one(0177400), "Bg", m68000up | mcfisa_a },
2194{"jvs", 2,      one(0064400),   one(0177400), "Bg", m68000up | mcfisa_a },
2195{"jpl", 2,      one(0065000),   one(0177400), "Bg", m68000up | mcfisa_a },
2196{"jmi", 2,      one(0065400),   one(0177400), "Bg", m68000up | mcfisa_a },
2197{"jge", 2,      one(0066000),   one(0177400), "Bg", m68000up | mcfisa_a },
2198{"jlt", 2,      one(0066400),   one(0177400), "Bg", m68000up | mcfisa_a },
2199{"jgt", 2,      one(0067000),   one(0177400), "Bg", m68000up | mcfisa_a },
2200{"jle", 2,      one(0067400),   one(0177400), "Bg", m68000up | mcfisa_a },
2201
2202{"bchg", 2,     one(0000500),   one(0170700), "Dd$s", m68000up | mcfisa_a },
2203{"bchg", 4,     one(0004100),   one(0177700), "#b$s", m68000up },
2204{"bchg", 4,     one(0004100),   one(0177700), "#bqs", mcfisa_a },
2205
2206{"bclr", 2,     one(0000600),   one(0170700), "Dd$s", m68000up | mcfisa_a },
2207{"bclr", 4,     one(0004200),   one(0177700), "#b$s", m68000up },
2208{"bclr", 4,     one(0004200),   one(0177700), "#bqs", mcfisa_a },
2209
2210{"bfchg", 4,    two(0165300, 0), two(0177700, 0170000), "?sO2O3",   m68020up },
2211{"bfclr", 4,    two(0166300, 0), two(0177700, 0170000), "?sO2O3",   m68020up },
2212{"bfexts", 4,   two(0165700, 0), two(0177700, 0100000), "/sO2O3D1", m68020up },
2213{"bfextu", 4,   two(0164700, 0), two(0177700, 0100000), "/sO2O3D1", m68020up },
2214{"bfffo", 4,    two(0166700, 0), two(0177700, 0100000), "/sO2O3D1", m68020up },
2215{"bfins", 4,    two(0167700, 0), two(0177700, 0100000), "D1?sO2O3", m68020up },
2216{"bfset", 4,    two(0167300, 0), two(0177700, 0170000), "?sO2O3",   m68020up },
2217{"bftst", 4,    two(0164300, 0), two(0177700, 0170000), "/sO2O3",   m68020up },
2218
2219{"bgnd", 2,     one(0045372),   one(0177777), "", cpu32 },
2220
2221{"bitrev", 2,   one(0000300),   one(0177770), "Ds", mcfisa_aa},
2222
2223{"bkpt", 2,     one(0044110),   one(0177770), "ts", m68010up },
2224
2225{"braw", 2,     one(0060000),   one(0177777), "BW", m68000up | mcfisa_a },
2226{"bral", 2,     one(0060377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2227{"bras", 2,     one(0060000),   one(0177400), "BB", m68000up | mcfisa_a },
2228
2229{"bset", 2,     one(0000700),   one(0170700), "Dd$s", m68000up | mcfisa_a },
2230{"bset", 2,     one(0000700),   one(0170700), "Ddvs", mcfisa_a },
2231{"bset", 4,     one(0004300),   one(0177700), "#b$s", m68000up },
2232{"bset", 4,     one(0004300),   one(0177700), "#bqs", mcfisa_a },
2233
2234{"bsrw", 2,     one(0060400),   one(0177777), "BW", m68000up | mcfisa_a },
2235{"bsrl", 2,     one(0060777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2236{"bsrs", 2,     one(0060400),   one(0177400), "BB", m68000up | mcfisa_a },
2237
2238{"btst", 2,     one(0000400),   one(0170700), "Dd;b", m68000up | mcfisa_a },
2239{"btst", 4,     one(0004000),   one(0177700), "#b@s", m68000up },
2240{"btst", 4,     one(0004000),   one(0177700), "#bqs", mcfisa_a },
2241
2242{"byterev", 2,  one(0001300),   one(0177770), "Ds", mcfisa_aa},
2243
2244{"callm", 4,    one(0003300),   one(0177700), "#b!s", m68020 },
2245
2246{"cas2w", 6,    two(0006374,0), two(0177777,0007070), "D3D6D2D5r1r4", m68020up },
2247{"cas2w", 6,    two(0006374,0), two(0177777,0007070), "D3D6D2D5R1R4", m68020up },
2248{"cas2l", 6,    two(0007374,0), two(0177777,0007070), "D3D6D2D5r1r4", m68020up },
2249{"cas2l", 6,    two(0007374,0), two(0177777,0007070), "D3D6D2D5R1R4", m68020up },
2250
2251{"casb", 4,     two(0005300, 0), two(0177700, 0177070), "D3D2~s", m68020up },
2252{"casw", 4,     two(0006300, 0), two(0177700, 0177070), "D3D2~s", m68020up },
2253{"casl", 4,     two(0007300, 0), two(0177700, 0177070), "D3D2~s", m68020up },
2254
2255{"chk2b", 4,    two(0000300,0004000), two(0177700,07777), "!sR1", m68020up | cpu32 },
2256{"chk2w", 4,    two(0001300,0004000),   two(0177700,07777), "!sR1", m68020up | cpu32 },
2257{"chk2l", 4,    two(0002300,0004000),   two(0177700,07777), "!sR1", m68020up | cpu32 },
2258
2259{"chkl", 2,     one(0040400),           one(0170700), ";lDd", m68000up },
2260{"chkw", 2,     one(0040600),           one(0170700), ";wDd", m68000up },
2261
2262#define SCOPE_LINE (0x1 << 3)
2263#define SCOPE_PAGE (0x2 << 3)
2264#define SCOPE_ALL  (0x3 << 3)
2265
2266{"cinva", 2,    one(0xf400|SCOPE_ALL),  one(0xff38), "ce",   m68040up },
2267{"cinvl", 2,    one(0xf400|SCOPE_LINE), one(0xff38), "ceas", m68040up },
2268{"cinvp", 2,    one(0xf400|SCOPE_PAGE), one(0xff38), "ceas", m68040up },
2269
2270{"cpusha", 2,   one(0xf420|SCOPE_ALL),  one(0xff38), "ce",   m68040up },
2271{"cpushl", 2,   one(0xf420|SCOPE_LINE), one(0xff38), "ceas", m68040up | mcfisa_a },
2272{"cpushp", 2,   one(0xf420|SCOPE_PAGE), one(0xff38), "ceas", m68040up },
2273
2274#undef SCOPE_LINE
2275#undef SCOPE_PAGE
2276#undef SCOPE_ALL
2277
2278{"clrb", 2,     one(0041000),   one(0177700), "$s", m68000up | mcfisa_a },
2279{"clrw", 2,     one(0041100),   one(0177700), "$s", m68000up | mcfisa_a },
2280{"clrl", 2,     one(0041200),   one(0177700), "$s", m68000up | mcfisa_a },
2281
2282{"cmp2b", 4,    two(0000300,0), two(0177700,07777), "!sR1", m68020up | cpu32 },
2283{"cmp2w", 4,    two(0001300,0), two(0177700,07777), "!sR1", m68020up | cpu32 },
2284{"cmp2l", 4,    two(0002300,0), two(0177700,07777), "!sR1", m68020up | cpu32 },
2285
2286{"cmpaw", 2,    one(0130300),   one(0170700), "*wAd", m68000up },
2287{"cmpal", 2,    one(0130700),   one(0170700), "*lAd", m68000up | mcfisa_a },
2288
2289{"cmpib", 4,    one(0006000),   one(0177700), "#b@s", m68000up },
2290{"cmpib", 4,    one(0006000),   one(0177700), "#bDs", mcfisa_b },
2291{"cmpiw", 4,    one(0006100),   one(0177700), "#w@s", m68000up },
2292{"cmpiw", 4,    one(0006100),   one(0177700), "#wDs", mcfisa_b },
2293{"cmpil", 6,    one(0006200),   one(0177700), "#l@s", m68000up },
2294{"cmpil", 6,    one(0006200),   one(0177700), "#lDs", mcfisa_a },
2295
2296{"cmpmb", 2,    one(0130410),   one(0170770), "+s+d", m68000up },
2297{"cmpmw", 2,    one(0130510),   one(0170770), "+s+d", m68000up },
2298{"cmpml", 2,    one(0130610),   one(0170770), "+s+d", m68000up },
2299
2300/* The cmp opcode can generate the cmpa, cmpm, and cmpi instructions.  */
2301{"cmpb", 4,     one(0006000),   one(0177700), "#b@s", m68000up },
2302{"cmpb", 4,     one(0006000),   one(0177700), "#bDs", mcfisa_b },
2303{"cmpb", 2,     one(0130410),   one(0170770), "+s+d", m68000up },
2304{"cmpb", 2,     one(0130000),   one(0170700), ";bDd", m68000up },
2305{"cmpb", 2,     one(0130000),   one(0170700), "*bDd", mcfisa_b },
2306{"cmpw", 2,     one(0130300),   one(0170700), "*wAd", m68000up },
2307{"cmpw", 4,     one(0006100),   one(0177700), "#w@s", m68000up },
2308{"cmpw", 4,     one(0006100),   one(0177700), "#wDs", mcfisa_b },
2309{"cmpw", 2,     one(0130510),   one(0170770), "+s+d", m68000up },
2310{"cmpw", 2,     one(0130100),   one(0170700), "*wDd", m68000up | mcfisa_b },
2311{"cmpl", 2,     one(0130700),   one(0170700), "*lAd", m68000up | mcfisa_a },
2312{"cmpl", 6,     one(0006200),   one(0177700), "#l@s", m68000up },
2313{"cmpl", 6,     one(0006200),   one(0177700), "#lDs", mcfisa_a },
2314{"cmpl", 2,     one(0130610),   one(0170770), "+s+d", m68000up },
2315{"cmpl", 2,     one(0130200),   one(0170700), "*lDd", m68000up | mcfisa_a },
2316
2317{"dbcc", 2,     one(0052310),   one(0177770), "DsBw", m68000up },
2318{"dbcs", 2,     one(0052710),   one(0177770), "DsBw", m68000up },
2319{"dbeq", 2,     one(0053710),   one(0177770), "DsBw", m68000up },
2320{"dbf", 2,      one(0050710),   one(0177770), "DsBw", m68000up },
2321{"dbge", 2,     one(0056310),   one(0177770), "DsBw", m68000up },
2322{"dbgt", 2,     one(0057310),   one(0177770), "DsBw", m68000up },
2323{"dbhi", 2,     one(0051310),   one(0177770), "DsBw", m68000up },
2324{"dble", 2,     one(0057710),   one(0177770), "DsBw", m68000up },
2325{"dbls", 2,     one(0051710),   one(0177770), "DsBw", m68000up },
2326{"dblt", 2,     one(0056710),   one(0177770), "DsBw", m68000up },
2327{"dbmi", 2,     one(0055710),   one(0177770), "DsBw", m68000up },
2328{"dbne", 2,     one(0053310),   one(0177770), "DsBw", m68000up },
2329{"dbpl", 2,     one(0055310),   one(0177770), "DsBw", m68000up },
2330{"dbt", 2,      one(0050310),   one(0177770), "DsBw", m68000up },
2331{"dbvc", 2,     one(0054310),   one(0177770), "DsBw", m68000up },
2332{"dbvs", 2,     one(0054710),   one(0177770), "DsBw", m68000up },
2333
2334{"divsw", 2,    one(0100700),   one(0170700), ";wDd", m68000up | mcfhwdiv },
2335
2336{"divsl", 4,    two(0046100,0006000),two(0177700,0107770),";lD3D1", m68020up|cpu32 },
2337{"divsl", 4,    two(0046100,0004000),two(0177700,0107770),";lDD",   m68020up|cpu32 },
2338{"divsl", 4,    two(0046100,0004000),two(0177700,0107770),"qsDD",   mcfhwdiv },
2339
2340{"divsll", 4,   two(0046100,0004000),two(0177700,0107770),";lD3D1",m68020up|cpu32 },
2341{"divsll", 4,   two(0046100,0004000),two(0177700,0107770),";lDD",  m68020up|cpu32 },
2342
2343{"divuw", 2,    one(0100300),           one(0170700), ";wDd", m68000up | mcfhwdiv },
2344
2345{"divul", 4,    two(0046100,0002000),two(0177700,0107770),";lD3D1", m68020up|cpu32 },
2346{"divul", 4,    two(0046100,0000000),two(0177700,0107770),";lDD",   m68020up|cpu32 },
2347{"divul", 4,    two(0046100,0000000),two(0177700,0107770),"qsDD",   mcfhwdiv },
2348
2349{"divull", 4,   two(0046100,0000000),two(0177700,0107770),";lD3D1",m68020up|cpu32 },
2350{"divull", 4,   two(0046100,0000000),two(0177700,0107770),";lDD",  m68020up|cpu32 },
2351
2352{"eorib", 4,    one(0005000),   one(0177700), "#b$s", m68000up },
2353{"eorib", 4,    one(0005074),   one(0177777), "#bCs", m68000up },
2354{"eoriw", 4,    one(0005100),   one(0177700), "#w$s", m68000up },
2355{"eoriw", 4,    one(0005174),   one(0177777), "#wSs", m68000up },
2356{"eoril", 6,    one(0005200),   one(0177700), "#l$s", m68000up },
2357{"eoril", 6,    one(0005200),   one(0177700), "#lDs", mcfisa_a },
2358{"eori", 4,     one(0005074),   one(0177777), "#bCs", m68000up },
2359{"eori", 4,     one(0005174),   one(0177777), "#wSs", m68000up },
2360{"eori", 4,     one(0005100),   one(0177700), "#w$s", m68000up },
2361
2362/* The eor opcode can generate the eori instruction.  */
2363{"eorb", 4,     one(0005000),   one(0177700), "#b$s", m68000up },
2364{"eorb", 4,     one(0005074),   one(0177777), "#bCs", m68000up },
2365{"eorb", 2,     one(0130400),   one(0170700), "Dd$s", m68000up },
2366{"eorw", 4,     one(0005100),   one(0177700), "#w$s", m68000up },
2367{"eorw", 4,     one(0005174),   one(0177777), "#wSs", m68000up },
2368{"eorw", 2,     one(0130500),   one(0170700), "Dd$s", m68000up },
2369{"eorl", 6,     one(0005200),   one(0177700), "#l$s", m68000up },
2370{"eorl", 6,     one(0005200),   one(0177700), "#lDs", mcfisa_a },
2371{"eorl", 2,     one(0130600),   one(0170700), "Dd$s", m68000up | mcfisa_a },
2372{"eor", 4,      one(0005074),   one(0177777), "#bCs", m68000up },
2373{"eor", 4,      one(0005174),   one(0177777), "#wSs", m68000up },
2374{"eor", 4,      one(0005100),   one(0177700), "#w$s", m68000up },
2375{"eor", 2,      one(0130500),   one(0170700), "Dd$s", m68000up },
2376
2377{"exg", 2,      one(0140500),   one(0170770), "DdDs", m68000up },
2378{"exg", 2,      one(0140510),   one(0170770), "AdAs", m68000up },
2379{"exg", 2,      one(0140610),   one(0170770), "DdAs", m68000up },
2380{"exg", 2,      one(0140610),   one(0170770), "AsDd", m68000up },
2381
2382{"extw", 2,     one(0044200),   one(0177770), "Ds", m68000up|mcfisa_a },
2383{"extl", 2,     one(0044300),   one(0177770), "Ds", m68000up|mcfisa_a },
2384{"extbl", 2,    one(0044700),   one(0177770), "Ds", m68020up|cpu32|mcfisa_a },
2385
2386{"ff1", 2,      one(0002300), one(0177770), "Ds", mcfisa_aa},
2387
2388/* float stuff starts here */
2389
2390{"fabsb", 4,    two(0xF000, 0x5818), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2391{"fabsb", 4,    two(0xF000, 0x5818), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2392{"fabsd", 4,    two(0xF000, 0x0018), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2393{"fabsd", 4,    two(0xF000, 0x0018), two(0xF1C0, 0xE07F), "IiFt", cfloat },
2394{"fabsd", 4,    two(0xF000, 0x5418), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2395{"fabsd", 4,    two(0xF000, 0x5418), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2396{"fabsl", 4,    two(0xF000, 0x4018), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2397{"fabsl", 4,    two(0xF000, 0x4018), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2398{"fabsp", 4,    two(0xF000, 0x4C18), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2399{"fabss", 4,    two(0xF000, 0x4418), two(0xF1C0, 0xFC7F), "Ii;fF7", cfloat },
2400{"fabss", 4,    two(0xF000, 0x4418), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2401{"fabsw", 4,    two(0xF000, 0x5018), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2402{"fabsw", 4,    two(0xF000, 0x5018), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2403{"fabsx", 4,    two(0xF000, 0x0018), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2404{"fabsx", 4,    two(0xF000, 0x4818), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2405{"fabsx", 4,    two(0xF000, 0x0018), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2406
2407{"fsabsb", 4,   two(0xF000, 0x5858), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
2408{"fsabsb", 4,   two(0xF000, 0x5858), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2409{"fsabsd", 4,   two(0xF000, 0x0058), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2410{"fsabsd", 4,   two(0xF000, 0x0058), two(0xF1C0, 0xE07F), "IiFt", cfloat },
2411{"fsabsd", 4,   two(0xF000, 0x5458), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
2412{"fsabsd", 4,   two(0xF000, 0x5458), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2413{"fsabsl", 4,   two(0xF000, 0x4058), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
2414{"fsabsl", 4,   two(0xF000, 0x4058), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2415{"fsabsp", 4,   two(0xF000, 0x4C58), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
2416{"fsabss", 4,   two(0xF000, 0x4258), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2417{"fsabss", 4,   two(0xF000, 0x4458), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
2418{"fsabsw", 4,   two(0xF000, 0x5058), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
2419{"fsabsw", 4,   two(0xF000, 0x5058), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2420{"fsabsx", 4,   two(0xF000, 0x0058), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
2421{"fsabsx", 4,   two(0xF000, 0x4858), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
2422{"fsabsx", 4,   two(0xF000, 0x0058), two(0xF1C0, 0xE07F), "IiFt",   m68040up },
2423
2424{"fdabsb", 4,   two(0xF000, 0x585C), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2425{"fdabsb", 4,   two(0xF000, 0x585c), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up},
2426{"fdabsd", 4,   two(0xF000, 0x005C), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2427{"fdabsd", 4,   two(0xF000, 0x005C), two(0xF1C0, 0xE07F), "IiFt", cfloat },
2428{"fdabsd", 4,   two(0xF000, 0x545C), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2429{"fdabsd", 4,   two(0xF000, 0x545c), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up},
2430{"fdabsl", 4,   two(0xF000, 0x405C), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2431{"fdabsl", 4,   two(0xF000, 0x405c), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up},
2432{"fdabsp", 4,   two(0xF000, 0x4C5c), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up},
2433{"fdabss", 4,   two(0xF000, 0x425C), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2434{"fdabss", 4,   two(0xF000, 0x445c), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up},
2435{"fdabsw", 4,   two(0xF000, 0x505C), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2436{"fdabsw", 4,   two(0xF000, 0x505c), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up},
2437{"fdabsx", 4,   two(0xF000, 0x005c), two(0xF1C0, 0xE07F), "IiF8F7", m68040up},
2438{"fdabsx", 4,   two(0xF000, 0x485c), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up},
2439{"fdabsx", 4,   two(0xF000, 0x005c), two(0xF1C0, 0xE07F), "IiFt",   m68040up},
2440
2441{"facosb", 4,   two(0xF000, 0x581C), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2442{"facosd", 4,   two(0xF000, 0x541C), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2443{"facosl", 4,   two(0xF000, 0x401C), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2444{"facosp", 4,   two(0xF000, 0x4C1C), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2445{"facoss", 4,   two(0xF000, 0x441C), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2446{"facosw", 4,   two(0xF000, 0x501C), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2447{"facosx", 4,   two(0xF000, 0x001C), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2448{"facosx", 4,   two(0xF000, 0x481C), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2449{"facosx", 4,   two(0xF000, 0x001C), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2450
2451{"faddb", 4,    two(0xF000, 0x5822), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2452{"faddb", 4,    two(0xF000, 0x5822), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2453{"faddd", 4,    two(0xF000, 0x0022), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2454{"faddd", 4,    two(0xF000, 0x5422), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2455{"faddd", 4,    two(0xF000, 0x5422), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2456{"faddd", 4,    two(0xF000, 0x5422), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2457{"faddl", 4,    two(0xF000, 0x4022), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2458{"faddl", 4,    two(0xF000, 0x4022), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2459{"faddp", 4,    two(0xF000, 0x4C22), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2460{"fadds", 4,    two(0xF000, 0x4422), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2461{"fadds", 4,    two(0xF000, 0x4422), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2462{"faddw", 4,    two(0xF000, 0x5022), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2463{"faddw", 4,    two(0xF000, 0x5022), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2464{"faddx", 4,    two(0xF000, 0x0022), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2465{"faddx", 4,    two(0xF000, 0x4822), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2466
2467{"fsaddb", 4,   two(0xF000, 0x5862), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
2468{"fsaddb", 4,   two(0xF000, 0x5862), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2469{"fsaddd", 4,   two(0xF000, 0x0066), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2470{"fsaddd", 4,   two(0xF000, 0x5462), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
2471{"fsaddd", 4,   two(0xF000, 0x5462), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2472{"fsaddl", 4,   two(0xF000, 0x4062), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
2473{"fsaddl", 4,   two(0xF000, 0x4062), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2474{"fsaddp", 4,   two(0xF000, 0x4C62), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
2475{"fsadds", 4,   two(0xF000, 0x4462), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
2476{"fsadds", 4,   two(0xF000, 0x4862), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2477{"fsaddw", 4,   two(0xF000, 0x5062), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
2478{"fsaddw", 4,   two(0xF000, 0x5062), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2479{"fsaddx", 4,   two(0xF000, 0x0062), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
2480{"fsaddx", 4,   two(0xF000, 0x4862), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
2481
2482{"fdaddb", 4,   two(0xF000, 0x5826), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2483{"fdaddb", 4,   two(0xF000, 0x5866), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
2484{"fdaddd", 4,   two(0xF000, 0x0066), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2485{"fdaddd", 4,   two(0xF000, 0x5426), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2486{"fdaddd", 4,   two(0xF000, 0x5466), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
2487{"fdaddl", 4,   two(0xF000, 0x4026), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2488{"fdaddl", 4,   two(0xF000, 0x4066), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
2489{"fdaddp", 4,   two(0xF000, 0x4C66), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
2490{"fdadds", 4,   two(0xF000, 0x4466), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
2491{"fdadds", 4,   two(0xF000, 0x4826), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2492{"fdaddw", 4,   two(0xF000, 0x5026), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2493{"fdaddw", 4,   two(0xF000, 0x5066), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
2494{"fdaddx", 4,   two(0xF000, 0x0066), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
2495{"fdaddx", 4,   two(0xF000, 0x4866), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
2496
2497{"fasinb", 4,   two(0xF000, 0x580C), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2498{"fasind", 4,   two(0xF000, 0x540C), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2499{"fasinl", 4,   two(0xF000, 0x400C), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2500{"fasinp", 4,   two(0xF000, 0x4C0C), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2501{"fasins", 4,   two(0xF000, 0x440C), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2502{"fasinw", 4,   two(0xF000, 0x500C), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2503{"fasinx", 4,   two(0xF000, 0x000C), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2504{"fasinx", 4,   two(0xF000, 0x480C), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2505{"fasinx", 4,   two(0xF000, 0x000C), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2506
2507{"fatanb", 4,   two(0xF000, 0x580A), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2508{"fatand", 4,   two(0xF000, 0x540A), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2509{"fatanl", 4,   two(0xF000, 0x400A), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2510{"fatanp", 4,   two(0xF000, 0x4C0A), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2511{"fatans", 4,   two(0xF000, 0x440A), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2512{"fatanw", 4,   two(0xF000, 0x500A), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2513{"fatanx", 4,   two(0xF000, 0x000A), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2514{"fatanx", 4,   two(0xF000, 0x480A), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2515{"fatanx", 4,   two(0xF000, 0x000A), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2516
2517{"fatanhb", 4,  two(0xF000, 0x580D), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2518{"fatanhd", 4,  two(0xF000, 0x540D), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2519{"fatanhl", 4,  two(0xF000, 0x400D), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2520{"fatanhp", 4,  two(0xF000, 0x4C0D), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2521{"fatanhs", 4,  two(0xF000, 0x440D), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2522{"fatanhw", 4,  two(0xF000, 0x500D), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2523{"fatanhx", 4,  two(0xF000, 0x000D), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2524{"fatanhx", 4,  two(0xF000, 0x480D), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2525{"fatanhx", 4,  two(0xF000, 0x000D), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2526
2527{"fbeq", 2,     one(0xF081),            one(0xF1FF), "IdBW", mfloat | cfloat },
2528{"fbf", 2,      one(0xF080),            one(0xF1FF), "IdBW", mfloat | cfloat },
2529{"fbge", 2,     one(0xF093),            one(0xF1FF), "IdBW", mfloat | cfloat },
2530{"fbgl", 2,     one(0xF096),            one(0xF1FF), "IdBW", mfloat | cfloat },
2531{"fbgle", 2,    one(0xF097),            one(0xF1FF), "IdBW", mfloat | cfloat },
2532{"fbgt", 2,     one(0xF092),            one(0xF1FF), "IdBW", mfloat | cfloat },
2533{"fble", 2,     one(0xF095),            one(0xF1FF), "IdBW", mfloat | cfloat },
2534{"fblt", 2,     one(0xF094),            one(0xF1FF), "IdBW", mfloat | cfloat },
2535{"fbne", 2,     one(0xF08E),            one(0xF1FF), "IdBW", mfloat | cfloat },
2536{"fbnge", 2,    one(0xF09C),            one(0xF1FF), "IdBW", mfloat | cfloat },
2537{"fbngl", 2,    one(0xF099),            one(0xF1FF), "IdBW", mfloat | cfloat },
2538{"fbngle", 2,   one(0xF098),            one(0xF1FF), "IdBW", mfloat | cfloat },
2539{"fbngt", 2,    one(0xF09D),            one(0xF1FF), "IdBW", mfloat | cfloat },
2540{"fbnle", 2,    one(0xF09A),            one(0xF1FF), "IdBW", mfloat | cfloat },
2541{"fbnlt", 2,    one(0xF09B),            one(0xF1FF), "IdBW", mfloat | cfloat },
2542{"fboge", 2,    one(0xF083),            one(0xF1FF), "IdBW", mfloat | cfloat },
2543{"fbogl", 2,    one(0xF086),            one(0xF1FF), "IdBW", mfloat | cfloat },
2544{"fbogt", 2,    one(0xF082),            one(0xF1FF), "IdBW", mfloat | cfloat },
2545{"fbole", 2,    one(0xF085),            one(0xF1FF), "IdBW", mfloat | cfloat },
2546{"fbolt", 2,    one(0xF084),            one(0xF1FF), "IdBW", mfloat | cfloat },
2547{"fbor", 2,     one(0xF087),            one(0xF1FF), "IdBW", mfloat | cfloat },
2548{"fbseq", 2,    one(0xF091),            one(0xF1FF), "IdBW", mfloat | cfloat },
2549{"fbsf", 2,     one(0xF090),            one(0xF1FF), "IdBW", mfloat | cfloat },
2550{"fbsne", 2,    one(0xF09E),            one(0xF1FF), "IdBW", mfloat | cfloat },
2551{"fbst", 2,     one(0xF09F),            one(0xF1FF), "IdBW", mfloat | cfloat },
2552{"fbt", 2,      one(0xF08F),            one(0xF1FF), "IdBW", mfloat | cfloat },
2553{"fbueq", 2,    one(0xF089),            one(0xF1FF), "IdBW", mfloat | cfloat },
2554{"fbuge", 2,    one(0xF08B),            one(0xF1FF), "IdBW", mfloat | cfloat },
2555{"fbugt", 2,    one(0xF08A),            one(0xF1FF), "IdBW", mfloat | cfloat },
2556{"fbule", 2,    one(0xF08D),            one(0xF1FF), "IdBW", mfloat | cfloat },
2557{"fbult", 2,    one(0xF08C),            one(0xF1FF), "IdBW", mfloat | cfloat },
2558{"fbun", 2,     one(0xF088),            one(0xF1FF), "IdBW", mfloat | cfloat },
2559
2560{"fbeql", 2,    one(0xF0C1),            one(0xF1FF), "IdBC", mfloat | cfloat },
2561{"fbfl", 2,     one(0xF0C0),            one(0xF1FF), "IdBC", mfloat | cfloat },
2562{"fbgel", 2,    one(0xF0D3),            one(0xF1FF), "IdBC", mfloat | cfloat },
2563{"fbgll", 2,    one(0xF0D6),            one(0xF1FF), "IdBC", mfloat | cfloat },
2564{"fbglel", 2,   one(0xF0D7),            one(0xF1FF), "IdBC", mfloat | cfloat },
2565{"fbgtl", 2,    one(0xF0D2),            one(0xF1FF), "IdBC", mfloat | cfloat },
2566{"fblel", 2,    one(0xF0D5),            one(0xF1FF), "IdBC", mfloat | cfloat },
2567{"fbltl", 2,    one(0xF0D4),            one(0xF1FF), "IdBC", mfloat | cfloat },
2568{"fbnel", 2,    one(0xF0CE),            one(0xF1FF), "IdBC", mfloat | cfloat },
2569{"fbngel", 2,   one(0xF0DC),            one(0xF1FF), "IdBC", mfloat | cfloat },
2570{"fbngll", 2,   one(0xF0D9),            one(0xF1FF), "IdBC", mfloat | cfloat },
2571{"fbnglel", 2,  one(0xF0D8),            one(0xF1FF), "IdBC", mfloat | cfloat },
2572{"fbngtl", 2,   one(0xF0DD),            one(0xF1FF), "IdBC", mfloat | cfloat },
2573{"fbnlel", 2,   one(0xF0DA),            one(0xF1FF), "IdBC", mfloat | cfloat },
2574{"fbnltl", 2,   one(0xF0DB),            one(0xF1FF), "IdBC", mfloat | cfloat },
2575{"fbogel", 2,   one(0xF0C3),            one(0xF1FF), "IdBC", mfloat | cfloat },
2576{"fbogll", 2,   one(0xF0C6),            one(0xF1FF), "IdBC", mfloat | cfloat },
2577{"fbogtl", 2,   one(0xF0C2),            one(0xF1FF), "IdBC", mfloat | cfloat },
2578{"fbolel", 2,   one(0xF0C5),            one(0xF1FF), "IdBC", mfloat | cfloat },
2579{"fboltl", 2,   one(0xF0C4),            one(0xF1FF), "IdBC", mfloat | cfloat },
2580{"fborl", 2,    one(0xF0C7),            one(0xF1FF), "IdBC", mfloat | cfloat },
2581{"fbseql", 2,   one(0xF0D1),            one(0xF1FF), "IdBC", mfloat | cfloat },
2582{"fbsfl", 2,    one(0xF0D0),            one(0xF1FF), "IdBC", mfloat | cfloat },
2583{"fbsnel", 2,   one(0xF0DE),            one(0xF1FF), "IdBC", mfloat | cfloat },
2584{"fbstl", 2,    one(0xF0DF),            one(0xF1FF), "IdBC", mfloat | cfloat },
2585{"fbtl", 2,     one(0xF0CF),            one(0xF1FF), "IdBC", mfloat | cfloat },
2586{"fbueql", 2,   one(0xF0C9),            one(0xF1FF), "IdBC", mfloat | cfloat },
2587{"fbugel", 2,   one(0xF0CB),            one(0xF1FF), "IdBC", mfloat | cfloat },
2588{"fbugtl", 2,   one(0xF0CA),            one(0xF1FF), "IdBC", mfloat | cfloat },
2589{"fbulel", 2,   one(0xF0CD),            one(0xF1FF), "IdBC", mfloat | cfloat },
2590{"fbultl", 2,   one(0xF0CC),            one(0xF1FF), "IdBC", mfloat | cfloat },
2591{"fbunl", 2,    one(0xF0C8),            one(0xF1FF), "IdBC", mfloat | cfloat },
2592
2593{"fjeq", 2,     one(0xF081),            one(0xF1BF), "IdBc", mfloat | cfloat },
2594{"fjf", 2,      one(0xF080),            one(0xF1BF), "IdBc", mfloat | cfloat },
2595{"fjge", 2,     one(0xF093),            one(0xF1BF), "IdBc", mfloat | cfloat },
2596{"fjgl", 2,     one(0xF096),            one(0xF1BF), "IdBc", mfloat | cfloat },
2597{"fjgle", 2,    one(0xF097),            one(0xF1BF), "IdBc", mfloat | cfloat },
2598{"fjgt", 2,     one(0xF092),            one(0xF1BF), "IdBc", mfloat | cfloat },
2599{"fjle", 2,     one(0xF095),            one(0xF1BF), "IdBc", mfloat | cfloat },
2600{"fjlt", 2,     one(0xF094),            one(0xF1BF), "IdBc", mfloat | cfloat },
2601{"fjne", 2,     one(0xF08E),            one(0xF1BF), "IdBc", mfloat | cfloat },
2602{"fjnge", 2,    one(0xF09C),            one(0xF1BF), "IdBc", mfloat | cfloat },
2603{"fjngl", 2,    one(0xF099),            one(0xF1BF), "IdBc", mfloat | cfloat },
2604{"fjngle", 2,   one(0xF098),            one(0xF1BF), "IdBc", mfloat | cfloat },
2605{"fjngt", 2,    one(0xF09D),            one(0xF1BF), "IdBc", mfloat | cfloat },
2606{"fjnle", 2,    one(0xF09A),            one(0xF1BF), "IdBc", mfloat | cfloat },
2607{"fjnlt", 2,    one(0xF09B),            one(0xF1BF), "IdBc", mfloat | cfloat },
2608{"fjoge", 2,    one(0xF083),            one(0xF1BF), "IdBc", mfloat | cfloat },
2609{"fjogl", 2,    one(0xF086),            one(0xF1BF), "IdBc", mfloat | cfloat },
2610{"fjogt", 2,    one(0xF082),            one(0xF1BF), "IdBc", mfloat | cfloat },
2611{"fjole", 2,    one(0xF085),            one(0xF1BF), "IdBc", mfloat | cfloat },
2612{"fjolt", 2,    one(0xF084),            one(0xF1BF), "IdBc", mfloat | cfloat },
2613{"fjor", 2,     one(0xF087),            one(0xF1BF), "IdBc", mfloat | cfloat },
2614{"fjseq", 2,    one(0xF091),            one(0xF1BF), "IdBc", mfloat | cfloat },
2615{"fjsf", 2,     one(0xF090),            one(0xF1BF), "IdBc", mfloat | cfloat },
2616{"fjsne", 2,    one(0xF09E),            one(0xF1BF), "IdBc", mfloat | cfloat },
2617{"fjst", 2,     one(0xF09F),            one(0xF1BF), "IdBc", mfloat | cfloat },
2618{"fjt", 2,      one(0xF08F),            one(0xF1BF), "IdBc", mfloat | cfloat },
2619{"fjueq", 2,    one(0xF089),            one(0xF1BF), "IdBc", mfloat | cfloat },
2620{"fjuge", 2,    one(0xF08B),            one(0xF1BF), "IdBc", mfloat | cfloat },
2621{"fjugt", 2,    one(0xF08A),            one(0xF1BF), "IdBc", mfloat | cfloat },
2622{"fjule", 2,    one(0xF08D),            one(0xF1BF), "IdBc", mfloat | cfloat },
2623{"fjult", 2,    one(0xF08C),            one(0xF1BF), "IdBc", mfloat | cfloat },
2624{"fjun", 2,     one(0xF088),            one(0xF1BF), "IdBc", mfloat | cfloat },
2625
2626{"fcmpb", 4,    two(0xF000, 0x5838), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2627{"fcmpb", 4,    two(0xF000, 0x5838), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2628{"fcmpd", 4,    two(0xF000, 0x5438), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2629{"fcmpd", 4,    two(0xF000, 0x5438), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2630{"fcmpd", 4,    two(0xF000, 0x0038), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2631{"fcmpl", 4,    two(0xF000, 0x4038), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2632{"fcmpl", 4,    two(0xF000, 0x4038), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2633{"fcmpp", 4,    two(0xF000, 0x4C38), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2634{"fcmps", 4,    two(0xF000, 0x4438), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2635{"fcmps", 4,    two(0xF000, 0x4438), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2636{"fcmpw", 4,    two(0xF000, 0x5038), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2637{"fcmpw", 4,    two(0xF000, 0x5038), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2638{"fcmpx", 4,    two(0xF000, 0x0038), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2639{"fcmpx", 4,    two(0xF000, 0x4838), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2640
2641{"fcosb", 4,    two(0xF000, 0x581D), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2642{"fcosd", 4,    two(0xF000, 0x541D), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2643{"fcosl", 4,    two(0xF000, 0x401D), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2644{"fcosp", 4,    two(0xF000, 0x4C1D), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2645{"fcoss", 4,    two(0xF000, 0x441D), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2646{"fcosw", 4,    two(0xF000, 0x501D), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2647{"fcosx", 4,    two(0xF000, 0x001D), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2648{"fcosx", 4,    two(0xF000, 0x481D), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2649{"fcosx", 4,    two(0xF000, 0x001D), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2650
2651{"fcoshb", 4,   two(0xF000, 0x5819), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2652{"fcoshd", 4,   two(0xF000, 0x5419), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2653{"fcoshl", 4,   two(0xF000, 0x4019), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2654{"fcoshp", 4,   two(0xF000, 0x4C19), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2655{"fcoshs", 4,   two(0xF000, 0x4419), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2656{"fcoshw", 4,   two(0xF000, 0x5019), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2657{"fcoshx", 4,   two(0xF000, 0x0019), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2658{"fcoshx", 4,   two(0xF000, 0x4819), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2659{"fcoshx", 4,   two(0xF000, 0x0019), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2660
2661{"fdbeq", 4,    two(0xF048, 0x0001), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2662{"fdbf", 4,     two(0xF048, 0x0000), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2663{"fdbge", 4,    two(0xF048, 0x0013), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2664{"fdbgl", 4,    two(0xF048, 0x0016), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2665{"fdbgle", 4,   two(0xF048, 0x0017), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2666{"fdbgt", 4,    two(0xF048, 0x0012), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2667{"fdble", 4,    two(0xF048, 0x0015), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2668{"fdblt", 4,    two(0xF048, 0x0014), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2669{"fdbne", 4,    two(0xF048, 0x000E), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2670{"fdbnge", 4,   two(0xF048, 0x001C), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2671{"fdbngl", 4,   two(0xF048, 0x0019), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2672{"fdbngle", 4,  two(0xF048, 0x0018), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2673{"fdbngt", 4,   two(0xF048, 0x001D), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2674{"fdbnle", 4,   two(0xF048, 0x001A), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2675{"fdbnlt", 4,   two(0xF048, 0x001B), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2676{"fdboge", 4,   two(0xF048, 0x0003), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2677{"fdbogl", 4,   two(0xF048, 0x0006), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2678{"fdbogt", 4,   two(0xF048, 0x0002), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2679{"fdbole", 4,   two(0xF048, 0x0005), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2680{"fdbolt", 4,   two(0xF048, 0x0004), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2681{"fdbor", 4,    two(0xF048, 0x0007), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2682{"fdbseq", 4,   two(0xF048, 0x0011), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2683{"fdbsf", 4,    two(0xF048, 0x0010), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2684{"fdbsne", 4,   two(0xF048, 0x001E), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2685{"fdbst", 4,    two(0xF048, 0x001F), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2686{"fdbt", 4,     two(0xF048, 0x000F), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2687{"fdbueq", 4,   two(0xF048, 0x0009), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2688{"fdbuge", 4,   two(0xF048, 0x000B), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2689{"fdbugt", 4,   two(0xF048, 0x000A), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2690{"fdbule", 4,   two(0xF048, 0x000D), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2691{"fdbult", 4,   two(0xF048, 0x000C), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2692{"fdbun", 4,    two(0xF048, 0x0008), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2693
2694{"fdivb", 4,    two(0xF000, 0x5820), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2695{"fdivb", 4,    two(0xF000, 0x5820), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2696{"fdivd", 4,    two(0xF000, 0x0020), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2697{"fdivd", 4,    two(0xF000, 0x5420), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2698{"fdivd", 4,    two(0xF000, 0x5420), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2699{"fdivl", 4,    two(0xF000, 0x4020), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2700{"fdivl", 4,    two(0xF000, 0x4020), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2701{"fdivp", 4,    two(0xF000, 0x4C20), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2702{"fdivs", 4,    two(0xF000, 0x4420), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2703{"fdivs", 4,    two(0xF000, 0x4420), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2704{"fdivw", 4,    two(0xF000, 0x5020), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2705{"fdivw", 4,    two(0xF000, 0x5020), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2706{"fdivx", 4,    two(0xF000, 0x0020), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2707{"fdivx", 4,    two(0xF000, 0x4820), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2708
2709{"fsdivb", 4,   two(0xF000, 0x5860), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
2710{"fsdivb", 4,   two(0xF000, 0x5860), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2711{"fsdivd", 4,   two(0xF000, 0x0060), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2712{"fsdivd", 4,   two(0xF000, 0x5460), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
2713{"fsdivd", 4,   two(0xF000, 0x5460), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2714{"fsdivl", 4,   two(0xF000, 0x4060), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
2715{"fsdivl", 4,   two(0xF000, 0x4060), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2716{"fsdivp", 4,   two(0xF000, 0x4C60), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
2717{"fsdivs", 4,   two(0xF000, 0x4460), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
2718{"fsdivs", 4,   two(0xF000, 0x4460), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2719{"fsdivw", 4,   two(0xF000, 0x5060), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
2720{"fsdivw", 4,   two(0xF000, 0x5060), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2721{"fsdivx", 4,   two(0xF000, 0x0060), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
2722{"fsdivx", 4,   two(0xF000, 0x4860), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
2723
2724{"fddivb", 4,   two(0xF000, 0x5864), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
2725{"fddivb", 4,   two(0xF000, 0x5864), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2726{"fddivd", 4,   two(0xF000, 0x0064), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2727{"fddivd", 4,   two(0xF000, 0x5464), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
2728{"fddivd", 4,   two(0xF000, 0x5464), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2729{"fddivl", 4,   two(0xF000, 0x4064), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
2730{"fddivl", 4,   two(0xF000, 0x4064), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2731{"fddivp", 4,   two(0xF000, 0x4C64), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
2732{"fddivs", 4,   two(0xF000, 0x4464), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
2733{"fddivs", 4,   two(0xF000, 0x4464), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2734{"fddivw", 4,   two(0xF000, 0x5064), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
2735{"fddivw", 4,   two(0xF000, 0x5064), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2736{"fddivx", 4,   two(0xF000, 0x0064), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
2737{"fddivx", 4,   two(0xF000, 0x4864), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
2738
2739{"fetoxb", 4,   two(0xF000, 0x5810), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2740{"fetoxd", 4,   two(0xF000, 0x5410), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2741{"fetoxl", 4,   two(0xF000, 0x4010), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2742{"fetoxp", 4,   two(0xF000, 0x4C10), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2743{"fetoxs", 4,   two(0xF000, 0x4410), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2744{"fetoxw", 4,   two(0xF000, 0x5010), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2745{"fetoxx", 4,   two(0xF000, 0x0010), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2746{"fetoxx", 4,   two(0xF000, 0x4810), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2747{"fetoxx", 4,   two(0xF000, 0x0010), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2748
2749{"fetoxm1b", 4, two(0xF000, 0x5808), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2750{"fetoxm1d", 4, two(0xF000, 0x5408), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2751{"fetoxm1l", 4, two(0xF000, 0x4008), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2752{"fetoxm1p", 4, two(0xF000, 0x4C08), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2753{"fetoxm1s", 4, two(0xF000, 0x4408), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2754{"fetoxm1w", 4, two(0xF000, 0x5008), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2755{"fetoxm1x", 4, two(0xF000, 0x0008), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2756{"fetoxm1x", 4, two(0xF000, 0x4808), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2757{"fetoxm1x", 4, two(0xF000, 0x0008), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2758
2759{"fgetexpb", 4, two(0xF000, 0x581E), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2760{"fgetexpd", 4, two(0xF000, 0x541E), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2761{"fgetexpl", 4, two(0xF000, 0x401E), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2762{"fgetexpp", 4, two(0xF000, 0x4C1E), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2763{"fgetexps", 4, two(0xF000, 0x441E), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2764{"fgetexpw", 4, two(0xF000, 0x501E), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2765{"fgetexpx", 4, two(0xF000, 0x001E), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2766{"fgetexpx", 4, two(0xF000, 0x481E), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2767{"fgetexpx", 4, two(0xF000, 0x001E), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2768
2769{"fgetmanb", 4, two(0xF000, 0x581F), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2770{"fgetmand", 4, two(0xF000, 0x541F), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2771{"fgetmanl", 4, two(0xF000, 0x401F), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2772{"fgetmanp", 4, two(0xF000, 0x4C1F), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2773{"fgetmans", 4, two(0xF000, 0x441F), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2774{"fgetmanw", 4, two(0xF000, 0x501F), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2775{"fgetmanx", 4, two(0xF000, 0x001F), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2776{"fgetmanx", 4, two(0xF000, 0x481F), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2777{"fgetmanx", 4, two(0xF000, 0x001F), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2778
2779{"fintb", 4,    two(0xF000, 0x5801), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2780{"fintb", 4,    two(0xF000, 0x5801), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2781{"fintd", 4,    two(0xF000, 0x0001), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2782{"fintd", 4,    two(0xF000, 0x0001), two(0xF1C0, 0xE07F), "IiFt", cfloat },
2783{"fintd", 4,    two(0xF000, 0x5401), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2784{"fintd", 4,    two(0xF000, 0x5401), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2785{"fintl", 4,    two(0xF000, 0x4001), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2786{"fintl", 4,    two(0xF000, 0x4001), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2787{"fintp", 4,    two(0xF000, 0x4C01), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2788{"fints", 4,    two(0xF000, 0x4401), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2789{"fints", 4,    two(0xF000, 0x4401), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2790{"fintw", 4,    two(0xF000, 0x5001), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2791{"fintw", 4,    two(0xF000, 0x5001), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2792{"fintx", 4,    two(0xF000, 0x0001), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2793{"fintx", 4,    two(0xF000, 0x4801), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2794{"fintx", 4,    two(0xF000, 0x0001), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2795
2796{"fintrzb", 4,  two(0xF000, 0x5803), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2797{"fintrzb", 4,  two(0xF000, 0x5803), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2798{"fintrzd", 4,  two(0xF000, 0x0003), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2799{"fintrzd", 4,  two(0xF000, 0x0003), two(0xF1C0, 0xE07F), "IiFt",   cfloat },
2800{"fintrzd", 4,  two(0xF000, 0x5403), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2801{"fintrzd", 4,  two(0xF000, 0x5403), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2802{"fintrzl", 4,  two(0xF000, 0x4003), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2803{"fintrzl", 4,  two(0xF000, 0x4003), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2804{"fintrzp", 4,  two(0xF000, 0x4C03), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2805{"fintrzs", 4,  two(0xF000, 0x4403), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2806{"fintrzs", 4,  two(0xF000, 0x4403), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2807{"fintrzw", 4,  two(0xF000, 0x5003), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2808{"fintrzw", 4,  two(0xF000, 0x5003), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2809{"fintrzx", 4,  two(0xF000, 0x0003), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2810{"fintrzx", 4,  two(0xF000, 0x4803), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2811{"fintrzx", 4,  two(0xF000, 0x0003), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2812
2813{"flog10b", 4,  two(0xF000, 0x5815), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2814{"flog10d", 4,  two(0xF000, 0x5415), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2815{"flog10l", 4,  two(0xF000, 0x4015), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2816{"flog10p", 4,  two(0xF000, 0x4C15), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2817{"flog10s", 4,  two(0xF000, 0x4415), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2818{"flog10w", 4,  two(0xF000, 0x5015), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2819{"flog10x", 4,  two(0xF000, 0x0015), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2820{"flog10x", 4,  two(0xF000, 0x4815), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2821{"flog10x", 4,  two(0xF000, 0x0015), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2822
2823{"flog2b", 4,   two(0xF000, 0x5816), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2824{"flog2d", 4,   two(0xF000, 0x5416), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2825{"flog2l", 4,   two(0xF000, 0x4016), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2826{"flog2p", 4,   two(0xF000, 0x4C16), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2827{"flog2s", 4,   two(0xF000, 0x4416), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2828{"flog2w", 4,   two(0xF000, 0x5016), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2829{"flog2x", 4,   two(0xF000, 0x0016), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2830{"flog2x", 4,   two(0xF000, 0x4816), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2831{"flog2x", 4,   two(0xF000, 0x0016), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2832
2833{"flognb", 4,   two(0xF000, 0x5814), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2834{"flognd", 4,   two(0xF000, 0x5414), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2835{"flognl", 4,   two(0xF000, 0x4014), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2836{"flognp", 4,   two(0xF000, 0x4C14), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2837{"flogns", 4,   two(0xF000, 0x4414), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2838{"flognw", 4,   two(0xF000, 0x5014), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2839{"flognx", 4,   two(0xF000, 0x0014), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2840{"flognx", 4,   two(0xF000, 0x4814), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2841{"flognx", 4,   two(0xF000, 0x0014), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2842
2843{"flognp1b", 4, two(0xF000, 0x5806), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2844{"flognp1d", 4, two(0xF000, 0x5406), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2845{"flognp1l", 4, two(0xF000, 0x4006), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2846{"flognp1p", 4, two(0xF000, 0x4C06), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2847{"flognp1s", 4, two(0xF000, 0x4406), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2848{"flognp1w", 4, two(0xF000, 0x5006), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2849{"flognp1x", 4, two(0xF000, 0x0006), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2850{"flognp1x", 4, two(0xF000, 0x4806), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2851{"flognp1x", 4, two(0xF000, 0x0006), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2852
2853{"fmodb", 4,    two(0xF000, 0x5821), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2854{"fmodd", 4,    two(0xF000, 0x5421), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2855{"fmodl", 4,    two(0xF000, 0x4021), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2856{"fmodp", 4,    two(0xF000, 0x4C21), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2857{"fmods", 4,    two(0xF000, 0x4421), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2858{"fmodw", 4,    two(0xF000, 0x5021), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2859{"fmodx", 4,    two(0xF000, 0x0021), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2860{"fmodx", 4,    two(0xF000, 0x4821), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2861
2862{"fmoveb", 4,   two(0xF000, 0x5800), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2863{"fmoveb", 4,   two(0xF000, 0x7800), two(0xF1C0, 0xFC7F), "IiF7bs", cfloat },
2864{"fmoveb", 4,   two(0xF000, 0x5800), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2865{"fmoveb", 4,   two(0xF000, 0x7800), two(0xF1C0, 0xFC7F), "IiF7$b", mfloat },
2866{"fmoved", 4,   two(0xF000, 0x5400), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2867{"fmoved", 4,   two(0xF000, 0x7400), two(0xF1C0, 0xFC7F), "IiF7~F", mfloat },
2868{"fmoved", 4,   two(0xF000, 0x0000), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2869{"fmoved", 4,   two(0xF000, 0x5400), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2870{"fmoved", 4,   two(0xF000, 0x7400), two(0xF1C0, 0xFC7F), "IiF7ws", cfloat },
2871{"fmovel", 4,   two(0xF000, 0x4000), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2872{"fmovel", 4,   two(0xF000, 0x6000), two(0xF1C0, 0xFC7F), "IiF7$l", mfloat },
2873/* FIXME: the next two variants should not permit moving an address
2874   register to anything but the floating point instruction register.  */
2875{"fmovel", 4,   two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat },
2876{"fmovel", 4,   two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*ls8", mfloat },
2877{"fmovel", 4,   two(0xF000, 0x4000), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2878{"fmovel", 4,   two(0xF000, 0x6000), two(0xF1C0, 0xFC7F), "IiF7bs", cfloat },
2879  /* Move the FP control registers.  */
2880{"fmovel", 4,   two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8ps", cfloat },
2881{"fmovel", 4,   two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Iibss8", cfloat },
2882{"fmovep", 4,   two(0xF000, 0x4C00), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2883{"fmovep", 4,   two(0xF000, 0x6C00), two(0xF1C0, 0xFC00), "IiF7~pkC", mfloat },
2884{"fmovep", 4,   two(0xF000, 0x7C00), two(0xF1C0, 0xFC0F), "IiF7~pDk", mfloat },
2885{"fmoves", 4,   two(0xF000, 0x4400), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2886{"fmoves", 4,   two(0xF000, 0x6400), two(0xF1C0, 0xFC7F), "IiF7$f", mfloat },
2887{"fmoves", 4,   two(0xF000, 0x4400), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2888{"fmoves", 4,   two(0xF000, 0x6400), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2889{"fmovew", 4,   two(0xF000, 0x5000), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2890{"fmovew", 4,   two(0xF000, 0x7000), two(0xF1C0, 0xFC7F), "IiF7$w", mfloat },
2891{"fmovew", 4,   two(0xF000, 0x5000), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2892{"fmovew", 4,   two(0xF000, 0x7000), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2893{"fmovex", 4,   two(0xF000, 0x0000), two(0xF1FF, 0xE07F), "IiF8F7", mfloat },
2894{"fmovex", 4,   two(0xF000, 0x4800), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2895{"fmovex", 4,   two(0xF000, 0x6800), two(0xF1C0, 0xFC7F), "IiF7~x", mfloat },
2896
2897{"fsmoveb", 4,  two(0xF000, 0x5840), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
2898{"fsmoveb", 4,  two(0xF000, 0x5840), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2899{"fsmoveb", 4,  two(0xF000, 0x7840), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2900{"fsmoved", 4,  two(0xF000, 0x0040), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2901{"fsmoved", 4,  two(0xF000, 0x5440), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
2902{"fsmoved", 4,  two(0xF000, 0x5440), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2903{"fsmoved", 4,  two(0xF000, 0x7440), two(0xF1C0, 0xFC7F), "IiF7ws", cfloat },
2904{"fsmovel", 4,  two(0xF000, 0x4040), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
2905{"fsmovel", 4,  two(0xF000, 0x4040), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2906{"fsmovel", 4,  two(0xF000, 0x6040), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2907{"fsmoves", 4,  two(0xF000, 0x4440), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
2908{"fsmoves", 4,  two(0xF000, 0x4440), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2909{"fsmoves", 4,  two(0xF000, 0x6440), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2910{"fsmovew", 4,  two(0xF000, 0x5040), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
2911{"fsmovew", 4,  two(0xF000, 0x5040), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2912{"fsmovew", 4,  two(0xF000, 0x7040), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2913{"fsmovex", 4,  two(0xF000, 0x0040), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
2914{"fsmovex", 4,  two(0xF000, 0x4840), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
2915{"fsmovep", 4,  two(0xF000, 0x4C40), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
2916
2917{"fdmoveb", 4,  two(0xF000, 0x5844), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
2918{"fdmoveb", 4,  two(0xF000, 0x5844), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2919{"fdmoveb", 4,  two(0xF000, 0x7844), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2920{"fdmoved", 4,  two(0xF000, 0x0044), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2921{"fdmoved", 4,  two(0xF000, 0x5444), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
2922{"fdmoved", 4,  two(0xF000, 0x5444), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2923{"fdmoved", 4,  two(0xF000, 0x7444), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2924{"fdmovel", 4,  two(0xF000, 0x4044), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
2925{"fdmovel", 4,  two(0xF000, 0x4044), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2926{"fdmovel", 4,  two(0xF000, 0x6044), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2927{"fdmoves", 4,  two(0xF000, 0x4444), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
2928{"fdmoves", 4,  two(0xF000, 0x4444), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2929{"fdmoves", 4,  two(0xF000, 0x6444), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2930{"fdmovew", 4,  two(0xF000, 0x5044), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
2931{"fdmovew", 4,  two(0xF000, 0x5044), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2932{"fdmovew", 4,  two(0xF000, 0x7044), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2933{"fdmovex", 4,  two(0xF000, 0x0044), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
2934{"fdmovex", 4,  two(0xF000, 0x4844), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
2935{"fdmovep", 4,  two(0xF000, 0x4C44), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
2936
2937{"fmovecrx", 4, two(0xF000, 0x5C00), two(0xF1FF, 0xFC00), "Ii#CF7", mfloat },
2938
2939{"fmovemd", 4,  two(0xF000, 0xD000), two(0xFFC0, 0xFF00), "Iizsl3", cfloat },
2940{"fmovemd", 4,  two(0xF000, 0xD000), two(0xFFC0, 0xFF00), "Iizs#3", cfloat },
2941{"fmovemd", 4,  two(0xF000, 0xF000), two(0xFFC0, 0xFF00), "Ii#3ys", cfloat },
2942{"fmovemd", 4,  two(0xF000, 0xF000), two(0xFFC0, 0xFF00), "Iil3ys", cfloat },
2943
2944{"fmovemx", 4,  two(0xF000, 0xF800), two(0xF1C0, 0xFF8F), "IiDk&s", mfloat },
2945{"fmovemx", 4,  two(0xF020, 0xE800), two(0xF1F8, 0xFF8F), "IiDk-s", mfloat },
2946{"fmovemx", 4,  two(0xF000, 0xD800), two(0xF1C0, 0xFF8F), "Ii&sDk", mfloat },
2947{"fmovemx", 4,  two(0xF018, 0xD800), two(0xF1F8, 0xFF8F), "Ii+sDk", mfloat },
2948{"fmovemx", 4,  two(0xF000, 0xF000), two(0xF1C0, 0xFF00), "Idl3&s", mfloat },
2949{"fmovemx", 4,  two(0xF000, 0xF000), two(0xF1C0, 0xFF00), "Id#3&s", mfloat },
2950{"fmovemx", 4,  two(0xF000, 0xD000), two(0xF1C0, 0xFF00), "Id&sl3", mfloat },
2951{"fmovemx", 4,  two(0xF000, 0xD000), two(0xF1C0, 0xFF00), "Id&s#3", mfloat },
2952{"fmovemx", 4,  two(0xF020, 0xE000), two(0xF1F8, 0xFF00), "IdL3-s", mfloat },
2953{"fmovemx", 4,  two(0xF020, 0xE000), two(0xF1F8, 0xFF00), "Id#3-s", mfloat },
2954{"fmovemx", 4,  two(0xF018, 0xD000), two(0xF1F8, 0xFF00), "Id+sl3", mfloat },
2955{"fmovemx", 4,  two(0xF018, 0xD000), two(0xF1F8, 0xFF00), "Id+s#3", mfloat },
2956
2957{"fmoveml", 4,  two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat },
2958{"fmoveml", 4,  two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "IiL8~s", mfloat },
2959/* FIXME: In the next instruction, we should only permit %dn if the
2960   target is a single register.  We should only permit %an if the
2961   target is a single %fpiar.  */
2962{"fmoveml", 4,  two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*lL8", mfloat },
2963
2964{"fmovem", 4,   two(0xF000, 0xD000), two(0xFFC0, 0xFF00), "IizsL3", cfloat },
2965{"fmovem", 4,   two(0xF000, 0xD000), two(0xFFC0, 0xFF00), "Iizs#3", cfloat },
2966{"fmovem", 4,   two(0xF000, 0xF000), two(0xFFC0, 0xFF00), "Ii#3ys", cfloat },
2967{"fmovem", 4,   two(0xF000, 0xF000), two(0xFFC0, 0xFF00), "IiL3ys", cfloat },
2968
2969{"fmovem", 4,   two(0xF020, 0xE000), two(0xF1F8, 0xFF00), "IdL3-s", mfloat },
2970{"fmovem", 4,   two(0xF000, 0xF000), two(0xF1C0, 0xFF00), "Idl3&s", mfloat },
2971{"fmovem", 4,   two(0xF018, 0xD000), two(0xF1F8, 0xFF00), "Id+sl3", mfloat },
2972{"fmovem", 4,   two(0xF000, 0xD000), two(0xF1C0, 0xFF00), "Id&sl3", mfloat },
2973{"fmovem", 4,   two(0xF020, 0xE000), two(0xF1F8, 0xFF00), "Id#3-s", mfloat },
2974{"fmovem", 4,   two(0xF020, 0xE800), two(0xF1F8, 0xFF8F), "IiDk-s", mfloat },
2975{"fmovem", 4,   two(0xF000, 0xF000), two(0xF1C0, 0xFF00), "Id#3&s", mfloat },
2976{"fmovem", 4,   two(0xF000, 0xF800), two(0xF1C0, 0xFF8F), "IiDk&s", mfloat },
2977{"fmovem", 4,   two(0xF018, 0xD000), two(0xF1F8, 0xFF00), "Id+s#3", mfloat },
2978{"fmovem", 4,   two(0xF018, 0xD800), two(0xF1F8, 0xFF8F), "Ii+sDk", mfloat },
2979{"fmovem", 4,   two(0xF000, 0xD000), two(0xF1C0, 0xFF00), "Id&s#3", mfloat },
2980{"fmovem", 4,   two(0xF000, 0xD800), two(0xF1C0, 0xFF8F), "Ii&sDk", mfloat },
2981{"fmovem", 4,   two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat },
2982{"fmovem", 4,   two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*ss8", mfloat },
2983{"fmovem", 4,   two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "IiL8~s", mfloat },
2984{"fmovem", 4,   two(0xF000, 0x8000), two(0xF2C0, 0xE3FF), "Ii*sL8", mfloat },
2985
2986{"fmulb", 4,    two(0xF000, 0x5823), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2987{"fmulb", 4,    two(0xF000, 0x5823), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2988{"fmuld", 4,    two(0xF000, 0x0023), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2989{"fmuld", 4,    two(0xF000, 0x5423), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2990{"fmuld", 4,    two(0xF000, 0x5423), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2991{"fmull", 4,    two(0xF000, 0x4023), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2992{"fmull", 4,    two(0xF000, 0x4023), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2993{"fmulp", 4,    two(0xF000, 0x4C23), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2994{"fmuls", 4,    two(0xF000, 0x4423), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2995{"fmuls", 4,    two(0xF000, 0x4423), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2996{"fmulw", 4,    two(0xF000, 0x5023), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2997{"fmulw", 4,    two(0xF000, 0x5023), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2998{"fmulx", 4,    two(0xF000, 0x0023), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2999{"fmulx", 4,    two(0xF000, 0x4823), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3000
3001{"fsmulb", 4,   two(0xF000, 0x5863), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3002{"fsmulb", 4,   two(0xF000, 0x5863), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3003{"fsmuld", 4,   two(0xF000, 0x0063), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3004{"fsmuld", 4,   two(0xF000, 0x5463), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3005{"fsmuld", 4,   two(0xF000, 0x5463), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3006{"fsmull", 4,   two(0xF000, 0x4063), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3007{"fsmull", 4,   two(0xF000, 0x4063), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3008{"fsmulp", 4,   two(0xF000, 0x4C63), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3009{"fsmuls", 4,   two(0xF000, 0x4463), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3010{"fsmuls", 4,   two(0xF000, 0x4463), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3011{"fsmulw", 4,   two(0xF000, 0x5063), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3012{"fsmulw", 4,   two(0xF000, 0x5063), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3013{"fsmulx", 4,   two(0xF000, 0x0063), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3014{"fsmulx", 4,   two(0xF000, 0x4863), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3015
3016{"fdmulb", 4,   two(0xF000, 0x5867), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3017{"fdmulb", 4,   two(0xF000, 0x5867), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3018{"fdmuld", 4,   two(0xF000, 0x0067), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3019{"fdmuld", 4,   two(0xF000, 0x5467), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3020{"fdmuld", 4,   two(0xF000, 0x5467), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3021{"fdmull", 4,   two(0xF000, 0x4067), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3022{"fdmull", 4,   two(0xF000, 0x4067), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3023{"fdmulp", 4,   two(0xF000, 0x4C67), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3024{"fdmuls", 4,   two(0xF000, 0x4467), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3025{"fdmuls", 4,   two(0xF000, 0x4467), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3026{"fdmulw", 4,   two(0xF000, 0x5067), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3027{"fdmulw", 4,   two(0xF000, 0x5067), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3028{"fdmulx", 4,   two(0xF000, 0x0067), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3029{"fdmulx", 4,   two(0xF000, 0x4867), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3030
3031{"fnegb", 4,    two(0xF000, 0x581A), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3032{"fnegb", 4,    two(0xF000, 0x581A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3033{"fnegd", 4,    two(0xF000, 0x001A), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3034{"fnegd", 4,    two(0xF000, 0x001A), two(0xF1C0, 0xE07F), "IiFt",   cfloat },
3035{"fnegd", 4,    two(0xF000, 0x541A), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3036{"fnegd", 4,    two(0xF000, 0x541A), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3037{"fnegl", 4,    two(0xF000, 0x401A), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3038{"fnegl", 4,    two(0xF000, 0x401A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3039{"fnegp", 4,    two(0xF000, 0x4C1A), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3040{"fnegs", 4,    two(0xF000, 0x441A), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3041{"fnegs", 4,    two(0xF000, 0x441A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3042{"fnegw", 4,    two(0xF000, 0x501A), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3043{"fnegw", 4,    two(0xF000, 0x501A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3044{"fnegx", 4,    two(0xF000, 0x001A), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3045{"fnegx", 4,    two(0xF000, 0x481A), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3046{"fnegx", 4,    two(0xF000, 0x001A), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3047
3048{"fsnegb", 4,   two(0xF000, 0x585A), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3049{"fsnegb", 4,   two(0xF000, 0x585A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3050{"fsnegd", 4,   two(0xF000, 0x005A), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3051{"fsnegd", 4,   two(0xF000, 0x005A), two(0xF1C0, 0xE07F), "IiFt",   cfloat },
3052{"fsnegd", 4,   two(0xF000, 0x545A), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3053{"fsnegd", 4,   two(0xF000, 0x545A), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3054{"fsnegl", 4,   two(0xF000, 0x405A), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3055{"fsnegl", 4,   two(0xF000, 0x405A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3056{"fsnegp", 4,   two(0xF000, 0x4C5A), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3057{"fsnegs", 4,   two(0xF000, 0x445A), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3058{"fsnegs", 4,   two(0xF000, 0x445A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3059{"fsnegw", 4,   two(0xF000, 0x505A), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3060{"fsnegw", 4,   two(0xF000, 0x505A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3061{"fsnegx", 4,   two(0xF000, 0x005A), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3062{"fsnegx", 4,   two(0xF000, 0x485A), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3063{"fsnegx", 4,   two(0xF000, 0x005A), two(0xF1C0, 0xE07F), "IiFt",   m68040up },
3064
3065{"fdnegb", 4,   two(0xF000, 0x585E), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3066{"fdnegb", 4,   two(0xF000, 0x585E), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3067{"fdnegd", 4,   two(0xF000, 0x005E), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3068{"fdnegd", 4,   two(0xF000, 0x005E), two(0xF1C0, 0xE07F), "IiFt",   cfloat },
3069{"fdnegd", 4,   two(0xF000, 0x545E), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3070{"fdnegd", 4,   two(0xF000, 0x545E), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3071{"fdnegl", 4,   two(0xF000, 0x405E), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3072{"fdnegl", 4,   two(0xF000, 0x405E), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3073{"fdnegp", 4,   two(0xF000, 0x4C5E), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3074{"fdnegs", 4,   two(0xF000, 0x445E), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3075{"fdnegs", 4,   two(0xF000, 0x445E), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3076{"fdnegw", 4,   two(0xF000, 0x505E), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3077{"fdnegw", 4,   two(0xF000, 0x505E), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3078{"fdnegx", 4,   two(0xF000, 0x005E), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3079{"fdnegx", 4,   two(0xF000, 0x485E), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3080{"fdnegx", 4,   two(0xF000, 0x005E), two(0xF1C0, 0xE07F), "IiFt",   m68040up },
3081
3082{"fnop", 4,     two(0xF280, 0x0000), two(0xFFFF, 0xFFFF), "Ii", mfloat | cfloat },
3083
3084{"fremb", 4,    two(0xF000, 0x5825), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3085{"fremd", 4,    two(0xF000, 0x5425), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3086{"freml", 4,    two(0xF000, 0x4025), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3087{"fremp", 4,    two(0xF000, 0x4C25), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3088{"frems", 4,    two(0xF000, 0x4425), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3089{"fremw", 4,    two(0xF000, 0x5025), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3090{"fremx", 4,    two(0xF000, 0x0025), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3091{"fremx", 4,    two(0xF000, 0x4825), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3092
3093{"frestore", 2, one(0xF140),            one(0xF1C0), "Id<s", mfloat },
3094{"frestore", 2, one(0xF140),            one(0xF1C0), "Idys", cfloat },
3095
3096{"fsave", 2,    one(0xF100),            one(0xF1C0), "Id>s", mfloat },
3097{"fsave", 2,    one(0xF100),            one(0xF1C0), "Idzs", cfloat },
3098
3099{"fscaleb", 4,  two(0xF000, 0x5826), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3100{"fscaled", 4,  two(0xF000, 0x5426), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3101{"fscalel", 4,  two(0xF000, 0x4026), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3102{"fscalep", 4,  two(0xF000, 0x4C26), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3103{"fscales", 4,  two(0xF000, 0x4426), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3104{"fscalew", 4,  two(0xF000, 0x5026), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3105{"fscalex", 4,  two(0xF000, 0x0026), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3106{"fscalex", 4,  two(0xF000, 0x4826), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3107
3108/* $ is necessary to prevent the assembler from using PC-relative.
3109   If @ were used, "label: fseq label" could produce "ftrapeq", 2,
3110   because "label" became "pc@label".  */
3111{"fseq", 4,     two(0xF040, 0x0001), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3112{"fsf", 4,      two(0xF040, 0x0000), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3113{"fsge", 4,     two(0xF040, 0x0013), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3114{"fsgl", 4,     two(0xF040, 0x0016), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3115{"fsgle", 4,    two(0xF040, 0x0017), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3116{"fsgt", 4,     two(0xF040, 0x0012), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3117{"fsle", 4,     two(0xF040, 0x0015), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3118{"fslt", 4,     two(0xF040, 0x0014), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3119{"fsne", 4,     two(0xF040, 0x000E), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3120{"fsnge", 4,    two(0xF040, 0x001C), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3121{"fsngl", 4,    two(0xF040, 0x0019), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3122{"fsngle", 4,   two(0xF040, 0x0018), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3123{"fsngt", 4,    two(0xF040, 0x001D), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3124{"fsnle", 4,    two(0xF040, 0x001A), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3125{"fsnlt", 4,    two(0xF040, 0x001B), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3126{"fsoge", 4,    two(0xF040, 0x0003), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3127{"fsogl", 4,    two(0xF040, 0x0006), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3128{"fsogt", 4,    two(0xF040, 0x0002), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3129{"fsole", 4,    two(0xF040, 0x0005), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3130{"fsolt", 4,    two(0xF040, 0x0004), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3131{"fsor", 4,     two(0xF040, 0x0007), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3132{"fsseq", 4,    two(0xF040, 0x0011), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3133{"fssf", 4,     two(0xF040, 0x0010), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3134{"fssne", 4,    two(0xF040, 0x001E), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3135{"fsst", 4,     two(0xF040, 0x001F), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3136{"fst", 4,      two(0xF040, 0x000F), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3137{"fsueq", 4,    two(0xF040, 0x0009), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3138{"fsuge", 4,    two(0xF040, 0x000B), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3139{"fsugt", 4,    two(0xF040, 0x000A), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3140{"fsule", 4,    two(0xF040, 0x000D), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3141{"fsult", 4,    two(0xF040, 0x000C), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3142{"fsun", 4,     two(0xF040, 0x0008), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3143
3144{"fsgldivb", 4, two(0xF000, 0x5824), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3145{"fsgldivd", 4, two(0xF000, 0x5424), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3146{"fsgldivl", 4, two(0xF000, 0x4024), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3147{"fsgldivp", 4, two(0xF000, 0x4C24), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3148{"fsgldivs", 4, two(0xF000, 0x4424), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3149{"fsgldivw", 4, two(0xF000, 0x5024), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3150{"fsgldivx", 4, two(0xF000, 0x0024), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3151{"fsgldivx", 4, two(0xF000, 0x4824), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3152{"fsgldivx", 4, two(0xF000, 0x0024), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3153
3154{"fsglmulb", 4, two(0xF000, 0x5827), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3155{"fsglmuld", 4, two(0xF000, 0x5427), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3156{"fsglmull", 4, two(0xF000, 0x4027), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3157{"fsglmulp", 4, two(0xF000, 0x4C27), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3158{"fsglmuls", 4, two(0xF000, 0x4427), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3159{"fsglmulw", 4, two(0xF000, 0x5027), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3160{"fsglmulx", 4, two(0xF000, 0x0027), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3161{"fsglmulx", 4, two(0xF000, 0x4827), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3162{"fsglmulx", 4, two(0xF000, 0x0027), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3163
3164{"fsinb", 4,    two(0xF000, 0x580E), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3165{"fsind", 4,    two(0xF000, 0x540E), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3166{"fsinl", 4,    two(0xF000, 0x400E), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3167{"fsinp", 4,    two(0xF000, 0x4C0E), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3168{"fsins", 4,    two(0xF000, 0x440E), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3169{"fsinw", 4,    two(0xF000, 0x500E), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3170{"fsinx", 4,    two(0xF000, 0x000E), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3171{"fsinx", 4,    two(0xF000, 0x480E), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3172{"fsinx", 4,    two(0xF000, 0x000E), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3173
3174{"fsincosb", 4, two(0xF000, 0x5830), two(0xF1C0, 0xFC78), "Ii;bF3F7", mfloat },
3175{"fsincosd", 4, two(0xF000, 0x5430), two(0xF1C0, 0xFC78), "Ii;FF3F7", mfloat },
3176{"fsincosl", 4, two(0xF000, 0x4030), two(0xF1C0, 0xFC78), "Ii;lF3F7", mfloat },
3177{"fsincosp", 4, two(0xF000, 0x4C30), two(0xF1C0, 0xFC78), "Ii;pF3F7", mfloat },
3178{"fsincoss", 4, two(0xF000, 0x4430), two(0xF1C0, 0xFC78), "Ii;fF3F7", mfloat },
3179{"fsincosw", 4, two(0xF000, 0x5030), two(0xF1C0, 0xFC78), "Ii;wF3F7", mfloat },
3180{"fsincosx", 4, two(0xF000, 0x0030), two(0xF1C0, 0xE078), "IiF8F3F7", mfloat },
3181{"fsincosx", 4, two(0xF000, 0x4830), two(0xF1C0, 0xFC78), "Ii;xF3F7", mfloat },
3182
3183{"fsinhb", 4,   two(0xF000, 0x5802), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3184{"fsinhd", 4,   two(0xF000, 0x5402), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3185{"fsinhl", 4,   two(0xF000, 0x4002), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3186{"fsinhp", 4,   two(0xF000, 0x4C02), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3187{"fsinhs", 4,   two(0xF000, 0x4402), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3188{"fsinhw", 4,   two(0xF000, 0x5002), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3189{"fsinhx", 4,   two(0xF000, 0x0002), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3190{"fsinhx", 4,   two(0xF000, 0x4802), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3191{"fsinhx", 4,   two(0xF000, 0x0002), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3192
3193{"fsqrtb", 4,   two(0xF000, 0x5804), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3194{"fsqrtb", 4,   two(0xF000, 0x5804), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3195{"fsqrtd", 4,   two(0xF000, 0x0004), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3196{"fsqrtd", 4,   two(0xF000, 0x0004), two(0xF1C0, 0xE07F), "IiFt",   cfloat },
3197{"fsqrtd", 4,   two(0xF000, 0x5404), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3198{"fsqrtd", 4,   two(0xF000, 0x5404), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3199{"fsqrtl", 4,   two(0xF000, 0x4004), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3200{"fsqrtl", 4,   two(0xF000, 0x4004), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3201{"fsqrtp", 4,   two(0xF000, 0x4C04), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3202{"fsqrts", 4,   two(0xF000, 0x4404), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3203{"fsqrts", 4,   two(0xF000, 0x4404), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3204{"fsqrtw", 4,   two(0xF000, 0x5004), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3205{"fsqrtw", 4,   two(0xF000, 0x5004), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3206{"fsqrtx", 4,   two(0xF000, 0x0004), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3207{"fsqrtx", 4,   two(0xF000, 0x4804), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3208{"fsqrtx", 4,   two(0xF000, 0x0004), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3209
3210{"fssqrtb", 4,  two(0xF000, 0x5841), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3211{"fssqrtb", 4,  two(0xF000, 0x5841), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3212{"fssqrtd", 4,  two(0xF000, 0x0041), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3213{"fssqrtd", 4,  two(0xF000, 0x0041), two(0xF1C0, 0xE07F), "IiFt",   cfloat },
3214{"fssqrtd", 4,  two(0xF000, 0x5441), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3215{"fssqrtd", 4,  two(0xF000, 0x5441), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3216{"fssqrtl", 4,  two(0xF000, 0x4041), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3217{"fssqrtl", 4,  two(0xF000, 0x4041), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3218{"fssqrtp", 4,  two(0xF000, 0x4C41), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3219{"fssqrts", 4,  two(0xF000, 0x4441), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3220{"fssqrts", 4,  two(0xF000, 0x4441), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3221{"fssqrtw", 4,  two(0xF000, 0x5041), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3222{"fssqrtw", 4,  two(0xF000, 0x5041), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3223{"fssqrtx", 4,  two(0xF000, 0x0041), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3224{"fssqrtx", 4,  two(0xF000, 0x4841), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3225{"fssqrtx", 4,  two(0xF000, 0x0041), two(0xF1C0, 0xE07F), "IiFt",   m68040up },
3226
3227{"fdsqrtb", 4,  two(0xF000, 0x5845), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3228{"fdsqrtb", 4,  two(0xF000, 0x5845), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3229{"fdsqrtd", 4,  two(0xF000, 0x0045), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3230{"fdsqrtd", 4,  two(0xF000, 0x0045), two(0xF1C0, 0xE07F), "IiFt",   cfloat },
3231{"fdsqrtd", 4,  two(0xF000, 0x5445), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3232{"fdsqrtl", 4,  two(0xF000, 0x4045), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3233{"fdsqrtl", 4,  two(0xF000, 0x4045), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3234{"fdsqrtp", 4,  two(0xF000, 0x4C45), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3235{"fdsqrts", 4,  two(0xF000, 0x4445), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3236{"fdsqrts", 4,  two(0xF000, 0x4445), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3237{"fdsqrtw", 4,  two(0xF000, 0x5045), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3238{"fdsqrtw", 4,  two(0xF000, 0x5045), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3239{"fdsqrtx", 4,  two(0xF000, 0x0045), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3240{"fdsqrtx", 4,  two(0xF000, 0x4845), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3241{"fdsqrtx", 4,  two(0xF000, 0x0045), two(0xF1C0, 0xE07F), "IiFt",   m68040up },
3242
3243{"fsubb", 4,    two(0xF000, 0x5828), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3244{"fsubb", 4,    two(0xF000, 0x5828), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3245{"fsubd", 4,    two(0xF000, 0x0028), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3246{"fsubd", 4,    two(0xF000, 0x5428), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3247{"fsubd", 4,    two(0xF000, 0x5428), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3248{"fsubl", 4,    two(0xF000, 0x4028), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3249{"fsubl", 4,    two(0xF000, 0x4028), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3250{"fsubp", 4,    two(0xF000, 0x4C28), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3251{"fsubs", 4,    two(0xF000, 0x4428), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3252{"fsubs", 4,    two(0xF000, 0x4428), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3253{"fsubw", 4,    two(0xF000, 0x5028), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3254{"fsubw", 4,    two(0xF000, 0x5028), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3255{"fsubx", 4,    two(0xF000, 0x0028), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3256{"fsubx", 4,    two(0xF000, 0x4828), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3257{"fsubx", 4,    two(0xF000, 0x0028), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3258
3259{"fssubb", 4,   two(0xF000, 0x5828), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3260{"fssubb", 4,   two(0xF000, 0x5868), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3261{"fssubd", 4,   two(0xF000, 0x0068), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3262{"fssubd", 4,   two(0xF000, 0x5468), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3263{"fssubd", 4,   two(0xF000, 0x5468), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3264{"fssubl", 4,   two(0xF000, 0x4068), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3265{"fssubl", 4,   two(0xF000, 0x4068), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3266{"fssubp", 4,   two(0xF000, 0x4C68), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3267{"fssubs", 4,   two(0xF000, 0x4468), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3268{"fssubs", 4,   two(0xF000, 0x4468), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3269{"fssubw", 4,   two(0xF000, 0x5068), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3270{"fssubw", 4,   two(0xF000, 0x5068), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3271{"fssubx", 4,   two(0xF000, 0x0068), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3272{"fssubx", 4,   two(0xF000, 0x4868), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3273{"fssubx", 4,   two(0xF000, 0x0068), two(0xF1C0, 0xE07F), "IiFt",   m68040up },
3274
3275{"fdsubb", 4,   two(0xF000, 0x586A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3276{"fdsubb", 4,   two(0xF000, 0x586c), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3277{"fdsubd", 4,   two(0xF000, 0x006A), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3278{"fdsubd", 4,   two(0xF000, 0x546A), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3279{"fdsubd", 4,   two(0xF000, 0x546c), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3280{"fdsubl", 4,   two(0xF000, 0x406A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3281{"fdsubl", 4,   two(0xF000, 0x406c), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3282{"fdsubp", 4,   two(0xF000, 0x4C6c), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3283{"fdsubs", 4,   two(0xF000, 0x446A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3284{"fdsubs", 4,   two(0xF000, 0x446c), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3285{"fdsubw", 4,   two(0xF000, 0x506A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3286{"fdsubw", 4,   two(0xF000, 0x506c), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3287{"fdsubx", 4,   two(0xF000, 0x006c), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3288{"fdsubx", 4,   two(0xF000, 0x486c), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3289{"fdsubx", 4,   two(0xF000, 0x006c), two(0xF1C0, 0xE07F), "IiFt",   m68040up },
3290
3291{"ftanb", 4,    two(0xF000, 0x580F), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3292{"ftand", 4,    two(0xF000, 0x540F), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3293{"ftanl", 4,    two(0xF000, 0x400F), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3294{"ftanp", 4,    two(0xF000, 0x4C0F), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3295{"ftans", 4,    two(0xF000, 0x440F), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3296{"ftanw", 4,    two(0xF000, 0x500F), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3297{"ftanx", 4,    two(0xF000, 0x000F), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3298{"ftanx", 4,    two(0xF000, 0x480F), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3299{"ftanx", 4,    two(0xF000, 0x000F), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3300
3301{"ftanhb", 4,   two(0xF000, 0x5809), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3302{"ftanhd", 4,   two(0xF000, 0x5409), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3303{"ftanhl", 4,   two(0xF000, 0x4009), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3304{"ftanhp", 4,   two(0xF000, 0x4C09), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3305{"ftanhs", 4,   two(0xF000, 0x4409), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3306{"ftanhw", 4,   two(0xF000, 0x5009), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3307{"ftanhx", 4,   two(0xF000, 0x0009), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3308{"ftanhx", 4,   two(0xF000, 0x4809), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3309{"ftanhx", 4,   two(0xF000, 0x0009), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3310
3311{"ftentoxb", 4, two(0xF000, 0x5812), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3312{"ftentoxd", 4, two(0xF000, 0x5412), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3313{"ftentoxl", 4, two(0xF000, 0x4012), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3314{"ftentoxp", 4, two(0xF000, 0x4C12), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3315{"ftentoxs", 4, two(0xF000, 0x4412), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3316{"ftentoxw", 4, two(0xF000, 0x5012), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3317{"ftentoxx", 4, two(0xF000, 0x0012), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3318{"ftentoxx", 4, two(0xF000, 0x4812), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3319{"ftentoxx", 4, two(0xF000, 0x0012), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3320
3321{"ftrapeq", 4,  two(0xF07C, 0x0001), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3322{"ftrapf", 4,   two(0xF07C, 0x0000), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3323{"ftrapge", 4,  two(0xF07C, 0x0013), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3324{"ftrapgl", 4,  two(0xF07C, 0x0016), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3325{"ftrapgle", 4, two(0xF07C, 0x0017), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3326{"ftrapgt", 4,  two(0xF07C, 0x0012), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3327{"ftraple", 4,  two(0xF07C, 0x0015), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3328{"ftraplt", 4,  two(0xF07C, 0x0014), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3329{"ftrapne", 4,  two(0xF07C, 0x000E), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3330{"ftrapnge", 4, two(0xF07C, 0x001C), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3331{"ftrapngl", 4, two(0xF07C, 0x0019), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3332{"ftrapngle", 4,two(0xF07C, 0x0018), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3333{"ftrapngt", 4, two(0xF07C, 0x001D), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3334{"ftrapnle", 4, two(0xF07C, 0x001A), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3335{"ftrapnlt", 4, two(0xF07C, 0x001B), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3336{"ftrapoge", 4, two(0xF07C, 0x0003), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3337{"ftrapogl", 4, two(0xF07C, 0x0006), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3338{"ftrapogt", 4, two(0xF07C, 0x0002), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3339{"ftrapole", 4, two(0xF07C, 0x0005), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3340{"ftrapolt", 4, two(0xF07C, 0x0004), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3341{"ftrapor", 4,  two(0xF07C, 0x0007), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3342{"ftrapseq", 4, two(0xF07C, 0x0011), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3343{"ftrapsf", 4,  two(0xF07C, 0x0010), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3344{"ftrapsne", 4, two(0xF07C, 0x001E), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3345{"ftrapst", 4,  two(0xF07C, 0x001F), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3346{"ftrapt", 4,   two(0xF07C, 0x000F), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3347{"ftrapueq", 4, two(0xF07C, 0x0009), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3348{"ftrapuge", 4, two(0xF07C, 0x000B), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3349{"ftrapugt", 4, two(0xF07C, 0x000A), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3350{"ftrapule", 4, two(0xF07C, 0x000D), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3351{"ftrapult", 4, two(0xF07C, 0x000C), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3352{"ftrapun", 4,  two(0xF07C, 0x0008), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3353
3354{"ftrapeqw", 4, two(0xF07A, 0x0001), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3355{"ftrapfw", 4,  two(0xF07A, 0x0000), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3356{"ftrapgew", 4, two(0xF07A, 0x0013), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3357{"ftrapglw", 4, two(0xF07A, 0x0016), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3358{"ftrapglew", 4,two(0xF07A, 0x0017), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3359{"ftrapgtw", 4, two(0xF07A, 0x0012), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3360{"ftraplew", 4, two(0xF07A, 0x0015), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3361{"ftrapltw", 4, two(0xF07A, 0x0014), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3362{"ftrapnew", 4, two(0xF07A, 0x000E), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3363{"ftrapngew", 4,two(0xF07A, 0x001C), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3364{"ftrapnglw", 4,two(0xF07A, 0x0019), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3365{"ftrapnglew", 4,two(0xF07A, 0x0018), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3366{"ftrapngtw", 4,two(0xF07A, 0x001D), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3367{"ftrapnlew", 4,two(0xF07A, 0x001A), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3368{"ftrapnltw", 4,two(0xF07A, 0x001B), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3369{"ftrapogew", 4,two(0xF07A, 0x0003), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3370{"ftrapoglw", 4,two(0xF07A, 0x0006), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3371{"ftrapogtw", 4,two(0xF07A, 0x0002), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3372{"ftrapolew", 4,two(0xF07A, 0x0005), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3373{"ftrapoltw", 4,two(0xF07A, 0x0004), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3374{"ftraporw", 4, two(0xF07A, 0x0007), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3375{"ftrapseqw", 4,two(0xF07A, 0x0011), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3376{"ftrapsfw", 4, two(0xF07A, 0x0010), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3377{"ftrapsnew", 4,two(0xF07A, 0x001E), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3378{"ftrapstw", 4, two(0xF07A, 0x001F), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3379{"ftraptw", 4,  two(0xF07A, 0x000F), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3380{"ftrapueqw", 4,two(0xF07A, 0x0009), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3381{"ftrapugew", 4,two(0xF07A, 0x000B), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3382{"ftrapugtw", 4,two(0xF07A, 0x000A), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3383{"ftrapulew", 4,two(0xF07A, 0x000D), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3384{"ftrapultw", 4,two(0xF07A, 0x000C), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3385{"ftrapunw", 4, two(0xF07A, 0x0008), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3386
3387{"ftrapeql", 4, two(0xF07B, 0x0001), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3388{"ftrapfl", 4,  two(0xF07B, 0x0000), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3389{"ftrapgel", 4, two(0xF07B, 0x0013), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3390{"ftrapgll", 4, two(0xF07B, 0x0016), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3391{"ftrapglel", 4,two(0xF07B, 0x0017), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3392{"ftrapgtl", 4, two(0xF07B, 0x0012), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3393{"ftraplel", 4, two(0xF07B, 0x0015), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3394{"ftrapltl", 4, two(0xF07B, 0x0014), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3395{"ftrapnel", 4, two(0xF07B, 0x000E), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3396{"ftrapngel", 4,two(0xF07B, 0x001C), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3397{"ftrapngll", 4,two(0xF07B, 0x0019), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3398{"ftrapnglel", 4,two(0xF07B, 0x0018), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3399{"ftrapngtl", 4,two(0xF07B, 0x001D), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3400{"ftrapnlel", 4,two(0xF07B, 0x001A), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3401{"ftrapnltl", 4,two(0xF07B, 0x001B), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3402{"ftrapogel", 4,two(0xF07B, 0x0003), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3403{"ftrapogll", 4,two(0xF07B, 0x0006), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3404{"ftrapogtl", 4,two(0xF07B, 0x0002), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3405{"ftrapolel", 4,two(0xF07B, 0x0005), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3406{"ftrapoltl", 4,two(0xF07B, 0x0004), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3407{"ftraporl", 4, two(0xF07B, 0x0007), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3408{"ftrapseql", 4,two(0xF07B, 0x0011), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3409{"ftrapsfl", 4, two(0xF07B, 0x0010), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3410{"ftrapsnel", 4,two(0xF07B, 0x001E), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3411{"ftrapstl", 4, two(0xF07B, 0x001F), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3412{"ftraptl", 4,  two(0xF07B, 0x000F), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3413{"ftrapueql", 4,two(0xF07B, 0x0009), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3414{"ftrapugel", 4,two(0xF07B, 0x000B), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3415{"ftrapugtl", 4,two(0xF07B, 0x000A), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3416{"ftrapulel", 4,two(0xF07B, 0x000D), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3417{"ftrapultl", 4,two(0xF07B, 0x000C), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3418{"ftrapunl", 4, two(0xF07B, 0x0008), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3419
3420{"ftstb", 4,    two(0xF000, 0x583A), two(0xF1C0, 0xFC7F), "Ii;b", mfloat },
3421{"ftstb", 4,    two(0xF000, 0x583A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
3422{"ftstd", 4,    two(0xF000, 0x003A), two(0xF1C0, 0xE07F), "IiF8", cfloat },
3423{"ftstd", 4,    two(0xF000, 0x543A), two(0xF1C0, 0xFC7F), "Ii;F", mfloat },
3424{"ftstd", 4,    two(0xF000, 0x543A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
3425{"ftstl", 4,    two(0xF000, 0x403A), two(0xF1C0, 0xFC7F), "Ii;l", mfloat },
3426{"ftstl", 4,    two(0xF000, 0x403A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
3427{"ftstp", 4,    two(0xF000, 0x4C3A), two(0xF1C0, 0xFC7F), "Ii;p", mfloat },
3428{"ftsts", 4,    two(0xF000, 0x443A), two(0xF1C0, 0xFC7F), "Ii;f", mfloat },
3429{"ftsts", 4,    two(0xF000, 0x443A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
3430{"ftstw", 4,    two(0xF000, 0x503A), two(0xF1C0, 0xFC7F), "Ii;w", mfloat },
3431{"ftstw", 4,    two(0xF000, 0x503A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
3432{"ftstx", 4,    two(0xF000, 0x003A), two(0xF1C0, 0xE07F), "IiF8", mfloat },
3433{"ftstx", 4,    two(0xF000, 0x483A), two(0xF1C0, 0xFC7F), "Ii;x", mfloat },
3434
3435{"ftwotoxb", 4, two(0xF000, 0x5811), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3436{"ftwotoxd", 4, two(0xF000, 0x5411), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3437{"ftwotoxl", 4, two(0xF000, 0x4011), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3438{"ftwotoxp", 4, two(0xF000, 0x4C11), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3439{"ftwotoxs", 4, two(0xF000, 0x4411), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3440{"ftwotoxw", 4, two(0xF000, 0x5011), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3441{"ftwotoxx", 4, two(0xF000, 0x0011), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3442{"ftwotoxx", 4, two(0xF000, 0x4811), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3443{"ftwotoxx", 4, two(0xF000, 0x0011), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3444
3445{"halt", 2,     one(0045310),   one(0177777), "",     m68060 | mcfisa_a },
3446
3447{"illegal", 2,  one(0045374),   one(0177777), "",     m68000up | mcfisa_a },
3448{"intouch", 2,  one(0xf428),    one(0xfff8), "As",    mcfisa_b },
3449
3450{"jmp", 2,      one(0047300),   one(0177700), "!s", m68000up | mcfisa_a },
3451
3452{"jra", 2,      one(0060000),   one(0177400), "Bg", m68000up | mcfisa_a },
3453{"jra", 2,      one(0047300),   one(0177700), "!s", m68000up | mcfisa_a },
3454
3455{"jsr", 2,      one(0047200),   one(0177700), "!s", m68000up | mcfisa_a },
3456
3457{"jbsr", 2,     one(0060400),   one(0177400), "Bg", m68000up | mcfisa_a },
3458{"jbsr", 2,     one(0047200),   one(0177700), "!s", m68000up | mcfisa_a },
3459
3460{"lea", 2,      one(0040700),   one(0170700), "!sAd", m68000up | mcfisa_a },
3461
3462{"lpstop", 6,   two(0174000,0000700),two(0177777,0177777),"#w", cpu32|m68060 },
3463
3464{"linkw", 4,    one(0047120),   one(0177770), "As#w", m68000up | mcfisa_a },
3465{"linkl", 6,    one(0044010),   one(0177770), "As#l", m68020up | cpu32 },
3466{"link", 4,     one(0047120),   one(0177770), "As#W", m68000up | mcfisa_a },
3467{"link", 6,     one(0044010),   one(0177770), "As#l", m68020up | cpu32 },
3468
3469{"lslb", 2,     one(0160410),   one(0170770), "QdDs", m68000up },
3470{"lslb", 2,     one(0160450),   one(0170770), "DdDs", m68000up },
3471{"lslw", 2,     one(0160510),   one(0170770), "QdDs", m68000up },
3472{"lslw", 2,     one(0160550),   one(0170770), "DdDs", m68000up },
3473{"lslw", 2,     one(0161700),   one(0177700), "~s",   m68000up },
3474{"lsll", 2,     one(0160610),   one(0170770), "QdDs", m68000up | mcfisa_a },
3475{"lsll", 2,     one(0160650),   one(0170770), "DdDs", m68000up | mcfisa_a },
3476
3477{"lsrb", 2,     one(0160010),   one(0170770), "QdDs", m68000up },
3478{"lsrb", 2,     one(0160050),   one(0170770), "DdDs", m68000up },
3479{"lsrw", 2,     one(0160110),   one(0170770), "QdDs", m68000up },
3480{"lsrw", 2,     one(0160150),   one(0170770), "DdDs", m68000up },
3481{"lsrw", 2,     one(0161300),   one(0177700), "~s",   m68000up },
3482{"lsrl", 2,     one(0160210),   one(0170770), "QdDs", m68000up | mcfisa_a },
3483{"lsrl", 2,     one(0160250),   one(0170770), "DdDs", m68000up | mcfisa_a },
3484
3485{"macw", 4,     two(0xa080, 0x0000), two(0xf180, 0x0910), "uNuoiI4/Rn", mcfmac },
3486{"macw", 4,     two(0xa080, 0x0200), two(0xf180, 0x0910), "uNuoMh4/Rn", mcfmac },
3487{"macw", 4,     two(0xa080, 0x0000), two(0xf180, 0x0f10), "uNuo4/Rn", mcfmac },
3488{"macw", 4,     two(0xa000, 0x0000), two(0xf1b0, 0x0900), "uMumiI", mcfmac },
3489{"macw", 4,     two(0xa000, 0x0200), two(0xf1b0, 0x0900), "uMumMh", mcfmac },
3490{"macw", 4,     two(0xa000, 0x0000), two(0xf1b0, 0x0f00), "uMum", mcfmac },
3491
3492{"macw", 4,     two(0xa000, 0x0000), two(0xf100, 0x0900), "uNuoiI4/RneG", mcfemac },/* Ry,Rx,SF,<ea>,accX.  */
3493{"macw", 4,     two(0xa000, 0x0200), two(0xf100, 0x0900), "uNuoMh4/RneG", mcfemac },/* Ry,Rx,+1/-1,<ea>,accX.  */
3494{"macw", 4,     two(0xa000, 0x0000), two(0xf100, 0x0f00), "uNuo4/RneG", mcfemac },/* Ry,Rx,<ea>,accX.  */
3495{"macw", 4,     two(0xa000, 0x0000), two(0xf130, 0x0900), "uMumiIeH", mcfemac },/* Ry,Rx,SF,accX.  */
3496{"macw", 4,     two(0xa000, 0x0200), two(0xf130, 0x0900), "uMumMheH", mcfemac },/* Ry,Rx,+1/-1,accX.  */
3497{"macw", 4,     two(0xa000, 0x0000), two(0xf130, 0x0f00), "uMumeH", mcfemac }, /* Ry,Rx,accX.  */
3498
3499{"macl", 4,     two(0xa080, 0x0800), two(0xf180, 0x0910), "RNRoiI4/Rn", mcfmac },
3500{"macl", 4,     two(0xa080, 0x0a00), two(0xf180, 0x0910), "RNRoMh4/Rn", mcfmac },
3501{"macl", 4,     two(0xa080, 0x0800), two(0xf180, 0x0f10), "RNRo4/Rn", mcfmac },
3502{"macl", 4,     two(0xa000, 0x0800), two(0xf1b0, 0x0b00), "RMRmiI", mcfmac },
3503{"macl", 4,     two(0xa000, 0x0a00), two(0xf1b0, 0x0b00), "RMRmMh", mcfmac },
3504{"macl", 4,     two(0xa000, 0x0800), two(0xf1b0, 0x0800), "RMRm", mcfmac },
3505
3506{"macl", 4,     two(0xa000, 0x0800), two(0xf100, 0x0900), "R3R1iI4/RneG", mcfemac },
3507{"macl", 4,     two(0xa000, 0x0a00), two(0xf100, 0x0900), "R3R1Mh4/RneG", mcfemac },
3508{"macl", 4,     two(0xa000, 0x0800), two(0xf100, 0x0f00), "R3R14/RneG", mcfemac },
3509{"macl", 4,     two(0xa000, 0x0800), two(0xf130, 0x0900), "RMRmiIeH", mcfemac },
3510{"macl", 4,     two(0xa000, 0x0a00), two(0xf130, 0x0900), "RMRmMheH", mcfemac },
3511{"macl", 4,     two(0xa000, 0x0800), two(0xf130, 0x0f00), "RMRmeH", mcfemac },
3512
3513/* NOTE: The mcf5200 family programmer's reference manual does not
3514   indicate the byte form of the movea instruction is invalid (as it
3515   is on 68000 family cpus).  However, experiments on the 5202 yeild
3516   unexpected results.  The value is copied, but it is not sign extended
3517   (as is done with movea.w) and the top three bytes in the address
3518   register are not disturbed.  I don't know if this is the intended
3519   behavior --- it could be a hole in instruction decoding (Motorola
3520   decided not to trap all invalid instructions for performance reasons)
3521   --- but I suspect that it is not.
3522
3523   I reported this to Motorola ISD Technical Communications Support,
3524   which replied that other coldfire assemblers reject movea.b.  For
3525   this reason I've decided to not allow moveab.
3526
3527        jtc@cygnus.com - 97/01/24.  */
3528
3529{"moveal", 2,   one(0020100),   one(0170700), "*lAd", m68000up | mcfisa_a },
3530{"moveaw", 2,   one(0030100),   one(0170700), "*wAd", m68000up | mcfisa_a },
3531
3532{"movclrl", 2,  one(0xA1C0),    one(0xf9f0), "eFRs", mcfemac },
3533
3534{"movec", 4,    one(0047173),   one(0177777), "R1Jj", m68010up | mcfisa_a },
3535{"movec", 4,    one(0047173),   one(0177777), "R1#j", m68010up | mcfisa_a },
3536{"movec", 4,    one(0047172),   one(0177777), "JjR1", m68010up },
3537{"movec", 4,    one(0047172),   one(0177777), "#jR1", m68010up },
3538
3539{"movemw", 4,   one(0044200),   one(0177700), "Lw&s", m68000up },
3540{"movemw", 4,   one(0044240),   one(0177770), "lw-s", m68000up },
3541{"movemw", 4,   one(0044200),   one(0177700), "#w>s", m68000up },
3542{"movemw", 4,   one(0046200),   one(0177700), "<sLw", m68000up },
3543{"movemw", 4,   one(0046200),   one(0177700), "<s#w", m68000up },
3544{"moveml", 4,   one(0044300),   one(0177700), "Lw&s", m68000up },
3545{"moveml", 4,   one(0044340),   one(0177770), "lw-s", m68000up },
3546{"moveml", 4,   one(0044300),   one(0177700), "#w>s", m68000up },
3547{"moveml", 4,   one(0046300),   one(0177700), "<sLw", m68000up },
3548{"moveml", 4,   one(0046300),   one(0177700), "<s#w", m68000up },
3549/* FIXME: need specifier for mode 2 and 5 to simplify below insn patterns.  */
3550{"moveml", 4,   one(0044320),   one(0177770), "Lwas", mcfisa_a },
3551{"moveml", 4,   one(0044320),   one(0177770), "#was", mcfisa_a },
3552{"moveml", 4,   one(0044350),   one(0177770), "Lwds", mcfisa_a },
3553{"moveml", 4,   one(0044350),   one(0177770), "#wds", mcfisa_a },
3554{"moveml", 4,   one(0046320),   one(0177770), "asLw", mcfisa_a },
3555{"moveml", 4,   one(0046320),   one(0177770), "as#w", mcfisa_a },
3556{"moveml", 4,   one(0046350),   one(0177770), "dsLw", mcfisa_a },
3557{"moveml", 4,   one(0046350),   one(0177770), "ds#w", mcfisa_a },
3558
3559{"movepw", 2,   one(0000410),   one(0170770), "dsDd", m68000up },
3560{"movepw", 2,   one(0000610),   one(0170770), "Ddds", m68000up },
3561{"movepl", 2,   one(0000510),   one(0170770), "dsDd", m68000up },
3562{"movepl", 2,   one(0000710),   one(0170770), "Ddds", m68000up },
3563
3564{"moveq", 2,    one(0070000),   one(0170400), "MsDd", m68000up | mcfisa_a },
3565{"moveq", 2,    one(0070000),   one(0170400), "#BDd", m68000up | mcfisa_a },
3566
3567/* The move opcode can generate the movea and moveq instructions.  */
3568{"moveb", 2,    one(0010000),   one(0170000), ";b$d", m68000up },
3569{"moveb", 2,    one(0010000),   one(0170070), "Ds$d", mcfisa_a },
3570{"moveb", 2,    one(0010020),   one(0170070), "as$d", mcfisa_a },
3571{"moveb", 2,    one(0010030),   one(0170070), "+s$d", mcfisa_a },
3572{"moveb", 2,    one(0010040),   one(0170070), "-s$d", mcfisa_a },
3573{"moveb", 2,    one(0010000),   one(0170000), "nsqd", mcfisa_a },
3574{"moveb", 2,    one(0010000),   one(0170700), "obDd", mcfisa_a },
3575{"moveb", 2,    one(0010200),   one(0170700), "obad", mcfisa_a },
3576{"moveb", 2,    one(0010300),   one(0170700), "ob+d", mcfisa_a },
3577{"moveb", 2,    one(0010400),   one(0170700), "ob-d", mcfisa_a },
3578{"moveb", 2,    one(0010000),   one(0170000), "obnd", mcfisa_b },
3579
3580{"movew", 2,    one(0030000),   one(0170000), "*w%d", m68000up },
3581{"movew", 2,    one(0030000),   one(0170000), "ms%d", mcfisa_a },
3582{"movew", 2,    one(0030000),   one(0170000), "nspd", mcfisa_a },
3583{"movew", 2,    one(0030000),   one(0170000), "owmd", mcfisa_a },
3584{"movew", 2,    one(0030000),   one(0170000), "ownd", mcfisa_b },
3585{"movew", 2,    one(0040300),   one(0177700), "Ss$s", m68000up },
3586{"movew", 2,    one(0040300),   one(0177770), "SsDs", mcfisa_a },
3587{"movew", 2,    one(0041300),   one(0177700), "Cs$s", m68010up },
3588{"movew", 2,    one(0041300),   one(0177770), "CsDs", mcfisa_a },
3589{"movew", 2,    one(0042300),   one(0177700), ";wCd", m68000up },
3590{"movew", 2,    one(0042300),   one(0177700), "DsCd", mcfisa_a },
3591{"movew", 4,    one(0042374),   one(0177777), "#wCd", mcfisa_a },
3592{"movew", 2,    one(0043300),   one(0177700), ";wSd", m68000up },
3593{"movew", 2,    one(0043300),   one(0177700), "DsSd", mcfisa_a },
3594{"movew", 4,    one(0043374),   one(0177777), "#wSd", mcfisa_a },
3595
3596{"movel", 2,    one(0070000),   one(0170400), "MsDd", m68000up | mcfisa_a },
3597{"movel", 2,    one(0020000),   one(0170000), "*l%d", m68000up },
3598{"movel", 2,    one(0020000),   one(0170000), "ms%d", mcfisa_a },
3599{"movel", 2,    one(0020000),   one(0170000), "nspd", mcfisa_a },
3600{"movel", 2,    one(0020000),   one(0170000), "olmd", mcfisa_a },
3601{"movel", 2,    one(0020000),   one(0170000), "olnd", mcfisa_b },
3602{"movel", 2,    one(0047140),   one(0177770), "AsUd", m68000up | mcfusp },
3603{"movel", 2,    one(0047150),   one(0177770), "UdAs", m68000up | mcfusp },
3604{"movel", 2,    one(0120600),   one(0177760), "EsRs", mcfmac },
3605{"movel", 2,    one(0120400),   one(0177760), "RsEs", mcfmac },
3606{"movel", 6,    one(0120474),   one(0177777), "#lEs", mcfmac },
3607{"movel", 2,    one(0124600),   one(0177760), "GsRs", mcfmac },
3608{"movel", 2,    one(0124400),   one(0177760), "RsGs", mcfmac },
3609{"movel", 6,    one(0124474),   one(0177777), "#lGs", mcfmac },
3610{"movel", 2,    one(0126600),   one(0177760), "HsRs", mcfmac },
3611{"movel", 2,    one(0126400),   one(0177760), "RsHs", mcfmac },
3612{"movel", 6,    one(0126474),   one(0177777), "#lHs", mcfmac },
3613{"movel", 2,    one(0124700),   one(0177777), "GsCs", mcfmac },
3614
3615{"movel", 2,    one(0xa180),    one(0xf9f0), "eFRs", mcfemac }, /* ACCx,Rx.  */
3616{"movel", 2,    one(0xab80),    one(0xfbf0), "g]Rs", mcfemac }, /* ACCEXTx,Rx.  */
3617{"movel", 2,    one(0xa980),    one(0xfff0), "G-Rs", mcfemac }, /* macsr,Rx.  */
3618{"movel", 2,    one(0xad80),    one(0xfff0), "H-Rs", mcfemac }, /* mask,Rx.  */
3619{"movel", 2,    one(0xa110),    one(0xf9fc), "efeF", mcfemac }, /* ACCy,ACCx.  */
3620{"movel", 2,    one(0xa9c0),    one(0xffff), "G-C-", mcfemac }, /* macsr,ccr.  */
3621{"movel", 2,    one(0xa100),    one(0xf9f0), "RseF", mcfemac }, /* Rx,ACCx.  */
3622{"movel", 6,    one(0xa13c),    one(0xf9ff), "#leF", mcfemac }, /* #,ACCx.  */
3623{"movel", 2,    one(0xab00),    one(0xfbc0), "Rsg]", mcfemac }, /* Rx,ACCEXTx.  */
3624{"movel", 6,    one(0xab3c),    one(0xfbff), "#lg]", mcfemac }, /* #,ACCEXTx.  */
3625{"movel", 2,    one(0xa900),    one(0xffc0), "RsG-", mcfemac }, /* Rx,macsr.  */
3626{"movel", 6,    one(0xa93c),    one(0xffff), "#lG-", mcfemac }, /* #,macsr.  */
3627{"movel", 2,    one(0xad00),    one(0xffc0), "RsH-", mcfemac }, /* Rx,mask.  */
3628{"movel", 6,    one(0xad3c),    one(0xffff), "#lH-", mcfemac }, /* #,mask.  */
3629
3630{"move", 2,     one(0030000),   one(0170000), "*w%d", m68000up },
3631{"move", 2,     one(0030000),   one(0170000), "ms%d", mcfisa_a },
3632{"move", 2,     one(0030000),   one(0170000), "nspd", mcfisa_a },
3633{"move", 2,     one(0030000),   one(0170000), "owmd", mcfisa_a },
3634{"move", 2,     one(0030000),   one(0170000), "ownd", mcfisa_b },
3635{"move", 2,     one(0040300),   one(0177700), "Ss$s", m68000up },
3636{"move", 2,     one(0040300),   one(0177770), "SsDs", mcfisa_a },
3637{"move", 2,     one(0041300),   one(0177700), "Cs$s", m68010up },
3638{"move", 2,     one(0041300),   one(0177770), "CsDs", mcfisa_a },
3639{"move", 2,     one(0042300),   one(0177700), ";wCd", m68000up },
3640{"move", 2,     one(0042300),   one(0177700), "DsCd", mcfisa_a },
3641{"move", 4,     one(0042374),   one(0177777), "#wCd", mcfisa_a },
3642{"move", 2,     one(0043300),   one(0177700), ";wSd", m68000up },
3643{"move", 2,     one(0043300),   one(0177700), "DsSd", mcfisa_a },
3644{"move", 4,     one(0043374),   one(0177777), "#wSd", mcfisa_a },
3645
3646{"move", 2,     one(0047140),   one(0177770), "AsUd", m68000up },
3647{"move", 2,     one(0047150),   one(0177770), "UdAs", m68000up },
3648
3649{"mov3ql", 2,   one(0120500),   one(0170700), "xd%s", mcfisa_b },
3650{"mvsb", 2,     one(0070400),   one(0170700), "*bDd", mcfisa_b },
3651{"mvsw", 2,     one(0070500),   one(0170700), "*wDd", mcfisa_b },
3652{"mvzb", 2,     one(0070600),   one(0170700), "*bDd", mcfisa_b },
3653{"mvzw", 2,     one(0070700),   one(0170700), "*wDd", mcfisa_b },
3654
3655{"movesb", 4,   two(0007000, 0),     two(0177700, 07777), "~sR1", m68010up },
3656{"movesb", 4,   two(0007000, 04000), two(0177700, 07777), "R1~s", m68010up },
3657{"movesw", 4,   two(0007100, 0),     two(0177700, 07777), "~sR1", m68010up },
3658{"movesw", 4,   two(0007100, 04000), two(0177700, 07777), "R1~s", m68010up },
3659{"movesl", 4,   two(0007200, 0),     two(0177700, 07777), "~sR1", m68010up },
3660{"movesl", 4,   two(0007200, 04000), two(0177700, 07777), "R1~s", m68010up },
3661
3662{"move16", 4,   two(0xf620, 0x8000), two(0xfff8, 0x8fff), "+s+1", m68040up },
3663{"move16", 2,   one(0xf600),            one(0xfff8), "+s_L", m68040up },
3664{"move16", 2,   one(0xf608),            one(0xfff8), "_L+s", m68040up },
3665{"move16", 2,   one(0xf610),            one(0xfff8), "as_L", m68040up },
3666{"move16", 2,   one(0xf618),            one(0xfff8), "_Las", m68040up },
3667
3668{"msacw", 4,    two(0xa080, 0x0100), two(0xf180, 0x0910), "uNuoiI4/Rn", mcfmac },
3669{"msacw", 4,    two(0xa080, 0x0300), two(0xf180, 0x0910), "uNuoMh4/Rn", mcfmac },
3670{"msacw", 4,    two(0xa080, 0x0100), two(0xf180, 0x0f10), "uNuo4/Rn", mcfmac },
3671{"msacw", 4,    two(0xa000, 0x0100), two(0xf1b0, 0x0900), "uMumiI", mcfmac },
3672{"msacw", 4,    two(0xa000, 0x0300), two(0xf1b0, 0x0900), "uMumMh", mcfmac },
3673{"msacw", 4,    two(0xa000, 0x0100), two(0xf1b0, 0x0f00), "uMum", mcfmac },
3674
3675{"msacw", 4,    two(0xa000, 0x0100), two(0xf100, 0x0900), "uMumiI4/RneG", mcfemac },/* Ry,Rx,SF,<ea>,accX.  */
3676{"msacw", 4,    two(0xa000, 0x0300), two(0xf100, 0x0900), "uMumMh4/RneG", mcfemac },/* Ry,Rx,+1/-1,<ea>,accX.  */
3677{"msacw", 4,    two(0xa000, 0x0100), two(0xf100, 0x0f00), "uMum4/RneG", mcfemac },/* Ry,Rx,<ea>,accX.  */
3678{"msacw", 4,    two(0xa000, 0x0100), two(0xf130, 0x0900), "uMumiIeH", mcfemac },/* Ry,Rx,SF,accX.  */
3679{"msacw", 4,    two(0xa000, 0x0300), two(0xf130, 0x0900), "uMumMheH", mcfemac },/* Ry,Rx,+1/-1,accX.  */
3680{"msacw", 4,    two(0xa000, 0x0100), two(0xf130, 0x0f00), "uMumeH", mcfemac }, /* Ry,Rx,accX.  */
3681
3682{"msacl", 4,    two(0xa080, 0x0900), two(0xf180, 0x0910), "RNRoiI4/Rn", mcfmac },
3683{"msacl", 4,    two(0xa080, 0x0b00), two(0xf180, 0x0910), "RNRoMh4/Rn", mcfmac },
3684{"msacl", 4,    two(0xa080, 0x0900), two(0xf180, 0x0f10), "RNRo4/Rn", mcfmac },
3685{"msacl", 4,    two(0xa000, 0x0900), two(0xf1b0, 0x0b00), "RMRmiI", mcfmac },
3686{"msacl", 4,    two(0xa000, 0x0b00), two(0xf1b0, 0x0b00), "RMRmMh", mcfmac },
3687{"msacl", 4,    two(0xa000, 0x0900), two(0xf1b0, 0x0800), "RMRm", mcfmac },
3688
3689{"msacl", 4,    two(0xa000, 0x0900), two(0xf100, 0x0900), "R3R1iI4/RneG", mcfemac },
3690{"msacl", 4,    two(0xa000, 0x0b00), two(0xf100, 0x0900), "R3R1Mh4/RneG", mcfemac },
3691{"msacl", 4,    two(0xa000, 0x0900), two(0xf100, 0x0f00), "R3R14/RneG", mcfemac },
3692{"msacl", 4,    two(0xa000, 0x0900), two(0xf130, 0x0900), "RMRmiIeH", mcfemac },
3693{"msacl", 4,    two(0xa000, 0x0b00), two(0xf130, 0x0900), "RMRmMheH", mcfemac },
3694{"msacl", 4,    two(0xa000, 0x0900), two(0xf130, 0x0f00), "RMRmeH", mcfemac },
3695
3696{"mulsw", 2,    one(0140700),           one(0170700), ";wDd", m68000up|mcfisa_a },
3697{"mulsl", 4,    two(0046000,004000), two(0177700,0107770), ";lD1", m68020up|cpu32 },
3698{"mulsl", 4,    two(0046000,004000), two(0177700,0107770), "qsD1", mcfisa_a },
3699{"mulsl", 4,    two(0046000,006000), two(0177700,0107770), ";lD3D1",m68020up|cpu32 },
3700
3701{"muluw", 2,    one(0140300),           one(0170700), ";wDd", m68000up|mcfisa_a },
3702{"mulul", 4,    two(0046000,000000), two(0177700,0107770), ";lD1", m68020up|cpu32 },
3703{"mulul", 4,    two(0046000,000000), two(0177700,0107770), "qsD1", mcfisa_a },
3704{"mulul", 4,    two(0046000,002000), two(0177700,0107770), ";lD3D1",m68020up|cpu32 },
3705
3706{"nbcd", 2,     one(0044000),   one(0177700), "$s", m68000up },
3707
3708{"negb", 2,     one(0042000),   one(0177700), "$s", m68000up },
3709{"negw", 2,     one(0042100),   one(0177700), "$s", m68000up },
3710{"negl", 2,     one(0042200),   one(0177700), "$s", m68000up },
3711{"negl", 2,     one(0042200),   one(0177700), "Ds", mcfisa_a},
3712
3713{"negxb", 2,    one(0040000),   one(0177700), "$s", m68000up },
3714{"negxw", 2,    one(0040100),   one(0177700), "$s", m68000up },
3715{"negxl", 2,    one(0040200),   one(0177700), "$s", m68000up },
3716{"negxl", 2,    one(0040200),   one(0177700), "Ds", mcfisa_a},
3717
3718{"nop", 2,      one(0047161),   one(0177777), "", m68000up | mcfisa_a},
3719
3720{"notb", 2,     one(0043000),   one(0177700), "$s", m68000up },
3721{"notw", 2,     one(0043100),   one(0177700), "$s", m68000up },
3722{"notl", 2,     one(0043200),   one(0177700), "$s", m68000up },
3723{"notl", 2,     one(0043200),   one(0177700), "Ds", mcfisa_a},
3724
3725{"orib", 4,     one(0000000),   one(0177700), "#b$s", m68000up },
3726{"orib", 4,     one(0000074),   one(0177777), "#bCs", m68000up },
3727{"oriw", 4,     one(0000100),   one(0177700), "#w$s", m68000up },
3728{"oriw", 4,     one(0000174),   one(0177777), "#wSs", m68000up },
3729{"oril", 6,     one(0000200),   one(0177700), "#l$s", m68000up },
3730{"oril", 6,     one(0000200),   one(0177700), "#lDs", mcfisa_a },
3731{"ori", 4,      one(0000074),   one(0177777), "#bCs", m68000up },
3732{"ori", 4,      one(0000100),   one(0177700), "#w$s", m68000up },
3733{"ori", 4,      one(0000174),   one(0177777), "#wSs", m68000up },
3734
3735/* The or opcode can generate the ori instruction.  */
3736{"orb", 4,      one(0000000),   one(0177700), "#b$s", m68000up },
3737{"orb", 4,      one(0000074),   one(0177777), "#bCs", m68000up },
3738{"orb", 2,      one(0100000),   one(0170700), ";bDd", m68000up },
3739{"orb", 2,      one(0100400),   one(0170700), "Dd~s", m68000up },
3740{"orw", 4,      one(0000100),   one(0177700), "#w$s", m68000up },
3741{"orw", 4,      one(0000174),   one(0177777), "#wSs", m68000up },
3742{"orw", 2,      one(0100100),   one(0170700), ";wDd", m68000up },
3743{"orw", 2,      one(0100500),   one(0170700), "Dd~s", m68000up },
3744{"orl", 6,      one(0000200),   one(0177700), "#l$s", m68000up },
3745{"orl", 6,      one(0000200),   one(0177700), "#lDs", mcfisa_a },
3746{"orl", 2,      one(0100200),   one(0170700), ";lDd", m68000up | mcfisa_a },
3747{"orl", 2,      one(0100600),   one(0170700), "Dd~s", m68000up | mcfisa_a },
3748{"or", 4,       one(0000074),   one(0177777), "#bCs", m68000up },
3749{"or", 4,       one(0000100),   one(0177700), "#w$s", m68000up },
3750{"or", 4,       one(0000174),   one(0177777), "#wSs", m68000up },
3751{"or", 2,       one(0100100),   one(0170700), ";wDd", m68000up },
3752{"or", 2,       one(0100500),   one(0170700), "Dd~s", m68000up },
3753
3754{"pack", 4,     one(0100500),   one(0170770), "DsDd#w", m68020up },
3755{"pack", 4,     one(0100510),   one(0170770), "-s-d#w", m68020up },
3756
3757{"pbac", 2,     one(0xf087),    one(0xffbf), "Bc", m68851 },
3758{"pbacw", 2,    one(0xf087),    one(0xffff), "BW", m68851 },
3759{"pbas", 2,     one(0xf086),    one(0xffbf), "Bc", m68851 },
3760{"pbasw", 2,    one(0xf086),    one(0xffff), "BW", m68851 },
3761{"pbbc", 2,     one(0xf081),    one(0xffbf), "Bc", m68851 },
3762{"pbbcw", 2,    one(0xf081),    one(0xffff), "BW", m68851 },
3763{"pbbs", 2,     one(0xf080),    one(0xffbf), "Bc", m68851 },
3764{"pbbsw", 2,    one(0xf080),    one(0xffff), "BW", m68851 },
3765{"pbcc", 2,     one(0xf08f),    one(0xffbf), "Bc", m68851 },
3766{"pbccw", 2,    one(0xf08f),    one(0xffff), "BW", m68851 },
3767{"pbcs", 2,     one(0xf08e),    one(0xffbf), "Bc", m68851 },
3768{"pbcsw", 2,    one(0xf08e),    one(0xffff), "BW", m68851 },
3769{"pbgc", 2,     one(0xf08d),    one(0xffbf), "Bc", m68851 },
3770{"pbgcw", 2,    one(0xf08d),    one(0xffff), "BW", m68851 },
3771{"pbgs", 2,     one(0xf08c),    one(0xffbf), "Bc", m68851 },
3772{"pbgsw", 2,    one(0xf08c),    one(0xffff), "BW", m68851 },
3773{"pbic", 2,     one(0xf08b),    one(0xffbf), "Bc", m68851 },
3774{"pbicw", 2,    one(0xf08b),    one(0xffff), "BW", m68851 },
3775{"pbis", 2,     one(0xf08a),    one(0xffbf), "Bc", m68851 },
3776{"pbisw", 2,    one(0xf08a),    one(0xffff), "BW", m68851 },
3777{"pblc", 2,     one(0xf083),    one(0xffbf), "Bc", m68851 },
3778{"pblcw", 2,    one(0xf083),    one(0xffff), "BW", m68851 },
3779{"pbls", 2,     one(0xf082),    one(0xffbf), "Bc", m68851 },
3780{"pblsw", 2,    one(0xf082),    one(0xffff), "BW", m68851 },
3781{"pbsc", 2,     one(0xf085),    one(0xffbf), "Bc", m68851 },
3782{"pbscw", 2,    one(0xf085),    one(0xffff), "BW", m68851 },
3783{"pbss", 2,     one(0xf084),    one(0xffbf), "Bc", m68851 },
3784{"pbssw", 2,    one(0xf084),    one(0xffff), "BW", m68851 },
3785{"pbwc", 2,     one(0xf089),    one(0xffbf), "Bc", m68851 },
3786{"pbwcw", 2,    one(0xf089),    one(0xffff), "BW", m68851 },
3787{"pbws", 2,     one(0xf088),    one(0xffbf), "Bc", m68851 },
3788{"pbwsw", 2,    one(0xf088),    one(0xffff), "BW", m68851 },
3789
3790{"pdbac", 4,    two(0xf048, 0x0007),    two(0xfff8, 0xffff), "DsBw", m68851 },
3791{"pdbas", 4,    two(0xf048, 0x0006),    two(0xfff8, 0xffff), "DsBw", m68851 },
3792{"pdbbc", 4,    two(0xf048, 0x0001),    two(0xfff8, 0xffff), "DsBw", m68851 },
3793{"pdbbs", 4,    two(0xf048, 0x0000),    two(0xfff8, 0xffff), "DsBw", m68851 },
3794{"pdbcc", 4,    two(0xf048, 0x000f),    two(0xfff8, 0xffff), "DsBw", m68851 },
3795{"pdbcs", 4,    two(0xf048, 0x000e),    two(0xfff8, 0xffff), "DsBw", m68851 },
3796{"pdbgc", 4,    two(0xf048, 0x000d),    two(0xfff8, 0xffff), "DsBw", m68851 },
3797{"pdbgs", 4,    two(0xf048, 0x000c),    two(0xfff8, 0xffff), "DsBw", m68851 },
3798{"pdbic", 4,    two(0xf048, 0x000b),    two(0xfff8, 0xffff), "DsBw", m68851 },
3799{"pdbis", 4,    two(0xf048, 0x000a),    two(0xfff8, 0xffff), "DsBw", m68851 },
3800{"pdblc", 4,    two(0xf048, 0x0003),    two(0xfff8, 0xffff), "DsBw", m68851 },
3801{"pdbls", 4,    two(0xf048, 0x0002),    two(0xfff8, 0xffff), "DsBw", m68851 },
3802{"pdbsc", 4,    two(0xf048, 0x0005),    two(0xfff8, 0xffff), "DsBw", m68851 },
3803{"pdbss", 4,    two(0xf048, 0x0004),    two(0xfff8, 0xffff), "DsBw", m68851 },
3804{"pdbwc", 4,    two(0xf048, 0x0009),    two(0xfff8, 0xffff), "DsBw", m68851 },
3805{"pdbws", 4,    two(0xf048, 0x0008),    two(0xfff8, 0xffff), "DsBw", m68851 },
3806
3807{"pea", 2,      one(0044100),           one(0177700), "!s", m68000up|mcfisa_a },
3808
3809{"pflusha", 2,  one(0xf518),            one(0xfff8), "", m68040up },
3810{"pflusha", 4,  two(0xf000,0x2400), two(0xffff,0xffff), "", m68030 | m68851 },
3811
3812{"pflush", 4,   two(0xf000,0x3010), two(0xffc0,0xfe10), "T3T9", m68030|m68851 },
3813{"pflush", 4,   two(0xf000,0x3810), two(0xffc0,0xfe10), "T3T9&s", m68030|m68851 },
3814{"pflush", 4,   two(0xf000,0x3008), two(0xffc0,0xfe18), "D3T9", m68030|m68851 },
3815{"pflush", 4,   two(0xf000,0x3808), two(0xffc0,0xfe18), "D3T9&s", m68030|m68851 },
3816{"pflush", 4,   two(0xf000,0x3000), two(0xffc0,0xfe1e), "f3T9", m68030|m68851 },
3817{"pflush", 4,   two(0xf000,0x3800), two(0xffc0,0xfe1e), "f3T9&s", m68030|m68851 },
3818{"pflush", 2,   one(0xf508),            one(0xfff8), "as", m68040up },
3819{"pflush", 2,   one(0xf508),            one(0xfff8), "As", m68040up },
3820
3821{"pflushan", 2, one(0xf510),            one(0xfff8), "", m68040up },
3822{"pflushn", 2,  one(0xf500),            one(0xfff8), "as", m68040up },
3823{"pflushn", 2,  one(0xf500),            one(0xfff8), "As", m68040up },
3824
3825{"pflushr", 4,  two(0xf000, 0xa000), two(0xffc0, 0xffff), "|s", m68851 },
3826
3827{"pflushs", 4,  two(0xf000, 0x3410), two(0xfff8, 0xfe10), "T3T9", m68851 },
3828{"pflushs", 4,  two(0xf000, 0x3c10), two(0xfff8, 0xfe10), "T3T9&s", m68851 },
3829{"pflushs", 4,  two(0xf000, 0x3408), two(0xfff8, 0xfe18), "D3T9", m68851 },
3830{"pflushs", 4,  two(0xf000, 0x3c08), two(0xfff8, 0xfe18), "D3T9&s", m68851 },
3831{"pflushs", 4,  two(0xf000, 0x3400), two(0xfff8, 0xfe1e), "f3T9", m68851 },
3832{"pflushs", 4,  two(0xf000, 0x3c00), two(0xfff8, 0xfe1e), "f3T9&s", m68851 },
3833
3834{"ploadr", 4,   two(0xf000,0x2210), two(0xffc0,0xfff0), "T3&s", m68030|m68851 },
3835{"ploadr", 4,   two(0xf000,0x2208), two(0xffc0,0xfff8), "D3&s", m68030|m68851 },
3836{"ploadr", 4,   two(0xf000,0x2200), two(0xffc0,0xfffe), "f3&s", m68030|m68851 },
3837{"ploadw", 4,   two(0xf000,0x2010), two(0xffc0,0xfff0), "T3&s", m68030|m68851 },
3838{"ploadw", 4,   two(0xf000,0x2008), two(0xffc0,0xfff8), "D3&s", m68030|m68851 },
3839{"ploadw", 4,   two(0xf000,0x2000), two(0xffc0,0xfffe), "f3&s", m68030|m68851 },
3840
3841{"plpar", 2,    one(0xf5c8),            one(0xfff8), "as", m68060 },
3842{"plpaw", 2,    one(0xf588),            one(0xfff8), "as", m68060 },
3843
3844{"pmove", 4,    two(0xf000,0x4000), two(0xffc0,0xffff), "*l08", m68030|m68851 },
3845{"pmove", 4,    two(0xf000,0x5c00), two(0xffc0,0xffff), "*w18", m68851 },
3846{"pmove", 4,    two(0xf000,0x4000), two(0xffc0,0xe3ff), "*b28", m68851 },
3847{"pmove", 4,    two(0xf000,0x4200), two(0xffc0,0xffff), "08%s", m68030|m68851 },
3848{"pmove", 4,    two(0xf000,0x5e00), two(0xffc0,0xffff), "18%s", m68851 },
3849{"pmove", 4,    two(0xf000,0x4200), two(0xffc0,0xe3ff), "28%s", m68851 },
3850{"pmove", 4,    two(0xf000,0x4000), two(0xffc0,0xe3ff), "|sW8", m68030|m68851 },
3851{"pmove", 4,    two(0xf000,0x4200), two(0xffc0,0xe3ff), "W8~s", m68030|m68851 },
3852{"pmove", 4,    two(0xf000,0x6200), two(0xffc0,0xe3e3), "*wX3", m68851 },
3853{"pmove", 4,    two(0xf000,0x6000), two(0xffc0,0xe3e3), "X3%s", m68851 },
3854{"pmove", 4,    two(0xf000,0x6000), two(0xffc0,0xffff), "*wY8", m68030|m68851 },
3855{"pmove", 4,    two(0xf000,0x6200), two(0xffc0,0xffff), "Y8%s", m68030|m68851 },
3856{"pmove", 4,    two(0xf000,0x6600), two(0xffc0,0xffff), "Z8%s", m68851 },
3857{"pmove", 4,    two(0xf000,0x0800), two(0xffc0,0xfbff), "*l38", m68030 },
3858{"pmove", 4,    two(0xf000,0x0a00), two(0xffc0,0xfbff), "38%s", m68030 },
3859
3860{"pmovefd", 4,  two(0xf000, 0x4100),    two(0xffc0, 0xe3ff), "*l08", m68030 },
3861{"pmovefd", 4,  two(0xf000, 0x4100),    two(0xffc0, 0xe3ff), "|sW8", m68030 },
3862{"pmovefd", 4,  two(0xf000, 0x0900),    two(0xffc0, 0xfbff), "*l38", m68030 },
3863
3864{"prestore", 2, one(0xf140),            one(0xffc0), "<s", m68851 },
3865
3866{"psave", 2,    one(0xf100),            one(0xffc0), ">s", m68851 },
3867
3868{"psac", 4,     two(0xf040, 0x0007),    two(0xffc0, 0xffff), "$s", m68851 },
3869{"psas", 4,     two(0xf040, 0x0006),    two(0xffc0, 0xffff), "$s", m68851 },
3870{"psbc", 4,     two(0xf040, 0x0001),    two(0xffc0, 0xffff), "$s", m68851 },
3871{"psbs", 4,     two(0xf040, 0x0000),    two(0xffc0, 0xffff), "$s", m68851 },
3872{"pscc", 4,     two(0xf040, 0x000f),    two(0xffc0, 0xffff), "$s", m68851 },
3873{"pscs", 4,     two(0xf040, 0x000e),    two(0xffc0, 0xffff), "$s", m68851 },
3874{"psgc", 4,     two(0xf040, 0x000d),    two(0xffc0, 0xffff), "$s", m68851 },
3875{"psgs", 4,     two(0xf040, 0x000c),    two(0xffc0, 0xffff), "$s", m68851 },
3876{"psic", 4,     two(0xf040, 0x000b),    two(0xffc0, 0xffff), "$s", m68851 },
3877{"psis", 4,     two(0xf040, 0x000a),    two(0xffc0, 0xffff), "$s", m68851 },
3878{"pslc", 4,     two(0xf040, 0x0003),    two(0xffc0, 0xffff), "$s", m68851 },
3879{"psls", 4,     two(0xf040, 0x0002),    two(0xffc0, 0xffff), "$s", m68851 },
3880{"pssc", 4,     two(0xf040, 0x0005),    two(0xffc0, 0xffff), "$s", m68851 },
3881{"psss", 4,     two(0xf040, 0x0004),    two(0xffc0, 0xffff), "$s", m68851 },
3882{"pswc", 4,     two(0xf040, 0x0009),    two(0xffc0, 0xffff), "$s", m68851 },
3883{"psws", 4,     two(0xf040, 0x0008),    two(0xffc0, 0xffff), "$s", m68851 },
3884
3885{"ptestr", 4,   two(0xf000,0x8210), two(0xffc0, 0xe3f0), "T3&st8", m68030|m68851 },
3886{"ptestr", 4,   two(0xf000,0x8310), two(0xffc0,0xe310), "T3&st8A9", m68030|m68851 },
3887{"ptestr", 4,   two(0xf000,0x8208), two(0xffc0,0xe3f8), "D3&st8", m68030|m68851 },
3888{"ptestr", 4,   two(0xf000,0x8308), two(0xffc0,0xe318), "D3&st8A9", m68030|m68851 },
3889{"ptestr", 4,   two(0xf000,0x8200), two(0xffc0,0xe3fe), "f3&st8", m68030|m68851 },
3890{"ptestr", 4,   two(0xf000,0x8300), two(0xffc0,0xe31e), "f3&st8A9", m68030|m68851 },
3891{"ptestr", 2,   one(0xf568),            one(0xfff8), "as", m68040 },
3892
3893{"ptestw", 4,   two(0xf000,0x8010), two(0xffc0,0xe3f0), "T3&st8", m68030|m68851 },
3894{"ptestw", 4,   two(0xf000,0x8110), two(0xffc0,0xe310), "T3&st8A9", m68030|m68851 },
3895{"ptestw", 4,   two(0xf000,0x8008), two(0xffc0,0xe3f8), "D3&st8", m68030|m68851 },
3896{"ptestw", 4,   two(0xf000,0x8108), two(0xffc0,0xe318), "D3&st8A9", m68030|m68851 },
3897{"ptestw", 4,   two(0xf000,0x8000), two(0xffc0,0xe3fe), "f3&st8", m68030|m68851 },
3898{"ptestw", 4,   two(0xf000,0x8100), two(0xffc0,0xe31e), "f3&st8A9", m68030|m68851 },
3899{"ptestw", 2,   one(0xf548),            one(0xfff8), "as", m68040 },
3900
3901{"ptrapacw", 6, two(0xf07a, 0x0007),    two(0xffff, 0xffff), "#w", m68851 },
3902{"ptrapacl", 6, two(0xf07b, 0x0007),    two(0xffff, 0xffff), "#l", m68851 },
3903{"ptrapac", 4,  two(0xf07c, 0x0007),    two(0xffff, 0xffff), "",   m68851 },
3904
3905{"ptrapasw", 6, two(0xf07a, 0x0006),    two(0xffff, 0xffff), "#w", m68851 },
3906{"ptrapasl", 6, two(0xf07b, 0x0006),    two(0xffff, 0xffff), "#l", m68851 },
3907{"ptrapas", 4,  two(0xf07c, 0x0006),    two(0xffff, 0xffff), "",   m68851 },
3908
3909{"ptrapbcw", 6, two(0xf07a, 0x0001),    two(0xffff, 0xffff), "#w", m68851 },
3910{"ptrapbcl", 6, two(0xf07b, 0x0001),    two(0xffff, 0xffff), "#l", m68851 },
3911{"ptrapbc", 4,  two(0xf07c, 0x0001),    two(0xffff, 0xffff), "",   m68851 },
3912
3913{"ptrapbsw", 6, two(0xf07a, 0x0000),    two(0xffff, 0xffff), "#w", m68851 },
3914{"ptrapbsl", 6, two(0xf07b, 0x0000),    two(0xffff, 0xffff), "#l", m68851 },
3915{"ptrapbs", 4,  two(0xf07c, 0x0000),    two(0xffff, 0xffff), "",   m68851 },
3916
3917{"ptrapccw", 6, two(0xf07a, 0x000f),    two(0xffff, 0xffff), "#w", m68851 },
3918{"ptrapccl", 6, two(0xf07b, 0x000f),    two(0xffff, 0xffff), "#l", m68851 },
3919{"ptrapcc", 4,  two(0xf07c, 0x000f),    two(0xffff, 0xffff), "",   m68851 },
3920
3921{"ptrapcsw", 6, two(0xf07a, 0x000e),    two(0xffff, 0xffff), "#w", m68851 },
3922{"ptrapcsl", 6, two(0xf07b, 0x000e),    two(0xffff, 0xffff), "#l", m68851 },
3923{"ptrapcs", 4,  two(0xf07c, 0x000e),    two(0xffff, 0xffff), "",   m68851 },
3924
3925{"ptrapgcw", 6, two(0xf07a, 0x000d),    two(0xffff, 0xffff), "#w", m68851 },
3926{"ptrapgcl", 6, two(0xf07b, 0x000d),    two(0xffff, 0xffff), "#l", m68851 },
3927{"ptrapgc", 4,  two(0xf07c, 0x000d),    two(0xffff, 0xffff), "",   m68851 },
3928
3929{"ptrapgsw", 6, two(0xf07a, 0x000c),    two(0xffff, 0xffff), "#w", m68851 },
3930{"ptrapgsl", 6, two(0xf07b, 0x000c),    two(0xffff, 0xffff), "#l", m68851 },
3931{"ptrapgs", 4,  two(0xf07c, 0x000c),    two(0xffff, 0xffff), "",   m68851 },
3932
3933{"ptrapicw", 6, two(0xf07a, 0x000b),    two(0xffff, 0xffff), "#w", m68851 },
3934{"ptrapicl", 6, two(0xf07b, 0x000b),    two(0xffff, 0xffff), "#l", m68851 },
3935{"ptrapic", 4,  two(0xf07c, 0x000b),    two(0xffff, 0xffff), "",   m68851 },
3936
3937{"ptrapisw", 6, two(0xf07a, 0x000a),    two(0xffff, 0xffff), "#w", m68851 },
3938{"ptrapisl", 6, two(0xf07b, 0x000a),    two(0xffff, 0xffff), "#l", m68851 },
3939{"ptrapis", 4,  two(0xf07c, 0x000a),    two(0xffff, 0xffff), "",   m68851 },
3940
3941{"ptraplcw", 6, two(0xf07a, 0x0003),    two(0xffff, 0xffff), "#w", m68851 },
3942{"ptraplcl", 6, two(0xf07b, 0x0003),    two(0xffff, 0xffff), "#l", m68851 },
3943{"ptraplc", 4,  two(0xf07c, 0x0003),    two(0xffff, 0xffff), "",   m68851 },
3944
3945{"ptraplsw", 6, two(0xf07a, 0x0002),    two(0xffff, 0xffff), "#w", m68851 },
3946{"ptraplsl", 6, two(0xf07b, 0x0002),    two(0xffff, 0xffff), "#l", m68851 },
3947{"ptrapls", 4,  two(0xf07c, 0x0002),    two(0xffff, 0xffff), "",   m68851 },
3948
3949{"ptrapscw", 6, two(0xf07a, 0x0005),    two(0xffff, 0xffff), "#w", m68851 },
3950{"ptrapscl", 6, two(0xf07b, 0x0005),    two(0xffff, 0xffff), "#l", m68851 },
3951{"ptrapsc", 4,  two(0xf07c, 0x0005),    two(0xffff, 0xffff), "",   m68851 },
3952
3953{"ptrapssw", 6, two(0xf07a, 0x0004),    two(0xffff, 0xffff), "#w", m68851 },
3954{"ptrapssl", 6, two(0xf07b, 0x0004),    two(0xffff, 0xffff), "#l", m68851 },
3955{"ptrapss", 4,  two(0xf07c, 0x0004),    two(0xffff, 0xffff), "",   m68851 },
3956
3957{"ptrapwcw", 6, two(0xf07a, 0x0009),    two(0xffff, 0xffff), "#w", m68851 },
3958{"ptrapwcl", 6, two(0xf07b, 0x0009),    two(0xffff, 0xffff), "#l", m68851 },
3959{"ptrapwc", 4,  two(0xf07c, 0x0009),    two(0xffff, 0xffff), "",   m68851 },
3960
3961{"ptrapwsw", 6, two(0xf07a, 0x0008),    two(0xffff, 0xffff), "#w", m68851 },
3962{"ptrapwsl", 6, two(0xf07b, 0x0008),    two(0xffff, 0xffff), "#l", m68851 },
3963{"ptrapws", 4,  two(0xf07c, 0x0008),    two(0xffff, 0xffff), "",   m68851 },
3964
3965{"pulse", 2,    one(0045314),           one(0177777), "", m68060 | mcfisa_a },
3966
3967{"pvalid", 4,   two(0xf000, 0x2800),    two(0xffc0, 0xffff), "Vs&s", m68851 },
3968{"pvalid", 4,   two(0xf000, 0x2c00),    two(0xffc0, 0xfff8), "A3&s", m68851 },
3969
3970  /* FIXME: don't allow Dw==Dx. */
3971{"remsl", 4,    two(0x4c40, 0x0800),    two(0xffc0, 0x8ff8), "qsD3D1", mcfhwdiv },
3972{"remul", 4,    two(0x4c40, 0x0000),    two(0xffc0, 0x8ff8), "qsD3D1", mcfhwdiv },
3973
3974{"reset", 2,    one(0047160),           one(0177777), "", m68000up },
3975
3976{"rolb", 2,     one(0160430),           one(0170770), "QdDs", m68000up },
3977{"rolb", 2,     one(0160470),           one(0170770), "DdDs", m68000up },
3978{"rolw", 2,     one(0160530),           one(0170770), "QdDs", m68000up },
3979{"rolw", 2,     one(0160570),           one(0170770), "DdDs", m68000up },
3980{"rolw", 2,     one(0163700),           one(0177700), "~s",   m68000up },
3981{"roll", 2,     one(0160630),           one(0170770), "QdDs", m68000up },
3982{"roll", 2,     one(0160670),           one(0170770), "DdDs", m68000up },
3983
3984{"rorb", 2,     one(0160030),           one(0170770), "QdDs", m68000up },
3985{"rorb", 2,     one(0160070),           one(0170770), "DdDs", m68000up },
3986{"rorw", 2,     one(0160130),           one(0170770), "QdDs", m68000up },
3987{"rorw", 2,     one(0160170),           one(0170770), "DdDs", m68000up },
3988{"rorw", 2,     one(0163300),           one(0177700), "~s",   m68000up },
3989{"rorl", 2,     one(0160230),           one(0170770), "QdDs", m68000up },
3990{"rorl", 2,     one(0160270),           one(0170770), "DdDs", m68000up },
3991
3992{"roxlb", 2,    one(0160420),           one(0170770), "QdDs", m68000up },
3993{"roxlb", 2,    one(0160460),           one(0170770), "DdDs", m68000up },
3994{"roxlw", 2,    one(0160520),           one(0170770), "QdDs", m68000up },
3995{"roxlw", 2,    one(0160560),           one(0170770), "DdDs", m68000up },
3996{"roxlw", 2,    one(0162700),           one(0177700), "~s",   m68000up },
3997{"roxll", 2,    one(0160620),           one(0170770), "QdDs", m68000up },
3998{"roxll", 2,    one(0160660),           one(0170770), "DdDs", m68000up },
3999
4000{"roxrb", 2,    one(0160020),           one(0170770), "QdDs", m68000up },
4001{"roxrb", 2,    one(0160060),           one(0170770), "DdDs", m68000up },
4002{"roxrw", 2,    one(0160120),           one(0170770), "QdDs", m68000up },
4003{"roxrw", 2,    one(0160160),           one(0170770), "DdDs", m68000up },
4004{"roxrw", 2,    one(0162300),           one(0177700), "~s",   m68000up },
4005{"roxrl", 2,    one(0160220),           one(0170770), "QdDs", m68000up },
4006{"roxrl", 2,    one(0160260),           one(0170770), "DdDs", m68000up },
4007
4008{"rtd", 4,      one(0047164),           one(0177777), "#w", m68010up },
4009
4010{"rte", 2,      one(0047163),           one(0177777), "",   m68000up | mcfisa_a },
4011
4012{"rtm", 2,      one(0003300),           one(0177760), "Rs", m68020 },
4013
4014{"rtr", 2,      one(0047167),           one(0177777), "",   m68000up },
4015
4016{"rts", 2,      one(0047165),           one(0177777), "",   m68000up | mcfisa_a },
4017
4018{"satsl", 2,    one(0046200),           one(0177770), "Ds", mcfisa_b },
4019
4020{"sbcd", 2,     one(0100400),           one(0170770), "DsDd", m68000up },
4021{"sbcd", 2,     one(0100410),           one(0170770), "-s-d", m68000up },
4022
4023{"scc", 2,      one(0052300),   one(0177700), "$s", m68000up },
4024{"scc", 2,      one(0052300),   one(0177700), "Ds", mcfisa_a },
4025{"scs", 2,      one(0052700),   one(0177700), "$s", m68000up },
4026{"scs", 2,      one(0052700),   one(0177700), "Ds", mcfisa_a },
4027{"seq", 2,      one(0053700),   one(0177700), "$s", m68000up },
4028{"seq", 2,      one(0053700),   one(0177700), "Ds", mcfisa_a },
4029{"sf", 2,       one(0050700),   one(0177700), "$s", m68000up },
4030{"sf", 2,       one(0050700),   one(0177700), "Ds", mcfisa_a },
4031{"sge", 2,      one(0056300),   one(0177700), "$s", m68000up },
4032{"sge", 2,      one(0056300),   one(0177700), "Ds", mcfisa_a },
4033{"sgt", 2,      one(0057300),   one(0177700), "$s", m68000up },
4034{"sgt", 2,      one(0057300),   one(0177700), "Ds", mcfisa_a },
4035{"shi", 2,      one(0051300),   one(0177700), "$s", m68000up },
4036{"shi", 2,      one(0051300),   one(0177700), "Ds", mcfisa_a },
4037{"sle", 2,      one(0057700),   one(0177700), "$s", m68000up },
4038{"sle", 2,      one(0057700),   one(0177700), "Ds", mcfisa_a },
4039{"sls", 2,      one(0051700),   one(0177700), "$s", m68000up },
4040{"sls", 2,      one(0051700),   one(0177700), "Ds", mcfisa_a },
4041{"slt", 2,      one(0056700),   one(0177700), "$s", m68000up },
4042{"slt", 2,      one(0056700),   one(0177700), "Ds", mcfisa_a },
4043{"smi", 2,      one(0055700),   one(0177700), "$s", m68000up },
4044{"smi", 2,      one(0055700),   one(0177700), "Ds", mcfisa_a },
4045{"sne", 2,      one(0053300),   one(0177700), "$s", m68000up },
4046{"sne", 2,      one(0053300),   one(0177700), "Ds", mcfisa_a },
4047{"spl", 2,      one(0055300),   one(0177700), "$s", m68000up },
4048{"spl", 2,      one(0055300),   one(0177700), "Ds", mcfisa_a },
4049{"st", 2,       one(0050300),   one(0177700), "$s", m68000up },
4050{"st", 2,       one(0050300),   one(0177700), "Ds", mcfisa_a },
4051{"svc", 2,      one(0054300),   one(0177700), "$s", m68000up },
4052{"svc", 2,      one(0054300),   one(0177700), "Ds", mcfisa_a },
4053{"svs", 2,      one(0054700),   one(0177700), "$s", m68000up },
4054{"svs", 2,      one(0054700),   one(0177700), "Ds", mcfisa_a },
4055
4056{"stop", 4,     one(0047162),   one(0177777), "#w", m68000up | mcfisa_a },
4057
4058{"strldsr", 4, two(0040347,0043374), two(0177777,0177777), "#w", mcfisa_aa},
4059
4060{"subal", 2,    one(0110700),   one(0170700), "*lAd", m68000up | mcfisa_a },
4061{"subaw", 2,    one(0110300),   one(0170700), "*wAd", m68000up },
4062
4063{"subib", 4,    one(0002000),   one(0177700), "#b$s", m68000up },
4064{"subiw", 4,    one(0002100),   one(0177700), "#w$s", m68000up },
4065{"subil", 6,    one(0002200),   one(0177700), "#l$s", m68000up },
4066{"subil", 6,    one(0002200),   one(0177700), "#lDs", mcfisa_a },
4067
4068{"subqb", 2,    one(0050400),   one(0170700), "Qd%s", m68000up },
4069{"subqw", 2,    one(0050500),   one(0170700), "Qd%s", m68000up },
4070{"subql", 2,    one(0050600),   one(0170700), "Qd%s", m68000up | mcfisa_a },
4071
4072/* The sub opcode can generate the suba, subi, and subq instructions.  */
4073{"subb", 2,     one(0050400),   one(0170700), "Qd%s", m68000up },
4074{"subb", 4,     one(0002000),   one(0177700), "#b$s", m68000up },
4075{"subb", 2,     one(0110000),   one(0170700), ";bDd", m68000up },
4076{"subb", 2,     one(0110400),   one(0170700), "Dd~s", m68000up },
4077{"subw", 2,     one(0050500),   one(0170700), "Qd%s", m68000up },
4078{"subw", 4,     one(0002100),   one(0177700), "#w$s", m68000up },
4079{"subw", 2,     one(0110300),   one(0170700), "*wAd", m68000up },
4080{"subw", 2,     one(0110100),   one(0170700), "*wDd", m68000up },
4081{"subw", 2,     one(0110500),   one(0170700), "Dd~s", m68000up },
4082{"subl", 2,     one(0050600),   one(0170700), "Qd%s", m68000up | mcfisa_a },
4083{"subl", 6,     one(0002200),   one(0177700), "#l$s", m68000up },
4084{"subl", 6,     one(0002200),   one(0177700), "#lDs", mcfisa_a },
4085{"subl", 2,     one(0110700),   one(0170700), "*lAd", m68000up | mcfisa_a },
4086{"subl", 2,     one(0110200),   one(0170700), "*lDd", m68000up | mcfisa_a },
4087{"subl", 2,     one(0110600),   one(0170700), "Dd~s", m68000up | mcfisa_a },
4088
4089{"subxb", 2,    one(0110400),   one(0170770), "DsDd", m68000up },
4090{"subxb", 2,    one(0110410),   one(0170770), "-s-d", m68000up },
4091{"subxw", 2,    one(0110500),   one(0170770), "DsDd", m68000up },
4092{"subxw", 2,    one(0110510),   one(0170770), "-s-d", m68000up },
4093{"subxl", 2,    one(0110600),   one(0170770), "DsDd", m68000up | mcfisa_a },
4094{"subxl", 2,    one(0110610),   one(0170770), "-s-d", m68000up },
4095
4096{"swap", 2,     one(0044100),   one(0177770), "Ds", m68000up | mcfisa_a },
4097
4098/* swbeg and swbegl are magic constants used on sysV68.  The compiler
4099   generates them before a switch table.  They tell the debugger and
4100   disassembler that a switch table follows.  The parameter is the
4101   number of elements in the table.  swbeg means that the entries in
4102   the table are word (2 byte) sized, and swbegl means that the
4103   entries in the table are longword (4 byte) sized.  */
4104{"swbeg", 4,    one(0045374),   one(0177777), "#w",   m68000up | mcfisa_a },
4105{"swbegl", 6,   one(0045375),   one(0177777), "#l",   m68000up | mcfisa_a },
4106
4107{"tas", 2,      one(0045300),   one(0177700), "$s", m68000up | mcfisa_b},
4108
4109#define TBL1(name,insn_size,signed,round,size)                                  \
4110  {name, insn_size, two(0174000, (signed<<11)|(!round<<10)|(size<<6)|0000400),  \
4111     two(0177700,0107777), "!sD1", cpu32 },                             \
4112  {name, insn_size, two(0174000, (signed<<11)|(!round<<10)|(size<<6)),          \
4113     two(0177770,0107770), "DsD3D1", cpu32 }
4114#define TBL(name1, name2, name3, s, r) \
4115  TBL1(name1, 4, s, r, 0), TBL1(name2, 4, s, r, 1), TBL1(name3, 4, s, r, 2)
4116TBL("tblsb", "tblsw", "tblsl", 2, 1),
4117TBL("tblsnb", "tblsnw", "tblsnl", 2, 0),
4118TBL("tblub", "tbluw", "tblul", 0, 1),
4119TBL("tblunb", "tblunw", "tblunl", 0, 0),
4120
4121{"trap", 2,     one(0047100),   one(0177760), "Ts", m68000up | mcfisa_a },
4122
4123{"trapcc", 2,   one(0052374),   one(0177777), "", m68020up | cpu32 },
4124{"trapcs", 2,   one(0052774),   one(0177777), "", m68020up | cpu32 },
4125{"trapeq", 2,   one(0053774),   one(0177777), "", m68020up | cpu32 },
4126{"trapf", 2,    one(0050774),   one(0177777), "", m68020up | cpu32 | mcfisa_a },
4127{"trapge", 2,   one(0056374),   one(0177777), "", m68020up | cpu32 },
4128{"trapgt", 2,   one(0057374),   one(0177777), "", m68020up | cpu32 },
4129{"traphi", 2,   one(0051374),   one(0177777), "", m68020up | cpu32 },
4130{"traple", 2,   one(0057774),   one(0177777), "", m68020up | cpu32 },
4131{"trapls", 2,   one(0051774),   one(0177777), "", m68020up | cpu32 },
4132{"traplt", 2,   one(0056774),   one(0177777), "", m68020up | cpu32 },
4133{"trapmi", 2,   one(0055774),   one(0177777), "", m68020up | cpu32 },
4134{"trapne", 2,   one(0053374),   one(0177777), "", m68020up | cpu32 },
4135{"trappl", 2,   one(0055374),   one(0177777), "", m68020up | cpu32 },
4136{"trapt", 2,    one(0050374),   one(0177777), "", m68020up | cpu32 },
4137{"trapvc", 2,   one(0054374),   one(0177777), "", m68020up | cpu32 },
4138{"trapvs", 2,   one(0054774),   one(0177777), "", m68020up | cpu32 },
4139
4140{"trapccw", 4,  one(0052372),   one(0177777), "#w", m68020up|cpu32 },
4141{"trapcsw", 4,  one(0052772),   one(0177777), "#w", m68020up|cpu32 },
4142{"trapeqw", 4,  one(0053772),   one(0177777), "#w", m68020up|cpu32 },
4143{"trapfw", 4,   one(0050772),   one(0177777), "#w", m68020up|cpu32|mcfisa_a},
4144{"trapgew", 4,  one(0056372),   one(0177777), "#w", m68020up|cpu32 },
4145{"trapgtw", 4,  one(0057372),   one(0177777), "#w", m68020up|cpu32 },
4146{"traphiw", 4,  one(0051372),   one(0177777), "#w", m68020up|cpu32 },
4147{"traplew", 4,  one(0057772),   one(0177777), "#w", m68020up|cpu32 },
4148{"traplsw", 4,  one(0051772),   one(0177777), "#w", m68020up|cpu32 },
4149{"trapltw", 4,  one(0056772),   one(0177777), "#w", m68020up|cpu32 },
4150{"trapmiw", 4,  one(0055772),   one(0177777), "#w", m68020up|cpu32 },
4151{"trapnew", 4,  one(0053372),   one(0177777), "#w", m68020up|cpu32 },
4152{"trapplw", 4,  one(0055372),   one(0177777), "#w", m68020up|cpu32 },
4153{"traptw", 4,   one(0050372),   one(0177777), "#w", m68020up|cpu32 },
4154{"trapvcw", 4,  one(0054372),   one(0177777), "#w", m68020up|cpu32 },
4155{"trapvsw", 4,  one(0054772),   one(0177777), "#w", m68020up|cpu32 },
4156
4157{"trapccl", 6,  one(0052373),   one(0177777), "#l", m68020up|cpu32 },
4158{"trapcsl", 6,  one(0052773),   one(0177777), "#l", m68020up|cpu32 },
4159{"trapeql", 6,  one(0053773),   one(0177777), "#l", m68020up|cpu32 },
4160{"trapfl", 6,   one(0050773),   one(0177777), "#l", m68020up|cpu32|mcfisa_a},
4161{"trapgel", 6,  one(0056373),   one(0177777), "#l", m68020up|cpu32 },
4162{"trapgtl", 6,  one(0057373),   one(0177777), "#l", m68020up|cpu32 },
4163{"traphil", 6,  one(0051373),   one(0177777), "#l", m68020up|cpu32 },
4164{"traplel", 6,  one(0057773),   one(0177777), "#l", m68020up|cpu32 },
4165{"traplsl", 6,  one(0051773),   one(0177777), "#l", m68020up|cpu32 },
4166{"trapltl", 6,  one(0056773),   one(0177777), "#l", m68020up|cpu32 },
4167{"trapmil", 6,  one(0055773),   one(0177777), "#l", m68020up|cpu32 },
4168{"trapnel", 6,  one(0053373),   one(0177777), "#l", m68020up|cpu32 },
4169{"trappll", 6,  one(0055373),   one(0177777), "#l", m68020up|cpu32 },
4170{"traptl", 6,   one(0050373),   one(0177777), "#l", m68020up|cpu32 },
4171{"trapvcl", 6,  one(0054373),   one(0177777), "#l", m68020up|cpu32 },
4172{"trapvsl", 6,  one(0054773),   one(0177777), "#l", m68020up|cpu32 },
4173
4174{"trapv", 2,    one(0047166),   one(0177777), "", m68000up },
4175
4176{"tstb", 2,     one(0045000),   one(0177700), ";b", m68020up|cpu32|mcfisa_a },
4177{"tstb", 2,     one(0045000),   one(0177700), "$b", m68000up },
4178{"tstw", 2,     one(0045100),   one(0177700), "*w", m68020up|cpu32|mcfisa_a },
4179{"tstw", 2,     one(0045100),   one(0177700), "$w", m68000up },
4180{"tstl", 2,     one(0045200),   one(0177700), "*l", m68020up|cpu32|mcfisa_a },
4181{"tstl", 2,     one(0045200),   one(0177700), "$l", m68000up },
4182
4183{"unlk", 2,     one(0047130),   one(0177770), "As", m68000up | mcfisa_a },
4184
4185{"unpk", 4,     one(0100600),   one(0170770), "DsDd#w", m68020up },
4186{"unpk", 4,     one(0100610),   one(0170770), "-s-d#w", m68020up },
4187
4188{"wddatab", 2,  one(0175400),   one(0177700), "~s", mcfisa_a },
4189{"wddataw", 2,  one(0175500),   one(0177700), "~s", mcfisa_a },
4190{"wddatal", 2,  one(0175600),   one(0177700), "~s", mcfisa_a },
4191
4192{"wdebug", 4,   two(0175720, 03),       two(0177770, 0xffff), "as", mcfisa_a },
4193{"wdebug", 4,   two(0175750, 03),       two(0177770, 0xffff), "ds", mcfisa_a },
4194};
4195
4196const int m68k_numopcodes = sizeof m68k_opcodes / sizeof m68k_opcodes[0];
4197
4198/* These aliases used to be in the above table, each one duplicating
4199   all of the entries for its primary exactly.  This table was
4200   constructed by mechanical processing of the opcode table, with a
4201   small number of tweaks done by hand.  There are probably a lot more
4202   aliases above that could be moved down here, except for very minor
4203   differences.  */
4204
4205const struct m68k_opcode_alias m68k_opcode_aliases[] =
4206{
4207  { "add",      "addw", },
4208  { "adda",     "addaw", },
4209  { "addi",     "addiw", },
4210  { "addq",     "addqw", },
4211  { "addx",     "addxw", },
4212  { "asl",      "aslw", },
4213  { "asr",      "asrw", },
4214  { "bhi",      "bhiw", },
4215  { "bls",      "blsw", },
4216  { "bcc",      "bccw", },
4217  { "bcs",      "bcsw", },
4218  { "bne",      "bnew", },
4219  { "beq",      "beqw", },
4220  { "bvc",      "bvcw", },
4221  { "bvs",      "bvsw", },
4222  { "bpl",      "bplw", },
4223  { "bmi",      "bmiw", },
4224  { "bge",      "bgew", },
4225  { "blt",      "bltw", },
4226  { "bgt",      "bgtw", },
4227  { "ble",      "blew", },
4228  { "bra",      "braw", },
4229  { "bsr",      "bsrw", },
4230  { "bhib",     "bhis", },
4231  { "blsb",     "blss", },
4232  { "bccb",     "bccs", },
4233  { "bcsb",     "bcss", },
4234  { "bneb",     "bnes", },
4235  { "beqb",     "beqs", },
4236  { "bvcb",     "bvcs", },
4237  { "bvsb",     "bvss", },
4238  { "bplb",     "bpls", },
4239  { "bmib",     "bmis", },
4240  { "bgeb",     "bges", },
4241  { "bltb",     "blts", },
4242  { "bgtb",     "bgts", },
4243  { "bleb",     "bles", },
4244  { "brab",     "bras", },
4245  { "bsrb",     "bsrs", },
4246  { "bhs",      "bccw" },
4247  { "bhss",     "bccs" },
4248  { "bhsb",     "bccs" },
4249  { "bhsw",     "bccw" },
4250  { "bhsl",     "bccl" },
4251  { "blo",      "bcsw" },
4252  { "blos",     "bcss" },
4253  { "blob",     "bcss" },
4254  { "blow",     "bcsw" },
4255  { "blol",     "bcsl" },
4256  { "br",       "braw", },
4257  { "brs",      "bras", },
4258  { "brb",      "bras", },
4259  { "brw",      "braw", },
4260  { "brl",      "bral", },
4261  { "jfnlt",    "bcc", },       /* Apparently a sun alias.  */
4262  { "jfngt",    "ble", },       /* Apparently a sun alias.  */
4263  { "jfeq",     "beqs", },      /* Apparently a sun alias.  */
4264  { "bchgb",    "bchg", },
4265  { "bchgl",    "bchg", },
4266  { "bclrb",    "bclr", },
4267  { "bclrl",    "bclr", },
4268  { "bsetb",    "bset", },
4269  { "bsetl",    "bset", },
4270  { "btstb",    "btst", },
4271  { "btstl",    "btst", },
4272  { "cas2",     "cas2w", },
4273  { "cas",      "casw", },
4274  { "chk2",     "chk2w", },
4275  { "chk",      "chkw", },
4276  { "clr",      "clrw", },
4277  { "cmp2",     "cmp2w", },
4278  { "cmpa",     "cmpaw", },
4279  { "cmpi",     "cmpiw", },
4280  { "cmpm",     "cmpmw", },
4281  { "cmp",      "cmpw", },
4282  { "dbccw",    "dbcc", },
4283  { "dbcsw",    "dbcs", },
4284  { "dbeqw",    "dbeq", },
4285  { "dbfw",     "dbf", },
4286  { "dbgew",    "dbge", },
4287  { "dbgtw",    "dbgt", },
4288  { "dbhiw",    "dbhi", },
4289  { "dblew",    "dble", },
4290  { "dblsw",    "dbls", },
4291  { "dbltw",    "dblt", },
4292  { "dbmiw",    "dbmi", },
4293  { "dbnew",    "dbne", },
4294  { "dbplw",    "dbpl", },
4295  { "dbtw",     "dbt", },
4296  { "dbvcw",    "dbvc", },
4297  { "dbvsw",    "dbvs", },
4298  { "dbhs",     "dbcc", },
4299  { "dbhsw",    "dbcc", },
4300  { "dbra",     "dbf", },
4301  { "dbraw",    "dbf", },
4302  { "tdivsl",   "divsl", },
4303  { "divs",     "divsw", },
4304  { "divu",     "divuw", },
4305  { "ext",      "extw", },
4306  { "extbw",    "extw", },
4307  { "extwl",    "extl", },
4308  { "fbneq",    "fbne", },
4309  { "fbsneq",   "fbsne", },
4310  { "fdbneq",   "fdbne", },
4311  { "fdbsneq",  "fdbsne", },
4312  { "fmovecr",  "fmovecrx", },
4313  { "fmovm",    "fmovem", },
4314  { "fsneq",    "fsne", },
4315  { "fssneq",   "fssne", },
4316  { "ftrapneq", "ftrapne", },
4317  { "ftrapsneq", "ftrapsne", },
4318  { "fjneq",    "fjne", },
4319  { "fjsneq",   "fjsne", },
4320  { "jmpl",     "jmp", },
4321  { "jmps",     "jmp", },
4322  { "jsrl",     "jsr", },
4323  { "jsrs",     "jsr", },
4324  { "leal",     "lea", },
4325  { "lsl",      "lslw", },
4326  { "lsr",      "lsrw", },
4327  { "mac",      "macw" },
4328  { "movea",    "moveaw", },
4329  { "movem",    "movemw", },
4330  { "movml",    "moveml", },
4331  { "movmw",    "movemw", },
4332  { "movm",     "movemw", },
4333  { "movep",    "movepw", },
4334  { "movpw",    "movepw", },
4335  { "moves",    "movesw" },
4336  { "muls",     "mulsw", },
4337  { "mulu",     "muluw", },
4338  { "msac",     "msacw" },
4339  { "nbcdb",    "nbcd" },
4340  { "neg",      "negw", },
4341  { "negx",     "negxw", },
4342  { "not",      "notw", },
4343  { "peal",     "pea", },
4344  { "rol",      "rolw", },
4345  { "ror",      "rorw", },
4346  { "roxl",     "roxlw", },
4347  { "roxr",     "roxrw", },
4348  { "sats",     "satsl", },
4349  { "sbcdb",    "sbcd", },
4350  { "sccb",     "scc", },
4351  { "scsb",     "scs", },
4352  { "seqb",     "seq", },
4353  { "sfb",      "sf", },
4354  { "sgeb",     "sge", },
4355  { "sgtb",     "sgt", },
4356  { "shib",     "shi", },
4357  { "sleb",     "sle", },
4358  { "slsb",     "sls", },
4359  { "sltb",     "slt", },
4360  { "smib",     "smi", },
4361  { "sneb",     "sne", },
4362  { "splb",     "spl", },
4363  { "stb",      "st", },
4364  { "svcb",     "svc", },
4365  { "svsb",     "svs", },
4366  { "sfge",     "sge", },
4367  { "sfgt",     "sgt", },
4368  { "sfle",     "sle", },
4369  { "sflt",     "slt", },
4370  { "sfneq",    "sne", },
4371  { "suba",     "subaw", },
4372  { "subi",     "subiw", },
4373  { "subq",     "subqw", },
4374  { "sub",      "subw", },
4375  { "subx",     "subxw", },
4376  { "swapw",    "swap", },
4377  { "tasb",     "tas", },
4378  { "tpcc",     "trapcc", },
4379  { "tcc",      "trapcc", },
4380  { "tst",      "tstw", },
4381  { "jbra",     "jra", },
4382  { "jbhi",     "jhi", },
4383  { "jbls",     "jls", },
4384  { "jbcc",     "jcc", },
4385  { "jbcs",     "jcs", },
4386  { "jbne",     "jne", },
4387  { "jbeq",     "jeq", },
4388  { "jbvc",     "jvc", },
4389  { "jbvs",     "jvs", },
4390  { "jbpl",     "jpl", },
4391  { "jbmi",     "jmi", },
4392  { "jbge",     "jge", },
4393  { "jblt",     "jlt", },
4394  { "jbgt",     "jgt", },
4395  { "jble",     "jle", },
4396  { "movql",    "moveq", },
4397  { "moveql",   "moveq", },
4398  { "movl",     "movel", },
4399  { "movq",     "moveq", },
4400  { "moval",    "moveal", },
4401  { "movaw",    "moveaw", },
4402  { "movb",     "moveb", },
4403  { "movc",     "movec", },
4404  { "movecl",   "movec", },
4405  { "movpl",    "movepl", },
4406  { "movw",     "movew", },
4407  { "movsb",    "movesb", },
4408  { "movsl",    "movesl", },
4409  { "movsw",    "movesw", },
4410  { "mov3q",    "mov3ql", },
4411
4412  { "tdivul",   "divul", },     /* For m68k-svr4.  */
4413  { "fmovb",    "fmoveb", },
4414  { "fsmovb",   "fsmoveb", },
4415  { "fdmovb",   "fdmoveb", },
4416  { "fmovd",    "fmoved", },
4417  { "fsmovd",   "fsmoved", },
4418  { "fmovl",    "fmovel", },
4419  { "fsmovl",   "fsmovel", },
4420  { "fdmovl",   "fdmovel", },
4421  { "fmovp",    "fmovep", },
4422  { "fsmovp",   "fsmovep", },
4423  { "fdmovp",   "fdmovep", },
4424  { "fmovs",    "fmoves", },
4425  { "fsmovs",   "fsmoves", },
4426  { "fdmovs",   "fdmoves", },
4427  { "fmovw",    "fmovew", },
4428  { "fsmovw",   "fsmovew", },
4429  { "fdmovw",   "fdmovew", },
4430  { "fmovx",    "fmovex", },
4431  { "fsmovx",   "fsmovex", },
4432  { "fdmovx",   "fdmovex", },
4433  { "fmovcr",   "fmovecr", },
4434  { "fmovcrx",  "fmovecrx", },
4435  { "ftestb",   "ftstb", },
4436  { "ftestd",   "ftstd", },
4437  { "ftestl",   "ftstl", },
4438  { "ftestp",   "ftstp", },
4439  { "ftests",   "ftsts", },
4440  { "ftestw",   "ftstw", },
4441  { "ftestx",   "ftstx", },
4442
4443  { "bitrevl",  "bitrev", },
4444  { "byterevl", "byterev", },
4445  { "ff1l",     "ff1", },
4446
4447};
4448
4449const int m68k_numaliases =
4450  sizeof m68k_opcode_aliases / sizeof m68k_opcode_aliases[0];
4451/* **** End of m68k-opc.c */
4452/* **** floatformat.c from sourceware.org CVS 2005-08-14.  */
4453/* IEEE floating point support routines, for GDB, the GNU Debugger.
4454   Copyright (C) 1991, 1994, 1999, 2000, 2003 Free Software Foundation, Inc.
4455
4456This file is part of GDB.
4457
4458This program is free software; you can redistribute it and/or modify
4459it under the terms of the GNU General Public License as published by
4460the Free Software Foundation; either version 2 of the License, or
4461(at your option) any later version.
4462
4463This program is distributed in the hope that it will be useful,
4464but WITHOUT ANY WARRANTY; without even the implied warranty of
4465MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
4466GNU General Public License for more details.
4467
4468You should have received a copy of the GNU General Public License
4469along with this program; if not, see <http://www.gnu.org/licenses/>.  */
4470
4471/* This is needed to pick up the NAN macro on some systems.  */
4472//#define _GNU_SOURCE
4473
4474#ifndef INFINITY
4475#ifdef HUGE_VAL
4476#define INFINITY HUGE_VAL
4477#else
4478#define INFINITY (1.0 / 0.0)
4479#endif
4480#endif
4481
4482#ifndef NAN
4483#define NAN (0.0 / 0.0)
4484#endif
4485
4486static unsigned long get_field (const unsigned char *,
4487                                enum floatformat_byteorders,
4488                                unsigned int,
4489                                unsigned int,
4490                                unsigned int);
4491static int floatformat_always_valid (const struct floatformat *fmt,
4492                                     const char *from);
4493
4494static int
4495floatformat_always_valid (const struct floatformat *fmt ATTRIBUTE_UNUSED,
4496                          const char *from ATTRIBUTE_UNUSED)
4497{
4498  return 1;
4499}
4500
4501/* The odds that CHAR_BIT will be anything but 8 are low enough that I'm not
4502   going to bother with trying to muck around with whether it is defined in
4503   a system header, what we do if not, etc.  */
4504#define FLOATFORMAT_CHAR_BIT 8
4505
4506/* floatformats for IEEE single and double, big and little endian.  */
4507const struct floatformat floatformat_ieee_single_big =
4508{
4509  floatformat_big, 32, 0, 1, 8, 127, 255, 9, 23,
4510  floatformat_intbit_no,
4511  "floatformat_ieee_single_big",
4512  floatformat_always_valid
4513};
4514const struct floatformat floatformat_ieee_single_little =
4515{
4516  floatformat_little, 32, 0, 1, 8, 127, 255, 9, 23,
4517  floatformat_intbit_no,
4518  "floatformat_ieee_single_little",
4519  floatformat_always_valid
4520};
4521const struct floatformat floatformat_ieee_double_big =
4522{
4523  floatformat_big, 64, 0, 1, 11, 1023, 2047, 12, 52,
4524  floatformat_intbit_no,
4525  "floatformat_ieee_double_big",
4526  floatformat_always_valid
4527};
4528const struct floatformat floatformat_ieee_double_little =
4529{
4530  floatformat_little, 64, 0, 1, 11, 1023, 2047, 12, 52,
4531  floatformat_intbit_no,
4532  "floatformat_ieee_double_little",
4533  floatformat_always_valid
4534};
4535
4536/* floatformat for IEEE double, little endian byte order, with big endian word
4537   ordering, as on the ARM.  */
4538
4539const struct floatformat floatformat_ieee_double_littlebyte_bigword =
4540{
4541  floatformat_littlebyte_bigword, 64, 0, 1, 11, 1023, 2047, 12, 52,
4542  floatformat_intbit_no,
4543  "floatformat_ieee_double_littlebyte_bigword",
4544  floatformat_always_valid
4545};
4546
4547static int floatformat_i387_ext_is_valid (const struct floatformat *fmt, const char *from);
4548
4549static int
4550floatformat_i387_ext_is_valid (const struct floatformat *fmt, const char *from)
4551{
4552  /* In the i387 double-extended format, if the exponent is all ones,
4553     then the integer bit must be set.  If the exponent is neither 0
4554     nor ~0, the intbit must also be set.  Only if the exponent is
4555     zero can it be zero, and then it must be zero.  */
4556  unsigned long exponent, int_bit;
4557  const unsigned char *ufrom = (const unsigned char *) from;
4558
4559  exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize,
4560                        fmt->exp_start, fmt->exp_len);
4561  int_bit = get_field (ufrom, fmt->byteorder, fmt->totalsize,
4562                       fmt->man_start, 1);
4563
4564  if ((exponent == 0) != (int_bit == 0))
4565    return 0;
4566  else
4567    return 1;
4568}
4569
4570const struct floatformat floatformat_i387_ext =
4571{
4572  floatformat_little, 80, 0, 1, 15, 0x3fff, 0x7fff, 16, 64,
4573  floatformat_intbit_yes,
4574  "floatformat_i387_ext",
4575  floatformat_i387_ext_is_valid
4576};
4577const struct floatformat floatformat_m68881_ext =
4578{
4579  /* Note that the bits from 16 to 31 are unused.  */
4580  floatformat_big, 96, 0, 1, 15, 0x3fff, 0x7fff, 32, 64,
4581  floatformat_intbit_yes,
4582  "floatformat_m68881_ext",
4583  floatformat_always_valid
4584};
4585const struct floatformat floatformat_i960_ext =
4586{
4587  /* Note that the bits from 0 to 15 are unused.  */
4588  floatformat_little, 96, 16, 17, 15, 0x3fff, 0x7fff, 32, 64,
4589  floatformat_intbit_yes,
4590  "floatformat_i960_ext",
4591  floatformat_always_valid
4592};
4593const struct floatformat floatformat_m88110_ext =
4594{
4595  floatformat_big, 80, 0, 1, 15, 0x3fff, 0x7fff, 16, 64,
4596  floatformat_intbit_yes,
4597  "floatformat_m88110_ext",
4598  floatformat_always_valid
4599};
4600const struct floatformat floatformat_m88110_harris_ext =
4601{
4602  /* Harris uses raw format 128 bytes long, but the number is just an ieee
4603     double, and the last 64 bits are wasted. */
4604  floatformat_big,128, 0, 1, 11,  0x3ff,  0x7ff, 12, 52,
4605  floatformat_intbit_no,
4606  "floatformat_m88110_ext_harris",
4607  floatformat_always_valid
4608};
4609const struct floatformat floatformat_arm_ext_big =
4610{
4611  /* Bits 1 to 16 are unused.  */
4612  floatformat_big, 96, 0, 17, 15, 0x3fff, 0x7fff, 32, 64,
4613  floatformat_intbit_yes,
4614  "floatformat_arm_ext_big",
4615  floatformat_always_valid
4616};
4617const struct floatformat floatformat_arm_ext_littlebyte_bigword =
4618{
4619  /* Bits 1 to 16 are unused.  */
4620  floatformat_littlebyte_bigword, 96, 0, 17, 15, 0x3fff, 0x7fff, 32, 64,
4621  floatformat_intbit_yes,
4622  "floatformat_arm_ext_littlebyte_bigword",
4623  floatformat_always_valid
4624};
4625const struct floatformat floatformat_ia64_spill_big =
4626{
4627  floatformat_big, 128, 0, 1, 17, 65535, 0x1ffff, 18, 64,
4628  floatformat_intbit_yes,
4629  "floatformat_ia64_spill_big",
4630  floatformat_always_valid
4631};
4632const struct floatformat floatformat_ia64_spill_little =
4633{
4634  floatformat_little, 128, 0, 1, 17, 65535, 0x1ffff, 18, 64,
4635  floatformat_intbit_yes,
4636  "floatformat_ia64_spill_little",
4637  floatformat_always_valid
4638};
4639const struct floatformat floatformat_ia64_quad_big =
4640{
4641  floatformat_big, 128, 0, 1, 15, 16383, 0x7fff, 16, 112,
4642  floatformat_intbit_no,
4643  "floatformat_ia64_quad_big",
4644  floatformat_always_valid
4645};
4646const struct floatformat floatformat_ia64_quad_little =
4647{
4648  floatformat_little, 128, 0, 1, 15, 16383, 0x7fff, 16, 112,
4649  floatformat_intbit_no,
4650  "floatformat_ia64_quad_little",
4651  floatformat_always_valid
4652};
4653
4654/* Extract a field which starts at START and is LEN bits long.  DATA and
4655   TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER.  */
4656static unsigned long
4657get_field (const unsigned char *data, enum floatformat_byteorders order,
4658           unsigned int total_len, unsigned int start, unsigned int len)
4659{
4660  unsigned long result;
4661  unsigned int cur_byte;
4662  int cur_bitshift;
4663
4664  /* Start at the least significant part of the field.  */
4665  cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
4666  if (order == floatformat_little)
4667    cur_byte = (total_len / FLOATFORMAT_CHAR_BIT) - cur_byte - 1;
4668  cur_bitshift =
4669    ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
4670  result = *(data + cur_byte) >> (-cur_bitshift);
4671  cur_bitshift += FLOATFORMAT_CHAR_BIT;
4672  if (order == floatformat_little)
4673    ++cur_byte;
4674  else
4675    --cur_byte;
4676
4677  /* Move towards the most significant part of the field.  */
4678  while ((unsigned int) cur_bitshift < len)
4679    {
4680      if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
4681        /* This is the last byte; zero out the bits which are not part of
4682           this field.  */
4683        result |=
4684          (*(data + cur_byte) & ((1 << (len - cur_bitshift)) - 1))
4685            << cur_bitshift;
4686      else
4687        result |= *(data + cur_byte) << cur_bitshift;
4688      cur_bitshift += FLOATFORMAT_CHAR_BIT;
4689      if (order == floatformat_little)
4690        ++cur_byte;
4691      else
4692        --cur_byte;
4693    }
4694  return result;
4695}
4696
4697#ifndef min
4698#define min(a, b) ((a) < (b) ? (a) : (b))
4699#endif
4700
4701/* Convert from FMT to a double.
4702   FROM is the address of the extended float.
4703   Store the double in *TO.  */
4704
4705void
4706floatformat_to_double (const struct floatformat *fmt,
4707                       const char *from, double *to)
4708{
4709  const unsigned char *ufrom = (const unsigned char *)from;
4710  double dto;
4711  long exponent;
4712  unsigned long mant;
4713  unsigned int mant_bits, mant_off;
4714  int mant_bits_left;
4715  int special_exponent;         /* It's a NaN, denorm or zero */
4716
4717  exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize,
4718                        fmt->exp_start, fmt->exp_len);
4719
4720  /* If the exponent indicates a NaN, we don't have information to
4721     decide what to do.  So we handle it like IEEE, except that we
4722     don't try to preserve the type of NaN.  FIXME.  */
4723  if ((unsigned long) exponent == fmt->exp_nan)
4724    {
4725      int nan;
4726
4727      mant_off = fmt->man_start;
4728      mant_bits_left = fmt->man_len;
4729      nan = 0;
4730      while (mant_bits_left > 0)
4731        {
4732          mant_bits = min (mant_bits_left, 32);
4733
4734          if (get_field (ufrom, fmt->byteorder, fmt->totalsize,
4735                         mant_off, mant_bits) != 0)
4736            {
4737              /* This is a NaN.  */
4738              nan = 1;
4739              break;
4740            }
4741
4742          mant_off += mant_bits;
4743          mant_bits_left -= mant_bits;
4744        }
4745
4746      /* On certain systems (such as GNU/Linux), the use of the
4747         INFINITY macro below may generate a warning that can not be
4748         silenced due to a bug in GCC (PR preprocessor/11931).  The
4749         preprocessor fails to recognise the __extension__ keyword in
4750         conjunction with the GNU/C99 extension for hexadecimal
4751         floating point constants and will issue a warning when
4752         compiling with -pedantic.  */
4753      if (nan)
4754        dto = NAN;
4755      else
4756        dto = INFINITY;
4757
4758      if (get_field (ufrom, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1))
4759        dto = -dto;
4760
4761      *to = dto;
4762
4763      return;
4764    }
4765
4766  mant_bits_left = fmt->man_len;
4767  mant_off = fmt->man_start;
4768  dto = 0.0;
4769
4770  special_exponent = exponent == 0 || (unsigned long) exponent == fmt->exp_nan;
4771
4772  /* Don't bias zero's, denorms or NaNs.  */
4773  if (!special_exponent)
4774    exponent -= fmt->exp_bias;
4775
4776  /* Build the result algebraically.  Might go infinite, underflow, etc;
4777     who cares. */
4778
4779  /* If this format uses a hidden bit, explicitly add it in now.  Otherwise,
4780     increment the exponent by one to account for the integer bit.  */
4781
4782  if (!special_exponent)
4783    {
4784      if (fmt->intbit == floatformat_intbit_no)
4785        dto = ldexp (1.0, exponent);
4786      else
4787        exponent++;
4788    }
4789
4790  while (mant_bits_left > 0)
4791    {
4792      mant_bits = min (mant_bits_left, 32);
4793
4794      mant = get_field (ufrom, fmt->byteorder, fmt->totalsize,
4795                         mant_off, mant_bits);
4796
4797      /* Handle denormalized numbers.  FIXME: What should we do for
4798         non-IEEE formats?  */
4799      if (exponent == 0 && mant != 0)
4800        dto += ldexp ((double)mant,
4801                      (- fmt->exp_bias
4802                       - mant_bits
4803                       - (mant_off - fmt->man_start)
4804                       + 1));
4805      else
4806        dto += ldexp ((double)mant, exponent - mant_bits);
4807      if (exponent != 0)
4808        exponent -= mant_bits;
4809      mant_off += mant_bits;
4810      mant_bits_left -= mant_bits;
4811    }
4812
4813  /* Negate it if negative.  */
4814  if (get_field (ufrom, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1))
4815    dto = -dto;
4816  *to = dto;
4817}
4818
4819static void put_field (unsigned char *, enum floatformat_byteorders,
4820                       unsigned int,
4821                       unsigned int,
4822                       unsigned int,
4823                       unsigned long);
4824
4825/* Set a field which starts at START and is LEN bits long.  DATA and
4826   TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER.  */
4827static void
4828put_field (unsigned char *data, enum floatformat_byteorders order,
4829           unsigned int total_len, unsigned int start, unsigned int len,
4830           unsigned long stuff_to_put)
4831{
4832  unsigned int cur_byte;
4833  int cur_bitshift;
4834
4835  /* Start at the least significant part of the field.  */
4836  cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
4837  if (order == floatformat_little)
4838    cur_byte = (total_len / FLOATFORMAT_CHAR_BIT) - cur_byte - 1;
4839  cur_bitshift =
4840    ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
4841  *(data + cur_byte) &=
4842    ~(((1 << ((start + len) % FLOATFORMAT_CHAR_BIT)) - 1) << (-cur_bitshift));
4843  *(data + cur_byte) |=
4844    (stuff_to_put & ((1 << FLOATFORMAT_CHAR_BIT) - 1)) << (-cur_bitshift);
4845  cur_bitshift += FLOATFORMAT_CHAR_BIT;
4846  if (order == floatformat_little)
4847    ++cur_byte;
4848  else
4849    --cur_byte;
4850
4851  /* Move towards the most significant part of the field.  */
4852  while ((unsigned int) cur_bitshift < len)
4853    {
4854      if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
4855        {
4856          /* This is the last byte.  */
4857          *(data + cur_byte) &=
4858            ~((1 << (len - cur_bitshift)) - 1);
4859          *(data + cur_byte) |= (stuff_to_put >> cur_bitshift);
4860        }
4861      else
4862        *(data + cur_byte) = ((stuff_to_put >> cur_bitshift)
4863                              & ((1 << FLOATFORMAT_CHAR_BIT) - 1));
4864      cur_bitshift += FLOATFORMAT_CHAR_BIT;
4865      if (order == floatformat_little)
4866        ++cur_byte;
4867      else
4868        --cur_byte;
4869    }
4870}
4871
4872/* The converse: convert the double *FROM to an extended float
4873   and store where TO points.  Neither FROM nor TO have any alignment
4874   restrictions.  */
4875
4876void
4877floatformat_from_double (const struct floatformat *fmt,
4878                         const double *from, char *to)
4879{
4880  double dfrom;
4881  int exponent;
4882  double mant;
4883  unsigned int mant_bits, mant_off;
4884  int mant_bits_left;
4885  unsigned char *uto = (unsigned char *)to;
4886
4887  dfrom = *from;
4888  memset (uto, 0, fmt->totalsize / FLOATFORMAT_CHAR_BIT);
4889
4890  /* If negative, set the sign bit.  */
4891  if (dfrom < 0)
4892    {
4893      put_field (uto, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1, 1);
4894      dfrom = -dfrom;
4895    }
4896
4897  if (dfrom == 0)
4898    {
4899      /* 0.0.  */
4900      return;
4901    }
4902
4903  if (dfrom != dfrom)
4904    {
4905      /* NaN.  */
4906      put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start,
4907                 fmt->exp_len, fmt->exp_nan);
4908      /* Be sure it's not infinity, but NaN value is irrelevant.  */
4909      put_field (uto, fmt->byteorder, fmt->totalsize, fmt->man_start,
4910                 32, 1);
4911      return;
4912    }
4913
4914  if (dfrom + dfrom == dfrom)
4915    {
4916      /* This can only happen for an infinite value (or zero, which we
4917         already handled above).  */
4918      put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start,
4919                 fmt->exp_len, fmt->exp_nan);
4920      return;
4921    }
4922
4923  mant = frexp (dfrom, &exponent);
4924  if (exponent + fmt->exp_bias - 1 > 0)
4925    put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start,
4926               fmt->exp_len, exponent + fmt->exp_bias - 1);
4927  else
4928    {
4929      /* Handle a denormalized number.  FIXME: What should we do for
4930         non-IEEE formats?  */
4931      put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start,
4932                 fmt->exp_len, 0);
4933      mant = ldexp (mant, exponent + fmt->exp_bias - 1);
4934    }
4935
4936  mant_bits_left = fmt->man_len;
4937  mant_off = fmt->man_start;
4938  while (mant_bits_left > 0)
4939    {
4940      unsigned long mant_long;
4941      mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
4942
4943      mant *= 4294967296.0;
4944      mant_long = (unsigned long)mant;
4945      mant -= mant_long;
4946
4947      /* If the integer bit is implicit, and we are not creating a
4948         denormalized number, then we need to discard it.  */
4949      if ((unsigned int) mant_bits_left == fmt->man_len
4950          && fmt->intbit == floatformat_intbit_no
4951          && exponent + fmt->exp_bias - 1 > 0)
4952        {
4953          mant_long &= 0x7fffffff;
4954          mant_bits -= 1;
4955        }
4956      else if (mant_bits < 32)
4957        {
4958          /* The bits we want are in the most significant MANT_BITS bits of
4959             mant_long.  Move them to the least significant.  */
4960          mant_long >>= 32 - mant_bits;
4961        }
4962
4963      put_field (uto, fmt->byteorder, fmt->totalsize,
4964                 mant_off, mant_bits, mant_long);
4965      mant_off += mant_bits;
4966      mant_bits_left -= mant_bits;
4967    }
4968}
4969
4970/* Return non-zero iff the data at FROM is a valid number in format FMT.  */
4971
4972int
4973floatformat_is_valid (const struct floatformat *fmt, const char *from)
4974{
4975  return fmt->is_valid (fmt, from);
4976}
4977
4978
4979#ifdef IEEE_DEBUG
4980
4981/* This is to be run on a host which uses IEEE floating point.  */
4982
4983void
4984ieee_test (double n)
4985{
4986  double result;
4987
4988  floatformat_to_double (&floatformat_ieee_double_little, (char *) &n,
4989                         &result);
4990  if ((n != result && (! isnan (n) || ! isnan (result)))
4991      || (n < 0 && result >= 0)
4992      || (n >= 0 && result < 0))
4993    printf ("Differ(to): %.20g -> %.20g\n", n, result);
4994
4995  floatformat_from_double (&floatformat_ieee_double_little, &n,
4996                           (char *) &result);
4997  if ((n != result && (! isnan (n) || ! isnan (result)))
4998      || (n < 0 && result >= 0)
4999      || (n >= 0 && result < 0))
5000    printf ("Differ(from): %.20g -> %.20g\n", n, result);
5001
5002#if 0
5003  {
5004    char exten[16];
5005
5006    floatformat_from_double (&floatformat_m68881_ext, &n, exten);
5007    floatformat_to_double (&floatformat_m68881_ext, exten, &result);
5008    if (n != result)
5009      printf ("Differ(to+from): %.20g -> %.20g\n", n, result);
5010  }
5011#endif
5012
5013#if IEEE_DEBUG > 1
5014  /* This is to be run on a host which uses 68881 format.  */
5015  {
5016    long double ex = *(long double *)exten;
5017    if (ex != n)
5018      printf ("Differ(from vs. extended): %.20g\n", n);
5019  }
5020#endif
5021}
5022
5023int
5024main (void)
5025{
5026  ieee_test (0.0);
5027  ieee_test (0.5);
5028  ieee_test (256.0);
5029  ieee_test (0.12345);
5030  ieee_test (234235.78907234);
5031  ieee_test (-512.0);
5032  ieee_test (-0.004321);
5033  ieee_test (1.2E-70);
5034  ieee_test (1.2E-316);
5035  ieee_test (4.9406564584124654E-324);
5036  ieee_test (- 4.9406564584124654E-324);
5037  ieee_test (- 0.0);
5038  ieee_test (- INFINITY);
5039  ieee_test (- NAN);
5040  ieee_test (INFINITY);
5041  ieee_test (NAN);
5042  return 0;
5043}
5044#endif
5045/* **** End of floatformat.c  */
5046