148024e4aSbellard /* This file is composed of several different files from the upstream
248024e4aSbellard sourceware.org CVS. Original file boundaries marked with **** */
348024e4aSbellard
448d4ab25SPeter Maydell #include "qemu/osdep.h"
548024e4aSbellard #include <math.h>
648024e4aSbellard
73979fca4SMarkus Armbruster #include "disas/dis-asm.h"
848024e4aSbellard
91addc7c5Saurel32 /* **** floatformat.h from sourceware.org CVS 2005-08-14. */
1048024e4aSbellard /* IEEE floating point support declarations, for GDB, the GNU Debugger.
1148024e4aSbellard Copyright 1991, 1994, 1995, 1997, 2000, 2003 Free Software Foundation, Inc.
1248024e4aSbellard
1348024e4aSbellard This file is part of GDB.
1448024e4aSbellard
1548024e4aSbellard This program is free software; you can redistribute it and/or modify
1648024e4aSbellard it under the terms of the GNU General Public License as published by
1748024e4aSbellard the Free Software Foundation; either version 2 of the License, or
1848024e4aSbellard (at your option) any later version.
1948024e4aSbellard
2048024e4aSbellard This program is distributed in the hope that it will be useful,
2148024e4aSbellard but WITHOUT ANY WARRANTY; without even the implied warranty of
2248024e4aSbellard MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2348024e4aSbellard GNU General Public License for more details.
2448024e4aSbellard
2548024e4aSbellard You should have received a copy of the GNU General Public License
268167ee88SBlue Swirl along with this program; if not, see <http://www.gnu.org/licenses/>. */
2748024e4aSbellard
2848024e4aSbellard #if !defined (FLOATFORMAT_H)
2948024e4aSbellard #define FLOATFORMAT_H 1
3048024e4aSbellard
3148024e4aSbellard /*#include "ansidecl.h" */
3248024e4aSbellard
3348024e4aSbellard /* A floatformat consists of a sign bit, an exponent and a mantissa. Once the
3448024e4aSbellard bytes are concatenated according to the byteorder flag, then each of those
3548024e4aSbellard fields is contiguous. We number the bits with 0 being the most significant
3648024e4aSbellard (i.e. BITS_BIG_ENDIAN type numbering), and specify which bits each field
3748024e4aSbellard contains with the *_start and *_len fields. */
3848024e4aSbellard
3948024e4aSbellard /* What is the order of the bytes. */
4048024e4aSbellard
4148024e4aSbellard enum floatformat_byteorders {
4248024e4aSbellard
4348024e4aSbellard /* Standard little endian byte order.
4448024e4aSbellard EX: 1.2345678e10 => 00 00 80 c5 e0 fe 06 42 */
4548024e4aSbellard
4648024e4aSbellard floatformat_little,
4748024e4aSbellard
4848024e4aSbellard /* Standard big endian byte order.
4948024e4aSbellard EX: 1.2345678e10 => 42 06 fe e0 c5 80 00 00 */
5048024e4aSbellard
5148024e4aSbellard floatformat_big,
5248024e4aSbellard
5348024e4aSbellard /* Little endian byte order but big endian word order.
5448024e4aSbellard EX: 1.2345678e10 => e0 fe 06 42 00 00 80 c5 */
5548024e4aSbellard
5648024e4aSbellard floatformat_littlebyte_bigword
5748024e4aSbellard
5848024e4aSbellard };
5948024e4aSbellard
6048024e4aSbellard enum floatformat_intbit { floatformat_intbit_yes, floatformat_intbit_no };
6148024e4aSbellard
6248024e4aSbellard struct floatformat
6348024e4aSbellard {
6448024e4aSbellard enum floatformat_byteorders byteorder;
6548024e4aSbellard unsigned int totalsize; /* Total size of number in bits */
6648024e4aSbellard
6748024e4aSbellard /* Sign bit is always one bit long. 1 means negative, 0 means positive. */
6848024e4aSbellard unsigned int sign_start;
6948024e4aSbellard
7048024e4aSbellard unsigned int exp_start;
7148024e4aSbellard unsigned int exp_len;
7248024e4aSbellard /* Bias added to a "true" exponent to form the biased exponent. It
732dbb1308Szhaolichang is intentionally signed as, otherwise, -exp_bias can turn into a
7448024e4aSbellard very large number (e.g., given the exp_bias of 0x3fff and a 64
7548024e4aSbellard bit long, the equation (long)(1 - exp_bias) evaluates to
7648024e4aSbellard 4294950914) instead of -16382). */
7748024e4aSbellard int exp_bias;
7848024e4aSbellard /* Exponent value which indicates NaN. This is the actual value stored in
7948024e4aSbellard the float, not adjusted by the exp_bias. This usually consists of all
8048024e4aSbellard one bits. */
8148024e4aSbellard unsigned int exp_nan;
8248024e4aSbellard
8348024e4aSbellard unsigned int man_start;
8448024e4aSbellard unsigned int man_len;
8548024e4aSbellard
8648024e4aSbellard /* Is the integer bit explicit or implicit? */
8748024e4aSbellard enum floatformat_intbit intbit;
8848024e4aSbellard
8948024e4aSbellard /* Internal name for debugging. */
9048024e4aSbellard const char *name;
9148024e4aSbellard
9248024e4aSbellard /* Validator method. */
9348024e4aSbellard int (*is_valid) (const struct floatformat *fmt, const char *from);
9448024e4aSbellard };
9548024e4aSbellard
9648024e4aSbellard /* floatformats for IEEE single and double, big and little endian. */
9748024e4aSbellard
9848024e4aSbellard extern const struct floatformat floatformat_ieee_single_big;
9948024e4aSbellard extern const struct floatformat floatformat_ieee_single_little;
10048024e4aSbellard extern const struct floatformat floatformat_ieee_double_big;
10148024e4aSbellard extern const struct floatformat floatformat_ieee_double_little;
10248024e4aSbellard
10348024e4aSbellard /* floatformat for ARM IEEE double, little endian bytes and big endian words */
10448024e4aSbellard
10548024e4aSbellard extern const struct floatformat floatformat_ieee_double_littlebyte_bigword;
10648024e4aSbellard
10748024e4aSbellard /* floatformats for various extendeds. */
10848024e4aSbellard
10948024e4aSbellard extern const struct floatformat floatformat_i387_ext;
11048024e4aSbellard extern const struct floatformat floatformat_m68881_ext;
11148024e4aSbellard extern const struct floatformat floatformat_i960_ext;
11248024e4aSbellard extern const struct floatformat floatformat_m88110_ext;
11348024e4aSbellard extern const struct floatformat floatformat_m88110_harris_ext;
11448024e4aSbellard extern const struct floatformat floatformat_arm_ext_big;
11548024e4aSbellard extern const struct floatformat floatformat_arm_ext_littlebyte_bigword;
11648024e4aSbellard /* IA-64 Floating Point register spilt into memory. */
11748024e4aSbellard extern const struct floatformat floatformat_ia64_spill_big;
11848024e4aSbellard extern const struct floatformat floatformat_ia64_spill_little;
11948024e4aSbellard extern const struct floatformat floatformat_ia64_quad_big;
12048024e4aSbellard extern const struct floatformat floatformat_ia64_quad_little;
12148024e4aSbellard
12248024e4aSbellard /* Convert from FMT to a double.
12348024e4aSbellard FROM is the address of the extended float.
12448024e4aSbellard Store the double in *TO. */
12548024e4aSbellard
12648024e4aSbellard extern void
12748024e4aSbellard floatformat_to_double (const struct floatformat *, const char *, double *);
12848024e4aSbellard
12948024e4aSbellard /* The converse: convert the double *FROM to FMT
13048024e4aSbellard and store where TO points. */
13148024e4aSbellard
13248024e4aSbellard extern void
13348024e4aSbellard floatformat_from_double (const struct floatformat *, const double *, char *);
13448024e4aSbellard
13548024e4aSbellard /* Return non-zero iff the data at FROM is a valid number in format FMT. */
13648024e4aSbellard
13748024e4aSbellard extern int
13848024e4aSbellard floatformat_is_valid (const struct floatformat *fmt, const char *from);
13948024e4aSbellard
14048024e4aSbellard #endif /* defined (FLOATFORMAT_H) */
14148024e4aSbellard /* **** End of floatformat.h */
14248024e4aSbellard /* **** m68k-dis.h from sourceware.org CVS 2005-08-14. */
14348024e4aSbellard /* Opcode table header for m680[01234]0/m6888[12]/m68851.
14448024e4aSbellard Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2001,
14548024e4aSbellard 2003, 2004 Free Software Foundation, Inc.
14648024e4aSbellard
14748024e4aSbellard This file is part of GDB, GAS, and the GNU binutils.
14848024e4aSbellard
14948024e4aSbellard GDB, GAS, and the GNU binutils are free software; you can redistribute
15048024e4aSbellard them and/or modify them under the terms of the GNU General Public
15148024e4aSbellard License as published by the Free Software Foundation; either version
15248024e4aSbellard 1, or (at your option) any later version.
15348024e4aSbellard
15448024e4aSbellard GDB, GAS, and the GNU binutils are distributed in the hope that they
15548024e4aSbellard will be useful, but WITHOUT ANY WARRANTY; without even the implied
15648024e4aSbellard warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15748024e4aSbellard the GNU General Public License for more details.
15848024e4aSbellard
15948024e4aSbellard You should have received a copy of the GNU General Public License
1608167ee88SBlue Swirl along with this file; see the file COPYING. If not,
1618167ee88SBlue Swirl see <http://www.gnu.org/licenses/>. */
16248024e4aSbellard
16348024e4aSbellard /* These are used as bit flags for the arch field in the m68k_opcode
16448024e4aSbellard structure. */
16548024e4aSbellard #define _m68k_undef 0
16648024e4aSbellard #define m68000 0x001
16748024e4aSbellard #define m68008 m68000 /* Synonym for -m68000. otherwise unused. */
16848024e4aSbellard #define m68010 0x002
16948024e4aSbellard #define m68020 0x004
17048024e4aSbellard #define m68030 0x008
17148024e4aSbellard #define m68ec030 m68030 /* Similar enough to -m68030 to ignore differences;
17248024e4aSbellard gas will deal with the few differences. */
17348024e4aSbellard #define m68040 0x010
17448024e4aSbellard /* There is no 68050. */
17548024e4aSbellard #define m68060 0x020
17648024e4aSbellard #define m68881 0x040
17748024e4aSbellard #define m68882 m68881 /* Synonym for -m68881. otherwise unused. */
17848024e4aSbellard #define m68851 0x080
17948024e4aSbellard #define cpu32 0x100 /* e.g., 68332 */
18048024e4aSbellard
18148024e4aSbellard #define mcfmac 0x200 /* ColdFire MAC. */
18248024e4aSbellard #define mcfemac 0x400 /* ColdFire EMAC. */
18348024e4aSbellard #define cfloat 0x800 /* ColdFire FPU. */
18448024e4aSbellard #define mcfhwdiv 0x1000 /* ColdFire hardware divide. */
18548024e4aSbellard
18648024e4aSbellard #define mcfisa_a 0x2000 /* ColdFire ISA_A. */
18748024e4aSbellard #define mcfisa_aa 0x4000 /* ColdFire ISA_A+. */
18848024e4aSbellard #define mcfisa_b 0x8000 /* ColdFire ISA_B. */
18948024e4aSbellard #define mcfusp 0x10000 /* ColdFire USP instructions. */
19048024e4aSbellard
19148024e4aSbellard #define mcf5200 0x20000
19248024e4aSbellard #define mcf5206e 0x40000
19348024e4aSbellard #define mcf521x 0x80000
19448024e4aSbellard #define mcf5249 0x100000
19548024e4aSbellard #define mcf528x 0x200000
19648024e4aSbellard #define mcf5307 0x400000
19748024e4aSbellard #define mcf5407 0x800000
19848024e4aSbellard #define mcf5470 0x1000000
19948024e4aSbellard #define mcf5480 0x2000000
20048024e4aSbellard
20148024e4aSbellard /* Handy aliases. */
20248024e4aSbellard #define m68040up (m68040 | m68060)
20348024e4aSbellard #define m68030up (m68030 | m68040up)
20448024e4aSbellard #define m68020up (m68020 | m68030up)
20548024e4aSbellard #define m68010up (m68010 | cpu32 | m68020up)
20648024e4aSbellard #define m68000up (m68000 | m68010up)
20748024e4aSbellard
20848024e4aSbellard #define mfloat (m68881 | m68882 | m68040 | m68060)
20948024e4aSbellard #define mmmu (m68851 | m68030 | m68040 | m68060)
21048024e4aSbellard
21148024e4aSbellard /* The structure used to hold information for an opcode. */
21248024e4aSbellard
21348024e4aSbellard struct m68k_opcode
21448024e4aSbellard {
21548024e4aSbellard /* The opcode name. */
21648024e4aSbellard const char *name;
21748024e4aSbellard /* The pseudo-size of the instruction(in bytes). Used to determine
21848024e4aSbellard number of bytes necessary to disassemble the instruction. */
21948024e4aSbellard unsigned int size;
22048024e4aSbellard /* The opcode itself. */
22148024e4aSbellard unsigned long opcode;
22248024e4aSbellard /* The mask used by the disassembler. */
22348024e4aSbellard unsigned long match;
22448024e4aSbellard /* The arguments. */
22548024e4aSbellard const char *args;
22648024e4aSbellard /* The architectures which support this opcode. */
22748024e4aSbellard unsigned int arch;
22848024e4aSbellard };
22948024e4aSbellard
23048024e4aSbellard /* The structure used to hold information for an opcode alias. */
23148024e4aSbellard
23248024e4aSbellard struct m68k_opcode_alias
23348024e4aSbellard {
23448024e4aSbellard /* The alias name. */
23548024e4aSbellard const char *alias;
23648024e4aSbellard /* The instruction for which this is an alias. */
23748024e4aSbellard const char *primary;
23848024e4aSbellard };
23948024e4aSbellard
24048024e4aSbellard /* We store four bytes of opcode for all opcodes because that is the
24148024e4aSbellard most any of them need. The actual length of an instruction is
24248024e4aSbellard always at least 2 bytes, and is as much longer as necessary to hold
24348024e4aSbellard the operands it has.
24448024e4aSbellard
24548024e4aSbellard The match field is a mask saying which bits must match particular
24648024e4aSbellard opcode in order for an instruction to be an instance of that
24748024e4aSbellard opcode.
24848024e4aSbellard
24948024e4aSbellard The args field is a string containing two characters for each
25048024e4aSbellard operand of the instruction. The first specifies the kind of
25148024e4aSbellard operand; the second, the place it is stored. */
25248024e4aSbellard
25348024e4aSbellard /* Kinds of operands:
25448024e4aSbellard Characters used: AaBbCcDdEeFfGgHIiJkLlMmnOopQqRrSsTtU VvWwXxYyZz01234|*~%;@!&$?/<>#^+-
25548024e4aSbellard
25648024e4aSbellard D data register only. Stored as 3 bits.
25748024e4aSbellard A address register only. Stored as 3 bits.
25848024e4aSbellard a address register indirect only. Stored as 3 bits.
25948024e4aSbellard R either kind of register. Stored as 4 bits.
26048024e4aSbellard r either kind of register indirect only. Stored as 4 bits.
26148024e4aSbellard At the moment, used only for cas2 instruction.
26248024e4aSbellard F floating point coprocessor register only. Stored as 3 bits.
26348024e4aSbellard O an offset (or width): immediate data 0-31 or data register.
26448024e4aSbellard Stored as 6 bits in special format for BF... insns.
26548024e4aSbellard + autoincrement only. Stored as 3 bits (number of the address register).
26648024e4aSbellard - autodecrement only. Stored as 3 bits (number of the address register).
26748024e4aSbellard Q quick immediate data. Stored as 3 bits.
26848024e4aSbellard This matches an immediate operand only when value is in range 1 .. 8.
26948024e4aSbellard M moveq immediate data. Stored as 8 bits.
27048024e4aSbellard This matches an immediate operand only when value is in range -128..127
27148024e4aSbellard T trap vector immediate data. Stored as 4 bits.
27248024e4aSbellard
27348024e4aSbellard k K-factor for fmove.p instruction. Stored as a 7-bit constant or
27448024e4aSbellard a three bit register offset, depending on the field type.
27548024e4aSbellard
27648024e4aSbellard # immediate data. Stored in special places (b, w or l)
27748024e4aSbellard which say how many bits to store.
27848024e4aSbellard ^ immediate data for floating point instructions. Special places
27948024e4aSbellard are offset by 2 bytes from '#'...
28048024e4aSbellard B pc-relative address, converted to an offset
28148024e4aSbellard that is treated as immediate data.
28248024e4aSbellard d displacement and register. Stores the register as 3 bits
28348024e4aSbellard and stores the displacement in the entire second word.
28448024e4aSbellard
28548024e4aSbellard C the CCR. No need to store it; this is just for filtering validity.
28648024e4aSbellard S the SR. No need to store, just as with CCR.
28748024e4aSbellard U the USP. No need to store, just as with CCR.
28848024e4aSbellard E the MAC ACC. No need to store, just as with CCR.
28948024e4aSbellard e the EMAC ACC[0123].
29048024e4aSbellard G the MAC/EMAC MACSR. No need to store, just as with CCR.
29148024e4aSbellard g the EMAC ACCEXT{01,23}.
29248024e4aSbellard H the MASK. No need to store, just as with CCR.
29348024e4aSbellard i the MAC/EMAC scale factor.
29448024e4aSbellard
29548024e4aSbellard I Coprocessor ID. Not printed if 1. The Coprocessor ID is always
29648024e4aSbellard extracted from the 'd' field of word one, which means that an extended
29748024e4aSbellard coprocessor opcode can be skipped using the 'i' place, if needed.
29848024e4aSbellard
29948024e4aSbellard s System Control register for the floating point coprocessor.
30048024e4aSbellard
30148024e4aSbellard J Misc register for movec instruction, stored in 'j' format.
30248024e4aSbellard Possible values:
30348024e4aSbellard 0x000 SFC Source Function Code reg [60, 40, 30, 20, 10]
30448024e4aSbellard 0x001 DFC Data Function Code reg [60, 40, 30, 20, 10]
30548024e4aSbellard 0x002 CACR Cache Control Register [60, 40, 30, 20, mcf]
30648024e4aSbellard 0x003 TC MMU Translation Control [60, 40]
30748024e4aSbellard 0x004 ITT0 Instruction Transparent
30848024e4aSbellard Translation reg 0 [60, 40]
30948024e4aSbellard 0x005 ITT1 Instruction Transparent
31048024e4aSbellard Translation reg 1 [60, 40]
31148024e4aSbellard 0x006 DTT0 Data Transparent
31248024e4aSbellard Translation reg 0 [60, 40]
31348024e4aSbellard 0x007 DTT1 Data Transparent
31448024e4aSbellard Translation reg 1 [60, 40]
31548024e4aSbellard 0x008 BUSCR Bus Control Register [60]
31648024e4aSbellard 0x800 USP User Stack Pointer [60, 40, 30, 20, 10]
31748024e4aSbellard 0x801 VBR Vector Base reg [60, 40, 30, 20, 10, mcf]
31848024e4aSbellard 0x802 CAAR Cache Address Register [ 30, 20]
31948024e4aSbellard 0x803 MSP Master Stack Pointer [ 40, 30, 20]
32048024e4aSbellard 0x804 ISP Interrupt Stack Pointer [ 40, 30, 20]
32148024e4aSbellard 0x805 MMUSR MMU Status reg [ 40]
32248024e4aSbellard 0x806 URP User Root Pointer [60, 40]
32348024e4aSbellard 0x807 SRP Supervisor Root Pointer [60, 40]
32448024e4aSbellard 0x808 PCR Processor Configuration reg [60]
32548024e4aSbellard 0xC00 ROMBAR ROM Base Address Register [520X]
32648024e4aSbellard 0xC04 RAMBAR0 RAM Base Address Register 0 [520X]
32748024e4aSbellard 0xC05 RAMBAR1 RAM Base Address Register 0 [520X]
32848024e4aSbellard 0xC0F MBAR0 RAM Base Address Register 0 [520X]
32948024e4aSbellard 0xC04 FLASHBAR FLASH Base Address Register [mcf528x]
33048024e4aSbellard 0xC05 RAMBAR Static RAM Base Address Register [mcf528x]
33148024e4aSbellard
33248024e4aSbellard L Register list of the type d0-d7/a0-a7 etc.
33348024e4aSbellard (New! Improved! Can also hold fp0-fp7, as well!)
33448024e4aSbellard The assembler tries to see if the registers match the insn by
33548024e4aSbellard looking at where the insn wants them stored.
33648024e4aSbellard
33748024e4aSbellard l Register list like L, but with all the bits reversed.
33848024e4aSbellard Used for going the other way. . .
33948024e4aSbellard
34048024e4aSbellard c cache identifier which may be "nc" for no cache, "ic"
34148024e4aSbellard for instruction cache, "dc" for data cache, or "bc"
34248024e4aSbellard for both caches. Used in cinv and cpush. Always
34348024e4aSbellard stored in position "d".
34448024e4aSbellard
34548024e4aSbellard u Any register, with ``upper'' or ``lower'' specification. Used
34648024e4aSbellard in the mac instructions with size word.
34748024e4aSbellard
34848024e4aSbellard The remainder are all stored as 6 bits using an address mode and a
34948024e4aSbellard register number; they differ in which addressing modes they match.
35048024e4aSbellard
35148024e4aSbellard * all (modes 0-6,7.0-4)
35248024e4aSbellard ~ alterable memory (modes 2-6,7.0,7.1)
35348024e4aSbellard (not 0,1,7.2-4)
35448024e4aSbellard % alterable (modes 0-6,7.0,7.1)
35548024e4aSbellard (not 7.2-4)
35648024e4aSbellard ; data (modes 0,2-6,7.0-4)
35748024e4aSbellard (not 1)
35848024e4aSbellard @ data, but not immediate (modes 0,2-6,7.0-3)
35948024e4aSbellard (not 1,7.4)
36048024e4aSbellard ! control (modes 2,5,6,7.0-3)
36148024e4aSbellard (not 0,1,3,4,7.4)
36248024e4aSbellard & alterable control (modes 2,5,6,7.0,7.1)
36348024e4aSbellard (not 0,1,3,4,7.2-4)
36448024e4aSbellard $ alterable data (modes 0,2-6,7.0,7.1)
36548024e4aSbellard (not 1,7.2-4)
36648024e4aSbellard ? alterable control, or data register (modes 0,2,5,6,7.0,7.1)
36748024e4aSbellard (not 1,3,4,7.2-4)
36848024e4aSbellard / control, or data register (modes 0,2,5,6,7.0-3)
36948024e4aSbellard (not 1,3,4,7.4)
37048024e4aSbellard > *save operands (modes 2,4,5,6,7.0,7.1)
37148024e4aSbellard (not 0,1,3,7.2-4)
37248024e4aSbellard < *restore operands (modes 2,3,5,6,7.0-3)
37348024e4aSbellard (not 0,1,4,7.4)
37448024e4aSbellard
37548024e4aSbellard coldfire move operands:
37648024e4aSbellard m (modes 0-4)
37748024e4aSbellard n (modes 5,7.2)
37848024e4aSbellard o (modes 6,7.0,7.1,7.3,7.4)
37948024e4aSbellard p (modes 0-5)
38048024e4aSbellard
38148024e4aSbellard coldfire bset/bclr/btst/mulsl/mulul operands:
38248024e4aSbellard q (modes 0,2-5)
38348024e4aSbellard v (modes 0,2-5,7.0,7.1)
38448024e4aSbellard b (modes 0,2-5,7.2)
38548024e4aSbellard w (modes 2-5,7.2)
38648024e4aSbellard y (modes 2,5)
38748024e4aSbellard z (modes 2,5,7.2)
38848024e4aSbellard x mov3q immediate operand.
38948024e4aSbellard 4 (modes 2,3,4,5)
39048024e4aSbellard */
39148024e4aSbellard
39248024e4aSbellard /* For the 68851: */
39348024e4aSbellard /* I didn't use much imagination in choosing the
39448024e4aSbellard following codes, so many of them aren't very
39548024e4aSbellard mnemonic. -rab
39648024e4aSbellard
39748024e4aSbellard 0 32 bit pmmu register
39848024e4aSbellard Possible values:
39948024e4aSbellard 000 TC Translation Control Register (68030, 68851)
40048024e4aSbellard
40148024e4aSbellard 1 16 bit pmmu register
40248024e4aSbellard 111 AC Access Control (68851)
40348024e4aSbellard
40448024e4aSbellard 2 8 bit pmmu register
40548024e4aSbellard 100 CAL Current Access Level (68851)
40648024e4aSbellard 101 VAL Validate Access Level (68851)
40748024e4aSbellard 110 SCC Stack Change Control (68851)
40848024e4aSbellard
40948024e4aSbellard 3 68030-only pmmu registers (32 bit)
41048024e4aSbellard 010 TT0 Transparent Translation reg 0
41148024e4aSbellard (aka Access Control reg 0 -- AC0 -- on 68ec030)
41248024e4aSbellard 011 TT1 Transparent Translation reg 1
41348024e4aSbellard (aka Access Control reg 1 -- AC1 -- on 68ec030)
41448024e4aSbellard
41548024e4aSbellard W wide pmmu registers
41648024e4aSbellard Possible values:
41748024e4aSbellard 001 DRP Dma Root Pointer (68851)
41848024e4aSbellard 010 SRP Supervisor Root Pointer (68030, 68851)
41948024e4aSbellard 011 CRP Cpu Root Pointer (68030, 68851)
42048024e4aSbellard
42148024e4aSbellard f function code register (68030, 68851)
42248024e4aSbellard 0 SFC
42348024e4aSbellard 1 DFC
42448024e4aSbellard
42548024e4aSbellard V VAL register only (68851)
42648024e4aSbellard
42748024e4aSbellard X BADx, BACx (16 bit)
42848024e4aSbellard 100 BAD Breakpoint Acknowledge Data (68851)
42948024e4aSbellard 101 BAC Breakpoint Acknowledge Control (68851)
43048024e4aSbellard
43148024e4aSbellard Y PSR (68851) (MMUSR on 68030) (ACUSR on 68ec030)
43248024e4aSbellard Z PCSR (68851)
43348024e4aSbellard
43448024e4aSbellard | memory (modes 2-6, 7.*)
43548024e4aSbellard
43648024e4aSbellard t address test level (68030 only)
43748024e4aSbellard Stored as 3 bits, range 0-7.
43848024e4aSbellard Also used for breakpoint instruction now.
43948024e4aSbellard
44048024e4aSbellard */
44148024e4aSbellard
44248024e4aSbellard /* Places to put an operand, for non-general operands:
44348024e4aSbellard Characters used: BbCcDdFfGgHhIijkLlMmNnostWw123456789/
44448024e4aSbellard
44548024e4aSbellard s source, low bits of first word.
44648024e4aSbellard d dest, shifted 9 in first word
44748024e4aSbellard 1 second word, shifted 12
44848024e4aSbellard 2 second word, shifted 6
44948024e4aSbellard 3 second word, shifted 0
45048024e4aSbellard 4 third word, shifted 12
45148024e4aSbellard 5 third word, shifted 6
45248024e4aSbellard 6 third word, shifted 0
45348024e4aSbellard 7 second word, shifted 7
45448024e4aSbellard 8 second word, shifted 10
45548024e4aSbellard 9 second word, shifted 5
45648024e4aSbellard D store in both place 1 and place 3; for divul and divsl.
45748024e4aSbellard B first word, low byte, for branch displacements
45848024e4aSbellard W second word (entire), for branch displacements
45948024e4aSbellard L second and third words (entire), for branch displacements
46048024e4aSbellard (also overloaded for move16)
46148024e4aSbellard b second word, low byte
46248024e4aSbellard w second word (entire) [variable word/long branch offset for dbra]
46348024e4aSbellard W second word (entire) (must be signed 16 bit value)
46448024e4aSbellard l second and third word (entire)
46548024e4aSbellard g variable branch offset for bra and similar instructions.
46648024e4aSbellard The place to store depends on the magnitude of offset.
46748024e4aSbellard t store in both place 7 and place 8; for floating point operations
46848024e4aSbellard c branch offset for cpBcc operations.
46948024e4aSbellard The place to store is word two if bit six of word one is zero,
47048024e4aSbellard and words two and three if bit six of word one is one.
47148024e4aSbellard i Increment by two, to skip over coprocessor extended operands. Only
47248024e4aSbellard works with the 'I' format.
47348024e4aSbellard k Dynamic K-factor field. Bits 6-4 of word 2, used as a register number.
47448024e4aSbellard Also used for dynamic fmovem instruction.
47548024e4aSbellard C floating point coprocessor constant - 7 bits. Also used for static
47648024e4aSbellard K-factors...
47748024e4aSbellard j Movec register #, stored in 12 low bits of second word.
47848024e4aSbellard m For M[S]ACx; 4 bits split with MSB shifted 6 bits in first word
47948024e4aSbellard and remaining 3 bits of register shifted 9 bits in first word.
48048024e4aSbellard Indicate upper/lower in 1 bit shifted 7 bits in second word.
48148024e4aSbellard Use with `R' or `u' format.
4822dbb1308Szhaolichang n `m' without upper/lower indication. (For M[S]ACx; 4 bits split
48348024e4aSbellard with MSB shifted 6 bits in first word and remaining 3 bits of
48448024e4aSbellard register shifted 9 bits in first word. No upper/lower
48548024e4aSbellard indication is done.) Use with `R' or `u' format.
48648024e4aSbellard o For M[S]ACw; 4 bits shifted 12 in second word (like `1').
48748024e4aSbellard Indicate upper/lower in 1 bit shifted 7 bits in second word.
48848024e4aSbellard Use with `R' or `u' format.
48948024e4aSbellard M For M[S]ACw; 4 bits in low bits of first word. Indicate
49048024e4aSbellard upper/lower in 1 bit shifted 6 bits in second word. Use with
49148024e4aSbellard `R' or `u' format.
49248024e4aSbellard N For M[S]ACw; 4 bits in low bits of second word. Indicate
49348024e4aSbellard upper/lower in 1 bit shifted 6 bits in second word. Use with
49448024e4aSbellard `R' or `u' format.
49548024e4aSbellard h shift indicator (scale factor), 1 bit shifted 10 in second word
49648024e4aSbellard
49748024e4aSbellard Places to put operand, for general operands:
49848024e4aSbellard d destination, shifted 6 bits in first word
49948024e4aSbellard b source, at low bit of first word, and immediate uses one byte
50048024e4aSbellard w source, at low bit of first word, and immediate uses two bytes
50148024e4aSbellard l source, at low bit of first word, and immediate uses four bytes
50248024e4aSbellard s source, at low bit of first word.
50348024e4aSbellard Used sometimes in contexts where immediate is not allowed anyway.
50448024e4aSbellard f single precision float, low bit of 1st word, immediate uses 4 bytes
50548024e4aSbellard F double precision float, low bit of 1st word, immediate uses 8 bytes
50648024e4aSbellard x extended precision float, low bit of 1st word, immediate uses 12 bytes
50748024e4aSbellard p packed float, low bit of 1st word, immediate uses 12 bytes
50848024e4aSbellard G EMAC accumulator, load (bit 4 2nd word, !bit8 first word)
50948024e4aSbellard H EMAC accumulator, non load (bit 4 2nd word, bit 8 first word)
51048024e4aSbellard F EMAC ACCx
51148024e4aSbellard f EMAC ACCy
51248024e4aSbellard I MAC/EMAC scale factor
51348024e4aSbellard / Like 's', but set 2nd word, bit 5 if trailing_ampersand set
51448024e4aSbellard ] first word, bit 10
51548024e4aSbellard */
51648024e4aSbellard
51748024e4aSbellard extern const struct m68k_opcode m68k_opcodes[];
51848024e4aSbellard extern const struct m68k_opcode_alias m68k_opcode_aliases[];
51948024e4aSbellard
52048024e4aSbellard extern const int m68k_numopcodes, m68k_numaliases;
52148024e4aSbellard
52248024e4aSbellard /* **** End of m68k-opcode.h */
52348024e4aSbellard /* **** m68k-dis.c from sourceware.org CVS 2005-08-14. */
52448024e4aSbellard /* Print Motorola 68k instructions.
52548024e4aSbellard Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
52648024e4aSbellard 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
52748024e4aSbellard Free Software Foundation, Inc.
52848024e4aSbellard
52948024e4aSbellard This file is free software; you can redistribute it and/or modify
53048024e4aSbellard it under the terms of the GNU General Public License as published by
53148024e4aSbellard the Free Software Foundation; either version 2 of the License, or
53248024e4aSbellard (at your option) any later version.
53348024e4aSbellard
53448024e4aSbellard This program is distributed in the hope that it will be useful,
53548024e4aSbellard but WITHOUT ANY WARRANTY; without even the implied warranty of
53648024e4aSbellard MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
53748024e4aSbellard GNU General Public License for more details.
53848024e4aSbellard
53948024e4aSbellard You should have received a copy of the GNU General Public License
5408167ee88SBlue Swirl along with this program; if not, see <http://www.gnu.org/licenses/>. */
54148024e4aSbellard
54248024e4aSbellard /* Local function prototypes. */
54348024e4aSbellard
5447ccfb2ebSblueswir1 static const char * const fpcr_names[] =
54548024e4aSbellard {
54648024e4aSbellard "", "%fpiar", "%fpsr", "%fpiar/%fpsr", "%fpcr",
54748024e4aSbellard "%fpiar/%fpcr", "%fpsr/%fpcr", "%fpiar/%fpsr/%fpcr"
54848024e4aSbellard };
54948024e4aSbellard
5507ccfb2ebSblueswir1 static const char *const reg_names[] =
55148024e4aSbellard {
55248024e4aSbellard "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
55348024e4aSbellard "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp",
55448024e4aSbellard "%ps", "%pc"
55548024e4aSbellard };
55648024e4aSbellard
55748024e4aSbellard /* Name of register halves for MAC/EMAC.
558aa1f17c1Sths Separate from reg_names since 'spu', 'fpl' look weird. */
5597ccfb2ebSblueswir1 static const char *const reg_half_names[] =
56048024e4aSbellard {
56148024e4aSbellard "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
56248024e4aSbellard "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7",
56348024e4aSbellard "%ps", "%pc"
56448024e4aSbellard };
56548024e4aSbellard
56648024e4aSbellard /* Sign-extend an (unsigned char). */
56748024e4aSbellard #if __STDC__ == 1
56848024e4aSbellard #define COERCE_SIGNED_CHAR(ch) ((signed char) (ch))
56948024e4aSbellard #else
57048024e4aSbellard #define COERCE_SIGNED_CHAR(ch) ((int) (((ch) ^ 0x80) & 0xFF) - 128)
57148024e4aSbellard #endif
57248024e4aSbellard
57348024e4aSbellard /* Get a 1 byte signed integer. */
57467774a04SBlue Swirl #define NEXTBYTE(p) (p += 2, fetch_data(info, p), COERCE_SIGNED_CHAR(p[-1]))
57548024e4aSbellard
57648024e4aSbellard /* Get a 2 byte signed integer. */
57748024e4aSbellard #define COERCE16(x) ((int) (((x) ^ 0x8000) - 0x8000))
57848024e4aSbellard #define NEXTWORD(p) \
57967774a04SBlue Swirl (p += 2, fetch_data(info, p), \
58048024e4aSbellard COERCE16 ((p[-2] << 8) + p[-1]))
58148024e4aSbellard
58248024e4aSbellard /* Get a 4 byte signed integer. */
58348024e4aSbellard #define COERCE32(x) ((bfd_signed_vma) ((x) ^ 0x80000000) - 0x80000000)
58448024e4aSbellard #define NEXTLONG(p) \
58567774a04SBlue Swirl (p += 4, fetch_data(info, p), \
58648024e4aSbellard (COERCE32 ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1])))
58748024e4aSbellard
58848024e4aSbellard /* Get a 4 byte unsigned integer. */
58948024e4aSbellard #define NEXTULONG(p) \
59067774a04SBlue Swirl (p += 4, fetch_data(info, p), \
59148024e4aSbellard (unsigned int) ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]))
59248024e4aSbellard
59348024e4aSbellard /* Get a single precision float. */
59448024e4aSbellard #define NEXTSINGLE(val, p) \
59567774a04SBlue Swirl (p += 4, fetch_data(info, p), \
59648024e4aSbellard floatformat_to_double (&floatformat_ieee_single_big, (char *) p - 4, &val))
59748024e4aSbellard
59848024e4aSbellard /* Get a double precision float. */
59948024e4aSbellard #define NEXTDOUBLE(val, p) \
60067774a04SBlue Swirl (p += 8, fetch_data(info, p), \
60148024e4aSbellard floatformat_to_double (&floatformat_ieee_double_big, (char *) p - 8, &val))
60248024e4aSbellard
60348024e4aSbellard /* Get an extended precision float. */
60448024e4aSbellard #define NEXTEXTEND(val, p) \
60567774a04SBlue Swirl (p += 12, fetch_data(info, p), \
60648024e4aSbellard floatformat_to_double (&floatformat_m68881_ext, (char *) p - 12, &val))
60748024e4aSbellard
60848024e4aSbellard /* Need a function to convert from packed to double
60948024e4aSbellard precision. Actually, it's easier to print a
61048024e4aSbellard packed number than a double anyway, so maybe
61148024e4aSbellard there should be a special case to handle this... */
61248024e4aSbellard #define NEXTPACKED(p) \
61367774a04SBlue Swirl (p += 12, fetch_data(info, p), 0.0)
61448024e4aSbellard
61548024e4aSbellard /* Maximum length of an instruction. */
61648024e4aSbellard #define MAXLEN 22
61748024e4aSbellard
61848024e4aSbellard struct private
61948024e4aSbellard {
62048024e4aSbellard /* Points to first byte not fetched. */
62148024e4aSbellard bfd_byte *max_fetched;
62248024e4aSbellard bfd_byte the_buffer[MAXLEN];
62348024e4aSbellard bfd_vma insn_start;
6246ab7e546SPeter Maydell sigjmp_buf bailout;
62548024e4aSbellard };
62648024e4aSbellard
62748024e4aSbellard /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
62848024e4aSbellard to ADDR (exclusive) are valid. Returns 1 for success, longjmps
62948024e4aSbellard on error. */
63048024e4aSbellard static int
fetch_data2(struct disassemble_info * info,bfd_byte * addr)63167774a04SBlue Swirl fetch_data2(struct disassemble_info *info, bfd_byte *addr)
63248024e4aSbellard {
63348024e4aSbellard int status;
63448024e4aSbellard struct private *priv = (struct private *)info->private_data;
63548024e4aSbellard bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
63648024e4aSbellard
63748024e4aSbellard status = (*info->read_memory_func) (start,
63848024e4aSbellard priv->max_fetched,
63948024e4aSbellard addr - priv->max_fetched,
64048024e4aSbellard info);
64148024e4aSbellard if (status != 0)
64248024e4aSbellard {
64348024e4aSbellard (*info->memory_error_func) (status, start, info);
6446ab7e546SPeter Maydell siglongjmp(priv->bailout, 1);
64548024e4aSbellard }
64648024e4aSbellard else
64748024e4aSbellard priv->max_fetched = addr;
64848024e4aSbellard return 1;
64948024e4aSbellard }
65067774a04SBlue Swirl
65167774a04SBlue Swirl static int
fetch_data(struct disassemble_info * info,bfd_byte * addr)65267774a04SBlue Swirl fetch_data(struct disassemble_info *info, bfd_byte *addr)
65367774a04SBlue Swirl {
65467774a04SBlue Swirl if (addr <= ((struct private *) (info->private_data))->max_fetched) {
65567774a04SBlue Swirl return 1;
65667774a04SBlue Swirl } else {
65767774a04SBlue Swirl return fetch_data2(info, addr);
65867774a04SBlue Swirl }
65967774a04SBlue Swirl }
66067774a04SBlue Swirl
66148024e4aSbellard /* This function is used to print to the bit-bucket. */
66248024e4aSbellard static int
dummy_printer(FILE * file ATTRIBUTE_UNUSED,const char * format ATTRIBUTE_UNUSED,...)66348024e4aSbellard dummy_printer (FILE *file ATTRIBUTE_UNUSED,
66448024e4aSbellard const char *format ATTRIBUTE_UNUSED,
66548024e4aSbellard ...)
66648024e4aSbellard {
66748024e4aSbellard return 0;
66848024e4aSbellard }
66948024e4aSbellard
67048024e4aSbellard static void
dummy_print_address(bfd_vma vma ATTRIBUTE_UNUSED,struct disassemble_info * info ATTRIBUTE_UNUSED)67148024e4aSbellard dummy_print_address (bfd_vma vma ATTRIBUTE_UNUSED,
67248024e4aSbellard struct disassemble_info *info ATTRIBUTE_UNUSED)
67348024e4aSbellard {
67448024e4aSbellard }
67548024e4aSbellard
67648024e4aSbellard /* Fetch BITS bits from a position in the instruction specified by CODE.
67748024e4aSbellard CODE is a "place to put an argument", or 'x' for a destination
67848024e4aSbellard that is a general address (mode and register).
67948024e4aSbellard BUFFER contains the instruction. */
68048024e4aSbellard
68148024e4aSbellard static int
fetch_arg(unsigned char * buffer,int code,int bits,disassemble_info * info)68248024e4aSbellard fetch_arg (unsigned char *buffer,
68348024e4aSbellard int code,
68448024e4aSbellard int bits,
68548024e4aSbellard disassemble_info *info)
68648024e4aSbellard {
68748024e4aSbellard int val = 0;
68848024e4aSbellard
68948024e4aSbellard switch (code)
69048024e4aSbellard {
69148024e4aSbellard case '/': /* MAC/EMAC mask bit. */
69248024e4aSbellard val = buffer[3] >> 5;
69348024e4aSbellard break;
69448024e4aSbellard
69548024e4aSbellard case 'G': /* EMAC ACC load. */
69648024e4aSbellard val = ((buffer[3] >> 3) & 0x2) | ((~buffer[1] >> 7) & 0x1);
69748024e4aSbellard break;
69848024e4aSbellard
69948024e4aSbellard case 'H': /* EMAC ACC !load. */
70048024e4aSbellard val = ((buffer[3] >> 3) & 0x2) | ((buffer[1] >> 7) & 0x1);
70148024e4aSbellard break;
70248024e4aSbellard
70348024e4aSbellard case ']': /* EMAC ACCEXT bit. */
70448024e4aSbellard val = buffer[0] >> 2;
70548024e4aSbellard break;
70648024e4aSbellard
70748024e4aSbellard case 'I': /* MAC/EMAC scale factor. */
70848024e4aSbellard val = buffer[2] >> 1;
70948024e4aSbellard break;
71048024e4aSbellard
71148024e4aSbellard case 'F': /* EMAC ACCx. */
71248024e4aSbellard val = buffer[0] >> 1;
71348024e4aSbellard break;
71448024e4aSbellard
71548024e4aSbellard case 'f':
71648024e4aSbellard val = buffer[1];
71748024e4aSbellard break;
71848024e4aSbellard
71948024e4aSbellard case 's':
72048024e4aSbellard val = buffer[1];
72148024e4aSbellard break;
72248024e4aSbellard
72348024e4aSbellard case 'd': /* Destination, for register or quick. */
72448024e4aSbellard val = (buffer[0] << 8) + buffer[1];
72548024e4aSbellard val >>= 9;
72648024e4aSbellard break;
72748024e4aSbellard
72848024e4aSbellard case 'x': /* Destination, for general arg. */
72948024e4aSbellard val = (buffer[0] << 8) + buffer[1];
73048024e4aSbellard val >>= 6;
73148024e4aSbellard break;
73248024e4aSbellard
73348024e4aSbellard case 'k':
73467774a04SBlue Swirl fetch_data(info, buffer + 3);
73548024e4aSbellard val = (buffer[3] >> 4);
73648024e4aSbellard break;
73748024e4aSbellard
73848024e4aSbellard case 'C':
73967774a04SBlue Swirl fetch_data(info, buffer + 3);
74048024e4aSbellard val = buffer[3];
74148024e4aSbellard break;
74248024e4aSbellard
74348024e4aSbellard case '1':
74467774a04SBlue Swirl fetch_data(info, buffer + 3);
74548024e4aSbellard val = (buffer[2] << 8) + buffer[3];
74648024e4aSbellard val >>= 12;
74748024e4aSbellard break;
74848024e4aSbellard
74948024e4aSbellard case '2':
75067774a04SBlue Swirl fetch_data(info, buffer + 3);
75148024e4aSbellard val = (buffer[2] << 8) + buffer[3];
75248024e4aSbellard val >>= 6;
75348024e4aSbellard break;
75448024e4aSbellard
75548024e4aSbellard case '3':
75648024e4aSbellard case 'j':
75767774a04SBlue Swirl fetch_data(info, buffer + 3);
75848024e4aSbellard val = (buffer[2] << 8) + buffer[3];
75948024e4aSbellard break;
76048024e4aSbellard
76148024e4aSbellard case '4':
76267774a04SBlue Swirl fetch_data(info, buffer + 5);
76348024e4aSbellard val = (buffer[4] << 8) + buffer[5];
76448024e4aSbellard val >>= 12;
76548024e4aSbellard break;
76648024e4aSbellard
76748024e4aSbellard case '5':
76867774a04SBlue Swirl fetch_data(info, buffer + 5);
76948024e4aSbellard val = (buffer[4] << 8) + buffer[5];
77048024e4aSbellard val >>= 6;
77148024e4aSbellard break;
77248024e4aSbellard
77348024e4aSbellard case '6':
77467774a04SBlue Swirl fetch_data(info, buffer + 5);
77548024e4aSbellard val = (buffer[4] << 8) + buffer[5];
77648024e4aSbellard break;
77748024e4aSbellard
77848024e4aSbellard case '7':
77967774a04SBlue Swirl fetch_data(info, buffer + 3);
78048024e4aSbellard val = (buffer[2] << 8) + buffer[3];
78148024e4aSbellard val >>= 7;
78248024e4aSbellard break;
78348024e4aSbellard
78448024e4aSbellard case '8':
78567774a04SBlue Swirl fetch_data(info, buffer + 3);
78648024e4aSbellard val = (buffer[2] << 8) + buffer[3];
78748024e4aSbellard val >>= 10;
78848024e4aSbellard break;
78948024e4aSbellard
79048024e4aSbellard case '9':
79167774a04SBlue Swirl fetch_data(info, buffer + 3);
79248024e4aSbellard val = (buffer[2] << 8) + buffer[3];
79348024e4aSbellard val >>= 5;
79448024e4aSbellard break;
79548024e4aSbellard
79648024e4aSbellard case 'e':
79748024e4aSbellard val = (buffer[1] >> 6);
79848024e4aSbellard break;
79948024e4aSbellard
80048024e4aSbellard case 'm':
80148024e4aSbellard val = (buffer[1] & 0x40 ? 0x8 : 0)
80248024e4aSbellard | ((buffer[0] >> 1) & 0x7)
80348024e4aSbellard | (buffer[3] & 0x80 ? 0x10 : 0);
80448024e4aSbellard break;
80548024e4aSbellard
80648024e4aSbellard case 'n':
80748024e4aSbellard val = (buffer[1] & 0x40 ? 0x8 : 0) | ((buffer[0] >> 1) & 0x7);
80848024e4aSbellard break;
80948024e4aSbellard
81048024e4aSbellard case 'o':
81148024e4aSbellard val = (buffer[2] >> 4) | (buffer[3] & 0x80 ? 0x10 : 0);
81248024e4aSbellard break;
81348024e4aSbellard
81448024e4aSbellard case 'M':
81548024e4aSbellard val = (buffer[1] & 0xf) | (buffer[3] & 0x40 ? 0x10 : 0);
81648024e4aSbellard break;
81748024e4aSbellard
81848024e4aSbellard case 'N':
81948024e4aSbellard val = (buffer[3] & 0xf) | (buffer[3] & 0x40 ? 0x10 : 0);
82048024e4aSbellard break;
82148024e4aSbellard
82248024e4aSbellard case 'h':
82348024e4aSbellard val = buffer[2] >> 2;
82448024e4aSbellard break;
82548024e4aSbellard
82648024e4aSbellard default:
82748024e4aSbellard abort ();
82848024e4aSbellard }
82948024e4aSbellard
83048024e4aSbellard switch (bits)
83148024e4aSbellard {
83248024e4aSbellard case 1:
83348024e4aSbellard return val & 1;
83448024e4aSbellard case 2:
83548024e4aSbellard return val & 3;
83648024e4aSbellard case 3:
83748024e4aSbellard return val & 7;
83848024e4aSbellard case 4:
83948024e4aSbellard return val & 017;
84048024e4aSbellard case 5:
84148024e4aSbellard return val & 037;
84248024e4aSbellard case 6:
84348024e4aSbellard return val & 077;
84448024e4aSbellard case 7:
84548024e4aSbellard return val & 0177;
84648024e4aSbellard case 8:
84748024e4aSbellard return val & 0377;
84848024e4aSbellard case 12:
84948024e4aSbellard return val & 07777;
85048024e4aSbellard default:
85148024e4aSbellard abort ();
85248024e4aSbellard }
85348024e4aSbellard }
85448024e4aSbellard
85548024e4aSbellard /* Check if an EA is valid for a particular code. This is required
85648024e4aSbellard for the EMAC instructions since the type of source address determines
8572dbb1308Szhaolichang if it is a EMAC-load instruction if the EA is mode 2-5, otherwise it
85848024e4aSbellard is a non-load EMAC instruction and the bits mean register Ry.
85948024e4aSbellard A similar case exists for the movem instructions where the register
86048024e4aSbellard mask is interpreted differently for different EAs. */
86148024e4aSbellard
86248024e4aSbellard static bfd_boolean
m68k_valid_ea(char code,int val)86348024e4aSbellard m68k_valid_ea (char code, int val)
86448024e4aSbellard {
86548024e4aSbellard int mode, mask;
86648024e4aSbellard #define M(n0,n1,n2,n3,n4,n5,n6,n70,n71,n72,n73,n74) \
86748024e4aSbellard (n0 | n1 << 1 | n2 << 2 | n3 << 3 | n4 << 4 | n5 << 5 | n6 << 6 \
86848024e4aSbellard | n70 << 7 | n71 << 8 | n72 << 9 | n73 << 10 | n74 << 11)
86948024e4aSbellard
87048024e4aSbellard switch (code)
87148024e4aSbellard {
87248024e4aSbellard case '*':
87348024e4aSbellard mask = M (1,1,1,1,1,1,1,1,1,1,1,1);
87448024e4aSbellard break;
87548024e4aSbellard case '~':
87648024e4aSbellard mask = M (0,0,1,1,1,1,1,1,1,0,0,0);
87748024e4aSbellard break;
87848024e4aSbellard case '%':
87948024e4aSbellard mask = M (1,1,1,1,1,1,1,1,1,0,0,0);
88048024e4aSbellard break;
88148024e4aSbellard case ';':
88248024e4aSbellard mask = M (1,0,1,1,1,1,1,1,1,1,1,1);
88348024e4aSbellard break;
88448024e4aSbellard case '@':
88548024e4aSbellard mask = M (1,0,1,1,1,1,1,1,1,1,1,0);
88648024e4aSbellard break;
88748024e4aSbellard case '!':
88848024e4aSbellard mask = M (0,0,1,0,0,1,1,1,1,1,1,0);
88948024e4aSbellard break;
89048024e4aSbellard case '&':
89148024e4aSbellard mask = M (0,0,1,0,0,1,1,1,1,0,0,0);
89248024e4aSbellard break;
89348024e4aSbellard case '$':
89448024e4aSbellard mask = M (1,0,1,1,1,1,1,1,1,0,0,0);
89548024e4aSbellard break;
89648024e4aSbellard case '?':
89748024e4aSbellard mask = M (1,0,1,0,0,1,1,1,1,0,0,0);
89848024e4aSbellard break;
89948024e4aSbellard case '/':
90048024e4aSbellard mask = M (1,0,1,0,0,1,1,1,1,1,1,0);
90148024e4aSbellard break;
90248024e4aSbellard case '|':
90348024e4aSbellard mask = M (0,0,1,0,0,1,1,1,1,1,1,0);
90448024e4aSbellard break;
90548024e4aSbellard case '>':
90648024e4aSbellard mask = M (0,0,1,0,1,1,1,1,1,0,0,0);
90748024e4aSbellard break;
90848024e4aSbellard case '<':
90948024e4aSbellard mask = M (0,0,1,1,0,1,1,1,1,1,1,0);
91048024e4aSbellard break;
91148024e4aSbellard case 'm':
91248024e4aSbellard mask = M (1,1,1,1,1,0,0,0,0,0,0,0);
91348024e4aSbellard break;
91448024e4aSbellard case 'n':
91548024e4aSbellard mask = M (0,0,0,0,0,1,0,0,0,1,0,0);
91648024e4aSbellard break;
91748024e4aSbellard case 'o':
91848024e4aSbellard mask = M (0,0,0,0,0,0,1,1,1,0,1,1);
91948024e4aSbellard break;
92048024e4aSbellard case 'p':
92148024e4aSbellard mask = M (1,1,1,1,1,1,0,0,0,0,0,0);
92248024e4aSbellard break;
92348024e4aSbellard case 'q':
92448024e4aSbellard mask = M (1,0,1,1,1,1,0,0,0,0,0,0);
92548024e4aSbellard break;
92648024e4aSbellard case 'v':
92748024e4aSbellard mask = M (1,0,1,1,1,1,0,1,1,0,0,0);
92848024e4aSbellard break;
92948024e4aSbellard case 'b':
93048024e4aSbellard mask = M (1,0,1,1,1,1,0,0,0,1,0,0);
93148024e4aSbellard break;
93248024e4aSbellard case 'w':
93348024e4aSbellard mask = M (0,0,1,1,1,1,0,0,0,1,0,0);
93448024e4aSbellard break;
93548024e4aSbellard case 'y':
93648024e4aSbellard mask = M (0,0,1,0,0,1,0,0,0,0,0,0);
93748024e4aSbellard break;
93848024e4aSbellard case 'z':
93948024e4aSbellard mask = M (0,0,1,0,0,1,0,0,0,1,0,0);
94048024e4aSbellard break;
94148024e4aSbellard case '4':
94248024e4aSbellard mask = M (0,0,1,1,1,1,0,0,0,0,0,0);
94348024e4aSbellard break;
94448024e4aSbellard default:
94548024e4aSbellard abort ();
94648024e4aSbellard }
94748024e4aSbellard #undef M
94848024e4aSbellard
94948024e4aSbellard mode = (val >> 3) & 7;
95048024e4aSbellard if (mode == 7)
95148024e4aSbellard mode += val & 7;
95248024e4aSbellard return (mask & (1 << mode)) != 0;
95348024e4aSbellard }
95448024e4aSbellard
95548024e4aSbellard /* Print a base register REGNO and displacement DISP, on INFO->STREAM.
95648024e4aSbellard REGNO = -1 for pc, -2 for none (suppressed). */
95748024e4aSbellard
95848024e4aSbellard static void
print_base(int regno,bfd_vma disp,disassemble_info * info)95948024e4aSbellard print_base (int regno, bfd_vma disp, disassemble_info *info)
96048024e4aSbellard {
96148024e4aSbellard if (regno == -1)
96248024e4aSbellard {
96348024e4aSbellard (*info->fprintf_func) (info->stream, "%%pc@(");
96448024e4aSbellard (*info->print_address_func) (disp, info);
96548024e4aSbellard }
96648024e4aSbellard else
96748024e4aSbellard {
96848024e4aSbellard char buf[50];
96948024e4aSbellard
97048024e4aSbellard if (regno == -2)
97148024e4aSbellard (*info->fprintf_func) (info->stream, "@(");
97248024e4aSbellard else if (regno == -3)
97348024e4aSbellard (*info->fprintf_func) (info->stream, "%%zpc@(");
97448024e4aSbellard else
97548024e4aSbellard (*info->fprintf_func) (info->stream, "%s@(", reg_names[regno]);
97648024e4aSbellard
97748024e4aSbellard sprintf_vma (buf, disp);
97848024e4aSbellard (*info->fprintf_func) (info->stream, "%s", buf);
97948024e4aSbellard }
98048024e4aSbellard }
98148024e4aSbellard
98248024e4aSbellard /* Print an indexed argument. The base register is BASEREG (-1 for pc).
98348024e4aSbellard P points to extension word, in buffer.
98448024e4aSbellard ADDR is the nominal core address of that extension word. */
98548024e4aSbellard
98648024e4aSbellard static unsigned char *
print_indexed(int basereg,unsigned char * p,bfd_vma addr,disassemble_info * info)98748024e4aSbellard print_indexed (int basereg,
98848024e4aSbellard unsigned char *p,
98948024e4aSbellard bfd_vma addr,
99048024e4aSbellard disassemble_info *info)
99148024e4aSbellard {
99248024e4aSbellard int word;
9937ccfb2ebSblueswir1 static const char *const scales[] = { "", ":2", ":4", ":8" };
99448024e4aSbellard bfd_vma base_disp;
99548024e4aSbellard bfd_vma outer_disp;
99648024e4aSbellard char buf[40];
99748024e4aSbellard char vmabuf[50];
99848024e4aSbellard
99948024e4aSbellard word = NEXTWORD (p);
100048024e4aSbellard
100148024e4aSbellard /* Generate the text for the index register.
100248024e4aSbellard Where this will be output is not yet determined. */
1003*28d5bfc0SPhilippe Mathieu-Daudé snprintf(buf, sizeof(buf), "%s:%c%s",
100448024e4aSbellard reg_names[(word >> 12) & 0xf],
100548024e4aSbellard (word & 0x800) ? 'l' : 'w',
100648024e4aSbellard scales[(word >> 9) & 3]);
100748024e4aSbellard
100848024e4aSbellard /* Handle the 68000 style of indexing. */
100948024e4aSbellard
101048024e4aSbellard if ((word & 0x100) == 0)
101148024e4aSbellard {
101248024e4aSbellard base_disp = word & 0xff;
101348024e4aSbellard if ((base_disp & 0x80) != 0)
101448024e4aSbellard base_disp -= 0x100;
101548024e4aSbellard if (basereg == -1)
101648024e4aSbellard base_disp += addr;
101748024e4aSbellard print_base (basereg, base_disp, info);
101848024e4aSbellard (*info->fprintf_func) (info->stream, ",%s)", buf);
101948024e4aSbellard return p;
102048024e4aSbellard }
102148024e4aSbellard
102248024e4aSbellard /* Handle the generalized kind. */
102348024e4aSbellard /* First, compute the displacement to add to the base register. */
102448024e4aSbellard if (word & 0200)
102548024e4aSbellard {
102648024e4aSbellard if (basereg == -1)
102748024e4aSbellard basereg = -3;
102848024e4aSbellard else
102948024e4aSbellard basereg = -2;
103048024e4aSbellard }
103148024e4aSbellard if (word & 0100)
103248024e4aSbellard buf[0] = '\0';
103348024e4aSbellard base_disp = 0;
103448024e4aSbellard switch ((word >> 4) & 3)
103548024e4aSbellard {
103648024e4aSbellard case 2:
103748024e4aSbellard base_disp = NEXTWORD (p);
103848024e4aSbellard break;
103948024e4aSbellard case 3:
104048024e4aSbellard base_disp = NEXTLONG (p);
104148024e4aSbellard }
104248024e4aSbellard if (basereg == -1)
104348024e4aSbellard base_disp += addr;
104448024e4aSbellard
104548024e4aSbellard /* Handle single-level case (not indirect). */
104648024e4aSbellard if ((word & 7) == 0)
104748024e4aSbellard {
104848024e4aSbellard print_base (basereg, base_disp, info);
104948024e4aSbellard if (buf[0] != '\0')
105048024e4aSbellard (*info->fprintf_func) (info->stream, ",%s", buf);
105148024e4aSbellard (*info->fprintf_func) (info->stream, ")");
105248024e4aSbellard return p;
105348024e4aSbellard }
105448024e4aSbellard
105548024e4aSbellard /* Two level. Compute displacement to add after indirection. */
105648024e4aSbellard outer_disp = 0;
105748024e4aSbellard switch (word & 3)
105848024e4aSbellard {
105948024e4aSbellard case 2:
106048024e4aSbellard outer_disp = NEXTWORD (p);
106148024e4aSbellard break;
106248024e4aSbellard case 3:
106348024e4aSbellard outer_disp = NEXTLONG (p);
106448024e4aSbellard }
106548024e4aSbellard
106648024e4aSbellard print_base (basereg, base_disp, info);
106748024e4aSbellard if ((word & 4) == 0 && buf[0] != '\0')
106848024e4aSbellard {
106948024e4aSbellard (*info->fprintf_func) (info->stream, ",%s", buf);
107048024e4aSbellard buf[0] = '\0';
107148024e4aSbellard }
107248024e4aSbellard sprintf_vma (vmabuf, outer_disp);
107348024e4aSbellard (*info->fprintf_func) (info->stream, ")@(%s", vmabuf);
107448024e4aSbellard if (buf[0] != '\0')
107548024e4aSbellard (*info->fprintf_func) (info->stream, ",%s", buf);
107648024e4aSbellard (*info->fprintf_func) (info->stream, ")");
107748024e4aSbellard
107848024e4aSbellard return p;
107948024e4aSbellard }
108048024e4aSbellard
108148024e4aSbellard /* Returns number of bytes "eaten" by the operand, or
108248024e4aSbellard return -1 if an invalid operand was found, or -2 if
10832dbb1308Szhaolichang an opcode table error was found.
108448024e4aSbellard ADDR is the pc for this arg to be relative to. */
108548024e4aSbellard
108648024e4aSbellard static int
print_insn_arg(const char * d,unsigned char * buffer,unsigned char * p0,bfd_vma addr,disassemble_info * info)108748024e4aSbellard print_insn_arg (const char *d,
108848024e4aSbellard unsigned char *buffer,
108948024e4aSbellard unsigned char *p0,
109048024e4aSbellard bfd_vma addr,
109148024e4aSbellard disassemble_info *info)
109248024e4aSbellard {
109348024e4aSbellard int val = 0;
109448024e4aSbellard int place = d[1];
109548024e4aSbellard unsigned char *p = p0;
109648024e4aSbellard int regno;
109748024e4aSbellard const char *regname;
109848024e4aSbellard unsigned char *p1;
109948024e4aSbellard double flval;
110048024e4aSbellard int flt_p;
110148024e4aSbellard bfd_signed_vma disp;
110248024e4aSbellard unsigned int uval;
110348024e4aSbellard
110448024e4aSbellard switch (*d)
110548024e4aSbellard {
110648024e4aSbellard case 'c': /* Cache identifier. */
110748024e4aSbellard {
11087ccfb2ebSblueswir1 static const char *const cacheFieldName[] = { "nc", "dc", "ic", "bc" };
110948024e4aSbellard val = fetch_arg (buffer, place, 2, info);
1110d14a68b6SStefan Weil (*info->fprintf_func) (info->stream, "%s", cacheFieldName[val]);
111148024e4aSbellard break;
111248024e4aSbellard }
111348024e4aSbellard
111448024e4aSbellard case 'a': /* Address register indirect only. Cf. case '+'. */
111548024e4aSbellard {
111648024e4aSbellard (*info->fprintf_func)
111748024e4aSbellard (info->stream,
111848024e4aSbellard "%s@",
111948024e4aSbellard reg_names[fetch_arg (buffer, place, 3, info) + 8]);
112048024e4aSbellard break;
112148024e4aSbellard }
112248024e4aSbellard
112348024e4aSbellard case '_': /* 32-bit absolute address for move16. */
112448024e4aSbellard {
112548024e4aSbellard uval = NEXTULONG (p);
112648024e4aSbellard (*info->print_address_func) (uval, info);
112748024e4aSbellard break;
112848024e4aSbellard }
112948024e4aSbellard
113048024e4aSbellard case 'C':
113148024e4aSbellard (*info->fprintf_func) (info->stream, "%%ccr");
113248024e4aSbellard break;
113348024e4aSbellard
113448024e4aSbellard case 'S':
113548024e4aSbellard (*info->fprintf_func) (info->stream, "%%sr");
113648024e4aSbellard break;
113748024e4aSbellard
113848024e4aSbellard case 'U':
113948024e4aSbellard (*info->fprintf_func) (info->stream, "%%usp");
114048024e4aSbellard break;
114148024e4aSbellard
114248024e4aSbellard case 'E':
114348024e4aSbellard (*info->fprintf_func) (info->stream, "%%acc");
114448024e4aSbellard break;
114548024e4aSbellard
114648024e4aSbellard case 'G':
114748024e4aSbellard (*info->fprintf_func) (info->stream, "%%macsr");
114848024e4aSbellard break;
114948024e4aSbellard
115048024e4aSbellard case 'H':
115148024e4aSbellard (*info->fprintf_func) (info->stream, "%%mask");
115248024e4aSbellard break;
115348024e4aSbellard
115448024e4aSbellard case 'J':
115548024e4aSbellard {
115648024e4aSbellard /* FIXME: There's a problem here, different m68k processors call the
115748024e4aSbellard same address different names. This table can't get it right
115848024e4aSbellard because it doesn't know which processor it's disassembling for. */
11597ccfb2ebSblueswir1 static const struct { const char *name; int value; } names[]
116048024e4aSbellard = {{"%sfc", 0x000}, {"%dfc", 0x001}, {"%cacr", 0x002},
116148024e4aSbellard {"%tc", 0x003}, {"%itt0",0x004}, {"%itt1", 0x005},
116248024e4aSbellard {"%dtt0",0x006}, {"%dtt1",0x007}, {"%buscr",0x008},
116348024e4aSbellard {"%usp", 0x800}, {"%vbr", 0x801}, {"%caar", 0x802},
116448024e4aSbellard {"%msp", 0x803}, {"%isp", 0x804},
116548024e4aSbellard {"%flashbar", 0xc04}, {"%rambar", 0xc05}, /* mcf528x added these. */
116648024e4aSbellard
116748024e4aSbellard /* Should we be calling this psr like we do in case 'Y'? */
116848024e4aSbellard {"%mmusr",0x805},
116948024e4aSbellard
117048024e4aSbellard {"%urp", 0x806}, {"%srp", 0x807}, {"%pcr", 0x808}};
117148024e4aSbellard
117248024e4aSbellard val = fetch_arg (buffer, place, 12, info);
117348024e4aSbellard for (regno = sizeof names / sizeof names[0] - 1; regno >= 0; regno--)
117448024e4aSbellard if (names[regno].value == val)
117548024e4aSbellard {
117648024e4aSbellard (*info->fprintf_func) (info->stream, "%s", names[regno].name);
117748024e4aSbellard break;
117848024e4aSbellard }
117948024e4aSbellard if (regno < 0)
118048024e4aSbellard (*info->fprintf_func) (info->stream, "%d", val);
118148024e4aSbellard }
118248024e4aSbellard break;
118348024e4aSbellard
118448024e4aSbellard case 'Q':
118548024e4aSbellard val = fetch_arg (buffer, place, 3, info);
118648024e4aSbellard /* 0 means 8, except for the bkpt instruction... */
118748024e4aSbellard if (val == 0 && d[1] != 's')
118848024e4aSbellard val = 8;
118948024e4aSbellard (*info->fprintf_func) (info->stream, "#%d", val);
119048024e4aSbellard break;
119148024e4aSbellard
119248024e4aSbellard case 'x':
119348024e4aSbellard val = fetch_arg (buffer, place, 3, info);
119448024e4aSbellard /* 0 means -1. */
119548024e4aSbellard if (val == 0)
119648024e4aSbellard val = -1;
119748024e4aSbellard (*info->fprintf_func) (info->stream, "#%d", val);
119848024e4aSbellard break;
119948024e4aSbellard
120048024e4aSbellard case 'M':
120148024e4aSbellard if (place == 'h')
120248024e4aSbellard {
12037ccfb2ebSblueswir1 static const char *const scalefactor_name[] = { "<<", ">>" };
120448024e4aSbellard val = fetch_arg (buffer, place, 1, info);
1205d14a68b6SStefan Weil (*info->fprintf_func) (info->stream, "%s", scalefactor_name[val]);
120648024e4aSbellard }
120748024e4aSbellard else
120848024e4aSbellard {
120948024e4aSbellard val = fetch_arg (buffer, place, 8, info);
121048024e4aSbellard if (val & 0x80)
121148024e4aSbellard val = val - 0x100;
121248024e4aSbellard (*info->fprintf_func) (info->stream, "#%d", val);
121348024e4aSbellard }
121448024e4aSbellard break;
121548024e4aSbellard
121648024e4aSbellard case 'T':
121748024e4aSbellard val = fetch_arg (buffer, place, 4, info);
121848024e4aSbellard (*info->fprintf_func) (info->stream, "#%d", val);
121948024e4aSbellard break;
122048024e4aSbellard
122148024e4aSbellard case 'D':
122248024e4aSbellard (*info->fprintf_func) (info->stream, "%s",
122348024e4aSbellard reg_names[fetch_arg (buffer, place, 3, info)]);
122448024e4aSbellard break;
122548024e4aSbellard
122648024e4aSbellard case 'A':
122748024e4aSbellard (*info->fprintf_func)
122848024e4aSbellard (info->stream, "%s",
122948024e4aSbellard reg_names[fetch_arg (buffer, place, 3, info) + 010]);
123048024e4aSbellard break;
123148024e4aSbellard
123248024e4aSbellard case 'R':
123348024e4aSbellard (*info->fprintf_func)
123448024e4aSbellard (info->stream, "%s",
123548024e4aSbellard reg_names[fetch_arg (buffer, place, 4, info)]);
123648024e4aSbellard break;
123748024e4aSbellard
123848024e4aSbellard case 'r':
123948024e4aSbellard regno = fetch_arg (buffer, place, 4, info);
124048024e4aSbellard if (regno > 7)
124148024e4aSbellard (*info->fprintf_func) (info->stream, "%s@", reg_names[regno]);
124248024e4aSbellard else
124348024e4aSbellard (*info->fprintf_func) (info->stream, "@(%s)", reg_names[regno]);
124448024e4aSbellard break;
124548024e4aSbellard
124648024e4aSbellard case 'F':
124748024e4aSbellard (*info->fprintf_func)
124848024e4aSbellard (info->stream, "%%fp%d",
124948024e4aSbellard fetch_arg (buffer, place, 3, info));
125048024e4aSbellard break;
125148024e4aSbellard
125248024e4aSbellard case 'O':
125348024e4aSbellard val = fetch_arg (buffer, place, 6, info);
125448024e4aSbellard if (val & 0x20)
125548024e4aSbellard (*info->fprintf_func) (info->stream, "%s", reg_names[val & 7]);
125648024e4aSbellard else
125748024e4aSbellard (*info->fprintf_func) (info->stream, "%d", val);
125848024e4aSbellard break;
125948024e4aSbellard
126048024e4aSbellard case '+':
126148024e4aSbellard (*info->fprintf_func)
126248024e4aSbellard (info->stream, "%s@+",
126348024e4aSbellard reg_names[fetch_arg (buffer, place, 3, info) + 8]);
126448024e4aSbellard break;
126548024e4aSbellard
126648024e4aSbellard case '-':
126748024e4aSbellard (*info->fprintf_func)
126848024e4aSbellard (info->stream, "%s@-",
126948024e4aSbellard reg_names[fetch_arg (buffer, place, 3, info) + 8]);
127048024e4aSbellard break;
127148024e4aSbellard
127248024e4aSbellard case 'k':
127348024e4aSbellard if (place == 'k')
127448024e4aSbellard (*info->fprintf_func)
127548024e4aSbellard (info->stream, "{%s}",
127648024e4aSbellard reg_names[fetch_arg (buffer, place, 3, info)]);
127748024e4aSbellard else if (place == 'C')
127848024e4aSbellard {
127948024e4aSbellard val = fetch_arg (buffer, place, 7, info);
128048024e4aSbellard if (val > 63) /* This is a signed constant. */
128148024e4aSbellard val -= 128;
128248024e4aSbellard (*info->fprintf_func) (info->stream, "{#%d}", val);
128348024e4aSbellard }
128448024e4aSbellard else
128548024e4aSbellard return -2;
128648024e4aSbellard break;
128748024e4aSbellard
128848024e4aSbellard case '#':
128948024e4aSbellard case '^':
129048024e4aSbellard p1 = buffer + (*d == '#' ? 2 : 4);
129148024e4aSbellard if (place == 's')
129248024e4aSbellard val = fetch_arg (buffer, place, 4, info);
129348024e4aSbellard else if (place == 'C')
129448024e4aSbellard val = fetch_arg (buffer, place, 7, info);
129548024e4aSbellard else if (place == '8')
129648024e4aSbellard val = fetch_arg (buffer, place, 3, info);
129748024e4aSbellard else if (place == '3')
129848024e4aSbellard val = fetch_arg (buffer, place, 8, info);
129948024e4aSbellard else if (place == 'b')
130048024e4aSbellard val = NEXTBYTE (p1);
130148024e4aSbellard else if (place == 'w' || place == 'W')
130248024e4aSbellard val = NEXTWORD (p1);
130348024e4aSbellard else if (place == 'l')
130448024e4aSbellard val = NEXTLONG (p1);
130548024e4aSbellard else
130648024e4aSbellard return -2;
130748024e4aSbellard (*info->fprintf_func) (info->stream, "#%d", val);
130848024e4aSbellard break;
130948024e4aSbellard
131048024e4aSbellard case 'B':
131148024e4aSbellard if (place == 'b')
131248024e4aSbellard disp = NEXTBYTE (p);
131348024e4aSbellard else if (place == 'B')
131448024e4aSbellard disp = COERCE_SIGNED_CHAR (buffer[1]);
131548024e4aSbellard else if (place == 'w' || place == 'W')
131648024e4aSbellard disp = NEXTWORD (p);
131748024e4aSbellard else if (place == 'l' || place == 'L' || place == 'C')
131848024e4aSbellard disp = NEXTLONG (p);
131948024e4aSbellard else if (place == 'g')
132048024e4aSbellard {
132148024e4aSbellard disp = NEXTBYTE (buffer);
132248024e4aSbellard if (disp == 0)
132348024e4aSbellard disp = NEXTWORD (p);
132448024e4aSbellard else if (disp == -1)
132548024e4aSbellard disp = NEXTLONG (p);
132648024e4aSbellard }
132748024e4aSbellard else if (place == 'c')
132848024e4aSbellard {
132948024e4aSbellard if (buffer[1] & 0x40) /* If bit six is one, long offset. */
133048024e4aSbellard disp = NEXTLONG (p);
133148024e4aSbellard else
133248024e4aSbellard disp = NEXTWORD (p);
133348024e4aSbellard }
133448024e4aSbellard else
133548024e4aSbellard return -2;
133648024e4aSbellard
133748024e4aSbellard (*info->print_address_func) (addr + disp, info);
133848024e4aSbellard break;
133948024e4aSbellard
134048024e4aSbellard case 'd':
134148024e4aSbellard val = NEXTWORD (p);
134248024e4aSbellard (*info->fprintf_func)
134348024e4aSbellard (info->stream, "%s@(%d)",
134448024e4aSbellard reg_names[fetch_arg (buffer, place, 3, info) + 8], val);
134548024e4aSbellard break;
134648024e4aSbellard
134748024e4aSbellard case 's':
134848024e4aSbellard (*info->fprintf_func) (info->stream, "%s",
134948024e4aSbellard fpcr_names[fetch_arg (buffer, place, 3, info)]);
135048024e4aSbellard break;
135148024e4aSbellard
135248024e4aSbellard case 'e':
135348024e4aSbellard val = fetch_arg(buffer, place, 2, info);
135448024e4aSbellard (*info->fprintf_func) (info->stream, "%%acc%d", val);
135548024e4aSbellard break;
135648024e4aSbellard
135748024e4aSbellard case 'g':
135848024e4aSbellard val = fetch_arg(buffer, place, 1, info);
135948024e4aSbellard (*info->fprintf_func) (info->stream, "%%accext%s", val==0 ? "01" : "23");
136048024e4aSbellard break;
136148024e4aSbellard
136248024e4aSbellard case 'i':
136348024e4aSbellard val = fetch_arg(buffer, place, 2, info);
136448024e4aSbellard if (val == 1)
136548024e4aSbellard (*info->fprintf_func) (info->stream, "<<");
136648024e4aSbellard else if (val == 3)
136748024e4aSbellard (*info->fprintf_func) (info->stream, ">>");
136848024e4aSbellard else
136948024e4aSbellard return -1;
137048024e4aSbellard break;
137148024e4aSbellard
137248024e4aSbellard case 'I':
137348024e4aSbellard /* Get coprocessor ID... */
137448024e4aSbellard val = fetch_arg (buffer, 'd', 3, info);
137548024e4aSbellard
137648024e4aSbellard if (val != 1) /* Unusual coprocessor ID? */
137748024e4aSbellard (*info->fprintf_func) (info->stream, "(cpid=%d) ", val);
137848024e4aSbellard break;
137948024e4aSbellard
138048024e4aSbellard case '4':
138148024e4aSbellard case '*':
138248024e4aSbellard case '~':
138348024e4aSbellard case '%':
138448024e4aSbellard case ';':
138548024e4aSbellard case '@':
138648024e4aSbellard case '!':
138748024e4aSbellard case '$':
138848024e4aSbellard case '?':
138948024e4aSbellard case '/':
139048024e4aSbellard case '&':
139148024e4aSbellard case '|':
139248024e4aSbellard case '<':
139348024e4aSbellard case '>':
139448024e4aSbellard case 'm':
139548024e4aSbellard case 'n':
139648024e4aSbellard case 'o':
139748024e4aSbellard case 'p':
139848024e4aSbellard case 'q':
139948024e4aSbellard case 'v':
140048024e4aSbellard case 'b':
140148024e4aSbellard case 'w':
140248024e4aSbellard case 'y':
140348024e4aSbellard case 'z':
140448024e4aSbellard if (place == 'd')
140548024e4aSbellard {
140648024e4aSbellard val = fetch_arg (buffer, 'x', 6, info);
140748024e4aSbellard val = ((val & 7) << 3) + ((val >> 3) & 7);
140848024e4aSbellard }
140948024e4aSbellard else
141048024e4aSbellard val = fetch_arg (buffer, 's', 6, info);
141148024e4aSbellard
141248024e4aSbellard /* If the <ea> is invalid for *d, then reject this match. */
141348024e4aSbellard if (!m68k_valid_ea (*d, val))
141448024e4aSbellard return -1;
141548024e4aSbellard
141648024e4aSbellard /* Get register number assuming address register. */
141748024e4aSbellard regno = (val & 7) + 8;
141848024e4aSbellard regname = reg_names[regno];
141948024e4aSbellard switch (val >> 3)
142048024e4aSbellard {
142148024e4aSbellard case 0:
142248024e4aSbellard (*info->fprintf_func) (info->stream, "%s", reg_names[val]);
142348024e4aSbellard break;
142448024e4aSbellard
142548024e4aSbellard case 1:
142648024e4aSbellard (*info->fprintf_func) (info->stream, "%s", regname);
142748024e4aSbellard break;
142848024e4aSbellard
142948024e4aSbellard case 2:
143048024e4aSbellard (*info->fprintf_func) (info->stream, "%s@", regname);
143148024e4aSbellard break;
143248024e4aSbellard
143348024e4aSbellard case 3:
143448024e4aSbellard (*info->fprintf_func) (info->stream, "%s@+", regname);
143548024e4aSbellard break;
143648024e4aSbellard
143748024e4aSbellard case 4:
143848024e4aSbellard (*info->fprintf_func) (info->stream, "%s@-", regname);
143948024e4aSbellard break;
144048024e4aSbellard
144148024e4aSbellard case 5:
144248024e4aSbellard val = NEXTWORD (p);
144348024e4aSbellard (*info->fprintf_func) (info->stream, "%s@(%d)", regname, val);
144448024e4aSbellard break;
144548024e4aSbellard
144648024e4aSbellard case 6:
144748024e4aSbellard p = print_indexed (regno, p, addr, info);
144848024e4aSbellard break;
144948024e4aSbellard
145048024e4aSbellard case 7:
145148024e4aSbellard switch (val & 7)
145248024e4aSbellard {
145348024e4aSbellard case 0:
145448024e4aSbellard val = NEXTWORD (p);
145548024e4aSbellard (*info->print_address_func) (val, info);
145648024e4aSbellard break;
145748024e4aSbellard
145848024e4aSbellard case 1:
145948024e4aSbellard uval = NEXTULONG (p);
146048024e4aSbellard (*info->print_address_func) (uval, info);
146148024e4aSbellard break;
146248024e4aSbellard
146348024e4aSbellard case 2:
146448024e4aSbellard val = NEXTWORD (p);
146548024e4aSbellard (*info->fprintf_func) (info->stream, "%%pc@(");
146648024e4aSbellard (*info->print_address_func) (addr + val, info);
146748024e4aSbellard (*info->fprintf_func) (info->stream, ")");
146848024e4aSbellard break;
146948024e4aSbellard
147048024e4aSbellard case 3:
147148024e4aSbellard p = print_indexed (-1, p, addr, info);
147248024e4aSbellard break;
147348024e4aSbellard
147448024e4aSbellard case 4:
147548024e4aSbellard flt_p = 1; /* Assume it's a float... */
147648024e4aSbellard switch (place)
147748024e4aSbellard {
147848024e4aSbellard case 'b':
147948024e4aSbellard val = NEXTBYTE (p);
148048024e4aSbellard flt_p = 0;
148148024e4aSbellard break;
148248024e4aSbellard
148348024e4aSbellard case 'w':
148448024e4aSbellard val = NEXTWORD (p);
148548024e4aSbellard flt_p = 0;
148648024e4aSbellard break;
148748024e4aSbellard
148848024e4aSbellard case 'l':
148948024e4aSbellard val = NEXTLONG (p);
149048024e4aSbellard flt_p = 0;
149148024e4aSbellard break;
149248024e4aSbellard
149348024e4aSbellard case 'f':
149448024e4aSbellard NEXTSINGLE (flval, p);
149548024e4aSbellard break;
149648024e4aSbellard
149748024e4aSbellard case 'F':
149848024e4aSbellard NEXTDOUBLE (flval, p);
149948024e4aSbellard break;
150048024e4aSbellard
150148024e4aSbellard case 'x':
150248024e4aSbellard NEXTEXTEND (flval, p);
150348024e4aSbellard break;
150448024e4aSbellard
150548024e4aSbellard case 'p':
150648024e4aSbellard flval = NEXTPACKED (p);
150748024e4aSbellard break;
150848024e4aSbellard
150948024e4aSbellard default:
151048024e4aSbellard return -1;
151148024e4aSbellard }
151248024e4aSbellard if (flt_p) /* Print a float? */
151348024e4aSbellard (*info->fprintf_func) (info->stream, "#%g", flval);
151448024e4aSbellard else
151548024e4aSbellard (*info->fprintf_func) (info->stream, "#%d", val);
151648024e4aSbellard break;
151748024e4aSbellard
151848024e4aSbellard default:
151948024e4aSbellard return -1;
152048024e4aSbellard }
152148024e4aSbellard }
152248024e4aSbellard
152348024e4aSbellard /* If place is '/', then this is the case of the mask bit for
152448024e4aSbellard mac/emac loads. Now that the arg has been printed, grab the
152548024e4aSbellard mask bit and if set, add a '&' to the arg. */
152648024e4aSbellard if (place == '/')
152748024e4aSbellard {
152848024e4aSbellard val = fetch_arg (buffer, place, 1, info);
152948024e4aSbellard if (val)
153048024e4aSbellard info->fprintf_func (info->stream, "&");
153148024e4aSbellard }
153248024e4aSbellard break;
153348024e4aSbellard
153448024e4aSbellard case 'L':
153548024e4aSbellard case 'l':
153648024e4aSbellard if (place == 'w')
153748024e4aSbellard {
153848024e4aSbellard char doneany;
153948024e4aSbellard p1 = buffer + 2;
154048024e4aSbellard val = NEXTWORD (p1);
154148024e4aSbellard /* Move the pointer ahead if this point is farther ahead
154248024e4aSbellard than the last. */
154348024e4aSbellard p = p1 > p ? p1 : p;
154448024e4aSbellard if (val == 0)
154548024e4aSbellard {
154648024e4aSbellard (*info->fprintf_func) (info->stream, "#0");
154748024e4aSbellard break;
154848024e4aSbellard }
154948024e4aSbellard if (*d == 'l')
155048024e4aSbellard {
155148024e4aSbellard int newval = 0;
155248024e4aSbellard
155348024e4aSbellard for (regno = 0; regno < 16; ++regno)
155448024e4aSbellard if (val & (0x8000 >> regno))
155548024e4aSbellard newval |= 1 << regno;
155648024e4aSbellard val = newval;
155748024e4aSbellard }
155848024e4aSbellard val &= 0xffff;
155948024e4aSbellard doneany = 0;
156048024e4aSbellard for (regno = 0; regno < 16; ++regno)
156148024e4aSbellard if (val & (1 << regno))
156248024e4aSbellard {
156348024e4aSbellard int first_regno;
156448024e4aSbellard
156548024e4aSbellard if (doneany)
156648024e4aSbellard (*info->fprintf_func) (info->stream, "/");
156748024e4aSbellard doneany = 1;
156848024e4aSbellard (*info->fprintf_func) (info->stream, "%s", reg_names[regno]);
156948024e4aSbellard first_regno = regno;
157048024e4aSbellard while (val & (1 << (regno + 1)))
157148024e4aSbellard ++regno;
157248024e4aSbellard if (regno > first_regno)
157348024e4aSbellard (*info->fprintf_func) (info->stream, "-%s",
157448024e4aSbellard reg_names[regno]);
157548024e4aSbellard }
157648024e4aSbellard }
157748024e4aSbellard else if (place == '3')
157848024e4aSbellard {
157948024e4aSbellard /* `fmovem' insn. */
158048024e4aSbellard char doneany;
158148024e4aSbellard val = fetch_arg (buffer, place, 8, info);
158248024e4aSbellard if (val == 0)
158348024e4aSbellard {
158448024e4aSbellard (*info->fprintf_func) (info->stream, "#0");
158548024e4aSbellard break;
158648024e4aSbellard }
158748024e4aSbellard if (*d == 'l')
158848024e4aSbellard {
158948024e4aSbellard int newval = 0;
159048024e4aSbellard
159148024e4aSbellard for (regno = 0; regno < 8; ++regno)
159248024e4aSbellard if (val & (0x80 >> regno))
159348024e4aSbellard newval |= 1 << regno;
159448024e4aSbellard val = newval;
159548024e4aSbellard }
159648024e4aSbellard val &= 0xff;
159748024e4aSbellard doneany = 0;
159848024e4aSbellard for (regno = 0; regno < 8; ++regno)
159948024e4aSbellard if (val & (1 << regno))
160048024e4aSbellard {
160148024e4aSbellard int first_regno;
160248024e4aSbellard if (doneany)
160348024e4aSbellard (*info->fprintf_func) (info->stream, "/");
160448024e4aSbellard doneany = 1;
160548024e4aSbellard (*info->fprintf_func) (info->stream, "%%fp%d", regno);
160648024e4aSbellard first_regno = regno;
160748024e4aSbellard while (val & (1 << (regno + 1)))
160848024e4aSbellard ++regno;
160948024e4aSbellard if (regno > first_regno)
161048024e4aSbellard (*info->fprintf_func) (info->stream, "-%%fp%d", regno);
161148024e4aSbellard }
161248024e4aSbellard }
161348024e4aSbellard else if (place == '8')
161448024e4aSbellard {
161548024e4aSbellard /* fmoveml for FP status registers. */
161648024e4aSbellard (*info->fprintf_func) (info->stream, "%s",
161748024e4aSbellard fpcr_names[fetch_arg (buffer, place, 3,
161848024e4aSbellard info)]);
161948024e4aSbellard }
162048024e4aSbellard else
162148024e4aSbellard return -2;
162248024e4aSbellard break;
162348024e4aSbellard
162448024e4aSbellard case 'X':
162548024e4aSbellard place = '8';
1626edd7541bSPaolo Bonzini /* fall through */
162748024e4aSbellard case 'Y':
162848024e4aSbellard case 'Z':
162948024e4aSbellard case 'W':
163048024e4aSbellard case '0':
163148024e4aSbellard case '1':
163248024e4aSbellard case '2':
163348024e4aSbellard case '3':
163448024e4aSbellard {
16354dba9141SLaurent Vivier int reg = fetch_arg (buffer, place, 5, info);
16367ccfb2ebSblueswir1 const char *name = 0;
163748024e4aSbellard
16384dba9141SLaurent Vivier switch (reg)
163948024e4aSbellard {
164048024e4aSbellard case 2: name = "%tt0"; break;
164148024e4aSbellard case 3: name = "%tt1"; break;
164248024e4aSbellard case 0x10: name = "%tc"; break;
164348024e4aSbellard case 0x11: name = "%drp"; break;
164448024e4aSbellard case 0x12: name = "%srp"; break;
164548024e4aSbellard case 0x13: name = "%crp"; break;
164648024e4aSbellard case 0x14: name = "%cal"; break;
164748024e4aSbellard case 0x15: name = "%val"; break;
164848024e4aSbellard case 0x16: name = "%scc"; break;
164948024e4aSbellard case 0x17: name = "%ac"; break;
165048024e4aSbellard case 0x18: name = "%psr"; break;
165148024e4aSbellard case 0x19: name = "%pcsr"; break;
165248024e4aSbellard case 0x1c:
165348024e4aSbellard case 0x1d:
165448024e4aSbellard {
165548024e4aSbellard int break_reg = ((buffer[3] >> 2) & 7);
165648024e4aSbellard
165748024e4aSbellard (*info->fprintf_func)
16584dba9141SLaurent Vivier (info->stream, reg == 0x1c ? "%%bad%d" : "%%bac%d",
165948024e4aSbellard break_reg);
166048024e4aSbellard }
166148024e4aSbellard break;
166248024e4aSbellard default:
16634dba9141SLaurent Vivier (*info->fprintf_func) (info->stream, "<mmu register %d>", reg);
166448024e4aSbellard }
166548024e4aSbellard if (name)
166648024e4aSbellard (*info->fprintf_func) (info->stream, "%s", name);
166748024e4aSbellard }
166848024e4aSbellard break;
166948024e4aSbellard
167048024e4aSbellard case 'f':
167148024e4aSbellard {
167248024e4aSbellard int fc = fetch_arg (buffer, place, 5, info);
167348024e4aSbellard
167448024e4aSbellard if (fc == 1)
167548024e4aSbellard (*info->fprintf_func) (info->stream, "%%dfc");
167648024e4aSbellard else if (fc == 0)
167748024e4aSbellard (*info->fprintf_func) (info->stream, "%%sfc");
167848024e4aSbellard else
167948024e4aSbellard /* xgettext:c-format */
1680ca66f1a1SLluís Vilanova (*info->fprintf_func) (info->stream, "<function code %d>", fc);
168148024e4aSbellard }
168248024e4aSbellard break;
168348024e4aSbellard
168448024e4aSbellard case 'V':
168548024e4aSbellard (*info->fprintf_func) (info->stream, "%%val");
168648024e4aSbellard break;
168748024e4aSbellard
168848024e4aSbellard case 't':
168948024e4aSbellard {
169048024e4aSbellard int level = fetch_arg (buffer, place, 3, info);
169148024e4aSbellard
169248024e4aSbellard (*info->fprintf_func) (info->stream, "%d", level);
169348024e4aSbellard }
169448024e4aSbellard break;
169548024e4aSbellard
169648024e4aSbellard case 'u':
169748024e4aSbellard {
169848024e4aSbellard short is_upper = 0;
169948024e4aSbellard int reg = fetch_arg (buffer, place, 5, info);
170048024e4aSbellard
170148024e4aSbellard if (reg & 0x10)
170248024e4aSbellard {
170348024e4aSbellard is_upper = 1;
170448024e4aSbellard reg &= 0xf;
170548024e4aSbellard }
170648024e4aSbellard (*info->fprintf_func) (info->stream, "%s%s",
170748024e4aSbellard reg_half_names[reg],
170848024e4aSbellard is_upper ? "u" : "l");
170948024e4aSbellard }
171048024e4aSbellard break;
171148024e4aSbellard
171248024e4aSbellard default:
171348024e4aSbellard return -2;
171448024e4aSbellard }
171548024e4aSbellard
171648024e4aSbellard return p - p0;
171748024e4aSbellard }
171848024e4aSbellard
171948024e4aSbellard /* Try to match the current instruction to best and if so, return the
172048024e4aSbellard number of bytes consumed from the instruction stream, else zero. */
172148024e4aSbellard
172248024e4aSbellard static int
match_insn_m68k(bfd_vma memaddr,disassemble_info * info,const struct m68k_opcode * best,struct private * priv)172348024e4aSbellard match_insn_m68k (bfd_vma memaddr,
172448024e4aSbellard disassemble_info * info,
172548024e4aSbellard const struct m68k_opcode * best,
172648024e4aSbellard struct private * priv)
172748024e4aSbellard {
172848024e4aSbellard unsigned char *save_p;
172948024e4aSbellard unsigned char *p;
173048024e4aSbellard const char *d;
173148024e4aSbellard
173248024e4aSbellard bfd_byte *buffer = priv->the_buffer;
17336e2d864eSStefan Weil fprintf_function save_printer = info->fprintf_func;
173448024e4aSbellard void (* save_print_address) (bfd_vma, struct disassemble_info *)
173548024e4aSbellard = info->print_address_func;
173648024e4aSbellard
173748024e4aSbellard /* Point at first word of argument data,
173848024e4aSbellard and at descriptor for first argument. */
173948024e4aSbellard p = buffer + 2;
174048024e4aSbellard
174148024e4aSbellard /* Figure out how long the fixed-size portion of the instruction is.
174248024e4aSbellard The only place this is stored in the opcode table is
174348024e4aSbellard in the arguments--look for arguments which specify fields in the 2nd
174448024e4aSbellard or 3rd words of the instruction. */
174548024e4aSbellard for (d = best->args; *d; d += 2)
174648024e4aSbellard {
174748024e4aSbellard /* I don't think it is necessary to be checking d[0] here;
174848024e4aSbellard I suspect all this could be moved to the case statement below. */
174948024e4aSbellard if (d[0] == '#')
175048024e4aSbellard {
175148024e4aSbellard if (d[1] == 'l' && p - buffer < 6)
175248024e4aSbellard p = buffer + 6;
175348024e4aSbellard else if (p - buffer < 4 && d[1] != 'C' && d[1] != '8')
175448024e4aSbellard p = buffer + 4;
175548024e4aSbellard }
175648024e4aSbellard
175748024e4aSbellard if ((d[0] == 'L' || d[0] == 'l') && d[1] == 'w' && p - buffer < 4)
175848024e4aSbellard p = buffer + 4;
175948024e4aSbellard
176048024e4aSbellard switch (d[1])
176148024e4aSbellard {
176248024e4aSbellard case '1':
176348024e4aSbellard case '2':
176448024e4aSbellard case '3':
176548024e4aSbellard case '7':
176648024e4aSbellard case '8':
176748024e4aSbellard case '9':
176848024e4aSbellard case 'i':
176948024e4aSbellard if (p - buffer < 4)
177048024e4aSbellard p = buffer + 4;
177148024e4aSbellard break;
177248024e4aSbellard case '4':
177348024e4aSbellard case '5':
177448024e4aSbellard case '6':
177548024e4aSbellard if (p - buffer < 6)
177648024e4aSbellard p = buffer + 6;
177748024e4aSbellard break;
177848024e4aSbellard default:
177948024e4aSbellard break;
178048024e4aSbellard }
178148024e4aSbellard }
178248024e4aSbellard
178348024e4aSbellard /* pflusha is an exceptions. It takes no arguments but is two words
178448024e4aSbellard long. Recognize it by looking at the lower 16 bits of the mask. */
178548024e4aSbellard if (p - buffer < 4 && (best->match & 0xFFFF) != 0)
178648024e4aSbellard p = buffer + 4;
178748024e4aSbellard
178848024e4aSbellard /* lpstop is another exception. It takes a one word argument but is
178948024e4aSbellard three words long. */
179048024e4aSbellard if (p - buffer < 6
179148024e4aSbellard && (best->match & 0xffff) == 0xffff
179248024e4aSbellard && best->args[0] == '#'
179348024e4aSbellard && best->args[1] == 'w')
179448024e4aSbellard {
179548024e4aSbellard /* Copy the one word argument into the usual location for a one
179648024e4aSbellard word argument, to simplify printing it. We can get away with
179748024e4aSbellard this because we know exactly what the second word is, and we
179848024e4aSbellard aren't going to print anything based on it. */
179948024e4aSbellard p = buffer + 6;
180067774a04SBlue Swirl fetch_data(info, p);
180148024e4aSbellard buffer[2] = buffer[4];
180248024e4aSbellard buffer[3] = buffer[5];
180348024e4aSbellard }
180448024e4aSbellard
180567774a04SBlue Swirl fetch_data(info, p);
180648024e4aSbellard
180748024e4aSbellard d = best->args;
180848024e4aSbellard
180948024e4aSbellard save_p = p;
181048024e4aSbellard info->print_address_func = dummy_print_address;
1811d14a68b6SStefan Weil info->fprintf_func = dummy_printer;
181248024e4aSbellard
181348024e4aSbellard /* We scan the operands twice. The first time we don't print anything,
181448024e4aSbellard but look for errors. */
181548024e4aSbellard for (; *d; d += 2)
181648024e4aSbellard {
181748024e4aSbellard int eaten = print_insn_arg (d, buffer, p, memaddr + (p - buffer), info);
181848024e4aSbellard
181948024e4aSbellard if (eaten >= 0)
182048024e4aSbellard p += eaten;
182148024e4aSbellard else if (eaten == -1)
182248024e4aSbellard {
182348024e4aSbellard info->fprintf_func = save_printer;
182448024e4aSbellard info->print_address_func = save_print_address;
182548024e4aSbellard return 0;
182648024e4aSbellard }
182748024e4aSbellard else
182848024e4aSbellard {
182948024e4aSbellard info->fprintf_func (info->stream,
183048024e4aSbellard /* xgettext:c-format */
1831ca66f1a1SLluís Vilanova "<internal error in opcode table: %s %s>\n",
183248024e4aSbellard best->name, best->args);
183348024e4aSbellard info->fprintf_func = save_printer;
183448024e4aSbellard info->print_address_func = save_print_address;
183548024e4aSbellard return 2;
183648024e4aSbellard }
183748024e4aSbellard }
183848024e4aSbellard
183948024e4aSbellard p = save_p;
184048024e4aSbellard info->fprintf_func = save_printer;
184148024e4aSbellard info->print_address_func = save_print_address;
184248024e4aSbellard
184348024e4aSbellard d = best->args;
184448024e4aSbellard
184548024e4aSbellard info->fprintf_func (info->stream, "%s", best->name);
184648024e4aSbellard
184748024e4aSbellard if (*d)
184848024e4aSbellard info->fprintf_func (info->stream, " ");
184948024e4aSbellard
185048024e4aSbellard while (*d)
185148024e4aSbellard {
185248024e4aSbellard p += print_insn_arg (d, buffer, p, memaddr + (p - buffer), info);
185348024e4aSbellard d += 2;
185448024e4aSbellard
185548024e4aSbellard if (*d && *(d - 2) != 'I' && *d != 'k')
185648024e4aSbellard info->fprintf_func (info->stream, ",");
185748024e4aSbellard }
185848024e4aSbellard
185948024e4aSbellard return p - buffer;
186048024e4aSbellard }
186148024e4aSbellard
186248024e4aSbellard /* Print the m68k instruction at address MEMADDR in debugged memory,
186348024e4aSbellard on INFO->STREAM. Returns length of the instruction, in bytes. */
186448024e4aSbellard
186548024e4aSbellard int
print_insn_m68k(bfd_vma memaddr,disassemble_info * info)186648024e4aSbellard print_insn_m68k (bfd_vma memaddr, disassemble_info *info)
186748024e4aSbellard {
186848024e4aSbellard int i;
186948024e4aSbellard const char *d;
187048024e4aSbellard unsigned int arch_mask;
187148024e4aSbellard struct private priv;
187248024e4aSbellard bfd_byte *buffer = priv.the_buffer;
187348024e4aSbellard int major_opcode;
187448024e4aSbellard static int numopcodes[16];
187548024e4aSbellard static const struct m68k_opcode **opcodes[16];
187648024e4aSbellard int val;
187748024e4aSbellard
187848024e4aSbellard if (!opcodes[0])
187948024e4aSbellard {
188048024e4aSbellard /* Speed up the matching by sorting the opcode
188148024e4aSbellard table on the upper four bits of the opcode. */
188248024e4aSbellard const struct m68k_opcode **opc_pointer[16];
188348024e4aSbellard
188448024e4aSbellard /* First count how many opcodes are in each of the sixteen buckets. */
188548024e4aSbellard for (i = 0; i < m68k_numopcodes; i++)
188648024e4aSbellard numopcodes[(m68k_opcodes[i].opcode >> 28) & 15]++;
188748024e4aSbellard
188848024e4aSbellard /* Then create a sorted table of pointers
188948024e4aSbellard that point into the unsorted table. */
189048024e4aSbellard opc_pointer[0] = malloc (sizeof (struct m68k_opcode *)
189148024e4aSbellard * m68k_numopcodes);
189248024e4aSbellard opcodes[0] = opc_pointer[0];
189348024e4aSbellard
189448024e4aSbellard for (i = 1; i < 16; i++)
189548024e4aSbellard {
189648024e4aSbellard opc_pointer[i] = opc_pointer[i - 1] + numopcodes[i - 1];
189748024e4aSbellard opcodes[i] = opc_pointer[i];
189848024e4aSbellard }
189948024e4aSbellard
190048024e4aSbellard for (i = 0; i < m68k_numopcodes; i++)
190148024e4aSbellard *opc_pointer[(m68k_opcodes[i].opcode >> 28) & 15]++ = &m68k_opcodes[i];
190248024e4aSbellard }
190348024e4aSbellard
190448024e4aSbellard info->private_data = (PTR) &priv;
190548024e4aSbellard /* Tell objdump to use two bytes per chunk
190648024e4aSbellard and six bytes per line for displaying raw data. */
190748024e4aSbellard info->bytes_per_chunk = 2;
190848024e4aSbellard info->bytes_per_line = 6;
190948024e4aSbellard info->display_endian = BFD_ENDIAN_BIG;
191048024e4aSbellard priv.max_fetched = priv.the_buffer;
191148024e4aSbellard priv.insn_start = memaddr;
191248024e4aSbellard
19136ab7e546SPeter Maydell if (sigsetjmp(priv.bailout, 0) != 0) {
191448024e4aSbellard /* Error return. */
191548024e4aSbellard return -1;
19166ab7e546SPeter Maydell }
191748024e4aSbellard
191848024e4aSbellard switch (info->mach)
191948024e4aSbellard {
192048024e4aSbellard default:
192148024e4aSbellard case 0:
192248024e4aSbellard arch_mask = (unsigned int) -1;
192348024e4aSbellard break;
192448024e4aSbellard case bfd_mach_m68000:
192548024e4aSbellard arch_mask = m68000|m68881|m68851;
192648024e4aSbellard break;
192748024e4aSbellard case bfd_mach_m68008:
192848024e4aSbellard arch_mask = m68008|m68881|m68851;
192948024e4aSbellard break;
193048024e4aSbellard case bfd_mach_m68010:
193148024e4aSbellard arch_mask = m68010|m68881|m68851;
193248024e4aSbellard break;
193348024e4aSbellard case bfd_mach_m68020:
193448024e4aSbellard arch_mask = m68020|m68881|m68851;
193548024e4aSbellard break;
193648024e4aSbellard case bfd_mach_m68030:
193748024e4aSbellard arch_mask = m68030|m68881|m68851;
193848024e4aSbellard break;
193948024e4aSbellard case bfd_mach_m68040:
194048024e4aSbellard arch_mask = m68040|m68881|m68851;
194148024e4aSbellard break;
194248024e4aSbellard case bfd_mach_m68060:
194348024e4aSbellard arch_mask = m68060|m68881|m68851;
194448024e4aSbellard break;
194548024e4aSbellard case bfd_mach_mcf5200:
194648024e4aSbellard arch_mask = mcfisa_a;
194748024e4aSbellard break;
194848024e4aSbellard case bfd_mach_mcf521x:
194948024e4aSbellard case bfd_mach_mcf528x:
195048024e4aSbellard arch_mask = mcfisa_a|mcfhwdiv|mcfisa_aa|mcfusp|mcfemac;
195148024e4aSbellard break;
195248024e4aSbellard case bfd_mach_mcf5206e:
195348024e4aSbellard arch_mask = mcfisa_a|mcfhwdiv|mcfmac;
195448024e4aSbellard break;
195548024e4aSbellard case bfd_mach_mcf5249:
195648024e4aSbellard arch_mask = mcfisa_a|mcfhwdiv|mcfemac;
195748024e4aSbellard break;
195848024e4aSbellard case bfd_mach_mcf5307:
195948024e4aSbellard arch_mask = mcfisa_a|mcfhwdiv|mcfmac;
196048024e4aSbellard break;
196148024e4aSbellard case bfd_mach_mcf5407:
196248024e4aSbellard arch_mask = mcfisa_a|mcfhwdiv|mcfisa_b|mcfmac;
196348024e4aSbellard break;
196448024e4aSbellard case bfd_mach_mcf547x:
196548024e4aSbellard case bfd_mach_mcf548x:
196648024e4aSbellard case bfd_mach_mcfv4e:
196748024e4aSbellard arch_mask = mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|cfloat|mcfemac;
196848024e4aSbellard break;
196948024e4aSbellard }
197048024e4aSbellard
197167774a04SBlue Swirl fetch_data(info, buffer + 2);
197248024e4aSbellard major_opcode = (buffer[0] >> 4) & 15;
197348024e4aSbellard
197448024e4aSbellard for (i = 0; i < numopcodes[major_opcode]; i++)
197548024e4aSbellard {
197648024e4aSbellard const struct m68k_opcode *opc = opcodes[major_opcode][i];
197748024e4aSbellard unsigned long opcode = opc->opcode;
197848024e4aSbellard unsigned long match = opc->match;
197948024e4aSbellard
198048024e4aSbellard if (((0xff & buffer[0] & (match >> 24)) == (0xff & (opcode >> 24)))
198148024e4aSbellard && ((0xff & buffer[1] & (match >> 16)) == (0xff & (opcode >> 16)))
198248024e4aSbellard /* Only fetch the next two bytes if we need to. */
198348024e4aSbellard && (((0xffff & match) == 0)
198448024e4aSbellard ||
198567774a04SBlue Swirl (fetch_data(info, buffer + 4)
198648024e4aSbellard && ((0xff & buffer[2] & (match >> 8)) == (0xff & (opcode >> 8)))
198748024e4aSbellard && ((0xff & buffer[3] & match) == (0xff & opcode)))
198848024e4aSbellard )
198948024e4aSbellard && (opc->arch & arch_mask) != 0)
199048024e4aSbellard {
199148024e4aSbellard /* Don't use for printout the variants of divul and divsl
199248024e4aSbellard that have the same register number in two places.
199348024e4aSbellard The more general variants will match instead. */
199448024e4aSbellard for (d = opc->args; *d; d += 2)
199548024e4aSbellard if (d[1] == 'D')
199648024e4aSbellard break;
199748024e4aSbellard
199848024e4aSbellard /* Don't use for printout the variants of most floating
199948024e4aSbellard point coprocessor instructions which use the same
200048024e4aSbellard register number in two places, as above. */
200148024e4aSbellard if (*d == '\0')
200248024e4aSbellard for (d = opc->args; *d; d += 2)
200348024e4aSbellard if (d[1] == 't')
200448024e4aSbellard break;
200548024e4aSbellard
200648024e4aSbellard /* Don't match fmovel with more than one register;
200748024e4aSbellard wait for fmoveml. */
200848024e4aSbellard if (*d == '\0')
200948024e4aSbellard {
201048024e4aSbellard for (d = opc->args; *d; d += 2)
201148024e4aSbellard {
201248024e4aSbellard if (d[0] == 's' && d[1] == '8')
201348024e4aSbellard {
201448024e4aSbellard val = fetch_arg (buffer, d[1], 3, info);
201548024e4aSbellard if ((val & (val - 1)) != 0)
201648024e4aSbellard break;
201748024e4aSbellard }
201848024e4aSbellard }
201948024e4aSbellard }
202048024e4aSbellard
2021d9345f1eSLaurent Vivier /* Don't match FPU insns with non-default coprocessor ID. */
2022d9345f1eSLaurent Vivier if (*d == '\0')
2023d9345f1eSLaurent Vivier {
2024d9345f1eSLaurent Vivier for (d = opc->args; *d; d += 2)
2025d9345f1eSLaurent Vivier {
2026d9345f1eSLaurent Vivier if (d[0] == 'I')
2027d9345f1eSLaurent Vivier {
2028d9345f1eSLaurent Vivier val = fetch_arg (buffer, 'd', 3, info);
2029d9345f1eSLaurent Vivier if (val != 1)
2030d9345f1eSLaurent Vivier break;
2031d9345f1eSLaurent Vivier }
2032d9345f1eSLaurent Vivier }
2033d9345f1eSLaurent Vivier }
2034d9345f1eSLaurent Vivier
203548024e4aSbellard if (*d == '\0')
203648024e4aSbellard if ((val = match_insn_m68k (memaddr, info, opc, & priv)))
203748024e4aSbellard return val;
203848024e4aSbellard }
203948024e4aSbellard }
204048024e4aSbellard
204148024e4aSbellard /* Handle undefined instructions. */
204248024e4aSbellard info->fprintf_func (info->stream, "0%o", (buffer[0] << 8) + buffer[1]);
204348024e4aSbellard return 2;
204448024e4aSbellard }
204548024e4aSbellard /* **** End of m68k-dis.c */
204648024e4aSbellard /* **** m68k-opc.h from sourceware.org CVS 2005-08-14. */
204748024e4aSbellard /* Opcode table for m680[012346]0/m6888[12]/m68851/mcf5200.
204848024e4aSbellard Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
204948024e4aSbellard 2000, 2001, 2003, 2004, 2005
205048024e4aSbellard Free Software Foundation, Inc.
205148024e4aSbellard
205248024e4aSbellard This file is part of GDB, GAS, and the GNU binutils.
205348024e4aSbellard
205448024e4aSbellard GDB, GAS, and the GNU binutils are free software; you can redistribute
205548024e4aSbellard them and/or modify them under the terms of the GNU General Public
205648024e4aSbellard License as published by the Free Software Foundation; either version
205748024e4aSbellard 1, or (at your option) any later version.
205848024e4aSbellard
205948024e4aSbellard GDB, GAS, and the GNU binutils are distributed in the hope that they
206048024e4aSbellard will be useful, but WITHOUT ANY WARRANTY; without even the implied
206148024e4aSbellard warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
206248024e4aSbellard the GNU General Public License for more details.
206348024e4aSbellard
206448024e4aSbellard You should have received a copy of the GNU General Public License
20658167ee88SBlue Swirl along with this file; see the file COPYING. If not,
20668167ee88SBlue Swirl see <http://www.gnu.org/licenses/>. */
206748024e4aSbellard
206848024e4aSbellard #define one(x) ((unsigned int) (x) << 16)
206948024e4aSbellard #define two(x, y) (((unsigned int) (x) << 16) + (y))
207048024e4aSbellard
207148024e4aSbellard /* The assembler requires that all instances of the same mnemonic must
207248024e4aSbellard be consecutive. If they aren't, the assembler will bomb at
207348024e4aSbellard runtime. */
207448024e4aSbellard
207548024e4aSbellard const struct m68k_opcode m68k_opcodes[] =
207648024e4aSbellard {
207748024e4aSbellard {"abcd", 2, one(0140400), one(0170770), "DsDd", m68000up },
207848024e4aSbellard {"abcd", 2, one(0140410), one(0170770), "-s-d", m68000up },
207948024e4aSbellard
208048024e4aSbellard {"addaw", 2, one(0150300), one(0170700), "*wAd", m68000up },
208148024e4aSbellard {"addal", 2, one(0150700), one(0170700), "*lAd", m68000up | mcfisa_a },
208248024e4aSbellard
208348024e4aSbellard {"addib", 4, one(0003000), one(0177700), "#b$s", m68000up },
208448024e4aSbellard {"addiw", 4, one(0003100), one(0177700), "#w$s", m68000up },
208548024e4aSbellard {"addil", 6, one(0003200), one(0177700), "#l$s", m68000up },
208648024e4aSbellard {"addil", 6, one(0003200), one(0177700), "#lDs", mcfisa_a },
208748024e4aSbellard
208848024e4aSbellard {"addqb", 2, one(0050000), one(0170700), "Qd$b", m68000up },
208948024e4aSbellard {"addqw", 2, one(0050100), one(0170700), "Qd%w", m68000up },
209048024e4aSbellard {"addql", 2, one(0050200), one(0170700), "Qd%l", m68000up | mcfisa_a },
209148024e4aSbellard
209248024e4aSbellard /* The add opcode can generate the adda, addi, and addq instructions. */
209348024e4aSbellard {"addb", 2, one(0050000), one(0170700), "Qd$b", m68000up },
209448024e4aSbellard {"addb", 4, one(0003000), one(0177700), "#b$s", m68000up },
209548024e4aSbellard {"addb", 2, one(0150000), one(0170700), ";bDd", m68000up },
209648024e4aSbellard {"addb", 2, one(0150400), one(0170700), "Dd~b", m68000up },
209748024e4aSbellard {"addw", 2, one(0050100), one(0170700), "Qd%w", m68000up },
209848024e4aSbellard {"addw", 2, one(0150300), one(0170700), "*wAd", m68000up },
209948024e4aSbellard {"addw", 4, one(0003100), one(0177700), "#w$s", m68000up },
210048024e4aSbellard {"addw", 2, one(0150100), one(0170700), "*wDd", m68000up },
210148024e4aSbellard {"addw", 2, one(0150500), one(0170700), "Dd~w", m68000up },
210248024e4aSbellard {"addl", 2, one(0050200), one(0170700), "Qd%l", m68000up | mcfisa_a },
210348024e4aSbellard {"addl", 6, one(0003200), one(0177700), "#l$s", m68000up },
210448024e4aSbellard {"addl", 6, one(0003200), one(0177700), "#lDs", mcfisa_a },
210548024e4aSbellard {"addl", 2, one(0150700), one(0170700), "*lAd", m68000up | mcfisa_a },
210648024e4aSbellard {"addl", 2, one(0150200), one(0170700), "*lDd", m68000up | mcfisa_a },
210748024e4aSbellard {"addl", 2, one(0150600), one(0170700), "Dd~l", m68000up | mcfisa_a },
210848024e4aSbellard
210948024e4aSbellard {"addxb", 2, one(0150400), one(0170770), "DsDd", m68000up },
211048024e4aSbellard {"addxb", 2, one(0150410), one(0170770), "-s-d", m68000up },
211148024e4aSbellard {"addxw", 2, one(0150500), one(0170770), "DsDd", m68000up },
211248024e4aSbellard {"addxw", 2, one(0150510), one(0170770), "-s-d", m68000up },
211348024e4aSbellard {"addxl", 2, one(0150600), one(0170770), "DsDd", m68000up | mcfisa_a },
211448024e4aSbellard {"addxl", 2, one(0150610), one(0170770), "-s-d", m68000up },
211548024e4aSbellard
211648024e4aSbellard {"andib", 4, one(0001000), one(0177700), "#b$s", m68000up },
211748024e4aSbellard {"andib", 4, one(0001074), one(0177777), "#bCs", m68000up },
211848024e4aSbellard {"andiw", 4, one(0001100), one(0177700), "#w$s", m68000up },
211948024e4aSbellard {"andiw", 4, one(0001174), one(0177777), "#wSs", m68000up },
212048024e4aSbellard {"andil", 6, one(0001200), one(0177700), "#l$s", m68000up },
212148024e4aSbellard {"andil", 6, one(0001200), one(0177700), "#lDs", mcfisa_a },
212248024e4aSbellard {"andi", 4, one(0001100), one(0177700), "#w$s", m68000up },
212348024e4aSbellard {"andi", 4, one(0001074), one(0177777), "#bCs", m68000up },
212448024e4aSbellard {"andi", 4, one(0001174), one(0177777), "#wSs", m68000up },
212548024e4aSbellard
212648024e4aSbellard /* The and opcode can generate the andi instruction. */
212748024e4aSbellard {"andb", 4, one(0001000), one(0177700), "#b$s", m68000up },
212848024e4aSbellard {"andb", 4, one(0001074), one(0177777), "#bCs", m68000up },
212948024e4aSbellard {"andb", 2, one(0140000), one(0170700), ";bDd", m68000up },
213048024e4aSbellard {"andb", 2, one(0140400), one(0170700), "Dd~b", m68000up },
213148024e4aSbellard {"andw", 4, one(0001100), one(0177700), "#w$s", m68000up },
213248024e4aSbellard {"andw", 4, one(0001174), one(0177777), "#wSs", m68000up },
213348024e4aSbellard {"andw", 2, one(0140100), one(0170700), ";wDd", m68000up },
213448024e4aSbellard {"andw", 2, one(0140500), one(0170700), "Dd~w", m68000up },
213548024e4aSbellard {"andl", 6, one(0001200), one(0177700), "#l$s", m68000up },
213648024e4aSbellard {"andl", 6, one(0001200), one(0177700), "#lDs", mcfisa_a },
213748024e4aSbellard {"andl", 2, one(0140200), one(0170700), ";lDd", m68000up | mcfisa_a },
213848024e4aSbellard {"andl", 2, one(0140600), one(0170700), "Dd~l", m68000up | mcfisa_a },
213948024e4aSbellard {"and", 4, one(0001100), one(0177700), "#w$w", m68000up },
214048024e4aSbellard {"and", 4, one(0001074), one(0177777), "#bCs", m68000up },
214148024e4aSbellard {"and", 4, one(0001174), one(0177777), "#wSs", m68000up },
214248024e4aSbellard {"and", 2, one(0140100), one(0170700), ";wDd", m68000up },
214348024e4aSbellard {"and", 2, one(0140500), one(0170700), "Dd~w", m68000up },
214448024e4aSbellard
214548024e4aSbellard {"aslb", 2, one(0160400), one(0170770), "QdDs", m68000up },
214648024e4aSbellard {"aslb", 2, one(0160440), one(0170770), "DdDs", m68000up },
214748024e4aSbellard {"aslw", 2, one(0160500), one(0170770), "QdDs", m68000up },
214848024e4aSbellard {"aslw", 2, one(0160540), one(0170770), "DdDs", m68000up },
214948024e4aSbellard {"aslw", 2, one(0160700), one(0177700), "~s", m68000up },
215048024e4aSbellard {"asll", 2, one(0160600), one(0170770), "QdDs", m68000up | mcfisa_a },
215148024e4aSbellard {"asll", 2, one(0160640), one(0170770), "DdDs", m68000up | mcfisa_a },
215248024e4aSbellard
215348024e4aSbellard {"asrb", 2, one(0160000), one(0170770), "QdDs", m68000up },
215448024e4aSbellard {"asrb", 2, one(0160040), one(0170770), "DdDs", m68000up },
215548024e4aSbellard {"asrw", 2, one(0160100), one(0170770), "QdDs", m68000up },
215648024e4aSbellard {"asrw", 2, one(0160140), one(0170770), "DdDs", m68000up },
215748024e4aSbellard {"asrw", 2, one(0160300), one(0177700), "~s", m68000up },
215848024e4aSbellard {"asrl", 2, one(0160200), one(0170770), "QdDs", m68000up | mcfisa_a },
215948024e4aSbellard {"asrl", 2, one(0160240), one(0170770), "DdDs", m68000up | mcfisa_a },
216048024e4aSbellard
216148024e4aSbellard {"bhiw", 2, one(0061000), one(0177777), "BW", m68000up | mcfisa_a },
216248024e4aSbellard {"blsw", 2, one(0061400), one(0177777), "BW", m68000up | mcfisa_a },
216348024e4aSbellard {"bccw", 2, one(0062000), one(0177777), "BW", m68000up | mcfisa_a },
216448024e4aSbellard {"bcsw", 2, one(0062400), one(0177777), "BW", m68000up | mcfisa_a },
216548024e4aSbellard {"bnew", 2, one(0063000), one(0177777), "BW", m68000up | mcfisa_a },
216648024e4aSbellard {"beqw", 2, one(0063400), one(0177777), "BW", m68000up | mcfisa_a },
216748024e4aSbellard {"bvcw", 2, one(0064000), one(0177777), "BW", m68000up | mcfisa_a },
216848024e4aSbellard {"bvsw", 2, one(0064400), one(0177777), "BW", m68000up | mcfisa_a },
216948024e4aSbellard {"bplw", 2, one(0065000), one(0177777), "BW", m68000up | mcfisa_a },
217048024e4aSbellard {"bmiw", 2, one(0065400), one(0177777), "BW", m68000up | mcfisa_a },
217148024e4aSbellard {"bgew", 2, one(0066000), one(0177777), "BW", m68000up | mcfisa_a },
217248024e4aSbellard {"bltw", 2, one(0066400), one(0177777), "BW", m68000up | mcfisa_a },
217348024e4aSbellard {"bgtw", 2, one(0067000), one(0177777), "BW", m68000up | mcfisa_a },
217448024e4aSbellard {"blew", 2, one(0067400), one(0177777), "BW", m68000up | mcfisa_a },
217548024e4aSbellard
217648024e4aSbellard {"bhil", 2, one(0061377), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
217748024e4aSbellard {"blsl", 2, one(0061777), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
217848024e4aSbellard {"bccl", 2, one(0062377), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
217948024e4aSbellard {"bcsl", 2, one(0062777), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
218048024e4aSbellard {"bnel", 2, one(0063377), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
218148024e4aSbellard {"beql", 2, one(0063777), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
218248024e4aSbellard {"bvcl", 2, one(0064377), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
218348024e4aSbellard {"bvsl", 2, one(0064777), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
218448024e4aSbellard {"bpll", 2, one(0065377), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
218548024e4aSbellard {"bmil", 2, one(0065777), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
218648024e4aSbellard {"bgel", 2, one(0066377), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
218748024e4aSbellard {"bltl", 2, one(0066777), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
218848024e4aSbellard {"bgtl", 2, one(0067377), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
218948024e4aSbellard {"blel", 2, one(0067777), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
219048024e4aSbellard
219148024e4aSbellard {"bhis", 2, one(0061000), one(0177400), "BB", m68000up | mcfisa_a },
219248024e4aSbellard {"blss", 2, one(0061400), one(0177400), "BB", m68000up | mcfisa_a },
219348024e4aSbellard {"bccs", 2, one(0062000), one(0177400), "BB", m68000up | mcfisa_a },
219448024e4aSbellard {"bcss", 2, one(0062400), one(0177400), "BB", m68000up | mcfisa_a },
219548024e4aSbellard {"bnes", 2, one(0063000), one(0177400), "BB", m68000up | mcfisa_a },
219648024e4aSbellard {"beqs", 2, one(0063400), one(0177400), "BB", m68000up | mcfisa_a },
219748024e4aSbellard {"bvcs", 2, one(0064000), one(0177400), "BB", m68000up | mcfisa_a },
219848024e4aSbellard {"bvss", 2, one(0064400), one(0177400), "BB", m68000up | mcfisa_a },
219948024e4aSbellard {"bpls", 2, one(0065000), one(0177400), "BB", m68000up | mcfisa_a },
220048024e4aSbellard {"bmis", 2, one(0065400), one(0177400), "BB", m68000up | mcfisa_a },
220148024e4aSbellard {"bges", 2, one(0066000), one(0177400), "BB", m68000up | mcfisa_a },
220248024e4aSbellard {"blts", 2, one(0066400), one(0177400), "BB", m68000up | mcfisa_a },
220348024e4aSbellard {"bgts", 2, one(0067000), one(0177400), "BB", m68000up | mcfisa_a },
220448024e4aSbellard {"bles", 2, one(0067400), one(0177400), "BB", m68000up | mcfisa_a },
220548024e4aSbellard
220648024e4aSbellard {"jhi", 2, one(0061000), one(0177400), "Bg", m68000up | mcfisa_a },
220748024e4aSbellard {"jls", 2, one(0061400), one(0177400), "Bg", m68000up | mcfisa_a },
220848024e4aSbellard {"jcc", 2, one(0062000), one(0177400), "Bg", m68000up | mcfisa_a },
220948024e4aSbellard {"jcs", 2, one(0062400), one(0177400), "Bg", m68000up | mcfisa_a },
221048024e4aSbellard {"jne", 2, one(0063000), one(0177400), "Bg", m68000up | mcfisa_a },
221148024e4aSbellard {"jeq", 2, one(0063400), one(0177400), "Bg", m68000up | mcfisa_a },
221248024e4aSbellard {"jvc", 2, one(0064000), one(0177400), "Bg", m68000up | mcfisa_a },
221348024e4aSbellard {"jvs", 2, one(0064400), one(0177400), "Bg", m68000up | mcfisa_a },
221448024e4aSbellard {"jpl", 2, one(0065000), one(0177400), "Bg", m68000up | mcfisa_a },
221548024e4aSbellard {"jmi", 2, one(0065400), one(0177400), "Bg", m68000up | mcfisa_a },
221648024e4aSbellard {"jge", 2, one(0066000), one(0177400), "Bg", m68000up | mcfisa_a },
221748024e4aSbellard {"jlt", 2, one(0066400), one(0177400), "Bg", m68000up | mcfisa_a },
221848024e4aSbellard {"jgt", 2, one(0067000), one(0177400), "Bg", m68000up | mcfisa_a },
221948024e4aSbellard {"jle", 2, one(0067400), one(0177400), "Bg", m68000up | mcfisa_a },
222048024e4aSbellard
222148024e4aSbellard {"bchg", 2, one(0000500), one(0170700), "Dd$s", m68000up | mcfisa_a },
222248024e4aSbellard {"bchg", 4, one(0004100), one(0177700), "#b$s", m68000up },
222348024e4aSbellard {"bchg", 4, one(0004100), one(0177700), "#bqs", mcfisa_a },
222448024e4aSbellard
222548024e4aSbellard {"bclr", 2, one(0000600), one(0170700), "Dd$s", m68000up | mcfisa_a },
222648024e4aSbellard {"bclr", 4, one(0004200), one(0177700), "#b$s", m68000up },
222748024e4aSbellard {"bclr", 4, one(0004200), one(0177700), "#bqs", mcfisa_a },
222848024e4aSbellard
222948024e4aSbellard {"bfchg", 4, two(0165300, 0), two(0177700, 0170000), "?sO2O3", m68020up },
223048024e4aSbellard {"bfclr", 4, two(0166300, 0), two(0177700, 0170000), "?sO2O3", m68020up },
223148024e4aSbellard {"bfexts", 4, two(0165700, 0), two(0177700, 0100000), "/sO2O3D1", m68020up },
223248024e4aSbellard {"bfextu", 4, two(0164700, 0), two(0177700, 0100000), "/sO2O3D1", m68020up },
223348024e4aSbellard {"bfffo", 4, two(0166700, 0), two(0177700, 0100000), "/sO2O3D1", m68020up },
223448024e4aSbellard {"bfins", 4, two(0167700, 0), two(0177700, 0100000), "D1?sO2O3", m68020up },
223548024e4aSbellard {"bfset", 4, two(0167300, 0), two(0177700, 0170000), "?sO2O3", m68020up },
223648024e4aSbellard {"bftst", 4, two(0164300, 0), two(0177700, 0170000), "/sO2O3", m68020up },
223748024e4aSbellard
223848024e4aSbellard {"bgnd", 2, one(0045372), one(0177777), "", cpu32 },
223948024e4aSbellard
224048024e4aSbellard {"bitrev", 2, one(0000300), one(0177770), "Ds", mcfisa_aa},
224148024e4aSbellard
224248024e4aSbellard {"bkpt", 2, one(0044110), one(0177770), "ts", m68010up },
224348024e4aSbellard
224448024e4aSbellard {"braw", 2, one(0060000), one(0177777), "BW", m68000up | mcfisa_a },
224548024e4aSbellard {"bral", 2, one(0060377), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
224648024e4aSbellard {"bras", 2, one(0060000), one(0177400), "BB", m68000up | mcfisa_a },
224748024e4aSbellard
224848024e4aSbellard {"bset", 2, one(0000700), one(0170700), "Dd$s", m68000up | mcfisa_a },
224948024e4aSbellard {"bset", 2, one(0000700), one(0170700), "Ddvs", mcfisa_a },
225048024e4aSbellard {"bset", 4, one(0004300), one(0177700), "#b$s", m68000up },
225148024e4aSbellard {"bset", 4, one(0004300), one(0177700), "#bqs", mcfisa_a },
225248024e4aSbellard
225348024e4aSbellard {"bsrw", 2, one(0060400), one(0177777), "BW", m68000up | mcfisa_a },
225448024e4aSbellard {"bsrl", 2, one(0060777), one(0177777), "BL", m68020up | cpu32 | mcfisa_b},
225548024e4aSbellard {"bsrs", 2, one(0060400), one(0177400), "BB", m68000up | mcfisa_a },
225648024e4aSbellard
225748024e4aSbellard {"btst", 2, one(0000400), one(0170700), "Dd;b", m68000up | mcfisa_a },
225848024e4aSbellard {"btst", 4, one(0004000), one(0177700), "#b@s", m68000up },
225948024e4aSbellard {"btst", 4, one(0004000), one(0177700), "#bqs", mcfisa_a },
226048024e4aSbellard
226148024e4aSbellard {"byterev", 2, one(0001300), one(0177770), "Ds", mcfisa_aa},
226248024e4aSbellard
226348024e4aSbellard {"callm", 4, one(0003300), one(0177700), "#b!s", m68020 },
226448024e4aSbellard
226548024e4aSbellard {"cas2w", 6, two(0006374,0), two(0177777,0007070), "D3D6D2D5r1r4", m68020up },
226648024e4aSbellard {"cas2w", 6, two(0006374,0), two(0177777,0007070), "D3D6D2D5R1R4", m68020up },
226748024e4aSbellard {"cas2l", 6, two(0007374,0), two(0177777,0007070), "D3D6D2D5r1r4", m68020up },
226848024e4aSbellard {"cas2l", 6, two(0007374,0), two(0177777,0007070), "D3D6D2D5R1R4", m68020up },
226948024e4aSbellard
227048024e4aSbellard {"casb", 4, two(0005300, 0), two(0177700, 0177070), "D3D2~s", m68020up },
227148024e4aSbellard {"casw", 4, two(0006300, 0), two(0177700, 0177070), "D3D2~s", m68020up },
227248024e4aSbellard {"casl", 4, two(0007300, 0), two(0177700, 0177070), "D3D2~s", m68020up },
227348024e4aSbellard
227448024e4aSbellard {"chk2b", 4, two(0000300,0004000), two(0177700,07777), "!sR1", m68020up | cpu32 },
227548024e4aSbellard {"chk2w", 4, two(0001300,0004000), two(0177700,07777), "!sR1", m68020up | cpu32 },
227648024e4aSbellard {"chk2l", 4, two(0002300,0004000), two(0177700,07777), "!sR1", m68020up | cpu32 },
227748024e4aSbellard
227848024e4aSbellard {"chkl", 2, one(0040400), one(0170700), ";lDd", m68000up },
227948024e4aSbellard {"chkw", 2, one(0040600), one(0170700), ";wDd", m68000up },
228048024e4aSbellard
228148024e4aSbellard #define SCOPE_LINE (0x1 << 3)
228248024e4aSbellard #define SCOPE_PAGE (0x2 << 3)
228348024e4aSbellard #define SCOPE_ALL (0x3 << 3)
228448024e4aSbellard
228548024e4aSbellard {"cinva", 2, one(0xf400|SCOPE_ALL), one(0xff38), "ce", m68040up },
228648024e4aSbellard {"cinvl", 2, one(0xf400|SCOPE_LINE), one(0xff38), "ceas", m68040up },
228748024e4aSbellard {"cinvp", 2, one(0xf400|SCOPE_PAGE), one(0xff38), "ceas", m68040up },
228848024e4aSbellard
228948024e4aSbellard {"cpusha", 2, one(0xf420|SCOPE_ALL), one(0xff38), "ce", m68040up },
229048024e4aSbellard {"cpushl", 2, one(0xf420|SCOPE_LINE), one(0xff38), "ceas", m68040up | mcfisa_a },
229148024e4aSbellard {"cpushp", 2, one(0xf420|SCOPE_PAGE), one(0xff38), "ceas", m68040up },
229248024e4aSbellard
229348024e4aSbellard #undef SCOPE_LINE
229448024e4aSbellard #undef SCOPE_PAGE
229548024e4aSbellard #undef SCOPE_ALL
229648024e4aSbellard
229748024e4aSbellard {"clrb", 2, one(0041000), one(0177700), "$s", m68000up | mcfisa_a },
229848024e4aSbellard {"clrw", 2, one(0041100), one(0177700), "$s", m68000up | mcfisa_a },
229948024e4aSbellard {"clrl", 2, one(0041200), one(0177700), "$s", m68000up | mcfisa_a },
230048024e4aSbellard
230148024e4aSbellard {"cmp2b", 4, two(0000300,0), two(0177700,07777), "!sR1", m68020up | cpu32 },
230248024e4aSbellard {"cmp2w", 4, two(0001300,0), two(0177700,07777), "!sR1", m68020up | cpu32 },
230348024e4aSbellard {"cmp2l", 4, two(0002300,0), two(0177700,07777), "!sR1", m68020up | cpu32 },
230448024e4aSbellard
230548024e4aSbellard {"cmpaw", 2, one(0130300), one(0170700), "*wAd", m68000up },
230648024e4aSbellard {"cmpal", 2, one(0130700), one(0170700), "*lAd", m68000up | mcfisa_a },
230748024e4aSbellard
230848024e4aSbellard {"cmpib", 4, one(0006000), one(0177700), "#b@s", m68000up },
230948024e4aSbellard {"cmpib", 4, one(0006000), one(0177700), "#bDs", mcfisa_b },
231048024e4aSbellard {"cmpiw", 4, one(0006100), one(0177700), "#w@s", m68000up },
231148024e4aSbellard {"cmpiw", 4, one(0006100), one(0177700), "#wDs", mcfisa_b },
231248024e4aSbellard {"cmpil", 6, one(0006200), one(0177700), "#l@s", m68000up },
231348024e4aSbellard {"cmpil", 6, one(0006200), one(0177700), "#lDs", mcfisa_a },
231448024e4aSbellard
231548024e4aSbellard {"cmpmb", 2, one(0130410), one(0170770), "+s+d", m68000up },
231648024e4aSbellard {"cmpmw", 2, one(0130510), one(0170770), "+s+d", m68000up },
231748024e4aSbellard {"cmpml", 2, one(0130610), one(0170770), "+s+d", m68000up },
231848024e4aSbellard
231948024e4aSbellard /* The cmp opcode can generate the cmpa, cmpm, and cmpi instructions. */
232048024e4aSbellard {"cmpb", 4, one(0006000), one(0177700), "#b@s", m68000up },
232148024e4aSbellard {"cmpb", 4, one(0006000), one(0177700), "#bDs", mcfisa_b },
232248024e4aSbellard {"cmpb", 2, one(0130410), one(0170770), "+s+d", m68000up },
232348024e4aSbellard {"cmpb", 2, one(0130000), one(0170700), ";bDd", m68000up },
232448024e4aSbellard {"cmpb", 2, one(0130000), one(0170700), "*bDd", mcfisa_b },
232548024e4aSbellard {"cmpw", 2, one(0130300), one(0170700), "*wAd", m68000up },
232648024e4aSbellard {"cmpw", 4, one(0006100), one(0177700), "#w@s", m68000up },
232748024e4aSbellard {"cmpw", 4, one(0006100), one(0177700), "#wDs", mcfisa_b },
232848024e4aSbellard {"cmpw", 2, one(0130510), one(0170770), "+s+d", m68000up },
232948024e4aSbellard {"cmpw", 2, one(0130100), one(0170700), "*wDd", m68000up | mcfisa_b },
233048024e4aSbellard {"cmpl", 2, one(0130700), one(0170700), "*lAd", m68000up | mcfisa_a },
233148024e4aSbellard {"cmpl", 6, one(0006200), one(0177700), "#l@s", m68000up },
233248024e4aSbellard {"cmpl", 6, one(0006200), one(0177700), "#lDs", mcfisa_a },
233348024e4aSbellard {"cmpl", 2, one(0130610), one(0170770), "+s+d", m68000up },
233448024e4aSbellard {"cmpl", 2, one(0130200), one(0170700), "*lDd", m68000up | mcfisa_a },
233548024e4aSbellard
233648024e4aSbellard {"dbcc", 2, one(0052310), one(0177770), "DsBw", m68000up },
233748024e4aSbellard {"dbcs", 2, one(0052710), one(0177770), "DsBw", m68000up },
233848024e4aSbellard {"dbeq", 2, one(0053710), one(0177770), "DsBw", m68000up },
233948024e4aSbellard {"dbf", 2, one(0050710), one(0177770), "DsBw", m68000up },
234048024e4aSbellard {"dbge", 2, one(0056310), one(0177770), "DsBw", m68000up },
234148024e4aSbellard {"dbgt", 2, one(0057310), one(0177770), "DsBw", m68000up },
234248024e4aSbellard {"dbhi", 2, one(0051310), one(0177770), "DsBw", m68000up },
234348024e4aSbellard {"dble", 2, one(0057710), one(0177770), "DsBw", m68000up },
234448024e4aSbellard {"dbls", 2, one(0051710), one(0177770), "DsBw", m68000up },
234548024e4aSbellard {"dblt", 2, one(0056710), one(0177770), "DsBw", m68000up },
234648024e4aSbellard {"dbmi", 2, one(0055710), one(0177770), "DsBw", m68000up },
234748024e4aSbellard {"dbne", 2, one(0053310), one(0177770), "DsBw", m68000up },
234848024e4aSbellard {"dbpl", 2, one(0055310), one(0177770), "DsBw", m68000up },
234948024e4aSbellard {"dbt", 2, one(0050310), one(0177770), "DsBw", m68000up },
235048024e4aSbellard {"dbvc", 2, one(0054310), one(0177770), "DsBw", m68000up },
235148024e4aSbellard {"dbvs", 2, one(0054710), one(0177770), "DsBw", m68000up },
235248024e4aSbellard
235348024e4aSbellard {"divsw", 2, one(0100700), one(0170700), ";wDd", m68000up | mcfhwdiv },
235448024e4aSbellard
235548024e4aSbellard {"divsl", 4, two(0046100,0006000),two(0177700,0107770),";lD3D1", m68020up|cpu32 },
235648024e4aSbellard {"divsl", 4, two(0046100,0004000),two(0177700,0107770),";lDD", m68020up|cpu32 },
235748024e4aSbellard {"divsl", 4, two(0046100,0004000),two(0177700,0107770),"qsDD", mcfhwdiv },
235848024e4aSbellard
235948024e4aSbellard {"divsll", 4, two(0046100,0004000),two(0177700,0107770),";lD3D1",m68020up|cpu32 },
236048024e4aSbellard {"divsll", 4, two(0046100,0004000),two(0177700,0107770),";lDD", m68020up|cpu32 },
236148024e4aSbellard
236248024e4aSbellard {"divuw", 2, one(0100300), one(0170700), ";wDd", m68000up | mcfhwdiv },
236348024e4aSbellard
236448024e4aSbellard {"divul", 4, two(0046100,0002000),two(0177700,0107770),";lD3D1", m68020up|cpu32 },
236548024e4aSbellard {"divul", 4, two(0046100,0000000),two(0177700,0107770),";lDD", m68020up|cpu32 },
236648024e4aSbellard {"divul", 4, two(0046100,0000000),two(0177700,0107770),"qsDD", mcfhwdiv },
236748024e4aSbellard
236848024e4aSbellard {"divull", 4, two(0046100,0000000),two(0177700,0107770),";lD3D1",m68020up|cpu32 },
236948024e4aSbellard {"divull", 4, two(0046100,0000000),two(0177700,0107770),";lDD", m68020up|cpu32 },
237048024e4aSbellard
237148024e4aSbellard {"eorib", 4, one(0005000), one(0177700), "#b$s", m68000up },
237248024e4aSbellard {"eorib", 4, one(0005074), one(0177777), "#bCs", m68000up },
237348024e4aSbellard {"eoriw", 4, one(0005100), one(0177700), "#w$s", m68000up },
237448024e4aSbellard {"eoriw", 4, one(0005174), one(0177777), "#wSs", m68000up },
237548024e4aSbellard {"eoril", 6, one(0005200), one(0177700), "#l$s", m68000up },
237648024e4aSbellard {"eoril", 6, one(0005200), one(0177700), "#lDs", mcfisa_a },
237748024e4aSbellard {"eori", 4, one(0005074), one(0177777), "#bCs", m68000up },
237848024e4aSbellard {"eori", 4, one(0005174), one(0177777), "#wSs", m68000up },
237948024e4aSbellard {"eori", 4, one(0005100), one(0177700), "#w$s", m68000up },
238048024e4aSbellard
238148024e4aSbellard /* The eor opcode can generate the eori instruction. */
238248024e4aSbellard {"eorb", 4, one(0005000), one(0177700), "#b$s", m68000up },
238348024e4aSbellard {"eorb", 4, one(0005074), one(0177777), "#bCs", m68000up },
238448024e4aSbellard {"eorb", 2, one(0130400), one(0170700), "Dd$s", m68000up },
238548024e4aSbellard {"eorw", 4, one(0005100), one(0177700), "#w$s", m68000up },
238648024e4aSbellard {"eorw", 4, one(0005174), one(0177777), "#wSs", m68000up },
238748024e4aSbellard {"eorw", 2, one(0130500), one(0170700), "Dd$s", m68000up },
238848024e4aSbellard {"eorl", 6, one(0005200), one(0177700), "#l$s", m68000up },
238948024e4aSbellard {"eorl", 6, one(0005200), one(0177700), "#lDs", mcfisa_a },
239048024e4aSbellard {"eorl", 2, one(0130600), one(0170700), "Dd$s", m68000up | mcfisa_a },
239148024e4aSbellard {"eor", 4, one(0005074), one(0177777), "#bCs", m68000up },
239248024e4aSbellard {"eor", 4, one(0005174), one(0177777), "#wSs", m68000up },
239348024e4aSbellard {"eor", 4, one(0005100), one(0177700), "#w$s", m68000up },
239448024e4aSbellard {"eor", 2, one(0130500), one(0170700), "Dd$s", m68000up },
239548024e4aSbellard
239648024e4aSbellard {"exg", 2, one(0140500), one(0170770), "DdDs", m68000up },
239748024e4aSbellard {"exg", 2, one(0140510), one(0170770), "AdAs", m68000up },
239848024e4aSbellard {"exg", 2, one(0140610), one(0170770), "DdAs", m68000up },
239948024e4aSbellard {"exg", 2, one(0140610), one(0170770), "AsDd", m68000up },
240048024e4aSbellard
240148024e4aSbellard {"extw", 2, one(0044200), one(0177770), "Ds", m68000up|mcfisa_a },
240248024e4aSbellard {"extl", 2, one(0044300), one(0177770), "Ds", m68000up|mcfisa_a },
240348024e4aSbellard {"extbl", 2, one(0044700), one(0177770), "Ds", m68020up|cpu32|mcfisa_a },
240448024e4aSbellard
240548024e4aSbellard {"ff1", 2, one(0002300), one(0177770), "Ds", mcfisa_aa},
240648024e4aSbellard
240748024e4aSbellard /* float stuff starts here */
240848024e4aSbellard
240948024e4aSbellard {"fabsb", 4, two(0xF000, 0x5818), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
241048024e4aSbellard {"fabsb", 4, two(0xF000, 0x5818), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
241148024e4aSbellard {"fabsd", 4, two(0xF000, 0x0018), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
241248024e4aSbellard {"fabsd", 4, two(0xF000, 0x0018), two(0xF1C0, 0xE07F), "IiFt", cfloat },
241348024e4aSbellard {"fabsd", 4, two(0xF000, 0x5418), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
241448024e4aSbellard {"fabsd", 4, two(0xF000, 0x5418), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
241548024e4aSbellard {"fabsl", 4, two(0xF000, 0x4018), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
241648024e4aSbellard {"fabsl", 4, two(0xF000, 0x4018), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
241748024e4aSbellard {"fabsp", 4, two(0xF000, 0x4C18), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
241848024e4aSbellard {"fabss", 4, two(0xF000, 0x4418), two(0xF1C0, 0xFC7F), "Ii;fF7", cfloat },
241948024e4aSbellard {"fabss", 4, two(0xF000, 0x4418), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
242048024e4aSbellard {"fabsw", 4, two(0xF000, 0x5018), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
242148024e4aSbellard {"fabsw", 4, two(0xF000, 0x5018), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
242248024e4aSbellard {"fabsx", 4, two(0xF000, 0x0018), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
242348024e4aSbellard {"fabsx", 4, two(0xF000, 0x4818), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
242448024e4aSbellard {"fabsx", 4, two(0xF000, 0x0018), two(0xF1C0, 0xE07F), "IiFt", mfloat },
242548024e4aSbellard
242648024e4aSbellard {"fsabsb", 4, two(0xF000, 0x5858), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
242748024e4aSbellard {"fsabsb", 4, two(0xF000, 0x5858), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
242848024e4aSbellard {"fsabsd", 4, two(0xF000, 0x0058), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
242948024e4aSbellard {"fsabsd", 4, two(0xF000, 0x0058), two(0xF1C0, 0xE07F), "IiFt", cfloat },
243048024e4aSbellard {"fsabsd", 4, two(0xF000, 0x5458), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
243148024e4aSbellard {"fsabsd", 4, two(0xF000, 0x5458), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
243248024e4aSbellard {"fsabsl", 4, two(0xF000, 0x4058), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
243348024e4aSbellard {"fsabsl", 4, two(0xF000, 0x4058), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
243448024e4aSbellard {"fsabsp", 4, two(0xF000, 0x4C58), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
243548024e4aSbellard {"fsabss", 4, two(0xF000, 0x4258), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
243648024e4aSbellard {"fsabss", 4, two(0xF000, 0x4458), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
243748024e4aSbellard {"fsabsw", 4, two(0xF000, 0x5058), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
243848024e4aSbellard {"fsabsw", 4, two(0xF000, 0x5058), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
243948024e4aSbellard {"fsabsx", 4, two(0xF000, 0x0058), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
244048024e4aSbellard {"fsabsx", 4, two(0xF000, 0x4858), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
244148024e4aSbellard {"fsabsx", 4, two(0xF000, 0x0058), two(0xF1C0, 0xE07F), "IiFt", m68040up },
244248024e4aSbellard
244348024e4aSbellard {"fdabsb", 4, two(0xF000, 0x585C), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
244448024e4aSbellard {"fdabsb", 4, two(0xF000, 0x585c), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up},
244548024e4aSbellard {"fdabsd", 4, two(0xF000, 0x005C), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
244648024e4aSbellard {"fdabsd", 4, two(0xF000, 0x005C), two(0xF1C0, 0xE07F), "IiFt", cfloat },
244748024e4aSbellard {"fdabsd", 4, two(0xF000, 0x545C), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
244848024e4aSbellard {"fdabsd", 4, two(0xF000, 0x545c), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up},
244948024e4aSbellard {"fdabsl", 4, two(0xF000, 0x405C), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
245048024e4aSbellard {"fdabsl", 4, two(0xF000, 0x405c), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up},
245148024e4aSbellard {"fdabsp", 4, two(0xF000, 0x4C5c), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up},
245248024e4aSbellard {"fdabss", 4, two(0xF000, 0x425C), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
245348024e4aSbellard {"fdabss", 4, two(0xF000, 0x445c), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up},
245448024e4aSbellard {"fdabsw", 4, two(0xF000, 0x505C), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
245548024e4aSbellard {"fdabsw", 4, two(0xF000, 0x505c), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up},
245648024e4aSbellard {"fdabsx", 4, two(0xF000, 0x005c), two(0xF1C0, 0xE07F), "IiF8F7", m68040up},
245748024e4aSbellard {"fdabsx", 4, two(0xF000, 0x485c), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up},
245848024e4aSbellard {"fdabsx", 4, two(0xF000, 0x005c), two(0xF1C0, 0xE07F), "IiFt", m68040up},
245948024e4aSbellard
246048024e4aSbellard {"facosb", 4, two(0xF000, 0x581C), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
246148024e4aSbellard {"facosd", 4, two(0xF000, 0x541C), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
246248024e4aSbellard {"facosl", 4, two(0xF000, 0x401C), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
246348024e4aSbellard {"facosp", 4, two(0xF000, 0x4C1C), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
246448024e4aSbellard {"facoss", 4, two(0xF000, 0x441C), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
246548024e4aSbellard {"facosw", 4, two(0xF000, 0x501C), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
246648024e4aSbellard {"facosx", 4, two(0xF000, 0x001C), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
246748024e4aSbellard {"facosx", 4, two(0xF000, 0x481C), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
246848024e4aSbellard {"facosx", 4, two(0xF000, 0x001C), two(0xF1C0, 0xE07F), "IiFt", mfloat },
246948024e4aSbellard
247048024e4aSbellard {"faddb", 4, two(0xF000, 0x5822), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
247148024e4aSbellard {"faddb", 4, two(0xF000, 0x5822), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
247248024e4aSbellard {"faddd", 4, two(0xF000, 0x0022), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
247348024e4aSbellard {"faddd", 4, two(0xF000, 0x5422), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
247448024e4aSbellard {"faddd", 4, two(0xF000, 0x5422), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
247548024e4aSbellard {"faddd", 4, two(0xF000, 0x5422), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
247648024e4aSbellard {"faddl", 4, two(0xF000, 0x4022), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
247748024e4aSbellard {"faddl", 4, two(0xF000, 0x4022), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
247848024e4aSbellard {"faddp", 4, two(0xF000, 0x4C22), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
247948024e4aSbellard {"fadds", 4, two(0xF000, 0x4422), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
248048024e4aSbellard {"fadds", 4, two(0xF000, 0x4422), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
248148024e4aSbellard {"faddw", 4, two(0xF000, 0x5022), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
248248024e4aSbellard {"faddw", 4, two(0xF000, 0x5022), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
248348024e4aSbellard {"faddx", 4, two(0xF000, 0x0022), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
248448024e4aSbellard {"faddx", 4, two(0xF000, 0x4822), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
248548024e4aSbellard
248648024e4aSbellard {"fsaddb", 4, two(0xF000, 0x5862), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
248748024e4aSbellard {"fsaddb", 4, two(0xF000, 0x5862), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
248848024e4aSbellard {"fsaddd", 4, two(0xF000, 0x0066), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
248948024e4aSbellard {"fsaddd", 4, two(0xF000, 0x5462), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
249048024e4aSbellard {"fsaddd", 4, two(0xF000, 0x5462), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
249148024e4aSbellard {"fsaddl", 4, two(0xF000, 0x4062), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
249248024e4aSbellard {"fsaddl", 4, two(0xF000, 0x4062), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
249348024e4aSbellard {"fsaddp", 4, two(0xF000, 0x4C62), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
249448024e4aSbellard {"fsadds", 4, two(0xF000, 0x4462), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
249548024e4aSbellard {"fsadds", 4, two(0xF000, 0x4862), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
249648024e4aSbellard {"fsaddw", 4, two(0xF000, 0x5062), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
249748024e4aSbellard {"fsaddw", 4, two(0xF000, 0x5062), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
249848024e4aSbellard {"fsaddx", 4, two(0xF000, 0x0062), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
249948024e4aSbellard {"fsaddx", 4, two(0xF000, 0x4862), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
250048024e4aSbellard
250148024e4aSbellard {"fdaddb", 4, two(0xF000, 0x5826), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
250248024e4aSbellard {"fdaddb", 4, two(0xF000, 0x5866), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
250348024e4aSbellard {"fdaddd", 4, two(0xF000, 0x0066), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
250448024e4aSbellard {"fdaddd", 4, two(0xF000, 0x5426), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
250548024e4aSbellard {"fdaddd", 4, two(0xF000, 0x5466), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
250648024e4aSbellard {"fdaddl", 4, two(0xF000, 0x4026), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
250748024e4aSbellard {"fdaddl", 4, two(0xF000, 0x4066), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
250848024e4aSbellard {"fdaddp", 4, two(0xF000, 0x4C66), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
250948024e4aSbellard {"fdadds", 4, two(0xF000, 0x4466), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
251048024e4aSbellard {"fdadds", 4, two(0xF000, 0x4826), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
251148024e4aSbellard {"fdaddw", 4, two(0xF000, 0x5026), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
251248024e4aSbellard {"fdaddw", 4, two(0xF000, 0x5066), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
251348024e4aSbellard {"fdaddx", 4, two(0xF000, 0x0066), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
251448024e4aSbellard {"fdaddx", 4, two(0xF000, 0x4866), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
251548024e4aSbellard
251648024e4aSbellard {"fasinb", 4, two(0xF000, 0x580C), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
251748024e4aSbellard {"fasind", 4, two(0xF000, 0x540C), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
251848024e4aSbellard {"fasinl", 4, two(0xF000, 0x400C), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
251948024e4aSbellard {"fasinp", 4, two(0xF000, 0x4C0C), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
252048024e4aSbellard {"fasins", 4, two(0xF000, 0x440C), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
252148024e4aSbellard {"fasinw", 4, two(0xF000, 0x500C), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
252248024e4aSbellard {"fasinx", 4, two(0xF000, 0x000C), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
252348024e4aSbellard {"fasinx", 4, two(0xF000, 0x480C), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
252448024e4aSbellard {"fasinx", 4, two(0xF000, 0x000C), two(0xF1C0, 0xE07F), "IiFt", mfloat },
252548024e4aSbellard
252648024e4aSbellard {"fatanb", 4, two(0xF000, 0x580A), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
252748024e4aSbellard {"fatand", 4, two(0xF000, 0x540A), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
252848024e4aSbellard {"fatanl", 4, two(0xF000, 0x400A), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
252948024e4aSbellard {"fatanp", 4, two(0xF000, 0x4C0A), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
253048024e4aSbellard {"fatans", 4, two(0xF000, 0x440A), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
253148024e4aSbellard {"fatanw", 4, two(0xF000, 0x500A), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
253248024e4aSbellard {"fatanx", 4, two(0xF000, 0x000A), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
253348024e4aSbellard {"fatanx", 4, two(0xF000, 0x480A), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
253448024e4aSbellard {"fatanx", 4, two(0xF000, 0x000A), two(0xF1C0, 0xE07F), "IiFt", mfloat },
253548024e4aSbellard
253648024e4aSbellard {"fatanhb", 4, two(0xF000, 0x580D), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
253748024e4aSbellard {"fatanhd", 4, two(0xF000, 0x540D), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
253848024e4aSbellard {"fatanhl", 4, two(0xF000, 0x400D), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
253948024e4aSbellard {"fatanhp", 4, two(0xF000, 0x4C0D), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
254048024e4aSbellard {"fatanhs", 4, two(0xF000, 0x440D), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
254148024e4aSbellard {"fatanhw", 4, two(0xF000, 0x500D), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
254248024e4aSbellard {"fatanhx", 4, two(0xF000, 0x000D), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
254348024e4aSbellard {"fatanhx", 4, two(0xF000, 0x480D), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
254448024e4aSbellard {"fatanhx", 4, two(0xF000, 0x000D), two(0xF1C0, 0xE07F), "IiFt", mfloat },
254548024e4aSbellard
254648024e4aSbellard {"fbeq", 2, one(0xF081), one(0xF1FF), "IdBW", mfloat | cfloat },
254748024e4aSbellard {"fbf", 2, one(0xF080), one(0xF1FF), "IdBW", mfloat | cfloat },
254848024e4aSbellard {"fbge", 2, one(0xF093), one(0xF1FF), "IdBW", mfloat | cfloat },
254948024e4aSbellard {"fbgl", 2, one(0xF096), one(0xF1FF), "IdBW", mfloat | cfloat },
255048024e4aSbellard {"fbgle", 2, one(0xF097), one(0xF1FF), "IdBW", mfloat | cfloat },
255148024e4aSbellard {"fbgt", 2, one(0xF092), one(0xF1FF), "IdBW", mfloat | cfloat },
255248024e4aSbellard {"fble", 2, one(0xF095), one(0xF1FF), "IdBW", mfloat | cfloat },
255348024e4aSbellard {"fblt", 2, one(0xF094), one(0xF1FF), "IdBW", mfloat | cfloat },
255448024e4aSbellard {"fbne", 2, one(0xF08E), one(0xF1FF), "IdBW", mfloat | cfloat },
255548024e4aSbellard {"fbnge", 2, one(0xF09C), one(0xF1FF), "IdBW", mfloat | cfloat },
255648024e4aSbellard {"fbngl", 2, one(0xF099), one(0xF1FF), "IdBW", mfloat | cfloat },
255748024e4aSbellard {"fbngle", 2, one(0xF098), one(0xF1FF), "IdBW", mfloat | cfloat },
255848024e4aSbellard {"fbngt", 2, one(0xF09D), one(0xF1FF), "IdBW", mfloat | cfloat },
255948024e4aSbellard {"fbnle", 2, one(0xF09A), one(0xF1FF), "IdBW", mfloat | cfloat },
256048024e4aSbellard {"fbnlt", 2, one(0xF09B), one(0xF1FF), "IdBW", mfloat | cfloat },
256148024e4aSbellard {"fboge", 2, one(0xF083), one(0xF1FF), "IdBW", mfloat | cfloat },
256248024e4aSbellard {"fbogl", 2, one(0xF086), one(0xF1FF), "IdBW", mfloat | cfloat },
256348024e4aSbellard {"fbogt", 2, one(0xF082), one(0xF1FF), "IdBW", mfloat | cfloat },
256448024e4aSbellard {"fbole", 2, one(0xF085), one(0xF1FF), "IdBW", mfloat | cfloat },
256548024e4aSbellard {"fbolt", 2, one(0xF084), one(0xF1FF), "IdBW", mfloat | cfloat },
256648024e4aSbellard {"fbor", 2, one(0xF087), one(0xF1FF), "IdBW", mfloat | cfloat },
256748024e4aSbellard {"fbseq", 2, one(0xF091), one(0xF1FF), "IdBW", mfloat | cfloat },
256848024e4aSbellard {"fbsf", 2, one(0xF090), one(0xF1FF), "IdBW", mfloat | cfloat },
256948024e4aSbellard {"fbsne", 2, one(0xF09E), one(0xF1FF), "IdBW", mfloat | cfloat },
257048024e4aSbellard {"fbst", 2, one(0xF09F), one(0xF1FF), "IdBW", mfloat | cfloat },
257148024e4aSbellard {"fbt", 2, one(0xF08F), one(0xF1FF), "IdBW", mfloat | cfloat },
257248024e4aSbellard {"fbueq", 2, one(0xF089), one(0xF1FF), "IdBW", mfloat | cfloat },
257348024e4aSbellard {"fbuge", 2, one(0xF08B), one(0xF1FF), "IdBW", mfloat | cfloat },
257448024e4aSbellard {"fbugt", 2, one(0xF08A), one(0xF1FF), "IdBW", mfloat | cfloat },
257548024e4aSbellard {"fbule", 2, one(0xF08D), one(0xF1FF), "IdBW", mfloat | cfloat },
257648024e4aSbellard {"fbult", 2, one(0xF08C), one(0xF1FF), "IdBW", mfloat | cfloat },
257748024e4aSbellard {"fbun", 2, one(0xF088), one(0xF1FF), "IdBW", mfloat | cfloat },
257848024e4aSbellard
257948024e4aSbellard {"fbeql", 2, one(0xF0C1), one(0xF1FF), "IdBC", mfloat | cfloat },
258048024e4aSbellard {"fbfl", 2, one(0xF0C0), one(0xF1FF), "IdBC", mfloat | cfloat },
258148024e4aSbellard {"fbgel", 2, one(0xF0D3), one(0xF1FF), "IdBC", mfloat | cfloat },
258248024e4aSbellard {"fbgll", 2, one(0xF0D6), one(0xF1FF), "IdBC", mfloat | cfloat },
258348024e4aSbellard {"fbglel", 2, one(0xF0D7), one(0xF1FF), "IdBC", mfloat | cfloat },
258448024e4aSbellard {"fbgtl", 2, one(0xF0D2), one(0xF1FF), "IdBC", mfloat | cfloat },
258548024e4aSbellard {"fblel", 2, one(0xF0D5), one(0xF1FF), "IdBC", mfloat | cfloat },
258648024e4aSbellard {"fbltl", 2, one(0xF0D4), one(0xF1FF), "IdBC", mfloat | cfloat },
258748024e4aSbellard {"fbnel", 2, one(0xF0CE), one(0xF1FF), "IdBC", mfloat | cfloat },
258848024e4aSbellard {"fbngel", 2, one(0xF0DC), one(0xF1FF), "IdBC", mfloat | cfloat },
258948024e4aSbellard {"fbngll", 2, one(0xF0D9), one(0xF1FF), "IdBC", mfloat | cfloat },
259048024e4aSbellard {"fbnglel", 2, one(0xF0D8), one(0xF1FF), "IdBC", mfloat | cfloat },
259148024e4aSbellard {"fbngtl", 2, one(0xF0DD), one(0xF1FF), "IdBC", mfloat | cfloat },
259248024e4aSbellard {"fbnlel", 2, one(0xF0DA), one(0xF1FF), "IdBC", mfloat | cfloat },
259348024e4aSbellard {"fbnltl", 2, one(0xF0DB), one(0xF1FF), "IdBC", mfloat | cfloat },
259448024e4aSbellard {"fbogel", 2, one(0xF0C3), one(0xF1FF), "IdBC", mfloat | cfloat },
259548024e4aSbellard {"fbogll", 2, one(0xF0C6), one(0xF1FF), "IdBC", mfloat | cfloat },
259648024e4aSbellard {"fbogtl", 2, one(0xF0C2), one(0xF1FF), "IdBC", mfloat | cfloat },
259748024e4aSbellard {"fbolel", 2, one(0xF0C5), one(0xF1FF), "IdBC", mfloat | cfloat },
259848024e4aSbellard {"fboltl", 2, one(0xF0C4), one(0xF1FF), "IdBC", mfloat | cfloat },
259948024e4aSbellard {"fborl", 2, one(0xF0C7), one(0xF1FF), "IdBC", mfloat | cfloat },
260048024e4aSbellard {"fbseql", 2, one(0xF0D1), one(0xF1FF), "IdBC", mfloat | cfloat },
260148024e4aSbellard {"fbsfl", 2, one(0xF0D0), one(0xF1FF), "IdBC", mfloat | cfloat },
260248024e4aSbellard {"fbsnel", 2, one(0xF0DE), one(0xF1FF), "IdBC", mfloat | cfloat },
260348024e4aSbellard {"fbstl", 2, one(0xF0DF), one(0xF1FF), "IdBC", mfloat | cfloat },
260448024e4aSbellard {"fbtl", 2, one(0xF0CF), one(0xF1FF), "IdBC", mfloat | cfloat },
260548024e4aSbellard {"fbueql", 2, one(0xF0C9), one(0xF1FF), "IdBC", mfloat | cfloat },
260648024e4aSbellard {"fbugel", 2, one(0xF0CB), one(0xF1FF), "IdBC", mfloat | cfloat },
260748024e4aSbellard {"fbugtl", 2, one(0xF0CA), one(0xF1FF), "IdBC", mfloat | cfloat },
260848024e4aSbellard {"fbulel", 2, one(0xF0CD), one(0xF1FF), "IdBC", mfloat | cfloat },
260948024e4aSbellard {"fbultl", 2, one(0xF0CC), one(0xF1FF), "IdBC", mfloat | cfloat },
261048024e4aSbellard {"fbunl", 2, one(0xF0C8), one(0xF1FF), "IdBC", mfloat | cfloat },
261148024e4aSbellard
261248024e4aSbellard {"fjeq", 2, one(0xF081), one(0xF1BF), "IdBc", mfloat | cfloat },
261348024e4aSbellard {"fjf", 2, one(0xF080), one(0xF1BF), "IdBc", mfloat | cfloat },
261448024e4aSbellard {"fjge", 2, one(0xF093), one(0xF1BF), "IdBc", mfloat | cfloat },
261548024e4aSbellard {"fjgl", 2, one(0xF096), one(0xF1BF), "IdBc", mfloat | cfloat },
261648024e4aSbellard {"fjgle", 2, one(0xF097), one(0xF1BF), "IdBc", mfloat | cfloat },
261748024e4aSbellard {"fjgt", 2, one(0xF092), one(0xF1BF), "IdBc", mfloat | cfloat },
261848024e4aSbellard {"fjle", 2, one(0xF095), one(0xF1BF), "IdBc", mfloat | cfloat },
261948024e4aSbellard {"fjlt", 2, one(0xF094), one(0xF1BF), "IdBc", mfloat | cfloat },
262048024e4aSbellard {"fjne", 2, one(0xF08E), one(0xF1BF), "IdBc", mfloat | cfloat },
262148024e4aSbellard {"fjnge", 2, one(0xF09C), one(0xF1BF), "IdBc", mfloat | cfloat },
262248024e4aSbellard {"fjngl", 2, one(0xF099), one(0xF1BF), "IdBc", mfloat | cfloat },
262348024e4aSbellard {"fjngle", 2, one(0xF098), one(0xF1BF), "IdBc", mfloat | cfloat },
262448024e4aSbellard {"fjngt", 2, one(0xF09D), one(0xF1BF), "IdBc", mfloat | cfloat },
262548024e4aSbellard {"fjnle", 2, one(0xF09A), one(0xF1BF), "IdBc", mfloat | cfloat },
262648024e4aSbellard {"fjnlt", 2, one(0xF09B), one(0xF1BF), "IdBc", mfloat | cfloat },
262748024e4aSbellard {"fjoge", 2, one(0xF083), one(0xF1BF), "IdBc", mfloat | cfloat },
262848024e4aSbellard {"fjogl", 2, one(0xF086), one(0xF1BF), "IdBc", mfloat | cfloat },
262948024e4aSbellard {"fjogt", 2, one(0xF082), one(0xF1BF), "IdBc", mfloat | cfloat },
263048024e4aSbellard {"fjole", 2, one(0xF085), one(0xF1BF), "IdBc", mfloat | cfloat },
263148024e4aSbellard {"fjolt", 2, one(0xF084), one(0xF1BF), "IdBc", mfloat | cfloat },
263248024e4aSbellard {"fjor", 2, one(0xF087), one(0xF1BF), "IdBc", mfloat | cfloat },
263348024e4aSbellard {"fjseq", 2, one(0xF091), one(0xF1BF), "IdBc", mfloat | cfloat },
263448024e4aSbellard {"fjsf", 2, one(0xF090), one(0xF1BF), "IdBc", mfloat | cfloat },
263548024e4aSbellard {"fjsne", 2, one(0xF09E), one(0xF1BF), "IdBc", mfloat | cfloat },
263648024e4aSbellard {"fjst", 2, one(0xF09F), one(0xF1BF), "IdBc", mfloat | cfloat },
263748024e4aSbellard {"fjt", 2, one(0xF08F), one(0xF1BF), "IdBc", mfloat | cfloat },
263848024e4aSbellard {"fjueq", 2, one(0xF089), one(0xF1BF), "IdBc", mfloat | cfloat },
263948024e4aSbellard {"fjuge", 2, one(0xF08B), one(0xF1BF), "IdBc", mfloat | cfloat },
264048024e4aSbellard {"fjugt", 2, one(0xF08A), one(0xF1BF), "IdBc", mfloat | cfloat },
264148024e4aSbellard {"fjule", 2, one(0xF08D), one(0xF1BF), "IdBc", mfloat | cfloat },
264248024e4aSbellard {"fjult", 2, one(0xF08C), one(0xF1BF), "IdBc", mfloat | cfloat },
264348024e4aSbellard {"fjun", 2, one(0xF088), one(0xF1BF), "IdBc", mfloat | cfloat },
264448024e4aSbellard
264548024e4aSbellard {"fcmpb", 4, two(0xF000, 0x5838), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
264648024e4aSbellard {"fcmpb", 4, two(0xF000, 0x5838), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
264748024e4aSbellard {"fcmpd", 4, two(0xF000, 0x5438), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
264848024e4aSbellard {"fcmpd", 4, two(0xF000, 0x5438), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
264948024e4aSbellard {"fcmpd", 4, two(0xF000, 0x0038), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
265048024e4aSbellard {"fcmpl", 4, two(0xF000, 0x4038), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
265148024e4aSbellard {"fcmpl", 4, two(0xF000, 0x4038), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
265248024e4aSbellard {"fcmpp", 4, two(0xF000, 0x4C38), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
265348024e4aSbellard {"fcmps", 4, two(0xF000, 0x4438), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
265448024e4aSbellard {"fcmps", 4, two(0xF000, 0x4438), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
265548024e4aSbellard {"fcmpw", 4, two(0xF000, 0x5038), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
265648024e4aSbellard {"fcmpw", 4, two(0xF000, 0x5038), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
265748024e4aSbellard {"fcmpx", 4, two(0xF000, 0x0038), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
265848024e4aSbellard {"fcmpx", 4, two(0xF000, 0x4838), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
265948024e4aSbellard
266048024e4aSbellard {"fcosb", 4, two(0xF000, 0x581D), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
266148024e4aSbellard {"fcosd", 4, two(0xF000, 0x541D), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
266248024e4aSbellard {"fcosl", 4, two(0xF000, 0x401D), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
266348024e4aSbellard {"fcosp", 4, two(0xF000, 0x4C1D), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
266448024e4aSbellard {"fcoss", 4, two(0xF000, 0x441D), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
266548024e4aSbellard {"fcosw", 4, two(0xF000, 0x501D), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
266648024e4aSbellard {"fcosx", 4, two(0xF000, 0x001D), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
266748024e4aSbellard {"fcosx", 4, two(0xF000, 0x481D), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
266848024e4aSbellard {"fcosx", 4, two(0xF000, 0x001D), two(0xF1C0, 0xE07F), "IiFt", mfloat },
266948024e4aSbellard
267048024e4aSbellard {"fcoshb", 4, two(0xF000, 0x5819), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
267148024e4aSbellard {"fcoshd", 4, two(0xF000, 0x5419), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
267248024e4aSbellard {"fcoshl", 4, two(0xF000, 0x4019), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
267348024e4aSbellard {"fcoshp", 4, two(0xF000, 0x4C19), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
267448024e4aSbellard {"fcoshs", 4, two(0xF000, 0x4419), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
267548024e4aSbellard {"fcoshw", 4, two(0xF000, 0x5019), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
267648024e4aSbellard {"fcoshx", 4, two(0xF000, 0x0019), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
267748024e4aSbellard {"fcoshx", 4, two(0xF000, 0x4819), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
267848024e4aSbellard {"fcoshx", 4, two(0xF000, 0x0019), two(0xF1C0, 0xE07F), "IiFt", mfloat },
267948024e4aSbellard
268048024e4aSbellard {"fdbeq", 4, two(0xF048, 0x0001), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
268148024e4aSbellard {"fdbf", 4, two(0xF048, 0x0000), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
268248024e4aSbellard {"fdbge", 4, two(0xF048, 0x0013), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
268348024e4aSbellard {"fdbgl", 4, two(0xF048, 0x0016), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
268448024e4aSbellard {"fdbgle", 4, two(0xF048, 0x0017), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
268548024e4aSbellard {"fdbgt", 4, two(0xF048, 0x0012), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
268648024e4aSbellard {"fdble", 4, two(0xF048, 0x0015), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
268748024e4aSbellard {"fdblt", 4, two(0xF048, 0x0014), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
268848024e4aSbellard {"fdbne", 4, two(0xF048, 0x000E), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
268948024e4aSbellard {"fdbnge", 4, two(0xF048, 0x001C), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
269048024e4aSbellard {"fdbngl", 4, two(0xF048, 0x0019), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
269148024e4aSbellard {"fdbngle", 4, two(0xF048, 0x0018), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
269248024e4aSbellard {"fdbngt", 4, two(0xF048, 0x001D), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
269348024e4aSbellard {"fdbnle", 4, two(0xF048, 0x001A), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
269448024e4aSbellard {"fdbnlt", 4, two(0xF048, 0x001B), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
269548024e4aSbellard {"fdboge", 4, two(0xF048, 0x0003), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
269648024e4aSbellard {"fdbogl", 4, two(0xF048, 0x0006), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
269748024e4aSbellard {"fdbogt", 4, two(0xF048, 0x0002), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
269848024e4aSbellard {"fdbole", 4, two(0xF048, 0x0005), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
269948024e4aSbellard {"fdbolt", 4, two(0xF048, 0x0004), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
270048024e4aSbellard {"fdbor", 4, two(0xF048, 0x0007), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
270148024e4aSbellard {"fdbseq", 4, two(0xF048, 0x0011), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
270248024e4aSbellard {"fdbsf", 4, two(0xF048, 0x0010), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
270348024e4aSbellard {"fdbsne", 4, two(0xF048, 0x001E), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
270448024e4aSbellard {"fdbst", 4, two(0xF048, 0x001F), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
270548024e4aSbellard {"fdbt", 4, two(0xF048, 0x000F), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
270648024e4aSbellard {"fdbueq", 4, two(0xF048, 0x0009), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
270748024e4aSbellard {"fdbuge", 4, two(0xF048, 0x000B), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
270848024e4aSbellard {"fdbugt", 4, two(0xF048, 0x000A), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
270948024e4aSbellard {"fdbule", 4, two(0xF048, 0x000D), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
271048024e4aSbellard {"fdbult", 4, two(0xF048, 0x000C), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
271148024e4aSbellard {"fdbun", 4, two(0xF048, 0x0008), two(0xF1F8, 0xFFFF), "IiDsBw", mfloat },
271248024e4aSbellard
271348024e4aSbellard {"fdivb", 4, two(0xF000, 0x5820), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
271448024e4aSbellard {"fdivb", 4, two(0xF000, 0x5820), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
271548024e4aSbellard {"fdivd", 4, two(0xF000, 0x0020), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
271648024e4aSbellard {"fdivd", 4, two(0xF000, 0x5420), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
271748024e4aSbellard {"fdivd", 4, two(0xF000, 0x5420), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
271848024e4aSbellard {"fdivl", 4, two(0xF000, 0x4020), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
271948024e4aSbellard {"fdivl", 4, two(0xF000, 0x4020), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
272048024e4aSbellard {"fdivp", 4, two(0xF000, 0x4C20), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
272148024e4aSbellard {"fdivs", 4, two(0xF000, 0x4420), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
272248024e4aSbellard {"fdivs", 4, two(0xF000, 0x4420), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
272348024e4aSbellard {"fdivw", 4, two(0xF000, 0x5020), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
272448024e4aSbellard {"fdivw", 4, two(0xF000, 0x5020), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
272548024e4aSbellard {"fdivx", 4, two(0xF000, 0x0020), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
272648024e4aSbellard {"fdivx", 4, two(0xF000, 0x4820), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
272748024e4aSbellard
272848024e4aSbellard {"fsdivb", 4, two(0xF000, 0x5860), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
272948024e4aSbellard {"fsdivb", 4, two(0xF000, 0x5860), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
273048024e4aSbellard {"fsdivd", 4, two(0xF000, 0x0060), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
273148024e4aSbellard {"fsdivd", 4, two(0xF000, 0x5460), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
273248024e4aSbellard {"fsdivd", 4, two(0xF000, 0x5460), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
273348024e4aSbellard {"fsdivl", 4, two(0xF000, 0x4060), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
273448024e4aSbellard {"fsdivl", 4, two(0xF000, 0x4060), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
273548024e4aSbellard {"fsdivp", 4, two(0xF000, 0x4C60), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
273648024e4aSbellard {"fsdivs", 4, two(0xF000, 0x4460), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
273748024e4aSbellard {"fsdivs", 4, two(0xF000, 0x4460), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
273848024e4aSbellard {"fsdivw", 4, two(0xF000, 0x5060), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
273948024e4aSbellard {"fsdivw", 4, two(0xF000, 0x5060), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
274048024e4aSbellard {"fsdivx", 4, two(0xF000, 0x0060), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
274148024e4aSbellard {"fsdivx", 4, two(0xF000, 0x4860), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
274248024e4aSbellard
274348024e4aSbellard {"fddivb", 4, two(0xF000, 0x5864), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
274448024e4aSbellard {"fddivb", 4, two(0xF000, 0x5864), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
274548024e4aSbellard {"fddivd", 4, two(0xF000, 0x0064), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
274648024e4aSbellard {"fddivd", 4, two(0xF000, 0x5464), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
274748024e4aSbellard {"fddivd", 4, two(0xF000, 0x5464), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
274848024e4aSbellard {"fddivl", 4, two(0xF000, 0x4064), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
274948024e4aSbellard {"fddivl", 4, two(0xF000, 0x4064), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
275048024e4aSbellard {"fddivp", 4, two(0xF000, 0x4C64), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
275148024e4aSbellard {"fddivs", 4, two(0xF000, 0x4464), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
275248024e4aSbellard {"fddivs", 4, two(0xF000, 0x4464), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
275348024e4aSbellard {"fddivw", 4, two(0xF000, 0x5064), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
275448024e4aSbellard {"fddivw", 4, two(0xF000, 0x5064), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
275548024e4aSbellard {"fddivx", 4, two(0xF000, 0x0064), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
275648024e4aSbellard {"fddivx", 4, two(0xF000, 0x4864), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
275748024e4aSbellard
275848024e4aSbellard {"fetoxb", 4, two(0xF000, 0x5810), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
275948024e4aSbellard {"fetoxd", 4, two(0xF000, 0x5410), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
276048024e4aSbellard {"fetoxl", 4, two(0xF000, 0x4010), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
276148024e4aSbellard {"fetoxp", 4, two(0xF000, 0x4C10), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
276248024e4aSbellard {"fetoxs", 4, two(0xF000, 0x4410), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
276348024e4aSbellard {"fetoxw", 4, two(0xF000, 0x5010), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
276448024e4aSbellard {"fetoxx", 4, two(0xF000, 0x0010), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
276548024e4aSbellard {"fetoxx", 4, two(0xF000, 0x4810), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
276648024e4aSbellard {"fetoxx", 4, two(0xF000, 0x0010), two(0xF1C0, 0xE07F), "IiFt", mfloat },
276748024e4aSbellard
276848024e4aSbellard {"fetoxm1b", 4, two(0xF000, 0x5808), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
276948024e4aSbellard {"fetoxm1d", 4, two(0xF000, 0x5408), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
277048024e4aSbellard {"fetoxm1l", 4, two(0xF000, 0x4008), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
277148024e4aSbellard {"fetoxm1p", 4, two(0xF000, 0x4C08), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
277248024e4aSbellard {"fetoxm1s", 4, two(0xF000, 0x4408), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
277348024e4aSbellard {"fetoxm1w", 4, two(0xF000, 0x5008), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
277448024e4aSbellard {"fetoxm1x", 4, two(0xF000, 0x0008), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
277548024e4aSbellard {"fetoxm1x", 4, two(0xF000, 0x4808), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
277648024e4aSbellard {"fetoxm1x", 4, two(0xF000, 0x0008), two(0xF1C0, 0xE07F), "IiFt", mfloat },
277748024e4aSbellard
277848024e4aSbellard {"fgetexpb", 4, two(0xF000, 0x581E), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
277948024e4aSbellard {"fgetexpd", 4, two(0xF000, 0x541E), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
278048024e4aSbellard {"fgetexpl", 4, two(0xF000, 0x401E), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
278148024e4aSbellard {"fgetexpp", 4, two(0xF000, 0x4C1E), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
278248024e4aSbellard {"fgetexps", 4, two(0xF000, 0x441E), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
278348024e4aSbellard {"fgetexpw", 4, two(0xF000, 0x501E), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
278448024e4aSbellard {"fgetexpx", 4, two(0xF000, 0x001E), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
278548024e4aSbellard {"fgetexpx", 4, two(0xF000, 0x481E), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
278648024e4aSbellard {"fgetexpx", 4, two(0xF000, 0x001E), two(0xF1C0, 0xE07F), "IiFt", mfloat },
278748024e4aSbellard
278848024e4aSbellard {"fgetmanb", 4, two(0xF000, 0x581F), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
278948024e4aSbellard {"fgetmand", 4, two(0xF000, 0x541F), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
279048024e4aSbellard {"fgetmanl", 4, two(0xF000, 0x401F), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
279148024e4aSbellard {"fgetmanp", 4, two(0xF000, 0x4C1F), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
279248024e4aSbellard {"fgetmans", 4, two(0xF000, 0x441F), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
279348024e4aSbellard {"fgetmanw", 4, two(0xF000, 0x501F), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
279448024e4aSbellard {"fgetmanx", 4, two(0xF000, 0x001F), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
279548024e4aSbellard {"fgetmanx", 4, two(0xF000, 0x481F), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
279648024e4aSbellard {"fgetmanx", 4, two(0xF000, 0x001F), two(0xF1C0, 0xE07F), "IiFt", mfloat },
279748024e4aSbellard
279848024e4aSbellard {"fintb", 4, two(0xF000, 0x5801), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
279948024e4aSbellard {"fintb", 4, two(0xF000, 0x5801), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
280048024e4aSbellard {"fintd", 4, two(0xF000, 0x0001), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
280148024e4aSbellard {"fintd", 4, two(0xF000, 0x0001), two(0xF1C0, 0xE07F), "IiFt", cfloat },
280248024e4aSbellard {"fintd", 4, two(0xF000, 0x5401), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
280348024e4aSbellard {"fintd", 4, two(0xF000, 0x5401), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
280448024e4aSbellard {"fintl", 4, two(0xF000, 0x4001), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
280548024e4aSbellard {"fintl", 4, two(0xF000, 0x4001), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
280648024e4aSbellard {"fintp", 4, two(0xF000, 0x4C01), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
280748024e4aSbellard {"fints", 4, two(0xF000, 0x4401), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
280848024e4aSbellard {"fints", 4, two(0xF000, 0x4401), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
280948024e4aSbellard {"fintw", 4, two(0xF000, 0x5001), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
281048024e4aSbellard {"fintw", 4, two(0xF000, 0x5001), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
281148024e4aSbellard {"fintx", 4, two(0xF000, 0x0001), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
281248024e4aSbellard {"fintx", 4, two(0xF000, 0x4801), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
281348024e4aSbellard {"fintx", 4, two(0xF000, 0x0001), two(0xF1C0, 0xE07F), "IiFt", mfloat },
281448024e4aSbellard
281548024e4aSbellard {"fintrzb", 4, two(0xF000, 0x5803), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
281648024e4aSbellard {"fintrzb", 4, two(0xF000, 0x5803), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
281748024e4aSbellard {"fintrzd", 4, two(0xF000, 0x0003), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
281848024e4aSbellard {"fintrzd", 4, two(0xF000, 0x0003), two(0xF1C0, 0xE07F), "IiFt", cfloat },
281948024e4aSbellard {"fintrzd", 4, two(0xF000, 0x5403), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
282048024e4aSbellard {"fintrzd", 4, two(0xF000, 0x5403), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
282148024e4aSbellard {"fintrzl", 4, two(0xF000, 0x4003), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
282248024e4aSbellard {"fintrzl", 4, two(0xF000, 0x4003), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
282348024e4aSbellard {"fintrzp", 4, two(0xF000, 0x4C03), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
282448024e4aSbellard {"fintrzs", 4, two(0xF000, 0x4403), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
282548024e4aSbellard {"fintrzs", 4, two(0xF000, 0x4403), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
282648024e4aSbellard {"fintrzw", 4, two(0xF000, 0x5003), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
282748024e4aSbellard {"fintrzw", 4, two(0xF000, 0x5003), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
282848024e4aSbellard {"fintrzx", 4, two(0xF000, 0x0003), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
282948024e4aSbellard {"fintrzx", 4, two(0xF000, 0x4803), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
283048024e4aSbellard {"fintrzx", 4, two(0xF000, 0x0003), two(0xF1C0, 0xE07F), "IiFt", mfloat },
283148024e4aSbellard
283248024e4aSbellard {"flog10b", 4, two(0xF000, 0x5815), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
283348024e4aSbellard {"flog10d", 4, two(0xF000, 0x5415), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
283448024e4aSbellard {"flog10l", 4, two(0xF000, 0x4015), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
283548024e4aSbellard {"flog10p", 4, two(0xF000, 0x4C15), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
283648024e4aSbellard {"flog10s", 4, two(0xF000, 0x4415), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
283748024e4aSbellard {"flog10w", 4, two(0xF000, 0x5015), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
283848024e4aSbellard {"flog10x", 4, two(0xF000, 0x0015), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
283948024e4aSbellard {"flog10x", 4, two(0xF000, 0x4815), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
284048024e4aSbellard {"flog10x", 4, two(0xF000, 0x0015), two(0xF1C0, 0xE07F), "IiFt", mfloat },
284148024e4aSbellard
284248024e4aSbellard {"flog2b", 4, two(0xF000, 0x5816), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
284348024e4aSbellard {"flog2d", 4, two(0xF000, 0x5416), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
284448024e4aSbellard {"flog2l", 4, two(0xF000, 0x4016), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
284548024e4aSbellard {"flog2p", 4, two(0xF000, 0x4C16), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
284648024e4aSbellard {"flog2s", 4, two(0xF000, 0x4416), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
284748024e4aSbellard {"flog2w", 4, two(0xF000, 0x5016), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
284848024e4aSbellard {"flog2x", 4, two(0xF000, 0x0016), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
284948024e4aSbellard {"flog2x", 4, two(0xF000, 0x4816), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
285048024e4aSbellard {"flog2x", 4, two(0xF000, 0x0016), two(0xF1C0, 0xE07F), "IiFt", mfloat },
285148024e4aSbellard
285248024e4aSbellard {"flognb", 4, two(0xF000, 0x5814), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
285348024e4aSbellard {"flognd", 4, two(0xF000, 0x5414), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
285448024e4aSbellard {"flognl", 4, two(0xF000, 0x4014), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
285548024e4aSbellard {"flognp", 4, two(0xF000, 0x4C14), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
285648024e4aSbellard {"flogns", 4, two(0xF000, 0x4414), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
285748024e4aSbellard {"flognw", 4, two(0xF000, 0x5014), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
285848024e4aSbellard {"flognx", 4, two(0xF000, 0x0014), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
285948024e4aSbellard {"flognx", 4, two(0xF000, 0x4814), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
286048024e4aSbellard {"flognx", 4, two(0xF000, 0x0014), two(0xF1C0, 0xE07F), "IiFt", mfloat },
286148024e4aSbellard
286248024e4aSbellard {"flognp1b", 4, two(0xF000, 0x5806), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
286348024e4aSbellard {"flognp1d", 4, two(0xF000, 0x5406), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
286448024e4aSbellard {"flognp1l", 4, two(0xF000, 0x4006), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
286548024e4aSbellard {"flognp1p", 4, two(0xF000, 0x4C06), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
286648024e4aSbellard {"flognp1s", 4, two(0xF000, 0x4406), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
286748024e4aSbellard {"flognp1w", 4, two(0xF000, 0x5006), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
286848024e4aSbellard {"flognp1x", 4, two(0xF000, 0x0006), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
286948024e4aSbellard {"flognp1x", 4, two(0xF000, 0x4806), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
287048024e4aSbellard {"flognp1x", 4, two(0xF000, 0x0006), two(0xF1C0, 0xE07F), "IiFt", mfloat },
287148024e4aSbellard
287248024e4aSbellard {"fmodb", 4, two(0xF000, 0x5821), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
287348024e4aSbellard {"fmodd", 4, two(0xF000, 0x5421), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
287448024e4aSbellard {"fmodl", 4, two(0xF000, 0x4021), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
287548024e4aSbellard {"fmodp", 4, two(0xF000, 0x4C21), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
287648024e4aSbellard {"fmods", 4, two(0xF000, 0x4421), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
287748024e4aSbellard {"fmodw", 4, two(0xF000, 0x5021), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
287848024e4aSbellard {"fmodx", 4, two(0xF000, 0x0021), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
287948024e4aSbellard {"fmodx", 4, two(0xF000, 0x4821), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
288048024e4aSbellard
288148024e4aSbellard {"fmoveb", 4, two(0xF000, 0x5800), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
288248024e4aSbellard {"fmoveb", 4, two(0xF000, 0x7800), two(0xF1C0, 0xFC7F), "IiF7bs", cfloat },
288348024e4aSbellard {"fmoveb", 4, two(0xF000, 0x5800), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
288448024e4aSbellard {"fmoveb", 4, two(0xF000, 0x7800), two(0xF1C0, 0xFC7F), "IiF7$b", mfloat },
288548024e4aSbellard {"fmoved", 4, two(0xF000, 0x5400), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
288648024e4aSbellard {"fmoved", 4, two(0xF000, 0x7400), two(0xF1C0, 0xFC7F), "IiF7~F", mfloat },
288748024e4aSbellard {"fmoved", 4, two(0xF000, 0x0000), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
288848024e4aSbellard {"fmoved", 4, two(0xF000, 0x5400), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
288948024e4aSbellard {"fmoved", 4, two(0xF000, 0x7400), two(0xF1C0, 0xFC7F), "IiF7ws", cfloat },
289048024e4aSbellard {"fmovel", 4, two(0xF000, 0x4000), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
289148024e4aSbellard {"fmovel", 4, two(0xF000, 0x6000), two(0xF1C0, 0xFC7F), "IiF7$l", mfloat },
289248024e4aSbellard /* FIXME: the next two variants should not permit moving an address
289348024e4aSbellard register to anything but the floating point instruction register. */
289448024e4aSbellard {"fmovel", 4, two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat },
289548024e4aSbellard {"fmovel", 4, two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*ls8", mfloat },
289648024e4aSbellard {"fmovel", 4, two(0xF000, 0x4000), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
289748024e4aSbellard {"fmovel", 4, two(0xF000, 0x6000), two(0xF1C0, 0xFC7F), "IiF7bs", cfloat },
289848024e4aSbellard /* Move the FP control registers. */
289948024e4aSbellard {"fmovel", 4, two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8ps", cfloat },
290048024e4aSbellard {"fmovel", 4, two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Iibss8", cfloat },
290148024e4aSbellard {"fmovep", 4, two(0xF000, 0x4C00), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
290248024e4aSbellard {"fmovep", 4, two(0xF000, 0x6C00), two(0xF1C0, 0xFC00), "IiF7~pkC", mfloat },
290348024e4aSbellard {"fmovep", 4, two(0xF000, 0x7C00), two(0xF1C0, 0xFC0F), "IiF7~pDk", mfloat },
290448024e4aSbellard {"fmoves", 4, two(0xF000, 0x4400), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
290548024e4aSbellard {"fmoves", 4, two(0xF000, 0x6400), two(0xF1C0, 0xFC7F), "IiF7$f", mfloat },
290648024e4aSbellard {"fmoves", 4, two(0xF000, 0x4400), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
290748024e4aSbellard {"fmoves", 4, two(0xF000, 0x6400), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
290848024e4aSbellard {"fmovew", 4, two(0xF000, 0x5000), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
290948024e4aSbellard {"fmovew", 4, two(0xF000, 0x7000), two(0xF1C0, 0xFC7F), "IiF7$w", mfloat },
291048024e4aSbellard {"fmovew", 4, two(0xF000, 0x5000), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
291148024e4aSbellard {"fmovew", 4, two(0xF000, 0x7000), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
291248024e4aSbellard {"fmovex", 4, two(0xF000, 0x0000), two(0xF1FF, 0xE07F), "IiF8F7", mfloat },
291348024e4aSbellard {"fmovex", 4, two(0xF000, 0x4800), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
291448024e4aSbellard {"fmovex", 4, two(0xF000, 0x6800), two(0xF1C0, 0xFC7F), "IiF7~x", mfloat },
291548024e4aSbellard
291648024e4aSbellard {"fsmoveb", 4, two(0xF000, 0x5840), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
291748024e4aSbellard {"fsmoveb", 4, two(0xF000, 0x5840), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
291848024e4aSbellard {"fsmoveb", 4, two(0xF000, 0x7840), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
291948024e4aSbellard {"fsmoved", 4, two(0xF000, 0x0040), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
292048024e4aSbellard {"fsmoved", 4, two(0xF000, 0x5440), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
292148024e4aSbellard {"fsmoved", 4, two(0xF000, 0x5440), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
292248024e4aSbellard {"fsmoved", 4, two(0xF000, 0x7440), two(0xF1C0, 0xFC7F), "IiF7ws", cfloat },
292348024e4aSbellard {"fsmovel", 4, two(0xF000, 0x4040), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
292448024e4aSbellard {"fsmovel", 4, two(0xF000, 0x4040), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
292548024e4aSbellard {"fsmovel", 4, two(0xF000, 0x6040), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
292648024e4aSbellard {"fsmoves", 4, two(0xF000, 0x4440), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
292748024e4aSbellard {"fsmoves", 4, two(0xF000, 0x4440), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
292848024e4aSbellard {"fsmoves", 4, two(0xF000, 0x6440), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
292948024e4aSbellard {"fsmovew", 4, two(0xF000, 0x5040), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
293048024e4aSbellard {"fsmovew", 4, two(0xF000, 0x5040), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
293148024e4aSbellard {"fsmovew", 4, two(0xF000, 0x7040), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
293248024e4aSbellard {"fsmovex", 4, two(0xF000, 0x0040), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
293348024e4aSbellard {"fsmovex", 4, two(0xF000, 0x4840), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
293448024e4aSbellard {"fsmovep", 4, two(0xF000, 0x4C40), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
293548024e4aSbellard
293648024e4aSbellard {"fdmoveb", 4, two(0xF000, 0x5844), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
293748024e4aSbellard {"fdmoveb", 4, two(0xF000, 0x5844), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
293848024e4aSbellard {"fdmoveb", 4, two(0xF000, 0x7844), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
293948024e4aSbellard {"fdmoved", 4, two(0xF000, 0x0044), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
294048024e4aSbellard {"fdmoved", 4, two(0xF000, 0x5444), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
294148024e4aSbellard {"fdmoved", 4, two(0xF000, 0x5444), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
294248024e4aSbellard {"fdmoved", 4, two(0xF000, 0x7444), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
294348024e4aSbellard {"fdmovel", 4, two(0xF000, 0x4044), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
294448024e4aSbellard {"fdmovel", 4, two(0xF000, 0x4044), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
294548024e4aSbellard {"fdmovel", 4, two(0xF000, 0x6044), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
294648024e4aSbellard {"fdmoves", 4, two(0xF000, 0x4444), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
294748024e4aSbellard {"fdmoves", 4, two(0xF000, 0x4444), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
294848024e4aSbellard {"fdmoves", 4, two(0xF000, 0x6444), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
294948024e4aSbellard {"fdmovew", 4, two(0xF000, 0x5044), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
295048024e4aSbellard {"fdmovew", 4, two(0xF000, 0x5044), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
295148024e4aSbellard {"fdmovew", 4, two(0xF000, 0x7044), two(0xF1C0, 0xFC7F), "IiF7qs", cfloat },
295248024e4aSbellard {"fdmovex", 4, two(0xF000, 0x0044), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
295348024e4aSbellard {"fdmovex", 4, two(0xF000, 0x4844), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
295448024e4aSbellard {"fdmovep", 4, two(0xF000, 0x4C44), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
295548024e4aSbellard
295648024e4aSbellard {"fmovecrx", 4, two(0xF000, 0x5C00), two(0xF1FF, 0xFC00), "Ii#CF7", mfloat },
295748024e4aSbellard
295848024e4aSbellard {"fmovemd", 4, two(0xF000, 0xD000), two(0xFFC0, 0xFF00), "Iizsl3", cfloat },
295948024e4aSbellard {"fmovemd", 4, two(0xF000, 0xD000), two(0xFFC0, 0xFF00), "Iizs#3", cfloat },
296048024e4aSbellard {"fmovemd", 4, two(0xF000, 0xF000), two(0xFFC0, 0xFF00), "Ii#3ys", cfloat },
296148024e4aSbellard {"fmovemd", 4, two(0xF000, 0xF000), two(0xFFC0, 0xFF00), "Iil3ys", cfloat },
296248024e4aSbellard
296348024e4aSbellard {"fmovemx", 4, two(0xF000, 0xF800), two(0xF1C0, 0xFF8F), "IiDk&s", mfloat },
296448024e4aSbellard {"fmovemx", 4, two(0xF020, 0xE800), two(0xF1F8, 0xFF8F), "IiDk-s", mfloat },
296548024e4aSbellard {"fmovemx", 4, two(0xF000, 0xD800), two(0xF1C0, 0xFF8F), "Ii&sDk", mfloat },
296648024e4aSbellard {"fmovemx", 4, two(0xF018, 0xD800), two(0xF1F8, 0xFF8F), "Ii+sDk", mfloat },
296748024e4aSbellard {"fmovemx", 4, two(0xF000, 0xF000), two(0xF1C0, 0xFF00), "Idl3&s", mfloat },
296848024e4aSbellard {"fmovemx", 4, two(0xF000, 0xF000), two(0xF1C0, 0xFF00), "Id#3&s", mfloat },
296948024e4aSbellard {"fmovemx", 4, two(0xF000, 0xD000), two(0xF1C0, 0xFF00), "Id&sl3", mfloat },
297048024e4aSbellard {"fmovemx", 4, two(0xF000, 0xD000), two(0xF1C0, 0xFF00), "Id&s#3", mfloat },
297148024e4aSbellard {"fmovemx", 4, two(0xF020, 0xE000), two(0xF1F8, 0xFF00), "IdL3-s", mfloat },
297248024e4aSbellard {"fmovemx", 4, two(0xF020, 0xE000), two(0xF1F8, 0xFF00), "Id#3-s", mfloat },
297348024e4aSbellard {"fmovemx", 4, two(0xF018, 0xD000), two(0xF1F8, 0xFF00), "Id+sl3", mfloat },
297448024e4aSbellard {"fmovemx", 4, two(0xF018, 0xD000), two(0xF1F8, 0xFF00), "Id+s#3", mfloat },
297548024e4aSbellard
297648024e4aSbellard {"fmoveml", 4, two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat },
297748024e4aSbellard {"fmoveml", 4, two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "IiL8~s", mfloat },
297848024e4aSbellard /* FIXME: In the next instruction, we should only permit %dn if the
297948024e4aSbellard target is a single register. We should only permit %an if the
298048024e4aSbellard target is a single %fpiar. */
298148024e4aSbellard {"fmoveml", 4, two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*lL8", mfloat },
298248024e4aSbellard
298348024e4aSbellard {"fmovem", 4, two(0xF000, 0xD000), two(0xFFC0, 0xFF00), "IizsL3", cfloat },
298448024e4aSbellard {"fmovem", 4, two(0xF000, 0xD000), two(0xFFC0, 0xFF00), "Iizs#3", cfloat },
298548024e4aSbellard {"fmovem", 4, two(0xF000, 0xF000), two(0xFFC0, 0xFF00), "Ii#3ys", cfloat },
298648024e4aSbellard {"fmovem", 4, two(0xF000, 0xF000), two(0xFFC0, 0xFF00), "IiL3ys", cfloat },
298748024e4aSbellard
298848024e4aSbellard {"fmovem", 4, two(0xF020, 0xE000), two(0xF1F8, 0xFF00), "IdL3-s", mfloat },
298948024e4aSbellard {"fmovem", 4, two(0xF000, 0xF000), two(0xF1C0, 0xFF00), "Idl3&s", mfloat },
299048024e4aSbellard {"fmovem", 4, two(0xF018, 0xD000), two(0xF1F8, 0xFF00), "Id+sl3", mfloat },
299148024e4aSbellard {"fmovem", 4, two(0xF000, 0xD000), two(0xF1C0, 0xFF00), "Id&sl3", mfloat },
299248024e4aSbellard {"fmovem", 4, two(0xF020, 0xE000), two(0xF1F8, 0xFF00), "Id#3-s", mfloat },
299348024e4aSbellard {"fmovem", 4, two(0xF020, 0xE800), two(0xF1F8, 0xFF8F), "IiDk-s", mfloat },
299448024e4aSbellard {"fmovem", 4, two(0xF000, 0xF000), two(0xF1C0, 0xFF00), "Id#3&s", mfloat },
299548024e4aSbellard {"fmovem", 4, two(0xF000, 0xF800), two(0xF1C0, 0xFF8F), "IiDk&s", mfloat },
299648024e4aSbellard {"fmovem", 4, two(0xF018, 0xD000), two(0xF1F8, 0xFF00), "Id+s#3", mfloat },
299748024e4aSbellard {"fmovem", 4, two(0xF018, 0xD800), two(0xF1F8, 0xFF8F), "Ii+sDk", mfloat },
299848024e4aSbellard {"fmovem", 4, two(0xF000, 0xD000), two(0xF1C0, 0xFF00), "Id&s#3", mfloat },
299948024e4aSbellard {"fmovem", 4, two(0xF000, 0xD800), two(0xF1C0, 0xFF8F), "Ii&sDk", mfloat },
300048024e4aSbellard {"fmovem", 4, two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat },
300148024e4aSbellard {"fmovem", 4, two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*ss8", mfloat },
300248024e4aSbellard {"fmovem", 4, two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "IiL8~s", mfloat },
300348024e4aSbellard {"fmovem", 4, two(0xF000, 0x8000), two(0xF2C0, 0xE3FF), "Ii*sL8", mfloat },
300448024e4aSbellard
300548024e4aSbellard {"fmulb", 4, two(0xF000, 0x5823), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
300648024e4aSbellard {"fmulb", 4, two(0xF000, 0x5823), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
300748024e4aSbellard {"fmuld", 4, two(0xF000, 0x0023), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
300848024e4aSbellard {"fmuld", 4, two(0xF000, 0x5423), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
300948024e4aSbellard {"fmuld", 4, two(0xF000, 0x5423), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
301048024e4aSbellard {"fmull", 4, two(0xF000, 0x4023), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
301148024e4aSbellard {"fmull", 4, two(0xF000, 0x4023), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
301248024e4aSbellard {"fmulp", 4, two(0xF000, 0x4C23), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
301348024e4aSbellard {"fmuls", 4, two(0xF000, 0x4423), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
301448024e4aSbellard {"fmuls", 4, two(0xF000, 0x4423), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
301548024e4aSbellard {"fmulw", 4, two(0xF000, 0x5023), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
301648024e4aSbellard {"fmulw", 4, two(0xF000, 0x5023), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
301748024e4aSbellard {"fmulx", 4, two(0xF000, 0x0023), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
301848024e4aSbellard {"fmulx", 4, two(0xF000, 0x4823), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
301948024e4aSbellard
302048024e4aSbellard {"fsmulb", 4, two(0xF000, 0x5863), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
302148024e4aSbellard {"fsmulb", 4, two(0xF000, 0x5863), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
302248024e4aSbellard {"fsmuld", 4, two(0xF000, 0x0063), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
302348024e4aSbellard {"fsmuld", 4, two(0xF000, 0x5463), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
302448024e4aSbellard {"fsmuld", 4, two(0xF000, 0x5463), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
302548024e4aSbellard {"fsmull", 4, two(0xF000, 0x4063), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
302648024e4aSbellard {"fsmull", 4, two(0xF000, 0x4063), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
302748024e4aSbellard {"fsmulp", 4, two(0xF000, 0x4C63), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
302848024e4aSbellard {"fsmuls", 4, two(0xF000, 0x4463), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
302948024e4aSbellard {"fsmuls", 4, two(0xF000, 0x4463), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
303048024e4aSbellard {"fsmulw", 4, two(0xF000, 0x5063), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
303148024e4aSbellard {"fsmulw", 4, two(0xF000, 0x5063), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
303248024e4aSbellard {"fsmulx", 4, two(0xF000, 0x0063), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
303348024e4aSbellard {"fsmulx", 4, two(0xF000, 0x4863), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
303448024e4aSbellard
303548024e4aSbellard {"fdmulb", 4, two(0xF000, 0x5867), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
303648024e4aSbellard {"fdmulb", 4, two(0xF000, 0x5867), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
303748024e4aSbellard {"fdmuld", 4, two(0xF000, 0x0067), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
303848024e4aSbellard {"fdmuld", 4, two(0xF000, 0x5467), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
303948024e4aSbellard {"fdmuld", 4, two(0xF000, 0x5467), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
304048024e4aSbellard {"fdmull", 4, two(0xF000, 0x4067), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
304148024e4aSbellard {"fdmull", 4, two(0xF000, 0x4067), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
304248024e4aSbellard {"fdmulp", 4, two(0xF000, 0x4C67), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
304348024e4aSbellard {"fdmuls", 4, two(0xF000, 0x4467), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
304448024e4aSbellard {"fdmuls", 4, two(0xF000, 0x4467), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
304548024e4aSbellard {"fdmulw", 4, two(0xF000, 0x5067), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
304648024e4aSbellard {"fdmulw", 4, two(0xF000, 0x5067), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
304748024e4aSbellard {"fdmulx", 4, two(0xF000, 0x0067), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
304848024e4aSbellard {"fdmulx", 4, two(0xF000, 0x4867), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
304948024e4aSbellard
305048024e4aSbellard {"fnegb", 4, two(0xF000, 0x581A), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
305148024e4aSbellard {"fnegb", 4, two(0xF000, 0x581A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
305248024e4aSbellard {"fnegd", 4, two(0xF000, 0x001A), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
305348024e4aSbellard {"fnegd", 4, two(0xF000, 0x001A), two(0xF1C0, 0xE07F), "IiFt", cfloat },
305448024e4aSbellard {"fnegd", 4, two(0xF000, 0x541A), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
305548024e4aSbellard {"fnegd", 4, two(0xF000, 0x541A), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
305648024e4aSbellard {"fnegl", 4, two(0xF000, 0x401A), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
305748024e4aSbellard {"fnegl", 4, two(0xF000, 0x401A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
305848024e4aSbellard {"fnegp", 4, two(0xF000, 0x4C1A), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
305948024e4aSbellard {"fnegs", 4, two(0xF000, 0x441A), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
306048024e4aSbellard {"fnegs", 4, two(0xF000, 0x441A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
306148024e4aSbellard {"fnegw", 4, two(0xF000, 0x501A), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
306248024e4aSbellard {"fnegw", 4, two(0xF000, 0x501A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
306348024e4aSbellard {"fnegx", 4, two(0xF000, 0x001A), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
306448024e4aSbellard {"fnegx", 4, two(0xF000, 0x481A), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
306548024e4aSbellard {"fnegx", 4, two(0xF000, 0x001A), two(0xF1C0, 0xE07F), "IiFt", mfloat },
306648024e4aSbellard
306748024e4aSbellard {"fsnegb", 4, two(0xF000, 0x585A), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
306848024e4aSbellard {"fsnegb", 4, two(0xF000, 0x585A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
306948024e4aSbellard {"fsnegd", 4, two(0xF000, 0x005A), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
307048024e4aSbellard {"fsnegd", 4, two(0xF000, 0x005A), two(0xF1C0, 0xE07F), "IiFt", cfloat },
307148024e4aSbellard {"fsnegd", 4, two(0xF000, 0x545A), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
307248024e4aSbellard {"fsnegd", 4, two(0xF000, 0x545A), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
307348024e4aSbellard {"fsnegl", 4, two(0xF000, 0x405A), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
307448024e4aSbellard {"fsnegl", 4, two(0xF000, 0x405A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
307548024e4aSbellard {"fsnegp", 4, two(0xF000, 0x4C5A), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
307648024e4aSbellard {"fsnegs", 4, two(0xF000, 0x445A), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
307748024e4aSbellard {"fsnegs", 4, two(0xF000, 0x445A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
307848024e4aSbellard {"fsnegw", 4, two(0xF000, 0x505A), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
307948024e4aSbellard {"fsnegw", 4, two(0xF000, 0x505A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
308048024e4aSbellard {"fsnegx", 4, two(0xF000, 0x005A), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
308148024e4aSbellard {"fsnegx", 4, two(0xF000, 0x485A), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
308248024e4aSbellard {"fsnegx", 4, two(0xF000, 0x005A), two(0xF1C0, 0xE07F), "IiFt", m68040up },
308348024e4aSbellard
308448024e4aSbellard {"fdnegb", 4, two(0xF000, 0x585E), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
308548024e4aSbellard {"fdnegb", 4, two(0xF000, 0x585E), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
308648024e4aSbellard {"fdnegd", 4, two(0xF000, 0x005E), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
308748024e4aSbellard {"fdnegd", 4, two(0xF000, 0x005E), two(0xF1C0, 0xE07F), "IiFt", cfloat },
308848024e4aSbellard {"fdnegd", 4, two(0xF000, 0x545E), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
308948024e4aSbellard {"fdnegd", 4, two(0xF000, 0x545E), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
309048024e4aSbellard {"fdnegl", 4, two(0xF000, 0x405E), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
309148024e4aSbellard {"fdnegl", 4, two(0xF000, 0x405E), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
309248024e4aSbellard {"fdnegp", 4, two(0xF000, 0x4C5E), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
309348024e4aSbellard {"fdnegs", 4, two(0xF000, 0x445E), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
309448024e4aSbellard {"fdnegs", 4, two(0xF000, 0x445E), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
309548024e4aSbellard {"fdnegw", 4, two(0xF000, 0x505E), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
309648024e4aSbellard {"fdnegw", 4, two(0xF000, 0x505E), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
309748024e4aSbellard {"fdnegx", 4, two(0xF000, 0x005E), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
309848024e4aSbellard {"fdnegx", 4, two(0xF000, 0x485E), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
309948024e4aSbellard {"fdnegx", 4, two(0xF000, 0x005E), two(0xF1C0, 0xE07F), "IiFt", m68040up },
310048024e4aSbellard
310148024e4aSbellard {"fnop", 4, two(0xF280, 0x0000), two(0xFFFF, 0xFFFF), "Ii", mfloat | cfloat },
310248024e4aSbellard
310348024e4aSbellard {"fremb", 4, two(0xF000, 0x5825), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
310448024e4aSbellard {"fremd", 4, two(0xF000, 0x5425), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
310548024e4aSbellard {"freml", 4, two(0xF000, 0x4025), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
310648024e4aSbellard {"fremp", 4, two(0xF000, 0x4C25), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
310748024e4aSbellard {"frems", 4, two(0xF000, 0x4425), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
310848024e4aSbellard {"fremw", 4, two(0xF000, 0x5025), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
310948024e4aSbellard {"fremx", 4, two(0xF000, 0x0025), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
311048024e4aSbellard {"fremx", 4, two(0xF000, 0x4825), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
311148024e4aSbellard
311248024e4aSbellard {"frestore", 2, one(0xF140), one(0xF1C0), "Id<s", mfloat },
311348024e4aSbellard {"frestore", 2, one(0xF140), one(0xF1C0), "Idys", cfloat },
311448024e4aSbellard
311548024e4aSbellard {"fsave", 2, one(0xF100), one(0xF1C0), "Id>s", mfloat },
311648024e4aSbellard {"fsave", 2, one(0xF100), one(0xF1C0), "Idzs", cfloat },
311748024e4aSbellard
311848024e4aSbellard {"fscaleb", 4, two(0xF000, 0x5826), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
311948024e4aSbellard {"fscaled", 4, two(0xF000, 0x5426), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
312048024e4aSbellard {"fscalel", 4, two(0xF000, 0x4026), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
312148024e4aSbellard {"fscalep", 4, two(0xF000, 0x4C26), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
312248024e4aSbellard {"fscales", 4, two(0xF000, 0x4426), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
312348024e4aSbellard {"fscalew", 4, two(0xF000, 0x5026), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
312448024e4aSbellard {"fscalex", 4, two(0xF000, 0x0026), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
312548024e4aSbellard {"fscalex", 4, two(0xF000, 0x4826), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
312648024e4aSbellard
312748024e4aSbellard /* $ is necessary to prevent the assembler from using PC-relative.
312848024e4aSbellard If @ were used, "label: fseq label" could produce "ftrapeq", 2,
312948024e4aSbellard because "label" became "pc@label". */
313048024e4aSbellard {"fseq", 4, two(0xF040, 0x0001), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
313148024e4aSbellard {"fsf", 4, two(0xF040, 0x0000), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
313248024e4aSbellard {"fsge", 4, two(0xF040, 0x0013), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
313348024e4aSbellard {"fsgl", 4, two(0xF040, 0x0016), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
313448024e4aSbellard {"fsgle", 4, two(0xF040, 0x0017), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
313548024e4aSbellard {"fsgt", 4, two(0xF040, 0x0012), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
313648024e4aSbellard {"fsle", 4, two(0xF040, 0x0015), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
313748024e4aSbellard {"fslt", 4, two(0xF040, 0x0014), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
313848024e4aSbellard {"fsne", 4, two(0xF040, 0x000E), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
313948024e4aSbellard {"fsnge", 4, two(0xF040, 0x001C), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
314048024e4aSbellard {"fsngl", 4, two(0xF040, 0x0019), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
314148024e4aSbellard {"fsngle", 4, two(0xF040, 0x0018), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
314248024e4aSbellard {"fsngt", 4, two(0xF040, 0x001D), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
314348024e4aSbellard {"fsnle", 4, two(0xF040, 0x001A), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
314448024e4aSbellard {"fsnlt", 4, two(0xF040, 0x001B), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
314548024e4aSbellard {"fsoge", 4, two(0xF040, 0x0003), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
314648024e4aSbellard {"fsogl", 4, two(0xF040, 0x0006), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
314748024e4aSbellard {"fsogt", 4, two(0xF040, 0x0002), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
314848024e4aSbellard {"fsole", 4, two(0xF040, 0x0005), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
314948024e4aSbellard {"fsolt", 4, two(0xF040, 0x0004), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
315048024e4aSbellard {"fsor", 4, two(0xF040, 0x0007), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
315148024e4aSbellard {"fsseq", 4, two(0xF040, 0x0011), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
315248024e4aSbellard {"fssf", 4, two(0xF040, 0x0010), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
315348024e4aSbellard {"fssne", 4, two(0xF040, 0x001E), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
315448024e4aSbellard {"fsst", 4, two(0xF040, 0x001F), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
315548024e4aSbellard {"fst", 4, two(0xF040, 0x000F), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
315648024e4aSbellard {"fsueq", 4, two(0xF040, 0x0009), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
315748024e4aSbellard {"fsuge", 4, two(0xF040, 0x000B), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
315848024e4aSbellard {"fsugt", 4, two(0xF040, 0x000A), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
315948024e4aSbellard {"fsule", 4, two(0xF040, 0x000D), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
316048024e4aSbellard {"fsult", 4, two(0xF040, 0x000C), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
316148024e4aSbellard {"fsun", 4, two(0xF040, 0x0008), two(0xF1C0, 0xFFFF), "Ii$s", mfloat },
316248024e4aSbellard
316348024e4aSbellard {"fsgldivb", 4, two(0xF000, 0x5824), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
316448024e4aSbellard {"fsgldivd", 4, two(0xF000, 0x5424), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
316548024e4aSbellard {"fsgldivl", 4, two(0xF000, 0x4024), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
316648024e4aSbellard {"fsgldivp", 4, two(0xF000, 0x4C24), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
316748024e4aSbellard {"fsgldivs", 4, two(0xF000, 0x4424), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
316848024e4aSbellard {"fsgldivw", 4, two(0xF000, 0x5024), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
316948024e4aSbellard {"fsgldivx", 4, two(0xF000, 0x0024), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
317048024e4aSbellard {"fsgldivx", 4, two(0xF000, 0x4824), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
317148024e4aSbellard {"fsgldivx", 4, two(0xF000, 0x0024), two(0xF1C0, 0xE07F), "IiFt", mfloat },
317248024e4aSbellard
317348024e4aSbellard {"fsglmulb", 4, two(0xF000, 0x5827), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
317448024e4aSbellard {"fsglmuld", 4, two(0xF000, 0x5427), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
317548024e4aSbellard {"fsglmull", 4, two(0xF000, 0x4027), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
317648024e4aSbellard {"fsglmulp", 4, two(0xF000, 0x4C27), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
317748024e4aSbellard {"fsglmuls", 4, two(0xF000, 0x4427), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
317848024e4aSbellard {"fsglmulw", 4, two(0xF000, 0x5027), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
317948024e4aSbellard {"fsglmulx", 4, two(0xF000, 0x0027), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
318048024e4aSbellard {"fsglmulx", 4, two(0xF000, 0x4827), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
318148024e4aSbellard {"fsglmulx", 4, two(0xF000, 0x0027), two(0xF1C0, 0xE07F), "IiFt", mfloat },
318248024e4aSbellard
318348024e4aSbellard {"fsinb", 4, two(0xF000, 0x580E), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
318448024e4aSbellard {"fsind", 4, two(0xF000, 0x540E), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
318548024e4aSbellard {"fsinl", 4, two(0xF000, 0x400E), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
318648024e4aSbellard {"fsinp", 4, two(0xF000, 0x4C0E), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
318748024e4aSbellard {"fsins", 4, two(0xF000, 0x440E), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
318848024e4aSbellard {"fsinw", 4, two(0xF000, 0x500E), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
318948024e4aSbellard {"fsinx", 4, two(0xF000, 0x000E), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
319048024e4aSbellard {"fsinx", 4, two(0xF000, 0x480E), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
319148024e4aSbellard {"fsinx", 4, two(0xF000, 0x000E), two(0xF1C0, 0xE07F), "IiFt", mfloat },
319248024e4aSbellard
319348024e4aSbellard {"fsincosb", 4, two(0xF000, 0x5830), two(0xF1C0, 0xFC78), "Ii;bF3F7", mfloat },
319448024e4aSbellard {"fsincosd", 4, two(0xF000, 0x5430), two(0xF1C0, 0xFC78), "Ii;FF3F7", mfloat },
319548024e4aSbellard {"fsincosl", 4, two(0xF000, 0x4030), two(0xF1C0, 0xFC78), "Ii;lF3F7", mfloat },
319648024e4aSbellard {"fsincosp", 4, two(0xF000, 0x4C30), two(0xF1C0, 0xFC78), "Ii;pF3F7", mfloat },
319748024e4aSbellard {"fsincoss", 4, two(0xF000, 0x4430), two(0xF1C0, 0xFC78), "Ii;fF3F7", mfloat },
319848024e4aSbellard {"fsincosw", 4, two(0xF000, 0x5030), two(0xF1C0, 0xFC78), "Ii;wF3F7", mfloat },
319948024e4aSbellard {"fsincosx", 4, two(0xF000, 0x0030), two(0xF1C0, 0xE078), "IiF8F3F7", mfloat },
320048024e4aSbellard {"fsincosx", 4, two(0xF000, 0x4830), two(0xF1C0, 0xFC78), "Ii;xF3F7", mfloat },
320148024e4aSbellard
320248024e4aSbellard {"fsinhb", 4, two(0xF000, 0x5802), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
320348024e4aSbellard {"fsinhd", 4, two(0xF000, 0x5402), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
320448024e4aSbellard {"fsinhl", 4, two(0xF000, 0x4002), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
320548024e4aSbellard {"fsinhp", 4, two(0xF000, 0x4C02), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
320648024e4aSbellard {"fsinhs", 4, two(0xF000, 0x4402), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
320748024e4aSbellard {"fsinhw", 4, two(0xF000, 0x5002), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
320848024e4aSbellard {"fsinhx", 4, two(0xF000, 0x0002), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
320948024e4aSbellard {"fsinhx", 4, two(0xF000, 0x4802), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
321048024e4aSbellard {"fsinhx", 4, two(0xF000, 0x0002), two(0xF1C0, 0xE07F), "IiFt", mfloat },
321148024e4aSbellard
321248024e4aSbellard {"fsqrtb", 4, two(0xF000, 0x5804), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
321348024e4aSbellard {"fsqrtb", 4, two(0xF000, 0x5804), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
321448024e4aSbellard {"fsqrtd", 4, two(0xF000, 0x0004), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
321548024e4aSbellard {"fsqrtd", 4, two(0xF000, 0x0004), two(0xF1C0, 0xE07F), "IiFt", cfloat },
321648024e4aSbellard {"fsqrtd", 4, two(0xF000, 0x5404), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
321748024e4aSbellard {"fsqrtd", 4, two(0xF000, 0x5404), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
321848024e4aSbellard {"fsqrtl", 4, two(0xF000, 0x4004), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
321948024e4aSbellard {"fsqrtl", 4, two(0xF000, 0x4004), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
322048024e4aSbellard {"fsqrtp", 4, two(0xF000, 0x4C04), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
322148024e4aSbellard {"fsqrts", 4, two(0xF000, 0x4404), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
322248024e4aSbellard {"fsqrts", 4, two(0xF000, 0x4404), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
322348024e4aSbellard {"fsqrtw", 4, two(0xF000, 0x5004), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
322448024e4aSbellard {"fsqrtw", 4, two(0xF000, 0x5004), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
322548024e4aSbellard {"fsqrtx", 4, two(0xF000, 0x0004), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
322648024e4aSbellard {"fsqrtx", 4, two(0xF000, 0x4804), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
322748024e4aSbellard {"fsqrtx", 4, two(0xF000, 0x0004), two(0xF1C0, 0xE07F), "IiFt", mfloat },
322848024e4aSbellard
322948024e4aSbellard {"fssqrtb", 4, two(0xF000, 0x5841), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
323048024e4aSbellard {"fssqrtb", 4, two(0xF000, 0x5841), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
323148024e4aSbellard {"fssqrtd", 4, two(0xF000, 0x0041), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
323248024e4aSbellard {"fssqrtd", 4, two(0xF000, 0x0041), two(0xF1C0, 0xE07F), "IiFt", cfloat },
323348024e4aSbellard {"fssqrtd", 4, two(0xF000, 0x5441), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
323448024e4aSbellard {"fssqrtd", 4, two(0xF000, 0x5441), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
323548024e4aSbellard {"fssqrtl", 4, two(0xF000, 0x4041), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
323648024e4aSbellard {"fssqrtl", 4, two(0xF000, 0x4041), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
323748024e4aSbellard {"fssqrtp", 4, two(0xF000, 0x4C41), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
323848024e4aSbellard {"fssqrts", 4, two(0xF000, 0x4441), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
323948024e4aSbellard {"fssqrts", 4, two(0xF000, 0x4441), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
324048024e4aSbellard {"fssqrtw", 4, two(0xF000, 0x5041), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
324148024e4aSbellard {"fssqrtw", 4, two(0xF000, 0x5041), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
324248024e4aSbellard {"fssqrtx", 4, two(0xF000, 0x0041), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
324348024e4aSbellard {"fssqrtx", 4, two(0xF000, 0x4841), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
324448024e4aSbellard {"fssqrtx", 4, two(0xF000, 0x0041), two(0xF1C0, 0xE07F), "IiFt", m68040up },
324548024e4aSbellard
324648024e4aSbellard {"fdsqrtb", 4, two(0xF000, 0x5845), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
324748024e4aSbellard {"fdsqrtb", 4, two(0xF000, 0x5845), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
324848024e4aSbellard {"fdsqrtd", 4, two(0xF000, 0x0045), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
324948024e4aSbellard {"fdsqrtd", 4, two(0xF000, 0x0045), two(0xF1C0, 0xE07F), "IiFt", cfloat },
325048024e4aSbellard {"fdsqrtd", 4, two(0xF000, 0x5445), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
325148024e4aSbellard {"fdsqrtl", 4, two(0xF000, 0x4045), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
325248024e4aSbellard {"fdsqrtl", 4, two(0xF000, 0x4045), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
325348024e4aSbellard {"fdsqrtp", 4, two(0xF000, 0x4C45), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
325448024e4aSbellard {"fdsqrts", 4, two(0xF000, 0x4445), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
325548024e4aSbellard {"fdsqrts", 4, two(0xF000, 0x4445), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
325648024e4aSbellard {"fdsqrtw", 4, two(0xF000, 0x5045), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
325748024e4aSbellard {"fdsqrtw", 4, two(0xF000, 0x5045), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
325848024e4aSbellard {"fdsqrtx", 4, two(0xF000, 0x0045), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
325948024e4aSbellard {"fdsqrtx", 4, two(0xF000, 0x4845), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
326048024e4aSbellard {"fdsqrtx", 4, two(0xF000, 0x0045), two(0xF1C0, 0xE07F), "IiFt", m68040up },
326148024e4aSbellard
326248024e4aSbellard {"fsubb", 4, two(0xF000, 0x5828), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
326348024e4aSbellard {"fsubb", 4, two(0xF000, 0x5828), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
326448024e4aSbellard {"fsubd", 4, two(0xF000, 0x0028), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
326548024e4aSbellard {"fsubd", 4, two(0xF000, 0x5428), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
326648024e4aSbellard {"fsubd", 4, two(0xF000, 0x5428), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
326748024e4aSbellard {"fsubl", 4, two(0xF000, 0x4028), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
326848024e4aSbellard {"fsubl", 4, two(0xF000, 0x4028), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
326948024e4aSbellard {"fsubp", 4, two(0xF000, 0x4C28), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
327048024e4aSbellard {"fsubs", 4, two(0xF000, 0x4428), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
327148024e4aSbellard {"fsubs", 4, two(0xF000, 0x4428), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
327248024e4aSbellard {"fsubw", 4, two(0xF000, 0x5028), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
327348024e4aSbellard {"fsubw", 4, two(0xF000, 0x5028), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
327448024e4aSbellard {"fsubx", 4, two(0xF000, 0x0028), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
327548024e4aSbellard {"fsubx", 4, two(0xF000, 0x4828), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
327648024e4aSbellard {"fsubx", 4, two(0xF000, 0x0028), two(0xF1C0, 0xE07F), "IiFt", mfloat },
327748024e4aSbellard
327848024e4aSbellard {"fssubb", 4, two(0xF000, 0x5828), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
327948024e4aSbellard {"fssubb", 4, two(0xF000, 0x5868), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
328048024e4aSbellard {"fssubd", 4, two(0xF000, 0x0068), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
328148024e4aSbellard {"fssubd", 4, two(0xF000, 0x5468), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
328248024e4aSbellard {"fssubd", 4, two(0xF000, 0x5468), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
328348024e4aSbellard {"fssubl", 4, two(0xF000, 0x4068), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
328448024e4aSbellard {"fssubl", 4, two(0xF000, 0x4068), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
328548024e4aSbellard {"fssubp", 4, two(0xF000, 0x4C68), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
328648024e4aSbellard {"fssubs", 4, two(0xF000, 0x4468), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
328748024e4aSbellard {"fssubs", 4, two(0xF000, 0x4468), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
328848024e4aSbellard {"fssubw", 4, two(0xF000, 0x5068), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
328948024e4aSbellard {"fssubw", 4, two(0xF000, 0x5068), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
329048024e4aSbellard {"fssubx", 4, two(0xF000, 0x0068), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
329148024e4aSbellard {"fssubx", 4, two(0xF000, 0x4868), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
329248024e4aSbellard {"fssubx", 4, two(0xF000, 0x0068), two(0xF1C0, 0xE07F), "IiFt", m68040up },
329348024e4aSbellard
329448024e4aSbellard {"fdsubb", 4, two(0xF000, 0x586A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
329548024e4aSbellard {"fdsubb", 4, two(0xF000, 0x586c), two(0xF1C0, 0xFC7F), "Ii;bF7", m68040up },
329648024e4aSbellard {"fdsubd", 4, two(0xF000, 0x006A), two(0xF1C0, 0xE07F), "IiF8F7", cfloat },
329748024e4aSbellard {"fdsubd", 4, two(0xF000, 0x546A), two(0xF1C0, 0xFC7F), "IiwsF7", cfloat },
329848024e4aSbellard {"fdsubd", 4, two(0xF000, 0x546c), two(0xF1C0, 0xFC7F), "Ii;FF7", m68040up },
329948024e4aSbellard {"fdsubl", 4, two(0xF000, 0x406A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
330048024e4aSbellard {"fdsubl", 4, two(0xF000, 0x406c), two(0xF1C0, 0xFC7F), "Ii;lF7", m68040up },
330148024e4aSbellard {"fdsubp", 4, two(0xF000, 0x4C6c), two(0xF1C0, 0xFC7F), "Ii;pF7", m68040up },
330248024e4aSbellard {"fdsubs", 4, two(0xF000, 0x446A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
330348024e4aSbellard {"fdsubs", 4, two(0xF000, 0x446c), two(0xF1C0, 0xFC7F), "Ii;fF7", m68040up },
330448024e4aSbellard {"fdsubw", 4, two(0xF000, 0x506A), two(0xF1C0, 0xFC7F), "IibsF7", cfloat },
330548024e4aSbellard {"fdsubw", 4, two(0xF000, 0x506c), two(0xF1C0, 0xFC7F), "Ii;wF7", m68040up },
330648024e4aSbellard {"fdsubx", 4, two(0xF000, 0x006c), two(0xF1C0, 0xE07F), "IiF8F7", m68040up },
330748024e4aSbellard {"fdsubx", 4, two(0xF000, 0x486c), two(0xF1C0, 0xFC7F), "Ii;xF7", m68040up },
330848024e4aSbellard {"fdsubx", 4, two(0xF000, 0x006c), two(0xF1C0, 0xE07F), "IiFt", m68040up },
330948024e4aSbellard
331048024e4aSbellard {"ftanb", 4, two(0xF000, 0x580F), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
331148024e4aSbellard {"ftand", 4, two(0xF000, 0x540F), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
331248024e4aSbellard {"ftanl", 4, two(0xF000, 0x400F), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
331348024e4aSbellard {"ftanp", 4, two(0xF000, 0x4C0F), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
331448024e4aSbellard {"ftans", 4, two(0xF000, 0x440F), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
331548024e4aSbellard {"ftanw", 4, two(0xF000, 0x500F), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
331648024e4aSbellard {"ftanx", 4, two(0xF000, 0x000F), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
331748024e4aSbellard {"ftanx", 4, two(0xF000, 0x480F), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
331848024e4aSbellard {"ftanx", 4, two(0xF000, 0x000F), two(0xF1C0, 0xE07F), "IiFt", mfloat },
331948024e4aSbellard
332048024e4aSbellard {"ftanhb", 4, two(0xF000, 0x5809), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
332148024e4aSbellard {"ftanhd", 4, two(0xF000, 0x5409), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
332248024e4aSbellard {"ftanhl", 4, two(0xF000, 0x4009), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
332348024e4aSbellard {"ftanhp", 4, two(0xF000, 0x4C09), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
332448024e4aSbellard {"ftanhs", 4, two(0xF000, 0x4409), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
332548024e4aSbellard {"ftanhw", 4, two(0xF000, 0x5009), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
332648024e4aSbellard {"ftanhx", 4, two(0xF000, 0x0009), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
332748024e4aSbellard {"ftanhx", 4, two(0xF000, 0x4809), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
332848024e4aSbellard {"ftanhx", 4, two(0xF000, 0x0009), two(0xF1C0, 0xE07F), "IiFt", mfloat },
332948024e4aSbellard
333048024e4aSbellard {"ftentoxb", 4, two(0xF000, 0x5812), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
333148024e4aSbellard {"ftentoxd", 4, two(0xF000, 0x5412), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
333248024e4aSbellard {"ftentoxl", 4, two(0xF000, 0x4012), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
333348024e4aSbellard {"ftentoxp", 4, two(0xF000, 0x4C12), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
333448024e4aSbellard {"ftentoxs", 4, two(0xF000, 0x4412), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
333548024e4aSbellard {"ftentoxw", 4, two(0xF000, 0x5012), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
333648024e4aSbellard {"ftentoxx", 4, two(0xF000, 0x0012), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
333748024e4aSbellard {"ftentoxx", 4, two(0xF000, 0x4812), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
333848024e4aSbellard {"ftentoxx", 4, two(0xF000, 0x0012), two(0xF1C0, 0xE07F), "IiFt", mfloat },
333948024e4aSbellard
334048024e4aSbellard {"ftrapeq", 4, two(0xF07C, 0x0001), two(0xF1FF, 0xFFFF), "Ii", mfloat },
334148024e4aSbellard {"ftrapf", 4, two(0xF07C, 0x0000), two(0xF1FF, 0xFFFF), "Ii", mfloat },
334248024e4aSbellard {"ftrapge", 4, two(0xF07C, 0x0013), two(0xF1FF, 0xFFFF), "Ii", mfloat },
334348024e4aSbellard {"ftrapgl", 4, two(0xF07C, 0x0016), two(0xF1FF, 0xFFFF), "Ii", mfloat },
334448024e4aSbellard {"ftrapgle", 4, two(0xF07C, 0x0017), two(0xF1FF, 0xFFFF), "Ii", mfloat },
334548024e4aSbellard {"ftrapgt", 4, two(0xF07C, 0x0012), two(0xF1FF, 0xFFFF), "Ii", mfloat },
334648024e4aSbellard {"ftraple", 4, two(0xF07C, 0x0015), two(0xF1FF, 0xFFFF), "Ii", mfloat },
334748024e4aSbellard {"ftraplt", 4, two(0xF07C, 0x0014), two(0xF1FF, 0xFFFF), "Ii", mfloat },
334848024e4aSbellard {"ftrapne", 4, two(0xF07C, 0x000E), two(0xF1FF, 0xFFFF), "Ii", mfloat },
334948024e4aSbellard {"ftrapnge", 4, two(0xF07C, 0x001C), two(0xF1FF, 0xFFFF), "Ii", mfloat },
335048024e4aSbellard {"ftrapngl", 4, two(0xF07C, 0x0019), two(0xF1FF, 0xFFFF), "Ii", mfloat },
335148024e4aSbellard {"ftrapngle", 4,two(0xF07C, 0x0018), two(0xF1FF, 0xFFFF), "Ii", mfloat },
335248024e4aSbellard {"ftrapngt", 4, two(0xF07C, 0x001D), two(0xF1FF, 0xFFFF), "Ii", mfloat },
335348024e4aSbellard {"ftrapnle", 4, two(0xF07C, 0x001A), two(0xF1FF, 0xFFFF), "Ii", mfloat },
335448024e4aSbellard {"ftrapnlt", 4, two(0xF07C, 0x001B), two(0xF1FF, 0xFFFF), "Ii", mfloat },
335548024e4aSbellard {"ftrapoge", 4, two(0xF07C, 0x0003), two(0xF1FF, 0xFFFF), "Ii", mfloat },
335648024e4aSbellard {"ftrapogl", 4, two(0xF07C, 0x0006), two(0xF1FF, 0xFFFF), "Ii", mfloat },
335748024e4aSbellard {"ftrapogt", 4, two(0xF07C, 0x0002), two(0xF1FF, 0xFFFF), "Ii", mfloat },
335848024e4aSbellard {"ftrapole", 4, two(0xF07C, 0x0005), two(0xF1FF, 0xFFFF), "Ii", mfloat },
335948024e4aSbellard {"ftrapolt", 4, two(0xF07C, 0x0004), two(0xF1FF, 0xFFFF), "Ii", mfloat },
336048024e4aSbellard {"ftrapor", 4, two(0xF07C, 0x0007), two(0xF1FF, 0xFFFF), "Ii", mfloat },
336148024e4aSbellard {"ftrapseq", 4, two(0xF07C, 0x0011), two(0xF1FF, 0xFFFF), "Ii", mfloat },
336248024e4aSbellard {"ftrapsf", 4, two(0xF07C, 0x0010), two(0xF1FF, 0xFFFF), "Ii", mfloat },
336348024e4aSbellard {"ftrapsne", 4, two(0xF07C, 0x001E), two(0xF1FF, 0xFFFF), "Ii", mfloat },
336448024e4aSbellard {"ftrapst", 4, two(0xF07C, 0x001F), two(0xF1FF, 0xFFFF), "Ii", mfloat },
336548024e4aSbellard {"ftrapt", 4, two(0xF07C, 0x000F), two(0xF1FF, 0xFFFF), "Ii", mfloat },
336648024e4aSbellard {"ftrapueq", 4, two(0xF07C, 0x0009), two(0xF1FF, 0xFFFF), "Ii", mfloat },
336748024e4aSbellard {"ftrapuge", 4, two(0xF07C, 0x000B), two(0xF1FF, 0xFFFF), "Ii", mfloat },
336848024e4aSbellard {"ftrapugt", 4, two(0xF07C, 0x000A), two(0xF1FF, 0xFFFF), "Ii", mfloat },
336948024e4aSbellard {"ftrapule", 4, two(0xF07C, 0x000D), two(0xF1FF, 0xFFFF), "Ii", mfloat },
337048024e4aSbellard {"ftrapult", 4, two(0xF07C, 0x000C), two(0xF1FF, 0xFFFF), "Ii", mfloat },
337148024e4aSbellard {"ftrapun", 4, two(0xF07C, 0x0008), two(0xF1FF, 0xFFFF), "Ii", mfloat },
337248024e4aSbellard
337348024e4aSbellard {"ftrapeqw", 4, two(0xF07A, 0x0001), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
337448024e4aSbellard {"ftrapfw", 4, two(0xF07A, 0x0000), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
337548024e4aSbellard {"ftrapgew", 4, two(0xF07A, 0x0013), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
337648024e4aSbellard {"ftrapglw", 4, two(0xF07A, 0x0016), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
337748024e4aSbellard {"ftrapglew", 4,two(0xF07A, 0x0017), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
337848024e4aSbellard {"ftrapgtw", 4, two(0xF07A, 0x0012), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
337948024e4aSbellard {"ftraplew", 4, two(0xF07A, 0x0015), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
338048024e4aSbellard {"ftrapltw", 4, two(0xF07A, 0x0014), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
338148024e4aSbellard {"ftrapnew", 4, two(0xF07A, 0x000E), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
338248024e4aSbellard {"ftrapngew", 4,two(0xF07A, 0x001C), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
338348024e4aSbellard {"ftrapnglw", 4,two(0xF07A, 0x0019), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
338448024e4aSbellard {"ftrapnglew", 4,two(0xF07A, 0x0018), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
338548024e4aSbellard {"ftrapngtw", 4,two(0xF07A, 0x001D), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
338648024e4aSbellard {"ftrapnlew", 4,two(0xF07A, 0x001A), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
338748024e4aSbellard {"ftrapnltw", 4,two(0xF07A, 0x001B), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
338848024e4aSbellard {"ftrapogew", 4,two(0xF07A, 0x0003), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
338948024e4aSbellard {"ftrapoglw", 4,two(0xF07A, 0x0006), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
339048024e4aSbellard {"ftrapogtw", 4,two(0xF07A, 0x0002), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
339148024e4aSbellard {"ftrapolew", 4,two(0xF07A, 0x0005), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
339248024e4aSbellard {"ftrapoltw", 4,two(0xF07A, 0x0004), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
339348024e4aSbellard {"ftraporw", 4, two(0xF07A, 0x0007), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
339448024e4aSbellard {"ftrapseqw", 4,two(0xF07A, 0x0011), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
339548024e4aSbellard {"ftrapsfw", 4, two(0xF07A, 0x0010), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
339648024e4aSbellard {"ftrapsnew", 4,two(0xF07A, 0x001E), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
339748024e4aSbellard {"ftrapstw", 4, two(0xF07A, 0x001F), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
339848024e4aSbellard {"ftraptw", 4, two(0xF07A, 0x000F), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
339948024e4aSbellard {"ftrapueqw", 4,two(0xF07A, 0x0009), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
340048024e4aSbellard {"ftrapugew", 4,two(0xF07A, 0x000B), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
340148024e4aSbellard {"ftrapugtw", 4,two(0xF07A, 0x000A), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
340248024e4aSbellard {"ftrapulew", 4,two(0xF07A, 0x000D), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
340348024e4aSbellard {"ftrapultw", 4,two(0xF07A, 0x000C), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
340448024e4aSbellard {"ftrapunw", 4, two(0xF07A, 0x0008), two(0xF1FF, 0xFFFF), "Ii^w", mfloat },
340548024e4aSbellard
340648024e4aSbellard {"ftrapeql", 4, two(0xF07B, 0x0001), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
340748024e4aSbellard {"ftrapfl", 4, two(0xF07B, 0x0000), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
340848024e4aSbellard {"ftrapgel", 4, two(0xF07B, 0x0013), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
340948024e4aSbellard {"ftrapgll", 4, two(0xF07B, 0x0016), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
341048024e4aSbellard {"ftrapglel", 4,two(0xF07B, 0x0017), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
341148024e4aSbellard {"ftrapgtl", 4, two(0xF07B, 0x0012), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
341248024e4aSbellard {"ftraplel", 4, two(0xF07B, 0x0015), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
341348024e4aSbellard {"ftrapltl", 4, two(0xF07B, 0x0014), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
341448024e4aSbellard {"ftrapnel", 4, two(0xF07B, 0x000E), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
341548024e4aSbellard {"ftrapngel", 4,two(0xF07B, 0x001C), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
341648024e4aSbellard {"ftrapngll", 4,two(0xF07B, 0x0019), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
341748024e4aSbellard {"ftrapnglel", 4,two(0xF07B, 0x0018), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
341848024e4aSbellard {"ftrapngtl", 4,two(0xF07B, 0x001D), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
341948024e4aSbellard {"ftrapnlel", 4,two(0xF07B, 0x001A), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
342048024e4aSbellard {"ftrapnltl", 4,two(0xF07B, 0x001B), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
342148024e4aSbellard {"ftrapogel", 4,two(0xF07B, 0x0003), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
342248024e4aSbellard {"ftrapogll", 4,two(0xF07B, 0x0006), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
342348024e4aSbellard {"ftrapogtl", 4,two(0xF07B, 0x0002), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
342448024e4aSbellard {"ftrapolel", 4,two(0xF07B, 0x0005), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
342548024e4aSbellard {"ftrapoltl", 4,two(0xF07B, 0x0004), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
342648024e4aSbellard {"ftraporl", 4, two(0xF07B, 0x0007), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
342748024e4aSbellard {"ftrapseql", 4,two(0xF07B, 0x0011), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
342848024e4aSbellard {"ftrapsfl", 4, two(0xF07B, 0x0010), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
342948024e4aSbellard {"ftrapsnel", 4,two(0xF07B, 0x001E), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
343048024e4aSbellard {"ftrapstl", 4, two(0xF07B, 0x001F), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
343148024e4aSbellard {"ftraptl", 4, two(0xF07B, 0x000F), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
343248024e4aSbellard {"ftrapueql", 4,two(0xF07B, 0x0009), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
343348024e4aSbellard {"ftrapugel", 4,two(0xF07B, 0x000B), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
343448024e4aSbellard {"ftrapugtl", 4,two(0xF07B, 0x000A), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
343548024e4aSbellard {"ftrapulel", 4,two(0xF07B, 0x000D), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
343648024e4aSbellard {"ftrapultl", 4,two(0xF07B, 0x000C), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
343748024e4aSbellard {"ftrapunl", 4, two(0xF07B, 0x0008), two(0xF1FF, 0xFFFF), "Ii^l", mfloat },
343848024e4aSbellard
343948024e4aSbellard {"ftstb", 4, two(0xF000, 0x583A), two(0xF1C0, 0xFC7F), "Ii;b", mfloat },
344048024e4aSbellard {"ftstb", 4, two(0xF000, 0x583A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
344148024e4aSbellard {"ftstd", 4, two(0xF000, 0x003A), two(0xF1C0, 0xE07F), "IiF8", cfloat },
344248024e4aSbellard {"ftstd", 4, two(0xF000, 0x543A), two(0xF1C0, 0xFC7F), "Ii;F", mfloat },
344348024e4aSbellard {"ftstd", 4, two(0xF000, 0x543A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
344448024e4aSbellard {"ftstl", 4, two(0xF000, 0x403A), two(0xF1C0, 0xFC7F), "Ii;l", mfloat },
344548024e4aSbellard {"ftstl", 4, two(0xF000, 0x403A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
344648024e4aSbellard {"ftstp", 4, two(0xF000, 0x4C3A), two(0xF1C0, 0xFC7F), "Ii;p", mfloat },
344748024e4aSbellard {"ftsts", 4, two(0xF000, 0x443A), two(0xF1C0, 0xFC7F), "Ii;f", mfloat },
344848024e4aSbellard {"ftsts", 4, two(0xF000, 0x443A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
344948024e4aSbellard {"ftstw", 4, two(0xF000, 0x503A), two(0xF1C0, 0xFC7F), "Ii;w", mfloat },
345048024e4aSbellard {"ftstw", 4, two(0xF000, 0x503A), two(0xF1C0, 0xFC7F), "Iibs", cfloat },
345148024e4aSbellard {"ftstx", 4, two(0xF000, 0x003A), two(0xF1C0, 0xE07F), "IiF8", mfloat },
345248024e4aSbellard {"ftstx", 4, two(0xF000, 0x483A), two(0xF1C0, 0xFC7F), "Ii;x", mfloat },
345348024e4aSbellard
345448024e4aSbellard {"ftwotoxb", 4, two(0xF000, 0x5811), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat },
345548024e4aSbellard {"ftwotoxd", 4, two(0xF000, 0x5411), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat },
345648024e4aSbellard {"ftwotoxl", 4, two(0xF000, 0x4011), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat },
345748024e4aSbellard {"ftwotoxp", 4, two(0xF000, 0x4C11), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat },
345848024e4aSbellard {"ftwotoxs", 4, two(0xF000, 0x4411), two(0xF1C0, 0xFC7F), "Ii;fF7", mfloat },
345948024e4aSbellard {"ftwotoxw", 4, two(0xF000, 0x5011), two(0xF1C0, 0xFC7F), "Ii;wF7", mfloat },
346048024e4aSbellard {"ftwotoxx", 4, two(0xF000, 0x0011), two(0xF1C0, 0xE07F), "IiF8F7", mfloat },
346148024e4aSbellard {"ftwotoxx", 4, two(0xF000, 0x4811), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat },
346248024e4aSbellard {"ftwotoxx", 4, two(0xF000, 0x0011), two(0xF1C0, 0xE07F), "IiFt", mfloat },
346348024e4aSbellard
346448024e4aSbellard {"halt", 2, one(0045310), one(0177777), "", m68060 | mcfisa_a },
346548024e4aSbellard
346648024e4aSbellard {"illegal", 2, one(0045374), one(0177777), "", m68000up | mcfisa_a },
346748024e4aSbellard {"intouch", 2, one(0xf428), one(0xfff8), "As", mcfisa_b },
346848024e4aSbellard
346948024e4aSbellard {"jmp", 2, one(0047300), one(0177700), "!s", m68000up | mcfisa_a },
347048024e4aSbellard
347148024e4aSbellard {"jra", 2, one(0060000), one(0177400), "Bg", m68000up | mcfisa_a },
347248024e4aSbellard {"jra", 2, one(0047300), one(0177700), "!s", m68000up | mcfisa_a },
347348024e4aSbellard
347448024e4aSbellard {"jsr", 2, one(0047200), one(0177700), "!s", m68000up | mcfisa_a },
347548024e4aSbellard
347648024e4aSbellard {"jbsr", 2, one(0060400), one(0177400), "Bg", m68000up | mcfisa_a },
347748024e4aSbellard {"jbsr", 2, one(0047200), one(0177700), "!s", m68000up | mcfisa_a },
347848024e4aSbellard
347948024e4aSbellard {"lea", 2, one(0040700), one(0170700), "!sAd", m68000up | mcfisa_a },
348048024e4aSbellard
348148024e4aSbellard {"lpstop", 6, two(0174000,0000700),two(0177777,0177777),"#w", cpu32|m68060 },
348248024e4aSbellard
348348024e4aSbellard {"linkw", 4, one(0047120), one(0177770), "As#w", m68000up | mcfisa_a },
348448024e4aSbellard {"linkl", 6, one(0044010), one(0177770), "As#l", m68020up | cpu32 },
348548024e4aSbellard {"link", 4, one(0047120), one(0177770), "As#W", m68000up | mcfisa_a },
348648024e4aSbellard {"link", 6, one(0044010), one(0177770), "As#l", m68020up | cpu32 },
348748024e4aSbellard
348848024e4aSbellard {"lslb", 2, one(0160410), one(0170770), "QdDs", m68000up },
348948024e4aSbellard {"lslb", 2, one(0160450), one(0170770), "DdDs", m68000up },
349048024e4aSbellard {"lslw", 2, one(0160510), one(0170770), "QdDs", m68000up },
349148024e4aSbellard {"lslw", 2, one(0160550), one(0170770), "DdDs", m68000up },
349248024e4aSbellard {"lslw", 2, one(0161700), one(0177700), "~s", m68000up },
349348024e4aSbellard {"lsll", 2, one(0160610), one(0170770), "QdDs", m68000up | mcfisa_a },
349448024e4aSbellard {"lsll", 2, one(0160650), one(0170770), "DdDs", m68000up | mcfisa_a },
349548024e4aSbellard
349648024e4aSbellard {"lsrb", 2, one(0160010), one(0170770), "QdDs", m68000up },
349748024e4aSbellard {"lsrb", 2, one(0160050), one(0170770), "DdDs", m68000up },
349848024e4aSbellard {"lsrw", 2, one(0160110), one(0170770), "QdDs", m68000up },
349948024e4aSbellard {"lsrw", 2, one(0160150), one(0170770), "DdDs", m68000up },
350048024e4aSbellard {"lsrw", 2, one(0161300), one(0177700), "~s", m68000up },
350148024e4aSbellard {"lsrl", 2, one(0160210), one(0170770), "QdDs", m68000up | mcfisa_a },
350248024e4aSbellard {"lsrl", 2, one(0160250), one(0170770), "DdDs", m68000up | mcfisa_a },
350348024e4aSbellard
350448024e4aSbellard {"macw", 4, two(0xa080, 0x0000), two(0xf180, 0x0910), "uNuoiI4/Rn", mcfmac },
350548024e4aSbellard {"macw", 4, two(0xa080, 0x0200), two(0xf180, 0x0910), "uNuoMh4/Rn", mcfmac },
350648024e4aSbellard {"macw", 4, two(0xa080, 0x0000), two(0xf180, 0x0f10), "uNuo4/Rn", mcfmac },
350748024e4aSbellard {"macw", 4, two(0xa000, 0x0000), two(0xf1b0, 0x0900), "uMumiI", mcfmac },
350848024e4aSbellard {"macw", 4, two(0xa000, 0x0200), two(0xf1b0, 0x0900), "uMumMh", mcfmac },
350948024e4aSbellard {"macw", 4, two(0xa000, 0x0000), two(0xf1b0, 0x0f00), "uMum", mcfmac },
351048024e4aSbellard
351148024e4aSbellard {"macw", 4, two(0xa000, 0x0000), two(0xf100, 0x0900), "uNuoiI4/RneG", mcfemac },/* Ry,Rx,SF,<ea>,accX. */
351248024e4aSbellard {"macw", 4, two(0xa000, 0x0200), two(0xf100, 0x0900), "uNuoMh4/RneG", mcfemac },/* Ry,Rx,+1/-1,<ea>,accX. */
351348024e4aSbellard {"macw", 4, two(0xa000, 0x0000), two(0xf100, 0x0f00), "uNuo4/RneG", mcfemac },/* Ry,Rx,<ea>,accX. */
351448024e4aSbellard {"macw", 4, two(0xa000, 0x0000), two(0xf130, 0x0900), "uMumiIeH", mcfemac },/* Ry,Rx,SF,accX. */
351548024e4aSbellard {"macw", 4, two(0xa000, 0x0200), two(0xf130, 0x0900), "uMumMheH", mcfemac },/* Ry,Rx,+1/-1,accX. */
351648024e4aSbellard {"macw", 4, two(0xa000, 0x0000), two(0xf130, 0x0f00), "uMumeH", mcfemac }, /* Ry,Rx,accX. */
351748024e4aSbellard
351848024e4aSbellard {"macl", 4, two(0xa080, 0x0800), two(0xf180, 0x0910), "RNRoiI4/Rn", mcfmac },
351948024e4aSbellard {"macl", 4, two(0xa080, 0x0a00), two(0xf180, 0x0910), "RNRoMh4/Rn", mcfmac },
352048024e4aSbellard {"macl", 4, two(0xa080, 0x0800), two(0xf180, 0x0f10), "RNRo4/Rn", mcfmac },
352148024e4aSbellard {"macl", 4, two(0xa000, 0x0800), two(0xf1b0, 0x0b00), "RMRmiI", mcfmac },
352248024e4aSbellard {"macl", 4, two(0xa000, 0x0a00), two(0xf1b0, 0x0b00), "RMRmMh", mcfmac },
352348024e4aSbellard {"macl", 4, two(0xa000, 0x0800), two(0xf1b0, 0x0800), "RMRm", mcfmac },
352448024e4aSbellard
352548024e4aSbellard {"macl", 4, two(0xa000, 0x0800), two(0xf100, 0x0900), "R3R1iI4/RneG", mcfemac },
352648024e4aSbellard {"macl", 4, two(0xa000, 0x0a00), two(0xf100, 0x0900), "R3R1Mh4/RneG", mcfemac },
352748024e4aSbellard {"macl", 4, two(0xa000, 0x0800), two(0xf100, 0x0f00), "R3R14/RneG", mcfemac },
352848024e4aSbellard {"macl", 4, two(0xa000, 0x0800), two(0xf130, 0x0900), "RMRmiIeH", mcfemac },
352948024e4aSbellard {"macl", 4, two(0xa000, 0x0a00), two(0xf130, 0x0900), "RMRmMheH", mcfemac },
353048024e4aSbellard {"macl", 4, two(0xa000, 0x0800), two(0xf130, 0x0f00), "RMRmeH", mcfemac },
353148024e4aSbellard
353248024e4aSbellard /* NOTE: The mcf5200 family programmer's reference manual does not
353348024e4aSbellard indicate the byte form of the movea instruction is invalid (as it
353407f35073SDong Xu Wang is on 68000 family cpus). However, experiments on the 5202 yield
353548024e4aSbellard unexpected results. The value is copied, but it is not sign extended
353648024e4aSbellard (as is done with movea.w) and the top three bytes in the address
353748024e4aSbellard register are not disturbed. I don't know if this is the intended
353848024e4aSbellard behavior --- it could be a hole in instruction decoding (Motorola
353948024e4aSbellard decided not to trap all invalid instructions for performance reasons)
354048024e4aSbellard --- but I suspect that it is not.
354148024e4aSbellard
354248024e4aSbellard I reported this to Motorola ISD Technical Communications Support,
354348024e4aSbellard which replied that other coldfire assemblers reject movea.b. For
354448024e4aSbellard this reason I've decided to not allow moveab.
354548024e4aSbellard
354648024e4aSbellard jtc@cygnus.com - 97/01/24. */
354748024e4aSbellard
354848024e4aSbellard {"moveal", 2, one(0020100), one(0170700), "*lAd", m68000up | mcfisa_a },
354948024e4aSbellard {"moveaw", 2, one(0030100), one(0170700), "*wAd", m68000up | mcfisa_a },
355048024e4aSbellard
355148024e4aSbellard {"movclrl", 2, one(0xA1C0), one(0xf9f0), "eFRs", mcfemac },
355248024e4aSbellard
355348024e4aSbellard {"movec", 4, one(0047173), one(0177777), "R1Jj", m68010up | mcfisa_a },
355448024e4aSbellard {"movec", 4, one(0047173), one(0177777), "R1#j", m68010up | mcfisa_a },
355548024e4aSbellard {"movec", 4, one(0047172), one(0177777), "JjR1", m68010up },
355648024e4aSbellard {"movec", 4, one(0047172), one(0177777), "#jR1", m68010up },
355748024e4aSbellard
355848024e4aSbellard {"movemw", 4, one(0044200), one(0177700), "Lw&s", m68000up },
355948024e4aSbellard {"movemw", 4, one(0044240), one(0177770), "lw-s", m68000up },
356048024e4aSbellard {"movemw", 4, one(0044200), one(0177700), "#w>s", m68000up },
356148024e4aSbellard {"movemw", 4, one(0046200), one(0177700), "<sLw", m68000up },
356248024e4aSbellard {"movemw", 4, one(0046200), one(0177700), "<s#w", m68000up },
356348024e4aSbellard {"moveml", 4, one(0044300), one(0177700), "Lw&s", m68000up },
356448024e4aSbellard {"moveml", 4, one(0044340), one(0177770), "lw-s", m68000up },
356548024e4aSbellard {"moveml", 4, one(0044300), one(0177700), "#w>s", m68000up },
356648024e4aSbellard {"moveml", 4, one(0046300), one(0177700), "<sLw", m68000up },
356748024e4aSbellard {"moveml", 4, one(0046300), one(0177700), "<s#w", m68000up },
356848024e4aSbellard /* FIXME: need specifier for mode 2 and 5 to simplify below insn patterns. */
356948024e4aSbellard {"moveml", 4, one(0044320), one(0177770), "Lwas", mcfisa_a },
357048024e4aSbellard {"moveml", 4, one(0044320), one(0177770), "#was", mcfisa_a },
357148024e4aSbellard {"moveml", 4, one(0044350), one(0177770), "Lwds", mcfisa_a },
357248024e4aSbellard {"moveml", 4, one(0044350), one(0177770), "#wds", mcfisa_a },
357348024e4aSbellard {"moveml", 4, one(0046320), one(0177770), "asLw", mcfisa_a },
357448024e4aSbellard {"moveml", 4, one(0046320), one(0177770), "as#w", mcfisa_a },
357548024e4aSbellard {"moveml", 4, one(0046350), one(0177770), "dsLw", mcfisa_a },
357648024e4aSbellard {"moveml", 4, one(0046350), one(0177770), "ds#w", mcfisa_a },
357748024e4aSbellard
357848024e4aSbellard {"movepw", 2, one(0000410), one(0170770), "dsDd", m68000up },
357948024e4aSbellard {"movepw", 2, one(0000610), one(0170770), "Ddds", m68000up },
358048024e4aSbellard {"movepl", 2, one(0000510), one(0170770), "dsDd", m68000up },
358148024e4aSbellard {"movepl", 2, one(0000710), one(0170770), "Ddds", m68000up },
358248024e4aSbellard
358348024e4aSbellard {"moveq", 2, one(0070000), one(0170400), "MsDd", m68000up | mcfisa_a },
358448024e4aSbellard {"moveq", 2, one(0070000), one(0170400), "#BDd", m68000up | mcfisa_a },
358548024e4aSbellard
358648024e4aSbellard /* The move opcode can generate the movea and moveq instructions. */
358748024e4aSbellard {"moveb", 2, one(0010000), one(0170000), ";b$d", m68000up },
358848024e4aSbellard {"moveb", 2, one(0010000), one(0170070), "Ds$d", mcfisa_a },
358948024e4aSbellard {"moveb", 2, one(0010020), one(0170070), "as$d", mcfisa_a },
359048024e4aSbellard {"moveb", 2, one(0010030), one(0170070), "+s$d", mcfisa_a },
359148024e4aSbellard {"moveb", 2, one(0010040), one(0170070), "-s$d", mcfisa_a },
359248024e4aSbellard {"moveb", 2, one(0010000), one(0170000), "nsqd", mcfisa_a },
359348024e4aSbellard {"moveb", 2, one(0010000), one(0170700), "obDd", mcfisa_a },
359448024e4aSbellard {"moveb", 2, one(0010200), one(0170700), "obad", mcfisa_a },
359548024e4aSbellard {"moveb", 2, one(0010300), one(0170700), "ob+d", mcfisa_a },
359648024e4aSbellard {"moveb", 2, one(0010400), one(0170700), "ob-d", mcfisa_a },
359748024e4aSbellard {"moveb", 2, one(0010000), one(0170000), "obnd", mcfisa_b },
359848024e4aSbellard
359948024e4aSbellard {"movew", 2, one(0030000), one(0170000), "*w%d", m68000up },
360048024e4aSbellard {"movew", 2, one(0030000), one(0170000), "ms%d", mcfisa_a },
360148024e4aSbellard {"movew", 2, one(0030000), one(0170000), "nspd", mcfisa_a },
360248024e4aSbellard {"movew", 2, one(0030000), one(0170000), "owmd", mcfisa_a },
360348024e4aSbellard {"movew", 2, one(0030000), one(0170000), "ownd", mcfisa_b },
360448024e4aSbellard {"movew", 2, one(0040300), one(0177700), "Ss$s", m68000up },
360548024e4aSbellard {"movew", 2, one(0040300), one(0177770), "SsDs", mcfisa_a },
360648024e4aSbellard {"movew", 2, one(0041300), one(0177700), "Cs$s", m68010up },
360748024e4aSbellard {"movew", 2, one(0041300), one(0177770), "CsDs", mcfisa_a },
360848024e4aSbellard {"movew", 2, one(0042300), one(0177700), ";wCd", m68000up },
360948024e4aSbellard {"movew", 2, one(0042300), one(0177700), "DsCd", mcfisa_a },
361048024e4aSbellard {"movew", 4, one(0042374), one(0177777), "#wCd", mcfisa_a },
361148024e4aSbellard {"movew", 2, one(0043300), one(0177700), ";wSd", m68000up },
361248024e4aSbellard {"movew", 2, one(0043300), one(0177700), "DsSd", mcfisa_a },
361348024e4aSbellard {"movew", 4, one(0043374), one(0177777), "#wSd", mcfisa_a },
361448024e4aSbellard
361548024e4aSbellard {"movel", 2, one(0070000), one(0170400), "MsDd", m68000up | mcfisa_a },
361648024e4aSbellard {"movel", 2, one(0020000), one(0170000), "*l%d", m68000up },
361748024e4aSbellard {"movel", 2, one(0020000), one(0170000), "ms%d", mcfisa_a },
361848024e4aSbellard {"movel", 2, one(0020000), one(0170000), "nspd", mcfisa_a },
361948024e4aSbellard {"movel", 2, one(0020000), one(0170000), "olmd", mcfisa_a },
362048024e4aSbellard {"movel", 2, one(0020000), one(0170000), "olnd", mcfisa_b },
362148024e4aSbellard {"movel", 2, one(0047140), one(0177770), "AsUd", m68000up | mcfusp },
362248024e4aSbellard {"movel", 2, one(0047150), one(0177770), "UdAs", m68000up | mcfusp },
362348024e4aSbellard {"movel", 2, one(0120600), one(0177760), "EsRs", mcfmac },
362448024e4aSbellard {"movel", 2, one(0120400), one(0177760), "RsEs", mcfmac },
362548024e4aSbellard {"movel", 6, one(0120474), one(0177777), "#lEs", mcfmac },
362648024e4aSbellard {"movel", 2, one(0124600), one(0177760), "GsRs", mcfmac },
362748024e4aSbellard {"movel", 2, one(0124400), one(0177760), "RsGs", mcfmac },
362848024e4aSbellard {"movel", 6, one(0124474), one(0177777), "#lGs", mcfmac },
362948024e4aSbellard {"movel", 2, one(0126600), one(0177760), "HsRs", mcfmac },
363048024e4aSbellard {"movel", 2, one(0126400), one(0177760), "RsHs", mcfmac },
363148024e4aSbellard {"movel", 6, one(0126474), one(0177777), "#lHs", mcfmac },
363248024e4aSbellard {"movel", 2, one(0124700), one(0177777), "GsCs", mcfmac },
363348024e4aSbellard
363448024e4aSbellard {"movel", 2, one(0xa180), one(0xf9f0), "eFRs", mcfemac }, /* ACCx,Rx. */
363548024e4aSbellard {"movel", 2, one(0xab80), one(0xfbf0), "g]Rs", mcfemac }, /* ACCEXTx,Rx. */
363648024e4aSbellard {"movel", 2, one(0xa980), one(0xfff0), "G-Rs", mcfemac }, /* macsr,Rx. */
363748024e4aSbellard {"movel", 2, one(0xad80), one(0xfff0), "H-Rs", mcfemac }, /* mask,Rx. */
363848024e4aSbellard {"movel", 2, one(0xa110), one(0xf9fc), "efeF", mcfemac }, /* ACCy,ACCx. */
363948024e4aSbellard {"movel", 2, one(0xa9c0), one(0xffff), "G-C-", mcfemac }, /* macsr,ccr. */
364048024e4aSbellard {"movel", 2, one(0xa100), one(0xf9f0), "RseF", mcfemac }, /* Rx,ACCx. */
364148024e4aSbellard {"movel", 6, one(0xa13c), one(0xf9ff), "#leF", mcfemac }, /* #,ACCx. */
364248024e4aSbellard {"movel", 2, one(0xab00), one(0xfbc0), "Rsg]", mcfemac }, /* Rx,ACCEXTx. */
364348024e4aSbellard {"movel", 6, one(0xab3c), one(0xfbff), "#lg]", mcfemac }, /* #,ACCEXTx. */
364448024e4aSbellard {"movel", 2, one(0xa900), one(0xffc0), "RsG-", mcfemac }, /* Rx,macsr. */
364548024e4aSbellard {"movel", 6, one(0xa93c), one(0xffff), "#lG-", mcfemac }, /* #,macsr. */
364648024e4aSbellard {"movel", 2, one(0xad00), one(0xffc0), "RsH-", mcfemac }, /* Rx,mask. */
364748024e4aSbellard {"movel", 6, one(0xad3c), one(0xffff), "#lH-", mcfemac }, /* #,mask. */
364848024e4aSbellard
364948024e4aSbellard {"move", 2, one(0030000), one(0170000), "*w%d", m68000up },
365048024e4aSbellard {"move", 2, one(0030000), one(0170000), "ms%d", mcfisa_a },
365148024e4aSbellard {"move", 2, one(0030000), one(0170000), "nspd", mcfisa_a },
365248024e4aSbellard {"move", 2, one(0030000), one(0170000), "owmd", mcfisa_a },
365348024e4aSbellard {"move", 2, one(0030000), one(0170000), "ownd", mcfisa_b },
365448024e4aSbellard {"move", 2, one(0040300), one(0177700), "Ss$s", m68000up },
365548024e4aSbellard {"move", 2, one(0040300), one(0177770), "SsDs", mcfisa_a },
365648024e4aSbellard {"move", 2, one(0041300), one(0177700), "Cs$s", m68010up },
365748024e4aSbellard {"move", 2, one(0041300), one(0177770), "CsDs", mcfisa_a },
365848024e4aSbellard {"move", 2, one(0042300), one(0177700), ";wCd", m68000up },
365948024e4aSbellard {"move", 2, one(0042300), one(0177700), "DsCd", mcfisa_a },
366048024e4aSbellard {"move", 4, one(0042374), one(0177777), "#wCd", mcfisa_a },
366148024e4aSbellard {"move", 2, one(0043300), one(0177700), ";wSd", m68000up },
366248024e4aSbellard {"move", 2, one(0043300), one(0177700), "DsSd", mcfisa_a },
366348024e4aSbellard {"move", 4, one(0043374), one(0177777), "#wSd", mcfisa_a },
366448024e4aSbellard
366548024e4aSbellard {"move", 2, one(0047140), one(0177770), "AsUd", m68000up },
366648024e4aSbellard {"move", 2, one(0047150), one(0177770), "UdAs", m68000up },
366748024e4aSbellard
366848024e4aSbellard {"mov3ql", 2, one(0120500), one(0170700), "xd%s", mcfisa_b },
366948024e4aSbellard {"mvsb", 2, one(0070400), one(0170700), "*bDd", mcfisa_b },
367048024e4aSbellard {"mvsw", 2, one(0070500), one(0170700), "*wDd", mcfisa_b },
367148024e4aSbellard {"mvzb", 2, one(0070600), one(0170700), "*bDd", mcfisa_b },
367248024e4aSbellard {"mvzw", 2, one(0070700), one(0170700), "*wDd", mcfisa_b },
367348024e4aSbellard
367448024e4aSbellard {"movesb", 4, two(0007000, 0), two(0177700, 07777), "~sR1", m68010up },
367548024e4aSbellard {"movesb", 4, two(0007000, 04000), two(0177700, 07777), "R1~s", m68010up },
367648024e4aSbellard {"movesw", 4, two(0007100, 0), two(0177700, 07777), "~sR1", m68010up },
367748024e4aSbellard {"movesw", 4, two(0007100, 04000), two(0177700, 07777), "R1~s", m68010up },
367848024e4aSbellard {"movesl", 4, two(0007200, 0), two(0177700, 07777), "~sR1", m68010up },
367948024e4aSbellard {"movesl", 4, two(0007200, 04000), two(0177700, 07777), "R1~s", m68010up },
368048024e4aSbellard
368148024e4aSbellard {"move16", 4, two(0xf620, 0x8000), two(0xfff8, 0x8fff), "+s+1", m68040up },
368248024e4aSbellard {"move16", 2, one(0xf600), one(0xfff8), "+s_L", m68040up },
368348024e4aSbellard {"move16", 2, one(0xf608), one(0xfff8), "_L+s", m68040up },
368448024e4aSbellard {"move16", 2, one(0xf610), one(0xfff8), "as_L", m68040up },
368548024e4aSbellard {"move16", 2, one(0xf618), one(0xfff8), "_Las", m68040up },
368648024e4aSbellard
368748024e4aSbellard {"msacw", 4, two(0xa080, 0x0100), two(0xf180, 0x0910), "uNuoiI4/Rn", mcfmac },
368848024e4aSbellard {"msacw", 4, two(0xa080, 0x0300), two(0xf180, 0x0910), "uNuoMh4/Rn", mcfmac },
368948024e4aSbellard {"msacw", 4, two(0xa080, 0x0100), two(0xf180, 0x0f10), "uNuo4/Rn", mcfmac },
369048024e4aSbellard {"msacw", 4, two(0xa000, 0x0100), two(0xf1b0, 0x0900), "uMumiI", mcfmac },
369148024e4aSbellard {"msacw", 4, two(0xa000, 0x0300), two(0xf1b0, 0x0900), "uMumMh", mcfmac },
369248024e4aSbellard {"msacw", 4, two(0xa000, 0x0100), two(0xf1b0, 0x0f00), "uMum", mcfmac },
369348024e4aSbellard
369448024e4aSbellard {"msacw", 4, two(0xa000, 0x0100), two(0xf100, 0x0900), "uMumiI4/RneG", mcfemac },/* Ry,Rx,SF,<ea>,accX. */
369548024e4aSbellard {"msacw", 4, two(0xa000, 0x0300), two(0xf100, 0x0900), "uMumMh4/RneG", mcfemac },/* Ry,Rx,+1/-1,<ea>,accX. */
369648024e4aSbellard {"msacw", 4, two(0xa000, 0x0100), two(0xf100, 0x0f00), "uMum4/RneG", mcfemac },/* Ry,Rx,<ea>,accX. */
369748024e4aSbellard {"msacw", 4, two(0xa000, 0x0100), two(0xf130, 0x0900), "uMumiIeH", mcfemac },/* Ry,Rx,SF,accX. */
369848024e4aSbellard {"msacw", 4, two(0xa000, 0x0300), two(0xf130, 0x0900), "uMumMheH", mcfemac },/* Ry,Rx,+1/-1,accX. */
369948024e4aSbellard {"msacw", 4, two(0xa000, 0x0100), two(0xf130, 0x0f00), "uMumeH", mcfemac }, /* Ry,Rx,accX. */
370048024e4aSbellard
370148024e4aSbellard {"msacl", 4, two(0xa080, 0x0900), two(0xf180, 0x0910), "RNRoiI4/Rn", mcfmac },
370248024e4aSbellard {"msacl", 4, two(0xa080, 0x0b00), two(0xf180, 0x0910), "RNRoMh4/Rn", mcfmac },
370348024e4aSbellard {"msacl", 4, two(0xa080, 0x0900), two(0xf180, 0x0f10), "RNRo4/Rn", mcfmac },
370448024e4aSbellard {"msacl", 4, two(0xa000, 0x0900), two(0xf1b0, 0x0b00), "RMRmiI", mcfmac },
370548024e4aSbellard {"msacl", 4, two(0xa000, 0x0b00), two(0xf1b0, 0x0b00), "RMRmMh", mcfmac },
370648024e4aSbellard {"msacl", 4, two(0xa000, 0x0900), two(0xf1b0, 0x0800), "RMRm", mcfmac },
370748024e4aSbellard
370848024e4aSbellard {"msacl", 4, two(0xa000, 0x0900), two(0xf100, 0x0900), "R3R1iI4/RneG", mcfemac },
370948024e4aSbellard {"msacl", 4, two(0xa000, 0x0b00), two(0xf100, 0x0900), "R3R1Mh4/RneG", mcfemac },
371048024e4aSbellard {"msacl", 4, two(0xa000, 0x0900), two(0xf100, 0x0f00), "R3R14/RneG", mcfemac },
371148024e4aSbellard {"msacl", 4, two(0xa000, 0x0900), two(0xf130, 0x0900), "RMRmiIeH", mcfemac },
371248024e4aSbellard {"msacl", 4, two(0xa000, 0x0b00), two(0xf130, 0x0900), "RMRmMheH", mcfemac },
371348024e4aSbellard {"msacl", 4, two(0xa000, 0x0900), two(0xf130, 0x0f00), "RMRmeH", mcfemac },
371448024e4aSbellard
371548024e4aSbellard {"mulsw", 2, one(0140700), one(0170700), ";wDd", m68000up|mcfisa_a },
371648024e4aSbellard {"mulsl", 4, two(0046000,004000), two(0177700,0107770), ";lD1", m68020up|cpu32 },
371748024e4aSbellard {"mulsl", 4, two(0046000,004000), two(0177700,0107770), "qsD1", mcfisa_a },
371848024e4aSbellard {"mulsl", 4, two(0046000,006000), two(0177700,0107770), ";lD3D1",m68020up|cpu32 },
371948024e4aSbellard
372048024e4aSbellard {"muluw", 2, one(0140300), one(0170700), ";wDd", m68000up|mcfisa_a },
372148024e4aSbellard {"mulul", 4, two(0046000,000000), two(0177700,0107770), ";lD1", m68020up|cpu32 },
372248024e4aSbellard {"mulul", 4, two(0046000,000000), two(0177700,0107770), "qsD1", mcfisa_a },
372348024e4aSbellard {"mulul", 4, two(0046000,002000), two(0177700,0107770), ";lD3D1",m68020up|cpu32 },
372448024e4aSbellard
372548024e4aSbellard {"nbcd", 2, one(0044000), one(0177700), "$s", m68000up },
372648024e4aSbellard
372748024e4aSbellard {"negb", 2, one(0042000), one(0177700), "$s", m68000up },
372848024e4aSbellard {"negw", 2, one(0042100), one(0177700), "$s", m68000up },
372948024e4aSbellard {"negl", 2, one(0042200), one(0177700), "$s", m68000up },
373048024e4aSbellard {"negl", 2, one(0042200), one(0177700), "Ds", mcfisa_a},
373148024e4aSbellard
373248024e4aSbellard {"negxb", 2, one(0040000), one(0177700), "$s", m68000up },
373348024e4aSbellard {"negxw", 2, one(0040100), one(0177700), "$s", m68000up },
373448024e4aSbellard {"negxl", 2, one(0040200), one(0177700), "$s", m68000up },
373548024e4aSbellard {"negxl", 2, one(0040200), one(0177700), "Ds", mcfisa_a},
373648024e4aSbellard
373748024e4aSbellard {"nop", 2, one(0047161), one(0177777), "", m68000up | mcfisa_a},
373848024e4aSbellard
373948024e4aSbellard {"notb", 2, one(0043000), one(0177700), "$s", m68000up },
374048024e4aSbellard {"notw", 2, one(0043100), one(0177700), "$s", m68000up },
374148024e4aSbellard {"notl", 2, one(0043200), one(0177700), "$s", m68000up },
374248024e4aSbellard {"notl", 2, one(0043200), one(0177700), "Ds", mcfisa_a},
374348024e4aSbellard
374448024e4aSbellard {"orib", 4, one(0000000), one(0177700), "#b$s", m68000up },
374548024e4aSbellard {"orib", 4, one(0000074), one(0177777), "#bCs", m68000up },
374648024e4aSbellard {"oriw", 4, one(0000100), one(0177700), "#w$s", m68000up },
374748024e4aSbellard {"oriw", 4, one(0000174), one(0177777), "#wSs", m68000up },
374848024e4aSbellard {"oril", 6, one(0000200), one(0177700), "#l$s", m68000up },
374948024e4aSbellard {"oril", 6, one(0000200), one(0177700), "#lDs", mcfisa_a },
375048024e4aSbellard {"ori", 4, one(0000074), one(0177777), "#bCs", m68000up },
375148024e4aSbellard {"ori", 4, one(0000100), one(0177700), "#w$s", m68000up },
375248024e4aSbellard {"ori", 4, one(0000174), one(0177777), "#wSs", m68000up },
375348024e4aSbellard
375448024e4aSbellard /* The or opcode can generate the ori instruction. */
375548024e4aSbellard {"orb", 4, one(0000000), one(0177700), "#b$s", m68000up },
375648024e4aSbellard {"orb", 4, one(0000074), one(0177777), "#bCs", m68000up },
375748024e4aSbellard {"orb", 2, one(0100000), one(0170700), ";bDd", m68000up },
375848024e4aSbellard {"orb", 2, one(0100400), one(0170700), "Dd~s", m68000up },
375948024e4aSbellard {"orw", 4, one(0000100), one(0177700), "#w$s", m68000up },
376048024e4aSbellard {"orw", 4, one(0000174), one(0177777), "#wSs", m68000up },
376148024e4aSbellard {"orw", 2, one(0100100), one(0170700), ";wDd", m68000up },
376248024e4aSbellard {"orw", 2, one(0100500), one(0170700), "Dd~s", m68000up },
376348024e4aSbellard {"orl", 6, one(0000200), one(0177700), "#l$s", m68000up },
376448024e4aSbellard {"orl", 6, one(0000200), one(0177700), "#lDs", mcfisa_a },
376548024e4aSbellard {"orl", 2, one(0100200), one(0170700), ";lDd", m68000up | mcfisa_a },
376648024e4aSbellard {"orl", 2, one(0100600), one(0170700), "Dd~s", m68000up | mcfisa_a },
376748024e4aSbellard {"or", 4, one(0000074), one(0177777), "#bCs", m68000up },
376848024e4aSbellard {"or", 4, one(0000100), one(0177700), "#w$s", m68000up },
376948024e4aSbellard {"or", 4, one(0000174), one(0177777), "#wSs", m68000up },
377048024e4aSbellard {"or", 2, one(0100100), one(0170700), ";wDd", m68000up },
377148024e4aSbellard {"or", 2, one(0100500), one(0170700), "Dd~s", m68000up },
377248024e4aSbellard
377348024e4aSbellard {"pack", 4, one(0100500), one(0170770), "DsDd#w", m68020up },
377448024e4aSbellard {"pack", 4, one(0100510), one(0170770), "-s-d#w", m68020up },
377548024e4aSbellard
377648024e4aSbellard {"pbac", 2, one(0xf087), one(0xffbf), "Bc", m68851 },
377748024e4aSbellard {"pbacw", 2, one(0xf087), one(0xffff), "BW", m68851 },
377848024e4aSbellard {"pbas", 2, one(0xf086), one(0xffbf), "Bc", m68851 },
377948024e4aSbellard {"pbasw", 2, one(0xf086), one(0xffff), "BW", m68851 },
378048024e4aSbellard {"pbbc", 2, one(0xf081), one(0xffbf), "Bc", m68851 },
378148024e4aSbellard {"pbbcw", 2, one(0xf081), one(0xffff), "BW", m68851 },
378248024e4aSbellard {"pbbs", 2, one(0xf080), one(0xffbf), "Bc", m68851 },
378348024e4aSbellard {"pbbsw", 2, one(0xf080), one(0xffff), "BW", m68851 },
378448024e4aSbellard {"pbcc", 2, one(0xf08f), one(0xffbf), "Bc", m68851 },
378548024e4aSbellard {"pbccw", 2, one(0xf08f), one(0xffff), "BW", m68851 },
378648024e4aSbellard {"pbcs", 2, one(0xf08e), one(0xffbf), "Bc", m68851 },
378748024e4aSbellard {"pbcsw", 2, one(0xf08e), one(0xffff), "BW", m68851 },
378848024e4aSbellard {"pbgc", 2, one(0xf08d), one(0xffbf), "Bc", m68851 },
378948024e4aSbellard {"pbgcw", 2, one(0xf08d), one(0xffff), "BW", m68851 },
379048024e4aSbellard {"pbgs", 2, one(0xf08c), one(0xffbf), "Bc", m68851 },
379148024e4aSbellard {"pbgsw", 2, one(0xf08c), one(0xffff), "BW", m68851 },
379248024e4aSbellard {"pbic", 2, one(0xf08b), one(0xffbf), "Bc", m68851 },
379348024e4aSbellard {"pbicw", 2, one(0xf08b), one(0xffff), "BW", m68851 },
379448024e4aSbellard {"pbis", 2, one(0xf08a), one(0xffbf), "Bc", m68851 },
379548024e4aSbellard {"pbisw", 2, one(0xf08a), one(0xffff), "BW", m68851 },
379648024e4aSbellard {"pblc", 2, one(0xf083), one(0xffbf), "Bc", m68851 },
379748024e4aSbellard {"pblcw", 2, one(0xf083), one(0xffff), "BW", m68851 },
379848024e4aSbellard {"pbls", 2, one(0xf082), one(0xffbf), "Bc", m68851 },
379948024e4aSbellard {"pblsw", 2, one(0xf082), one(0xffff), "BW", m68851 },
380048024e4aSbellard {"pbsc", 2, one(0xf085), one(0xffbf), "Bc", m68851 },
380148024e4aSbellard {"pbscw", 2, one(0xf085), one(0xffff), "BW", m68851 },
380248024e4aSbellard {"pbss", 2, one(0xf084), one(0xffbf), "Bc", m68851 },
380348024e4aSbellard {"pbssw", 2, one(0xf084), one(0xffff), "BW", m68851 },
380448024e4aSbellard {"pbwc", 2, one(0xf089), one(0xffbf), "Bc", m68851 },
380548024e4aSbellard {"pbwcw", 2, one(0xf089), one(0xffff), "BW", m68851 },
380648024e4aSbellard {"pbws", 2, one(0xf088), one(0xffbf), "Bc", m68851 },
380748024e4aSbellard {"pbwsw", 2, one(0xf088), one(0xffff), "BW", m68851 },
380848024e4aSbellard
380948024e4aSbellard {"pdbac", 4, two(0xf048, 0x0007), two(0xfff8, 0xffff), "DsBw", m68851 },
381048024e4aSbellard {"pdbas", 4, two(0xf048, 0x0006), two(0xfff8, 0xffff), "DsBw", m68851 },
381148024e4aSbellard {"pdbbc", 4, two(0xf048, 0x0001), two(0xfff8, 0xffff), "DsBw", m68851 },
381248024e4aSbellard {"pdbbs", 4, two(0xf048, 0x0000), two(0xfff8, 0xffff), "DsBw", m68851 },
381348024e4aSbellard {"pdbcc", 4, two(0xf048, 0x000f), two(0xfff8, 0xffff), "DsBw", m68851 },
381448024e4aSbellard {"pdbcs", 4, two(0xf048, 0x000e), two(0xfff8, 0xffff), "DsBw", m68851 },
381548024e4aSbellard {"pdbgc", 4, two(0xf048, 0x000d), two(0xfff8, 0xffff), "DsBw", m68851 },
381648024e4aSbellard {"pdbgs", 4, two(0xf048, 0x000c), two(0xfff8, 0xffff), "DsBw", m68851 },
381748024e4aSbellard {"pdbic", 4, two(0xf048, 0x000b), two(0xfff8, 0xffff), "DsBw", m68851 },
381848024e4aSbellard {"pdbis", 4, two(0xf048, 0x000a), two(0xfff8, 0xffff), "DsBw", m68851 },
381948024e4aSbellard {"pdblc", 4, two(0xf048, 0x0003), two(0xfff8, 0xffff), "DsBw", m68851 },
382048024e4aSbellard {"pdbls", 4, two(0xf048, 0x0002), two(0xfff8, 0xffff), "DsBw", m68851 },
382148024e4aSbellard {"pdbsc", 4, two(0xf048, 0x0005), two(0xfff8, 0xffff), "DsBw", m68851 },
382248024e4aSbellard {"pdbss", 4, two(0xf048, 0x0004), two(0xfff8, 0xffff), "DsBw", m68851 },
382348024e4aSbellard {"pdbwc", 4, two(0xf048, 0x0009), two(0xfff8, 0xffff), "DsBw", m68851 },
382448024e4aSbellard {"pdbws", 4, two(0xf048, 0x0008), two(0xfff8, 0xffff), "DsBw", m68851 },
382548024e4aSbellard
382648024e4aSbellard {"pea", 2, one(0044100), one(0177700), "!s", m68000up|mcfisa_a },
382748024e4aSbellard
382848024e4aSbellard {"pflusha", 2, one(0xf518), one(0xfff8), "", m68040up },
382948024e4aSbellard {"pflusha", 4, two(0xf000,0x2400), two(0xffff,0xffff), "", m68030 | m68851 },
383048024e4aSbellard
383148024e4aSbellard {"pflush", 4, two(0xf000,0x3010), two(0xffc0,0xfe10), "T3T9", m68030|m68851 },
383248024e4aSbellard {"pflush", 4, two(0xf000,0x3810), two(0xffc0,0xfe10), "T3T9&s", m68030|m68851 },
383348024e4aSbellard {"pflush", 4, two(0xf000,0x3008), two(0xffc0,0xfe18), "D3T9", m68030|m68851 },
383448024e4aSbellard {"pflush", 4, two(0xf000,0x3808), two(0xffc0,0xfe18), "D3T9&s", m68030|m68851 },
383548024e4aSbellard {"pflush", 4, two(0xf000,0x3000), two(0xffc0,0xfe1e), "f3T9", m68030|m68851 },
383648024e4aSbellard {"pflush", 4, two(0xf000,0x3800), two(0xffc0,0xfe1e), "f3T9&s", m68030|m68851 },
383748024e4aSbellard {"pflush", 2, one(0xf508), one(0xfff8), "as", m68040up },
383848024e4aSbellard {"pflush", 2, one(0xf508), one(0xfff8), "As", m68040up },
383948024e4aSbellard
384048024e4aSbellard {"pflushan", 2, one(0xf510), one(0xfff8), "", m68040up },
384148024e4aSbellard {"pflushn", 2, one(0xf500), one(0xfff8), "as", m68040up },
384248024e4aSbellard {"pflushn", 2, one(0xf500), one(0xfff8), "As", m68040up },
384348024e4aSbellard
384448024e4aSbellard {"pflushr", 4, two(0xf000, 0xa000), two(0xffc0, 0xffff), "|s", m68851 },
384548024e4aSbellard
384648024e4aSbellard {"pflushs", 4, two(0xf000, 0x3410), two(0xfff8, 0xfe10), "T3T9", m68851 },
384748024e4aSbellard {"pflushs", 4, two(0xf000, 0x3c10), two(0xfff8, 0xfe10), "T3T9&s", m68851 },
384848024e4aSbellard {"pflushs", 4, two(0xf000, 0x3408), two(0xfff8, 0xfe18), "D3T9", m68851 },
384948024e4aSbellard {"pflushs", 4, two(0xf000, 0x3c08), two(0xfff8, 0xfe18), "D3T9&s", m68851 },
385048024e4aSbellard {"pflushs", 4, two(0xf000, 0x3400), two(0xfff8, 0xfe1e), "f3T9", m68851 },
385148024e4aSbellard {"pflushs", 4, two(0xf000, 0x3c00), two(0xfff8, 0xfe1e), "f3T9&s", m68851 },
385248024e4aSbellard
385348024e4aSbellard {"ploadr", 4, two(0xf000,0x2210), two(0xffc0,0xfff0), "T3&s", m68030|m68851 },
385448024e4aSbellard {"ploadr", 4, two(0xf000,0x2208), two(0xffc0,0xfff8), "D3&s", m68030|m68851 },
385548024e4aSbellard {"ploadr", 4, two(0xf000,0x2200), two(0xffc0,0xfffe), "f3&s", m68030|m68851 },
385648024e4aSbellard {"ploadw", 4, two(0xf000,0x2010), two(0xffc0,0xfff0), "T3&s", m68030|m68851 },
385748024e4aSbellard {"ploadw", 4, two(0xf000,0x2008), two(0xffc0,0xfff8), "D3&s", m68030|m68851 },
385848024e4aSbellard {"ploadw", 4, two(0xf000,0x2000), two(0xffc0,0xfffe), "f3&s", m68030|m68851 },
385948024e4aSbellard
386048024e4aSbellard {"plpar", 2, one(0xf5c8), one(0xfff8), "as", m68060 },
386148024e4aSbellard {"plpaw", 2, one(0xf588), one(0xfff8), "as", m68060 },
386248024e4aSbellard
386348024e4aSbellard {"pmove", 4, two(0xf000,0x4000), two(0xffc0,0xffff), "*l08", m68030|m68851 },
386448024e4aSbellard {"pmove", 4, two(0xf000,0x5c00), two(0xffc0,0xffff), "*w18", m68851 },
386548024e4aSbellard {"pmove", 4, two(0xf000,0x4000), two(0xffc0,0xe3ff), "*b28", m68851 },
386648024e4aSbellard {"pmove", 4, two(0xf000,0x4200), two(0xffc0,0xffff), "08%s", m68030|m68851 },
386748024e4aSbellard {"pmove", 4, two(0xf000,0x5e00), two(0xffc0,0xffff), "18%s", m68851 },
386848024e4aSbellard {"pmove", 4, two(0xf000,0x4200), two(0xffc0,0xe3ff), "28%s", m68851 },
386948024e4aSbellard {"pmove", 4, two(0xf000,0x4000), two(0xffc0,0xe3ff), "|sW8", m68030|m68851 },
387048024e4aSbellard {"pmove", 4, two(0xf000,0x4200), two(0xffc0,0xe3ff), "W8~s", m68030|m68851 },
387148024e4aSbellard {"pmove", 4, two(0xf000,0x6200), two(0xffc0,0xe3e3), "*wX3", m68851 },
387248024e4aSbellard {"pmove", 4, two(0xf000,0x6000), two(0xffc0,0xe3e3), "X3%s", m68851 },
387348024e4aSbellard {"pmove", 4, two(0xf000,0x6000), two(0xffc0,0xffff), "*wY8", m68030|m68851 },
387448024e4aSbellard {"pmove", 4, two(0xf000,0x6200), two(0xffc0,0xffff), "Y8%s", m68030|m68851 },
387548024e4aSbellard {"pmove", 4, two(0xf000,0x6600), two(0xffc0,0xffff), "Z8%s", m68851 },
387648024e4aSbellard {"pmove", 4, two(0xf000,0x0800), two(0xffc0,0xfbff), "*l38", m68030 },
387748024e4aSbellard {"pmove", 4, two(0xf000,0x0a00), two(0xffc0,0xfbff), "38%s", m68030 },
387848024e4aSbellard
387948024e4aSbellard {"pmovefd", 4, two(0xf000, 0x4100), two(0xffc0, 0xe3ff), "*l08", m68030 },
388048024e4aSbellard {"pmovefd", 4, two(0xf000, 0x4100), two(0xffc0, 0xe3ff), "|sW8", m68030 },
388148024e4aSbellard {"pmovefd", 4, two(0xf000, 0x0900), two(0xffc0, 0xfbff), "*l38", m68030 },
388248024e4aSbellard
388348024e4aSbellard {"prestore", 2, one(0xf140), one(0xffc0), "<s", m68851 },
388448024e4aSbellard
388548024e4aSbellard {"psave", 2, one(0xf100), one(0xffc0), ">s", m68851 },
388648024e4aSbellard
388748024e4aSbellard {"psac", 4, two(0xf040, 0x0007), two(0xffc0, 0xffff), "$s", m68851 },
388848024e4aSbellard {"psas", 4, two(0xf040, 0x0006), two(0xffc0, 0xffff), "$s", m68851 },
388948024e4aSbellard {"psbc", 4, two(0xf040, 0x0001), two(0xffc0, 0xffff), "$s", m68851 },
389048024e4aSbellard {"psbs", 4, two(0xf040, 0x0000), two(0xffc0, 0xffff), "$s", m68851 },
389148024e4aSbellard {"pscc", 4, two(0xf040, 0x000f), two(0xffc0, 0xffff), "$s", m68851 },
389248024e4aSbellard {"pscs", 4, two(0xf040, 0x000e), two(0xffc0, 0xffff), "$s", m68851 },
389348024e4aSbellard {"psgc", 4, two(0xf040, 0x000d), two(0xffc0, 0xffff), "$s", m68851 },
389448024e4aSbellard {"psgs", 4, two(0xf040, 0x000c), two(0xffc0, 0xffff), "$s", m68851 },
389548024e4aSbellard {"psic", 4, two(0xf040, 0x000b), two(0xffc0, 0xffff), "$s", m68851 },
389648024e4aSbellard {"psis", 4, two(0xf040, 0x000a), two(0xffc0, 0xffff), "$s", m68851 },
389748024e4aSbellard {"pslc", 4, two(0xf040, 0x0003), two(0xffc0, 0xffff), "$s", m68851 },
389848024e4aSbellard {"psls", 4, two(0xf040, 0x0002), two(0xffc0, 0xffff), "$s", m68851 },
389948024e4aSbellard {"pssc", 4, two(0xf040, 0x0005), two(0xffc0, 0xffff), "$s", m68851 },
390048024e4aSbellard {"psss", 4, two(0xf040, 0x0004), two(0xffc0, 0xffff), "$s", m68851 },
390148024e4aSbellard {"pswc", 4, two(0xf040, 0x0009), two(0xffc0, 0xffff), "$s", m68851 },
390248024e4aSbellard {"psws", 4, two(0xf040, 0x0008), two(0xffc0, 0xffff), "$s", m68851 },
390348024e4aSbellard
390448024e4aSbellard {"ptestr", 4, two(0xf000,0x8210), two(0xffc0, 0xe3f0), "T3&st8", m68030|m68851 },
390548024e4aSbellard {"ptestr", 4, two(0xf000,0x8310), two(0xffc0,0xe310), "T3&st8A9", m68030|m68851 },
390648024e4aSbellard {"ptestr", 4, two(0xf000,0x8208), two(0xffc0,0xe3f8), "D3&st8", m68030|m68851 },
390748024e4aSbellard {"ptestr", 4, two(0xf000,0x8308), two(0xffc0,0xe318), "D3&st8A9", m68030|m68851 },
390848024e4aSbellard {"ptestr", 4, two(0xf000,0x8200), two(0xffc0,0xe3fe), "f3&st8", m68030|m68851 },
390948024e4aSbellard {"ptestr", 4, two(0xf000,0x8300), two(0xffc0,0xe31e), "f3&st8A9", m68030|m68851 },
391048024e4aSbellard {"ptestr", 2, one(0xf568), one(0xfff8), "as", m68040 },
391148024e4aSbellard
391248024e4aSbellard {"ptestw", 4, two(0xf000,0x8010), two(0xffc0,0xe3f0), "T3&st8", m68030|m68851 },
391348024e4aSbellard {"ptestw", 4, two(0xf000,0x8110), two(0xffc0,0xe310), "T3&st8A9", m68030|m68851 },
391448024e4aSbellard {"ptestw", 4, two(0xf000,0x8008), two(0xffc0,0xe3f8), "D3&st8", m68030|m68851 },
391548024e4aSbellard {"ptestw", 4, two(0xf000,0x8108), two(0xffc0,0xe318), "D3&st8A9", m68030|m68851 },
391648024e4aSbellard {"ptestw", 4, two(0xf000,0x8000), two(0xffc0,0xe3fe), "f3&st8", m68030|m68851 },
391748024e4aSbellard {"ptestw", 4, two(0xf000,0x8100), two(0xffc0,0xe31e), "f3&st8A9", m68030|m68851 },
391848024e4aSbellard {"ptestw", 2, one(0xf548), one(0xfff8), "as", m68040 },
391948024e4aSbellard
392048024e4aSbellard {"ptrapacw", 6, two(0xf07a, 0x0007), two(0xffff, 0xffff), "#w", m68851 },
392148024e4aSbellard {"ptrapacl", 6, two(0xf07b, 0x0007), two(0xffff, 0xffff), "#l", m68851 },
392248024e4aSbellard {"ptrapac", 4, two(0xf07c, 0x0007), two(0xffff, 0xffff), "", m68851 },
392348024e4aSbellard
392448024e4aSbellard {"ptrapasw", 6, two(0xf07a, 0x0006), two(0xffff, 0xffff), "#w", m68851 },
392548024e4aSbellard {"ptrapasl", 6, two(0xf07b, 0x0006), two(0xffff, 0xffff), "#l", m68851 },
392648024e4aSbellard {"ptrapas", 4, two(0xf07c, 0x0006), two(0xffff, 0xffff), "", m68851 },
392748024e4aSbellard
392848024e4aSbellard {"ptrapbcw", 6, two(0xf07a, 0x0001), two(0xffff, 0xffff), "#w", m68851 },
392948024e4aSbellard {"ptrapbcl", 6, two(0xf07b, 0x0001), two(0xffff, 0xffff), "#l", m68851 },
393048024e4aSbellard {"ptrapbc", 4, two(0xf07c, 0x0001), two(0xffff, 0xffff), "", m68851 },
393148024e4aSbellard
393248024e4aSbellard {"ptrapbsw", 6, two(0xf07a, 0x0000), two(0xffff, 0xffff), "#w", m68851 },
393348024e4aSbellard {"ptrapbsl", 6, two(0xf07b, 0x0000), two(0xffff, 0xffff), "#l", m68851 },
393448024e4aSbellard {"ptrapbs", 4, two(0xf07c, 0x0000), two(0xffff, 0xffff), "", m68851 },
393548024e4aSbellard
393648024e4aSbellard {"ptrapccw", 6, two(0xf07a, 0x000f), two(0xffff, 0xffff), "#w", m68851 },
393748024e4aSbellard {"ptrapccl", 6, two(0xf07b, 0x000f), two(0xffff, 0xffff), "#l", m68851 },
393848024e4aSbellard {"ptrapcc", 4, two(0xf07c, 0x000f), two(0xffff, 0xffff), "", m68851 },
393948024e4aSbellard
394048024e4aSbellard {"ptrapcsw", 6, two(0xf07a, 0x000e), two(0xffff, 0xffff), "#w", m68851 },
394148024e4aSbellard {"ptrapcsl", 6, two(0xf07b, 0x000e), two(0xffff, 0xffff), "#l", m68851 },
394248024e4aSbellard {"ptrapcs", 4, two(0xf07c, 0x000e), two(0xffff, 0xffff), "", m68851 },
394348024e4aSbellard
394448024e4aSbellard {"ptrapgcw", 6, two(0xf07a, 0x000d), two(0xffff, 0xffff), "#w", m68851 },
394548024e4aSbellard {"ptrapgcl", 6, two(0xf07b, 0x000d), two(0xffff, 0xffff), "#l", m68851 },
394648024e4aSbellard {"ptrapgc", 4, two(0xf07c, 0x000d), two(0xffff, 0xffff), "", m68851 },
394748024e4aSbellard
394848024e4aSbellard {"ptrapgsw", 6, two(0xf07a, 0x000c), two(0xffff, 0xffff), "#w", m68851 },
394948024e4aSbellard {"ptrapgsl", 6, two(0xf07b, 0x000c), two(0xffff, 0xffff), "#l", m68851 },
395048024e4aSbellard {"ptrapgs", 4, two(0xf07c, 0x000c), two(0xffff, 0xffff), "", m68851 },
395148024e4aSbellard
395248024e4aSbellard {"ptrapicw", 6, two(0xf07a, 0x000b), two(0xffff, 0xffff), "#w", m68851 },
395348024e4aSbellard {"ptrapicl", 6, two(0xf07b, 0x000b), two(0xffff, 0xffff), "#l", m68851 },
395448024e4aSbellard {"ptrapic", 4, two(0xf07c, 0x000b), two(0xffff, 0xffff), "", m68851 },
395548024e4aSbellard
395648024e4aSbellard {"ptrapisw", 6, two(0xf07a, 0x000a), two(0xffff, 0xffff), "#w", m68851 },
395748024e4aSbellard {"ptrapisl", 6, two(0xf07b, 0x000a), two(0xffff, 0xffff), "#l", m68851 },
395848024e4aSbellard {"ptrapis", 4, two(0xf07c, 0x000a), two(0xffff, 0xffff), "", m68851 },
395948024e4aSbellard
396048024e4aSbellard {"ptraplcw", 6, two(0xf07a, 0x0003), two(0xffff, 0xffff), "#w", m68851 },
396148024e4aSbellard {"ptraplcl", 6, two(0xf07b, 0x0003), two(0xffff, 0xffff), "#l", m68851 },
396248024e4aSbellard {"ptraplc", 4, two(0xf07c, 0x0003), two(0xffff, 0xffff), "", m68851 },
396348024e4aSbellard
396448024e4aSbellard {"ptraplsw", 6, two(0xf07a, 0x0002), two(0xffff, 0xffff), "#w", m68851 },
396548024e4aSbellard {"ptraplsl", 6, two(0xf07b, 0x0002), two(0xffff, 0xffff), "#l", m68851 },
396648024e4aSbellard {"ptrapls", 4, two(0xf07c, 0x0002), two(0xffff, 0xffff), "", m68851 },
396748024e4aSbellard
396848024e4aSbellard {"ptrapscw", 6, two(0xf07a, 0x0005), two(0xffff, 0xffff), "#w", m68851 },
396948024e4aSbellard {"ptrapscl", 6, two(0xf07b, 0x0005), two(0xffff, 0xffff), "#l", m68851 },
397048024e4aSbellard {"ptrapsc", 4, two(0xf07c, 0x0005), two(0xffff, 0xffff), "", m68851 },
397148024e4aSbellard
397248024e4aSbellard {"ptrapssw", 6, two(0xf07a, 0x0004), two(0xffff, 0xffff), "#w", m68851 },
397348024e4aSbellard {"ptrapssl", 6, two(0xf07b, 0x0004), two(0xffff, 0xffff), "#l", m68851 },
397448024e4aSbellard {"ptrapss", 4, two(0xf07c, 0x0004), two(0xffff, 0xffff), "", m68851 },
397548024e4aSbellard
397648024e4aSbellard {"ptrapwcw", 6, two(0xf07a, 0x0009), two(0xffff, 0xffff), "#w", m68851 },
397748024e4aSbellard {"ptrapwcl", 6, two(0xf07b, 0x0009), two(0xffff, 0xffff), "#l", m68851 },
397848024e4aSbellard {"ptrapwc", 4, two(0xf07c, 0x0009), two(0xffff, 0xffff), "", m68851 },
397948024e4aSbellard
398048024e4aSbellard {"ptrapwsw", 6, two(0xf07a, 0x0008), two(0xffff, 0xffff), "#w", m68851 },
398148024e4aSbellard {"ptrapwsl", 6, two(0xf07b, 0x0008), two(0xffff, 0xffff), "#l", m68851 },
398248024e4aSbellard {"ptrapws", 4, two(0xf07c, 0x0008), two(0xffff, 0xffff), "", m68851 },
398348024e4aSbellard
398448024e4aSbellard {"pulse", 2, one(0045314), one(0177777), "", m68060 | mcfisa_a },
398548024e4aSbellard
398648024e4aSbellard {"pvalid", 4, two(0xf000, 0x2800), two(0xffc0, 0xffff), "Vs&s", m68851 },
398748024e4aSbellard {"pvalid", 4, two(0xf000, 0x2c00), two(0xffc0, 0xfff8), "A3&s", m68851 },
398848024e4aSbellard
398948024e4aSbellard /* FIXME: don't allow Dw==Dx. */
399048024e4aSbellard {"remsl", 4, two(0x4c40, 0x0800), two(0xffc0, 0x8ff8), "qsD3D1", mcfhwdiv },
399148024e4aSbellard {"remul", 4, two(0x4c40, 0x0000), two(0xffc0, 0x8ff8), "qsD3D1", mcfhwdiv },
399248024e4aSbellard
399348024e4aSbellard {"reset", 2, one(0047160), one(0177777), "", m68000up },
399448024e4aSbellard
399548024e4aSbellard {"rolb", 2, one(0160430), one(0170770), "QdDs", m68000up },
399648024e4aSbellard {"rolb", 2, one(0160470), one(0170770), "DdDs", m68000up },
399748024e4aSbellard {"rolw", 2, one(0160530), one(0170770), "QdDs", m68000up },
399848024e4aSbellard {"rolw", 2, one(0160570), one(0170770), "DdDs", m68000up },
399948024e4aSbellard {"rolw", 2, one(0163700), one(0177700), "~s", m68000up },
400048024e4aSbellard {"roll", 2, one(0160630), one(0170770), "QdDs", m68000up },
400148024e4aSbellard {"roll", 2, one(0160670), one(0170770), "DdDs", m68000up },
400248024e4aSbellard
400348024e4aSbellard {"rorb", 2, one(0160030), one(0170770), "QdDs", m68000up },
400448024e4aSbellard {"rorb", 2, one(0160070), one(0170770), "DdDs", m68000up },
400548024e4aSbellard {"rorw", 2, one(0160130), one(0170770), "QdDs", m68000up },
400648024e4aSbellard {"rorw", 2, one(0160170), one(0170770), "DdDs", m68000up },
400748024e4aSbellard {"rorw", 2, one(0163300), one(0177700), "~s", m68000up },
400848024e4aSbellard {"rorl", 2, one(0160230), one(0170770), "QdDs", m68000up },
400948024e4aSbellard {"rorl", 2, one(0160270), one(0170770), "DdDs", m68000up },
401048024e4aSbellard
401148024e4aSbellard {"roxlb", 2, one(0160420), one(0170770), "QdDs", m68000up },
401248024e4aSbellard {"roxlb", 2, one(0160460), one(0170770), "DdDs", m68000up },
401348024e4aSbellard {"roxlw", 2, one(0160520), one(0170770), "QdDs", m68000up },
401448024e4aSbellard {"roxlw", 2, one(0160560), one(0170770), "DdDs", m68000up },
401548024e4aSbellard {"roxlw", 2, one(0162700), one(0177700), "~s", m68000up },
401648024e4aSbellard {"roxll", 2, one(0160620), one(0170770), "QdDs", m68000up },
401748024e4aSbellard {"roxll", 2, one(0160660), one(0170770), "DdDs", m68000up },
401848024e4aSbellard
401948024e4aSbellard {"roxrb", 2, one(0160020), one(0170770), "QdDs", m68000up },
402048024e4aSbellard {"roxrb", 2, one(0160060), one(0170770), "DdDs", m68000up },
402148024e4aSbellard {"roxrw", 2, one(0160120), one(0170770), "QdDs", m68000up },
402248024e4aSbellard {"roxrw", 2, one(0160160), one(0170770), "DdDs", m68000up },
402348024e4aSbellard {"roxrw", 2, one(0162300), one(0177700), "~s", m68000up },
402448024e4aSbellard {"roxrl", 2, one(0160220), one(0170770), "QdDs", m68000up },
402548024e4aSbellard {"roxrl", 2, one(0160260), one(0170770), "DdDs", m68000up },
402648024e4aSbellard
402748024e4aSbellard {"rtd", 4, one(0047164), one(0177777), "#w", m68010up },
402848024e4aSbellard
402948024e4aSbellard {"rte", 2, one(0047163), one(0177777), "", m68000up | mcfisa_a },
403048024e4aSbellard
403148024e4aSbellard {"rtm", 2, one(0003300), one(0177760), "Rs", m68020 },
403248024e4aSbellard
403348024e4aSbellard {"rtr", 2, one(0047167), one(0177777), "", m68000up },
403448024e4aSbellard
403548024e4aSbellard {"rts", 2, one(0047165), one(0177777), "", m68000up | mcfisa_a },
403648024e4aSbellard
403748024e4aSbellard {"satsl", 2, one(0046200), one(0177770), "Ds", mcfisa_b },
403848024e4aSbellard
403948024e4aSbellard {"sbcd", 2, one(0100400), one(0170770), "DsDd", m68000up },
404048024e4aSbellard {"sbcd", 2, one(0100410), one(0170770), "-s-d", m68000up },
404148024e4aSbellard
404248024e4aSbellard {"scc", 2, one(0052300), one(0177700), "$s", m68000up },
404348024e4aSbellard {"scc", 2, one(0052300), one(0177700), "Ds", mcfisa_a },
404448024e4aSbellard {"scs", 2, one(0052700), one(0177700), "$s", m68000up },
404548024e4aSbellard {"scs", 2, one(0052700), one(0177700), "Ds", mcfisa_a },
404648024e4aSbellard {"seq", 2, one(0053700), one(0177700), "$s", m68000up },
404748024e4aSbellard {"seq", 2, one(0053700), one(0177700), "Ds", mcfisa_a },
404848024e4aSbellard {"sf", 2, one(0050700), one(0177700), "$s", m68000up },
404948024e4aSbellard {"sf", 2, one(0050700), one(0177700), "Ds", mcfisa_a },
405048024e4aSbellard {"sge", 2, one(0056300), one(0177700), "$s", m68000up },
405148024e4aSbellard {"sge", 2, one(0056300), one(0177700), "Ds", mcfisa_a },
405248024e4aSbellard {"sgt", 2, one(0057300), one(0177700), "$s", m68000up },
405348024e4aSbellard {"sgt", 2, one(0057300), one(0177700), "Ds", mcfisa_a },
405448024e4aSbellard {"shi", 2, one(0051300), one(0177700), "$s", m68000up },
405548024e4aSbellard {"shi", 2, one(0051300), one(0177700), "Ds", mcfisa_a },
405648024e4aSbellard {"sle", 2, one(0057700), one(0177700), "$s", m68000up },
405748024e4aSbellard {"sle", 2, one(0057700), one(0177700), "Ds", mcfisa_a },
405848024e4aSbellard {"sls", 2, one(0051700), one(0177700), "$s", m68000up },
405948024e4aSbellard {"sls", 2, one(0051700), one(0177700), "Ds", mcfisa_a },
406048024e4aSbellard {"slt", 2, one(0056700), one(0177700), "$s", m68000up },
406148024e4aSbellard {"slt", 2, one(0056700), one(0177700), "Ds", mcfisa_a },
406248024e4aSbellard {"smi", 2, one(0055700), one(0177700), "$s", m68000up },
406348024e4aSbellard {"smi", 2, one(0055700), one(0177700), "Ds", mcfisa_a },
406448024e4aSbellard {"sne", 2, one(0053300), one(0177700), "$s", m68000up },
406548024e4aSbellard {"sne", 2, one(0053300), one(0177700), "Ds", mcfisa_a },
406648024e4aSbellard {"spl", 2, one(0055300), one(0177700), "$s", m68000up },
406748024e4aSbellard {"spl", 2, one(0055300), one(0177700), "Ds", mcfisa_a },
406848024e4aSbellard {"st", 2, one(0050300), one(0177700), "$s", m68000up },
406948024e4aSbellard {"st", 2, one(0050300), one(0177700), "Ds", mcfisa_a },
407048024e4aSbellard {"svc", 2, one(0054300), one(0177700), "$s", m68000up },
407148024e4aSbellard {"svc", 2, one(0054300), one(0177700), "Ds", mcfisa_a },
407248024e4aSbellard {"svs", 2, one(0054700), one(0177700), "$s", m68000up },
407348024e4aSbellard {"svs", 2, one(0054700), one(0177700), "Ds", mcfisa_a },
407448024e4aSbellard
407548024e4aSbellard {"stop", 4, one(0047162), one(0177777), "#w", m68000up | mcfisa_a },
407648024e4aSbellard
407748024e4aSbellard {"strldsr", 4, two(0040347,0043374), two(0177777,0177777), "#w", mcfisa_aa},
407848024e4aSbellard
407948024e4aSbellard {"subal", 2, one(0110700), one(0170700), "*lAd", m68000up | mcfisa_a },
408048024e4aSbellard {"subaw", 2, one(0110300), one(0170700), "*wAd", m68000up },
408148024e4aSbellard
408248024e4aSbellard {"subib", 4, one(0002000), one(0177700), "#b$s", m68000up },
408348024e4aSbellard {"subiw", 4, one(0002100), one(0177700), "#w$s", m68000up },
408448024e4aSbellard {"subil", 6, one(0002200), one(0177700), "#l$s", m68000up },
408548024e4aSbellard {"subil", 6, one(0002200), one(0177700), "#lDs", mcfisa_a },
408648024e4aSbellard
408748024e4aSbellard {"subqb", 2, one(0050400), one(0170700), "Qd%s", m68000up },
408848024e4aSbellard {"subqw", 2, one(0050500), one(0170700), "Qd%s", m68000up },
408948024e4aSbellard {"subql", 2, one(0050600), one(0170700), "Qd%s", m68000up | mcfisa_a },
409048024e4aSbellard
409148024e4aSbellard /* The sub opcode can generate the suba, subi, and subq instructions. */
409248024e4aSbellard {"subb", 2, one(0050400), one(0170700), "Qd%s", m68000up },
409348024e4aSbellard {"subb", 4, one(0002000), one(0177700), "#b$s", m68000up },
409448024e4aSbellard {"subb", 2, one(0110000), one(0170700), ";bDd", m68000up },
409548024e4aSbellard {"subb", 2, one(0110400), one(0170700), "Dd~s", m68000up },
409648024e4aSbellard {"subw", 2, one(0050500), one(0170700), "Qd%s", m68000up },
409748024e4aSbellard {"subw", 4, one(0002100), one(0177700), "#w$s", m68000up },
409848024e4aSbellard {"subw", 2, one(0110300), one(0170700), "*wAd", m68000up },
409948024e4aSbellard {"subw", 2, one(0110100), one(0170700), "*wDd", m68000up },
410048024e4aSbellard {"subw", 2, one(0110500), one(0170700), "Dd~s", m68000up },
410148024e4aSbellard {"subl", 2, one(0050600), one(0170700), "Qd%s", m68000up | mcfisa_a },
410248024e4aSbellard {"subl", 6, one(0002200), one(0177700), "#l$s", m68000up },
410348024e4aSbellard {"subl", 6, one(0002200), one(0177700), "#lDs", mcfisa_a },
410448024e4aSbellard {"subl", 2, one(0110700), one(0170700), "*lAd", m68000up | mcfisa_a },
410548024e4aSbellard {"subl", 2, one(0110200), one(0170700), "*lDd", m68000up | mcfisa_a },
410648024e4aSbellard {"subl", 2, one(0110600), one(0170700), "Dd~s", m68000up | mcfisa_a },
410748024e4aSbellard
410848024e4aSbellard {"subxb", 2, one(0110400), one(0170770), "DsDd", m68000up },
410948024e4aSbellard {"subxb", 2, one(0110410), one(0170770), "-s-d", m68000up },
411048024e4aSbellard {"subxw", 2, one(0110500), one(0170770), "DsDd", m68000up },
411148024e4aSbellard {"subxw", 2, one(0110510), one(0170770), "-s-d", m68000up },
411248024e4aSbellard {"subxl", 2, one(0110600), one(0170770), "DsDd", m68000up | mcfisa_a },
411348024e4aSbellard {"subxl", 2, one(0110610), one(0170770), "-s-d", m68000up },
411448024e4aSbellard
411548024e4aSbellard {"swap", 2, one(0044100), one(0177770), "Ds", m68000up | mcfisa_a },
411648024e4aSbellard
411748024e4aSbellard /* swbeg and swbegl are magic constants used on sysV68. The compiler
411848024e4aSbellard generates them before a switch table. They tell the debugger and
411948024e4aSbellard disassembler that a switch table follows. The parameter is the
412048024e4aSbellard number of elements in the table. swbeg means that the entries in
412148024e4aSbellard the table are word (2 byte) sized, and swbegl means that the
412248024e4aSbellard entries in the table are longword (4 byte) sized. */
412348024e4aSbellard {"swbeg", 4, one(0045374), one(0177777), "#w", m68000up | mcfisa_a },
412448024e4aSbellard {"swbegl", 6, one(0045375), one(0177777), "#l", m68000up | mcfisa_a },
412548024e4aSbellard
412648024e4aSbellard {"tas", 2, one(0045300), one(0177700), "$s", m68000up | mcfisa_b},
412748024e4aSbellard
412848024e4aSbellard #define TBL1(name,insn_size,signed,round,size) \
412948024e4aSbellard {name, insn_size, two(0174000, (signed<<11)|(!round<<10)|(size<<6)|0000400), \
413048024e4aSbellard two(0177700,0107777), "!sD1", cpu32 }, \
413148024e4aSbellard {name, insn_size, two(0174000, (signed<<11)|(!round<<10)|(size<<6)), \
413248024e4aSbellard two(0177770,0107770), "DsD3D1", cpu32 }
413348024e4aSbellard #define TBL(name1, name2, name3, s, r) \
413448024e4aSbellard TBL1(name1, 4, s, r, 0), TBL1(name2, 4, s, r, 1), TBL1(name3, 4, s, r, 2)
413548024e4aSbellard TBL("tblsb", "tblsw", "tblsl", 2, 1),
413648024e4aSbellard TBL("tblsnb", "tblsnw", "tblsnl", 2, 0),
413748024e4aSbellard TBL("tblub", "tbluw", "tblul", 0, 1),
413848024e4aSbellard TBL("tblunb", "tblunw", "tblunl", 0, 0),
413948024e4aSbellard
414048024e4aSbellard {"trap", 2, one(0047100), one(0177760), "Ts", m68000up | mcfisa_a },
414148024e4aSbellard
414248024e4aSbellard {"trapcc", 2, one(0052374), one(0177777), "", m68020up | cpu32 },
414348024e4aSbellard {"trapcs", 2, one(0052774), one(0177777), "", m68020up | cpu32 },
414448024e4aSbellard {"trapeq", 2, one(0053774), one(0177777), "", m68020up | cpu32 },
414548024e4aSbellard {"trapf", 2, one(0050774), one(0177777), "", m68020up | cpu32 | mcfisa_a },
414648024e4aSbellard {"trapge", 2, one(0056374), one(0177777), "", m68020up | cpu32 },
414748024e4aSbellard {"trapgt", 2, one(0057374), one(0177777), "", m68020up | cpu32 },
414848024e4aSbellard {"traphi", 2, one(0051374), one(0177777), "", m68020up | cpu32 },
414948024e4aSbellard {"traple", 2, one(0057774), one(0177777), "", m68020up | cpu32 },
415048024e4aSbellard {"trapls", 2, one(0051774), one(0177777), "", m68020up | cpu32 },
415148024e4aSbellard {"traplt", 2, one(0056774), one(0177777), "", m68020up | cpu32 },
415248024e4aSbellard {"trapmi", 2, one(0055774), one(0177777), "", m68020up | cpu32 },
415348024e4aSbellard {"trapne", 2, one(0053374), one(0177777), "", m68020up | cpu32 },
415448024e4aSbellard {"trappl", 2, one(0055374), one(0177777), "", m68020up | cpu32 },
415548024e4aSbellard {"trapt", 2, one(0050374), one(0177777), "", m68020up | cpu32 },
415648024e4aSbellard {"trapvc", 2, one(0054374), one(0177777), "", m68020up | cpu32 },
415748024e4aSbellard {"trapvs", 2, one(0054774), one(0177777), "", m68020up | cpu32 },
415848024e4aSbellard
415948024e4aSbellard {"trapccw", 4, one(0052372), one(0177777), "#w", m68020up|cpu32 },
416048024e4aSbellard {"trapcsw", 4, one(0052772), one(0177777), "#w", m68020up|cpu32 },
416148024e4aSbellard {"trapeqw", 4, one(0053772), one(0177777), "#w", m68020up|cpu32 },
416248024e4aSbellard {"trapfw", 4, one(0050772), one(0177777), "#w", m68020up|cpu32|mcfisa_a},
416348024e4aSbellard {"trapgew", 4, one(0056372), one(0177777), "#w", m68020up|cpu32 },
416448024e4aSbellard {"trapgtw", 4, one(0057372), one(0177777), "#w", m68020up|cpu32 },
416548024e4aSbellard {"traphiw", 4, one(0051372), one(0177777), "#w", m68020up|cpu32 },
416648024e4aSbellard {"traplew", 4, one(0057772), one(0177777), "#w", m68020up|cpu32 },
416748024e4aSbellard {"traplsw", 4, one(0051772), one(0177777), "#w", m68020up|cpu32 },
416848024e4aSbellard {"trapltw", 4, one(0056772), one(0177777), "#w", m68020up|cpu32 },
416948024e4aSbellard {"trapmiw", 4, one(0055772), one(0177777), "#w", m68020up|cpu32 },
417048024e4aSbellard {"trapnew", 4, one(0053372), one(0177777), "#w", m68020up|cpu32 },
417148024e4aSbellard {"trapplw", 4, one(0055372), one(0177777), "#w", m68020up|cpu32 },
417248024e4aSbellard {"traptw", 4, one(0050372), one(0177777), "#w", m68020up|cpu32 },
417348024e4aSbellard {"trapvcw", 4, one(0054372), one(0177777), "#w", m68020up|cpu32 },
417448024e4aSbellard {"trapvsw", 4, one(0054772), one(0177777), "#w", m68020up|cpu32 },
417548024e4aSbellard
417648024e4aSbellard {"trapccl", 6, one(0052373), one(0177777), "#l", m68020up|cpu32 },
417748024e4aSbellard {"trapcsl", 6, one(0052773), one(0177777), "#l", m68020up|cpu32 },
417848024e4aSbellard {"trapeql", 6, one(0053773), one(0177777), "#l", m68020up|cpu32 },
417948024e4aSbellard {"trapfl", 6, one(0050773), one(0177777), "#l", m68020up|cpu32|mcfisa_a},
418048024e4aSbellard {"trapgel", 6, one(0056373), one(0177777), "#l", m68020up|cpu32 },
418148024e4aSbellard {"trapgtl", 6, one(0057373), one(0177777), "#l", m68020up|cpu32 },
418248024e4aSbellard {"traphil", 6, one(0051373), one(0177777), "#l", m68020up|cpu32 },
418348024e4aSbellard {"traplel", 6, one(0057773), one(0177777), "#l", m68020up|cpu32 },
418448024e4aSbellard {"traplsl", 6, one(0051773), one(0177777), "#l", m68020up|cpu32 },
418548024e4aSbellard {"trapltl", 6, one(0056773), one(0177777), "#l", m68020up|cpu32 },
418648024e4aSbellard {"trapmil", 6, one(0055773), one(0177777), "#l", m68020up|cpu32 },
418748024e4aSbellard {"trapnel", 6, one(0053373), one(0177777), "#l", m68020up|cpu32 },
418848024e4aSbellard {"trappll", 6, one(0055373), one(0177777), "#l", m68020up|cpu32 },
418948024e4aSbellard {"traptl", 6, one(0050373), one(0177777), "#l", m68020up|cpu32 },
419048024e4aSbellard {"trapvcl", 6, one(0054373), one(0177777), "#l", m68020up|cpu32 },
419148024e4aSbellard {"trapvsl", 6, one(0054773), one(0177777), "#l", m68020up|cpu32 },
419248024e4aSbellard
419348024e4aSbellard {"trapv", 2, one(0047166), one(0177777), "", m68000up },
419448024e4aSbellard
419548024e4aSbellard {"tstb", 2, one(0045000), one(0177700), ";b", m68020up|cpu32|mcfisa_a },
419648024e4aSbellard {"tstb", 2, one(0045000), one(0177700), "$b", m68000up },
419748024e4aSbellard {"tstw", 2, one(0045100), one(0177700), "*w", m68020up|cpu32|mcfisa_a },
419848024e4aSbellard {"tstw", 2, one(0045100), one(0177700), "$w", m68000up },
419948024e4aSbellard {"tstl", 2, one(0045200), one(0177700), "*l", m68020up|cpu32|mcfisa_a },
420048024e4aSbellard {"tstl", 2, one(0045200), one(0177700), "$l", m68000up },
420148024e4aSbellard
420248024e4aSbellard {"unlk", 2, one(0047130), one(0177770), "As", m68000up | mcfisa_a },
420348024e4aSbellard
420448024e4aSbellard {"unpk", 4, one(0100600), one(0170770), "DsDd#w", m68020up },
420548024e4aSbellard {"unpk", 4, one(0100610), one(0170770), "-s-d#w", m68020up },
420648024e4aSbellard
420748024e4aSbellard {"wddatab", 2, one(0175400), one(0177700), "~s", mcfisa_a },
420848024e4aSbellard {"wddataw", 2, one(0175500), one(0177700), "~s", mcfisa_a },
420948024e4aSbellard {"wddatal", 2, one(0175600), one(0177700), "~s", mcfisa_a },
421048024e4aSbellard
421148024e4aSbellard {"wdebug", 4, two(0175720, 03), two(0177770, 0xffff), "as", mcfisa_a },
421248024e4aSbellard {"wdebug", 4, two(0175750, 03), two(0177770, 0xffff), "ds", mcfisa_a },
421348024e4aSbellard };
421448024e4aSbellard
421548024e4aSbellard const int m68k_numopcodes = sizeof m68k_opcodes / sizeof m68k_opcodes[0];
421648024e4aSbellard
421748024e4aSbellard /* These aliases used to be in the above table, each one duplicating
421848024e4aSbellard all of the entries for its primary exactly. This table was
421948024e4aSbellard constructed by mechanical processing of the opcode table, with a
422048024e4aSbellard small number of tweaks done by hand. There are probably a lot more
422148024e4aSbellard aliases above that could be moved down here, except for very minor
422248024e4aSbellard differences. */
422348024e4aSbellard
422448024e4aSbellard const struct m68k_opcode_alias m68k_opcode_aliases[] =
422548024e4aSbellard {
422648024e4aSbellard { "add", "addw", },
422748024e4aSbellard { "adda", "addaw", },
422848024e4aSbellard { "addi", "addiw", },
422948024e4aSbellard { "addq", "addqw", },
423048024e4aSbellard { "addx", "addxw", },
423148024e4aSbellard { "asl", "aslw", },
423248024e4aSbellard { "asr", "asrw", },
423348024e4aSbellard { "bhi", "bhiw", },
423448024e4aSbellard { "bls", "blsw", },
423548024e4aSbellard { "bcc", "bccw", },
423648024e4aSbellard { "bcs", "bcsw", },
423748024e4aSbellard { "bne", "bnew", },
423848024e4aSbellard { "beq", "beqw", },
423948024e4aSbellard { "bvc", "bvcw", },
424048024e4aSbellard { "bvs", "bvsw", },
424148024e4aSbellard { "bpl", "bplw", },
424248024e4aSbellard { "bmi", "bmiw", },
424348024e4aSbellard { "bge", "bgew", },
424448024e4aSbellard { "blt", "bltw", },
424548024e4aSbellard { "bgt", "bgtw", },
424648024e4aSbellard { "ble", "blew", },
424748024e4aSbellard { "bra", "braw", },
424848024e4aSbellard { "bsr", "bsrw", },
424948024e4aSbellard { "bhib", "bhis", },
425048024e4aSbellard { "blsb", "blss", },
425148024e4aSbellard { "bccb", "bccs", },
425248024e4aSbellard { "bcsb", "bcss", },
425348024e4aSbellard { "bneb", "bnes", },
425448024e4aSbellard { "beqb", "beqs", },
425548024e4aSbellard { "bvcb", "bvcs", },
425648024e4aSbellard { "bvsb", "bvss", },
425748024e4aSbellard { "bplb", "bpls", },
425848024e4aSbellard { "bmib", "bmis", },
425948024e4aSbellard { "bgeb", "bges", },
426048024e4aSbellard { "bltb", "blts", },
426148024e4aSbellard { "bgtb", "bgts", },
426248024e4aSbellard { "bleb", "bles", },
426348024e4aSbellard { "brab", "bras", },
426448024e4aSbellard { "bsrb", "bsrs", },
426548024e4aSbellard { "bhs", "bccw" },
426648024e4aSbellard { "bhss", "bccs" },
426748024e4aSbellard { "bhsb", "bccs" },
426848024e4aSbellard { "bhsw", "bccw" },
426948024e4aSbellard { "bhsl", "bccl" },
427048024e4aSbellard { "blo", "bcsw" },
427148024e4aSbellard { "blos", "bcss" },
427248024e4aSbellard { "blob", "bcss" },
427348024e4aSbellard { "blow", "bcsw" },
427448024e4aSbellard { "blol", "bcsl" },
427548024e4aSbellard { "br", "braw", },
427648024e4aSbellard { "brs", "bras", },
427748024e4aSbellard { "brb", "bras", },
427848024e4aSbellard { "brw", "braw", },
427948024e4aSbellard { "brl", "bral", },
428048024e4aSbellard { "jfnlt", "bcc", }, /* Apparently a sun alias. */
428148024e4aSbellard { "jfngt", "ble", }, /* Apparently a sun alias. */
428248024e4aSbellard { "jfeq", "beqs", }, /* Apparently a sun alias. */
428348024e4aSbellard { "bchgb", "bchg", },
428448024e4aSbellard { "bchgl", "bchg", },
428548024e4aSbellard { "bclrb", "bclr", },
428648024e4aSbellard { "bclrl", "bclr", },
428748024e4aSbellard { "bsetb", "bset", },
428848024e4aSbellard { "bsetl", "bset", },
428948024e4aSbellard { "btstb", "btst", },
429048024e4aSbellard { "btstl", "btst", },
429148024e4aSbellard { "cas2", "cas2w", },
429248024e4aSbellard { "cas", "casw", },
429348024e4aSbellard { "chk2", "chk2w", },
429448024e4aSbellard { "chk", "chkw", },
429548024e4aSbellard { "clr", "clrw", },
429648024e4aSbellard { "cmp2", "cmp2w", },
429748024e4aSbellard { "cmpa", "cmpaw", },
429848024e4aSbellard { "cmpi", "cmpiw", },
429948024e4aSbellard { "cmpm", "cmpmw", },
430048024e4aSbellard { "cmp", "cmpw", },
430148024e4aSbellard { "dbccw", "dbcc", },
430248024e4aSbellard { "dbcsw", "dbcs", },
430348024e4aSbellard { "dbeqw", "dbeq", },
430448024e4aSbellard { "dbfw", "dbf", },
430548024e4aSbellard { "dbgew", "dbge", },
430648024e4aSbellard { "dbgtw", "dbgt", },
430748024e4aSbellard { "dbhiw", "dbhi", },
430848024e4aSbellard { "dblew", "dble", },
430948024e4aSbellard { "dblsw", "dbls", },
431048024e4aSbellard { "dbltw", "dblt", },
431148024e4aSbellard { "dbmiw", "dbmi", },
431248024e4aSbellard { "dbnew", "dbne", },
431348024e4aSbellard { "dbplw", "dbpl", },
431448024e4aSbellard { "dbtw", "dbt", },
431548024e4aSbellard { "dbvcw", "dbvc", },
431648024e4aSbellard { "dbvsw", "dbvs", },
431748024e4aSbellard { "dbhs", "dbcc", },
431848024e4aSbellard { "dbhsw", "dbcc", },
431948024e4aSbellard { "dbra", "dbf", },
432048024e4aSbellard { "dbraw", "dbf", },
432148024e4aSbellard { "tdivsl", "divsl", },
432248024e4aSbellard { "divs", "divsw", },
432348024e4aSbellard { "divu", "divuw", },
432448024e4aSbellard { "ext", "extw", },
432548024e4aSbellard { "extbw", "extw", },
432648024e4aSbellard { "extwl", "extl", },
432748024e4aSbellard { "fbneq", "fbne", },
432848024e4aSbellard { "fbsneq", "fbsne", },
432948024e4aSbellard { "fdbneq", "fdbne", },
433048024e4aSbellard { "fdbsneq", "fdbsne", },
433148024e4aSbellard { "fmovecr", "fmovecrx", },
433248024e4aSbellard { "fmovm", "fmovem", },
433348024e4aSbellard { "fsneq", "fsne", },
433448024e4aSbellard { "fssneq", "fssne", },
433548024e4aSbellard { "ftrapneq", "ftrapne", },
433648024e4aSbellard { "ftrapsneq", "ftrapsne", },
433748024e4aSbellard { "fjneq", "fjne", },
433848024e4aSbellard { "fjsneq", "fjsne", },
433948024e4aSbellard { "jmpl", "jmp", },
434048024e4aSbellard { "jmps", "jmp", },
434148024e4aSbellard { "jsrl", "jsr", },
434248024e4aSbellard { "jsrs", "jsr", },
434348024e4aSbellard { "leal", "lea", },
434448024e4aSbellard { "lsl", "lslw", },
434548024e4aSbellard { "lsr", "lsrw", },
434648024e4aSbellard { "mac", "macw" },
434748024e4aSbellard { "movea", "moveaw", },
434848024e4aSbellard { "movem", "movemw", },
434948024e4aSbellard { "movml", "moveml", },
435048024e4aSbellard { "movmw", "movemw", },
435148024e4aSbellard { "movm", "movemw", },
435248024e4aSbellard { "movep", "movepw", },
435348024e4aSbellard { "movpw", "movepw", },
435448024e4aSbellard { "moves", "movesw" },
435548024e4aSbellard { "muls", "mulsw", },
435648024e4aSbellard { "mulu", "muluw", },
435748024e4aSbellard { "msac", "msacw" },
435848024e4aSbellard { "nbcdb", "nbcd" },
435948024e4aSbellard { "neg", "negw", },
436048024e4aSbellard { "negx", "negxw", },
436148024e4aSbellard { "not", "notw", },
436248024e4aSbellard { "peal", "pea", },
436348024e4aSbellard { "rol", "rolw", },
436448024e4aSbellard { "ror", "rorw", },
436548024e4aSbellard { "roxl", "roxlw", },
436648024e4aSbellard { "roxr", "roxrw", },
436748024e4aSbellard { "sats", "satsl", },
436848024e4aSbellard { "sbcdb", "sbcd", },
436948024e4aSbellard { "sccb", "scc", },
437048024e4aSbellard { "scsb", "scs", },
437148024e4aSbellard { "seqb", "seq", },
437248024e4aSbellard { "sfb", "sf", },
437348024e4aSbellard { "sgeb", "sge", },
437448024e4aSbellard { "sgtb", "sgt", },
437548024e4aSbellard { "shib", "shi", },
437648024e4aSbellard { "sleb", "sle", },
437748024e4aSbellard { "slsb", "sls", },
437848024e4aSbellard { "sltb", "slt", },
437948024e4aSbellard { "smib", "smi", },
438048024e4aSbellard { "sneb", "sne", },
438148024e4aSbellard { "splb", "spl", },
438248024e4aSbellard { "stb", "st", },
438348024e4aSbellard { "svcb", "svc", },
438448024e4aSbellard { "svsb", "svs", },
438548024e4aSbellard { "sfge", "sge", },
438648024e4aSbellard { "sfgt", "sgt", },
438748024e4aSbellard { "sfle", "sle", },
438848024e4aSbellard { "sflt", "slt", },
438948024e4aSbellard { "sfneq", "sne", },
439048024e4aSbellard { "suba", "subaw", },
439148024e4aSbellard { "subi", "subiw", },
439248024e4aSbellard { "subq", "subqw", },
439348024e4aSbellard { "sub", "subw", },
439448024e4aSbellard { "subx", "subxw", },
439548024e4aSbellard { "swapw", "swap", },
439648024e4aSbellard { "tasb", "tas", },
439748024e4aSbellard { "tpcc", "trapcc", },
439848024e4aSbellard { "tcc", "trapcc", },
439948024e4aSbellard { "tst", "tstw", },
440048024e4aSbellard { "jbra", "jra", },
440148024e4aSbellard { "jbhi", "jhi", },
440248024e4aSbellard { "jbls", "jls", },
440348024e4aSbellard { "jbcc", "jcc", },
440448024e4aSbellard { "jbcs", "jcs", },
440548024e4aSbellard { "jbne", "jne", },
440648024e4aSbellard { "jbeq", "jeq", },
440748024e4aSbellard { "jbvc", "jvc", },
440848024e4aSbellard { "jbvs", "jvs", },
440948024e4aSbellard { "jbpl", "jpl", },
441048024e4aSbellard { "jbmi", "jmi", },
441148024e4aSbellard { "jbge", "jge", },
441248024e4aSbellard { "jblt", "jlt", },
441348024e4aSbellard { "jbgt", "jgt", },
441448024e4aSbellard { "jble", "jle", },
441548024e4aSbellard { "movql", "moveq", },
441648024e4aSbellard { "moveql", "moveq", },
441748024e4aSbellard { "movl", "movel", },
441848024e4aSbellard { "movq", "moveq", },
441948024e4aSbellard { "moval", "moveal", },
442048024e4aSbellard { "movaw", "moveaw", },
442148024e4aSbellard { "movb", "moveb", },
442248024e4aSbellard { "movc", "movec", },
442348024e4aSbellard { "movecl", "movec", },
442448024e4aSbellard { "movpl", "movepl", },
442548024e4aSbellard { "movw", "movew", },
442648024e4aSbellard { "movsb", "movesb", },
442748024e4aSbellard { "movsl", "movesl", },
442848024e4aSbellard { "movsw", "movesw", },
442948024e4aSbellard { "mov3q", "mov3ql", },
443048024e4aSbellard
443148024e4aSbellard { "tdivul", "divul", }, /* For m68k-svr4. */
443248024e4aSbellard { "fmovb", "fmoveb", },
443348024e4aSbellard { "fsmovb", "fsmoveb", },
443448024e4aSbellard { "fdmovb", "fdmoveb", },
443548024e4aSbellard { "fmovd", "fmoved", },
443648024e4aSbellard { "fsmovd", "fsmoved", },
443748024e4aSbellard { "fmovl", "fmovel", },
443848024e4aSbellard { "fsmovl", "fsmovel", },
443948024e4aSbellard { "fdmovl", "fdmovel", },
444048024e4aSbellard { "fmovp", "fmovep", },
444148024e4aSbellard { "fsmovp", "fsmovep", },
444248024e4aSbellard { "fdmovp", "fdmovep", },
444348024e4aSbellard { "fmovs", "fmoves", },
444448024e4aSbellard { "fsmovs", "fsmoves", },
444548024e4aSbellard { "fdmovs", "fdmoves", },
444648024e4aSbellard { "fmovw", "fmovew", },
444748024e4aSbellard { "fsmovw", "fsmovew", },
444848024e4aSbellard { "fdmovw", "fdmovew", },
444948024e4aSbellard { "fmovx", "fmovex", },
445048024e4aSbellard { "fsmovx", "fsmovex", },
445148024e4aSbellard { "fdmovx", "fdmovex", },
445248024e4aSbellard { "fmovcr", "fmovecr", },
445348024e4aSbellard { "fmovcrx", "fmovecrx", },
445448024e4aSbellard { "ftestb", "ftstb", },
445548024e4aSbellard { "ftestd", "ftstd", },
445648024e4aSbellard { "ftestl", "ftstl", },
445748024e4aSbellard { "ftestp", "ftstp", },
445848024e4aSbellard { "ftests", "ftsts", },
445948024e4aSbellard { "ftestw", "ftstw", },
446048024e4aSbellard { "ftestx", "ftstx", },
446148024e4aSbellard
446248024e4aSbellard { "bitrevl", "bitrev", },
446348024e4aSbellard { "byterevl", "byterev", },
446448024e4aSbellard { "ff1l", "ff1", },
446548024e4aSbellard
446648024e4aSbellard };
446748024e4aSbellard
446848024e4aSbellard const int m68k_numaliases =
446948024e4aSbellard sizeof m68k_opcode_aliases / sizeof m68k_opcode_aliases[0];
447048024e4aSbellard /* **** End of m68k-opc.c */
447148024e4aSbellard /* **** floatformat.c from sourceware.org CVS 2005-08-14. */
447248024e4aSbellard /* IEEE floating point support routines, for GDB, the GNU Debugger.
447348024e4aSbellard Copyright (C) 1991, 1994, 1999, 2000, 2003 Free Software Foundation, Inc.
447448024e4aSbellard
447548024e4aSbellard This file is part of GDB.
447648024e4aSbellard
447748024e4aSbellard This program is free software; you can redistribute it and/or modify
447848024e4aSbellard it under the terms of the GNU General Public License as published by
447948024e4aSbellard the Free Software Foundation; either version 2 of the License, or
448048024e4aSbellard (at your option) any later version.
448148024e4aSbellard
448248024e4aSbellard This program is distributed in the hope that it will be useful,
448348024e4aSbellard but WITHOUT ANY WARRANTY; without even the implied warranty of
448448024e4aSbellard MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
448548024e4aSbellard GNU General Public License for more details.
448648024e4aSbellard
448748024e4aSbellard You should have received a copy of the GNU General Public License
44888167ee88SBlue Swirl along with this program; if not, see <http://www.gnu.org/licenses/>. */
448948024e4aSbellard
449048024e4aSbellard /* This is needed to pick up the NAN macro on some systems. */
449148024e4aSbellard //#define _GNU_SOURCE
449248024e4aSbellard
449348024e4aSbellard #ifndef INFINITY
449448024e4aSbellard #ifdef HUGE_VAL
449548024e4aSbellard #define INFINITY HUGE_VAL
449648024e4aSbellard #else
449748024e4aSbellard #define INFINITY (1.0 / 0.0)
449848024e4aSbellard #endif
449948024e4aSbellard #endif
450048024e4aSbellard
450148024e4aSbellard #ifndef NAN
450248024e4aSbellard #define NAN (0.0 / 0.0)
450348024e4aSbellard #endif
450448024e4aSbellard
450548024e4aSbellard static unsigned long get_field (const unsigned char *,
450648024e4aSbellard enum floatformat_byteorders,
450748024e4aSbellard unsigned int,
450848024e4aSbellard unsigned int,
450948024e4aSbellard unsigned int);
451048024e4aSbellard static int floatformat_always_valid (const struct floatformat *fmt,
451148024e4aSbellard const char *from);
451248024e4aSbellard
451348024e4aSbellard static int
floatformat_always_valid(const struct floatformat * fmt ATTRIBUTE_UNUSED,const char * from ATTRIBUTE_UNUSED)451448024e4aSbellard floatformat_always_valid (const struct floatformat *fmt ATTRIBUTE_UNUSED,
451548024e4aSbellard const char *from ATTRIBUTE_UNUSED)
451648024e4aSbellard {
451748024e4aSbellard return 1;
451848024e4aSbellard }
451948024e4aSbellard
452048024e4aSbellard /* The odds that CHAR_BIT will be anything but 8 are low enough that I'm not
452148024e4aSbellard going to bother with trying to muck around with whether it is defined in
452248024e4aSbellard a system header, what we do if not, etc. */
452348024e4aSbellard #define FLOATFORMAT_CHAR_BIT 8
452448024e4aSbellard
452548024e4aSbellard /* floatformats for IEEE single and double, big and little endian. */
452648024e4aSbellard const struct floatformat floatformat_ieee_single_big =
452748024e4aSbellard {
452848024e4aSbellard floatformat_big, 32, 0, 1, 8, 127, 255, 9, 23,
452948024e4aSbellard floatformat_intbit_no,
453048024e4aSbellard "floatformat_ieee_single_big",
453148024e4aSbellard floatformat_always_valid
453248024e4aSbellard };
453348024e4aSbellard const struct floatformat floatformat_ieee_single_little =
453448024e4aSbellard {
453548024e4aSbellard floatformat_little, 32, 0, 1, 8, 127, 255, 9, 23,
453648024e4aSbellard floatformat_intbit_no,
453748024e4aSbellard "floatformat_ieee_single_little",
453848024e4aSbellard floatformat_always_valid
453948024e4aSbellard };
454048024e4aSbellard const struct floatformat floatformat_ieee_double_big =
454148024e4aSbellard {
454248024e4aSbellard floatformat_big, 64, 0, 1, 11, 1023, 2047, 12, 52,
454348024e4aSbellard floatformat_intbit_no,
454448024e4aSbellard "floatformat_ieee_double_big",
454548024e4aSbellard floatformat_always_valid
454648024e4aSbellard };
454748024e4aSbellard const struct floatformat floatformat_ieee_double_little =
454848024e4aSbellard {
454948024e4aSbellard floatformat_little, 64, 0, 1, 11, 1023, 2047, 12, 52,
455048024e4aSbellard floatformat_intbit_no,
455148024e4aSbellard "floatformat_ieee_double_little",
455248024e4aSbellard floatformat_always_valid
455348024e4aSbellard };
455448024e4aSbellard
455548024e4aSbellard /* floatformat for IEEE double, little endian byte order, with big endian word
455648024e4aSbellard ordering, as on the ARM. */
455748024e4aSbellard
455848024e4aSbellard const struct floatformat floatformat_ieee_double_littlebyte_bigword =
455948024e4aSbellard {
456048024e4aSbellard floatformat_littlebyte_bigword, 64, 0, 1, 11, 1023, 2047, 12, 52,
456148024e4aSbellard floatformat_intbit_no,
456248024e4aSbellard "floatformat_ieee_double_littlebyte_bigword",
456348024e4aSbellard floatformat_always_valid
456448024e4aSbellard };
456548024e4aSbellard
456648024e4aSbellard static int floatformat_i387_ext_is_valid (const struct floatformat *fmt, const char *from);
456748024e4aSbellard
456848024e4aSbellard static int
floatformat_i387_ext_is_valid(const struct floatformat * fmt,const char * from)456948024e4aSbellard floatformat_i387_ext_is_valid (const struct floatformat *fmt, const char *from)
457048024e4aSbellard {
457148024e4aSbellard /* In the i387 double-extended format, if the exponent is all ones,
457248024e4aSbellard then the integer bit must be set. If the exponent is neither 0
457348024e4aSbellard nor ~0, the intbit must also be set. Only if the exponent is
457448024e4aSbellard zero can it be zero, and then it must be zero. */
457548024e4aSbellard unsigned long exponent, int_bit;
457648024e4aSbellard const unsigned char *ufrom = (const unsigned char *) from;
457748024e4aSbellard
457848024e4aSbellard exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize,
457948024e4aSbellard fmt->exp_start, fmt->exp_len);
458048024e4aSbellard int_bit = get_field (ufrom, fmt->byteorder, fmt->totalsize,
458148024e4aSbellard fmt->man_start, 1);
458248024e4aSbellard
458348024e4aSbellard if ((exponent == 0) != (int_bit == 0))
458448024e4aSbellard return 0;
458548024e4aSbellard else
458648024e4aSbellard return 1;
458748024e4aSbellard }
458848024e4aSbellard
458948024e4aSbellard const struct floatformat floatformat_i387_ext =
459048024e4aSbellard {
459148024e4aSbellard floatformat_little, 80, 0, 1, 15, 0x3fff, 0x7fff, 16, 64,
459248024e4aSbellard floatformat_intbit_yes,
459348024e4aSbellard "floatformat_i387_ext",
459448024e4aSbellard floatformat_i387_ext_is_valid
459548024e4aSbellard };
459648024e4aSbellard const struct floatformat floatformat_m68881_ext =
459748024e4aSbellard {
459848024e4aSbellard /* Note that the bits from 16 to 31 are unused. */
459948024e4aSbellard floatformat_big, 96, 0, 1, 15, 0x3fff, 0x7fff, 32, 64,
460048024e4aSbellard floatformat_intbit_yes,
460148024e4aSbellard "floatformat_m68881_ext",
460248024e4aSbellard floatformat_always_valid
460348024e4aSbellard };
460448024e4aSbellard const struct floatformat floatformat_i960_ext =
460548024e4aSbellard {
460648024e4aSbellard /* Note that the bits from 0 to 15 are unused. */
460748024e4aSbellard floatformat_little, 96, 16, 17, 15, 0x3fff, 0x7fff, 32, 64,
460848024e4aSbellard floatformat_intbit_yes,
460948024e4aSbellard "floatformat_i960_ext",
461048024e4aSbellard floatformat_always_valid
461148024e4aSbellard };
461248024e4aSbellard const struct floatformat floatformat_m88110_ext =
461348024e4aSbellard {
461448024e4aSbellard floatformat_big, 80, 0, 1, 15, 0x3fff, 0x7fff, 16, 64,
461548024e4aSbellard floatformat_intbit_yes,
461648024e4aSbellard "floatformat_m88110_ext",
461748024e4aSbellard floatformat_always_valid
461848024e4aSbellard };
461948024e4aSbellard const struct floatformat floatformat_m88110_harris_ext =
462048024e4aSbellard {
462148024e4aSbellard /* Harris uses raw format 128 bytes long, but the number is just an ieee
462248024e4aSbellard double, and the last 64 bits are wasted. */
462348024e4aSbellard floatformat_big,128, 0, 1, 11, 0x3ff, 0x7ff, 12, 52,
462448024e4aSbellard floatformat_intbit_no,
462548024e4aSbellard "floatformat_m88110_ext_harris",
462648024e4aSbellard floatformat_always_valid
462748024e4aSbellard };
462848024e4aSbellard const struct floatformat floatformat_arm_ext_big =
462948024e4aSbellard {
463048024e4aSbellard /* Bits 1 to 16 are unused. */
463148024e4aSbellard floatformat_big, 96, 0, 17, 15, 0x3fff, 0x7fff, 32, 64,
463248024e4aSbellard floatformat_intbit_yes,
463348024e4aSbellard "floatformat_arm_ext_big",
463448024e4aSbellard floatformat_always_valid
463548024e4aSbellard };
463648024e4aSbellard const struct floatformat floatformat_arm_ext_littlebyte_bigword =
463748024e4aSbellard {
463848024e4aSbellard /* Bits 1 to 16 are unused. */
463948024e4aSbellard floatformat_littlebyte_bigword, 96, 0, 17, 15, 0x3fff, 0x7fff, 32, 64,
464048024e4aSbellard floatformat_intbit_yes,
464148024e4aSbellard "floatformat_arm_ext_littlebyte_bigword",
464248024e4aSbellard floatformat_always_valid
464348024e4aSbellard };
464448024e4aSbellard const struct floatformat floatformat_ia64_spill_big =
464548024e4aSbellard {
464648024e4aSbellard floatformat_big, 128, 0, 1, 17, 65535, 0x1ffff, 18, 64,
464748024e4aSbellard floatformat_intbit_yes,
464848024e4aSbellard "floatformat_ia64_spill_big",
464948024e4aSbellard floatformat_always_valid
465048024e4aSbellard };
465148024e4aSbellard const struct floatformat floatformat_ia64_spill_little =
465248024e4aSbellard {
465348024e4aSbellard floatformat_little, 128, 0, 1, 17, 65535, 0x1ffff, 18, 64,
465448024e4aSbellard floatformat_intbit_yes,
465548024e4aSbellard "floatformat_ia64_spill_little",
465648024e4aSbellard floatformat_always_valid
465748024e4aSbellard };
465848024e4aSbellard const struct floatformat floatformat_ia64_quad_big =
465948024e4aSbellard {
466048024e4aSbellard floatformat_big, 128, 0, 1, 15, 16383, 0x7fff, 16, 112,
466148024e4aSbellard floatformat_intbit_no,
466248024e4aSbellard "floatformat_ia64_quad_big",
466348024e4aSbellard floatformat_always_valid
466448024e4aSbellard };
466548024e4aSbellard const struct floatformat floatformat_ia64_quad_little =
466648024e4aSbellard {
466748024e4aSbellard floatformat_little, 128, 0, 1, 15, 16383, 0x7fff, 16, 112,
466848024e4aSbellard floatformat_intbit_no,
466948024e4aSbellard "floatformat_ia64_quad_little",
467048024e4aSbellard floatformat_always_valid
467148024e4aSbellard };
467248024e4aSbellard
467348024e4aSbellard /* Extract a field which starts at START and is LEN bits long. DATA and
467448024e4aSbellard TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
467548024e4aSbellard static unsigned long
get_field(const unsigned char * data,enum floatformat_byteorders order,unsigned int total_len,unsigned int start,unsigned int len)467648024e4aSbellard get_field (const unsigned char *data, enum floatformat_byteorders order,
467748024e4aSbellard unsigned int total_len, unsigned int start, unsigned int len)
467848024e4aSbellard {
467948024e4aSbellard unsigned long result;
468048024e4aSbellard unsigned int cur_byte;
468148024e4aSbellard int cur_bitshift;
468248024e4aSbellard
468348024e4aSbellard /* Start at the least significant part of the field. */
468448024e4aSbellard cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
468548024e4aSbellard if (order == floatformat_little)
468648024e4aSbellard cur_byte = (total_len / FLOATFORMAT_CHAR_BIT) - cur_byte - 1;
468748024e4aSbellard cur_bitshift =
468848024e4aSbellard ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
468948024e4aSbellard result = *(data + cur_byte) >> (-cur_bitshift);
469048024e4aSbellard cur_bitshift += FLOATFORMAT_CHAR_BIT;
469148024e4aSbellard if (order == floatformat_little)
469248024e4aSbellard ++cur_byte;
469348024e4aSbellard else
469448024e4aSbellard --cur_byte;
469548024e4aSbellard
469648024e4aSbellard /* Move towards the most significant part of the field. */
469748024e4aSbellard while ((unsigned int) cur_bitshift < len)
469848024e4aSbellard {
469948024e4aSbellard if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
470048024e4aSbellard /* This is the last byte; zero out the bits which are not part of
470148024e4aSbellard this field. */
470248024e4aSbellard result |=
47032e3883d0SPeter Maydell (unsigned long)(*(data + cur_byte)
47042e3883d0SPeter Maydell & ((1 << (len - cur_bitshift)) - 1))
470548024e4aSbellard << cur_bitshift;
470648024e4aSbellard else
47072e3883d0SPeter Maydell result |= (unsigned long)*(data + cur_byte) << cur_bitshift;
470848024e4aSbellard cur_bitshift += FLOATFORMAT_CHAR_BIT;
470948024e4aSbellard if (order == floatformat_little)
471048024e4aSbellard ++cur_byte;
471148024e4aSbellard else
471248024e4aSbellard --cur_byte;
471348024e4aSbellard }
471448024e4aSbellard return result;
471548024e4aSbellard }
471648024e4aSbellard
471748024e4aSbellard /* Convert from FMT to a double.
471848024e4aSbellard FROM is the address of the extended float.
471948024e4aSbellard Store the double in *TO. */
472048024e4aSbellard
472148024e4aSbellard void
floatformat_to_double(const struct floatformat * fmt,const char * from,double * to)472248024e4aSbellard floatformat_to_double (const struct floatformat *fmt,
472348024e4aSbellard const char *from, double *to)
472448024e4aSbellard {
472548024e4aSbellard const unsigned char *ufrom = (const unsigned char *)from;
472648024e4aSbellard double dto;
472748024e4aSbellard long exponent;
472848024e4aSbellard unsigned long mant;
472948024e4aSbellard unsigned int mant_bits, mant_off;
473048024e4aSbellard int mant_bits_left;
473148024e4aSbellard int special_exponent; /* It's a NaN, denorm or zero */
473248024e4aSbellard
473348024e4aSbellard exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize,
473448024e4aSbellard fmt->exp_start, fmt->exp_len);
473548024e4aSbellard
473648024e4aSbellard /* If the exponent indicates a NaN, we don't have information to
473748024e4aSbellard decide what to do. So we handle it like IEEE, except that we
473848024e4aSbellard don't try to preserve the type of NaN. FIXME. */
473948024e4aSbellard if ((unsigned long) exponent == fmt->exp_nan)
474048024e4aSbellard {
474148024e4aSbellard int nan;
474248024e4aSbellard
474348024e4aSbellard mant_off = fmt->man_start;
474448024e4aSbellard mant_bits_left = fmt->man_len;
474548024e4aSbellard nan = 0;
474648024e4aSbellard while (mant_bits_left > 0)
474748024e4aSbellard {
4748893dcdbfSYuval Shaia mant_bits = MIN(mant_bits_left, 32);
474948024e4aSbellard
475048024e4aSbellard if (get_field (ufrom, fmt->byteorder, fmt->totalsize,
475148024e4aSbellard mant_off, mant_bits) != 0)
475248024e4aSbellard {
475348024e4aSbellard /* This is a NaN. */
475448024e4aSbellard nan = 1;
475548024e4aSbellard break;
475648024e4aSbellard }
475748024e4aSbellard
475848024e4aSbellard mant_off += mant_bits;
475948024e4aSbellard mant_bits_left -= mant_bits;
476048024e4aSbellard }
476148024e4aSbellard
476248024e4aSbellard /* On certain systems (such as GNU/Linux), the use of the
476348024e4aSbellard INFINITY macro below may generate a warning that can not be
476448024e4aSbellard silenced due to a bug in GCC (PR preprocessor/11931). The
476548024e4aSbellard preprocessor fails to recognise the __extension__ keyword in
476648024e4aSbellard conjunction with the GNU/C99 extension for hexadecimal
476748024e4aSbellard floating point constants and will issue a warning when
476848024e4aSbellard compiling with -pedantic. */
476948024e4aSbellard if (nan)
477048024e4aSbellard dto = NAN;
477148024e4aSbellard else
477248024e4aSbellard dto = INFINITY;
477348024e4aSbellard
477448024e4aSbellard if (get_field (ufrom, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1))
477548024e4aSbellard dto = -dto;
477648024e4aSbellard
477748024e4aSbellard *to = dto;
477848024e4aSbellard
477948024e4aSbellard return;
478048024e4aSbellard }
478148024e4aSbellard
478248024e4aSbellard mant_bits_left = fmt->man_len;
478348024e4aSbellard mant_off = fmt->man_start;
478448024e4aSbellard dto = 0.0;
478548024e4aSbellard
478648024e4aSbellard special_exponent = exponent == 0 || (unsigned long) exponent == fmt->exp_nan;
478748024e4aSbellard
478848024e4aSbellard /* Don't bias zero's, denorms or NaNs. */
478948024e4aSbellard if (!special_exponent)
479048024e4aSbellard exponent -= fmt->exp_bias;
479148024e4aSbellard
479248024e4aSbellard /* Build the result algebraically. Might go infinite, underflow, etc;
479348024e4aSbellard who cares. */
479448024e4aSbellard
479548024e4aSbellard /* If this format uses a hidden bit, explicitly add it in now. Otherwise,
479648024e4aSbellard increment the exponent by one to account for the integer bit. */
479748024e4aSbellard
479848024e4aSbellard if (!special_exponent)
479948024e4aSbellard {
480048024e4aSbellard if (fmt->intbit == floatformat_intbit_no)
480148024e4aSbellard dto = ldexp (1.0, exponent);
480248024e4aSbellard else
480348024e4aSbellard exponent++;
480448024e4aSbellard }
480548024e4aSbellard
480648024e4aSbellard while (mant_bits_left > 0)
480748024e4aSbellard {
4808893dcdbfSYuval Shaia mant_bits = MIN(mant_bits_left, 32);
480948024e4aSbellard
481048024e4aSbellard mant = get_field (ufrom, fmt->byteorder, fmt->totalsize,
481148024e4aSbellard mant_off, mant_bits);
481248024e4aSbellard
481348024e4aSbellard /* Handle denormalized numbers. FIXME: What should we do for
481448024e4aSbellard non-IEEE formats? */
481548024e4aSbellard if (exponent == 0 && mant != 0)
481648024e4aSbellard dto += ldexp ((double)mant,
481748024e4aSbellard (- fmt->exp_bias
481848024e4aSbellard - mant_bits
481948024e4aSbellard - (mant_off - fmt->man_start)
482048024e4aSbellard + 1));
482148024e4aSbellard else
482248024e4aSbellard dto += ldexp ((double)mant, exponent - mant_bits);
482348024e4aSbellard if (exponent != 0)
482448024e4aSbellard exponent -= mant_bits;
482548024e4aSbellard mant_off += mant_bits;
482648024e4aSbellard mant_bits_left -= mant_bits;
482748024e4aSbellard }
482848024e4aSbellard
482948024e4aSbellard /* Negate it if negative. */
483048024e4aSbellard if (get_field (ufrom, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1))
483148024e4aSbellard dto = -dto;
483248024e4aSbellard *to = dto;
483348024e4aSbellard }
483448024e4aSbellard
483548024e4aSbellard static void put_field (unsigned char *, enum floatformat_byteorders,
483648024e4aSbellard unsigned int,
483748024e4aSbellard unsigned int,
483848024e4aSbellard unsigned int,
483948024e4aSbellard unsigned long);
484048024e4aSbellard
484148024e4aSbellard /* Set a field which starts at START and is LEN bits long. DATA and
484248024e4aSbellard TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */
484348024e4aSbellard static void
put_field(unsigned char * data,enum floatformat_byteorders order,unsigned int total_len,unsigned int start,unsigned int len,unsigned long stuff_to_put)484448024e4aSbellard put_field (unsigned char *data, enum floatformat_byteorders order,
484548024e4aSbellard unsigned int total_len, unsigned int start, unsigned int len,
484648024e4aSbellard unsigned long stuff_to_put)
484748024e4aSbellard {
484848024e4aSbellard unsigned int cur_byte;
484948024e4aSbellard int cur_bitshift;
485048024e4aSbellard
485148024e4aSbellard /* Start at the least significant part of the field. */
485248024e4aSbellard cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
485348024e4aSbellard if (order == floatformat_little)
485448024e4aSbellard cur_byte = (total_len / FLOATFORMAT_CHAR_BIT) - cur_byte - 1;
485548024e4aSbellard cur_bitshift =
485648024e4aSbellard ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
485748024e4aSbellard *(data + cur_byte) &=
485848024e4aSbellard ~(((1 << ((start + len) % FLOATFORMAT_CHAR_BIT)) - 1) << (-cur_bitshift));
485948024e4aSbellard *(data + cur_byte) |=
486048024e4aSbellard (stuff_to_put & ((1 << FLOATFORMAT_CHAR_BIT) - 1)) << (-cur_bitshift);
486148024e4aSbellard cur_bitshift += FLOATFORMAT_CHAR_BIT;
486248024e4aSbellard if (order == floatformat_little)
486348024e4aSbellard ++cur_byte;
486448024e4aSbellard else
486548024e4aSbellard --cur_byte;
486648024e4aSbellard
486748024e4aSbellard /* Move towards the most significant part of the field. */
486848024e4aSbellard while ((unsigned int) cur_bitshift < len)
486948024e4aSbellard {
487048024e4aSbellard if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
487148024e4aSbellard {
487248024e4aSbellard /* This is the last byte. */
487348024e4aSbellard *(data + cur_byte) &=
487448024e4aSbellard ~((1 << (len - cur_bitshift)) - 1);
487548024e4aSbellard *(data + cur_byte) |= (stuff_to_put >> cur_bitshift);
487648024e4aSbellard }
487748024e4aSbellard else
487848024e4aSbellard *(data + cur_byte) = ((stuff_to_put >> cur_bitshift)
487948024e4aSbellard & ((1 << FLOATFORMAT_CHAR_BIT) - 1));
488048024e4aSbellard cur_bitshift += FLOATFORMAT_CHAR_BIT;
488148024e4aSbellard if (order == floatformat_little)
488248024e4aSbellard ++cur_byte;
488348024e4aSbellard else
488448024e4aSbellard --cur_byte;
488548024e4aSbellard }
488648024e4aSbellard }
488748024e4aSbellard
488848024e4aSbellard /* The converse: convert the double *FROM to an extended float
488948024e4aSbellard and store where TO points. Neither FROM nor TO have any alignment
489048024e4aSbellard restrictions. */
489148024e4aSbellard
489248024e4aSbellard void
floatformat_from_double(const struct floatformat * fmt,const double * from,char * to)489348024e4aSbellard floatformat_from_double (const struct floatformat *fmt,
489448024e4aSbellard const double *from, char *to)
489548024e4aSbellard {
489648024e4aSbellard double dfrom;
489748024e4aSbellard int exponent;
489848024e4aSbellard double mant;
489948024e4aSbellard unsigned int mant_bits, mant_off;
490048024e4aSbellard int mant_bits_left;
490148024e4aSbellard unsigned char *uto = (unsigned char *)to;
490248024e4aSbellard
490348024e4aSbellard dfrom = *from;
490448024e4aSbellard memset (uto, 0, fmt->totalsize / FLOATFORMAT_CHAR_BIT);
490548024e4aSbellard
490648024e4aSbellard /* If negative, set the sign bit. */
490748024e4aSbellard if (dfrom < 0)
490848024e4aSbellard {
490948024e4aSbellard put_field (uto, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1, 1);
491048024e4aSbellard dfrom = -dfrom;
491148024e4aSbellard }
491248024e4aSbellard
491348024e4aSbellard if (dfrom == 0)
491448024e4aSbellard {
491548024e4aSbellard /* 0.0. */
491648024e4aSbellard return;
491748024e4aSbellard }
491848024e4aSbellard
491948024e4aSbellard if (dfrom != dfrom)
492048024e4aSbellard {
492148024e4aSbellard /* NaN. */
492248024e4aSbellard put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start,
492348024e4aSbellard fmt->exp_len, fmt->exp_nan);
492448024e4aSbellard /* Be sure it's not infinity, but NaN value is irrelevant. */
492548024e4aSbellard put_field (uto, fmt->byteorder, fmt->totalsize, fmt->man_start,
492648024e4aSbellard 32, 1);
492748024e4aSbellard return;
492848024e4aSbellard }
492948024e4aSbellard
493048024e4aSbellard if (dfrom + dfrom == dfrom)
493148024e4aSbellard {
493248024e4aSbellard /* This can only happen for an infinite value (or zero, which we
493348024e4aSbellard already handled above). */
493448024e4aSbellard put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start,
493548024e4aSbellard fmt->exp_len, fmt->exp_nan);
493648024e4aSbellard return;
493748024e4aSbellard }
493848024e4aSbellard
493948024e4aSbellard mant = frexp (dfrom, &exponent);
494048024e4aSbellard if (exponent + fmt->exp_bias - 1 > 0)
494148024e4aSbellard put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start,
494248024e4aSbellard fmt->exp_len, exponent + fmt->exp_bias - 1);
494348024e4aSbellard else
494448024e4aSbellard {
494548024e4aSbellard /* Handle a denormalized number. FIXME: What should we do for
494648024e4aSbellard non-IEEE formats? */
494748024e4aSbellard put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start,
494848024e4aSbellard fmt->exp_len, 0);
494948024e4aSbellard mant = ldexp (mant, exponent + fmt->exp_bias - 1);
495048024e4aSbellard }
495148024e4aSbellard
495248024e4aSbellard mant_bits_left = fmt->man_len;
495348024e4aSbellard mant_off = fmt->man_start;
495448024e4aSbellard while (mant_bits_left > 0)
495548024e4aSbellard {
495648024e4aSbellard unsigned long mant_long;
495748024e4aSbellard mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
495848024e4aSbellard
495948024e4aSbellard mant *= 4294967296.0;
496048024e4aSbellard mant_long = (unsigned long)mant;
496148024e4aSbellard mant -= mant_long;
496248024e4aSbellard
496348024e4aSbellard /* If the integer bit is implicit, and we are not creating a
496448024e4aSbellard denormalized number, then we need to discard it. */
496548024e4aSbellard if ((unsigned int) mant_bits_left == fmt->man_len
496648024e4aSbellard && fmt->intbit == floatformat_intbit_no
496748024e4aSbellard && exponent + fmt->exp_bias - 1 > 0)
496848024e4aSbellard {
496948024e4aSbellard mant_long &= 0x7fffffff;
497048024e4aSbellard mant_bits -= 1;
497148024e4aSbellard }
497248024e4aSbellard else if (mant_bits < 32)
497348024e4aSbellard {
497448024e4aSbellard /* The bits we want are in the most significant MANT_BITS bits of
497548024e4aSbellard mant_long. Move them to the least significant. */
497648024e4aSbellard mant_long >>= 32 - mant_bits;
497748024e4aSbellard }
497848024e4aSbellard
497948024e4aSbellard put_field (uto, fmt->byteorder, fmt->totalsize,
498048024e4aSbellard mant_off, mant_bits, mant_long);
498148024e4aSbellard mant_off += mant_bits;
498248024e4aSbellard mant_bits_left -= mant_bits;
498348024e4aSbellard }
498448024e4aSbellard }
498548024e4aSbellard
498648024e4aSbellard /* Return non-zero iff the data at FROM is a valid number in format FMT. */
498748024e4aSbellard
498848024e4aSbellard int
floatformat_is_valid(const struct floatformat * fmt,const char * from)498948024e4aSbellard floatformat_is_valid (const struct floatformat *fmt, const char *from)
499048024e4aSbellard {
499148024e4aSbellard return fmt->is_valid (fmt, from);
499248024e4aSbellard }
499348024e4aSbellard
499448024e4aSbellard
499548024e4aSbellard #ifdef IEEE_DEBUG
499648024e4aSbellard
499748024e4aSbellard /* This is to be run on a host which uses IEEE floating point. */
499848024e4aSbellard
499948024e4aSbellard void
ieee_test(double n)500048024e4aSbellard ieee_test (double n)
500148024e4aSbellard {
500248024e4aSbellard double result;
500348024e4aSbellard
500448024e4aSbellard floatformat_to_double (&floatformat_ieee_double_little, (char *) &n,
500548024e4aSbellard &result);
500648024e4aSbellard if ((n != result && (! isnan (n) || ! isnan (result)))
500748024e4aSbellard || (n < 0 && result >= 0)
500848024e4aSbellard || (n >= 0 && result < 0))
500948024e4aSbellard printf ("Differ(to): %.20g -> %.20g\n", n, result);
501048024e4aSbellard
501148024e4aSbellard floatformat_from_double (&floatformat_ieee_double_little, &n,
501248024e4aSbellard (char *) &result);
501348024e4aSbellard if ((n != result && (! isnan (n) || ! isnan (result)))
501448024e4aSbellard || (n < 0 && result >= 0)
501548024e4aSbellard || (n >= 0 && result < 0))
501648024e4aSbellard printf ("Differ(from): %.20g -> %.20g\n", n, result);
501748024e4aSbellard
501848024e4aSbellard #if 0
501948024e4aSbellard {
502048024e4aSbellard char exten[16];
502148024e4aSbellard
502248024e4aSbellard floatformat_from_double (&floatformat_m68881_ext, &n, exten);
502348024e4aSbellard floatformat_to_double (&floatformat_m68881_ext, exten, &result);
502448024e4aSbellard if (n != result)
502548024e4aSbellard printf ("Differ(to+from): %.20g -> %.20g\n", n, result);
502648024e4aSbellard }
502748024e4aSbellard #endif
502848024e4aSbellard
502948024e4aSbellard #if IEEE_DEBUG > 1
503048024e4aSbellard /* This is to be run on a host which uses 68881 format. */
503148024e4aSbellard {
503248024e4aSbellard long double ex = *(long double *)exten;
503348024e4aSbellard if (ex != n)
503448024e4aSbellard printf ("Differ(from vs. extended): %.20g\n", n);
503548024e4aSbellard }
503648024e4aSbellard #endif
503748024e4aSbellard }
503848024e4aSbellard
503948024e4aSbellard int
main(void)504048024e4aSbellard main (void)
504148024e4aSbellard {
504248024e4aSbellard ieee_test (0.0);
504348024e4aSbellard ieee_test (0.5);
504448024e4aSbellard ieee_test (256.0);
504548024e4aSbellard ieee_test (0.12345);
504648024e4aSbellard ieee_test (234235.78907234);
504748024e4aSbellard ieee_test (-512.0);
504848024e4aSbellard ieee_test (-0.004321);
504948024e4aSbellard ieee_test (1.2E-70);
505048024e4aSbellard ieee_test (1.2E-316);
505148024e4aSbellard ieee_test (4.9406564584124654E-324);
505248024e4aSbellard ieee_test (- 4.9406564584124654E-324);
505348024e4aSbellard ieee_test (- 0.0);
505448024e4aSbellard ieee_test (- INFINITY);
505548024e4aSbellard ieee_test (- NAN);
505648024e4aSbellard ieee_test (INFINITY);
505748024e4aSbellard ieee_test (NAN);
505848024e4aSbellard return 0;
505948024e4aSbellard }
506048024e4aSbellard #endif
506148024e4aSbellard /* **** End of floatformat.c */
5062