qemu/disas/m68k.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 "disas/bfd.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  sigjmp_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      siglongjmp(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 (sigsetjmp(priv.bailout, 0) != 0) {
1916      /* Error return.  */
1917      return -1;
1918  }
1919
1920  switch (info->mach)
1921    {
1922    default:
1923    case 0:
1924      arch_mask = (unsigned int) -1;
1925      break;
1926    case bfd_mach_m68000:
1927      arch_mask = m68000|m68881|m68851;
1928      break;
1929    case bfd_mach_m68008:
1930      arch_mask = m68008|m68881|m68851;
1931      break;
1932    case bfd_mach_m68010:
1933      arch_mask = m68010|m68881|m68851;
1934      break;
1935    case bfd_mach_m68020:
1936      arch_mask = m68020|m68881|m68851;
1937      break;
1938    case bfd_mach_m68030:
1939      arch_mask = m68030|m68881|m68851;
1940      break;
1941    case bfd_mach_m68040:
1942      arch_mask = m68040|m68881|m68851;
1943      break;
1944    case bfd_mach_m68060:
1945      arch_mask = m68060|m68881|m68851;
1946      break;
1947    case bfd_mach_mcf5200:
1948      arch_mask = mcfisa_a;
1949      break;
1950    case bfd_mach_mcf521x:
1951    case bfd_mach_mcf528x:
1952      arch_mask = mcfisa_a|mcfhwdiv|mcfisa_aa|mcfusp|mcfemac;
1953      break;
1954    case bfd_mach_mcf5206e:
1955      arch_mask = mcfisa_a|mcfhwdiv|mcfmac;
1956      break;
1957    case bfd_mach_mcf5249:
1958      arch_mask = mcfisa_a|mcfhwdiv|mcfemac;
1959      break;
1960    case bfd_mach_mcf5307:
1961      arch_mask = mcfisa_a|mcfhwdiv|mcfmac;
1962      break;
1963    case bfd_mach_mcf5407:
1964      arch_mask = mcfisa_a|mcfhwdiv|mcfisa_b|mcfmac;
1965      break;
1966    case bfd_mach_mcf547x:
1967    case bfd_mach_mcf548x:
1968    case bfd_mach_mcfv4e:
1969      arch_mask = mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|cfloat|mcfemac;
1970      break;
1971    }
1972
1973  fetch_data(info, buffer + 2);
1974  major_opcode = (buffer[0] >> 4) & 15;
1975
1976  for (i = 0; i < numopcodes[major_opcode]; i++)
1977    {
1978      const struct m68k_opcode *opc = opcodes[major_opcode][i];
1979      unsigned long opcode = opc->opcode;
1980      unsigned long match = opc->match;
1981
1982      if (((0xff & buffer[0] & (match >> 24)) == (0xff & (opcode >> 24)))
1983          && ((0xff & buffer[1] & (match >> 16)) == (0xff & (opcode >> 16)))
1984          /* Only fetch the next two bytes if we need to.  */
1985          && (((0xffff & match) == 0)
1986              ||
1987              (fetch_data(info, buffer + 4)
1988               && ((0xff & buffer[2] & (match >> 8)) == (0xff & (opcode >> 8)))
1989               && ((0xff & buffer[3] & match) == (0xff & opcode)))
1990              )
1991          && (opc->arch & arch_mask) != 0)
1992        {
1993          /* Don't use for printout the variants of divul and divsl
1994             that have the same register number in two places.
1995             The more general variants will match instead.  */
1996          for (d = opc->args; *d; d += 2)
1997            if (d[1] == 'D')
1998              break;
1999
2000          /* Don't use for printout the variants of most floating
2001             point coprocessor instructions which use the same
2002             register number in two places, as above.  */
2003          if (*d == '\0')
2004            for (d = opc->args; *d; d += 2)
2005              if (d[1] == 't')
2006                break;
2007
2008          /* Don't match fmovel with more than one register;
2009             wait for fmoveml.  */
2010          if (*d == '\0')
2011            {
2012              for (d = opc->args; *d; d += 2)
2013                {
2014                  if (d[0] == 's' && d[1] == '8')
2015                    {
2016                      val = fetch_arg (buffer, d[1], 3, info);
2017                      if ((val & (val - 1)) != 0)
2018                        break;
2019                    }
2020                }
2021            }
2022
2023          if (*d == '\0')
2024            if ((val = match_insn_m68k (memaddr, info, opc, & priv)))
2025              return val;
2026        }
2027    }
2028
2029  /* Handle undefined instructions.  */
2030  info->fprintf_func (info->stream, "0%o", (buffer[0] << 8) + buffer[1]);
2031  return 2;
2032}
2033/* **** End of m68k-dis.c */
2034/* **** m68k-opc.h from sourceware.org CVS 2005-08-14.  */
2035/* Opcode table for m680[012346]0/m6888[12]/m68851/mcf5200.
2036   Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2037   2000, 2001, 2003, 2004, 2005
2038   Free Software Foundation, Inc.
2039
2040   This file is part of GDB, GAS, and the GNU binutils.
2041
2042   GDB, GAS, and the GNU binutils are free software; you can redistribute
2043   them and/or modify them under the terms of the GNU General Public
2044   License as published by the Free Software Foundation; either version
2045   1, or (at your option) any later version.
2046
2047   GDB, GAS, and the GNU binutils are distributed in the hope that they
2048   will be useful, but WITHOUT ANY WARRANTY; without even the implied
2049   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
2050   the GNU General Public License for more details.
2051
2052   You should have received a copy of the GNU General Public License
2053   along with this file; see the file COPYING.  If not,
2054   see <http://www.gnu.org/licenses/>.  */
2055
2056#define one(x) ((unsigned int) (x) << 16)
2057#define two(x, y) (((unsigned int) (x) << 16) + (y))
2058
2059/* The assembler requires that all instances of the same mnemonic must
2060   be consecutive.  If they aren't, the assembler will bomb at
2061   runtime.  */
2062
2063const struct m68k_opcode m68k_opcodes[] =
2064{
2065{"abcd", 2,     one(0140400),   one(0170770), "DsDd", m68000up },
2066{"abcd", 2,     one(0140410),   one(0170770), "-s-d", m68000up },
2067
2068{"addaw", 2,    one(0150300),   one(0170700), "*wAd", m68000up },
2069{"addal", 2,    one(0150700),   one(0170700), "*lAd", m68000up | mcfisa_a },
2070
2071{"addib", 4,    one(0003000),   one(0177700), "#b$s", m68000up },
2072{"addiw", 4,    one(0003100),   one(0177700), "#w$s", m68000up },
2073{"addil", 6,    one(0003200),   one(0177700), "#l$s", m68000up },
2074{"addil", 6,    one(0003200),   one(0177700), "#lDs", mcfisa_a },
2075
2076{"addqb", 2,    one(0050000),   one(0170700), "Qd$b", m68000up },
2077{"addqw", 2,    one(0050100),   one(0170700), "Qd%w", m68000up },
2078{"addql", 2,    one(0050200),   one(0170700), "Qd%l", m68000up | mcfisa_a },
2079
2080/* The add opcode can generate the adda, addi, and addq instructions.  */
2081{"addb", 2,     one(0050000),   one(0170700), "Qd$b", m68000up },
2082{"addb", 4,     one(0003000),   one(0177700), "#b$s", m68000up },
2083{"addb", 2,     one(0150000),   one(0170700), ";bDd", m68000up },
2084{"addb", 2,     one(0150400),   one(0170700), "Dd~b", m68000up },
2085{"addw", 2,     one(0050100),   one(0170700), "Qd%w", m68000up },
2086{"addw", 2,     one(0150300),   one(0170700), "*wAd", m68000up },
2087{"addw", 4,     one(0003100),   one(0177700), "#w$s", m68000up },
2088{"addw", 2,     one(0150100),   one(0170700), "*wDd", m68000up },
2089{"addw", 2,     one(0150500),   one(0170700), "Dd~w", m68000up },
2090{"addl", 2,     one(0050200),   one(0170700), "Qd%l", m68000up | mcfisa_a },
2091{"addl", 6,     one(0003200),   one(0177700), "#l$s", m68000up },
2092{"addl", 6,     one(0003200),   one(0177700), "#lDs", mcfisa_a },
2093{"addl", 2,     one(0150700),   one(0170700), "*lAd", m68000up | mcfisa_a },
2094{"addl", 2,     one(0150200),   one(0170700), "*lDd", m68000up | mcfisa_a },
2095{"addl", 2,     one(0150600),   one(0170700), "Dd~l", m68000up | mcfisa_a },
2096
2097{"addxb", 2,    one(0150400),   one(0170770), "DsDd", m68000up },
2098{"addxb", 2,    one(0150410),   one(0170770), "-s-d", m68000up },
2099{"addxw", 2,    one(0150500),   one(0170770), "DsDd", m68000up },
2100{"addxw", 2,    one(0150510),   one(0170770), "-s-d", m68000up },
2101{"addxl", 2,    one(0150600),   one(0170770), "DsDd", m68000up | mcfisa_a },
2102{"addxl", 2,    one(0150610),   one(0170770), "-s-d", m68000up },
2103
2104{"andib", 4,    one(0001000),   one(0177700), "#b$s", m68000up },
2105{"andib", 4,    one(0001074),   one(0177777), "#bCs", m68000up },
2106{"andiw", 4,    one(0001100),   one(0177700), "#w$s", m68000up },
2107{"andiw", 4,    one(0001174),   one(0177777), "#wSs", m68000up },
2108{"andil", 6,    one(0001200),   one(0177700), "#l$s", m68000up },
2109{"andil", 6,    one(0001200),   one(0177700), "#lDs", mcfisa_a },
2110{"andi", 4,     one(0001100),   one(0177700), "#w$s", m68000up },
2111{"andi", 4,     one(0001074),   one(0177777), "#bCs", m68000up },
2112{"andi", 4,     one(0001174),   one(0177777), "#wSs", m68000up },
2113
2114/* The and opcode can generate the andi instruction.  */
2115{"andb", 4,     one(0001000),   one(0177700), "#b$s", m68000up },
2116{"andb", 4,     one(0001074),   one(0177777), "#bCs", m68000up },
2117{"andb", 2,     one(0140000),   one(0170700), ";bDd", m68000up },
2118{"andb", 2,     one(0140400),   one(0170700), "Dd~b", m68000up },
2119{"andw", 4,     one(0001100),   one(0177700), "#w$s", m68000up },
2120{"andw", 4,     one(0001174),   one(0177777), "#wSs", m68000up },
2121{"andw", 2,     one(0140100),   one(0170700), ";wDd", m68000up },
2122{"andw", 2,     one(0140500),   one(0170700), "Dd~w", m68000up },
2123{"andl", 6,     one(0001200),   one(0177700), "#l$s", m68000up },
2124{"andl", 6,     one(0001200),   one(0177700), "#lDs", mcfisa_a },
2125{"andl", 2,     one(0140200),   one(0170700), ";lDd", m68000up | mcfisa_a },
2126{"andl", 2,     one(0140600),   one(0170700), "Dd~l", m68000up | mcfisa_a },
2127{"and", 4,      one(0001100),   one(0177700), "#w$w", m68000up },
2128{"and", 4,      one(0001074),   one(0177777), "#bCs", m68000up },
2129{"and", 4,      one(0001174),   one(0177777), "#wSs", m68000up },
2130{"and", 2,      one(0140100),   one(0170700), ";wDd", m68000up },
2131{"and", 2,      one(0140500),   one(0170700), "Dd~w", m68000up },
2132
2133{"aslb", 2,     one(0160400),   one(0170770), "QdDs", m68000up },
2134{"aslb", 2,     one(0160440),   one(0170770), "DdDs", m68000up },
2135{"aslw", 2,     one(0160500),   one(0170770), "QdDs", m68000up },
2136{"aslw", 2,     one(0160540),   one(0170770), "DdDs", m68000up },
2137{"aslw", 2,     one(0160700),   one(0177700), "~s",   m68000up },
2138{"asll", 2,     one(0160600),   one(0170770), "QdDs", m68000up | mcfisa_a },
2139{"asll", 2,     one(0160640),   one(0170770), "DdDs", m68000up | mcfisa_a },
2140
2141{"asrb", 2,     one(0160000),   one(0170770), "QdDs", m68000up },
2142{"asrb", 2,     one(0160040),   one(0170770), "DdDs", m68000up },
2143{"asrw", 2,     one(0160100),   one(0170770), "QdDs", m68000up },
2144{"asrw", 2,     one(0160140),   one(0170770), "DdDs", m68000up },
2145{"asrw", 2,     one(0160300),   one(0177700), "~s",   m68000up },
2146{"asrl", 2,     one(0160200),   one(0170770), "QdDs", m68000up | mcfisa_a },
2147{"asrl", 2,     one(0160240),   one(0170770), "DdDs", m68000up | mcfisa_a },
2148
2149{"bhiw", 2,     one(0061000),   one(0177777), "BW", m68000up | mcfisa_a },
2150{"blsw", 2,     one(0061400),   one(0177777), "BW", m68000up | mcfisa_a },
2151{"bccw", 2,     one(0062000),   one(0177777), "BW", m68000up | mcfisa_a },
2152{"bcsw", 2,     one(0062400),   one(0177777), "BW", m68000up | mcfisa_a },
2153{"bnew", 2,     one(0063000),   one(0177777), "BW", m68000up | mcfisa_a },
2154{"beqw", 2,     one(0063400),   one(0177777), "BW", m68000up | mcfisa_a },
2155{"bvcw", 2,     one(0064000),   one(0177777), "BW", m68000up | mcfisa_a },
2156{"bvsw", 2,     one(0064400),   one(0177777), "BW", m68000up | mcfisa_a },
2157{"bplw", 2,     one(0065000),   one(0177777), "BW", m68000up | mcfisa_a },
2158{"bmiw", 2,     one(0065400),   one(0177777), "BW", m68000up | mcfisa_a },
2159{"bgew", 2,     one(0066000),   one(0177777), "BW", m68000up | mcfisa_a },
2160{"bltw", 2,     one(0066400),   one(0177777), "BW", m68000up | mcfisa_a },
2161{"bgtw", 2,     one(0067000),   one(0177777), "BW", m68000up | mcfisa_a },
2162{"blew", 2,     one(0067400),   one(0177777), "BW", m68000up | mcfisa_a },
2163
2164{"bhil", 2,     one(0061377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2165{"blsl", 2,     one(0061777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2166{"bccl", 2,     one(0062377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2167{"bcsl", 2,     one(0062777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2168{"bnel", 2,     one(0063377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2169{"beql", 2,     one(0063777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2170{"bvcl", 2,     one(0064377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2171{"bvsl", 2,     one(0064777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2172{"bpll", 2,     one(0065377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2173{"bmil", 2,     one(0065777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2174{"bgel", 2,     one(0066377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2175{"bltl", 2,     one(0066777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2176{"bgtl", 2,     one(0067377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2177{"blel", 2,     one(0067777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2178
2179{"bhis", 2,     one(0061000),   one(0177400), "BB", m68000up | mcfisa_a },
2180{"blss", 2,     one(0061400),   one(0177400), "BB", m68000up | mcfisa_a },
2181{"bccs", 2,     one(0062000),   one(0177400), "BB", m68000up | mcfisa_a },
2182{"bcss", 2,     one(0062400),   one(0177400), "BB", m68000up | mcfisa_a },
2183{"bnes", 2,     one(0063000),   one(0177400), "BB", m68000up | mcfisa_a },
2184{"beqs", 2,     one(0063400),   one(0177400), "BB", m68000up | mcfisa_a },
2185{"bvcs", 2,     one(0064000),   one(0177400), "BB", m68000up | mcfisa_a },
2186{"bvss", 2,     one(0064400),   one(0177400), "BB", m68000up | mcfisa_a },
2187{"bpls", 2,     one(0065000),   one(0177400), "BB", m68000up | mcfisa_a },
2188{"bmis", 2,     one(0065400),   one(0177400), "BB", m68000up | mcfisa_a },
2189{"bges", 2,     one(0066000),   one(0177400), "BB", m68000up | mcfisa_a },
2190{"blts", 2,     one(0066400),   one(0177400), "BB", m68000up | mcfisa_a },
2191{"bgts", 2,     one(0067000),   one(0177400), "BB", m68000up | mcfisa_a },
2192{"bles", 2,     one(0067400),   one(0177400), "BB", m68000up | mcfisa_a },
2193
2194{"jhi", 2,      one(0061000),   one(0177400), "Bg", m68000up | mcfisa_a },
2195{"jls", 2,      one(0061400),   one(0177400), "Bg", m68000up | mcfisa_a },
2196{"jcc", 2,      one(0062000),   one(0177400), "Bg", m68000up | mcfisa_a },
2197{"jcs", 2,      one(0062400),   one(0177400), "Bg", m68000up | mcfisa_a },
2198{"jne", 2,      one(0063000),   one(0177400), "Bg", m68000up | mcfisa_a },
2199{"jeq", 2,      one(0063400),   one(0177400), "Bg", m68000up | mcfisa_a },
2200{"jvc", 2,      one(0064000),   one(0177400), "Bg", m68000up | mcfisa_a },
2201{"jvs", 2,      one(0064400),   one(0177400), "Bg", m68000up | mcfisa_a },
2202{"jpl", 2,      one(0065000),   one(0177400), "Bg", m68000up | mcfisa_a },
2203{"jmi", 2,      one(0065400),   one(0177400), "Bg", m68000up | mcfisa_a },
2204{"jge", 2,      one(0066000),   one(0177400), "Bg", m68000up | mcfisa_a },
2205{"jlt", 2,      one(0066400),   one(0177400), "Bg", m68000up | mcfisa_a },
2206{"jgt", 2,      one(0067000),   one(0177400), "Bg", m68000up | mcfisa_a },
2207{"jle", 2,      one(0067400),   one(0177400), "Bg", m68000up | mcfisa_a },
2208
2209{"bchg", 2,     one(0000500),   one(0170700), "Dd$s", m68000up | mcfisa_a },
2210{"bchg", 4,     one(0004100),   one(0177700), "#b$s", m68000up },
2211{"bchg", 4,     one(0004100),   one(0177700), "#bqs", mcfisa_a },
2212
2213{"bclr", 2,     one(0000600),   one(0170700), "Dd$s", m68000up | mcfisa_a },
2214{"bclr", 4,     one(0004200),   one(0177700), "#b$s", m68000up },
2215{"bclr", 4,     one(0004200),   one(0177700), "#bqs", mcfisa_a },
2216
2217{"bfchg", 4,    two(0165300, 0), two(0177700, 0170000), "?sO2O3",   m68020up },
2218{"bfclr", 4,    two(0166300, 0), two(0177700, 0170000), "?sO2O3",   m68020up },
2219{"bfexts", 4,   two(0165700, 0), two(0177700, 0100000), "/sO2O3D1", m68020up },
2220{"bfextu", 4,   two(0164700, 0), two(0177700, 0100000), "/sO2O3D1", m68020up },
2221{"bfffo", 4,    two(0166700, 0), two(0177700, 0100000), "/sO2O3D1", m68020up },
2222{"bfins", 4,    two(0167700, 0), two(0177700, 0100000), "D1?sO2O3", m68020up },
2223{"bfset", 4,    two(0167300, 0), two(0177700, 0170000), "?sO2O3",   m68020up },
2224{"bftst", 4,    two(0164300, 0), two(0177700, 0170000), "/sO2O3",   m68020up },
2225
2226{"bgnd", 2,     one(0045372),   one(0177777), "", cpu32 },
2227
2228{"bitrev", 2,   one(0000300),   one(0177770), "Ds", mcfisa_aa},
2229
2230{"bkpt", 2,     one(0044110),   one(0177770), "ts", m68010up },
2231
2232{"braw", 2,     one(0060000),   one(0177777), "BW", m68000up | mcfisa_a },
2233{"bral", 2,     one(0060377),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2234{"bras", 2,     one(0060000),   one(0177400), "BB", m68000up | mcfisa_a },
2235
2236{"bset", 2,     one(0000700),   one(0170700), "Dd$s", m68000up | mcfisa_a },
2237{"bset", 2,     one(0000700),   one(0170700), "Ddvs", mcfisa_a },
2238{"bset", 4,     one(0004300),   one(0177700), "#b$s", m68000up },
2239{"bset", 4,     one(0004300),   one(0177700), "#bqs", mcfisa_a },
2240
2241{"bsrw", 2,     one(0060400),   one(0177777), "BW", m68000up | mcfisa_a },
2242{"bsrl", 2,     one(0060777),   one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
2243{"bsrs", 2,     one(0060400),   one(0177400), "BB", m68000up | mcfisa_a },
2244
2245{"btst", 2,     one(0000400),   one(0170700), "Dd;b", m68000up | mcfisa_a },
2246{"btst", 4,     one(0004000),   one(0177700), "#b@s", m68000up },
2247{"btst", 4,     one(0004000),   one(0177700), "#bqs", mcfisa_a },
2248
2249{"byterev", 2,  one(0001300),   one(0177770), "Ds", mcfisa_aa},
2250
2251{"callm", 4,    one(0003300),   one(0177700), "#b!s", m68020 },
2252
2253{"cas2w", 6,    two(0006374,0), two(0177777,0007070), "D3D6D2D5r1r4", m68020up },
2254{"cas2w", 6,    two(0006374,0), two(0177777,0007070), "D3D6D2D5R1R4", m68020up },
2255{"cas2l", 6,    two(0007374,0), two(0177777,0007070), "D3D6D2D5r1r4", m68020up },
2256{"cas2l", 6,    two(0007374,0), two(0177777,0007070), "D3D6D2D5R1R4", m68020up },
2257
2258{"casb", 4,     two(0005300, 0), two(0177700, 0177070), "D3D2~s", m68020up },
2259{"casw", 4,     two(0006300, 0), two(0177700, 0177070), "D3D2~s", m68020up },
2260{"casl", 4,     two(0007300, 0), two(0177700, 0177070), "D3D2~s", m68020up },
2261
2262{"chk2b", 4,    two(0000300,0004000), two(0177700,07777), "!sR1", m68020up | cpu32 },
2263{"chk2w", 4,    two(0001300,0004000),   two(0177700,07777), "!sR1", m68020up | cpu32 },
2264{"chk2l", 4,    two(0002300,0004000),   two(0177700,07777), "!sR1", m68020up | cpu32 },
2265
2266{"chkl", 2,     one(0040400),           one(0170700), ";lDd", m68000up },
2267{"chkw", 2,     one(0040600),           one(0170700), ";wDd", m68000up },
2268
2269#define SCOPE_LINE (0x1 << 3)
2270#define SCOPE_PAGE (0x2 << 3)
2271#define SCOPE_ALL  (0x3 << 3)
2272
2273{"cinva", 2,    one(0xf400|SCOPE_ALL),  one(0xff38), "ce",   m68040up },
2274{"cinvl", 2,    one(0xf400|SCOPE_LINE), one(0xff38), "ceas", m68040up },
2275{"cinvp", 2,    one(0xf400|SCOPE_PAGE), one(0xff38), "ceas", m68040up },
2276
2277{"cpusha", 2,   one(0xf420|SCOPE_ALL),  one(0xff38), "ce",   m68040up },
2278{"cpushl", 2,   one(0xf420|SCOPE_LINE), one(0xff38), "ceas", m68040up | mcfisa_a },
2279{"cpushp", 2,   one(0xf420|SCOPE_PAGE), one(0xff38), "ceas", m68040up },
2280
2281#undef SCOPE_LINE
2282#undef SCOPE_PAGE
2283#undef SCOPE_ALL
2284
2285{"clrb", 2,     one(0041000),   one(0177700), "$s", m68000up | mcfisa_a },
2286{"clrw", 2,     one(0041100),   one(0177700), "$s", m68000up | mcfisa_a },
2287{"clrl", 2,     one(0041200),   one(0177700), "$s", m68000up | mcfisa_a },
2288
2289{"cmp2b", 4,    two(0000300,0), two(0177700,07777), "!sR1", m68020up | cpu32 },
2290{"cmp2w", 4,    two(0001300,0), two(0177700,07777), "!sR1", m68020up | cpu32 },
2291{"cmp2l", 4,    two(0002300,0), two(0177700,07777), "!sR1", m68020up | cpu32 },
2292
2293{"cmpaw", 2,    one(0130300),   one(0170700), "*wAd", m68000up },
2294{"cmpal", 2,    one(0130700),   one(0170700), "*lAd", m68000up | mcfisa_a },
2295
2296{"cmpib", 4,    one(0006000),   one(0177700), "#b@s", m68000up },
2297{"cmpib", 4,    one(0006000),   one(0177700), "#bDs", mcfisa_b },
2298{"cmpiw", 4,    one(0006100),   one(0177700), "#w@s", m68000up },
2299{"cmpiw", 4,    one(0006100),   one(0177700), "#wDs", mcfisa_b },
2300{"cmpil", 6,    one(0006200),   one(0177700), "#l@s", m68000up },
2301{"cmpil", 6,    one(0006200),   one(0177700), "#lDs", mcfisa_a },
2302
2303{"cmpmb", 2,    one(0130410),   one(0170770), "+s+d", m68000up },
2304{"cmpmw", 2,    one(0130510),   one(0170770), "+s+d", m68000up },
2305{"cmpml", 2,    one(0130610),   one(0170770), "+s+d", m68000up },
2306
2307/* The cmp opcode can generate the cmpa, cmpm, and cmpi instructions.  */
2308{"cmpb", 4,     one(0006000),   one(0177700), "#b@s", m68000up },
2309{"cmpb", 4,     one(0006000),   one(0177700), "#bDs", mcfisa_b },
2310{"cmpb", 2,     one(0130410),   one(0170770), "+s+d", m68000up },
2311{"cmpb", 2,     one(0130000),   one(0170700), ";bDd", m68000up },
2312{"cmpb", 2,     one(0130000),   one(0170700), "*bDd", mcfisa_b },
2313{"cmpw", 2,     one(0130300),   one(0170700), "*wAd", m68000up },
2314{"cmpw", 4,     one(0006100),   one(0177700), "#w@s", m68000up },
2315{"cmpw", 4,     one(0006100),   one(0177700), "#wDs", mcfisa_b },
2316{"cmpw", 2,     one(0130510),   one(0170770), "+s+d", m68000up },
2317{"cmpw", 2,     one(0130100),   one(0170700), "*wDd", m68000up | mcfisa_b },
2318{"cmpl", 2,     one(0130700),   one(0170700), "*lAd", m68000up | mcfisa_a },
2319{"cmpl", 6,     one(0006200),   one(0177700), "#l@s", m68000up },
2320{"cmpl", 6,     one(0006200),   one(0177700), "#lDs", mcfisa_a },
2321{"cmpl", 2,     one(0130610),   one(0170770), "+s+d", m68000up },
2322{"cmpl", 2,     one(0130200),   one(0170700), "*lDd", m68000up | mcfisa_a },
2323
2324{"dbcc", 2,     one(0052310),   one(0177770), "DsBw", m68000up },
2325{"dbcs", 2,     one(0052710),   one(0177770), "DsBw", m68000up },
2326{"dbeq", 2,     one(0053710),   one(0177770), "DsBw", m68000up },
2327{"dbf", 2,      one(0050710),   one(0177770), "DsBw", m68000up },
2328{"dbge", 2,     one(0056310),   one(0177770), "DsBw", m68000up },
2329{"dbgt", 2,     one(0057310),   one(0177770), "DsBw", m68000up },
2330{"dbhi", 2,     one(0051310),   one(0177770), "DsBw", m68000up },
2331{"dble", 2,     one(0057710),   one(0177770), "DsBw", m68000up },
2332{"dbls", 2,     one(0051710),   one(0177770), "DsBw", m68000up },
2333{"dblt", 2,     one(0056710),   one(0177770), "DsBw", m68000up },
2334{"dbmi", 2,     one(0055710),   one(0177770), "DsBw", m68000up },
2335{"dbne", 2,     one(0053310),   one(0177770), "DsBw", m68000up },
2336{"dbpl", 2,     one(0055310),   one(0177770), "DsBw", m68000up },
2337{"dbt", 2,      one(0050310),   one(0177770), "DsBw", m68000up },
2338{"dbvc", 2,     one(0054310),   one(0177770), "DsBw", m68000up },
2339{"dbvs", 2,     one(0054710),   one(0177770), "DsBw", m68000up },
2340
2341{"divsw", 2,    one(0100700),   one(0170700), ";wDd", m68000up | mcfhwdiv },
2342
2343{"divsl", 4,    two(0046100,0006000),two(0177700,0107770),";lD3D1", m68020up|cpu32 },
2344{"divsl", 4,    two(0046100,0004000),two(0177700,0107770),";lDD",   m68020up|cpu32 },
2345{"divsl", 4,    two(0046100,0004000),two(0177700,0107770),"qsDD",   mcfhwdiv },
2346
2347{"divsll", 4,   two(0046100,0004000),two(0177700,0107770),";lD3D1",m68020up|cpu32 },
2348{"divsll", 4,   two(0046100,0004000),two(0177700,0107770),";lDD",  m68020up|cpu32 },
2349
2350{"divuw", 2,    one(0100300),           one(0170700), ";wDd", m68000up | mcfhwdiv },
2351
2352{"divul", 4,    two(0046100,0002000),two(0177700,0107770),";lD3D1", m68020up|cpu32 },
2353{"divul", 4,    two(0046100,0000000),two(0177700,0107770),";lDD",   m68020up|cpu32 },
2354{"divul", 4,    two(0046100,0000000),two(0177700,0107770),"qsDD",   mcfhwdiv },
2355
2356{"divull", 4,   two(0046100,0000000),two(0177700,0107770),";lD3D1",m68020up|cpu32 },
2357{"divull", 4,   two(0046100,0000000),two(0177700,0107770),";lDD",  m68020up|cpu32 },
2358
2359{"eorib", 4,    one(0005000),   one(0177700), "#b$s", m68000up },
2360{"eorib", 4,    one(0005074),   one(0177777), "#bCs", m68000up },
2361{"eoriw", 4,    one(0005100),   one(0177700), "#w$s", m68000up },
2362{"eoriw", 4,    one(0005174),   one(0177777), "#wSs", m68000up },
2363{"eoril", 6,    one(0005200),   one(0177700), "#l$s", m68000up },
2364{"eoril", 6,    one(0005200),   one(0177700), "#lDs", mcfisa_a },
2365{"eori", 4,     one(0005074),   one(0177777), "#bCs", m68000up },
2366{"eori", 4,     one(0005174),   one(0177777), "#wSs", m68000up },
2367{"eori", 4,     one(0005100),   one(0177700), "#w$s", m68000up },
2368
2369/* The eor opcode can generate the eori instruction.  */
2370{"eorb", 4,     one(0005000),   one(0177700), "#b$s", m68000up },
2371{"eorb", 4,     one(0005074),   one(0177777), "#bCs", m68000up },
2372{"eorb", 2,     one(0130400),   one(0170700), "Dd$s", m68000up },
2373{"eorw", 4,     one(0005100),   one(0177700), "#w$s", m68000up },
2374{"eorw", 4,     one(0005174),   one(0177777), "#wSs", m68000up },
2375{"eorw", 2,     one(0130500),   one(0170700), "Dd$s", m68000up },
2376{"eorl", 6,     one(0005200),   one(0177700), "#l$s", m68000up },
2377{"eorl", 6,     one(0005200),   one(0177700), "#lDs", mcfisa_a },
2378{"eorl", 2,     one(0130600),   one(0170700), "Dd$s", m68000up | mcfisa_a },
2379{"eor", 4,      one(0005074),   one(0177777), "#bCs", m68000up },
2380{"eor", 4,      one(0005174),   one(0177777), "#wSs", m68000up },
2381{"eor", 4,      one(0005100),   one(0177700), "#w$s", m68000up },
2382{"eor", 2,      one(0130500),   one(0170700), "Dd$s", m68000up },
2383
2384{"exg", 2,      one(0140500),   one(0170770), "DdDs", m68000up },
2385{"exg", 2,      one(0140510),   one(0170770), "AdAs", m68000up },
2386{"exg", 2,      one(0140610),   one(0170770), "DdAs", m68000up },
2387{"exg", 2,      one(0140610),   one(0170770), "AsDd", m68000up },
2388
2389{"extw", 2,     one(0044200),   one(0177770), "Ds", m68000up|mcfisa_a },
2390{"extl", 2,     one(0044300),   one(0177770), "Ds", m68000up|mcfisa_a },
2391{"extbl", 2,    one(0044700),   one(0177770), "Ds", m68020up|cpu32|mcfisa_a },
2392
2393{"ff1", 2,      one(0002300), one(0177770), "Ds", mcfisa_aa},
2394
2395/* float stuff starts here */
2396
2397{"fabsb", 4,    two(0xF000, 0x5818), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2398{"fabsb", 4,    two(0xF000, 0x5818), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2399{"fabsd", 4,    two(0xF000, 0x0018), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2400{"fabsd", 4,    two(0xF000, 0x0018), two(0xF1C0, 0xE07F), "IiFt", cfloat },
2401{"fabsd", 4,    two(0xF000, 0x5418), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2402{"fabsd", 4,    two(0xF000, 0x5418), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2403{"fabsl", 4,    two(0xF000, 0x4018), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2404{"fabsl", 4,    two(0xF000, 0x4018), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2405{"fabsp", 4,    two(0xF000, 0x4C18), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2406{"fabss", 4,    two(0xF000, 0x4418), two(0xF1C0, 0xFC7F), "Ii;fF7", cfloat },
2407{"fabss", 4,    two(0xF000, 0x4418), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2408{"fabsw", 4,    two(0xF000, 0x5018), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2409{"fabsw", 4,    two(0xF000, 0x5018), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2410{"fabsx", 4,    two(0xF000, 0x0018), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2411{"fabsx", 4,    two(0xF000, 0x4818), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2412{"fabsx", 4,    two(0xF000, 0x0018), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2413
2414{"fsabsb", 4,   two(0xF000, 0x5858), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
2415{"fsabsb", 4,   two(0xF000, 0x5858), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2416{"fsabsd", 4,   two(0xF000, 0x0058), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2417{"fsabsd", 4,   two(0xF000, 0x0058), two(0xF1C0, 0xE07F), "IiFt", cfloat },
2418{"fsabsd", 4,   two(0xF000, 0x5458), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
2419{"fsabsd", 4,   two(0xF000, 0x5458), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2420{"fsabsl", 4,   two(0xF000, 0x4058), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
2421{"fsabsl", 4,   two(0xF000, 0x4058), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2422{"fsabsp", 4,   two(0xF000, 0x4C58), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
2423{"fsabss", 4,   two(0xF000, 0x4258), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2424{"fsabss", 4,   two(0xF000, 0x4458), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
2425{"fsabsw", 4,   two(0xF000, 0x5058), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
2426{"fsabsw", 4,   two(0xF000, 0x5058), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2427{"fsabsx", 4,   two(0xF000, 0x0058), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
2428{"fsabsx", 4,   two(0xF000, 0x4858), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
2429{"fsabsx", 4,   two(0xF000, 0x0058), two(0xF1C0, 0xE07F), "IiFt",   m68040up },
2430
2431{"fdabsb", 4,   two(0xF000, 0x585C), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2432{"fdabsb", 4,   two(0xF000, 0x585c), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up},
2433{"fdabsd", 4,   two(0xF000, 0x005C), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2434{"fdabsd", 4,   two(0xF000, 0x005C), two(0xF1C0, 0xE07F), "IiFt", cfloat },
2435{"fdabsd", 4,   two(0xF000, 0x545C), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2436{"fdabsd", 4,   two(0xF000, 0x545c), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up},
2437{"fdabsl", 4,   two(0xF000, 0x405C), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2438{"fdabsl", 4,   two(0xF000, 0x405c), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up},
2439{"fdabsp", 4,   two(0xF000, 0x4C5c), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up},
2440{"fdabss", 4,   two(0xF000, 0x425C), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2441{"fdabss", 4,   two(0xF000, 0x445c), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up},
2442{"fdabsw", 4,   two(0xF000, 0x505C), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2443{"fdabsw", 4,   two(0xF000, 0x505c), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up},
2444{"fdabsx", 4,   two(0xF000, 0x005c), two(0xF1C0, 0xE07F), "IiF8F7", m68040up},
2445{"fdabsx", 4,   two(0xF000, 0x485c), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up},
2446{"fdabsx", 4,   two(0xF000, 0x005c), two(0xF1C0, 0xE07F), "IiFt",   m68040up},
2447
2448{"facosb", 4,   two(0xF000, 0x581C), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2449{"facosd", 4,   two(0xF000, 0x541C), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2450{"facosl", 4,   two(0xF000, 0x401C), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2451{"facosp", 4,   two(0xF000, 0x4C1C), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2452{"facoss", 4,   two(0xF000, 0x441C), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2453{"facosw", 4,   two(0xF000, 0x501C), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2454{"facosx", 4,   two(0xF000, 0x001C), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2455{"facosx", 4,   two(0xF000, 0x481C), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2456{"facosx", 4,   two(0xF000, 0x001C), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2457
2458{"faddb", 4,    two(0xF000, 0x5822), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2459{"faddb", 4,    two(0xF000, 0x5822), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2460{"faddd", 4,    two(0xF000, 0x0022), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2461{"faddd", 4,    two(0xF000, 0x5422), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2462{"faddd", 4,    two(0xF000, 0x5422), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2463{"faddd", 4,    two(0xF000, 0x5422), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2464{"faddl", 4,    two(0xF000, 0x4022), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2465{"faddl", 4,    two(0xF000, 0x4022), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2466{"faddp", 4,    two(0xF000, 0x4C22), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2467{"fadds", 4,    two(0xF000, 0x4422), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2468{"fadds", 4,    two(0xF000, 0x4422), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2469{"faddw", 4,    two(0xF000, 0x5022), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2470{"faddw", 4,    two(0xF000, 0x5022), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2471{"faddx", 4,    two(0xF000, 0x0022), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2472{"faddx", 4,    two(0xF000, 0x4822), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2473
2474{"fsaddb", 4,   two(0xF000, 0x5862), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
2475{"fsaddb", 4,   two(0xF000, 0x5862), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2476{"fsaddd", 4,   two(0xF000, 0x0066), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2477{"fsaddd", 4,   two(0xF000, 0x5462), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
2478{"fsaddd", 4,   two(0xF000, 0x5462), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2479{"fsaddl", 4,   two(0xF000, 0x4062), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
2480{"fsaddl", 4,   two(0xF000, 0x4062), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2481{"fsaddp", 4,   two(0xF000, 0x4C62), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
2482{"fsadds", 4,   two(0xF000, 0x4462), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
2483{"fsadds", 4,   two(0xF000, 0x4862), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2484{"fsaddw", 4,   two(0xF000, 0x5062), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
2485{"fsaddw", 4,   two(0xF000, 0x5062), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2486{"fsaddx", 4,   two(0xF000, 0x0062), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
2487{"fsaddx", 4,   two(0xF000, 0x4862), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
2488
2489{"fdaddb", 4,   two(0xF000, 0x5826), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2490{"fdaddb", 4,   two(0xF000, 0x5866), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
2491{"fdaddd", 4,   two(0xF000, 0x0066), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2492{"fdaddd", 4,   two(0xF000, 0x5426), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2493{"fdaddd", 4,   two(0xF000, 0x5466), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
2494{"fdaddl", 4,   two(0xF000, 0x4026), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2495{"fdaddl", 4,   two(0xF000, 0x4066), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
2496{"fdaddp", 4,   two(0xF000, 0x4C66), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
2497{"fdadds", 4,   two(0xF000, 0x4466), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
2498{"fdadds", 4,   two(0xF000, 0x4826), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2499{"fdaddw", 4,   two(0xF000, 0x5026), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2500{"fdaddw", 4,   two(0xF000, 0x5066), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
2501{"fdaddx", 4,   two(0xF000, 0x0066), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
2502{"fdaddx", 4,   two(0xF000, 0x4866), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
2503
2504{"fasinb", 4,   two(0xF000, 0x580C), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2505{"fasind", 4,   two(0xF000, 0x540C), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2506{"fasinl", 4,   two(0xF000, 0x400C), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2507{"fasinp", 4,   two(0xF000, 0x4C0C), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2508{"fasins", 4,   two(0xF000, 0x440C), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2509{"fasinw", 4,   two(0xF000, 0x500C), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2510{"fasinx", 4,   two(0xF000, 0x000C), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2511{"fasinx", 4,   two(0xF000, 0x480C), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2512{"fasinx", 4,   two(0xF000, 0x000C), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2513
2514{"fatanb", 4,   two(0xF000, 0x580A), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2515{"fatand", 4,   two(0xF000, 0x540A), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2516{"fatanl", 4,   two(0xF000, 0x400A), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2517{"fatanp", 4,   two(0xF000, 0x4C0A), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2518{"fatans", 4,   two(0xF000, 0x440A), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2519{"fatanw", 4,   two(0xF000, 0x500A), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2520{"fatanx", 4,   two(0xF000, 0x000A), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2521{"fatanx", 4,   two(0xF000, 0x480A), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2522{"fatanx", 4,   two(0xF000, 0x000A), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2523
2524{"fatanhb", 4,  two(0xF000, 0x580D), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2525{"fatanhd", 4,  two(0xF000, 0x540D), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2526{"fatanhl", 4,  two(0xF000, 0x400D), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2527{"fatanhp", 4,  two(0xF000, 0x4C0D), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2528{"fatanhs", 4,  two(0xF000, 0x440D), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2529{"fatanhw", 4,  two(0xF000, 0x500D), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2530{"fatanhx", 4,  two(0xF000, 0x000D), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2531{"fatanhx", 4,  two(0xF000, 0x480D), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2532{"fatanhx", 4,  two(0xF000, 0x000D), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2533
2534{"fbeq", 2,     one(0xF081),            one(0xF1FF), "IdBW", mfloat | cfloat },
2535{"fbf", 2,      one(0xF080),            one(0xF1FF), "IdBW", mfloat | cfloat },
2536{"fbge", 2,     one(0xF093),            one(0xF1FF), "IdBW", mfloat | cfloat },
2537{"fbgl", 2,     one(0xF096),            one(0xF1FF), "IdBW", mfloat | cfloat },
2538{"fbgle", 2,    one(0xF097),            one(0xF1FF), "IdBW", mfloat | cfloat },
2539{"fbgt", 2,     one(0xF092),            one(0xF1FF), "IdBW", mfloat | cfloat },
2540{"fble", 2,     one(0xF095),            one(0xF1FF), "IdBW", mfloat | cfloat },
2541{"fblt", 2,     one(0xF094),            one(0xF1FF), "IdBW", mfloat | cfloat },
2542{"fbne", 2,     one(0xF08E),            one(0xF1FF), "IdBW", mfloat | cfloat },
2543{"fbnge", 2,    one(0xF09C),            one(0xF1FF), "IdBW", mfloat | cfloat },
2544{"fbngl", 2,    one(0xF099),            one(0xF1FF), "IdBW", mfloat | cfloat },
2545{"fbngle", 2,   one(0xF098),            one(0xF1FF), "IdBW", mfloat | cfloat },
2546{"fbngt", 2,    one(0xF09D),            one(0xF1FF), "IdBW", mfloat | cfloat },
2547{"fbnle", 2,    one(0xF09A),            one(0xF1FF), "IdBW", mfloat | cfloat },
2548{"fbnlt", 2,    one(0xF09B),            one(0xF1FF), "IdBW", mfloat | cfloat },
2549{"fboge", 2,    one(0xF083),            one(0xF1FF), "IdBW", mfloat | cfloat },
2550{"fbogl", 2,    one(0xF086),            one(0xF1FF), "IdBW", mfloat | cfloat },
2551{"fbogt", 2,    one(0xF082),            one(0xF1FF), "IdBW", mfloat | cfloat },
2552{"fbole", 2,    one(0xF085),            one(0xF1FF), "IdBW", mfloat | cfloat },
2553{"fbolt", 2,    one(0xF084),            one(0xF1FF), "IdBW", mfloat | cfloat },
2554{"fbor", 2,     one(0xF087),            one(0xF1FF), "IdBW", mfloat | cfloat },
2555{"fbseq", 2,    one(0xF091),            one(0xF1FF), "IdBW", mfloat | cfloat },
2556{"fbsf", 2,     one(0xF090),            one(0xF1FF), "IdBW", mfloat | cfloat },
2557{"fbsne", 2,    one(0xF09E),            one(0xF1FF), "IdBW", mfloat | cfloat },
2558{"fbst", 2,     one(0xF09F),            one(0xF1FF), "IdBW", mfloat | cfloat },
2559{"fbt", 2,      one(0xF08F),            one(0xF1FF), "IdBW", mfloat | cfloat },
2560{"fbueq", 2,    one(0xF089),            one(0xF1FF), "IdBW", mfloat | cfloat },
2561{"fbuge", 2,    one(0xF08B),            one(0xF1FF), "IdBW", mfloat | cfloat },
2562{"fbugt", 2,    one(0xF08A),            one(0xF1FF), "IdBW", mfloat | cfloat },
2563{"fbule", 2,    one(0xF08D),            one(0xF1FF), "IdBW", mfloat | cfloat },
2564{"fbult", 2,    one(0xF08C),            one(0xF1FF), "IdBW", mfloat | cfloat },
2565{"fbun", 2,     one(0xF088),            one(0xF1FF), "IdBW", mfloat | cfloat },
2566
2567{"fbeql", 2,    one(0xF0C1),            one(0xF1FF), "IdBC", mfloat | cfloat },
2568{"fbfl", 2,     one(0xF0C0),            one(0xF1FF), "IdBC", mfloat | cfloat },
2569{"fbgel", 2,    one(0xF0D3),            one(0xF1FF), "IdBC", mfloat | cfloat },
2570{"fbgll", 2,    one(0xF0D6),            one(0xF1FF), "IdBC", mfloat | cfloat },
2571{"fbglel", 2,   one(0xF0D7),            one(0xF1FF), "IdBC", mfloat | cfloat },
2572{"fbgtl", 2,    one(0xF0D2),            one(0xF1FF), "IdBC", mfloat | cfloat },
2573{"fblel", 2,    one(0xF0D5),            one(0xF1FF), "IdBC", mfloat | cfloat },
2574{"fbltl", 2,    one(0xF0D4),            one(0xF1FF), "IdBC", mfloat | cfloat },
2575{"fbnel", 2,    one(0xF0CE),            one(0xF1FF), "IdBC", mfloat | cfloat },
2576{"fbngel", 2,   one(0xF0DC),            one(0xF1FF), "IdBC", mfloat | cfloat },
2577{"fbngll", 2,   one(0xF0D9),            one(0xF1FF), "IdBC", mfloat | cfloat },
2578{"fbnglel", 2,  one(0xF0D8),            one(0xF1FF), "IdBC", mfloat | cfloat },
2579{"fbngtl", 2,   one(0xF0DD),            one(0xF1FF), "IdBC", mfloat | cfloat },
2580{"fbnlel", 2,   one(0xF0DA),            one(0xF1FF), "IdBC", mfloat | cfloat },
2581{"fbnltl", 2,   one(0xF0DB),            one(0xF1FF), "IdBC", mfloat | cfloat },
2582{"fbogel", 2,   one(0xF0C3),            one(0xF1FF), "IdBC", mfloat | cfloat },
2583{"fbogll", 2,   one(0xF0C6),            one(0xF1FF), "IdBC", mfloat | cfloat },
2584{"fbogtl", 2,   one(0xF0C2),            one(0xF1FF), "IdBC", mfloat | cfloat },
2585{"fbolel", 2,   one(0xF0C5),            one(0xF1FF), "IdBC", mfloat | cfloat },
2586{"fboltl", 2,   one(0xF0C4),            one(0xF1FF), "IdBC", mfloat | cfloat },
2587{"fborl", 2,    one(0xF0C7),            one(0xF1FF), "IdBC", mfloat | cfloat },
2588{"fbseql", 2,   one(0xF0D1),            one(0xF1FF), "IdBC", mfloat | cfloat },
2589{"fbsfl", 2,    one(0xF0D0),            one(0xF1FF), "IdBC", mfloat | cfloat },
2590{"fbsnel", 2,   one(0xF0DE),            one(0xF1FF), "IdBC", mfloat | cfloat },
2591{"fbstl", 2,    one(0xF0DF),            one(0xF1FF), "IdBC", mfloat | cfloat },
2592{"fbtl", 2,     one(0xF0CF),            one(0xF1FF), "IdBC", mfloat | cfloat },
2593{"fbueql", 2,   one(0xF0C9),            one(0xF1FF), "IdBC", mfloat | cfloat },
2594{"fbugel", 2,   one(0xF0CB),            one(0xF1FF), "IdBC", mfloat | cfloat },
2595{"fbugtl", 2,   one(0xF0CA),            one(0xF1FF), "IdBC", mfloat | cfloat },
2596{"fbulel", 2,   one(0xF0CD),            one(0xF1FF), "IdBC", mfloat | cfloat },
2597{"fbultl", 2,   one(0xF0CC),            one(0xF1FF), "IdBC", mfloat | cfloat },
2598{"fbunl", 2,    one(0xF0C8),            one(0xF1FF), "IdBC", mfloat | cfloat },
2599
2600{"fjeq", 2,     one(0xF081),            one(0xF1BF), "IdBc", mfloat | cfloat },
2601{"fjf", 2,      one(0xF080),            one(0xF1BF), "IdBc", mfloat | cfloat },
2602{"fjge", 2,     one(0xF093),            one(0xF1BF), "IdBc", mfloat | cfloat },
2603{"fjgl", 2,     one(0xF096),            one(0xF1BF), "IdBc", mfloat | cfloat },
2604{"fjgle", 2,    one(0xF097),            one(0xF1BF), "IdBc", mfloat | cfloat },
2605{"fjgt", 2,     one(0xF092),            one(0xF1BF), "IdBc", mfloat | cfloat },
2606{"fjle", 2,     one(0xF095),            one(0xF1BF), "IdBc", mfloat | cfloat },
2607{"fjlt", 2,     one(0xF094),            one(0xF1BF), "IdBc", mfloat | cfloat },
2608{"fjne", 2,     one(0xF08E),            one(0xF1BF), "IdBc", mfloat | cfloat },
2609{"fjnge", 2,    one(0xF09C),            one(0xF1BF), "IdBc", mfloat | cfloat },
2610{"fjngl", 2,    one(0xF099),            one(0xF1BF), "IdBc", mfloat | cfloat },
2611{"fjngle", 2,   one(0xF098),            one(0xF1BF), "IdBc", mfloat | cfloat },
2612{"fjngt", 2,    one(0xF09D),            one(0xF1BF), "IdBc", mfloat | cfloat },
2613{"fjnle", 2,    one(0xF09A),            one(0xF1BF), "IdBc", mfloat | cfloat },
2614{"fjnlt", 2,    one(0xF09B),            one(0xF1BF), "IdBc", mfloat | cfloat },
2615{"fjoge", 2,    one(0xF083),            one(0xF1BF), "IdBc", mfloat | cfloat },
2616{"fjogl", 2,    one(0xF086),            one(0xF1BF), "IdBc", mfloat | cfloat },
2617{"fjogt", 2,    one(0xF082),            one(0xF1BF), "IdBc", mfloat | cfloat },
2618{"fjole", 2,    one(0xF085),            one(0xF1BF), "IdBc", mfloat | cfloat },
2619{"fjolt", 2,    one(0xF084),            one(0xF1BF), "IdBc", mfloat | cfloat },
2620{"fjor", 2,     one(0xF087),            one(0xF1BF), "IdBc", mfloat | cfloat },
2621{"fjseq", 2,    one(0xF091),            one(0xF1BF), "IdBc", mfloat | cfloat },
2622{"fjsf", 2,     one(0xF090),            one(0xF1BF), "IdBc", mfloat | cfloat },
2623{"fjsne", 2,    one(0xF09E),            one(0xF1BF), "IdBc", mfloat | cfloat },
2624{"fjst", 2,     one(0xF09F),            one(0xF1BF), "IdBc", mfloat | cfloat },
2625{"fjt", 2,      one(0xF08F),            one(0xF1BF), "IdBc", mfloat | cfloat },
2626{"fjueq", 2,    one(0xF089),            one(0xF1BF), "IdBc", mfloat | cfloat },
2627{"fjuge", 2,    one(0xF08B),            one(0xF1BF), "IdBc", mfloat | cfloat },
2628{"fjugt", 2,    one(0xF08A),            one(0xF1BF), "IdBc", mfloat | cfloat },
2629{"fjule", 2,    one(0xF08D),            one(0xF1BF), "IdBc", mfloat | cfloat },
2630{"fjult", 2,    one(0xF08C),            one(0xF1BF), "IdBc", mfloat | cfloat },
2631{"fjun", 2,     one(0xF088),            one(0xF1BF), "IdBc", mfloat | cfloat },
2632
2633{"fcmpb", 4,    two(0xF000, 0x5838), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2634{"fcmpb", 4,    two(0xF000, 0x5838), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2635{"fcmpd", 4,    two(0xF000, 0x5438), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2636{"fcmpd", 4,    two(0xF000, 0x5438), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2637{"fcmpd", 4,    two(0xF000, 0x0038), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2638{"fcmpl", 4,    two(0xF000, 0x4038), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2639{"fcmpl", 4,    two(0xF000, 0x4038), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2640{"fcmpp", 4,    two(0xF000, 0x4C38), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2641{"fcmps", 4,    two(0xF000, 0x4438), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2642{"fcmps", 4,    two(0xF000, 0x4438), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2643{"fcmpw", 4,    two(0xF000, 0x5038), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2644{"fcmpw", 4,    two(0xF000, 0x5038), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2645{"fcmpx", 4,    two(0xF000, 0x0038), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2646{"fcmpx", 4,    two(0xF000, 0x4838), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2647
2648{"fcosb", 4,    two(0xF000, 0x581D), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2649{"fcosd", 4,    two(0xF000, 0x541D), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2650{"fcosl", 4,    two(0xF000, 0x401D), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2651{"fcosp", 4,    two(0xF000, 0x4C1D), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2652{"fcoss", 4,    two(0xF000, 0x441D), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2653{"fcosw", 4,    two(0xF000, 0x501D), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2654{"fcosx", 4,    two(0xF000, 0x001D), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2655{"fcosx", 4,    two(0xF000, 0x481D), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2656{"fcosx", 4,    two(0xF000, 0x001D), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2657
2658{"fcoshb", 4,   two(0xF000, 0x5819), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2659{"fcoshd", 4,   two(0xF000, 0x5419), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2660{"fcoshl", 4,   two(0xF000, 0x4019), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2661{"fcoshp", 4,   two(0xF000, 0x4C19), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2662{"fcoshs", 4,   two(0xF000, 0x4419), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2663{"fcoshw", 4,   two(0xF000, 0x5019), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2664{"fcoshx", 4,   two(0xF000, 0x0019), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2665{"fcoshx", 4,   two(0xF000, 0x4819), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2666{"fcoshx", 4,   two(0xF000, 0x0019), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2667
2668{"fdbeq", 4,    two(0xF048, 0x0001), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2669{"fdbf", 4,     two(0xF048, 0x0000), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2670{"fdbge", 4,    two(0xF048, 0x0013), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2671{"fdbgl", 4,    two(0xF048, 0x0016), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2672{"fdbgle", 4,   two(0xF048, 0x0017), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2673{"fdbgt", 4,    two(0xF048, 0x0012), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2674{"fdble", 4,    two(0xF048, 0x0015), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2675{"fdblt", 4,    two(0xF048, 0x0014), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2676{"fdbne", 4,    two(0xF048, 0x000E), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2677{"fdbnge", 4,   two(0xF048, 0x001C), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2678{"fdbngl", 4,   two(0xF048, 0x0019), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2679{"fdbngle", 4,  two(0xF048, 0x0018), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2680{"fdbngt", 4,   two(0xF048, 0x001D), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2681{"fdbnle", 4,   two(0xF048, 0x001A), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2682{"fdbnlt", 4,   two(0xF048, 0x001B), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2683{"fdboge", 4,   two(0xF048, 0x0003), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2684{"fdbogl", 4,   two(0xF048, 0x0006), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2685{"fdbogt", 4,   two(0xF048, 0x0002), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2686{"fdbole", 4,   two(0xF048, 0x0005), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2687{"fdbolt", 4,   two(0xF048, 0x0004), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2688{"fdbor", 4,    two(0xF048, 0x0007), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2689{"fdbseq", 4,   two(0xF048, 0x0011), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2690{"fdbsf", 4,    two(0xF048, 0x0010), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2691{"fdbsne", 4,   two(0xF048, 0x001E), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2692{"fdbst", 4,    two(0xF048, 0x001F), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2693{"fdbt", 4,     two(0xF048, 0x000F), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2694{"fdbueq", 4,   two(0xF048, 0x0009), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2695{"fdbuge", 4,   two(0xF048, 0x000B), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2696{"fdbugt", 4,   two(0xF048, 0x000A), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2697{"fdbule", 4,   two(0xF048, 0x000D), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2698{"fdbult", 4,   two(0xF048, 0x000C), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2699{"fdbun", 4,    two(0xF048, 0x0008), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
2700
2701{"fdivb", 4,    two(0xF000, 0x5820), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2702{"fdivb", 4,    two(0xF000, 0x5820), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2703{"fdivd", 4,    two(0xF000, 0x0020), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2704{"fdivd", 4,    two(0xF000, 0x5420), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2705{"fdivd", 4,    two(0xF000, 0x5420), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2706{"fdivl", 4,    two(0xF000, 0x4020), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2707{"fdivl", 4,    two(0xF000, 0x4020), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2708{"fdivp", 4,    two(0xF000, 0x4C20), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2709{"fdivs", 4,    two(0xF000, 0x4420), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2710{"fdivs", 4,    two(0xF000, 0x4420), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2711{"fdivw", 4,    two(0xF000, 0x5020), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2712{"fdivw", 4,    two(0xF000, 0x5020), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2713{"fdivx", 4,    two(0xF000, 0x0020), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2714{"fdivx", 4,    two(0xF000, 0x4820), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2715
2716{"fsdivb", 4,   two(0xF000, 0x5860), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
2717{"fsdivb", 4,   two(0xF000, 0x5860), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2718{"fsdivd", 4,   two(0xF000, 0x0060), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2719{"fsdivd", 4,   two(0xF000, 0x5460), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
2720{"fsdivd", 4,   two(0xF000, 0x5460), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2721{"fsdivl", 4,   two(0xF000, 0x4060), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
2722{"fsdivl", 4,   two(0xF000, 0x4060), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2723{"fsdivp", 4,   two(0xF000, 0x4C60), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
2724{"fsdivs", 4,   two(0xF000, 0x4460), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
2725{"fsdivs", 4,   two(0xF000, 0x4460), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2726{"fsdivw", 4,   two(0xF000, 0x5060), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
2727{"fsdivw", 4,   two(0xF000, 0x5060), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2728{"fsdivx", 4,   two(0xF000, 0x0060), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
2729{"fsdivx", 4,   two(0xF000, 0x4860), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
2730
2731{"fddivb", 4,   two(0xF000, 0x5864), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
2732{"fddivb", 4,   two(0xF000, 0x5864), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2733{"fddivd", 4,   two(0xF000, 0x0064), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2734{"fddivd", 4,   two(0xF000, 0x5464), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
2735{"fddivd", 4,   two(0xF000, 0x5464), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2736{"fddivl", 4,   two(0xF000, 0x4064), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
2737{"fddivl", 4,   two(0xF000, 0x4064), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2738{"fddivp", 4,   two(0xF000, 0x4C64), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
2739{"fddivs", 4,   two(0xF000, 0x4464), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
2740{"fddivs", 4,   two(0xF000, 0x4464), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2741{"fddivw", 4,   two(0xF000, 0x5064), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
2742{"fddivw", 4,   two(0xF000, 0x5064), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2743{"fddivx", 4,   two(0xF000, 0x0064), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
2744{"fddivx", 4,   two(0xF000, 0x4864), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
2745
2746{"fetoxb", 4,   two(0xF000, 0x5810), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2747{"fetoxd", 4,   two(0xF000, 0x5410), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2748{"fetoxl", 4,   two(0xF000, 0x4010), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2749{"fetoxp", 4,   two(0xF000, 0x4C10), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2750{"fetoxs", 4,   two(0xF000, 0x4410), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2751{"fetoxw", 4,   two(0xF000, 0x5010), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2752{"fetoxx", 4,   two(0xF000, 0x0010), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2753{"fetoxx", 4,   two(0xF000, 0x4810), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2754{"fetoxx", 4,   two(0xF000, 0x0010), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2755
2756{"fetoxm1b", 4, two(0xF000, 0x5808), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2757{"fetoxm1d", 4, two(0xF000, 0x5408), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2758{"fetoxm1l", 4, two(0xF000, 0x4008), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2759{"fetoxm1p", 4, two(0xF000, 0x4C08), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2760{"fetoxm1s", 4, two(0xF000, 0x4408), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2761{"fetoxm1w", 4, two(0xF000, 0x5008), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2762{"fetoxm1x", 4, two(0xF000, 0x0008), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2763{"fetoxm1x", 4, two(0xF000, 0x4808), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2764{"fetoxm1x", 4, two(0xF000, 0x0008), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2765
2766{"fgetexpb", 4, two(0xF000, 0x581E), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2767{"fgetexpd", 4, two(0xF000, 0x541E), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2768{"fgetexpl", 4, two(0xF000, 0x401E), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2769{"fgetexpp", 4, two(0xF000, 0x4C1E), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2770{"fgetexps", 4, two(0xF000, 0x441E), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2771{"fgetexpw", 4, two(0xF000, 0x501E), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2772{"fgetexpx", 4, two(0xF000, 0x001E), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2773{"fgetexpx", 4, two(0xF000, 0x481E), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2774{"fgetexpx", 4, two(0xF000, 0x001E), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2775
2776{"fgetmanb", 4, two(0xF000, 0x581F), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2777{"fgetmand", 4, two(0xF000, 0x541F), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2778{"fgetmanl", 4, two(0xF000, 0x401F), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2779{"fgetmanp", 4, two(0xF000, 0x4C1F), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2780{"fgetmans", 4, two(0xF000, 0x441F), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2781{"fgetmanw", 4, two(0xF000, 0x501F), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2782{"fgetmanx", 4, two(0xF000, 0x001F), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2783{"fgetmanx", 4, two(0xF000, 0x481F), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2784{"fgetmanx", 4, two(0xF000, 0x001F), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2785
2786{"fintb", 4,    two(0xF000, 0x5801), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2787{"fintb", 4,    two(0xF000, 0x5801), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2788{"fintd", 4,    two(0xF000, 0x0001), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2789{"fintd", 4,    two(0xF000, 0x0001), two(0xF1C0, 0xE07F), "IiFt", cfloat },
2790{"fintd", 4,    two(0xF000, 0x5401), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2791{"fintd", 4,    two(0xF000, 0x5401), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2792{"fintl", 4,    two(0xF000, 0x4001), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2793{"fintl", 4,    two(0xF000, 0x4001), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2794{"fintp", 4,    two(0xF000, 0x4C01), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2795{"fints", 4,    two(0xF000, 0x4401), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2796{"fints", 4,    two(0xF000, 0x4401), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2797{"fintw", 4,    two(0xF000, 0x5001), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2798{"fintw", 4,    two(0xF000, 0x5001), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2799{"fintx", 4,    two(0xF000, 0x0001), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2800{"fintx", 4,    two(0xF000, 0x4801), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2801{"fintx", 4,    two(0xF000, 0x0001), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2802
2803{"fintrzb", 4,  two(0xF000, 0x5803), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2804{"fintrzb", 4,  two(0xF000, 0x5803), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2805{"fintrzd", 4,  two(0xF000, 0x0003), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2806{"fintrzd", 4,  two(0xF000, 0x0003), two(0xF1C0, 0xE07F), "IiFt",   cfloat },
2807{"fintrzd", 4,  two(0xF000, 0x5403), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2808{"fintrzd", 4,  two(0xF000, 0x5403), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2809{"fintrzl", 4,  two(0xF000, 0x4003), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2810{"fintrzl", 4,  two(0xF000, 0x4003), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2811{"fintrzp", 4,  two(0xF000, 0x4C03), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2812{"fintrzs", 4,  two(0xF000, 0x4403), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2813{"fintrzs", 4,  two(0xF000, 0x4403), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2814{"fintrzw", 4,  two(0xF000, 0x5003), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2815{"fintrzw", 4,  two(0xF000, 0x5003), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2816{"fintrzx", 4,  two(0xF000, 0x0003), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2817{"fintrzx", 4,  two(0xF000, 0x4803), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2818{"fintrzx", 4,  two(0xF000, 0x0003), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2819
2820{"flog10b", 4,  two(0xF000, 0x5815), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2821{"flog10d", 4,  two(0xF000, 0x5415), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2822{"flog10l", 4,  two(0xF000, 0x4015), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2823{"flog10p", 4,  two(0xF000, 0x4C15), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2824{"flog10s", 4,  two(0xF000, 0x4415), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2825{"flog10w", 4,  two(0xF000, 0x5015), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2826{"flog10x", 4,  two(0xF000, 0x0015), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2827{"flog10x", 4,  two(0xF000, 0x4815), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2828{"flog10x", 4,  two(0xF000, 0x0015), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2829
2830{"flog2b", 4,   two(0xF000, 0x5816), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2831{"flog2d", 4,   two(0xF000, 0x5416), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2832{"flog2l", 4,   two(0xF000, 0x4016), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2833{"flog2p", 4,   two(0xF000, 0x4C16), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2834{"flog2s", 4,   two(0xF000, 0x4416), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2835{"flog2w", 4,   two(0xF000, 0x5016), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2836{"flog2x", 4,   two(0xF000, 0x0016), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2837{"flog2x", 4,   two(0xF000, 0x4816), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2838{"flog2x", 4,   two(0xF000, 0x0016), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2839
2840{"flognb", 4,   two(0xF000, 0x5814), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2841{"flognd", 4,   two(0xF000, 0x5414), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2842{"flognl", 4,   two(0xF000, 0x4014), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2843{"flognp", 4,   two(0xF000, 0x4C14), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2844{"flogns", 4,   two(0xF000, 0x4414), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2845{"flognw", 4,   two(0xF000, 0x5014), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2846{"flognx", 4,   two(0xF000, 0x0014), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2847{"flognx", 4,   two(0xF000, 0x4814), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2848{"flognx", 4,   two(0xF000, 0x0014), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2849
2850{"flognp1b", 4, two(0xF000, 0x5806), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2851{"flognp1d", 4, two(0xF000, 0x5406), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2852{"flognp1l", 4, two(0xF000, 0x4006), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2853{"flognp1p", 4, two(0xF000, 0x4C06), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2854{"flognp1s", 4, two(0xF000, 0x4406), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2855{"flognp1w", 4, two(0xF000, 0x5006), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2856{"flognp1x", 4, two(0xF000, 0x0006), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2857{"flognp1x", 4, two(0xF000, 0x4806), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2858{"flognp1x", 4, two(0xF000, 0x0006), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
2859
2860{"fmodb", 4,    two(0xF000, 0x5821), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2861{"fmodd", 4,    two(0xF000, 0x5421), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2862{"fmodl", 4,    two(0xF000, 0x4021), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2863{"fmodp", 4,    two(0xF000, 0x4C21), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2864{"fmods", 4,    two(0xF000, 0x4421), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2865{"fmodw", 4,    two(0xF000, 0x5021), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2866{"fmodx", 4,    two(0xF000, 0x0021), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
2867{"fmodx", 4,    two(0xF000, 0x4821), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2868
2869{"fmoveb", 4,   two(0xF000, 0x5800), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2870{"fmoveb", 4,   two(0xF000, 0x7800), two(0xF1C0, 0xFC7F), "IiF7bs", cfloat },
2871{"fmoveb", 4,   two(0xF000, 0x5800), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2872{"fmoveb", 4,   two(0xF000, 0x7800), two(0xF1C0, 0xFC7F), "IiF7$b", mfloat },
2873{"fmoved", 4,   two(0xF000, 0x5400), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2874{"fmoved", 4,   two(0xF000, 0x7400), two(0xF1C0, 0xFC7F), "IiF7~F", mfloat },
2875{"fmoved", 4,   two(0xF000, 0x0000), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2876{"fmoved", 4,   two(0xF000, 0x5400), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2877{"fmoved", 4,   two(0xF000, 0x7400), two(0xF1C0, 0xFC7F), "IiF7ws", cfloat },
2878{"fmovel", 4,   two(0xF000, 0x4000), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2879{"fmovel", 4,   two(0xF000, 0x6000), two(0xF1C0, 0xFC7F), "IiF7$l", mfloat },
2880/* FIXME: the next two variants should not permit moving an address
2881   register to anything but the floating point instruction register.  */
2882{"fmovel", 4,   two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat },
2883{"fmovel", 4,   two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*ls8", mfloat },
2884{"fmovel", 4,   two(0xF000, 0x4000), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2885{"fmovel", 4,   two(0xF000, 0x6000), two(0xF1C0, 0xFC7F), "IiF7bs", cfloat },
2886  /* Move the FP control registers.  */
2887{"fmovel", 4,   two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8ps", cfloat },
2888{"fmovel", 4,   two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Iibss8", cfloat },
2889{"fmovep", 4,   two(0xF000, 0x4C00), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
2890{"fmovep", 4,   two(0xF000, 0x6C00), two(0xF1C0, 0xFC00), "IiF7~pkC", mfloat },
2891{"fmovep", 4,   two(0xF000, 0x7C00), two(0xF1C0, 0xFC0F), "IiF7~pDk", mfloat },
2892{"fmoves", 4,   two(0xF000, 0x4400), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
2893{"fmoves", 4,   two(0xF000, 0x6400), two(0xF1C0, 0xFC7F), "IiF7$f", mfloat },
2894{"fmoves", 4,   two(0xF000, 0x4400), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2895{"fmoves", 4,   two(0xF000, 0x6400), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2896{"fmovew", 4,   two(0xF000, 0x5000), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
2897{"fmovew", 4,   two(0xF000, 0x7000), two(0xF1C0, 0xFC7F), "IiF7$w", mfloat },
2898{"fmovew", 4,   two(0xF000, 0x5000), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2899{"fmovew", 4,   two(0xF000, 0x7000), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2900{"fmovex", 4,   two(0xF000, 0x0000), two(0xF1FF, 0xE07F), "IiF8F7", mfloat },
2901{"fmovex", 4,   two(0xF000, 0x4800), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
2902{"fmovex", 4,   two(0xF000, 0x6800), two(0xF1C0, 0xFC7F), "IiF7~x", mfloat },
2903
2904{"fsmoveb", 4,  two(0xF000, 0x5840), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
2905{"fsmoveb", 4,  two(0xF000, 0x5840), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2906{"fsmoveb", 4,  two(0xF000, 0x7840), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2907{"fsmoved", 4,  two(0xF000, 0x0040), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2908{"fsmoved", 4,  two(0xF000, 0x5440), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
2909{"fsmoved", 4,  two(0xF000, 0x5440), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2910{"fsmoved", 4,  two(0xF000, 0x7440), two(0xF1C0, 0xFC7F), "IiF7ws", cfloat },
2911{"fsmovel", 4,  two(0xF000, 0x4040), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
2912{"fsmovel", 4,  two(0xF000, 0x4040), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2913{"fsmovel", 4,  two(0xF000, 0x6040), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2914{"fsmoves", 4,  two(0xF000, 0x4440), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
2915{"fsmoves", 4,  two(0xF000, 0x4440), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2916{"fsmoves", 4,  two(0xF000, 0x6440), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2917{"fsmovew", 4,  two(0xF000, 0x5040), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
2918{"fsmovew", 4,  two(0xF000, 0x5040), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2919{"fsmovew", 4,  two(0xF000, 0x7040), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2920{"fsmovex", 4,  two(0xF000, 0x0040), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
2921{"fsmovex", 4,  two(0xF000, 0x4840), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
2922{"fsmovep", 4,  two(0xF000, 0x4C40), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
2923
2924{"fdmoveb", 4,  two(0xF000, 0x5844), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
2925{"fdmoveb", 4,  two(0xF000, 0x5844), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2926{"fdmoveb", 4,  two(0xF000, 0x7844), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2927{"fdmoved", 4,  two(0xF000, 0x0044), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2928{"fdmoved", 4,  two(0xF000, 0x5444), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
2929{"fdmoved", 4,  two(0xF000, 0x5444), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2930{"fdmoved", 4,  two(0xF000, 0x7444), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2931{"fdmovel", 4,  two(0xF000, 0x4044), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
2932{"fdmovel", 4,  two(0xF000, 0x4044), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2933{"fdmovel", 4,  two(0xF000, 0x6044), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2934{"fdmoves", 4,  two(0xF000, 0x4444), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
2935{"fdmoves", 4,  two(0xF000, 0x4444), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2936{"fdmoves", 4,  two(0xF000, 0x6444), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2937{"fdmovew", 4,  two(0xF000, 0x5044), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
2938{"fdmovew", 4,  two(0xF000, 0x5044), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2939{"fdmovew", 4,  two(0xF000, 0x7044), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
2940{"fdmovex", 4,  two(0xF000, 0x0044), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
2941{"fdmovex", 4,  two(0xF000, 0x4844), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
2942{"fdmovep", 4,  two(0xF000, 0x4C44), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
2943
2944{"fmovecrx", 4, two(0xF000, 0x5C00), two(0xF1FF, 0xFC00), "Ii#CF7", mfloat },
2945
2946{"fmovemd", 4,  two(0xF000, 0xD000), two(0xFFC0, 0xFF00), "Iizsl3", cfloat },
2947{"fmovemd", 4,  two(0xF000, 0xD000), two(0xFFC0, 0xFF00), "Iizs#3", cfloat },
2948{"fmovemd", 4,  two(0xF000, 0xF000), two(0xFFC0, 0xFF00), "Ii#3ys", cfloat },
2949{"fmovemd", 4,  two(0xF000, 0xF000), two(0xFFC0, 0xFF00), "Iil3ys", cfloat },
2950
2951{"fmovemx", 4,  two(0xF000, 0xF800), two(0xF1C0, 0xFF8F), "IiDk&s", mfloat },
2952{"fmovemx", 4,  two(0xF020, 0xE800), two(0xF1F8, 0xFF8F), "IiDk-s", mfloat },
2953{"fmovemx", 4,  two(0xF000, 0xD800), two(0xF1C0, 0xFF8F), "Ii&sDk", mfloat },
2954{"fmovemx", 4,  two(0xF018, 0xD800), two(0xF1F8, 0xFF8F), "Ii+sDk", mfloat },
2955{"fmovemx", 4,  two(0xF000, 0xF000), two(0xF1C0, 0xFF00), "Idl3&s", mfloat },
2956{"fmovemx", 4,  two(0xF000, 0xF000), two(0xF1C0, 0xFF00), "Id#3&s", mfloat },
2957{"fmovemx", 4,  two(0xF000, 0xD000), two(0xF1C0, 0xFF00), "Id&sl3", mfloat },
2958{"fmovemx", 4,  two(0xF000, 0xD000), two(0xF1C0, 0xFF00), "Id&s#3", mfloat },
2959{"fmovemx", 4,  two(0xF020, 0xE000), two(0xF1F8, 0xFF00), "IdL3-s", mfloat },
2960{"fmovemx", 4,  two(0xF020, 0xE000), two(0xF1F8, 0xFF00), "Id#3-s", mfloat },
2961{"fmovemx", 4,  two(0xF018, 0xD000), two(0xF1F8, 0xFF00), "Id+sl3", mfloat },
2962{"fmovemx", 4,  two(0xF018, 0xD000), two(0xF1F8, 0xFF00), "Id+s#3", mfloat },
2963
2964{"fmoveml", 4,  two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat },
2965{"fmoveml", 4,  two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "IiL8~s", mfloat },
2966/* FIXME: In the next instruction, we should only permit %dn if the
2967   target is a single register.  We should only permit %an if the
2968   target is a single %fpiar.  */
2969{"fmoveml", 4,  two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*lL8", mfloat },
2970
2971{"fmovem", 4,   two(0xF000, 0xD000), two(0xFFC0, 0xFF00), "IizsL3", cfloat },
2972{"fmovem", 4,   two(0xF000, 0xD000), two(0xFFC0, 0xFF00), "Iizs#3", cfloat },
2973{"fmovem", 4,   two(0xF000, 0xF000), two(0xFFC0, 0xFF00), "Ii#3ys", cfloat },
2974{"fmovem", 4,   two(0xF000, 0xF000), two(0xFFC0, 0xFF00), "IiL3ys", cfloat },
2975
2976{"fmovem", 4,   two(0xF020, 0xE000), two(0xF1F8, 0xFF00), "IdL3-s", mfloat },
2977{"fmovem", 4,   two(0xF000, 0xF000), two(0xF1C0, 0xFF00), "Idl3&s", mfloat },
2978{"fmovem", 4,   two(0xF018, 0xD000), two(0xF1F8, 0xFF00), "Id+sl3", mfloat },
2979{"fmovem", 4,   two(0xF000, 0xD000), two(0xF1C0, 0xFF00), "Id&sl3", mfloat },
2980{"fmovem", 4,   two(0xF020, 0xE000), two(0xF1F8, 0xFF00), "Id#3-s", mfloat },
2981{"fmovem", 4,   two(0xF020, 0xE800), two(0xF1F8, 0xFF8F), "IiDk-s", mfloat },
2982{"fmovem", 4,   two(0xF000, 0xF000), two(0xF1C0, 0xFF00), "Id#3&s", mfloat },
2983{"fmovem", 4,   two(0xF000, 0xF800), two(0xF1C0, 0xFF8F), "IiDk&s", mfloat },
2984{"fmovem", 4,   two(0xF018, 0xD000), two(0xF1F8, 0xFF00), "Id+s#3", mfloat },
2985{"fmovem", 4,   two(0xF018, 0xD800), two(0xF1F8, 0xFF8F), "Ii+sDk", mfloat },
2986{"fmovem", 4,   two(0xF000, 0xD000), two(0xF1C0, 0xFF00), "Id&s#3", mfloat },
2987{"fmovem", 4,   two(0xF000, 0xD800), two(0xF1C0, 0xFF8F), "Ii&sDk", mfloat },
2988{"fmovem", 4,   two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat },
2989{"fmovem", 4,   two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*ss8", mfloat },
2990{"fmovem", 4,   two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "IiL8~s", mfloat },
2991{"fmovem", 4,   two(0xF000, 0x8000), two(0xF2C0, 0xE3FF), "Ii*sL8", mfloat },
2992
2993{"fmulb", 4,    two(0xF000, 0x5823), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
2994{"fmulb", 4,    two(0xF000, 0x5823), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
2995{"fmuld", 4,    two(0xF000, 0x0023), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
2996{"fmuld", 4,    two(0xF000, 0x5423), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
2997{"fmuld", 4,    two(0xF000, 0x5423), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
2998{"fmull", 4,    two(0xF000, 0x4023), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
2999{"fmull", 4,    two(0xF000, 0x4023), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3000{"fmulp", 4,    two(0xF000, 0x4C23), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3001{"fmuls", 4,    two(0xF000, 0x4423), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3002{"fmuls", 4,    two(0xF000, 0x4423), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3003{"fmulw", 4,    two(0xF000, 0x5023), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3004{"fmulw", 4,    two(0xF000, 0x5023), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3005{"fmulx", 4,    two(0xF000, 0x0023), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3006{"fmulx", 4,    two(0xF000, 0x4823), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3007
3008{"fsmulb", 4,   two(0xF000, 0x5863), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3009{"fsmulb", 4,   two(0xF000, 0x5863), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3010{"fsmuld", 4,   two(0xF000, 0x0063), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3011{"fsmuld", 4,   two(0xF000, 0x5463), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3012{"fsmuld", 4,   two(0xF000, 0x5463), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3013{"fsmull", 4,   two(0xF000, 0x4063), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3014{"fsmull", 4,   two(0xF000, 0x4063), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3015{"fsmulp", 4,   two(0xF000, 0x4C63), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3016{"fsmuls", 4,   two(0xF000, 0x4463), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3017{"fsmuls", 4,   two(0xF000, 0x4463), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3018{"fsmulw", 4,   two(0xF000, 0x5063), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3019{"fsmulw", 4,   two(0xF000, 0x5063), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3020{"fsmulx", 4,   two(0xF000, 0x0063), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3021{"fsmulx", 4,   two(0xF000, 0x4863), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3022
3023{"fdmulb", 4,   two(0xF000, 0x5867), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3024{"fdmulb", 4,   two(0xF000, 0x5867), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3025{"fdmuld", 4,   two(0xF000, 0x0067), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3026{"fdmuld", 4,   two(0xF000, 0x5467), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3027{"fdmuld", 4,   two(0xF000, 0x5467), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3028{"fdmull", 4,   two(0xF000, 0x4067), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3029{"fdmull", 4,   two(0xF000, 0x4067), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3030{"fdmulp", 4,   two(0xF000, 0x4C67), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3031{"fdmuls", 4,   two(0xF000, 0x4467), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3032{"fdmuls", 4,   two(0xF000, 0x4467), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3033{"fdmulw", 4,   two(0xF000, 0x5067), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3034{"fdmulw", 4,   two(0xF000, 0x5067), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3035{"fdmulx", 4,   two(0xF000, 0x0067), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3036{"fdmulx", 4,   two(0xF000, 0x4867), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3037
3038{"fnegb", 4,    two(0xF000, 0x581A), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3039{"fnegb", 4,    two(0xF000, 0x581A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3040{"fnegd", 4,    two(0xF000, 0x001A), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3041{"fnegd", 4,    two(0xF000, 0x001A), two(0xF1C0, 0xE07F), "IiFt",   cfloat },
3042{"fnegd", 4,    two(0xF000, 0x541A), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3043{"fnegd", 4,    two(0xF000, 0x541A), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3044{"fnegl", 4,    two(0xF000, 0x401A), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3045{"fnegl", 4,    two(0xF000, 0x401A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3046{"fnegp", 4,    two(0xF000, 0x4C1A), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3047{"fnegs", 4,    two(0xF000, 0x441A), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3048{"fnegs", 4,    two(0xF000, 0x441A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3049{"fnegw", 4,    two(0xF000, 0x501A), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3050{"fnegw", 4,    two(0xF000, 0x501A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3051{"fnegx", 4,    two(0xF000, 0x001A), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3052{"fnegx", 4,    two(0xF000, 0x481A), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3053{"fnegx", 4,    two(0xF000, 0x001A), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3054
3055{"fsnegb", 4,   two(0xF000, 0x585A), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3056{"fsnegb", 4,   two(0xF000, 0x585A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3057{"fsnegd", 4,   two(0xF000, 0x005A), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3058{"fsnegd", 4,   two(0xF000, 0x005A), two(0xF1C0, 0xE07F), "IiFt",   cfloat },
3059{"fsnegd", 4,   two(0xF000, 0x545A), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3060{"fsnegd", 4,   two(0xF000, 0x545A), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3061{"fsnegl", 4,   two(0xF000, 0x405A), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3062{"fsnegl", 4,   two(0xF000, 0x405A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3063{"fsnegp", 4,   two(0xF000, 0x4C5A), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3064{"fsnegs", 4,   two(0xF000, 0x445A), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3065{"fsnegs", 4,   two(0xF000, 0x445A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3066{"fsnegw", 4,   two(0xF000, 0x505A), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3067{"fsnegw", 4,   two(0xF000, 0x505A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3068{"fsnegx", 4,   two(0xF000, 0x005A), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3069{"fsnegx", 4,   two(0xF000, 0x485A), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3070{"fsnegx", 4,   two(0xF000, 0x005A), two(0xF1C0, 0xE07F), "IiFt",   m68040up },
3071
3072{"fdnegb", 4,   two(0xF000, 0x585E), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3073{"fdnegb", 4,   two(0xF000, 0x585E), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3074{"fdnegd", 4,   two(0xF000, 0x005E), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3075{"fdnegd", 4,   two(0xF000, 0x005E), two(0xF1C0, 0xE07F), "IiFt",   cfloat },
3076{"fdnegd", 4,   two(0xF000, 0x545E), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3077{"fdnegd", 4,   two(0xF000, 0x545E), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3078{"fdnegl", 4,   two(0xF000, 0x405E), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3079{"fdnegl", 4,   two(0xF000, 0x405E), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3080{"fdnegp", 4,   two(0xF000, 0x4C5E), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3081{"fdnegs", 4,   two(0xF000, 0x445E), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3082{"fdnegs", 4,   two(0xF000, 0x445E), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3083{"fdnegw", 4,   two(0xF000, 0x505E), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3084{"fdnegw", 4,   two(0xF000, 0x505E), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3085{"fdnegx", 4,   two(0xF000, 0x005E), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3086{"fdnegx", 4,   two(0xF000, 0x485E), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3087{"fdnegx", 4,   two(0xF000, 0x005E), two(0xF1C0, 0xE07F), "IiFt",   m68040up },
3088
3089{"fnop", 4,     two(0xF280, 0x0000), two(0xFFFF, 0xFFFF), "Ii", mfloat | cfloat },
3090
3091{"fremb", 4,    two(0xF000, 0x5825), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3092{"fremd", 4,    two(0xF000, 0x5425), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3093{"freml", 4,    two(0xF000, 0x4025), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3094{"fremp", 4,    two(0xF000, 0x4C25), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3095{"frems", 4,    two(0xF000, 0x4425), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3096{"fremw", 4,    two(0xF000, 0x5025), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3097{"fremx", 4,    two(0xF000, 0x0025), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3098{"fremx", 4,    two(0xF000, 0x4825), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3099
3100{"frestore", 2, one(0xF140),            one(0xF1C0), "Id<s", mfloat },
3101{"frestore", 2, one(0xF140),            one(0xF1C0), "Idys", cfloat },
3102
3103{"fsave", 2,    one(0xF100),            one(0xF1C0), "Id>s", mfloat },
3104{"fsave", 2,    one(0xF100),            one(0xF1C0), "Idzs", cfloat },
3105
3106{"fscaleb", 4,  two(0xF000, 0x5826), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3107{"fscaled", 4,  two(0xF000, 0x5426), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3108{"fscalel", 4,  two(0xF000, 0x4026), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3109{"fscalep", 4,  two(0xF000, 0x4C26), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3110{"fscales", 4,  two(0xF000, 0x4426), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3111{"fscalew", 4,  two(0xF000, 0x5026), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3112{"fscalex", 4,  two(0xF000, 0x0026), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3113{"fscalex", 4,  two(0xF000, 0x4826), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3114
3115/* $ is necessary to prevent the assembler from using PC-relative.
3116   If @ were used, "label: fseq label" could produce "ftrapeq", 2,
3117   because "label" became "pc@label".  */
3118{"fseq", 4,     two(0xF040, 0x0001), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3119{"fsf", 4,      two(0xF040, 0x0000), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3120{"fsge", 4,     two(0xF040, 0x0013), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3121{"fsgl", 4,     two(0xF040, 0x0016), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3122{"fsgle", 4,    two(0xF040, 0x0017), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3123{"fsgt", 4,     two(0xF040, 0x0012), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3124{"fsle", 4,     two(0xF040, 0x0015), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3125{"fslt", 4,     two(0xF040, 0x0014), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3126{"fsne", 4,     two(0xF040, 0x000E), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3127{"fsnge", 4,    two(0xF040, 0x001C), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3128{"fsngl", 4,    two(0xF040, 0x0019), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3129{"fsngle", 4,   two(0xF040, 0x0018), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3130{"fsngt", 4,    two(0xF040, 0x001D), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3131{"fsnle", 4,    two(0xF040, 0x001A), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3132{"fsnlt", 4,    two(0xF040, 0x001B), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3133{"fsoge", 4,    two(0xF040, 0x0003), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3134{"fsogl", 4,    two(0xF040, 0x0006), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3135{"fsogt", 4,    two(0xF040, 0x0002), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3136{"fsole", 4,    two(0xF040, 0x0005), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3137{"fsolt", 4,    two(0xF040, 0x0004), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3138{"fsor", 4,     two(0xF040, 0x0007), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3139{"fsseq", 4,    two(0xF040, 0x0011), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3140{"fssf", 4,     two(0xF040, 0x0010), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3141{"fssne", 4,    two(0xF040, 0x001E), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3142{"fsst", 4,     two(0xF040, 0x001F), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3143{"fst", 4,      two(0xF040, 0x000F), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3144{"fsueq", 4,    two(0xF040, 0x0009), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3145{"fsuge", 4,    two(0xF040, 0x000B), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3146{"fsugt", 4,    two(0xF040, 0x000A), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3147{"fsule", 4,    two(0xF040, 0x000D), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3148{"fsult", 4,    two(0xF040, 0x000C), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3149{"fsun", 4,     two(0xF040, 0x0008), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
3150
3151{"fsgldivb", 4, two(0xF000, 0x5824), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3152{"fsgldivd", 4, two(0xF000, 0x5424), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3153{"fsgldivl", 4, two(0xF000, 0x4024), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3154{"fsgldivp", 4, two(0xF000, 0x4C24), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3155{"fsgldivs", 4, two(0xF000, 0x4424), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3156{"fsgldivw", 4, two(0xF000, 0x5024), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3157{"fsgldivx", 4, two(0xF000, 0x0024), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3158{"fsgldivx", 4, two(0xF000, 0x4824), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3159{"fsgldivx", 4, two(0xF000, 0x0024), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3160
3161{"fsglmulb", 4, two(0xF000, 0x5827), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3162{"fsglmuld", 4, two(0xF000, 0x5427), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3163{"fsglmull", 4, two(0xF000, 0x4027), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3164{"fsglmulp", 4, two(0xF000, 0x4C27), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3165{"fsglmuls", 4, two(0xF000, 0x4427), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3166{"fsglmulw", 4, two(0xF000, 0x5027), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3167{"fsglmulx", 4, two(0xF000, 0x0027), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3168{"fsglmulx", 4, two(0xF000, 0x4827), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3169{"fsglmulx", 4, two(0xF000, 0x0027), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3170
3171{"fsinb", 4,    two(0xF000, 0x580E), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3172{"fsind", 4,    two(0xF000, 0x540E), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3173{"fsinl", 4,    two(0xF000, 0x400E), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3174{"fsinp", 4,    two(0xF000, 0x4C0E), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3175{"fsins", 4,    two(0xF000, 0x440E), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3176{"fsinw", 4,    two(0xF000, 0x500E), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3177{"fsinx", 4,    two(0xF000, 0x000E), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3178{"fsinx", 4,    two(0xF000, 0x480E), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3179{"fsinx", 4,    two(0xF000, 0x000E), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3180
3181{"fsincosb", 4, two(0xF000, 0x5830), two(0xF1C0, 0xFC78), "Ii;bF3F7", mfloat },
3182{"fsincosd", 4, two(0xF000, 0x5430), two(0xF1C0, 0xFC78), "Ii;FF3F7", mfloat },
3183{"fsincosl", 4, two(0xF000, 0x4030), two(0xF1C0, 0xFC78), "Ii;lF3F7", mfloat },
3184{"fsincosp", 4, two(0xF000, 0x4C30), two(0xF1C0, 0xFC78), "Ii;pF3F7", mfloat },
3185{"fsincoss", 4, two(0xF000, 0x4430), two(0xF1C0, 0xFC78), "Ii;fF3F7", mfloat },
3186{"fsincosw", 4, two(0xF000, 0x5030), two(0xF1C0, 0xFC78), "Ii;wF3F7", mfloat },
3187{"fsincosx", 4, two(0xF000, 0x0030), two(0xF1C0, 0xE078), "IiF8F3F7", mfloat },
3188{"fsincosx", 4, two(0xF000, 0x4830), two(0xF1C0, 0xFC78), "Ii;xF3F7", mfloat },
3189
3190{"fsinhb", 4,   two(0xF000, 0x5802), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3191{"fsinhd", 4,   two(0xF000, 0x5402), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3192{"fsinhl", 4,   two(0xF000, 0x4002), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3193{"fsinhp", 4,   two(0xF000, 0x4C02), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3194{"fsinhs", 4,   two(0xF000, 0x4402), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3195{"fsinhw", 4,   two(0xF000, 0x5002), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3196{"fsinhx", 4,   two(0xF000, 0x0002), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3197{"fsinhx", 4,   two(0xF000, 0x4802), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3198{"fsinhx", 4,   two(0xF000, 0x0002), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3199
3200{"fsqrtb", 4,   two(0xF000, 0x5804), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3201{"fsqrtb", 4,   two(0xF000, 0x5804), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3202{"fsqrtd", 4,   two(0xF000, 0x0004), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3203{"fsqrtd", 4,   two(0xF000, 0x0004), two(0xF1C0, 0xE07F), "IiFt",   cfloat },
3204{"fsqrtd", 4,   two(0xF000, 0x5404), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3205{"fsqrtd", 4,   two(0xF000, 0x5404), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3206{"fsqrtl", 4,   two(0xF000, 0x4004), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3207{"fsqrtl", 4,   two(0xF000, 0x4004), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3208{"fsqrtp", 4,   two(0xF000, 0x4C04), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3209{"fsqrts", 4,   two(0xF000, 0x4404), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3210{"fsqrts", 4,   two(0xF000, 0x4404), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3211{"fsqrtw", 4,   two(0xF000, 0x5004), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3212{"fsqrtw", 4,   two(0xF000, 0x5004), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3213{"fsqrtx", 4,   two(0xF000, 0x0004), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3214{"fsqrtx", 4,   two(0xF000, 0x4804), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3215{"fsqrtx", 4,   two(0xF000, 0x0004), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3216
3217{"fssqrtb", 4,  two(0xF000, 0x5841), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3218{"fssqrtb", 4,  two(0xF000, 0x5841), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3219{"fssqrtd", 4,  two(0xF000, 0x0041), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3220{"fssqrtd", 4,  two(0xF000, 0x0041), two(0xF1C0, 0xE07F), "IiFt",   cfloat },
3221{"fssqrtd", 4,  two(0xF000, 0x5441), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3222{"fssqrtd", 4,  two(0xF000, 0x5441), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3223{"fssqrtl", 4,  two(0xF000, 0x4041), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3224{"fssqrtl", 4,  two(0xF000, 0x4041), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3225{"fssqrtp", 4,  two(0xF000, 0x4C41), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3226{"fssqrts", 4,  two(0xF000, 0x4441), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3227{"fssqrts", 4,  two(0xF000, 0x4441), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3228{"fssqrtw", 4,  two(0xF000, 0x5041), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3229{"fssqrtw", 4,  two(0xF000, 0x5041), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3230{"fssqrtx", 4,  two(0xF000, 0x0041), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3231{"fssqrtx", 4,  two(0xF000, 0x4841), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3232{"fssqrtx", 4,  two(0xF000, 0x0041), two(0xF1C0, 0xE07F), "IiFt",   m68040up },
3233
3234{"fdsqrtb", 4,  two(0xF000, 0x5845), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3235{"fdsqrtb", 4,  two(0xF000, 0x5845), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3236{"fdsqrtd", 4,  two(0xF000, 0x0045), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3237{"fdsqrtd", 4,  two(0xF000, 0x0045), two(0xF1C0, 0xE07F), "IiFt",   cfloat },
3238{"fdsqrtd", 4,  two(0xF000, 0x5445), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3239{"fdsqrtl", 4,  two(0xF000, 0x4045), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3240{"fdsqrtl", 4,  two(0xF000, 0x4045), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3241{"fdsqrtp", 4,  two(0xF000, 0x4C45), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3242{"fdsqrts", 4,  two(0xF000, 0x4445), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3243{"fdsqrts", 4,  two(0xF000, 0x4445), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3244{"fdsqrtw", 4,  two(0xF000, 0x5045), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3245{"fdsqrtw", 4,  two(0xF000, 0x5045), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3246{"fdsqrtx", 4,  two(0xF000, 0x0045), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3247{"fdsqrtx", 4,  two(0xF000, 0x4845), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3248{"fdsqrtx", 4,  two(0xF000, 0x0045), two(0xF1C0, 0xE07F), "IiFt",   m68040up },
3249
3250{"fsubb", 4,    two(0xF000, 0x5828), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3251{"fsubb", 4,    two(0xF000, 0x5828), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3252{"fsubd", 4,    two(0xF000, 0x0028), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3253{"fsubd", 4,    two(0xF000, 0x5428), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3254{"fsubd", 4,    two(0xF000, 0x5428), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3255{"fsubl", 4,    two(0xF000, 0x4028), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3256{"fsubl", 4,    two(0xF000, 0x4028), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3257{"fsubp", 4,    two(0xF000, 0x4C28), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3258{"fsubs", 4,    two(0xF000, 0x4428), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3259{"fsubs", 4,    two(0xF000, 0x4428), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3260{"fsubw", 4,    two(0xF000, 0x5028), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3261{"fsubw", 4,    two(0xF000, 0x5028), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3262{"fsubx", 4,    two(0xF000, 0x0028), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3263{"fsubx", 4,    two(0xF000, 0x4828), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3264{"fsubx", 4,    two(0xF000, 0x0028), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3265
3266{"fssubb", 4,   two(0xF000, 0x5828), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3267{"fssubb", 4,   two(0xF000, 0x5868), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3268{"fssubd", 4,   two(0xF000, 0x0068), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3269{"fssubd", 4,   two(0xF000, 0x5468), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3270{"fssubd", 4,   two(0xF000, 0x5468), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3271{"fssubl", 4,   two(0xF000, 0x4068), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3272{"fssubl", 4,   two(0xF000, 0x4068), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3273{"fssubp", 4,   two(0xF000, 0x4C68), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3274{"fssubs", 4,   two(0xF000, 0x4468), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3275{"fssubs", 4,   two(0xF000, 0x4468), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3276{"fssubw", 4,   two(0xF000, 0x5068), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3277{"fssubw", 4,   two(0xF000, 0x5068), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3278{"fssubx", 4,   two(0xF000, 0x0068), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3279{"fssubx", 4,   two(0xF000, 0x4868), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3280{"fssubx", 4,   two(0xF000, 0x0068), two(0xF1C0, 0xE07F), "IiFt",   m68040up },
3281
3282{"fdsubb", 4,   two(0xF000, 0x586A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3283{"fdsubb", 4,   two(0xF000, 0x586c), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
3284{"fdsubd", 4,   two(0xF000, 0x006A), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
3285{"fdsubd", 4,   two(0xF000, 0x546A), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
3286{"fdsubd", 4,   two(0xF000, 0x546c), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
3287{"fdsubl", 4,   two(0xF000, 0x406A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3288{"fdsubl", 4,   two(0xF000, 0x406c), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
3289{"fdsubp", 4,   two(0xF000, 0x4C6c), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
3290{"fdsubs", 4,   two(0xF000, 0x446A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3291{"fdsubs", 4,   two(0xF000, 0x446c), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
3292{"fdsubw", 4,   two(0xF000, 0x506A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
3293{"fdsubw", 4,   two(0xF000, 0x506c), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
3294{"fdsubx", 4,   two(0xF000, 0x006c), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
3295{"fdsubx", 4,   two(0xF000, 0x486c), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
3296{"fdsubx", 4,   two(0xF000, 0x006c), two(0xF1C0, 0xE07F), "IiFt",   m68040up },
3297
3298{"ftanb", 4,    two(0xF000, 0x580F), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3299{"ftand", 4,    two(0xF000, 0x540F), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3300{"ftanl", 4,    two(0xF000, 0x400F), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3301{"ftanp", 4,    two(0xF000, 0x4C0F), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3302{"ftans", 4,    two(0xF000, 0x440F), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3303{"ftanw", 4,    two(0xF000, 0x500F), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3304{"ftanx", 4,    two(0xF000, 0x000F), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3305{"ftanx", 4,    two(0xF000, 0x480F), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3306{"ftanx", 4,    two(0xF000, 0x000F), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3307
3308{"ftanhb", 4,   two(0xF000, 0x5809), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3309{"ftanhd", 4,   two(0xF000, 0x5409), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3310{"ftanhl", 4,   two(0xF000, 0x4009), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3311{"ftanhp", 4,   two(0xF000, 0x4C09), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3312{"ftanhs", 4,   two(0xF000, 0x4409), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3313{"ftanhw", 4,   two(0xF000, 0x5009), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3314{"ftanhx", 4,   two(0xF000, 0x0009), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3315{"ftanhx", 4,   two(0xF000, 0x4809), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3316{"ftanhx", 4,   two(0xF000, 0x0009), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3317
3318{"ftentoxb", 4, two(0xF000, 0x5812), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3319{"ftentoxd", 4, two(0xF000, 0x5412), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3320{"ftentoxl", 4, two(0xF000, 0x4012), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3321{"ftentoxp", 4, two(0xF000, 0x4C12), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3322{"ftentoxs", 4, two(0xF000, 0x4412), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3323{"ftentoxw", 4, two(0xF000, 0x5012), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3324{"ftentoxx", 4, two(0xF000, 0x0012), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3325{"ftentoxx", 4, two(0xF000, 0x4812), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3326{"ftentoxx", 4, two(0xF000, 0x0012), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3327
3328{"ftrapeq", 4,  two(0xF07C, 0x0001), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3329{"ftrapf", 4,   two(0xF07C, 0x0000), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3330{"ftrapge", 4,  two(0xF07C, 0x0013), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3331{"ftrapgl", 4,  two(0xF07C, 0x0016), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3332{"ftrapgle", 4, two(0xF07C, 0x0017), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3333{"ftrapgt", 4,  two(0xF07C, 0x0012), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3334{"ftraple", 4,  two(0xF07C, 0x0015), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3335{"ftraplt", 4,  two(0xF07C, 0x0014), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3336{"ftrapne", 4,  two(0xF07C, 0x000E), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3337{"ftrapnge", 4, two(0xF07C, 0x001C), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3338{"ftrapngl", 4, two(0xF07C, 0x0019), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3339{"ftrapngle", 4,two(0xF07C, 0x0018), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3340{"ftrapngt", 4, two(0xF07C, 0x001D), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3341{"ftrapnle", 4, two(0xF07C, 0x001A), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3342{"ftrapnlt", 4, two(0xF07C, 0x001B), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3343{"ftrapoge", 4, two(0xF07C, 0x0003), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3344{"ftrapogl", 4, two(0xF07C, 0x0006), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3345{"ftrapogt", 4, two(0xF07C, 0x0002), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3346{"ftrapole", 4, two(0xF07C, 0x0005), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3347{"ftrapolt", 4, two(0xF07C, 0x0004), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3348{"ftrapor", 4,  two(0xF07C, 0x0007), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3349{"ftrapseq", 4, two(0xF07C, 0x0011), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3350{"ftrapsf", 4,  two(0xF07C, 0x0010), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3351{"ftrapsne", 4, two(0xF07C, 0x001E), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3352{"ftrapst", 4,  two(0xF07C, 0x001F), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3353{"ftrapt", 4,   two(0xF07C, 0x000F), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3354{"ftrapueq", 4, two(0xF07C, 0x0009), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3355{"ftrapuge", 4, two(0xF07C, 0x000B), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3356{"ftrapugt", 4, two(0xF07C, 0x000A), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3357{"ftrapule", 4, two(0xF07C, 0x000D), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3358{"ftrapult", 4, two(0xF07C, 0x000C), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3359{"ftrapun", 4,  two(0xF07C, 0x0008), two(0xF1FF, 0xFFFF), "Ii", mfloat },
3360
3361{"ftrapeqw", 4, two(0xF07A, 0x0001), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3362{"ftrapfw", 4,  two(0xF07A, 0x0000), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3363{"ftrapgew", 4, two(0xF07A, 0x0013), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3364{"ftrapglw", 4, two(0xF07A, 0x0016), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3365{"ftrapglew", 4,two(0xF07A, 0x0017), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3366{"ftrapgtw", 4, two(0xF07A, 0x0012), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3367{"ftraplew", 4, two(0xF07A, 0x0015), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3368{"ftrapltw", 4, two(0xF07A, 0x0014), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3369{"ftrapnew", 4, two(0xF07A, 0x000E), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3370{"ftrapngew", 4,two(0xF07A, 0x001C), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3371{"ftrapnglw", 4,two(0xF07A, 0x0019), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3372{"ftrapnglew", 4,two(0xF07A, 0x0018), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3373{"ftrapngtw", 4,two(0xF07A, 0x001D), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3374{"ftrapnlew", 4,two(0xF07A, 0x001A), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3375{"ftrapnltw", 4,two(0xF07A, 0x001B), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3376{"ftrapogew", 4,two(0xF07A, 0x0003), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3377{"ftrapoglw", 4,two(0xF07A, 0x0006), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3378{"ftrapogtw", 4,two(0xF07A, 0x0002), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3379{"ftrapolew", 4,two(0xF07A, 0x0005), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3380{"ftrapoltw", 4,two(0xF07A, 0x0004), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3381{"ftraporw", 4, two(0xF07A, 0x0007), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3382{"ftrapseqw", 4,two(0xF07A, 0x0011), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3383{"ftrapsfw", 4, two(0xF07A, 0x0010), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3384{"ftrapsnew", 4,two(0xF07A, 0x001E), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3385{"ftrapstw", 4, two(0xF07A, 0x001F), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3386{"ftraptw", 4,  two(0xF07A, 0x000F), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3387{"ftrapueqw", 4,two(0xF07A, 0x0009), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3388{"ftrapugew", 4,two(0xF07A, 0x000B), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3389{"ftrapugtw", 4,two(0xF07A, 0x000A), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3390{"ftrapulew", 4,two(0xF07A, 0x000D), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3391{"ftrapultw", 4,two(0xF07A, 0x000C), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3392{"ftrapunw", 4, two(0xF07A, 0x0008), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
3393
3394{"ftrapeql", 4, two(0xF07B, 0x0001), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3395{"ftrapfl", 4,  two(0xF07B, 0x0000), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3396{"ftrapgel", 4, two(0xF07B, 0x0013), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3397{"ftrapgll", 4, two(0xF07B, 0x0016), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3398{"ftrapglel", 4,two(0xF07B, 0x0017), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3399{"ftrapgtl", 4, two(0xF07B, 0x0012), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3400{"ftraplel", 4, two(0xF07B, 0x0015), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3401{"ftrapltl", 4, two(0xF07B, 0x0014), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3402{"ftrapnel", 4, two(0xF07B, 0x000E), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3403{"ftrapngel", 4,two(0xF07B, 0x001C), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3404{"ftrapngll", 4,two(0xF07B, 0x0019), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3405{"ftrapnglel", 4,two(0xF07B, 0x0018), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3406{"ftrapngtl", 4,two(0xF07B, 0x001D), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3407{"ftrapnlel", 4,two(0xF07B, 0x001A), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3408{"ftrapnltl", 4,two(0xF07B, 0x001B), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3409{"ftrapogel", 4,two(0xF07B, 0x0003), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3410{"ftrapogll", 4,two(0xF07B, 0x0006), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3411{"ftrapogtl", 4,two(0xF07B, 0x0002), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3412{"ftrapolel", 4,two(0xF07B, 0x0005), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3413{"ftrapoltl", 4,two(0xF07B, 0x0004), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3414{"ftraporl", 4, two(0xF07B, 0x0007), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3415{"ftrapseql", 4,two(0xF07B, 0x0011), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3416{"ftrapsfl", 4, two(0xF07B, 0x0010), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3417{"ftrapsnel", 4,two(0xF07B, 0x001E), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3418{"ftrapstl", 4, two(0xF07B, 0x001F), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3419{"ftraptl", 4,  two(0xF07B, 0x000F), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3420{"ftrapueql", 4,two(0xF07B, 0x0009), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3421{"ftrapugel", 4,two(0xF07B, 0x000B), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3422{"ftrapugtl", 4,two(0xF07B, 0x000A), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3423{"ftrapulel", 4,two(0xF07B, 0x000D), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3424{"ftrapultl", 4,two(0xF07B, 0x000C), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3425{"ftrapunl", 4, two(0xF07B, 0x0008), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
3426
3427{"ftstb", 4,    two(0xF000, 0x583A), two(0xF1C0, 0xFC7F), "Ii;b", mfloat },
3428{"ftstb", 4,    two(0xF000, 0x583A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
3429{"ftstd", 4,    two(0xF000, 0x003A), two(0xF1C0, 0xE07F), "IiF8", cfloat },
3430{"ftstd", 4,    two(0xF000, 0x543A), two(0xF1C0, 0xFC7F), "Ii;F", mfloat },
3431{"ftstd", 4,    two(0xF000, 0x543A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
3432{"ftstl", 4,    two(0xF000, 0x403A), two(0xF1C0, 0xFC7F), "Ii;l", mfloat },
3433{"ftstl", 4,    two(0xF000, 0x403A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
3434{"ftstp", 4,    two(0xF000, 0x4C3A), two(0xF1C0, 0xFC7F), "Ii;p", mfloat },
3435{"ftsts", 4,    two(0xF000, 0x443A), two(0xF1C0, 0xFC7F), "Ii;f", mfloat },
3436{"ftsts", 4,    two(0xF000, 0x443A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
3437{"ftstw", 4,    two(0xF000, 0x503A), two(0xF1C0, 0xFC7F), "Ii;w", mfloat },
3438{"ftstw", 4,    two(0xF000, 0x503A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
3439{"ftstx", 4,    two(0xF000, 0x003A), two(0xF1C0, 0xE07F), "IiF8", mfloat },
3440{"ftstx", 4,    two(0xF000, 0x483A), two(0xF1C0, 0xFC7F), "Ii;x", mfloat },
3441
3442{"ftwotoxb", 4, two(0xF000, 0x5811), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
3443{"ftwotoxd", 4, two(0xF000, 0x5411), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
3444{"ftwotoxl", 4, two(0xF000, 0x4011), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
3445{"ftwotoxp", 4, two(0xF000, 0x4C11), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
3446{"ftwotoxs", 4, two(0xF000, 0x4411), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
3447{"ftwotoxw", 4, two(0xF000, 0x5011), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
3448{"ftwotoxx", 4, two(0xF000, 0x0011), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
3449{"ftwotoxx", 4, two(0xF000, 0x4811), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
3450{"ftwotoxx", 4, two(0xF000, 0x0011), two(0xF1C0, 0xE07F), "IiFt",   mfloat },
3451
3452{"halt", 2,     one(0045310),   one(0177777), "",     m68060 | mcfisa_a },
3453
3454{"illegal", 2,  one(0045374),   one(0177777), "",     m68000up | mcfisa_a },
3455{"intouch", 2,  one(0xf428),    one(0xfff8), "As",    mcfisa_b },
3456
3457{"jmp", 2,      one(0047300),   one(0177700), "!s", m68000up | mcfisa_a },
3458
3459{"jra", 2,      one(0060000),   one(0177400), "Bg", m68000up | mcfisa_a },
3460{"jra", 2,      one(0047300),   one(0177700), "!s", m68000up | mcfisa_a },
3461
3462{"jsr", 2,      one(0047200),   one(0177700), "!s", m68000up | mcfisa_a },
3463
3464{"jbsr", 2,     one(0060400),   one(0177400), "Bg", m68000up | mcfisa_a },
3465{"jbsr", 2,     one(0047200),   one(0177700), "!s", m68000up | mcfisa_a },
3466
3467{"lea", 2,      one(0040700),   one(0170700), "!sAd", m68000up | mcfisa_a },
3468
3469{"lpstop", 6,   two(0174000,0000700),two(0177777,0177777),"#w", cpu32|m68060 },
3470
3471{"linkw", 4,    one(0047120),   one(0177770), "As#w", m68000up | mcfisa_a },
3472{"linkl", 6,    one(0044010),   one(0177770), "As#l", m68020up | cpu32 },
3473{"link", 4,     one(0047120),   one(0177770), "As#W", m68000up | mcfisa_a },
3474{"link", 6,     one(0044010),   one(0177770), "As#l", m68020up | cpu32 },
3475
3476{"lslb", 2,     one(0160410),   one(0170770), "QdDs", m68000up },
3477{"lslb", 2,     one(0160450),   one(0170770), "DdDs", m68000up },
3478{"lslw", 2,     one(0160510),   one(0170770), "QdDs", m68000up },
3479{"lslw", 2,     one(0160550),   one(0170770), "DdDs", m68000up },
3480{"lslw", 2,     one(0161700),   one(0177700), "~s",   m68000up },
3481{"lsll", 2,     one(0160610),   one(0170770), "QdDs", m68000up | mcfisa_a },
3482{"lsll", 2,     one(0160650),   one(0170770), "DdDs", m68000up | mcfisa_a },
3483
3484{"lsrb", 2,     one(0160010),   one(0170770), "QdDs", m68000up },
3485{"lsrb", 2,     one(0160050),   one(0170770), "DdDs", m68000up },
3486{"lsrw", 2,     one(0160110),   one(0170770), "QdDs", m68000up },
3487{"lsrw", 2,     one(0160150),   one(0170770), "DdDs", m68000up },
3488{"lsrw", 2,     one(0161300),   one(0177700), "~s",   m68000up },
3489{"lsrl", 2,     one(0160210),   one(0170770), "QdDs", m68000up | mcfisa_a },
3490{"lsrl", 2,     one(0160250),   one(0170770), "DdDs", m68000up | mcfisa_a },
3491
3492{"macw", 4,     two(0xa080, 0x0000), two(0xf180, 0x0910), "uNuoiI4/Rn", mcfmac },
3493{"macw", 4,     two(0xa080, 0x0200), two(0xf180, 0x0910), "uNuoMh4/Rn", mcfmac },
3494{"macw", 4,     two(0xa080, 0x0000), two(0xf180, 0x0f10), "uNuo4/Rn", mcfmac },
3495{"macw", 4,     two(0xa000, 0x0000), two(0xf1b0, 0x0900), "uMumiI", mcfmac },
3496{"macw", 4,     two(0xa000, 0x0200), two(0xf1b0, 0x0900), "uMumMh", mcfmac },
3497{"macw", 4,     two(0xa000, 0x0000), two(0xf1b0, 0x0f00), "uMum", mcfmac },
3498
3499{"macw", 4,     two(0xa000, 0x0000), two(0xf100, 0x0900), "uNuoiI4/RneG", mcfemac },/* Ry,Rx,SF,<ea>,accX.  */
3500{"macw", 4,     two(0xa000, 0x0200), two(0xf100, 0x0900), "uNuoMh4/RneG", mcfemac },/* Ry,Rx,+1/-1,<ea>,accX.  */
3501{"macw", 4,     two(0xa000, 0x0000), two(0xf100, 0x0f00), "uNuo4/RneG", mcfemac },/* Ry,Rx,<ea>,accX.  */
3502{"macw", 4,     two(0xa000, 0x0000), two(0xf130, 0x0900), "uMumiIeH", mcfemac },/* Ry,Rx,SF,accX.  */
3503{"macw", 4,     two(0xa000, 0x0200), two(0xf130, 0x0900), "uMumMheH", mcfemac },/* Ry,Rx,+1/-1,accX.  */
3504{"macw", 4,     two(0xa000, 0x0000), two(0xf130, 0x0f00), "uMumeH", mcfemac }, /* Ry,Rx,accX.  */
3505
3506{"macl", 4,     two(0xa080, 0x0800), two(0xf180, 0x0910), "RNRoiI4/Rn", mcfmac },
3507{"macl", 4,     two(0xa080, 0x0a00), two(0xf180, 0x0910), "RNRoMh4/Rn", mcfmac },
3508{"macl", 4,     two(0xa080, 0x0800), two(0xf180, 0x0f10), "RNRo4/Rn", mcfmac },
3509{"macl", 4,     two(0xa000, 0x0800), two(0xf1b0, 0x0b00), "RMRmiI", mcfmac },
3510{"macl", 4,     two(0xa000, 0x0a00), two(0xf1b0, 0x0b00), "RMRmMh", mcfmac },
3511{"macl", 4,     two(0xa000, 0x0800), two(0xf1b0, 0x0800), "RMRm", mcfmac },
3512
3513{"macl", 4,     two(0xa000, 0x0800), two(0xf100, 0x0900), "R3R1iI4/RneG", mcfemac },
3514{"macl", 4,     two(0xa000, 0x0a00), two(0xf100, 0x0900), "R3R1Mh4/RneG", mcfemac },
3515{"macl", 4,     two(0xa000, 0x0800), two(0xf100, 0x0f00), "R3R14/RneG", mcfemac },
3516{"macl", 4,     two(0xa000, 0x0800), two(0xf130, 0x0900), "RMRmiIeH", mcfemac },
3517{"macl", 4,     two(0xa000, 0x0a00), two(0xf130, 0x0900), "RMRmMheH", mcfemac },
3518{"macl", 4,     two(0xa000, 0x0800), two(0xf130, 0x0f00), "RMRmeH", mcfemac },
3519
3520/* NOTE: The mcf5200 family programmer's reference manual does not
3521   indicate the byte form of the movea instruction is invalid (as it
3522   is on 68000 family cpus).  However, experiments on the 5202 yield
3523   unexpected results.  The value is copied, but it is not sign extended
3524   (as is done with movea.w) and the top three bytes in the address
3525   register are not disturbed.  I don't know if this is the intended
3526   behavior --- it could be a hole in instruction decoding (Motorola
3527   decided not to trap all invalid instructions for performance reasons)
3528   --- but I suspect that it is not.
3529
3530   I reported this to Motorola ISD Technical Communications Support,
3531   which replied that other coldfire assemblers reject movea.b.  For
3532   this reason I've decided to not allow moveab.
3533
3534        jtc@cygnus.com - 97/01/24.  */
3535
3536{"moveal", 2,   one(0020100),   one(0170700), "*lAd", m68000up | mcfisa_a },
3537{"moveaw", 2,   one(0030100),   one(0170700), "*wAd", m68000up | mcfisa_a },
3538
3539{"movclrl", 2,  one(0xA1C0),    one(0xf9f0), "eFRs", mcfemac },
3540
3541{"movec", 4,    one(0047173),   one(0177777), "R1Jj", m68010up | mcfisa_a },
3542{"movec", 4,    one(0047173),   one(0177777), "R1#j", m68010up | mcfisa_a },
3543{"movec", 4,    one(0047172),   one(0177777), "JjR1", m68010up },
3544{"movec", 4,    one(0047172),   one(0177777), "#jR1", m68010up },
3545
3546{"movemw", 4,   one(0044200),   one(0177700), "Lw&s", m68000up },
3547{"movemw", 4,   one(0044240),   one(0177770), "lw-s", m68000up },
3548{"movemw", 4,   one(0044200),   one(0177700), "#w>s", m68000up },
3549{"movemw", 4,   one(0046200),   one(0177700), "<sLw", m68000up },
3550{"movemw", 4,   one(0046200),   one(0177700), "<s#w", m68000up },
3551{"moveml", 4,   one(0044300),   one(0177700), "Lw&s", m68000up },
3552{"moveml", 4,   one(0044340),   one(0177770), "lw-s", m68000up },
3553{"moveml", 4,   one(0044300),   one(0177700), "#w>s", m68000up },
3554{"moveml", 4,   one(0046300),   one(0177700), "<sLw", m68000up },
3555{"moveml", 4,   one(0046300),   one(0177700), "<s#w", m68000up },
3556/* FIXME: need specifier for mode 2 and 5 to simplify below insn patterns.  */
3557{"moveml", 4,   one(0044320),   one(0177770), "Lwas", mcfisa_a },
3558{"moveml", 4,   one(0044320),   one(0177770), "#was", mcfisa_a },
3559{"moveml", 4,   one(0044350),   one(0177770), "Lwds", mcfisa_a },
3560{"moveml", 4,   one(0044350),   one(0177770), "#wds", mcfisa_a },
3561{"moveml", 4,   one(0046320),   one(0177770), "asLw", mcfisa_a },
3562{"moveml", 4,   one(0046320),   one(0177770), "as#w", mcfisa_a },
3563{"moveml", 4,   one(0046350),   one(0177770), "dsLw", mcfisa_a },
3564{"moveml", 4,   one(0046350),   one(0177770), "ds#w", mcfisa_a },
3565
3566{"movepw", 2,   one(0000410),   one(0170770), "dsDd", m68000up },
3567{"movepw", 2,   one(0000610),   one(0170770), "Ddds", m68000up },
3568{"movepl", 2,   one(0000510),   one(0170770), "dsDd", m68000up },
3569{"movepl", 2,   one(0000710),   one(0170770), "Ddds", m68000up },
3570
3571{"moveq", 2,    one(0070000),   one(0170400), "MsDd", m68000up | mcfisa_a },
3572{"moveq", 2,    one(0070000),   one(0170400), "#BDd", m68000up | mcfisa_a },
3573
3574/* The move opcode can generate the movea and moveq instructions.  */
3575{"moveb", 2,    one(0010000),   one(0170000), ";b$d", m68000up },
3576{"moveb", 2,    one(0010000),   one(0170070), "Ds$d", mcfisa_a },
3577{"moveb", 2,    one(0010020),   one(0170070), "as$d", mcfisa_a },
3578{"moveb", 2,    one(0010030),   one(0170070), "+s$d", mcfisa_a },
3579{"moveb", 2,    one(0010040),   one(0170070), "-s$d", mcfisa_a },
3580{"moveb", 2,    one(0010000),   one(0170000), "nsqd", mcfisa_a },
3581{"moveb", 2,    one(0010000),   one(0170700), "obDd", mcfisa_a },
3582{"moveb", 2,    one(0010200),   one(0170700), "obad", mcfisa_a },
3583{"moveb", 2,    one(0010300),   one(0170700), "ob+d", mcfisa_a },
3584{"moveb", 2,    one(0010400),   one(0170700), "ob-d", mcfisa_a },
3585{"moveb", 2,    one(0010000),   one(0170000), "obnd", mcfisa_b },
3586
3587{"movew", 2,    one(0030000),   one(0170000), "*w%d", m68000up },
3588{"movew", 2,    one(0030000),   one(0170000), "ms%d", mcfisa_a },
3589{"movew", 2,    one(0030000),   one(0170000), "nspd", mcfisa_a },
3590{"movew", 2,    one(0030000),   one(0170000), "owmd", mcfisa_a },
3591{"movew", 2,    one(0030000),   one(0170000), "ownd", mcfisa_b },
3592{"movew", 2,    one(0040300),   one(0177700), "Ss$s", m68000up },
3593{"movew", 2,    one(0040300),   one(0177770), "SsDs", mcfisa_a },
3594{"movew", 2,    one(0041300),   one(0177700), "Cs$s", m68010up },
3595{"movew", 2,    one(0041300),   one(0177770), "CsDs", mcfisa_a },
3596{"movew", 2,    one(0042300),   one(0177700), ";wCd", m68000up },
3597{"movew", 2,    one(0042300),   one(0177700), "DsCd", mcfisa_a },
3598{"movew", 4,    one(0042374),   one(0177777), "#wCd", mcfisa_a },
3599{"movew", 2,    one(0043300),   one(0177700), ";wSd", m68000up },
3600{"movew", 2,    one(0043300),   one(0177700), "DsSd", mcfisa_a },
3601{"movew", 4,    one(0043374),   one(0177777), "#wSd", mcfisa_a },
3602
3603{"movel", 2,    one(0070000),   one(0170400), "MsDd", m68000up | mcfisa_a },
3604{"movel", 2,    one(0020000),   one(0170000), "*l%d", m68000up },
3605{"movel", 2,    one(0020000),   one(0170000), "ms%d", mcfisa_a },
3606{"movel", 2,    one(0020000),   one(0170000), "nspd", mcfisa_a },
3607{"movel", 2,    one(0020000),   one(0170000), "olmd", mcfisa_a },
3608{"movel", 2,    one(0020000),   one(0170000), "olnd", mcfisa_b },
3609{"movel", 2,    one(0047140),   one(0177770), "AsUd", m68000up | mcfusp },
3610{"movel", 2,    one(0047150),   one(0177770), "UdAs", m68000up | mcfusp },
3611{"movel", 2,    one(0120600),   one(0177760), "EsRs", mcfmac },
3612{"movel", 2,    one(0120400),   one(0177760), "RsEs", mcfmac },
3613{"movel", 6,    one(0120474),   one(0177777), "#lEs", mcfmac },
3614{"movel", 2,    one(0124600),   one(0177760), "GsRs", mcfmac },
3615{"movel", 2,    one(0124400),   one(0177760), "RsGs", mcfmac },
3616{"movel", 6,    one(0124474),   one(0177777), "#lGs", mcfmac },
3617{"movel", 2,    one(0126600),   one(0177760), "HsRs", mcfmac },
3618{"movel", 2,    one(0126400),   one(0177760), "RsHs", mcfmac },
3619{"movel", 6,    one(0126474),   one(0177777), "#lHs", mcfmac },
3620{"movel", 2,    one(0124700),   one(0177777), "GsCs", mcfmac },
3621
3622{"movel", 2,    one(0xa180),    one(0xf9f0), "eFRs", mcfemac }, /* ACCx,Rx.  */
3623{"movel", 2,    one(0xab80),    one(0xfbf0), "g]Rs", mcfemac }, /* ACCEXTx,Rx.  */
3624{"movel", 2,    one(0xa980),    one(0xfff0), "G-Rs", mcfemac }, /* macsr,Rx.  */
3625{"movel", 2,    one(0xad80),    one(0xfff0), "H-Rs", mcfemac }, /* mask,Rx.  */
3626{"movel", 2,    one(0xa110),    one(0xf9fc), "efeF", mcfemac }, /* ACCy,ACCx.  */
3627{"movel", 2,    one(0xa9c0),    one(0xffff), "G-C-", mcfemac }, /* macsr,ccr.  */
3628{"movel", 2,    one(0xa100),    one(0xf9f0), "RseF", mcfemac }, /* Rx,ACCx.  */
3629{"movel", 6,    one(0xa13c),    one(0xf9ff), "#leF", mcfemac }, /* #,ACCx.  */
3630{"movel", 2,    one(0xab00),    one(0xfbc0), "Rsg]", mcfemac }, /* Rx,ACCEXTx.  */
3631{"movel", 6,    one(0xab3c),    one(0xfbff), "#lg]", mcfemac }, /* #,ACCEXTx.  */
3632{"movel", 2,    one(0xa900),    one(0xffc0), "RsG-", mcfemac }, /* Rx,macsr.  */
3633{"movel", 6,    one(0xa93c),    one(0xffff), "#lG-", mcfemac }, /* #,macsr.  */
3634{"movel", 2,    one(0xad00),    one(0xffc0), "RsH-", mcfemac }, /* Rx,mask.  */
3635{"movel", 6,    one(0xad3c),    one(0xffff), "#lH-", mcfemac }, /* #,mask.  */
3636
3637{"move", 2,     one(0030000),   one(0170000), "*w%d", m68000up },
3638{"move", 2,     one(0030000),   one(0170000), "ms%d", mcfisa_a },
3639{"move", 2,     one(0030000),   one(0170000), "nspd", mcfisa_a },
3640{"move", 2,     one(0030000),   one(0170000), "owmd", mcfisa_a },
3641{"move", 2,     one(0030000),   one(0170000), "ownd", mcfisa_b },
3642{"move", 2,     one(0040300),   one(0177700), "Ss$s", m68000up },
3643{"move", 2,     one(0040300),   one(0177770), "SsDs", mcfisa_a },
3644{"move", 2,     one(0041300),   one(0177700), "Cs$s", m68010up },
3645{"move", 2,     one(0041300),   one(0177770), "CsDs", mcfisa_a },
3646{"move", 2,     one(0042300),   one(0177700), ";wCd", m68000up },
3647{"move", 2,     one(0042300),   one(0177700), "DsCd", mcfisa_a },
3648{"move", 4,     one(0042374),   one(0177777), "#wCd", mcfisa_a },
3649{"move", 2,     one(0043300),   one(0177700), ";wSd", m68000up },
3650{"move", 2,     one(0043300),   one(0177700), "DsSd", mcfisa_a },
3651{"move", 4,     one(0043374),   one(0177777), "#wSd", mcfisa_a },
3652
3653{"move", 2,     one(0047140),   one(0177770), "AsUd", m68000up },
3654{"move", 2,     one(0047150),   one(0177770), "UdAs", m68000up },
3655
3656{"mov3ql", 2,   one(0120500),   one(0170700), "xd%s", mcfisa_b },
3657{"mvsb", 2,     one(0070400),   one(0170700), "*bDd", mcfisa_b },
3658{"mvsw", 2,     one(0070500),   one(0170700), "*wDd", mcfisa_b },
3659{"mvzb", 2,     one(0070600),   one(0170700), "*bDd", mcfisa_b },
3660{"mvzw", 2,     one(0070700),   one(0170700), "*wDd", mcfisa_b },
3661
3662{"movesb", 4,   two(0007000, 0),     two(0177700, 07777), "~sR1", m68010up },
3663{"movesb", 4,   two(0007000, 04000), two(0177700, 07777), "R1~s", m68010up },
3664{"movesw", 4,   two(0007100, 0),     two(0177700, 07777), "~sR1", m68010up },
3665{"movesw", 4,   two(0007100, 04000), two(0177700, 07777), "R1~s", m68010up },
3666{"movesl", 4,   two(0007200, 0),     two(0177700, 07777), "~sR1", m68010up },
3667{"movesl", 4,   two(0007200, 04000), two(0177700, 07777), "R1~s", m68010up },
3668
3669{"move16", 4,   two(0xf620, 0x8000), two(0xfff8, 0x8fff), "+s+1", m68040up },
3670{"move16", 2,   one(0xf600),            one(0xfff8), "+s_L", m68040up },
3671{"move16", 2,   one(0xf608),            one(0xfff8), "_L+s", m68040up },
3672{"move16", 2,   one(0xf610),            one(0xfff8), "as_L", m68040up },
3673{"move16", 2,   one(0xf618),            one(0xfff8), "_Las", m68040up },
3674
3675{"msacw", 4,    two(0xa080, 0x0100), two(0xf180, 0x0910), "uNuoiI4/Rn", mcfmac },
3676{"msacw", 4,    two(0xa080, 0x0300), two(0xf180, 0x0910), "uNuoMh4/Rn", mcfmac },
3677{"msacw", 4,    two(0xa080, 0x0100), two(0xf180, 0x0f10), "uNuo4/Rn", mcfmac },
3678{"msacw", 4,    two(0xa000, 0x0100), two(0xf1b0, 0x0900), "uMumiI", mcfmac },
3679{"msacw", 4,    two(0xa000, 0x0300), two(0xf1b0, 0x0900), "uMumMh", mcfmac },
3680{"msacw", 4,    two(0xa000, 0x0100), two(0xf1b0, 0x0f00), "uMum", mcfmac },
3681
3682{"msacw", 4,    two(0xa000, 0x0100), two(0xf100, 0x0900), "uMumiI4/RneG", mcfemac },/* Ry,Rx,SF,<ea>,accX.  */
3683{"msacw", 4,    two(0xa000, 0x0300), two(0xf100, 0x0900), "uMumMh4/RneG", mcfemac },/* Ry,Rx,+1/-1,<ea>,accX.  */
3684{"msacw", 4,    two(0xa000, 0x0100), two(0xf100, 0x0f00), "uMum4/RneG", mcfemac },/* Ry,Rx,<ea>,accX.  */
3685{"msacw", 4,    two(0xa000, 0x0100), two(0xf130, 0x0900), "uMumiIeH", mcfemac },/* Ry,Rx,SF,accX.  */
3686{"msacw", 4,    two(0xa000, 0x0300), two(0xf130, 0x0900), "uMumMheH", mcfemac },/* Ry,Rx,+1/-1,accX.  */
3687{"msacw", 4,    two(0xa000, 0x0100), two(0xf130, 0x0f00), "uMumeH", mcfemac }, /* Ry,Rx,accX.  */
3688
3689{"msacl", 4,    two(0xa080, 0x0900), two(0xf180, 0x0910), "RNRoiI4/Rn", mcfmac },
3690{"msacl", 4,    two(0xa080, 0x0b00), two(0xf180, 0x0910), "RNRoMh4/Rn", mcfmac },
3691{"msacl", 4,    two(0xa080, 0x0900), two(0xf180, 0x0f10), "RNRo4/Rn", mcfmac },
3692{"msacl", 4,    two(0xa000, 0x0900), two(0xf1b0, 0x0b00), "RMRmiI", mcfmac },
3693{"msacl", 4,    two(0xa000, 0x0b00), two(0xf1b0, 0x0b00), "RMRmMh", mcfmac },
3694{"msacl", 4,    two(0xa000, 0x0900), two(0xf1b0, 0x0800), "RMRm", mcfmac },
3695
3696{"msacl", 4,    two(0xa000, 0x0900), two(0xf100, 0x0900), "R3R1iI4/RneG", mcfemac },
3697{"msacl", 4,    two(0xa000, 0x0b00), two(0xf100, 0x0900), "R3R1Mh4/RneG", mcfemac },
3698{"msacl", 4,    two(0xa000, 0x0900), two(0xf100, 0x0f00), "R3R14/RneG", mcfemac },
3699{"msacl", 4,    two(0xa000, 0x0900), two(0xf130, 0x0900), "RMRmiIeH", mcfemac },
3700{"msacl", 4,    two(0xa000, 0x0b00), two(0xf130, 0x0900), "RMRmMheH", mcfemac },
3701{"msacl", 4,    two(0xa000, 0x0900), two(0xf130, 0x0f00), "RMRmeH", mcfemac },
3702
3703{"mulsw", 2,    one(0140700),           one(0170700), ";wDd", m68000up|mcfisa_a },
3704{"mulsl", 4,    two(0046000,004000), two(0177700,0107770), ";lD1", m68020up|cpu32 },
3705{"mulsl", 4,    two(0046000,004000), two(0177700,0107770), "qsD1", mcfisa_a },
3706{"mulsl", 4,    two(0046000,006000), two(0177700,0107770), ";lD3D1",m68020up|cpu32 },
3707
3708{"muluw", 2,    one(0140300),           one(0170700), ";wDd", m68000up|mcfisa_a },
3709{"mulul", 4,    two(0046000,000000), two(0177700,0107770), ";lD1", m68020up|cpu32 },
3710{"mulul", 4,    two(0046000,000000), two(0177700,0107770), "qsD1", mcfisa_a },
3711{"mulul", 4,    two(0046000,002000), two(0177700,0107770), ";lD3D1",m68020up|cpu32 },
3712
3713{"nbcd", 2,     one(0044000),   one(0177700), "$s", m68000up },
3714
3715{"negb", 2,     one(0042000),   one(0177700), "$s", m68000up },
3716{"negw", 2,     one(0042100),   one(0177700), "$s", m68000up },
3717{"negl", 2,     one(0042200),   one(0177700), "$s", m68000up },
3718{"negl", 2,     one(0042200),   one(0177700), "Ds", mcfisa_a},
3719
3720{"negxb", 2,    one(0040000),   one(0177700), "$s", m68000up },
3721{"negxw", 2,    one(0040100),   one(0177700), "$s", m68000up },
3722{"negxl", 2,    one(0040200),   one(0177700), "$s", m68000up },
3723{"negxl", 2,    one(0040200),   one(0177700), "Ds", mcfisa_a},
3724
3725{"nop", 2,      one(0047161),   one(0177777), "", m68000up | mcfisa_a},
3726
3727{"notb", 2,     one(0043000),   one(0177700), "$s", m68000up },
3728{"notw", 2,     one(0043100),   one(0177700), "$s", m68000up },
3729{"notl", 2,     one(0043200),   one(0177700), "$s", m68000up },
3730{"notl", 2,     one(0043200),   one(0177700), "Ds", mcfisa_a},
3731
3732{"orib", 4,     one(0000000),   one(0177700), "#b$s", m68000up },
3733{"orib", 4,     one(0000074),   one(0177777), "#bCs", m68000up },
3734{"oriw", 4,     one(0000100),   one(0177700), "#w$s", m68000up },
3735{"oriw", 4,     one(0000174),   one(0177777), "#wSs", m68000up },
3736{"oril", 6,     one(0000200),   one(0177700), "#l$s", m68000up },
3737{"oril", 6,     one(0000200),   one(0177700), "#lDs", mcfisa_a },
3738{"ori", 4,      one(0000074),   one(0177777), "#bCs", m68000up },
3739{"ori", 4,      one(0000100),   one(0177700), "#w$s", m68000up },
3740{"ori", 4,      one(0000174),   one(0177777), "#wSs", m68000up },
3741
3742/* The or opcode can generate the ori instruction.  */
3743{"orb", 4,      one(0000000),   one(0177700), "#b$s", m68000up },
3744{"orb", 4,      one(0000074),   one(0177777), "#bCs", m68000up },
3745{"orb", 2,      one(0100000),   one(0170700), ";bDd", m68000up },
3746{"orb", 2,      one(0100400),   one(0170700), "Dd~s", m68000up },
3747{"orw", 4,      one(0000100),   one(0177700), "#w$s", m68000up },
3748{"orw", 4,      one(0000174),   one(0177777), "#wSs", m68000up },
3749{"orw", 2,      one(0100100),   one(0170700), ";wDd", m68000up },
3750{"orw", 2,      one(0100500),   one(0170700), "Dd~s", m68000up },
3751{"orl", 6,      one(0000200),   one(0177700), "#l$s", m68000up },
3752{"orl", 6,      one(0000200),   one(0177700), "#lDs", mcfisa_a },
3753{"orl", 2,      one(0100200),   one(0170700), ";lDd", m68000up | mcfisa_a },
3754{"orl", 2,      one(0100600),   one(0170700), "Dd~s", m68000up | mcfisa_a },
3755{"or", 4,       one(0000074),   one(0177777), "#bCs", m68000up },
3756{"or", 4,       one(0000100),   one(0177700), "#w$s", m68000up },
3757{"or", 4,       one(0000174),   one(0177777), "#wSs", m68000up },
3758{"or", 2,       one(0100100),   one(0170700), ";wDd", m68000up },
3759{"or", 2,       one(0100500),   one(0170700), "Dd~s", m68000up },
3760
3761{"pack", 4,     one(0100500),   one(0170770), "DsDd#w", m68020up },
3762{"pack", 4,     one(0100510),   one(0170770), "-s-d#w", m68020up },
3763
3764{"pbac", 2,     one(0xf087),    one(0xffbf), "Bc", m68851 },
3765{"pbacw", 2,    one(0xf087),    one(0xffff), "BW", m68851 },
3766{"pbas", 2,     one(0xf086),    one(0xffbf), "Bc", m68851 },
3767{"pbasw", 2,    one(0xf086),    one(0xffff), "BW", m68851 },
3768{"pbbc", 2,     one(0xf081),    one(0xffbf), "Bc", m68851 },
3769{"pbbcw", 2,    one(0xf081),    one(0xffff), "BW", m68851 },
3770{"pbbs", 2,     one(0xf080),    one(0xffbf), "Bc", m68851 },
3771{"pbbsw", 2,    one(0xf080),    one(0xffff), "BW", m68851 },
3772{"pbcc", 2,     one(0xf08f),    one(0xffbf), "Bc", m68851 },
3773{"pbccw", 2,    one(0xf08f),    one(0xffff), "BW", m68851 },
3774{"pbcs", 2,     one(0xf08e),    one(0xffbf), "Bc", m68851 },
3775{"pbcsw", 2,    one(0xf08e),    one(0xffff), "BW", m68851 },
3776{"pbgc", 2,     one(0xf08d),    one(0xffbf), "Bc", m68851 },
3777{"pbgcw", 2,    one(0xf08d),    one(0xffff), "BW", m68851 },
3778{"pbgs", 2,     one(0xf08c),    one(0xffbf), "Bc", m68851 },
3779{"pbgsw", 2,    one(0xf08c),    one(0xffff), "BW", m68851 },
3780{"pbic", 2,     one(0xf08b),    one(0xffbf), "Bc", m68851 },
3781{"pbicw", 2,    one(0xf08b),    one(0xffff), "BW", m68851 },
3782{"pbis", 2,     one(0xf08a),    one(0xffbf), "Bc", m68851 },
3783{"pbisw", 2,    one(0xf08a),    one(0xffff), "BW", m68851 },
3784{"pblc", 2,     one(0xf083),    one(0xffbf), "Bc", m68851 },
3785{"pblcw", 2,    one(0xf083),    one(0xffff), "BW", m68851 },
3786{"pbls", 2,     one(0xf082),    one(0xffbf), "Bc", m68851 },
3787{"pblsw", 2,    one(0xf082),    one(0xffff), "BW", m68851 },
3788{"pbsc", 2,     one(0xf085),    one(0xffbf), "Bc", m68851 },
3789{"pbscw", 2,    one(0xf085),    one(0xffff), "BW", m68851 },
3790{"pbss", 2,     one(0xf084),    one(0xffbf), "Bc", m68851 },
3791{"pbssw", 2,    one(0xf084),    one(0xffff), "BW", m68851 },
3792{"pbwc", 2,     one(0xf089),    one(0xffbf), "Bc", m68851 },
3793{"pbwcw", 2,    one(0xf089),    one(0xffff), "BW", m68851 },
3794{"pbws", 2,     one(0xf088),    one(0xffbf), "Bc", m68851 },
3795{"pbwsw", 2,    one(0xf088),    one(0xffff), "BW", m68851 },
3796
3797{"pdbac", 4,    two(0xf048, 0x0007),    two(0xfff8, 0xffff), "DsBw", m68851 },
3798{"pdbas", 4,    two(0xf048, 0x0006),    two(0xfff8, 0xffff), "DsBw", m68851 },
3799{"pdbbc", 4,    two(0xf048, 0x0001),    two(0xfff8, 0xffff), "DsBw", m68851 },
3800{"pdbbs", 4,    two(0xf048, 0x0000),    two(0xfff8, 0xffff), "DsBw", m68851 },
3801{"pdbcc", 4,    two(0xf048, 0x000f),    two(0xfff8, 0xffff), "DsBw", m68851 },
3802{"pdbcs", 4,    two(0xf048, 0x000e),    two(0xfff8, 0xffff), "DsBw", m68851 },
3803{"pdbgc", 4,    two(0xf048, 0x000d),    two(0xfff8, 0xffff), "DsBw", m68851 },
3804{"pdbgs", 4,    two(0xf048, 0x000c),    two(0xfff8, 0xffff), "DsBw", m68851 },
3805{"pdbic", 4,    two(0xf048, 0x000b),    two(0xfff8, 0xffff), "DsBw", m68851 },
3806{"pdbis", 4,    two(0xf048, 0x000a),    two(0xfff8, 0xffff), "DsBw", m68851 },
3807{"pdblc", 4,    two(0xf048, 0x0003),    two(0xfff8, 0xffff), "DsBw", m68851 },
3808{"pdbls", 4,    two(0xf048, 0x0002),    two(0xfff8, 0xffff), "DsBw", m68851 },
3809{"pdbsc", 4,    two(0xf048, 0x0005),    two(0xfff8, 0xffff), "DsBw", m68851 },
3810{"pdbss", 4,    two(0xf048, 0x0004),    two(0xfff8, 0xffff), "DsBw", m68851 },
3811{"pdbwc", 4,    two(0xf048, 0x0009),    two(0xfff8, 0xffff), "DsBw", m68851 },
3812{"pdbws", 4,    two(0xf048, 0x0008),    two(0xfff8, 0xffff), "DsBw", m68851 },
3813
3814{"pea", 2,      one(0044100),           one(0177700), "!s", m68000up|mcfisa_a },
3815
3816{"pflusha", 2,  one(0xf518),            one(0xfff8), "", m68040up },
3817{"pflusha", 4,  two(0xf000,0x2400), two(0xffff,0xffff), "", m68030 | m68851 },
3818
3819{"pflush", 4,   two(0xf000,0x3010), two(0xffc0,0xfe10), "T3T9", m68030|m68851 },
3820{"pflush", 4,   two(0xf000,0x3810), two(0xffc0,0xfe10), "T3T9&s", m68030|m68851 },
3821{"pflush", 4,   two(0xf000,0x3008), two(0xffc0,0xfe18), "D3T9", m68030|m68851 },
3822{"pflush", 4,   two(0xf000,0x3808), two(0xffc0,0xfe18), "D3T9&s", m68030|m68851 },
3823{"pflush", 4,   two(0xf000,0x3000), two(0xffc0,0xfe1e), "f3T9", m68030|m68851 },
3824{"pflush", 4,   two(0xf000,0x3800), two(0xffc0,0xfe1e), "f3T9&s", m68030|m68851 },
3825{"pflush", 2,   one(0xf508),            one(0xfff8), "as", m68040up },
3826{"pflush", 2,   one(0xf508),            one(0xfff8), "As", m68040up },
3827
3828{"pflushan", 2, one(0xf510),            one(0xfff8), "", m68040up },
3829{"pflushn", 2,  one(0xf500),            one(0xfff8), "as", m68040up },
3830{"pflushn", 2,  one(0xf500),            one(0xfff8), "As", m68040up },
3831
3832{"pflushr", 4,  two(0xf000, 0xa000), two(0xffc0, 0xffff), "|s", m68851 },
3833
3834{"pflushs", 4,  two(0xf000, 0x3410), two(0xfff8, 0xfe10), "T3T9", m68851 },
3835{"pflushs", 4,  two(0xf000, 0x3c10), two(0xfff8, 0xfe10), "T3T9&s", m68851 },
3836{"pflushs", 4,  two(0xf000, 0x3408), two(0xfff8, 0xfe18), "D3T9", m68851 },
3837{"pflushs", 4,  two(0xf000, 0x3c08), two(0xfff8, 0xfe18), "D3T9&s", m68851 },
3838{"pflushs", 4,  two(0xf000, 0x3400), two(0xfff8, 0xfe1e), "f3T9", m68851 },
3839{"pflushs", 4,  two(0xf000, 0x3c00), two(0xfff8, 0xfe1e), "f3T9&s", m68851 },
3840
3841{"ploadr", 4,   two(0xf000,0x2210), two(0xffc0,0xfff0), "T3&s", m68030|m68851 },
3842{"ploadr", 4,   two(0xf000,0x2208), two(0xffc0,0xfff8), "D3&s", m68030|m68851 },
3843{"ploadr", 4,   two(0xf000,0x2200), two(0xffc0,0xfffe), "f3&s", m68030|m68851 },
3844{"ploadw", 4,   two(0xf000,0x2010), two(0xffc0,0xfff0), "T3&s", m68030|m68851 },
3845{"ploadw", 4,   two(0xf000,0x2008), two(0xffc0,0xfff8), "D3&s", m68030|m68851 },
3846{"ploadw", 4,   two(0xf000,0x2000), two(0xffc0,0xfffe), "f3&s", m68030|m68851 },
3847
3848{"plpar", 2,    one(0xf5c8),            one(0xfff8), "as", m68060 },
3849{"plpaw", 2,    one(0xf588),            one(0xfff8), "as", m68060 },
3850
3851{"pmove", 4,    two(0xf000,0x4000), two(0xffc0,0xffff), "*l08", m68030|m68851 },
3852{"pmove", 4,    two(0xf000,0x5c00), two(0xffc0,0xffff), "*w18", m68851 },
3853{"pmove", 4,    two(0xf000,0x4000), two(0xffc0,0xe3ff), "*b28", m68851 },
3854{"pmove", 4,    two(0xf000,0x4200), two(0xffc0,0xffff), "08%s", m68030|m68851 },
3855{"pmove", 4,    two(0xf000,0x5e00), two(0xffc0,0xffff), "18%s", m68851 },
3856{"pmove", 4,    two(0xf000,0x4200), two(0xffc0,0xe3ff), "28%s", m68851 },
3857{"pmove", 4,    two(0xf000,0x4000), two(0xffc0,0xe3ff), "|sW8", m68030|m68851 },
3858{"pmove", 4,    two(0xf000,0x4200), two(0xffc0,0xe3ff), "W8~s", m68030|m68851 },
3859{"pmove", 4,    two(0xf000,0x6200), two(0xffc0,0xe3e3), "*wX3", m68851 },
3860{"pmove", 4,    two(0xf000,0x6000), two(0xffc0,0xe3e3), "X3%s", m68851 },
3861{"pmove", 4,    two(0xf000,0x6000), two(0xffc0,0xffff), "*wY8", m68030|m68851 },
3862{"pmove", 4,    two(0xf000,0x6200), two(0xffc0,0xffff), "Y8%s", m68030|m68851 },
3863{"pmove", 4,    two(0xf000,0x6600), two(0xffc0,0xffff), "Z8%s", m68851 },
3864{"pmove", 4,    two(0xf000,0x0800), two(0xffc0,0xfbff), "*l38", m68030 },
3865{"pmove", 4,    two(0xf000,0x0a00), two(0xffc0,0xfbff), "38%s", m68030 },
3866
3867{"pmovefd", 4,  two(0xf000, 0x4100),    two(0xffc0, 0xe3ff), "*l08", m68030 },
3868{"pmovefd", 4,  two(0xf000, 0x4100),    two(0xffc0, 0xe3ff), "|sW8", m68030 },
3869{"pmovefd", 4,  two(0xf000, 0x0900),    two(0xffc0, 0xfbff), "*l38", m68030 },
3870
3871{"prestore", 2, one(0xf140),            one(0xffc0), "<s", m68851 },
3872
3873{"psave", 2,    one(0xf100),            one(0xffc0), ">s", m68851 },
3874
3875{"psac", 4,     two(0xf040, 0x0007),    two(0xffc0, 0xffff), "$s", m68851 },
3876{"psas", 4,     two(0xf040, 0x0006),    two(0xffc0, 0xffff), "$s", m68851 },
3877{"psbc", 4,     two(0xf040, 0x0001),    two(0xffc0, 0xffff), "$s", m68851 },
3878{"psbs", 4,     two(0xf040, 0x0000),    two(0xffc0, 0xffff), "$s", m68851 },
3879{"pscc", 4,     two(0xf040, 0x000f),    two(0xffc0, 0xffff), "$s", m68851 },
3880{"pscs", 4,     two(0xf040, 0x000e),    two(0xffc0, 0xffff), "$s", m68851 },
3881{"psgc", 4,     two(0xf040, 0x000d),    two(0xffc0, 0xffff), "$s", m68851 },
3882{"psgs", 4,     two(0xf040, 0x000c),    two(0xffc0, 0xffff), "$s", m68851 },
3883{"psic", 4,     two(0xf040, 0x000b),    two(0xffc0, 0xffff), "$s", m68851 },
3884{"psis", 4,     two(0xf040, 0x000a),    two(0xffc0, 0xffff), "$s", m68851 },
3885{"pslc", 4,     two(0xf040, 0x0003),    two(0xffc0, 0xffff), "$s", m68851 },
3886{"psls", 4,     two(0xf040, 0x0002),    two(0xffc0, 0xffff), "$s", m68851 },
3887{"pssc", 4,     two(0xf040, 0x0005),    two(0xffc0, 0xffff), "$s", m68851 },
3888{"psss", 4,     two(0xf040, 0x0004),    two(0xffc0, 0xffff), "$s", m68851 },
3889{"pswc", 4,     two(0xf040, 0x0009),    two(0xffc0, 0xffff), "$s", m68851 },
3890{"psws", 4,     two(0xf040, 0x0008),    two(0xffc0, 0xffff), "$s", m68851 },
3891
3892{"ptestr", 4,   two(0xf000,0x8210), two(0xffc0, 0xe3f0), "T3&st8", m68030|m68851 },
3893{"ptestr", 4,   two(0xf000,0x8310), two(0xffc0,0xe310), "T3&st8A9", m68030|m68851 },
3894{"ptestr", 4,   two(0xf000,0x8208), two(0xffc0,0xe3f8), "D3&st8", m68030|m68851 },
3895{"ptestr", 4,   two(0xf000,0x8308), two(0xffc0,0xe318), "D3&st8A9", m68030|m68851 },
3896{"ptestr", 4,   two(0xf000,0x8200), two(0xffc0,0xe3fe), "f3&st8", m68030|m68851 },
3897{"ptestr", 4,   two(0xf000,0x8300), two(0xffc0,0xe31e), "f3&st8A9", m68030|m68851 },
3898{"ptestr", 2,   one(0xf568),            one(0xfff8), "as", m68040 },
3899
3900{"ptestw", 4,   two(0xf000,0x8010), two(0xffc0,0xe3f0), "T3&st8", m68030|m68851 },
3901{"ptestw", 4,   two(0xf000,0x8110), two(0xffc0,0xe310), "T3&st8A9", m68030|m68851 },
3902{"ptestw", 4,   two(0xf000,0x8008), two(0xffc0,0xe3f8), "D3&st8", m68030|m68851 },
3903{"ptestw", 4,   two(0xf000,0x8108), two(0xffc0,0xe318), "D3&st8A9", m68030|m68851 },
3904{"ptestw", 4,   two(0xf000,0x8000), two(0xffc0,0xe3fe), "f3&st8", m68030|m68851 },
3905{"ptestw", 4,   two(0xf000,0x8100), two(0xffc0,0xe31e), "f3&st8A9", m68030|m68851 },
3906{"ptestw", 2,   one(0xf548),            one(0xfff8), "as", m68040 },
3907
3908{"ptrapacw", 6, two(0xf07a, 0x0007),    two(0xffff, 0xffff), "#w", m68851 },
3909{"ptrapacl", 6, two(0xf07b, 0x0007),    two(0xffff, 0xffff), "#l", m68851 },
3910{"ptrapac", 4,  two(0xf07c, 0x0007),    two(0xffff, 0xffff), "",   m68851 },
3911
3912{"ptrapasw", 6, two(0xf07a, 0x0006),    two(0xffff, 0xffff), "#w", m68851 },
3913{"ptrapasl", 6, two(0xf07b, 0x0006),    two(0xffff, 0xffff), "#l", m68851 },
3914{"ptrapas", 4,  two(0xf07c, 0x0006),    two(0xffff, 0xffff), "",   m68851 },
3915
3916{"ptrapbcw", 6, two(0xf07a, 0x0001),    two(0xffff, 0xffff), "#w", m68851 },
3917{"ptrapbcl", 6, two(0xf07b, 0x0001),    two(0xffff, 0xffff), "#l", m68851 },
3918{"ptrapbc", 4,  two(0xf07c, 0x0001),    two(0xffff, 0xffff), "",   m68851 },
3919
3920{"ptrapbsw", 6, two(0xf07a, 0x0000),    two(0xffff, 0xffff), "#w", m68851 },
3921{"ptrapbsl", 6, two(0xf07b, 0x0000),    two(0xffff, 0xffff), "#l", m68851 },
3922{"ptrapbs", 4,  two(0xf07c, 0x0000),    two(0xffff, 0xffff), "",   m68851 },
3923
3924{"ptrapccw", 6, two(0xf07a, 0x000f),    two(0xffff, 0xffff), "#w", m68851 },
3925{"ptrapccl", 6, two(0xf07b, 0x000f),    two(0xffff, 0xffff), "#l", m68851 },
3926{"ptrapcc", 4,  two(0xf07c, 0x000f),    two(0xffff, 0xffff), "",   m68851 },
3927
3928{"ptrapcsw", 6, two(0xf07a, 0x000e),    two(0xffff, 0xffff), "#w", m68851 },
3929{"ptrapcsl", 6, two(0xf07b, 0x000e),    two(0xffff, 0xffff), "#l", m68851 },
3930{"ptrapcs", 4,  two(0xf07c, 0x000e),    two(0xffff, 0xffff), "",   m68851 },
3931
3932{"ptrapgcw", 6, two(0xf07a, 0x000d),    two(0xffff, 0xffff), "#w", m68851 },
3933{"ptrapgcl", 6, two(0xf07b, 0x000d),    two(0xffff, 0xffff), "#l", m68851 },
3934{"ptrapgc", 4,  two(0xf07c, 0x000d),    two(0xffff, 0xffff), "",   m68851 },
3935
3936{"ptrapgsw", 6, two(0xf07a, 0x000c),    two(0xffff, 0xffff), "#w", m68851 },
3937{"ptrapgsl", 6, two(0xf07b, 0x000c),    two(0xffff, 0xffff), "#l", m68851 },
3938{"ptrapgs", 4,  two(0xf07c, 0x000c),    two(0xffff, 0xffff), "",   m68851 },
3939
3940{"ptrapicw", 6, two(0xf07a, 0x000b),    two(0xffff, 0xffff), "#w", m68851 },
3941{"ptrapicl", 6, two(0xf07b, 0x000b),    two(0xffff, 0xffff), "#l", m68851 },
3942{"ptrapic", 4,  two(0xf07c, 0x000b),    two(0xffff, 0xffff), "",   m68851 },
3943
3944{"ptrapisw", 6, two(0xf07a, 0x000a),    two(0xffff, 0xffff), "#w", m68851 },
3945{"ptrapisl", 6, two(0xf07b, 0x000a),    two(0xffff, 0xffff), "#l", m68851 },
3946{"ptrapis", 4,  two(0xf07c, 0x000a),    two(0xffff, 0xffff), "",   m68851 },
3947
3948{"ptraplcw", 6, two(0xf07a, 0x0003),    two(0xffff, 0xffff), "#w", m68851 },
3949{"ptraplcl", 6, two(0xf07b, 0x0003),    two(0xffff, 0xffff), "#l", m68851 },
3950{"ptraplc", 4,  two(0xf07c, 0x0003),    two(0xffff, 0xffff), "",   m68851 },
3951
3952{"ptraplsw", 6, two(0xf07a, 0x0002),    two(0xffff, 0xffff), "#w", m68851 },
3953{"ptraplsl", 6, two(0xf07b, 0x0002),    two(0xffff, 0xffff), "#l", m68851 },
3954{"ptrapls", 4,  two(0xf07c, 0x0002),    two(0xffff, 0xffff), "",   m68851 },
3955
3956{"ptrapscw", 6, two(0xf07a, 0x0005),    two(0xffff, 0xffff), "#w", m68851 },
3957{"ptrapscl", 6, two(0xf07b, 0x0005),    two(0xffff, 0xffff), "#l", m68851 },
3958{"ptrapsc", 4,  two(0xf07c, 0x0005),    two(0xffff, 0xffff), "",   m68851 },
3959
3960{"ptrapssw", 6, two(0xf07a, 0x0004),    two(0xffff, 0xffff), "#w", m68851 },
3961{"ptrapssl", 6, two(0xf07b, 0x0004),    two(0xffff, 0xffff), "#l", m68851 },
3962{"ptrapss", 4,  two(0xf07c, 0x0004),    two(0xffff, 0xffff), "",   m68851 },
3963
3964{"ptrapwcw", 6, two(0xf07a, 0x0009),    two(0xffff, 0xffff), "#w", m68851 },
3965{"ptrapwcl", 6, two(0xf07b, 0x0009),    two(0xffff, 0xffff), "#l", m68851 },
3966{"ptrapwc", 4,  two(0xf07c, 0x0009),    two(0xffff, 0xffff), "",   m68851 },
3967
3968{"ptrapwsw", 6, two(0xf07a, 0x0008),    two(0xffff, 0xffff), "#w", m68851 },
3969{"ptrapwsl", 6, two(0xf07b, 0x0008),    two(0xffff, 0xffff), "#l", m68851 },
3970{"ptrapws", 4,  two(0xf07c, 0x0008),    two(0xffff, 0xffff), "",   m68851 },
3971
3972{"pulse", 2,    one(0045314),           one(0177777), "", m68060 | mcfisa_a },
3973
3974{"pvalid", 4,   two(0xf000, 0x2800),    two(0xffc0, 0xffff), "Vs&s", m68851 },
3975{"pvalid", 4,   two(0xf000, 0x2c00),    two(0xffc0, 0xfff8), "A3&s", m68851 },
3976
3977  /* FIXME: don't allow Dw==Dx. */
3978{"remsl", 4,    two(0x4c40, 0x0800),    two(0xffc0, 0x8ff8), "qsD3D1", mcfhwdiv },
3979{"remul", 4,    two(0x4c40, 0x0000),    two(0xffc0, 0x8ff8), "qsD3D1", mcfhwdiv },
3980
3981{"reset", 2,    one(0047160),           one(0177777), "", m68000up },
3982
3983{"rolb", 2,     one(0160430),           one(0170770), "QdDs", m68000up },
3984{"rolb", 2,     one(0160470),           one(0170770), "DdDs", m68000up },
3985{"rolw", 2,     one(0160530),           one(0170770), "QdDs", m68000up },
3986{"rolw", 2,     one(0160570),           one(0170770), "DdDs", m68000up },
3987{"rolw", 2,     one(0163700),           one(0177700), "~s",   m68000up },
3988{"roll", 2,     one(0160630),           one(0170770), "QdDs", m68000up },
3989{"roll", 2,     one(0160670),           one(0170770), "DdDs", m68000up },
3990
3991{"rorb", 2,     one(0160030),           one(0170770), "QdDs", m68000up },
3992{"rorb", 2,     one(0160070),           one(0170770), "DdDs", m68000up },
3993{"rorw", 2,     one(0160130),           one(0170770), "QdDs", m68000up },
3994{"rorw", 2,     one(0160170),           one(0170770), "DdDs", m68000up },
3995{"rorw", 2,     one(0163300),           one(0177700), "~s",   m68000up },
3996{"rorl", 2,     one(0160230),           one(0170770), "QdDs", m68000up },
3997{"rorl", 2,     one(0160270),           one(0170770), "DdDs", m68000up },
3998
3999{"roxlb", 2,    one(0160420),           one(0170770), "QdDs", m68000up },
4000{"roxlb", 2,    one(0160460),           one(0170770), "DdDs", m68000up },
4001{"roxlw", 2,    one(0160520),           one(0170770), "QdDs", m68000up },
4002{"roxlw", 2,    one(0160560),           one(0170770), "DdDs", m68000up },
4003{"roxlw", 2,    one(0162700),           one(0177700), "~s",   m68000up },
4004{"roxll", 2,    one(0160620),           one(0170770), "QdDs", m68000up },
4005{"roxll", 2,    one(0160660),           one(0170770), "DdDs", m68000up },
4006
4007{"roxrb", 2,    one(0160020),           one(0170770), "QdDs", m68000up },
4008{"roxrb", 2,    one(0160060),           one(0170770), "DdDs", m68000up },
4009{"roxrw", 2,    one(0160120),           one(0170770), "QdDs", m68000up },
4010{"roxrw", 2,    one(0160160),           one(0170770), "DdDs", m68000up },
4011{"roxrw", 2,    one(0162300),           one(0177700), "~s",   m68000up },
4012{"roxrl", 2,    one(0160220),           one(0170770), "QdDs", m68000up },
4013{"roxrl", 2,    one(0160260),           one(0170770), "DdDs", m68000up },
4014
4015{"rtd", 4,      one(0047164),           one(0177777), "#w", m68010up },
4016
4017{"rte", 2,      one(0047163),           one(0177777), "",   m68000up | mcfisa_a },
4018
4019{"rtm", 2,      one(0003300),           one(0177760), "Rs", m68020 },
4020
4021{"rtr", 2,      one(0047167),           one(0177777), "",   m68000up },
4022
4023{"rts", 2,      one(0047165),           one(0177777), "",   m68000up | mcfisa_a },
4024
4025{"satsl", 2,    one(0046200),           one(0177770), "Ds", mcfisa_b },
4026
4027{"sbcd", 2,     one(0100400),           one(0170770), "DsDd", m68000up },
4028{"sbcd", 2,     one(0100410),           one(0170770), "-s-d", m68000up },
4029
4030{"scc", 2,      one(0052300),   one(0177700), "$s", m68000up },
4031{"scc", 2,      one(0052300),   one(0177700), "Ds", mcfisa_a },
4032{"scs", 2,      one(0052700),   one(0177700), "$s", m68000up },
4033{"scs", 2,      one(0052700),   one(0177700), "Ds", mcfisa_a },
4034{"seq", 2,      one(0053700),   one(0177700), "$s", m68000up },
4035{"seq", 2,      one(0053700),   one(0177700), "Ds", mcfisa_a },
4036{"sf", 2,       one(0050700),   one(0177700), "$s", m68000up },
4037{"sf", 2,       one(0050700),   one(0177700), "Ds", mcfisa_a },
4038{"sge", 2,      one(0056300),   one(0177700), "$s", m68000up },
4039{"sge", 2,      one(0056300),   one(0177700), "Ds", mcfisa_a },
4040{"sgt", 2,      one(0057300),   one(0177700), "$s", m68000up },
4041{"sgt", 2,      one(0057300),   one(0177700), "Ds", mcfisa_a },
4042{"shi", 2,      one(0051300),   one(0177700), "$s", m68000up },
4043{"shi", 2,      one(0051300),   one(0177700), "Ds", mcfisa_a },
4044{"sle", 2,      one(0057700),   one(0177700), "$s", m68000up },
4045{"sle", 2,      one(0057700),   one(0177700), "Ds", mcfisa_a },
4046{"sls", 2,      one(0051700),   one(0177700), "$s", m68000up },
4047{"sls", 2,      one(0051700),   one(0177700), "Ds", mcfisa_a },
4048{"slt", 2,      one(0056700),   one(0177700), "$s", m68000up },
4049{"slt", 2,      one(0056700),   one(0177700), "Ds", mcfisa_a },
4050{"smi", 2,      one(0055700),   one(0177700), "$s", m68000up },
4051{"smi", 2,      one(0055700),   one(0177700), "Ds", mcfisa_a },
4052{"sne", 2,      one(0053300),   one(0177700), "$s", m68000up },
4053{"sne", 2,      one(0053300),   one(0177700), "Ds", mcfisa_a },
4054{"spl", 2,      one(0055300),   one(0177700), "$s", m68000up },
4055{"spl", 2,      one(0055300),   one(0177700), "Ds", mcfisa_a },
4056{"st", 2,       one(0050300),   one(0177700), "$s", m68000up },
4057{"st", 2,       one(0050300),   one(0177700), "Ds", mcfisa_a },
4058{"svc", 2,      one(0054300),   one(0177700), "$s", m68000up },
4059{"svc", 2,      one(0054300),   one(0177700), "Ds", mcfisa_a },
4060{"svs", 2,      one(0054700),   one(0177700), "$s", m68000up },
4061{"svs", 2,      one(0054700),   one(0177700), "Ds", mcfisa_a },
4062
4063{"stop", 4,     one(0047162),   one(0177777), "#w", m68000up | mcfisa_a },
4064
4065{"strldsr", 4, two(0040347,0043374), two(0177777,0177777), "#w", mcfisa_aa},
4066
4067{"subal", 2,    one(0110700),   one(0170700), "*lAd", m68000up | mcfisa_a },
4068{"subaw", 2,    one(0110300),   one(0170700), "*wAd", m68000up },
4069
4070{"subib", 4,    one(0002000),   one(0177700), "#b$s", m68000up },
4071{"subiw", 4,    one(0002100),   one(0177700), "#w$s", m68000up },
4072{"subil", 6,    one(0002200),   one(0177700), "#l$s", m68000up },
4073{"subil", 6,    one(0002200),   one(0177700), "#lDs", mcfisa_a },
4074
4075{"subqb", 2,    one(0050400),   one(0170700), "Qd%s", m68000up },
4076{"subqw", 2,    one(0050500),   one(0170700), "Qd%s", m68000up },
4077{"subql", 2,    one(0050600),   one(0170700), "Qd%s", m68000up | mcfisa_a },
4078
4079/* The sub opcode can generate the suba, subi, and subq instructions.  */
4080{"subb", 2,     one(0050400),   one(0170700), "Qd%s", m68000up },
4081{"subb", 4,     one(0002000),   one(0177700), "#b$s", m68000up },
4082{"subb", 2,     one(0110000),   one(0170700), ";bDd", m68000up },
4083{"subb", 2,     one(0110400),   one(0170700), "Dd~s", m68000up },
4084{"subw", 2,     one(0050500),   one(0170700), "Qd%s", m68000up },
4085{"subw", 4,     one(0002100),   one(0177700), "#w$s", m68000up },
4086{"subw", 2,     one(0110300),   one(0170700), "*wAd", m68000up },
4087{"subw", 2,     one(0110100),   one(0170700), "*wDd", m68000up },
4088{"subw", 2,     one(0110500),   one(0170700), "Dd~s", m68000up },
4089{"subl", 2,     one(0050600),   one(0170700), "Qd%s", m68000up | mcfisa_a },
4090{"subl", 6,     one(0002200),   one(0177700), "#l$s", m68000up },
4091{"subl", 6,     one(0002200),   one(0177700), "#lDs", mcfisa_a },
4092{"subl", 2,     one(0110700),   one(0170700), "*lAd", m68000up | mcfisa_a },
4093{"subl", 2,     one(0110200),   one(0170700), "*lDd", m68000up | mcfisa_a },
4094{"subl", 2,     one(0110600),   one(0170700), "Dd~s", m68000up | mcfisa_a },
4095
4096{"subxb", 2,    one(0110400),   one(0170770), "DsDd", m68000up },
4097{"subxb", 2,    one(0110410),   one(0170770), "-s-d", m68000up },
4098{"subxw", 2,    one(0110500),   one(0170770), "DsDd", m68000up },
4099{"subxw", 2,    one(0110510),   one(0170770), "-s-d", m68000up },
4100{"subxl", 2,    one(0110600),   one(0170770), "DsDd", m68000up | mcfisa_a },
4101{"subxl", 2,    one(0110610),   one(0170770), "-s-d", m68000up },
4102
4103{"swap", 2,     one(0044100),   one(0177770), "Ds", m68000up | mcfisa_a },
4104
4105/* swbeg and swbegl are magic constants used on sysV68.  The compiler
4106   generates them before a switch table.  They tell the debugger and
4107   disassembler that a switch table follows.  The parameter is the
4108   number of elements in the table.  swbeg means that the entries in
4109   the table are word (2 byte) sized, and swbegl means that the
4110   entries in the table are longword (4 byte) sized.  */
4111{"swbeg", 4,    one(0045374),   one(0177777), "#w",   m68000up | mcfisa_a },
4112{"swbegl", 6,   one(0045375),   one(0177777), "#l",   m68000up | mcfisa_a },
4113
4114{"tas", 2,      one(0045300),   one(0177700), "$s", m68000up | mcfisa_b},
4115
4116#define TBL1(name,insn_size,signed,round,size)                                  \
4117  {name, insn_size, two(0174000, (signed<<11)|(!round<<10)|(size<<6)|0000400),  \
4118     two(0177700,0107777), "!sD1", cpu32 },                             \
4119  {name, insn_size, two(0174000, (signed<<11)|(!round<<10)|(size<<6)),          \
4120     two(0177770,0107770), "DsD3D1", cpu32 }
4121#define TBL(name1, name2, name3, s, r) \
4122  TBL1(name1, 4, s, r, 0), TBL1(name2, 4, s, r, 1), TBL1(name3, 4, s, r, 2)
4123TBL("tblsb", "tblsw", "tblsl", 2, 1),
4124TBL("tblsnb", "tblsnw", "tblsnl", 2, 0),
4125TBL("tblub", "tbluw", "tblul", 0, 1),
4126TBL("tblunb", "tblunw", "tblunl", 0, 0),
4127
4128{"trap", 2,     one(0047100),   one(0177760), "Ts", m68000up | mcfisa_a },
4129
4130{"trapcc", 2,   one(0052374),   one(0177777), "", m68020up | cpu32 },
4131{"trapcs", 2,   one(0052774),   one(0177777), "", m68020up | cpu32 },
4132{"trapeq", 2,   one(0053774),   one(0177777), "", m68020up | cpu32 },
4133{"trapf", 2,    one(0050774),   one(0177777), "", m68020up | cpu32 | mcfisa_a },
4134{"trapge", 2,   one(0056374),   one(0177777), "", m68020up | cpu32 },
4135{"trapgt", 2,   one(0057374),   one(0177777), "", m68020up | cpu32 },
4136{"traphi", 2,   one(0051374),   one(0177777), "", m68020up | cpu32 },
4137{"traple", 2,   one(0057774),   one(0177777), "", m68020up | cpu32 },
4138{"trapls", 2,   one(0051774),   one(0177777), "", m68020up | cpu32 },
4139{"traplt", 2,   one(0056774),   one(0177777), "", m68020up | cpu32 },
4140{"trapmi", 2,   one(0055774),   one(0177777), "", m68020up | cpu32 },
4141{"trapne", 2,   one(0053374),   one(0177777), "", m68020up | cpu32 },
4142{"trappl", 2,   one(0055374),   one(0177777), "", m68020up | cpu32 },
4143{"trapt", 2,    one(0050374),   one(0177777), "", m68020up | cpu32 },
4144{"trapvc", 2,   one(0054374),   one(0177777), "", m68020up | cpu32 },
4145{"trapvs", 2,   one(0054774),   one(0177777), "", m68020up | cpu32 },
4146
4147{"trapccw", 4,  one(0052372),   one(0177777), "#w", m68020up|cpu32 },
4148{"trapcsw", 4,  one(0052772),   one(0177777), "#w", m68020up|cpu32 },
4149{"trapeqw", 4,  one(0053772),   one(0177777), "#w", m68020up|cpu32 },
4150{"trapfw", 4,   one(0050772),   one(0177777), "#w", m68020up|cpu32|mcfisa_a},
4151{"trapgew", 4,  one(0056372),   one(0177777), "#w", m68020up|cpu32 },
4152{"trapgtw", 4,  one(0057372),   one(0177777), "#w", m68020up|cpu32 },
4153{"traphiw", 4,  one(0051372),   one(0177777), "#w", m68020up|cpu32 },
4154{"traplew", 4,  one(0057772),   one(0177777), "#w", m68020up|cpu32 },
4155{"traplsw", 4,  one(0051772),   one(0177777), "#w", m68020up|cpu32 },
4156{"trapltw", 4,  one(0056772),   one(0177777), "#w", m68020up|cpu32 },
4157{"trapmiw", 4,  one(0055772),   one(0177777), "#w", m68020up|cpu32 },
4158{"trapnew", 4,  one(0053372),   one(0177777), "#w", m68020up|cpu32 },
4159{"trapplw", 4,  one(0055372),   one(0177777), "#w", m68020up|cpu32 },
4160{"traptw", 4,   one(0050372),   one(0177777), "#w", m68020up|cpu32 },
4161{"trapvcw", 4,  one(0054372),   one(0177777), "#w", m68020up|cpu32 },
4162{"trapvsw", 4,  one(0054772),   one(0177777), "#w", m68020up|cpu32 },
4163
4164{"trapccl", 6,  one(0052373),   one(0177777), "#l", m68020up|cpu32 },
4165{"trapcsl", 6,  one(0052773),   one(0177777), "#l", m68020up|cpu32 },
4166{"trapeql", 6,  one(0053773),   one(0177777), "#l", m68020up|cpu32 },
4167{"trapfl", 6,   one(0050773),   one(0177777), "#l", m68020up|cpu32|mcfisa_a},
4168{"trapgel", 6,  one(0056373),   one(0177777), "#l", m68020up|cpu32 },
4169{"trapgtl", 6,  one(0057373),   one(0177777), "#l", m68020up|cpu32 },
4170{"traphil", 6,  one(0051373),   one(0177777), "#l", m68020up|cpu32 },
4171{"traplel", 6,  one(0057773),   one(0177777), "#l", m68020up|cpu32 },
4172{"traplsl", 6,  one(0051773),   one(0177777), "#l", m68020up|cpu32 },
4173{"trapltl", 6,  one(0056773),   one(0177777), "#l", m68020up|cpu32 },
4174{"trapmil", 6,  one(0055773),   one(0177777), "#l", m68020up|cpu32 },
4175{"trapnel", 6,  one(0053373),   one(0177777), "#l", m68020up|cpu32 },
4176{"trappll", 6,  one(0055373),   one(0177777), "#l", m68020up|cpu32 },
4177{"traptl", 6,   one(0050373),   one(0177777), "#l", m68020up|cpu32 },
4178{"trapvcl", 6,  one(0054373),   one(0177777), "#l", m68020up|cpu32 },
4179{"trapvsl", 6,  one(0054773),   one(0177777), "#l", m68020up|cpu32 },
4180
4181{"trapv", 2,    one(0047166),   one(0177777), "", m68000up },
4182
4183{"tstb", 2,     one(0045000),   one(0177700), ";b", m68020up|cpu32|mcfisa_a },
4184{"tstb", 2,     one(0045000),   one(0177700), "$b", m68000up },
4185{"tstw", 2,     one(0045100),   one(0177700), "*w", m68020up|cpu32|mcfisa_a },
4186{"tstw", 2,     one(0045100),   one(0177700), "$w", m68000up },
4187{"tstl", 2,     one(0045200),   one(0177700), "*l", m68020up|cpu32|mcfisa_a },
4188{"tstl", 2,     one(0045200),   one(0177700), "$l", m68000up },
4189
4190{"unlk", 2,     one(0047130),   one(0177770), "As", m68000up | mcfisa_a },
4191
4192{"unpk", 4,     one(0100600),   one(0170770), "DsDd#w", m68020up },
4193{"unpk", 4,     one(0100610),   one(0170770), "-s-d#w", m68020up },
4194
4195{"wddatab", 2,  one(0175400),   one(0177700), "~s", mcfisa_a },
4196{"wddataw", 2,  one(0175500),   one(0177700), "~s", mcfisa_a },
4197{"wddatal", 2,  one(0175600),   one(0177700), "~s", mcfisa_a },
4198
4199{"wdebug", 4,   two(0175720, 03),       two(0177770, 0xffff), "as", mcfisa_a },
4200{"wdebug", 4,   two(0175750, 03),       two(0177770, 0xffff), "ds", mcfisa_a },
4201};
4202
4203const int m68k_numopcodes = sizeof m68k_opcodes / sizeof m68k_opcodes[0];
4204
4205/* These aliases used to be in the above table, each one duplicating
4206   all of the entries for its primary exactly.  This table was
4207   constructed by mechanical processing of the opcode table, with a
4208   small number of tweaks done by hand.  There are probably a lot more
4209   aliases above that could be moved down here, except for very minor
4210   differences.  */
4211
4212const struct m68k_opcode_alias m68k_opcode_aliases[] =
4213{
4214  { "add",      "addw", },
4215  { "adda",     "addaw", },
4216  { "addi",     "addiw", },
4217  { "addq",     "addqw", },
4218  { "addx",     "addxw", },
4219  { "asl",      "aslw", },
4220  { "asr",      "asrw", },
4221  { "bhi",      "bhiw", },
4222  { "bls",      "blsw", },
4223  { "bcc",      "bccw", },
4224  { "bcs",      "bcsw", },
4225  { "bne",      "bnew", },
4226  { "beq",      "beqw", },
4227  { "bvc",      "bvcw", },
4228  { "bvs",      "bvsw", },
4229  { "bpl",      "bplw", },
4230  { "bmi",      "bmiw", },
4231  { "bge",      "bgew", },
4232  { "blt",      "bltw", },
4233  { "bgt",      "bgtw", },
4234  { "ble",      "blew", },
4235  { "bra",      "braw", },
4236  { "bsr",      "bsrw", },
4237  { "bhib",     "bhis", },
4238  { "blsb",     "blss", },
4239  { "bccb",     "bccs", },
4240  { "bcsb",     "bcss", },
4241  { "bneb",     "bnes", },
4242  { "beqb",     "beqs", },
4243  { "bvcb",     "bvcs", },
4244  { "bvsb",     "bvss", },
4245  { "bplb",     "bpls", },
4246  { "bmib",     "bmis", },
4247  { "bgeb",     "bges", },
4248  { "bltb",     "blts", },
4249  { "bgtb",     "bgts", },
4250  { "bleb",     "bles", },
4251  { "brab",     "bras", },
4252  { "bsrb",     "bsrs", },
4253  { "bhs",      "bccw" },
4254  { "bhss",     "bccs" },
4255  { "bhsb",     "bccs" },
4256  { "bhsw",     "bccw" },
4257  { "bhsl",     "bccl" },
4258  { "blo",      "bcsw" },
4259  { "blos",     "bcss" },
4260  { "blob",     "bcss" },
4261  { "blow",     "bcsw" },
4262  { "blol",     "bcsl" },
4263  { "br",       "braw", },
4264  { "brs",      "bras", },
4265  { "brb",      "bras", },
4266  { "brw",      "braw", },
4267  { "brl",      "bral", },
4268  { "jfnlt",    "bcc", },       /* Apparently a sun alias.  */
4269  { "jfngt",    "ble", },       /* Apparently a sun alias.  */
4270  { "jfeq",     "beqs", },      /* Apparently a sun alias.  */
4271  { "bchgb",    "bchg", },
4272  { "bchgl",    "bchg", },
4273  { "bclrb",    "bclr", },
4274  { "bclrl",    "bclr", },
4275  { "bsetb",    "bset", },
4276  { "bsetl",    "bset", },
4277  { "btstb",    "btst", },
4278  { "btstl",    "btst", },
4279  { "cas2",     "cas2w", },
4280  { "cas",      "casw", },
4281  { "chk2",     "chk2w", },
4282  { "chk",      "chkw", },
4283  { "clr",      "clrw", },
4284  { "cmp2",     "cmp2w", },
4285  { "cmpa",     "cmpaw", },
4286  { "cmpi",     "cmpiw", },
4287  { "cmpm",     "cmpmw", },
4288  { "cmp",      "cmpw", },
4289  { "dbccw",    "dbcc", },
4290  { "dbcsw",    "dbcs", },
4291  { "dbeqw",    "dbeq", },
4292  { "dbfw",     "dbf", },
4293  { "dbgew",    "dbge", },
4294  { "dbgtw",    "dbgt", },
4295  { "dbhiw",    "dbhi", },
4296  { "dblew",    "dble", },
4297  { "dblsw",    "dbls", },
4298  { "dbltw",    "dblt", },
4299  { "dbmiw",    "dbmi", },
4300  { "dbnew",    "dbne", },
4301  { "dbplw",    "dbpl", },
4302  { "dbtw",     "dbt", },
4303  { "dbvcw",    "dbvc", },
4304  { "dbvsw",    "dbvs", },
4305  { "dbhs",     "dbcc", },
4306  { "dbhsw",    "dbcc", },
4307  { "dbra",     "dbf", },
4308  { "dbraw",    "dbf", },
4309  { "tdivsl",   "divsl", },
4310  { "divs",     "divsw", },
4311  { "divu",     "divuw", },
4312  { "ext",      "extw", },
4313  { "extbw",    "extw", },
4314  { "extwl",    "extl", },
4315  { "fbneq",    "fbne", },
4316  { "fbsneq",   "fbsne", },
4317  { "fdbneq",   "fdbne", },
4318  { "fdbsneq",  "fdbsne", },
4319  { "fmovecr",  "fmovecrx", },
4320  { "fmovm",    "fmovem", },
4321  { "fsneq",    "fsne", },
4322  { "fssneq",   "fssne", },
4323  { "ftrapneq", "ftrapne", },
4324  { "ftrapsneq", "ftrapsne", },
4325  { "fjneq",    "fjne", },
4326  { "fjsneq",   "fjsne", },
4327  { "jmpl",     "jmp", },
4328  { "jmps",     "jmp", },
4329  { "jsrl",     "jsr", },
4330  { "jsrs",     "jsr", },
4331  { "leal",     "lea", },
4332  { "lsl",      "lslw", },
4333  { "lsr",      "lsrw", },
4334  { "mac",      "macw" },
4335  { "movea",    "moveaw", },
4336  { "movem",    "movemw", },
4337  { "movml",    "moveml", },
4338  { "movmw",    "movemw", },
4339  { "movm",     "movemw", },
4340  { "movep",    "movepw", },
4341  { "movpw",    "movepw", },
4342  { "moves",    "movesw" },
4343  { "muls",     "mulsw", },
4344  { "mulu",     "muluw", },
4345  { "msac",     "msacw" },
4346  { "nbcdb",    "nbcd" },
4347  { "neg",      "negw", },
4348  { "negx",     "negxw", },
4349  { "not",      "notw", },
4350  { "peal",     "pea", },
4351  { "rol",      "rolw", },
4352  { "ror",      "rorw", },
4353  { "roxl",     "roxlw", },
4354  { "roxr",     "roxrw", },
4355  { "sats",     "satsl", },
4356  { "sbcdb",    "sbcd", },
4357  { "sccb",     "scc", },
4358  { "scsb",     "scs", },
4359  { "seqb",     "seq", },
4360  { "sfb",      "sf", },
4361  { "sgeb",     "sge", },
4362  { "sgtb",     "sgt", },
4363  { "shib",     "shi", },
4364  { "sleb",     "sle", },
4365  { "slsb",     "sls", },
4366  { "sltb",     "slt", },
4367  { "smib",     "smi", },
4368  { "sneb",     "sne", },
4369  { "splb",     "spl", },
4370  { "stb",      "st", },
4371  { "svcb",     "svc", },
4372  { "svsb",     "svs", },
4373  { "sfge",     "sge", },
4374  { "sfgt",     "sgt", },
4375  { "sfle",     "sle", },
4376  { "sflt",     "slt", },
4377  { "sfneq",    "sne", },
4378  { "suba",     "subaw", },
4379  { "subi",     "subiw", },
4380  { "subq",     "subqw", },
4381  { "sub",      "subw", },
4382  { "subx",     "subxw", },
4383  { "swapw",    "swap", },
4384  { "tasb",     "tas", },
4385  { "tpcc",     "trapcc", },
4386  { "tcc",      "trapcc", },
4387  { "tst",      "tstw", },
4388  { "jbra",     "jra", },
4389  { "jbhi",     "jhi", },
4390  { "jbls",     "jls", },
4391  { "jbcc",     "jcc", },
4392  { "jbcs",     "jcs", },
4393  { "jbne",     "jne", },
4394  { "jbeq",     "jeq", },
4395  { "jbvc",     "jvc", },
4396  { "jbvs",     "jvs", },
4397  { "jbpl",     "jpl", },
4398  { "jbmi",     "jmi", },
4399  { "jbge",     "jge", },
4400  { "jblt",     "jlt", },
4401  { "jbgt",     "jgt", },
4402  { "jble",     "jle", },
4403  { "movql",    "moveq", },
4404  { "moveql",   "moveq", },
4405  { "movl",     "movel", },
4406  { "movq",     "moveq", },
4407  { "moval",    "moveal", },
4408  { "movaw",    "moveaw", },
4409  { "movb",     "moveb", },
4410  { "movc",     "movec", },
4411  { "movecl",   "movec", },
4412  { "movpl",    "movepl", },
4413  { "movw",     "movew", },
4414  { "movsb",    "movesb", },
4415  { "movsl",    "movesl", },
4416  { "movsw",    "movesw", },
4417  { "mov3q",    "mov3ql", },
4418
4419  { "tdivul",   "divul", },     /* For m68k-svr4.  */
4420  { "fmovb",    "fmoveb", },
4421  { "fsmovb",   "fsmoveb", },
4422  { "fdmovb",   "fdmoveb", },
4423  { "fmovd",    "fmoved", },
4424  { "fsmovd",   "fsmoved", },
4425  { "fmovl",    "fmovel", },
4426  { "fsmovl",   "fsmovel", },
4427  { "fdmovl",   "fdmovel", },
4428  { "fmovp",    "fmovep", },
4429  { "fsmovp",   "fsmovep", },
4430  { "fdmovp",   "fdmovep", },
4431  { "fmovs",    "fmoves", },
4432  { "fsmovs",   "fsmoves", },
4433  { "fdmovs",   "fdmoves", },
4434  { "fmovw",    "fmovew", },
4435  { "fsmovw",   "fsmovew", },
4436  { "fdmovw",   "fdmovew", },
4437  { "fmovx",    "fmovex", },
4438  { "fsmovx",   "fsmovex", },
4439  { "fdmovx",   "fdmovex", },
4440  { "fmovcr",   "fmovecr", },
4441  { "fmovcrx",  "fmovecrx", },
4442  { "ftestb",   "ftstb", },
4443  { "ftestd",   "ftstd", },
4444  { "ftestl",   "ftstl", },
4445  { "ftestp",   "ftstp", },
4446  { "ftests",   "ftsts", },
4447  { "ftestw",   "ftstw", },
4448  { "ftestx",   "ftstx", },
4449
4450  { "bitrevl",  "bitrev", },
4451  { "byterevl", "byterev", },
4452  { "ff1l",     "ff1", },
4453
4454};
4455
4456const int m68k_numaliases =
4457  sizeof m68k_opcode_aliases / sizeof m68k_opcode_aliases[0];
4458/* **** End of m68k-opc.c */
4459/* **** floatformat.c from sourceware.org CVS 2005-08-14.  */
4460/* IEEE floating point support routines, for GDB, the GNU Debugger.
4461   Copyright (C) 1991, 1994, 1999, 2000, 2003 Free Software Foundation, Inc.
4462
4463This file is part of GDB.
4464
4465This program is free software; you can redistribute it and/or modify
4466it under the terms of the GNU General Public License as published by
4467the Free Software Foundation; either version 2 of the License, or
4468(at your option) any later version.
4469
4470This program is distributed in the hope that it will be useful,
4471but WITHOUT ANY WARRANTY; without even the implied warranty of
4472MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
4473GNU General Public License for more details.
4474
4475You should have received a copy of the GNU General Public License
4476along with this program; if not, see <http://www.gnu.org/licenses/>.  */
4477
4478/* This is needed to pick up the NAN macro on some systems.  */
4479//#define _GNU_SOURCE
4480
4481#ifndef INFINITY
4482#ifdef HUGE_VAL
4483#define INFINITY HUGE_VAL
4484#else
4485#define INFINITY (1.0 / 0.0)
4486#endif
4487#endif
4488
4489#ifndef NAN
4490#define NAN (0.0 / 0.0)
4491#endif
4492
4493static unsigned long get_field (const unsigned char *,
4494                                enum floatformat_byteorders,
4495                                unsigned int,
4496                                unsigned int,
4497                                unsigned int);
4498static int floatformat_always_valid (const struct floatformat *fmt,
4499                                     const char *from);
4500
4501static int
4502floatformat_always_valid (const struct floatformat *fmt ATTRIBUTE_UNUSED,
4503                          const char *from ATTRIBUTE_UNUSED)
4504{
4505  return 1;
4506}
4507
4508/* The odds that CHAR_BIT will be anything but 8 are low enough that I'm not
4509   going to bother with trying to muck around with whether it is defined in
4510   a system header, what we do if not, etc.  */
4511#define FLOATFORMAT_CHAR_BIT 8
4512
4513/* floatformats for IEEE single and double, big and little endian.  */
4514const struct floatformat floatformat_ieee_single_big =
4515{
4516  floatformat_big, 32, 0, 1, 8, 127, 255, 9, 23,
4517  floatformat_intbit_no,
4518  "floatformat_ieee_single_big",
4519  floatformat_always_valid
4520};
4521const struct floatformat floatformat_ieee_single_little =
4522{
4523  floatformat_little, 32, 0, 1, 8, 127, 255, 9, 23,
4524  floatformat_intbit_no,
4525  "floatformat_ieee_single_little",
4526  floatformat_always_valid
4527};
4528const struct floatformat floatformat_ieee_double_big =
4529{
4530  floatformat_big, 64, 0, 1, 11, 1023, 2047, 12, 52,
4531  floatformat_intbit_no,
4532  "floatformat_ieee_double_big",
4533  floatformat_always_valid
4534};
4535const struct floatformat floatformat_ieee_double_little =
4536{
4537  floatformat_little, 64, 0, 1, 11, 1023, 2047, 12, 52,
4538  floatformat_intbit_no,
4539  "floatformat_ieee_double_little",
4540  floatformat_always_valid
4541};
4542
4543/* floatformat for IEEE double, little endian byte order, with big endian word
4544   ordering, as on the ARM.  */
4545
4546const struct floatformat floatformat_ieee_double_littlebyte_bigword =
4547{
4548  floatformat_littlebyte_bigword, 64, 0, 1, 11, 1023, 2047, 12, 52,
4549  floatformat_intbit_no,
4550  "floatformat_ieee_double_littlebyte_bigword",
4551  floatformat_always_valid
4552};
4553
4554static int floatformat_i387_ext_is_valid (const struct floatformat *fmt, const char *from);
4555
4556static int
4557floatformat_i387_ext_is_valid (const struct floatformat *fmt, const char *from)
4558{
4559  /* In the i387 double-extended format, if the exponent is all ones,
4560     then the integer bit must be set.  If the exponent is neither 0
4561     nor ~0, the intbit must also be set.  Only if the exponent is
4562     zero can it be zero, and then it must be zero.  */
4563  unsigned long exponent, int_bit;
4564  const unsigned char *ufrom = (const unsigned char *) from;
4565
4566  exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize,
4567                        fmt->exp_start, fmt->exp_len);
4568  int_bit = get_field (ufrom, fmt->byteorder, fmt->totalsize,
4569                       fmt->man_start, 1);
4570
4571  if ((exponent == 0) != (int_bit == 0))
4572    return 0;
4573  else
4574    return 1;
4575}
4576
4577const struct floatformat floatformat_i387_ext =
4578{
4579  floatformat_little, 80, 0, 1, 15, 0x3fff, 0x7fff, 16, 64,
4580  floatformat_intbit_yes,
4581  "floatformat_i387_ext",
4582  floatformat_i387_ext_is_valid
4583};
4584const struct floatformat floatformat_m68881_ext =
4585{
4586  /* Note that the bits from 16 to 31 are unused.  */
4587  floatformat_big, 96, 0, 1, 15, 0x3fff, 0x7fff, 32, 64,
4588  floatformat_intbit_yes,
4589  "floatformat_m68881_ext",
4590  floatformat_always_valid
4591};
4592const struct floatformat floatformat_i960_ext =
4593{
4594  /* Note that the bits from 0 to 15 are unused.  */
4595  floatformat_little, 96, 16, 17, 15, 0x3fff, 0x7fff, 32, 64,
4596  floatformat_intbit_yes,
4597  "floatformat_i960_ext",
4598  floatformat_always_valid
4599};
4600const struct floatformat floatformat_m88110_ext =
4601{
4602  floatformat_big, 80, 0, 1, 15, 0x3fff, 0x7fff, 16, 64,
4603  floatformat_intbit_yes,
4604  "floatformat_m88110_ext",
4605  floatformat_always_valid
4606};
4607const struct floatformat floatformat_m88110_harris_ext =
4608{
4609  /* Harris uses raw format 128 bytes long, but the number is just an ieee
4610     double, and the last 64 bits are wasted. */
4611  floatformat_big,128, 0, 1, 11,  0x3ff,  0x7ff, 12, 52,
4612  floatformat_intbit_no,
4613  "floatformat_m88110_ext_harris",
4614  floatformat_always_valid
4615};
4616const struct floatformat floatformat_arm_ext_big =
4617{
4618  /* Bits 1 to 16 are unused.  */
4619  floatformat_big, 96, 0, 17, 15, 0x3fff, 0x7fff, 32, 64,
4620  floatformat_intbit_yes,
4621  "floatformat_arm_ext_big",
4622  floatformat_always_valid
4623};
4624const struct floatformat floatformat_arm_ext_littlebyte_bigword =
4625{
4626  /* Bits 1 to 16 are unused.  */
4627  floatformat_littlebyte_bigword, 96, 0, 17, 15, 0x3fff, 0x7fff, 32, 64,
4628  floatformat_intbit_yes,
4629  "floatformat_arm_ext_littlebyte_bigword",
4630  floatformat_always_valid
4631};
4632const struct floatformat floatformat_ia64_spill_big =
4633{
4634  floatformat_big, 128, 0, 1, 17, 65535, 0x1ffff, 18, 64,
4635  floatformat_intbit_yes,
4636  "floatformat_ia64_spill_big",
4637  floatformat_always_valid
4638};
4639const struct floatformat floatformat_ia64_spill_little =
4640{
4641  floatformat_little, 128, 0, 1, 17, 65535, 0x1ffff, 18, 64,
4642  floatformat_intbit_yes,
4643  "floatformat_ia64_spill_little",
4644  floatformat_always_valid
4645};
4646const struct floatformat floatformat_ia64_quad_big =
4647{
4648  floatformat_big, 128, 0, 1, 15, 16383, 0x7fff, 16, 112,
4649  floatformat_intbit_no,
4650  "floatformat_ia64_quad_big",
4651  floatformat_always_valid
4652};
4653const struct floatformat floatformat_ia64_quad_little =
4654{
4655  floatformat_little, 128, 0, 1, 15, 16383, 0x7fff, 16, 112,
4656  floatformat_intbit_no,
4657  "floatformat_ia64_quad_little",
4658  floatformat_always_valid
4659};
4660
4661/* Extract a field which starts at START and is LEN bits long.  DATA and
4662   TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER.  */
4663static unsigned long
4664get_field (const unsigned char *data, enum floatformat_byteorders order,
4665           unsigned int total_len, unsigned int start, unsigned int len)
4666{
4667  unsigned long result;
4668  unsigned int cur_byte;
4669  int cur_bitshift;
4670
4671  /* Start at the least significant part of the field.  */
4672  cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
4673  if (order == floatformat_little)
4674    cur_byte = (total_len / FLOATFORMAT_CHAR_BIT) - cur_byte - 1;
4675  cur_bitshift =
4676    ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
4677  result = *(data + cur_byte) >> (-cur_bitshift);
4678  cur_bitshift += FLOATFORMAT_CHAR_BIT;
4679  if (order == floatformat_little)
4680    ++cur_byte;
4681  else
4682    --cur_byte;
4683
4684  /* Move towards the most significant part of the field.  */
4685  while ((unsigned int) cur_bitshift < len)
4686    {
4687      if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
4688        /* This is the last byte; zero out the bits which are not part of
4689           this field.  */
4690        result |=
4691          (*(data + cur_byte) & ((1 << (len - cur_bitshift)) - 1))
4692            << cur_bitshift;
4693      else
4694        result |= *(data + cur_byte) << cur_bitshift;
4695      cur_bitshift += FLOATFORMAT_CHAR_BIT;
4696      if (order == floatformat_little)
4697        ++cur_byte;
4698      else
4699        --cur_byte;
4700    }
4701  return result;
4702}
4703
4704#ifndef min
4705#define min(a, b) ((a) < (b) ? (a) : (b))
4706#endif
4707
4708/* Convert from FMT to a double.
4709   FROM is the address of the extended float.
4710   Store the double in *TO.  */
4711
4712void
4713floatformat_to_double (const struct floatformat *fmt,
4714                       const char *from, double *to)
4715{
4716  const unsigned char *ufrom = (const unsigned char *)from;
4717  double dto;
4718  long exponent;
4719  unsigned long mant;
4720  unsigned int mant_bits, mant_off;
4721  int mant_bits_left;
4722  int special_exponent;         /* It's a NaN, denorm or zero */
4723
4724  exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize,
4725                        fmt->exp_start, fmt->exp_len);
4726
4727  /* If the exponent indicates a NaN, we don't have information to
4728     decide what to do.  So we handle it like IEEE, except that we
4729     don't try to preserve the type of NaN.  FIXME.  */
4730  if ((unsigned long) exponent == fmt->exp_nan)
4731    {
4732      int nan;
4733
4734      mant_off = fmt->man_start;
4735      mant_bits_left = fmt->man_len;
4736      nan = 0;
4737      while (mant_bits_left > 0)
4738        {
4739          mant_bits = min (mant_bits_left, 32);
4740
4741          if (get_field (ufrom, fmt->byteorder, fmt->totalsize,
4742                         mant_off, mant_bits) != 0)
4743            {
4744              /* This is a NaN.  */
4745              nan = 1;
4746              break;
4747            }
4748
4749          mant_off += mant_bits;
4750          mant_bits_left -= mant_bits;
4751        }
4752
4753      /* On certain systems (such as GNU/Linux), the use of the
4754         INFINITY macro below may generate a warning that can not be
4755         silenced due to a bug in GCC (PR preprocessor/11931).  The
4756         preprocessor fails to recognise the __extension__ keyword in
4757         conjunction with the GNU/C99 extension for hexadecimal
4758         floating point constants and will issue a warning when
4759         compiling with -pedantic.  */
4760      if (nan)
4761        dto = NAN;
4762      else
4763        dto = INFINITY;
4764
4765      if (get_field (ufrom, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1))
4766        dto = -dto;
4767
4768      *to = dto;
4769
4770      return;
4771    }
4772
4773  mant_bits_left = fmt->man_len;
4774  mant_off = fmt->man_start;
4775  dto = 0.0;
4776
4777  special_exponent = exponent == 0 || (unsigned long) exponent == fmt->exp_nan;
4778
4779  /* Don't bias zero's, denorms or NaNs.  */
4780  if (!special_exponent)
4781    exponent -= fmt->exp_bias;
4782
4783  /* Build the result algebraically.  Might go infinite, underflow, etc;
4784     who cares. */
4785
4786  /* If this format uses a hidden bit, explicitly add it in now.  Otherwise,
4787     increment the exponent by one to account for the integer bit.  */
4788
4789  if (!special_exponent)
4790    {
4791      if (fmt->intbit == floatformat_intbit_no)
4792        dto = ldexp (1.0, exponent);
4793      else
4794        exponent++;
4795    }
4796
4797  while (mant_bits_left > 0)
4798    {
4799      mant_bits = min (mant_bits_left, 32);
4800
4801      mant = get_field (ufrom, fmt->byteorder, fmt->totalsize,
4802                         mant_off, mant_bits);
4803
4804      /* Handle denormalized numbers.  FIXME: What should we do for
4805         non-IEEE formats?  */
4806      if (exponent == 0 && mant != 0)
4807        dto += ldexp ((double)mant,
4808                      (- fmt->exp_bias
4809                       - mant_bits
4810                       - (mant_off - fmt->man_start)
4811                       + 1));
4812      else
4813        dto += ldexp ((double)mant, exponent - mant_bits);
4814      if (exponent != 0)
4815        exponent -= mant_bits;
4816      mant_off += mant_bits;
4817      mant_bits_left -= mant_bits;
4818    }
4819
4820  /* Negate it if negative.  */
4821  if (get_field (ufrom, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1))
4822    dto = -dto;
4823  *to = dto;
4824}
4825
4826static void put_field (unsigned char *, enum floatformat_byteorders,
4827                       unsigned int,
4828                       unsigned int,
4829                       unsigned int,
4830                       unsigned long);
4831
4832/* Set a field which starts at START and is LEN bits long.  DATA and
4833   TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER.  */
4834static void
4835put_field (unsigned char *data, enum floatformat_byteorders order,
4836           unsigned int total_len, unsigned int start, unsigned int len,
4837           unsigned long stuff_to_put)
4838{
4839  unsigned int cur_byte;
4840  int cur_bitshift;
4841
4842  /* Start at the least significant part of the field.  */
4843  cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
4844  if (order == floatformat_little)
4845    cur_byte = (total_len / FLOATFORMAT_CHAR_BIT) - cur_byte - 1;
4846  cur_bitshift =
4847    ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
4848  *(data + cur_byte) &=
4849    ~(((1 << ((start + len) % FLOATFORMAT_CHAR_BIT)) - 1) << (-cur_bitshift));
4850  *(data + cur_byte) |=
4851    (stuff_to_put & ((1 << FLOATFORMAT_CHAR_BIT) - 1)) << (-cur_bitshift);
4852  cur_bitshift += FLOATFORMAT_CHAR_BIT;
4853  if (order == floatformat_little)
4854    ++cur_byte;
4855  else
4856    --cur_byte;
4857
4858  /* Move towards the most significant part of the field.  */
4859  while ((unsigned int) cur_bitshift < len)
4860    {
4861      if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
4862        {
4863          /* This is the last byte.  */
4864          *(data + cur_byte) &=
4865            ~((1 << (len - cur_bitshift)) - 1);
4866          *(data + cur_byte) |= (stuff_to_put >> cur_bitshift);
4867        }
4868      else
4869        *(data + cur_byte) = ((stuff_to_put >> cur_bitshift)
4870                              & ((1 << FLOATFORMAT_CHAR_BIT) - 1));
4871      cur_bitshift += FLOATFORMAT_CHAR_BIT;
4872      if (order == floatformat_little)
4873        ++cur_byte;
4874      else
4875        --cur_byte;
4876    }
4877}
4878
4879/* The converse: convert the double *FROM to an extended float
4880   and store where TO points.  Neither FROM nor TO have any alignment
4881   restrictions.  */
4882
4883void
4884floatformat_from_double (const struct floatformat *fmt,
4885                         const double *from, char *to)
4886{
4887  double dfrom;
4888  int exponent;
4889  double mant;
4890  unsigned int mant_bits, mant_off;
4891  int mant_bits_left;
4892  unsigned char *uto = (unsigned char *)to;
4893
4894  dfrom = *from;
4895  memset (uto, 0, fmt->totalsize / FLOATFORMAT_CHAR_BIT);
4896
4897  /* If negative, set the sign bit.  */
4898  if (dfrom < 0)
4899    {
4900      put_field (uto, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1, 1);
4901      dfrom = -dfrom;
4902    }
4903
4904  if (dfrom == 0)
4905    {
4906      /* 0.0.  */
4907      return;
4908    }
4909
4910  if (dfrom != dfrom)
4911    {
4912      /* NaN.  */
4913      put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start,
4914                 fmt->exp_len, fmt->exp_nan);
4915      /* Be sure it's not infinity, but NaN value is irrelevant.  */
4916      put_field (uto, fmt->byteorder, fmt->totalsize, fmt->man_start,
4917                 32, 1);
4918      return;
4919    }
4920
4921  if (dfrom + dfrom == dfrom)
4922    {
4923      /* This can only happen for an infinite value (or zero, which we
4924         already handled above).  */
4925      put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start,
4926                 fmt->exp_len, fmt->exp_nan);
4927      return;
4928    }
4929
4930  mant = frexp (dfrom, &exponent);
4931  if (exponent + fmt->exp_bias - 1 > 0)
4932    put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start,
4933               fmt->exp_len, exponent + fmt->exp_bias - 1);
4934  else
4935    {
4936      /* Handle a denormalized number.  FIXME: What should we do for
4937         non-IEEE formats?  */
4938      put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start,
4939                 fmt->exp_len, 0);
4940      mant = ldexp (mant, exponent + fmt->exp_bias - 1);
4941    }
4942
4943  mant_bits_left = fmt->man_len;
4944  mant_off = fmt->man_start;
4945  while (mant_bits_left > 0)
4946    {
4947      unsigned long mant_long;
4948      mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
4949
4950      mant *= 4294967296.0;
4951      mant_long = (unsigned long)mant;
4952      mant -= mant_long;
4953
4954      /* If the integer bit is implicit, and we are not creating a
4955         denormalized number, then we need to discard it.  */
4956      if ((unsigned int) mant_bits_left == fmt->man_len
4957          && fmt->intbit == floatformat_intbit_no
4958          && exponent + fmt->exp_bias - 1 > 0)
4959        {
4960          mant_long &= 0x7fffffff;
4961          mant_bits -= 1;
4962        }
4963      else if (mant_bits < 32)
4964        {
4965          /* The bits we want are in the most significant MANT_BITS bits of
4966             mant_long.  Move them to the least significant.  */
4967          mant_long >>= 32 - mant_bits;
4968        }
4969
4970      put_field (uto, fmt->byteorder, fmt->totalsize,
4971                 mant_off, mant_bits, mant_long);
4972      mant_off += mant_bits;
4973      mant_bits_left -= mant_bits;
4974    }
4975}
4976
4977/* Return non-zero iff the data at FROM is a valid number in format FMT.  */
4978
4979int
4980floatformat_is_valid (const struct floatformat *fmt, const char *from)
4981{
4982  return fmt->is_valid (fmt, from);
4983}
4984
4985
4986#ifdef IEEE_DEBUG
4987
4988/* This is to be run on a host which uses IEEE floating point.  */
4989
4990void
4991ieee_test (double n)
4992{
4993  double result;
4994
4995  floatformat_to_double (&floatformat_ieee_double_little, (char *) &n,
4996                         &result);
4997  if ((n != result && (! isnan (n) || ! isnan (result)))
4998      || (n < 0 && result >= 0)
4999      || (n >= 0 && result < 0))
5000    printf ("Differ(to): %.20g -> %.20g\n", n, result);
5001
5002  floatformat_from_double (&floatformat_ieee_double_little, &n,
5003                           (char *) &result);
5004  if ((n != result && (! isnan (n) || ! isnan (result)))
5005      || (n < 0 && result >= 0)
5006      || (n >= 0 && result < 0))
5007    printf ("Differ(from): %.20g -> %.20g\n", n, result);
5008
5009#if 0
5010  {
5011    char exten[16];
5012
5013    floatformat_from_double (&floatformat_m68881_ext, &n, exten);
5014    floatformat_to_double (&floatformat_m68881_ext, exten, &result);
5015    if (n != result)
5016      printf ("Differ(to+from): %.20g -> %.20g\n", n, result);
5017  }
5018#endif
5019
5020#if IEEE_DEBUG > 1
5021  /* This is to be run on a host which uses 68881 format.  */
5022  {
5023    long double ex = *(long double *)exten;
5024    if (ex != n)
5025      printf ("Differ(from vs. extended): %.20g\n", n);
5026  }
5027#endif
5028}
5029
5030int
5031main (void)
5032{
5033  ieee_test (0.0);
5034  ieee_test (0.5);
5035  ieee_test (256.0);
5036  ieee_test (0.12345);
5037  ieee_test (234235.78907234);
5038  ieee_test (-512.0);
5039  ieee_test (-0.004321);
5040  ieee_test (1.2E-70);
5041  ieee_test (1.2E-316);
5042  ieee_test (4.9406564584124654E-324);
5043  ieee_test (- 4.9406564584124654E-324);
5044  ieee_test (- 0.0);
5045  ieee_test (- INFINITY);
5046  ieee_test (- NAN);
5047  ieee_test (INFINITY);
5048  ieee_test (NAN);
5049  return 0;
5050}
5051#endif
5052/* **** End of floatformat.c  */
5053