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