xref: /openbmc/qemu/disas/sparc.c (revision c4e9f845f6248885ff73a9e1ecb74052a1c3dcd4)
176cad711SPaolo Bonzini /*
276cad711SPaolo Bonzini  * These files from binutils are concatenated:
376cad711SPaolo Bonzini  * include/opcode/sparc.h, opcodes/sparc-opc.c, opcodes/sparc-dis.c
476cad711SPaolo Bonzini  */
576cad711SPaolo Bonzini 
676cad711SPaolo Bonzini /* include/opcode/sparc.h */
776cad711SPaolo Bonzini 
876cad711SPaolo Bonzini /* Definitions for opcode table for the sparc.
976cad711SPaolo Bonzini    Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000, 2002,
1076cad711SPaolo Bonzini    2003, 2005 Free Software Foundation, Inc.
1176cad711SPaolo Bonzini 
1276cad711SPaolo Bonzini    This file is part of GAS, the GNU Assembler, GDB, the GNU debugger, and
1376cad711SPaolo Bonzini    the GNU Binutils.
1476cad711SPaolo Bonzini 
1576cad711SPaolo Bonzini    GAS/GDB is free software; you can redistribute it and/or modify
1676cad711SPaolo Bonzini    it under the terms of the GNU General Public License as published by
1776cad711SPaolo Bonzini    the Free Software Foundation; either version 2, or (at your option)
1876cad711SPaolo Bonzini    any later version.
1976cad711SPaolo Bonzini 
2076cad711SPaolo Bonzini    GAS/GDB is distributed in the hope that it will be useful,
2176cad711SPaolo Bonzini    but WITHOUT ANY WARRANTY; without even the implied warranty of
2276cad711SPaolo Bonzini    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2376cad711SPaolo Bonzini    GNU General Public License for more details.
2476cad711SPaolo Bonzini 
2576cad711SPaolo Bonzini    You should have received a copy of the GNU General Public License
2676cad711SPaolo Bonzini    along with GAS or GDB; see the file COPYING. If not,
2776cad711SPaolo Bonzini    see <http://www.gnu.org/licenses/>.  */
2876cad711SPaolo Bonzini 
2948d4ab25SPeter Maydell #include "qemu/osdep.h"
30*3979fca4SMarkus Armbruster #include "disas/dis-asm.h"
3176cad711SPaolo Bonzini 
3276cad711SPaolo Bonzini /* The SPARC opcode table (and other related data) is defined in
3376cad711SPaolo Bonzini    the opcodes library in sparc-opc.c.  If you change anything here, make
3476cad711SPaolo Bonzini    sure you fix up that file, and vice versa.  */
3576cad711SPaolo Bonzini 
3676cad711SPaolo Bonzini  /* FIXME-someday: perhaps the ,a's and such should be embedded in the
3776cad711SPaolo Bonzini     instruction's name rather than the args.  This would make gas faster, pinsn
3876cad711SPaolo Bonzini     slower, but would mess up some macros a bit.  xoxorich. */
3976cad711SPaolo Bonzini 
4076cad711SPaolo Bonzini /* List of instruction sets variations.
4176cad711SPaolo Bonzini    These values are such that each element is either a superset of a
4276cad711SPaolo Bonzini    preceding each one or they conflict in which case SPARC_OPCODE_CONFLICT_P
4376cad711SPaolo Bonzini    returns non-zero.
4476cad711SPaolo Bonzini    The values are indices into `sparc_opcode_archs' defined in sparc-opc.c.
4576cad711SPaolo Bonzini    Don't change this without updating sparc-opc.c.  */
4676cad711SPaolo Bonzini 
4776cad711SPaolo Bonzini enum sparc_opcode_arch_val
4876cad711SPaolo Bonzini {
4976cad711SPaolo Bonzini   SPARC_OPCODE_ARCH_V6 = 0,
5076cad711SPaolo Bonzini   SPARC_OPCODE_ARCH_V7,
5176cad711SPaolo Bonzini   SPARC_OPCODE_ARCH_V8,
5276cad711SPaolo Bonzini   SPARC_OPCODE_ARCH_SPARCLET,
5376cad711SPaolo Bonzini   SPARC_OPCODE_ARCH_SPARCLITE,
5476cad711SPaolo Bonzini   /* V9 variants must appear last.  */
5576cad711SPaolo Bonzini   SPARC_OPCODE_ARCH_V9,
5676cad711SPaolo Bonzini   SPARC_OPCODE_ARCH_V9A, /* V9 with ultrasparc additions.  */
5776cad711SPaolo Bonzini   SPARC_OPCODE_ARCH_V9B, /* V9 with ultrasparc and cheetah additions.  */
5876cad711SPaolo Bonzini   SPARC_OPCODE_ARCH_BAD  /* Error return from sparc_opcode_lookup_arch.  */
5976cad711SPaolo Bonzini };
6076cad711SPaolo Bonzini 
6176cad711SPaolo Bonzini /* The highest architecture in the table.  */
6276cad711SPaolo Bonzini #define SPARC_OPCODE_ARCH_MAX (SPARC_OPCODE_ARCH_BAD - 1)
6376cad711SPaolo Bonzini 
6476cad711SPaolo Bonzini /* Given an enum sparc_opcode_arch_val, return the bitmask to use in
6576cad711SPaolo Bonzini    insn encoding/decoding.  */
6676cad711SPaolo Bonzini #define SPARC_OPCODE_ARCH_MASK(arch) (1 << (arch))
6776cad711SPaolo Bonzini 
6876cad711SPaolo Bonzini /* Given a valid sparc_opcode_arch_val, return non-zero if it's v9.  */
6976cad711SPaolo Bonzini #define SPARC_OPCODE_ARCH_V9_P(arch) ((arch) >= SPARC_OPCODE_ARCH_V9)
7076cad711SPaolo Bonzini 
7176cad711SPaolo Bonzini /* Table of cpu variants.  */
7276cad711SPaolo Bonzini 
7376cad711SPaolo Bonzini typedef struct sparc_opcode_arch
7476cad711SPaolo Bonzini {
7576cad711SPaolo Bonzini   const char *name;
7676cad711SPaolo Bonzini   /* Mask of sparc_opcode_arch_val's supported.
7776cad711SPaolo Bonzini      EG: For v7 this would be
7876cad711SPaolo Bonzini      (SPARC_OPCODE_ARCH_MASK (..._V6) | SPARC_OPCODE_ARCH_MASK (..._V7)).
7976cad711SPaolo Bonzini      These are short's because sparc_opcode.architecture is.  */
8076cad711SPaolo Bonzini   short supported;
8176cad711SPaolo Bonzini } sparc_opcode_arch;
8276cad711SPaolo Bonzini 
8376cad711SPaolo Bonzini /* Structure of an opcode table entry.  */
8476cad711SPaolo Bonzini 
8576cad711SPaolo Bonzini typedef struct sparc_opcode
8676cad711SPaolo Bonzini {
8776cad711SPaolo Bonzini   const char *name;
8876cad711SPaolo Bonzini   unsigned long match;  /* Bits that must be set.  */
8976cad711SPaolo Bonzini   unsigned long lose;   /* Bits that must not be set.  */
9076cad711SPaolo Bonzini   const char *args;
9176cad711SPaolo Bonzini   /* This was called "delayed" in versions before the flags.  */
9276cad711SPaolo Bonzini   char flags;
9376cad711SPaolo Bonzini   short architecture;   /* Bitmask of sparc_opcode_arch_val's.  */
9476cad711SPaolo Bonzini } sparc_opcode;
9576cad711SPaolo Bonzini 
9676cad711SPaolo Bonzini #define F_DELAYED       1       /* Delayed branch.  */
9776cad711SPaolo Bonzini #define F_ALIAS         2       /* Alias for a "real" instruction.  */
9876cad711SPaolo Bonzini #define F_UNBR          4       /* Unconditional branch.  */
9976cad711SPaolo Bonzini #define F_CONDBR        8       /* Conditional branch.  */
10076cad711SPaolo Bonzini #define F_JSR           16      /* Subroutine call.  */
10176cad711SPaolo Bonzini #define F_FLOAT         32      /* Floating point instruction (not a branch).  */
10276cad711SPaolo Bonzini #define F_FBR           64      /* Floating point branch.  */
10376cad711SPaolo Bonzini /* FIXME: Add F_ANACHRONISTIC flag for v9.  */
10476cad711SPaolo Bonzini 
10576cad711SPaolo Bonzini /* All sparc opcodes are 32 bits, except for the `set' instruction (really a
10676cad711SPaolo Bonzini    macro), which is 64 bits. It is handled as a special case.
10776cad711SPaolo Bonzini 
10876cad711SPaolo Bonzini    The match component is a mask saying which bits must match a particular
10976cad711SPaolo Bonzini    opcode in order for an instruction to be an instance of that opcode.
11076cad711SPaolo Bonzini 
11176cad711SPaolo Bonzini    The args component is a string containing one character for each operand of the
11276cad711SPaolo Bonzini    instruction.
11376cad711SPaolo Bonzini 
11476cad711SPaolo Bonzini    Kinds of operands:
11576cad711SPaolo Bonzini         #       Number used by optimizer.       It is ignored.
11676cad711SPaolo Bonzini         1       rs1 register.
11776cad711SPaolo Bonzini         2       rs2 register.
11876cad711SPaolo Bonzini         d       rd register.
11976cad711SPaolo Bonzini         e       frs1 floating point register.
12076cad711SPaolo Bonzini         v       frs1 floating point register (double/even).
12176cad711SPaolo Bonzini         V       frs1 floating point register (quad/multiple of 4).
12276cad711SPaolo Bonzini         f       frs2 floating point register.
12376cad711SPaolo Bonzini         B       frs2 floating point register (double/even).
12476cad711SPaolo Bonzini         R       frs2 floating point register (quad/multiple of 4).
12576cad711SPaolo Bonzini         g       frsd floating point register.
12676cad711SPaolo Bonzini         H       frsd floating point register (double/even).
12776cad711SPaolo Bonzini         J       frsd floating point register (quad/multiple of 4).
12876cad711SPaolo Bonzini         b       crs1 coprocessor register
12976cad711SPaolo Bonzini         c       crs2 coprocessor register
13076cad711SPaolo Bonzini         D       crsd coprocessor register
13176cad711SPaolo Bonzini         m       alternate space register (asr) in rd
13276cad711SPaolo Bonzini         M       alternate space register (asr) in rs1
13376cad711SPaolo Bonzini         h       22 high bits.
13476cad711SPaolo Bonzini         X       5 bit unsigned immediate
13576cad711SPaolo Bonzini         Y       6 bit unsigned immediate
13676cad711SPaolo Bonzini         3       SIAM mode (3 bits). (v9b)
13776cad711SPaolo Bonzini         K       MEMBAR mask (7 bits). (v9)
13876cad711SPaolo Bonzini         j       10 bit Immediate. (v9)
13976cad711SPaolo Bonzini         I       11 bit Immediate. (v9)
14076cad711SPaolo Bonzini         i       13 bit Immediate.
14176cad711SPaolo Bonzini         n       22 bit immediate.
14276cad711SPaolo Bonzini         k       2+14 bit PC relative immediate. (v9)
14376cad711SPaolo Bonzini         G       19 bit PC relative immediate. (v9)
14476cad711SPaolo Bonzini         l       22 bit PC relative immediate.
14576cad711SPaolo Bonzini         L       30 bit PC relative immediate.
14676cad711SPaolo Bonzini         a       Annul.  The annul bit is set.
14776cad711SPaolo Bonzini         A       Alternate address space. Stored as 8 bits.
14876cad711SPaolo Bonzini         C       Coprocessor state register.
14976cad711SPaolo Bonzini         F       floating point state register.
15076cad711SPaolo Bonzini         p       Processor state register.
15176cad711SPaolo Bonzini         N       Branch predict clear ",pn" (v9)
15276cad711SPaolo Bonzini         T       Branch predict set ",pt" (v9)
15376cad711SPaolo Bonzini         z       %icc. (v9)
15476cad711SPaolo Bonzini         Z       %xcc. (v9)
15576cad711SPaolo Bonzini         q       Floating point queue.
15676cad711SPaolo Bonzini         r       Single register that is both rs1 and rd.
15776cad711SPaolo Bonzini         O       Single register that is both rs2 and rd.
15876cad711SPaolo Bonzini         Q       Coprocessor queue.
15976cad711SPaolo Bonzini         S       Special case.
16076cad711SPaolo Bonzini         t       Trap base register.
16176cad711SPaolo Bonzini         w       Window invalid mask register.
16276cad711SPaolo Bonzini         y       Y register.
16376cad711SPaolo Bonzini         u       sparclet coprocessor registers in rd position
16476cad711SPaolo Bonzini         U       sparclet coprocessor registers in rs1 position
16576cad711SPaolo Bonzini         E       %ccr. (v9)
16676cad711SPaolo Bonzini         s       %fprs. (v9)
16776cad711SPaolo Bonzini         P       %pc.  (v9)
16876cad711SPaolo Bonzini         W       %tick.  (v9)
16976cad711SPaolo Bonzini         o       %asi. (v9)
17076cad711SPaolo Bonzini         6       %fcc0. (v9)
17176cad711SPaolo Bonzini         7       %fcc1. (v9)
17276cad711SPaolo Bonzini         8       %fcc2. (v9)
17376cad711SPaolo Bonzini         9       %fcc3. (v9)
17476cad711SPaolo Bonzini         !       Privileged Register in rd (v9)
17576cad711SPaolo Bonzini         ?       Privileged Register in rs1 (v9)
17676cad711SPaolo Bonzini         *       Prefetch function constant. (v9)
17776cad711SPaolo Bonzini         x       OPF field (v9 impdep).
17876cad711SPaolo Bonzini         0       32/64 bit immediate for set or setx (v9) insns
17976cad711SPaolo Bonzini         _       Ancillary state register in rd (v9a)
18076cad711SPaolo Bonzini         /       Ancillary state register in rs1 (v9a)
18176cad711SPaolo Bonzini 
18276cad711SPaolo Bonzini   The following chars are unused: (note: ,[] are used as punctuation)
18376cad711SPaolo Bonzini   [45].  */
18476cad711SPaolo Bonzini 
18576cad711SPaolo Bonzini #define OP2(x)          (((x) & 0x7) << 22)  /* Op2 field of format2 insns.  */
18676cad711SPaolo Bonzini #define OP3(x)          (((x) & 0x3f) << 19) /* Op3 field of format3 insns.  */
18776cad711SPaolo Bonzini #define OP(x)           ((unsigned) ((x) & 0x3) << 30) /* Op field of all insns.  */
18876cad711SPaolo Bonzini #define OPF(x)          (((x) & 0x1ff) << 5) /* Opf field of float insns.  */
18976cad711SPaolo Bonzini #define OPF_LOW5(x)     OPF ((x) & 0x1f)     /* V9.  */
19076cad711SPaolo Bonzini #define F3F(x, y, z)    (OP (x) | OP3 (y) | OPF (z)) /* Format3 float insns.  */
19176cad711SPaolo Bonzini #define F3I(x)          (((x) & 0x1) << 13)  /* Immediate field of format 3 insns.  */
19276cad711SPaolo Bonzini #define F2(x, y)        (OP (x) | OP2(y))    /* Format 2 insns.  */
19376cad711SPaolo Bonzini #define F3(x, y, z)     (OP (x) | OP3(y) | F3I(z)) /* Format3 insns.  */
19476cad711SPaolo Bonzini #define F1(x)           (OP (x))
19576cad711SPaolo Bonzini #define DISP30(x)       ((x) & 0x3fffffff)
19676cad711SPaolo Bonzini #define ASI(x)          (((x) & 0xff) << 5)  /* Asi field of format3 insns.  */
19776cad711SPaolo Bonzini #define RS2(x)          ((x) & 0x1f)         /* Rs2 field.  */
19876cad711SPaolo Bonzini #define SIMM13(x)       ((x) & 0x1fff)       /* Simm13 field.  */
19976cad711SPaolo Bonzini #define RD(x)           (((x) & 0x1f) << 25) /* Destination register field.  */
20076cad711SPaolo Bonzini #define RS1(x)          (((x) & 0x1f) << 14) /* Rs1 field.  */
20176cad711SPaolo Bonzini #define ASI_RS2(x)      (SIMM13 (x))
20276cad711SPaolo Bonzini #define MEMBAR(x)       ((x) & 0x7f)
20376cad711SPaolo Bonzini #define SLCPOP(x)       (((x) & 0x7f) << 6)  /* Sparclet cpop.  */
20476cad711SPaolo Bonzini 
20576cad711SPaolo Bonzini #define ANNUL   (1 << 29)
20676cad711SPaolo Bonzini #define BPRED   (1 << 19)       /* V9.  */
20776cad711SPaolo Bonzini #define IMMED   F3I (1)
20876cad711SPaolo Bonzini #define RD_G0   RD (~0)
20976cad711SPaolo Bonzini #define RS1_G0  RS1 (~0)
21076cad711SPaolo Bonzini #define RS2_G0  RS2 (~0)
21176cad711SPaolo Bonzini 
21276cad711SPaolo Bonzini static const struct sparc_opcode sparc_opcodes[];
21376cad711SPaolo Bonzini 
21476cad711SPaolo Bonzini static const char *sparc_decode_asi_v8 (int);
21576cad711SPaolo Bonzini static const char *sparc_decode_asi_v9 (int);
21676cad711SPaolo Bonzini static const char *sparc_decode_membar (int);
21776cad711SPaolo Bonzini static const char *sparc_decode_prefetch (int);
21876cad711SPaolo Bonzini static const char *sparc_decode_sparclet_cpreg (int);
21976cad711SPaolo Bonzini 
22076cad711SPaolo Bonzini /* Local Variables:
22176cad711SPaolo Bonzini    fill-column: 131
22276cad711SPaolo Bonzini    comment-column: 0
22376cad711SPaolo Bonzini    End: */
22476cad711SPaolo Bonzini 
22576cad711SPaolo Bonzini /* opcodes/sparc-opc.c */
22676cad711SPaolo Bonzini 
22776cad711SPaolo Bonzini /* Table of opcodes for the sparc.
22876cad711SPaolo Bonzini    Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
22976cad711SPaolo Bonzini    2000, 2002, 2004, 2005
23076cad711SPaolo Bonzini    Free Software Foundation, Inc.
23176cad711SPaolo Bonzini 
23276cad711SPaolo Bonzini    This file is part of the BFD library.
23376cad711SPaolo Bonzini 
23476cad711SPaolo Bonzini    BFD is free software; you can redistribute it and/or modify it under
23576cad711SPaolo Bonzini    the terms of the GNU General Public License as published by the Free
23676cad711SPaolo Bonzini    Software Foundation; either version 2, or (at your option) any later
23776cad711SPaolo Bonzini    version.
23876cad711SPaolo Bonzini 
23976cad711SPaolo Bonzini    BFD is distributed in the hope that it will be useful, but WITHOUT ANY
24076cad711SPaolo Bonzini    WARRANTY; without even the implied warranty of MERCHANTABILITY or
24176cad711SPaolo Bonzini    FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
24276cad711SPaolo Bonzini    for more details.
24376cad711SPaolo Bonzini 
24476cad711SPaolo Bonzini    You should have received a copy of the GNU General Public License
24576cad711SPaolo Bonzini    along with this software; see the file COPYING.  If not,
24676cad711SPaolo Bonzini    see <http://www.gnu.org/licenses/>.  */
24776cad711SPaolo Bonzini 
24876cad711SPaolo Bonzini /* FIXME-someday: perhaps the ,a's and such should be embedded in the
24976cad711SPaolo Bonzini    instruction's name rather than the args.  This would make gas faster, pinsn
25076cad711SPaolo Bonzini    slower, but would mess up some macros a bit.  xoxorich. */
25176cad711SPaolo Bonzini 
25276cad711SPaolo Bonzini /* Some defines to make life easy.  */
25376cad711SPaolo Bonzini #define MASK_V6         SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V6)
25476cad711SPaolo Bonzini #define MASK_V7         SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V7)
25576cad711SPaolo Bonzini #define MASK_V8         SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8)
25676cad711SPaolo Bonzini #define MASK_SPARCLET   SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLET)
25776cad711SPaolo Bonzini #define MASK_SPARCLITE  SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLITE)
25876cad711SPaolo Bonzini #define MASK_V9         SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9)
25976cad711SPaolo Bonzini #define MASK_V9A        SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9A)
26076cad711SPaolo Bonzini #define MASK_V9B        SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9B)
26176cad711SPaolo Bonzini 
26276cad711SPaolo Bonzini /* Bit masks of architectures supporting the insn.  */
26376cad711SPaolo Bonzini 
26476cad711SPaolo Bonzini #define v6              (MASK_V6 | MASK_V7 | MASK_V8 | MASK_SPARCLET \
26576cad711SPaolo Bonzini                          | MASK_SPARCLITE | MASK_V9 | MASK_V9A | MASK_V9B)
26676cad711SPaolo Bonzini /* v6 insns not supported on the sparclet.  */
26776cad711SPaolo Bonzini #define v6notlet        (MASK_V6 | MASK_V7 | MASK_V8 \
26876cad711SPaolo Bonzini                          | MASK_SPARCLITE | MASK_V9 | MASK_V9A | MASK_V9B)
26976cad711SPaolo Bonzini #define v7              (MASK_V7 | MASK_V8 | MASK_SPARCLET \
27076cad711SPaolo Bonzini                          | MASK_SPARCLITE | MASK_V9 | MASK_V9A | MASK_V9B)
27176cad711SPaolo Bonzini /* Although not all insns are implemented in hardware, sparclite is defined
27276cad711SPaolo Bonzini    to be a superset of v8.  Unimplemented insns trap and are then theoretically
27376cad711SPaolo Bonzini    implemented in software.
27476cad711SPaolo Bonzini    It's not clear that the same is true for sparclet, although the docs
27576cad711SPaolo Bonzini    suggest it is.  Rather than complicating things, the sparclet assembler
27676cad711SPaolo Bonzini    recognizes all v8 insns.  */
27776cad711SPaolo Bonzini #define v8              (MASK_V8 | MASK_SPARCLET | MASK_SPARCLITE \
27876cad711SPaolo Bonzini                          | MASK_V9 | MASK_V9A | MASK_V9B)
27976cad711SPaolo Bonzini #define sparclet        (MASK_SPARCLET)
28076cad711SPaolo Bonzini #define sparclite       (MASK_SPARCLITE)
28176cad711SPaolo Bonzini #define v9              (MASK_V9 | MASK_V9A | MASK_V9B)
28276cad711SPaolo Bonzini #define v9a             (MASK_V9A | MASK_V9B)
28376cad711SPaolo Bonzini #define v9b             (MASK_V9B)
28476cad711SPaolo Bonzini /* v6 insns not supported by v9.  */
28576cad711SPaolo Bonzini #define v6notv9         (MASK_V6 | MASK_V7 | MASK_V8 \
28676cad711SPaolo Bonzini                          | MASK_SPARCLET | MASK_SPARCLITE)
28776cad711SPaolo Bonzini /* v9a instructions which would appear to be aliases to v9's impdep's
28876cad711SPaolo Bonzini    otherwise.  */
28976cad711SPaolo Bonzini #define v9notv9a        (MASK_V9)
29076cad711SPaolo Bonzini 
29176cad711SPaolo Bonzini /* Branch condition field.  */
29276cad711SPaolo Bonzini #define COND(x)         (((x) & 0xf) << 25)
29376cad711SPaolo Bonzini 
29476cad711SPaolo Bonzini /* v9: Move (MOVcc and FMOVcc) condition field.  */
29576cad711SPaolo Bonzini #define MCOND(x,i_or_f) ((((i_or_f) & 1) << 18) | (((x) >> 11) & (0xf << 14))) /* v9 */
29676cad711SPaolo Bonzini 
29776cad711SPaolo Bonzini /* v9: Move register (MOVRcc and FMOVRcc) condition field.  */
29876cad711SPaolo Bonzini #define RCOND(x)        (((x) & 0x7) << 10)     /* v9 */
29976cad711SPaolo Bonzini 
30076cad711SPaolo Bonzini #define CONDA   (COND (0x8))
30176cad711SPaolo Bonzini #define CONDCC  (COND (0xd))
30276cad711SPaolo Bonzini #define CONDCS  (COND (0x5))
30376cad711SPaolo Bonzini #define CONDE   (COND (0x1))
30476cad711SPaolo Bonzini #define CONDG   (COND (0xa))
30576cad711SPaolo Bonzini #define CONDGE  (COND (0xb))
30676cad711SPaolo Bonzini #define CONDGU  (COND (0xc))
30776cad711SPaolo Bonzini #define CONDL   (COND (0x3))
30876cad711SPaolo Bonzini #define CONDLE  (COND (0x2))
30976cad711SPaolo Bonzini #define CONDLEU (COND (0x4))
31076cad711SPaolo Bonzini #define CONDN   (COND (0x0))
31176cad711SPaolo Bonzini #define CONDNE  (COND (0x9))
31276cad711SPaolo Bonzini #define CONDNEG (COND (0x6))
31376cad711SPaolo Bonzini #define CONDPOS (COND (0xe))
31476cad711SPaolo Bonzini #define CONDVC  (COND (0xf))
31576cad711SPaolo Bonzini #define CONDVS  (COND (0x7))
31676cad711SPaolo Bonzini 
31776cad711SPaolo Bonzini #define CONDNZ  CONDNE
31876cad711SPaolo Bonzini #define CONDZ   CONDE
31976cad711SPaolo Bonzini #define CONDGEU CONDCC
32076cad711SPaolo Bonzini #define CONDLU  CONDCS
32176cad711SPaolo Bonzini 
32276cad711SPaolo Bonzini #define FCONDA          (COND (0x8))
32376cad711SPaolo Bonzini #define FCONDE          (COND (0x9))
32476cad711SPaolo Bonzini #define FCONDG          (COND (0x6))
32576cad711SPaolo Bonzini #define FCONDGE         (COND (0xb))
32676cad711SPaolo Bonzini #define FCONDL          (COND (0x4))
32776cad711SPaolo Bonzini #define FCONDLE         (COND (0xd))
32876cad711SPaolo Bonzini #define FCONDLG         (COND (0x2))
32976cad711SPaolo Bonzini #define FCONDN          (COND (0x0))
33076cad711SPaolo Bonzini #define FCONDNE         (COND (0x1))
33176cad711SPaolo Bonzini #define FCONDO          (COND (0xf))
33276cad711SPaolo Bonzini #define FCONDU          (COND (0x7))
33376cad711SPaolo Bonzini #define FCONDUE         (COND (0xa))
33476cad711SPaolo Bonzini #define FCONDUG         (COND (0x5))
33576cad711SPaolo Bonzini #define FCONDUGE        (COND (0xc))
33676cad711SPaolo Bonzini #define FCONDUL         (COND (0x3))
33776cad711SPaolo Bonzini #define FCONDULE        (COND (0xe))
33876cad711SPaolo Bonzini 
33976cad711SPaolo Bonzini #define FCONDNZ FCONDNE
34076cad711SPaolo Bonzini #define FCONDZ  FCONDE
34176cad711SPaolo Bonzini 
34276cad711SPaolo Bonzini #define ICC             (0)     /* v9 */
34376cad711SPaolo Bonzini #define XCC             (1 << 12) /* v9 */
34476cad711SPaolo Bonzini #define FCC(x)          (((x) & 0x3) << 11) /* v9 */
34576cad711SPaolo Bonzini #define FBFCC(x)        (((x) & 0x3) << 20)     /* v9 */
34676cad711SPaolo Bonzini 
34776cad711SPaolo Bonzini /* The order of the opcodes in the table is significant:
34876cad711SPaolo Bonzini 
34976cad711SPaolo Bonzini         * The assembler requires that all instances of the same mnemonic must
35076cad711SPaolo Bonzini         be consecutive. If they aren't, the assembler will bomb at runtime.
35176cad711SPaolo Bonzini 
35276cad711SPaolo Bonzini         * The disassembler should not care about the order of the opcodes.  */
35376cad711SPaolo Bonzini 
35476cad711SPaolo Bonzini /* Entries for commutative arithmetic operations.  */
35576cad711SPaolo Bonzini /* ??? More entries can make use of this.  */
35676cad711SPaolo Bonzini #define COMMUTEOP(opcode, op3, arch_mask) \
35776cad711SPaolo Bonzini { opcode,       F3(2, op3, 0), F3(~2, ~op3, ~0)|ASI(~0),        "1,2,d", 0, arch_mask }, \
35876cad711SPaolo Bonzini { opcode,       F3(2, op3, 1), F3(~2, ~op3, ~1),                "1,i,d", 0, arch_mask }, \
35976cad711SPaolo Bonzini { opcode,       F3(2, op3, 1), F3(~2, ~op3, ~1),                "i,1,d", 0, arch_mask }
36076cad711SPaolo Bonzini 
36176cad711SPaolo Bonzini static const struct sparc_opcode sparc_opcodes[] = {
36276cad711SPaolo Bonzini 
36376cad711SPaolo Bonzini { "ld", F3(3, 0x00, 0), F3(~3, ~0x00, ~0),              "[1+2],d", 0, v6 },
36476cad711SPaolo Bonzini { "ld", F3(3, 0x00, 0), F3(~3, ~0x00, ~0)|RS2_G0,       "[1],d", 0, v6 }, /* ld [rs1+%g0],d */
36576cad711SPaolo Bonzini { "ld", F3(3, 0x00, 1), F3(~3, ~0x00, ~1),              "[1+i],d", 0, v6 },
36676cad711SPaolo Bonzini { "ld", F3(3, 0x00, 1), F3(~3, ~0x00, ~1),              "[i+1],d", 0, v6 },
36776cad711SPaolo Bonzini { "ld", F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|RS1_G0,       "[i],d", 0, v6 },
36876cad711SPaolo Bonzini { "ld", F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|SIMM13(~0),   "[1],d", 0, v6 }, /* ld [rs1+0],d */
36976cad711SPaolo Bonzini { "ld", F3(3, 0x20, 0), F3(~3, ~0x20, ~0),              "[1+2],g", 0, v6 },
37076cad711SPaolo Bonzini { "ld", F3(3, 0x20, 0), F3(~3, ~0x20, ~0)|RS2_G0,       "[1],g", 0, v6 }, /* ld [rs1+%g0],d */
37176cad711SPaolo Bonzini { "ld", F3(3, 0x20, 1), F3(~3, ~0x20, ~1),              "[1+i],g", 0, v6 },
37276cad711SPaolo Bonzini { "ld", F3(3, 0x20, 1), F3(~3, ~0x20, ~1),              "[i+1],g", 0, v6 },
37376cad711SPaolo Bonzini { "ld", F3(3, 0x20, 1), F3(~3, ~0x20, ~1)|RS1_G0,       "[i],g", 0, v6 },
37476cad711SPaolo Bonzini { "ld", F3(3, 0x20, 1), F3(~3, ~0x20, ~1)|SIMM13(~0),   "[1],g", 0, v6 }, /* ld [rs1+0],d */
37576cad711SPaolo Bonzini 
37676cad711SPaolo Bonzini { "ld", F3(3, 0x21, 0), F3(~3, ~0x21, ~0)|RD(~0),       "[1+2],F", 0, v6 },
37776cad711SPaolo Bonzini { "ld", F3(3, 0x21, 0), F3(~3, ~0x21, ~0)|RS2_G0|RD(~0),"[1],F", 0, v6 }, /* ld [rs1+%g0],d */
37876cad711SPaolo Bonzini { "ld", F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|RD(~0),       "[1+i],F", 0, v6 },
37976cad711SPaolo Bonzini { "ld", F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|RD(~0),       "[i+1],F", 0, v6 },
38076cad711SPaolo Bonzini { "ld", F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|RS1_G0|RD(~0),"[i],F", 0, v6 },
38176cad711SPaolo Bonzini { "ld", F3(3, 0x21, 1), F3(~3, ~0x21, ~1)|SIMM13(~0)|RD(~0),"[1],F", 0, v6 }, /* ld [rs1+0],d */
38276cad711SPaolo Bonzini 
38376cad711SPaolo Bonzini { "ld", F3(3, 0x30, 0), F3(~3, ~0x30, ~0),              "[1+2],D", 0, v6notv9 },
38476cad711SPaolo Bonzini { "ld", F3(3, 0x30, 0), F3(~3, ~0x30, ~0)|RS2_G0,       "[1],D", 0, v6notv9 }, /* ld [rs1+%g0],d */
38576cad711SPaolo Bonzini { "ld", F3(3, 0x30, 1), F3(~3, ~0x30, ~1),              "[1+i],D", 0, v6notv9 },
38676cad711SPaolo Bonzini { "ld", F3(3, 0x30, 1), F3(~3, ~0x30, ~1),              "[i+1],D", 0, v6notv9 },
38776cad711SPaolo Bonzini { "ld", F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|RS1_G0,       "[i],D", 0, v6notv9 },
38876cad711SPaolo Bonzini { "ld", F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|SIMM13(~0),   "[1],D", 0, v6notv9 }, /* ld [rs1+0],d */
38976cad711SPaolo Bonzini { "ld", F3(3, 0x31, 0), F3(~3, ~0x31, ~0),              "[1+2],C", 0, v6notv9 },
39076cad711SPaolo Bonzini { "ld", F3(3, 0x31, 0), F3(~3, ~0x31, ~0)|RS2_G0,       "[1],C", 0, v6notv9 }, /* ld [rs1+%g0],d */
39176cad711SPaolo Bonzini { "ld", F3(3, 0x31, 1), F3(~3, ~0x31, ~1),              "[1+i],C", 0, v6notv9 },
39276cad711SPaolo Bonzini { "ld", F3(3, 0x31, 1), F3(~3, ~0x31, ~1),              "[i+1],C", 0, v6notv9 },
39376cad711SPaolo Bonzini { "ld", F3(3, 0x31, 1), F3(~3, ~0x31, ~1)|RS1_G0,       "[i],C", 0, v6notv9 },
39476cad711SPaolo Bonzini { "ld", F3(3, 0x31, 1), F3(~3, ~0x31, ~1)|SIMM13(~0),   "[1],C", 0, v6notv9 }, /* ld [rs1+0],d */
39576cad711SPaolo Bonzini 
39676cad711SPaolo Bonzini /* The v9 LDUW is the same as the old 'ld' opcode, it is not the same as the
39776cad711SPaolo Bonzini    'ld' pseudo-op in v9.  */
39876cad711SPaolo Bonzini { "lduw",       F3(3, 0x00, 0), F3(~3, ~0x00, ~0),              "[1+2],d", F_ALIAS, v9 },
39976cad711SPaolo Bonzini { "lduw",       F3(3, 0x00, 0), F3(~3, ~0x00, ~0)|RS2_G0,       "[1],d", F_ALIAS, v9 }, /* ld [rs1+%g0],d */
40076cad711SPaolo Bonzini { "lduw",       F3(3, 0x00, 1), F3(~3, ~0x00, ~1),              "[1+i],d", F_ALIAS, v9 },
40176cad711SPaolo Bonzini { "lduw",       F3(3, 0x00, 1), F3(~3, ~0x00, ~1),              "[i+1],d", F_ALIAS, v9 },
40276cad711SPaolo Bonzini { "lduw",       F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|RS1_G0,       "[i],d", F_ALIAS, v9 },
40376cad711SPaolo Bonzini { "lduw",       F3(3, 0x00, 1), F3(~3, ~0x00, ~1)|SIMM13(~0),   "[1],d", F_ALIAS, v9 }, /* ld [rs1+0],d */
40476cad711SPaolo Bonzini 
40576cad711SPaolo Bonzini { "ldd",        F3(3, 0x03, 0), F3(~3, ~0x03, ~0)|ASI(~0),      "[1+2],d", 0, v6 },
40676cad711SPaolo Bonzini { "ldd",        F3(3, 0x03, 0), F3(~3, ~0x03, ~0)|ASI_RS2(~0),  "[1],d", 0, v6 }, /* ldd [rs1+%g0],d */
40776cad711SPaolo Bonzini { "ldd",        F3(3, 0x03, 1), F3(~3, ~0x03, ~1),              "[1+i],d", 0, v6 },
40876cad711SPaolo Bonzini { "ldd",        F3(3, 0x03, 1), F3(~3, ~0x03, ~1),              "[i+1],d", 0, v6 },
40976cad711SPaolo Bonzini { "ldd",        F3(3, 0x03, 1), F3(~3, ~0x03, ~1)|RS1_G0,       "[i],d", 0, v6 },
41076cad711SPaolo Bonzini { "ldd",        F3(3, 0x03, 1), F3(~3, ~0x03, ~1)|SIMM13(~0),   "[1],d", 0, v6 }, /* ldd [rs1+0],d */
41176cad711SPaolo Bonzini { "ldd",        F3(3, 0x23, 0), F3(~3, ~0x23, ~0)|ASI(~0),      "[1+2],H", 0, v6 },
41276cad711SPaolo Bonzini { "ldd",        F3(3, 0x23, 0), F3(~3, ~0x23, ~0)|ASI_RS2(~0),  "[1],H", 0, v6 }, /* ldd [rs1+%g0],d */
41376cad711SPaolo Bonzini { "ldd",        F3(3, 0x23, 1), F3(~3, ~0x23, ~1),              "[1+i],H", 0, v6 },
41476cad711SPaolo Bonzini { "ldd",        F3(3, 0x23, 1), F3(~3, ~0x23, ~1),              "[i+1],H", 0, v6 },
41576cad711SPaolo Bonzini { "ldd",        F3(3, 0x23, 1), F3(~3, ~0x23, ~1)|RS1_G0,       "[i],H", 0, v6 },
41676cad711SPaolo Bonzini { "ldd",        F3(3, 0x23, 1), F3(~3, ~0x23, ~1)|SIMM13(~0),   "[1],H", 0, v6 }, /* ldd [rs1+0],d */
41776cad711SPaolo Bonzini 
41876cad711SPaolo Bonzini { "ldd",        F3(3, 0x33, 0), F3(~3, ~0x33, ~0)|ASI(~0),      "[1+2],D", 0, v6notv9 },
41976cad711SPaolo Bonzini { "ldd",        F3(3, 0x33, 0), F3(~3, ~0x33, ~0)|ASI_RS2(~0),  "[1],D", 0, v6notv9 }, /* ldd [rs1+%g0],d */
42076cad711SPaolo Bonzini { "ldd",        F3(3, 0x33, 1), F3(~3, ~0x33, ~1),              "[1+i],D", 0, v6notv9 },
42176cad711SPaolo Bonzini { "ldd",        F3(3, 0x33, 1), F3(~3, ~0x33, ~1),              "[i+1],D", 0, v6notv9 },
42276cad711SPaolo Bonzini { "ldd",        F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|RS1_G0,       "[i],D", 0, v6notv9 },
42376cad711SPaolo Bonzini { "ldd",        F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|SIMM13(~0),   "[1],D", 0, v6notv9 }, /* ldd [rs1+0],d */
42476cad711SPaolo Bonzini 
42576cad711SPaolo Bonzini { "ldq",        F3(3, 0x22, 0), F3(~3, ~0x22, ~0)|ASI(~0),      "[1+2],J", 0, v9 },
42676cad711SPaolo Bonzini { "ldq",        F3(3, 0x22, 0), F3(~3, ~0x22, ~0)|ASI_RS2(~0),  "[1],J", 0, v9 }, /* ldd [rs1+%g0],d */
42776cad711SPaolo Bonzini { "ldq",        F3(3, 0x22, 1), F3(~3, ~0x22, ~1),              "[1+i],J", 0, v9 },
42876cad711SPaolo Bonzini { "ldq",        F3(3, 0x22, 1), F3(~3, ~0x22, ~1),              "[i+1],J", 0, v9 },
42976cad711SPaolo Bonzini { "ldq",        F3(3, 0x22, 1), F3(~3, ~0x22, ~1)|RS1_G0,       "[i],J", 0, v9 },
43076cad711SPaolo Bonzini { "ldq",        F3(3, 0x22, 1), F3(~3, ~0x22, ~1)|SIMM13(~0),   "[1],J", 0, v9 }, /* ldd [rs1+0],d */
43176cad711SPaolo Bonzini 
43276cad711SPaolo Bonzini { "ldsb",       F3(3, 0x09, 0), F3(~3, ~0x09, ~0)|ASI(~0),      "[1+2],d", 0, v6 },
43376cad711SPaolo Bonzini { "ldsb",       F3(3, 0x09, 0), F3(~3, ~0x09, ~0)|ASI_RS2(~0),  "[1],d", 0, v6 }, /* ldsb [rs1+%g0],d */
43476cad711SPaolo Bonzini { "ldsb",       F3(3, 0x09, 1), F3(~3, ~0x09, ~1),              "[1+i],d", 0, v6 },
43576cad711SPaolo Bonzini { "ldsb",       F3(3, 0x09, 1), F3(~3, ~0x09, ~1),              "[i+1],d", 0, v6 },
43676cad711SPaolo Bonzini { "ldsb",       F3(3, 0x09, 1), F3(~3, ~0x09, ~1)|RS1_G0,       "[i],d", 0, v6 },
43776cad711SPaolo Bonzini { "ldsb",       F3(3, 0x09, 1), F3(~3, ~0x09, ~1)|SIMM13(~0),   "[1],d", 0, v6 }, /* ldsb [rs1+0],d */
43876cad711SPaolo Bonzini 
43976cad711SPaolo Bonzini { "ldsh",       F3(3, 0x0a, 0), F3(~3, ~0x0a, ~0)|ASI_RS2(~0),  "[1],d", 0, v6 }, /* ldsh [rs1+%g0],d */
44076cad711SPaolo Bonzini { "ldsh",       F3(3, 0x0a, 0), F3(~3, ~0x0a, ~0)|ASI(~0),      "[1+2],d", 0, v6 },
44176cad711SPaolo Bonzini { "ldsh",       F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1),              "[1+i],d", 0, v6 },
44276cad711SPaolo Bonzini { "ldsh",       F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1),              "[i+1],d", 0, v6 },
44376cad711SPaolo Bonzini { "ldsh",       F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1)|RS1_G0,       "[i],d", 0, v6 },
44476cad711SPaolo Bonzini { "ldsh",       F3(3, 0x0a, 1), F3(~3, ~0x0a, ~1)|SIMM13(~0),   "[1],d", 0, v6 }, /* ldsh [rs1+0],d */
44576cad711SPaolo Bonzini 
44676cad711SPaolo Bonzini { "ldstub",     F3(3, 0x0d, 0), F3(~3, ~0x0d, ~0)|ASI(~0),      "[1+2],d", 0, v6 },
44776cad711SPaolo Bonzini { "ldstub",     F3(3, 0x0d, 0), F3(~3, ~0x0d, ~0)|ASI_RS2(~0),  "[1],d", 0, v6 }, /* ldstub [rs1+%g0],d */
44876cad711SPaolo Bonzini { "ldstub",     F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1),              "[1+i],d", 0, v6 },
44976cad711SPaolo Bonzini { "ldstub",     F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1),              "[i+1],d", 0, v6 },
45076cad711SPaolo Bonzini { "ldstub",     F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1)|RS1_G0,       "[i],d", 0, v6 },
45176cad711SPaolo Bonzini { "ldstub",     F3(3, 0x0d, 1), F3(~3, ~0x0d, ~1)|SIMM13(~0),   "[1],d", 0, v6 }, /* ldstub [rs1+0],d */
45276cad711SPaolo Bonzini 
45376cad711SPaolo Bonzini { "ldsw",       F3(3, 0x08, 0), F3(~3, ~0x08, ~0)|ASI(~0),      "[1+2],d", 0, v9 },
45476cad711SPaolo Bonzini { "ldsw",       F3(3, 0x08, 0), F3(~3, ~0x08, ~0)|ASI_RS2(~0),  "[1],d", 0, v9 }, /* ldsw [rs1+%g0],d */
45576cad711SPaolo Bonzini { "ldsw",       F3(3, 0x08, 1), F3(~3, ~0x08, ~1),              "[1+i],d", 0, v9 },
45676cad711SPaolo Bonzini { "ldsw",       F3(3, 0x08, 1), F3(~3, ~0x08, ~1),              "[i+1],d", 0, v9 },
45776cad711SPaolo Bonzini { "ldsw",       F3(3, 0x08, 1), F3(~3, ~0x08, ~1)|RS1_G0,       "[i],d", 0, v9 },
45876cad711SPaolo Bonzini { "ldsw",       F3(3, 0x08, 1), F3(~3, ~0x08, ~1)|SIMM13(~0),   "[1],d", 0, v9 }, /* ldsw [rs1+0],d */
45976cad711SPaolo Bonzini 
46076cad711SPaolo Bonzini { "ldub",       F3(3, 0x01, 0), F3(~3, ~0x01, ~0)|ASI(~0),      "[1+2],d", 0, v6 },
46176cad711SPaolo Bonzini { "ldub",       F3(3, 0x01, 0), F3(~3, ~0x01, ~0)|ASI_RS2(~0),  "[1],d", 0, v6 }, /* ldub [rs1+%g0],d */
46276cad711SPaolo Bonzini { "ldub",       F3(3, 0x01, 1), F3(~3, ~0x01, ~1),              "[1+i],d", 0, v6 },
46376cad711SPaolo Bonzini { "ldub",       F3(3, 0x01, 1), F3(~3, ~0x01, ~1),              "[i+1],d", 0, v6 },
46476cad711SPaolo Bonzini { "ldub",       F3(3, 0x01, 1), F3(~3, ~0x01, ~1)|RS1_G0,       "[i],d", 0, v6 },
46576cad711SPaolo Bonzini { "ldub",       F3(3, 0x01, 1), F3(~3, ~0x01, ~1)|SIMM13(~0),   "[1],d", 0, v6 }, /* ldub [rs1+0],d */
46676cad711SPaolo Bonzini 
46776cad711SPaolo Bonzini { "lduh",       F3(3, 0x02, 0), F3(~3, ~0x02, ~0)|ASI(~0),      "[1+2],d", 0, v6 },
46876cad711SPaolo Bonzini { "lduh",       F3(3, 0x02, 0), F3(~3, ~0x02, ~0)|ASI_RS2(~0),  "[1],d", 0, v6 }, /* lduh [rs1+%g0],d */
46976cad711SPaolo Bonzini { "lduh",       F3(3, 0x02, 1), F3(~3, ~0x02, ~1),              "[1+i],d", 0, v6 },
47076cad711SPaolo Bonzini { "lduh",       F3(3, 0x02, 1), F3(~3, ~0x02, ~1),              "[i+1],d", 0, v6 },
47176cad711SPaolo Bonzini { "lduh",       F3(3, 0x02, 1), F3(~3, ~0x02, ~1)|RS1_G0,       "[i],d", 0, v6 },
47276cad711SPaolo Bonzini { "lduh",       F3(3, 0x02, 1), F3(~3, ~0x02, ~1)|SIMM13(~0),   "[1],d", 0, v6 }, /* lduh [rs1+0],d */
47376cad711SPaolo Bonzini 
47476cad711SPaolo Bonzini { "ldx",        F3(3, 0x0b, 0), F3(~3, ~0x0b, ~0)|ASI(~0),      "[1+2],d", 0, v9 },
47576cad711SPaolo Bonzini { "ldx",        F3(3, 0x0b, 0), F3(~3, ~0x0b, ~0)|ASI_RS2(~0),  "[1],d", 0, v9 }, /* ldx [rs1+%g0],d */
47676cad711SPaolo Bonzini { "ldx",        F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1),              "[1+i],d", 0, v9 },
47776cad711SPaolo Bonzini { "ldx",        F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1),              "[i+1],d", 0, v9 },
47876cad711SPaolo Bonzini { "ldx",        F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1)|RS1_G0,       "[i],d", 0, v9 },
47976cad711SPaolo Bonzini { "ldx",        F3(3, 0x0b, 1), F3(~3, ~0x0b, ~1)|SIMM13(~0),   "[1],d", 0, v9 }, /* ldx [rs1+0],d */
48076cad711SPaolo Bonzini 
48176cad711SPaolo Bonzini { "ldx",        F3(3, 0x21, 0)|RD(1), F3(~3, ~0x21, ~0)|RD(~1), "[1+2],F", 0, v9 },
48276cad711SPaolo Bonzini { "ldx",        F3(3, 0x21, 0)|RD(1), F3(~3, ~0x21, ~0)|RS2_G0|RD(~1),  "[1],F", 0, v9 }, /* ld [rs1+%g0],d */
48376cad711SPaolo Bonzini { "ldx",        F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|RD(~1), "[1+i],F", 0, v9 },
48476cad711SPaolo Bonzini { "ldx",        F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|RD(~1), "[i+1],F", 0, v9 },
48576cad711SPaolo Bonzini { "ldx",        F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|RS1_G0|RD(~1),  "[i],F", 0, v9 },
48676cad711SPaolo Bonzini { "ldx",        F3(3, 0x21, 1)|RD(1), F3(~3, ~0x21, ~1)|SIMM13(~0)|RD(~1),"[1],F", 0, v9 }, /* ld [rs1+0],d */
48776cad711SPaolo Bonzini 
48876cad711SPaolo Bonzini { "lda",        F3(3, 0x10, 0), F3(~3, ~0x10, ~0),              "[1+2]A,d", 0, v6 },
48976cad711SPaolo Bonzini { "lda",        F3(3, 0x10, 0), F3(~3, ~0x10, ~0)|RS2_G0,       "[1]A,d", 0, v6 }, /* lda [rs1+%g0],d */
49076cad711SPaolo Bonzini { "lda",        F3(3, 0x10, 1), F3(~3, ~0x10, ~1),              "[1+i]o,d", 0, v9 },
49176cad711SPaolo Bonzini { "lda",        F3(3, 0x10, 1), F3(~3, ~0x10, ~1),              "[i+1]o,d", 0, v9 },
49276cad711SPaolo Bonzini { "lda",        F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
49376cad711SPaolo Bonzini { "lda",        F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
49476cad711SPaolo Bonzini { "lda",        F3(3, 0x30, 0), F3(~3, ~0x30, ~0),              "[1+2]A,g", 0, v9 },
49576cad711SPaolo Bonzini { "lda",        F3(3, 0x30, 0), F3(~3, ~0x30, ~0)|RS2_G0,       "[1]A,g", 0, v9 }, /* lda [rs1+%g0],d */
49676cad711SPaolo Bonzini { "lda",        F3(3, 0x30, 1), F3(~3, ~0x30, ~1),              "[1+i]o,g", 0, v9 },
49776cad711SPaolo Bonzini { "lda",        F3(3, 0x30, 1), F3(~3, ~0x30, ~1),              "[i+1]o,g", 0, v9 },
49876cad711SPaolo Bonzini { "lda",        F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|RS1_G0,       "[i]o,g", 0, v9 },
49976cad711SPaolo Bonzini { "lda",        F3(3, 0x30, 1), F3(~3, ~0x30, ~1)|SIMM13(~0),   "[1]o,g", 0, v9 }, /* ld [rs1+0],d */
50076cad711SPaolo Bonzini 
50176cad711SPaolo Bonzini { "ldda",       F3(3, 0x13, 0), F3(~3, ~0x13, ~0),              "[1+2]A,d", 0, v6 },
50276cad711SPaolo Bonzini { "ldda",       F3(3, 0x13, 0), F3(~3, ~0x13, ~0)|RS2_G0,       "[1]A,d", 0, v6 }, /* ldda [rs1+%g0],d */
50376cad711SPaolo Bonzini { "ldda",       F3(3, 0x13, 1), F3(~3, ~0x13, ~1),              "[1+i]o,d", 0, v9 },
50476cad711SPaolo Bonzini { "ldda",       F3(3, 0x13, 1), F3(~3, ~0x13, ~1),              "[i+1]o,d", 0, v9 },
50576cad711SPaolo Bonzini { "ldda",       F3(3, 0x13, 1), F3(~3, ~0x13, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
50676cad711SPaolo Bonzini { "ldda",       F3(3, 0x13, 1), F3(~3, ~0x13, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
50776cad711SPaolo Bonzini 
50876cad711SPaolo Bonzini { "ldda",       F3(3, 0x33, 0), F3(~3, ~0x33, ~0),              "[1+2]A,H", 0, v9 },
50976cad711SPaolo Bonzini { "ldda",       F3(3, 0x33, 0), F3(~3, ~0x33, ~0)|RS2_G0,       "[1]A,H", 0, v9 }, /* ldda [rs1+%g0],d */
51076cad711SPaolo Bonzini { "ldda",       F3(3, 0x33, 1), F3(~3, ~0x33, ~1),              "[1+i]o,H", 0, v9 },
51176cad711SPaolo Bonzini { "ldda",       F3(3, 0x33, 1), F3(~3, ~0x33, ~1),              "[i+1]o,H", 0, v9 },
51276cad711SPaolo Bonzini { "ldda",       F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|RS1_G0,       "[i]o,H", 0, v9 },
51376cad711SPaolo Bonzini { "ldda",       F3(3, 0x33, 1), F3(~3, ~0x33, ~1)|SIMM13(~0),   "[1]o,H", 0, v9 }, /* ld [rs1+0],d */
51476cad711SPaolo Bonzini 
51576cad711SPaolo Bonzini { "ldqa",       F3(3, 0x32, 0), F3(~3, ~0x32, ~0),              "[1+2]A,J", 0, v9 },
51676cad711SPaolo Bonzini { "ldqa",       F3(3, 0x32, 0), F3(~3, ~0x32, ~0)|RS2_G0,       "[1]A,J", 0, v9 }, /* ldd [rs1+%g0],d */
51776cad711SPaolo Bonzini { "ldqa",       F3(3, 0x32, 1), F3(~3, ~0x32, ~1),              "[1+i]o,J", 0, v9 },
51876cad711SPaolo Bonzini { "ldqa",       F3(3, 0x32, 1), F3(~3, ~0x32, ~1),              "[i+1]o,J", 0, v9 },
51976cad711SPaolo Bonzini { "ldqa",       F3(3, 0x32, 1), F3(~3, ~0x32, ~1)|RS1_G0,       "[i]o,J", 0, v9 },
52076cad711SPaolo Bonzini { "ldqa",       F3(3, 0x32, 1), F3(~3, ~0x32, ~1)|SIMM13(~0),   "[1]o,J", 0, v9 }, /* ldd [rs1+0],d */
52176cad711SPaolo Bonzini 
52276cad711SPaolo Bonzini { "ldsba",      F3(3, 0x19, 0), F3(~3, ~0x19, ~0),              "[1+2]A,d", 0, v6 },
52376cad711SPaolo Bonzini { "ldsba",      F3(3, 0x19, 0), F3(~3, ~0x19, ~0)|RS2_G0,       "[1]A,d", 0, v6 }, /* ldsba [rs1+%g0],d */
52476cad711SPaolo Bonzini { "ldsba",      F3(3, 0x19, 1), F3(~3, ~0x19, ~1),              "[1+i]o,d", 0, v9 },
52576cad711SPaolo Bonzini { "ldsba",      F3(3, 0x19, 1), F3(~3, ~0x19, ~1),              "[i+1]o,d", 0, v9 },
52676cad711SPaolo Bonzini { "ldsba",      F3(3, 0x19, 1), F3(~3, ~0x19, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
52776cad711SPaolo Bonzini { "ldsba",      F3(3, 0x19, 1), F3(~3, ~0x19, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
52876cad711SPaolo Bonzini 
52976cad711SPaolo Bonzini { "ldsha",      F3(3, 0x1a, 0), F3(~3, ~0x1a, ~0),              "[1+2]A,d", 0, v6 },
53076cad711SPaolo Bonzini { "ldsha",      F3(3, 0x1a, 0), F3(~3, ~0x1a, ~0)|RS2_G0,       "[1]A,d", 0, v6 }, /* ldsha [rs1+%g0],d */
53176cad711SPaolo Bonzini { "ldsha",      F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1),              "[1+i]o,d", 0, v9 },
53276cad711SPaolo Bonzini { "ldsha",      F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1),              "[i+1]o,d", 0, v9 },
53376cad711SPaolo Bonzini { "ldsha",      F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
53476cad711SPaolo Bonzini { "ldsha",      F3(3, 0x1a, 1), F3(~3, ~0x1a, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
53576cad711SPaolo Bonzini 
53676cad711SPaolo Bonzini { "ldstuba",    F3(3, 0x1d, 0), F3(~3, ~0x1d, ~0),              "[1+2]A,d", 0, v6 },
53776cad711SPaolo Bonzini { "ldstuba",    F3(3, 0x1d, 0), F3(~3, ~0x1d, ~0)|RS2_G0,       "[1]A,d", 0, v6 }, /* ldstuba [rs1+%g0],d */
53876cad711SPaolo Bonzini { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1),              "[1+i]o,d", 0, v9 },
53976cad711SPaolo Bonzini { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1),              "[i+1]o,d", 0, v9 },
54076cad711SPaolo Bonzini { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
54176cad711SPaolo Bonzini { "ldstuba",    F3(3, 0x1d, 1), F3(~3, ~0x1d, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
54276cad711SPaolo Bonzini 
54376cad711SPaolo Bonzini { "ldswa",      F3(3, 0x18, 0), F3(~3, ~0x18, ~0),              "[1+2]A,d", 0, v9 },
54476cad711SPaolo Bonzini { "ldswa",      F3(3, 0x18, 0), F3(~3, ~0x18, ~0)|RS2_G0,       "[1]A,d", 0, v9 }, /* lda [rs1+%g0],d */
54576cad711SPaolo Bonzini { "ldswa",      F3(3, 0x18, 1), F3(~3, ~0x18, ~1),              "[1+i]o,d", 0, v9 },
54676cad711SPaolo Bonzini { "ldswa",      F3(3, 0x18, 1), F3(~3, ~0x18, ~1),              "[i+1]o,d", 0, v9 },
54776cad711SPaolo Bonzini { "ldswa",      F3(3, 0x18, 1), F3(~3, ~0x18, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
54876cad711SPaolo Bonzini { "ldswa",      F3(3, 0x18, 1), F3(~3, ~0x18, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
54976cad711SPaolo Bonzini 
55076cad711SPaolo Bonzini { "lduba",      F3(3, 0x11, 0), F3(~3, ~0x11, ~0),              "[1+2]A,d", 0, v6 },
55176cad711SPaolo Bonzini { "lduba",      F3(3, 0x11, 0), F3(~3, ~0x11, ~0)|RS2_G0,       "[1]A,d", 0, v6 }, /* lduba [rs1+%g0],d */
55276cad711SPaolo Bonzini { "lduba",      F3(3, 0x11, 1), F3(~3, ~0x11, ~1),              "[1+i]o,d", 0, v9 },
55376cad711SPaolo Bonzini { "lduba",      F3(3, 0x11, 1), F3(~3, ~0x11, ~1),              "[i+1]o,d", 0, v9 },
55476cad711SPaolo Bonzini { "lduba",      F3(3, 0x11, 1), F3(~3, ~0x11, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
55576cad711SPaolo Bonzini { "lduba",      F3(3, 0x11, 1), F3(~3, ~0x11, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
55676cad711SPaolo Bonzini 
55776cad711SPaolo Bonzini { "lduha",      F3(3, 0x12, 0), F3(~3, ~0x12, ~0),              "[1+2]A,d", 0, v6 },
55876cad711SPaolo Bonzini { "lduha",      F3(3, 0x12, 0), F3(~3, ~0x12, ~0)|RS2_G0,       "[1]A,d", 0, v6 }, /* lduha [rs1+%g0],d */
55976cad711SPaolo Bonzini { "lduha",      F3(3, 0x12, 1), F3(~3, ~0x12, ~1),              "[1+i]o,d", 0, v9 },
56076cad711SPaolo Bonzini { "lduha",      F3(3, 0x12, 1), F3(~3, ~0x12, ~1),              "[i+1]o,d", 0, v9 },
56176cad711SPaolo Bonzini { "lduha",      F3(3, 0x12, 1), F3(~3, ~0x12, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
56276cad711SPaolo Bonzini { "lduha",      F3(3, 0x12, 1), F3(~3, ~0x12, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
56376cad711SPaolo Bonzini 
56476cad711SPaolo Bonzini { "lduwa",      F3(3, 0x10, 0), F3(~3, ~0x10, ~0),              "[1+2]A,d", F_ALIAS, v9 }, /* lduwa === lda */
56576cad711SPaolo Bonzini { "lduwa",      F3(3, 0x10, 0), F3(~3, ~0x10, ~0)|RS2_G0,       "[1]A,d", F_ALIAS, v9 }, /* lda [rs1+%g0],d */
56676cad711SPaolo Bonzini { "lduwa",      F3(3, 0x10, 1), F3(~3, ~0x10, ~1),              "[1+i]o,d", F_ALIAS, v9 },
56776cad711SPaolo Bonzini { "lduwa",      F3(3, 0x10, 1), F3(~3, ~0x10, ~1),              "[i+1]o,d", F_ALIAS, v9 },
56876cad711SPaolo Bonzini { "lduwa",      F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|RS1_G0,       "[i]o,d", F_ALIAS, v9 },
56976cad711SPaolo Bonzini { "lduwa",      F3(3, 0x10, 1), F3(~3, ~0x10, ~1)|SIMM13(~0),   "[1]o,d", F_ALIAS, v9 }, /* ld [rs1+0],d */
57076cad711SPaolo Bonzini 
57176cad711SPaolo Bonzini { "ldxa",       F3(3, 0x1b, 0), F3(~3, ~0x1b, ~0),              "[1+2]A,d", 0, v9 },
57276cad711SPaolo Bonzini { "ldxa",       F3(3, 0x1b, 0), F3(~3, ~0x1b, ~0)|RS2_G0,       "[1]A,d", 0, v9 }, /* lda [rs1+%g0],d */
57376cad711SPaolo Bonzini { "ldxa",       F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1),              "[1+i]o,d", 0, v9 },
57476cad711SPaolo Bonzini { "ldxa",       F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1),              "[i+1]o,d", 0, v9 },
57576cad711SPaolo Bonzini { "ldxa",       F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
57676cad711SPaolo Bonzini { "ldxa",       F3(3, 0x1b, 1), F3(~3, ~0x1b, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* ld [rs1+0],d */
57776cad711SPaolo Bonzini 
57876cad711SPaolo Bonzini { "st", F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI(~0),              "d,[1+2]", 0, v6 },
57976cad711SPaolo Bonzini { "st", F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI_RS2(~0),          "d,[1]", 0, v6 }, /* st d,[rs1+%g0] */
58076cad711SPaolo Bonzini { "st", F3(3, 0x04, 1), F3(~3, ~0x04, ~1),                      "d,[1+i]", 0, v6 },
58176cad711SPaolo Bonzini { "st", F3(3, 0x04, 1), F3(~3, ~0x04, ~1),                      "d,[i+1]", 0, v6 },
58276cad711SPaolo Bonzini { "st", F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RS1_G0,               "d,[i]", 0, v6 },
58376cad711SPaolo Bonzini { "st", F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|SIMM13(~0),           "d,[1]", 0, v6 }, /* st d,[rs1+0] */
58476cad711SPaolo Bonzini { "st", F3(3, 0x24, 0), F3(~3, ~0x24, ~0)|ASI(~0),              "g,[1+2]", 0, v6 },
58576cad711SPaolo Bonzini { "st", F3(3, 0x24, 0), F3(~3, ~0x24, ~0)|ASI_RS2(~0),          "g,[1]", 0, v6 }, /* st d[rs1+%g0] */
58676cad711SPaolo Bonzini { "st", F3(3, 0x24, 1), F3(~3, ~0x24, ~1),                      "g,[1+i]", 0, v6 },
58776cad711SPaolo Bonzini { "st", F3(3, 0x24, 1), F3(~3, ~0x24, ~1),                      "g,[i+1]", 0, v6 },
58876cad711SPaolo Bonzini { "st", F3(3, 0x24, 1), F3(~3, ~0x24, ~1)|RS1_G0,               "g,[i]", 0, v6 },
58976cad711SPaolo Bonzini { "st", F3(3, 0x24, 1), F3(~3, ~0x24, ~1)|SIMM13(~0),           "g,[1]", 0, v6 }, /* st d,[rs1+0] */
59076cad711SPaolo Bonzini 
59176cad711SPaolo Bonzini { "st", F3(3, 0x34, 0), F3(~3, ~0x34, ~0)|ASI(~0),              "D,[1+2]", 0, v6notv9 },
59276cad711SPaolo Bonzini { "st", F3(3, 0x34, 0), F3(~3, ~0x34, ~0)|ASI_RS2(~0),          "D,[1]", 0, v6notv9 }, /* st d,[rs1+%g0] */
59376cad711SPaolo Bonzini { "st", F3(3, 0x34, 1), F3(~3, ~0x34, ~1),                      "D,[1+i]", 0, v6notv9 },
59476cad711SPaolo Bonzini { "st", F3(3, 0x34, 1), F3(~3, ~0x34, ~1),                      "D,[i+1]", 0, v6notv9 },
59576cad711SPaolo Bonzini { "st", F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|RS1_G0,               "D,[i]", 0, v6notv9 },
59676cad711SPaolo Bonzini { "st", F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|SIMM13(~0),           "D,[1]", 0, v6notv9 }, /* st d,[rs1+0] */
59776cad711SPaolo Bonzini { "st", F3(3, 0x35, 0), F3(~3, ~0x35, ~0)|ASI(~0),              "C,[1+2]", 0, v6notv9 },
59876cad711SPaolo Bonzini { "st", F3(3, 0x35, 0), F3(~3, ~0x35, ~0)|ASI_RS2(~0),          "C,[1]", 0, v6notv9 }, /* st d,[rs1+%g0] */
59976cad711SPaolo Bonzini { "st", F3(3, 0x35, 1), F3(~3, ~0x35, ~1),                      "C,[1+i]", 0, v6notv9 },
60076cad711SPaolo Bonzini { "st", F3(3, 0x35, 1), F3(~3, ~0x35, ~1),                      "C,[i+1]", 0, v6notv9 },
60176cad711SPaolo Bonzini { "st", F3(3, 0x35, 1), F3(~3, ~0x35, ~1)|RS1_G0,               "C,[i]", 0, v6notv9 },
60276cad711SPaolo Bonzini { "st", F3(3, 0x35, 1), F3(~3, ~0x35, ~1)|SIMM13(~0),           "C,[1]", 0, v6notv9 }, /* st d,[rs1+0] */
60376cad711SPaolo Bonzini 
60476cad711SPaolo Bonzini { "st", F3(3, 0x25, 0), F3(~3, ~0x25, ~0)|RD_G0|ASI(~0),        "F,[1+2]", 0, v6 },
60576cad711SPaolo Bonzini { "st", F3(3, 0x25, 0), F3(~3, ~0x25, ~0)|RD_G0|ASI_RS2(~0),    "F,[1]", 0, v6 }, /* st d,[rs1+%g0] */
60676cad711SPaolo Bonzini { "st", F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0,                "F,[1+i]", 0, v6 },
60776cad711SPaolo Bonzini { "st", F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0,                "F,[i+1]", 0, v6 },
60876cad711SPaolo Bonzini { "st", F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0|RS1_G0,         "F,[i]", 0, v6 },
60976cad711SPaolo Bonzini { "st", F3(3, 0x25, 1), F3(~3, ~0x25, ~1)|RD_G0|SIMM13(~0),     "F,[1]", 0, v6 }, /* st d,[rs1+0] */
61076cad711SPaolo Bonzini 
61176cad711SPaolo Bonzini { "stw",        F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v9 },
61276cad711SPaolo Bonzini { "stw",        F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+%g0] */
61376cad711SPaolo Bonzini { "stw",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[1+i]", F_ALIAS, v9 },
61476cad711SPaolo Bonzini { "stw",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[i+1]", F_ALIAS, v9 },
61576cad711SPaolo Bonzini { "stw",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v9 },
61676cad711SPaolo Bonzini { "stw",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+0] */
61776cad711SPaolo Bonzini { "stsw",       F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v9 },
61876cad711SPaolo Bonzini { "stsw",       F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+%g0] */
61976cad711SPaolo Bonzini { "stsw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[1+i]", F_ALIAS, v9 },
62076cad711SPaolo Bonzini { "stsw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[i+1]", F_ALIAS, v9 },
62176cad711SPaolo Bonzini { "stsw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v9 },
62276cad711SPaolo Bonzini { "stsw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+0] */
62376cad711SPaolo Bonzini { "stuw",       F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v9 },
62476cad711SPaolo Bonzini { "stuw",       F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+%g0] */
62576cad711SPaolo Bonzini { "stuw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[1+i]", F_ALIAS, v9 },
62676cad711SPaolo Bonzini { "stuw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[i+1]", F_ALIAS, v9 },
62776cad711SPaolo Bonzini { "stuw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v9 },
62876cad711SPaolo Bonzini { "stuw",       F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v9 }, /* st d,[rs1+0] */
62976cad711SPaolo Bonzini 
63076cad711SPaolo Bonzini { "spill",      F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v6 },
63176cad711SPaolo Bonzini { "spill",      F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v6 }, /* st d,[rs1+%g0] */
63276cad711SPaolo Bonzini { "spill",      F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[1+i]", F_ALIAS, v6 },
63376cad711SPaolo Bonzini { "spill",      F3(3, 0x04, 1), F3(~3, ~0x04, ~1),              "d,[i+1]", F_ALIAS, v6 },
63476cad711SPaolo Bonzini { "spill",      F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v6 },
63576cad711SPaolo Bonzini { "spill",      F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v6 }, /* st d,[rs1+0] */
63676cad711SPaolo Bonzini 
63776cad711SPaolo Bonzini { "sta",        F3(3, 0x14, 0), F3(~3, ~0x14, ~0),              "d,[1+2]A", 0, v6 },
63876cad711SPaolo Bonzini { "sta",        F3(3, 0x14, 0), F3(~3, ~0x14, ~0)|RS2(~0),      "d,[1]A", 0, v6 }, /* sta d,[rs1+%g0] */
63976cad711SPaolo Bonzini { "sta",        F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[1+i]o", 0, v9 },
64076cad711SPaolo Bonzini { "sta",        F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[i+1]o", 0, v9 },
64176cad711SPaolo Bonzini { "sta",        F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|RS1_G0,       "d,[i]o", 0, v9 },
64276cad711SPaolo Bonzini { "sta",        F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|SIMM13(~0),   "d,[1]o", 0, v9 }, /* st d,[rs1+0] */
64376cad711SPaolo Bonzini 
64476cad711SPaolo Bonzini { "sta",        F3(3, 0x34, 0), F3(~3, ~0x34, ~0),              "g,[1+2]A", 0, v9 },
64576cad711SPaolo Bonzini { "sta",        F3(3, 0x34, 0), F3(~3, ~0x34, ~0)|RS2(~0),      "g,[1]A", 0, v9 }, /* sta d,[rs1+%g0] */
64676cad711SPaolo Bonzini { "sta",        F3(3, 0x34, 1), F3(~3, ~0x34, ~1),              "g,[1+i]o", 0, v9 },
64776cad711SPaolo Bonzini { "sta",        F3(3, 0x34, 1), F3(~3, ~0x34, ~1),              "g,[i+1]o", 0, v9 },
64876cad711SPaolo Bonzini { "sta",        F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|RS1_G0,       "g,[i]o", 0, v9 },
64976cad711SPaolo Bonzini { "sta",        F3(3, 0x34, 1), F3(~3, ~0x34, ~1)|SIMM13(~0),   "g,[1]o", 0, v9 }, /* st d,[rs1+0] */
65076cad711SPaolo Bonzini 
65176cad711SPaolo Bonzini { "stwa",       F3(3, 0x14, 0), F3(~3, ~0x14, ~0),              "d,[1+2]A", F_ALIAS, v9 },
65276cad711SPaolo Bonzini { "stwa",       F3(3, 0x14, 0), F3(~3, ~0x14, ~0)|RS2(~0),      "d,[1]A", F_ALIAS, v9 }, /* sta d,[rs1+%g0] */
65376cad711SPaolo Bonzini { "stwa",       F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[1+i]o", F_ALIAS, v9 },
65476cad711SPaolo Bonzini { "stwa",       F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[i+1]o", F_ALIAS, v9 },
65576cad711SPaolo Bonzini { "stwa",       F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|RS1_G0,       "d,[i]o", F_ALIAS, v9 },
65676cad711SPaolo Bonzini { "stwa",       F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|SIMM13(~0),   "d,[1]o", F_ALIAS, v9 }, /* st d,[rs1+0] */
65776cad711SPaolo Bonzini { "stswa",      F3(3, 0x14, 0), F3(~3, ~0x14, ~0),              "d,[1+2]A", F_ALIAS, v9 },
65876cad711SPaolo Bonzini { "stswa",      F3(3, 0x14, 0), F3(~3, ~0x14, ~0)|RS2(~0),      "d,[1]A", F_ALIAS, v9 }, /* sta d,[rs1+%g0] */
65976cad711SPaolo Bonzini { "stswa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[1+i]o", F_ALIAS, v9 },
66076cad711SPaolo Bonzini { "stswa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[i+1]o", F_ALIAS, v9 },
66176cad711SPaolo Bonzini { "stswa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|RS1_G0,       "d,[i]o", F_ALIAS, v9 },
66276cad711SPaolo Bonzini { "stswa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|SIMM13(~0),   "d,[1]o", F_ALIAS, v9 }, /* st d,[rs1+0] */
66376cad711SPaolo Bonzini { "stuwa",      F3(3, 0x14, 0), F3(~3, ~0x14, ~0),              "d,[1+2]A", F_ALIAS, v9 },
66476cad711SPaolo Bonzini { "stuwa",      F3(3, 0x14, 0), F3(~3, ~0x14, ~0)|RS2(~0),      "d,[1]A", F_ALIAS, v9 }, /* sta d,[rs1+%g0] */
66576cad711SPaolo Bonzini { "stuwa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[1+i]o", F_ALIAS, v9 },
66676cad711SPaolo Bonzini { "stuwa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1),              "d,[i+1]o", F_ALIAS, v9 },
66776cad711SPaolo Bonzini { "stuwa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|RS1_G0,       "d,[i]o", F_ALIAS, v9 },
66876cad711SPaolo Bonzini { "stuwa",      F3(3, 0x14, 1), F3(~3, ~0x14, ~1)|SIMM13(~0),   "d,[1]o", F_ALIAS, v9 }, /* st d,[rs1+0] */
66976cad711SPaolo Bonzini 
67076cad711SPaolo Bonzini { "stb",        F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI(~0),      "d,[1+2]", 0, v6 },
67176cad711SPaolo Bonzini { "stb",        F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI_RS2(~0),  "d,[1]", 0, v6 }, /* stb d,[rs1+%g0] */
67276cad711SPaolo Bonzini { "stb",        F3(3, 0x05, 1), F3(~3, ~0x05, ~1),              "d,[1+i]", 0, v6 },
67376cad711SPaolo Bonzini { "stb",        F3(3, 0x05, 1), F3(~3, ~0x05, ~1),              "d,[i+1]", 0, v6 },
67476cad711SPaolo Bonzini { "stb",        F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RS1_G0,       "d,[i]", 0, v6 },
67576cad711SPaolo Bonzini { "stb",        F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|SIMM13(~0),   "d,[1]", 0, v6 }, /* stb d,[rs1+0] */
67676cad711SPaolo Bonzini 
67776cad711SPaolo Bonzini { "stsb",       F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v6 },
67876cad711SPaolo Bonzini { "stsb",       F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v6 }, /* stb d,[rs1+%g0] */
67976cad711SPaolo Bonzini { "stsb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1),              "d,[1+i]", F_ALIAS, v6 },
68076cad711SPaolo Bonzini { "stsb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1),              "d,[i+1]", F_ALIAS, v6 },
68176cad711SPaolo Bonzini { "stsb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v6 },
68276cad711SPaolo Bonzini { "stsb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v6 }, /* stb d,[rs1+0] */
68376cad711SPaolo Bonzini { "stub",       F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v6 },
68476cad711SPaolo Bonzini { "stub",       F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v6 }, /* stb d,[rs1+%g0] */
68576cad711SPaolo Bonzini { "stub",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1),              "d,[1+i]", F_ALIAS, v6 },
68676cad711SPaolo Bonzini { "stub",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1),              "d,[i+1]", F_ALIAS, v6 },
68776cad711SPaolo Bonzini { "stub",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v6 },
68876cad711SPaolo Bonzini { "stub",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v6 }, /* stb d,[rs1+0] */
68976cad711SPaolo Bonzini 
69076cad711SPaolo Bonzini { "stba",       F3(3, 0x15, 0), F3(~3, ~0x15, ~0),              "d,[1+2]A", 0, v6 },
69176cad711SPaolo Bonzini { "stba",       F3(3, 0x15, 0), F3(~3, ~0x15, ~0)|RS2(~0),      "d,[1]A", 0, v6 }, /* stba d,[rs1+%g0] */
69276cad711SPaolo Bonzini { "stba",       F3(3, 0x15, 1), F3(~3, ~0x15, ~1),              "d,[1+i]o", 0, v9 },
69376cad711SPaolo Bonzini { "stba",       F3(3, 0x15, 1), F3(~3, ~0x15, ~1),              "d,[i+1]o", 0, v9 },
69476cad711SPaolo Bonzini { "stba",       F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|RS1_G0,       "d,[i]o", 0, v9 },
69576cad711SPaolo Bonzini { "stba",       F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|SIMM13(~0),   "d,[1]o", 0, v9 }, /* stb d,[rs1+0] */
69676cad711SPaolo Bonzini 
69776cad711SPaolo Bonzini { "stsba",      F3(3, 0x15, 0), F3(~3, ~0x15, ~0),              "d,[1+2]A", F_ALIAS, v6 },
69876cad711SPaolo Bonzini { "stsba",      F3(3, 0x15, 0), F3(~3, ~0x15, ~0)|RS2(~0),      "d,[1]A", F_ALIAS, v6 }, /* stba d,[rs1+%g0] */
69976cad711SPaolo Bonzini { "stsba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1),              "d,[1+i]o", F_ALIAS, v9 },
70076cad711SPaolo Bonzini { "stsba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1),              "d,[i+1]o", F_ALIAS, v9 },
70176cad711SPaolo Bonzini { "stsba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|RS1_G0,       "d,[i]o", F_ALIAS, v9 },
70276cad711SPaolo Bonzini { "stsba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|SIMM13(~0),   "d,[1]o", F_ALIAS, v9 }, /* stb d,[rs1+0] */
70376cad711SPaolo Bonzini { "stuba",      F3(3, 0x15, 0), F3(~3, ~0x15, ~0),              "d,[1+2]A", F_ALIAS, v6 },
70476cad711SPaolo Bonzini { "stuba",      F3(3, 0x15, 0), F3(~3, ~0x15, ~0)|RS2(~0),      "d,[1]A", F_ALIAS, v6 }, /* stba d,[rs1+%g0] */
70576cad711SPaolo Bonzini { "stuba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1),              "d,[1+i]o", F_ALIAS, v9 },
70676cad711SPaolo Bonzini { "stuba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1),              "d,[i+1]o", F_ALIAS, v9 },
70776cad711SPaolo Bonzini { "stuba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|RS1_G0,       "d,[i]o", F_ALIAS, v9 },
70876cad711SPaolo Bonzini { "stuba",      F3(3, 0x15, 1), F3(~3, ~0x15, ~1)|SIMM13(~0),   "d,[1]o", F_ALIAS, v9 }, /* stb d,[rs1+0] */
70976cad711SPaolo Bonzini 
71076cad711SPaolo Bonzini { "std",        F3(3, 0x07, 0), F3(~3, ~0x07, ~0)|ASI(~0),      "d,[1+2]", 0, v6 },
71176cad711SPaolo Bonzini { "std",        F3(3, 0x07, 0), F3(~3, ~0x07, ~0)|ASI_RS2(~0),  "d,[1]", 0, v6 }, /* std d,[rs1+%g0] */
71276cad711SPaolo Bonzini { "std",        F3(3, 0x07, 1), F3(~3, ~0x07, ~1),              "d,[1+i]", 0, v6 },
71376cad711SPaolo Bonzini { "std",        F3(3, 0x07, 1), F3(~3, ~0x07, ~1),              "d,[i+1]", 0, v6 },
71476cad711SPaolo Bonzini { "std",        F3(3, 0x07, 1), F3(~3, ~0x07, ~1)|RS1_G0,       "d,[i]", 0, v6 },
71576cad711SPaolo Bonzini { "std",        F3(3, 0x07, 1), F3(~3, ~0x07, ~1)|SIMM13(~0),   "d,[1]", 0, v6 }, /* std d,[rs1+0] */
71676cad711SPaolo Bonzini 
71776cad711SPaolo Bonzini { "std",        F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI(~0),      "q,[1+2]", 0, v6notv9 },
71876cad711SPaolo Bonzini { "std",        F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI_RS2(~0),  "q,[1]", 0, v6notv9 }, /* std d,[rs1+%g0] */
71976cad711SPaolo Bonzini { "std",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1),              "q,[1+i]", 0, v6notv9 },
72076cad711SPaolo Bonzini { "std",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1),              "q,[i+1]", 0, v6notv9 },
72176cad711SPaolo Bonzini { "std",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|RS1_G0,       "q,[i]", 0, v6notv9 },
72276cad711SPaolo Bonzini { "std",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|SIMM13(~0),   "q,[1]", 0, v6notv9 }, /* std d,[rs1+0] */
72376cad711SPaolo Bonzini { "std",        F3(3, 0x27, 0), F3(~3, ~0x27, ~0)|ASI(~0),      "H,[1+2]", 0, v6 },
72476cad711SPaolo Bonzini { "std",        F3(3, 0x27, 0), F3(~3, ~0x27, ~0)|ASI_RS2(~0),  "H,[1]", 0, v6 }, /* std d,[rs1+%g0] */
72576cad711SPaolo Bonzini { "std",        F3(3, 0x27, 1), F3(~3, ~0x27, ~1),              "H,[1+i]", 0, v6 },
72676cad711SPaolo Bonzini { "std",        F3(3, 0x27, 1), F3(~3, ~0x27, ~1),              "H,[i+1]", 0, v6 },
72776cad711SPaolo Bonzini { "std",        F3(3, 0x27, 1), F3(~3, ~0x27, ~1)|RS1_G0,       "H,[i]", 0, v6 },
72876cad711SPaolo Bonzini { "std",        F3(3, 0x27, 1), F3(~3, ~0x27, ~1)|SIMM13(~0),   "H,[1]", 0, v6 }, /* std d,[rs1+0] */
72976cad711SPaolo Bonzini 
73076cad711SPaolo Bonzini { "std",        F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI(~0),      "Q,[1+2]", 0, v6notv9 },
73176cad711SPaolo Bonzini { "std",        F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI_RS2(~0),  "Q,[1]", 0, v6notv9 }, /* std d,[rs1+%g0] */
73276cad711SPaolo Bonzini { "std",        F3(3, 0x36, 1), F3(~3, ~0x36, ~1),              "Q,[1+i]", 0, v6notv9 },
73376cad711SPaolo Bonzini { "std",        F3(3, 0x36, 1), F3(~3, ~0x36, ~1),              "Q,[i+1]", 0, v6notv9 },
73476cad711SPaolo Bonzini { "std",        F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|RS1_G0,       "Q,[i]", 0, v6notv9 },
73576cad711SPaolo Bonzini { "std",        F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|SIMM13(~0),   "Q,[1]", 0, v6notv9 }, /* std d,[rs1+0] */
73676cad711SPaolo Bonzini { "std",        F3(3, 0x37, 0), F3(~3, ~0x37, ~0)|ASI(~0),      "D,[1+2]", 0, v6notv9 },
73776cad711SPaolo Bonzini { "std",        F3(3, 0x37, 0), F3(~3, ~0x37, ~0)|ASI_RS2(~0),  "D,[1]", 0, v6notv9 }, /* std d,[rs1+%g0] */
73876cad711SPaolo Bonzini { "std",        F3(3, 0x37, 1), F3(~3, ~0x37, ~1),              "D,[1+i]", 0, v6notv9 },
73976cad711SPaolo Bonzini { "std",        F3(3, 0x37, 1), F3(~3, ~0x37, ~1),              "D,[i+1]", 0, v6notv9 },
74076cad711SPaolo Bonzini { "std",        F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|RS1_G0,       "D,[i]", 0, v6notv9 },
74176cad711SPaolo Bonzini { "std",        F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|SIMM13(~0),   "D,[1]", 0, v6notv9 }, /* std d,[rs1+0] */
74276cad711SPaolo Bonzini 
74376cad711SPaolo Bonzini { "spilld",     F3(3, 0x07, 0), F3(~3, ~0x07, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v6 },
74476cad711SPaolo Bonzini { "spilld",     F3(3, 0x07, 0), F3(~3, ~0x07, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v6 }, /* std d,[rs1+%g0] */
74576cad711SPaolo Bonzini { "spilld",     F3(3, 0x07, 1), F3(~3, ~0x07, ~1),              "d,[1+i]", F_ALIAS, v6 },
74676cad711SPaolo Bonzini { "spilld",     F3(3, 0x07, 1), F3(~3, ~0x07, ~1),              "d,[i+1]", F_ALIAS, v6 },
74776cad711SPaolo Bonzini { "spilld",     F3(3, 0x07, 1), F3(~3, ~0x07, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v6 },
74876cad711SPaolo Bonzini { "spilld",     F3(3, 0x07, 1), F3(~3, ~0x07, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v6 }, /* std d,[rs1+0] */
74976cad711SPaolo Bonzini 
75076cad711SPaolo Bonzini { "stda",       F3(3, 0x17, 0), F3(~3, ~0x17, ~0),              "d,[1+2]A", 0, v6 },
75176cad711SPaolo Bonzini { "stda",       F3(3, 0x17, 0), F3(~3, ~0x17, ~0)|RS2(~0),      "d,[1]A", 0, v6 }, /* stda d,[rs1+%g0] */
75276cad711SPaolo Bonzini { "stda",       F3(3, 0x17, 1), F3(~3, ~0x17, ~1),              "d,[1+i]o", 0, v9 },
75376cad711SPaolo Bonzini { "stda",       F3(3, 0x17, 1), F3(~3, ~0x17, ~1),              "d,[i+1]o", 0, v9 },
75476cad711SPaolo Bonzini { "stda",       F3(3, 0x17, 1), F3(~3, ~0x17, ~1)|RS1_G0,       "d,[i]o", 0, v9 },
75576cad711SPaolo Bonzini { "stda",       F3(3, 0x17, 1), F3(~3, ~0x17, ~1)|SIMM13(~0),   "d,[1]o", 0, v9 }, /* std d,[rs1+0] */
75676cad711SPaolo Bonzini { "stda",       F3(3, 0x37, 0), F3(~3, ~0x37, ~0),              "H,[1+2]A", 0, v9 },
75776cad711SPaolo Bonzini { "stda",       F3(3, 0x37, 0), F3(~3, ~0x37, ~0)|RS2(~0),      "H,[1]A", 0, v9 }, /* stda d,[rs1+%g0] */
75876cad711SPaolo Bonzini { "stda",       F3(3, 0x37, 1), F3(~3, ~0x37, ~1),              "H,[1+i]o", 0, v9 },
75976cad711SPaolo Bonzini { "stda",       F3(3, 0x37, 1), F3(~3, ~0x37, ~1),              "H,[i+1]o", 0, v9 },
76076cad711SPaolo Bonzini { "stda",       F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|RS1_G0,       "H,[i]o", 0, v9 },
76176cad711SPaolo Bonzini { "stda",       F3(3, 0x37, 1), F3(~3, ~0x37, ~1)|SIMM13(~0),   "H,[1]o", 0, v9 }, /* std d,[rs1+0] */
76276cad711SPaolo Bonzini 
76376cad711SPaolo Bonzini { "sth",        F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI(~0),      "d,[1+2]", 0, v6 },
76476cad711SPaolo Bonzini { "sth",        F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI_RS2(~0),  "d,[1]", 0, v6 }, /* sth d,[rs1+%g0] */
76576cad711SPaolo Bonzini { "sth",        F3(3, 0x06, 1), F3(~3, ~0x06, ~1),              "d,[1+i]", 0, v6 },
76676cad711SPaolo Bonzini { "sth",        F3(3, 0x06, 1), F3(~3, ~0x06, ~1),              "d,[i+1]", 0, v6 },
76776cad711SPaolo Bonzini { "sth",        F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RS1_G0,       "d,[i]", 0, v6 },
76876cad711SPaolo Bonzini { "sth",        F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|SIMM13(~0),   "d,[1]", 0, v6 }, /* sth d,[rs1+0] */
76976cad711SPaolo Bonzini 
77076cad711SPaolo Bonzini { "stsh",       F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v6 },
77176cad711SPaolo Bonzini { "stsh",       F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v6 }, /* sth d,[rs1+%g0] */
77276cad711SPaolo Bonzini { "stsh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1),              "d,[1+i]", F_ALIAS, v6 },
77376cad711SPaolo Bonzini { "stsh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1),              "d,[i+1]", F_ALIAS, v6 },
77476cad711SPaolo Bonzini { "stsh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v6 },
77576cad711SPaolo Bonzini { "stsh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v6 }, /* sth d,[rs1+0] */
77676cad711SPaolo Bonzini { "stuh",       F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI(~0),      "d,[1+2]", F_ALIAS, v6 },
77776cad711SPaolo Bonzini { "stuh",       F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|ASI_RS2(~0),  "d,[1]", F_ALIAS, v6 }, /* sth d,[rs1+%g0] */
77876cad711SPaolo Bonzini { "stuh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1),              "d,[1+i]", F_ALIAS, v6 },
77976cad711SPaolo Bonzini { "stuh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1),              "d,[i+1]", F_ALIAS, v6 },
78076cad711SPaolo Bonzini { "stuh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RS1_G0,       "d,[i]", F_ALIAS, v6 },
78176cad711SPaolo Bonzini { "stuh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|SIMM13(~0),   "d,[1]", F_ALIAS, v6 }, /* sth d,[rs1+0] */
78276cad711SPaolo Bonzini 
78376cad711SPaolo Bonzini { "stha",       F3(3, 0x16, 0), F3(~3, ~0x16, ~0),              "d,[1+2]A", 0, v6 },
78476cad711SPaolo Bonzini { "stha",       F3(3, 0x16, 0), F3(~3, ~0x16, ~0)|RS2(~0),      "d,[1]A", 0, v6 }, /* stha ,[rs1+%g0] */
78576cad711SPaolo Bonzini { "stha",       F3(3, 0x16, 1), F3(~3, ~0x16, ~1),              "d,[1+i]o", 0, v9 },
78676cad711SPaolo Bonzini { "stha",       F3(3, 0x16, 1), F3(~3, ~0x16, ~1),              "d,[i+1]o", 0, v9 },
78776cad711SPaolo Bonzini { "stha",       F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|RS1_G0,       "d,[i]o", 0, v9 },
78876cad711SPaolo Bonzini { "stha",       F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|SIMM13(~0),   "d,[1]o", 0, v9 }, /* sth d,[rs1+0] */
78976cad711SPaolo Bonzini 
79076cad711SPaolo Bonzini { "stsha",      F3(3, 0x16, 0), F3(~3, ~0x16, ~0),              "d,[1+2]A", F_ALIAS, v6 },
79176cad711SPaolo Bonzini { "stsha",      F3(3, 0x16, 0), F3(~3, ~0x16, ~0)|RS2(~0),      "d,[1]A", F_ALIAS, v6 }, /* stha ,[rs1+%g0] */
79276cad711SPaolo Bonzini { "stsha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1),              "d,[1+i]o", F_ALIAS, v9 },
79376cad711SPaolo Bonzini { "stsha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1),              "d,[i+1]o", F_ALIAS, v9 },
79476cad711SPaolo Bonzini { "stsha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|RS1_G0,       "d,[i]o", F_ALIAS, v9 },
79576cad711SPaolo Bonzini { "stsha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|SIMM13(~0),   "d,[1]o", F_ALIAS, v9 }, /* sth d,[rs1+0] */
79676cad711SPaolo Bonzini { "stuha",      F3(3, 0x16, 0), F3(~3, ~0x16, ~0),              "d,[1+2]A", F_ALIAS, v6 },
79776cad711SPaolo Bonzini { "stuha",      F3(3, 0x16, 0), F3(~3, ~0x16, ~0)|RS2(~0),      "d,[1]A", F_ALIAS, v6 }, /* stha ,[rs1+%g0] */
79876cad711SPaolo Bonzini { "stuha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1),              "d,[1+i]o", F_ALIAS, v9 },
79976cad711SPaolo Bonzini { "stuha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1),              "d,[i+1]o", F_ALIAS, v9 },
80076cad711SPaolo Bonzini { "stuha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|RS1_G0,       "d,[i]o", F_ALIAS, v9 },
80176cad711SPaolo Bonzini { "stuha",      F3(3, 0x16, 1), F3(~3, ~0x16, ~1)|SIMM13(~0),   "d,[1]o", F_ALIAS, v9 }, /* sth d,[rs1+0] */
80276cad711SPaolo Bonzini 
80376cad711SPaolo Bonzini { "stx",        F3(3, 0x0e, 0), F3(~3, ~0x0e, ~0)|ASI(~0),      "d,[1+2]", 0, v9 },
80476cad711SPaolo Bonzini { "stx",        F3(3, 0x0e, 0), F3(~3, ~0x0e, ~0)|ASI_RS2(~0),  "d,[1]", 0, v9 }, /* stx d,[rs1+%g0] */
80576cad711SPaolo Bonzini { "stx",        F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1),              "d,[1+i]", 0, v9 },
80676cad711SPaolo Bonzini { "stx",        F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1),              "d,[i+1]", 0, v9 },
80776cad711SPaolo Bonzini { "stx",        F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RS1_G0,       "d,[i]", 0, v9 },
80876cad711SPaolo Bonzini { "stx",        F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|SIMM13(~0),   "d,[1]", 0, v9 }, /* stx d,[rs1+0] */
80976cad711SPaolo Bonzini 
81076cad711SPaolo Bonzini { "stx",        F3(3, 0x25, 0)|RD(1), F3(~3, ~0x25, ~0)|ASI(~0)|RD(~1), "F,[1+2]", 0, v9 },
81176cad711SPaolo Bonzini { "stx",        F3(3, 0x25, 0)|RD(1), F3(~3, ~0x25, ~0)|ASI_RS2(~0)|RD(~1),"F,[1]", 0, v9 }, /* stx d,[rs1+%g0] */
81276cad711SPaolo Bonzini { "stx",        F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|RD(~1),         "F,[1+i]", 0, v9 },
81376cad711SPaolo Bonzini { "stx",        F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|RD(~1),         "F,[i+1]", 0, v9 },
81476cad711SPaolo Bonzini { "stx",        F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|RS1_G0|RD(~1),  "F,[i]", 0, v9 },
81576cad711SPaolo Bonzini { "stx",        F3(3, 0x25, 1)|RD(1), F3(~3, ~0x25, ~1)|SIMM13(~0)|RD(~1),"F,[1]", 0, v9 }, /* stx d,[rs1+0] */
81676cad711SPaolo Bonzini 
81776cad711SPaolo Bonzini { "stxa",       F3(3, 0x1e, 0), F3(~3, ~0x1e, ~0),              "d,[1+2]A", 0, v9 },
81876cad711SPaolo Bonzini { "stxa",       F3(3, 0x1e, 0), F3(~3, ~0x1e, ~0)|RS2(~0),      "d,[1]A", 0, v9 }, /* stxa d,[rs1+%g0] */
81976cad711SPaolo Bonzini { "stxa",       F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1),              "d,[1+i]o", 0, v9 },
82076cad711SPaolo Bonzini { "stxa",       F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1),              "d,[i+1]o", 0, v9 },
82176cad711SPaolo Bonzini { "stxa",       F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1)|RS1_G0,       "d,[i]o", 0, v9 },
82276cad711SPaolo Bonzini { "stxa",       F3(3, 0x1e, 1), F3(~3, ~0x1e, ~1)|SIMM13(~0),   "d,[1]o", 0, v9 }, /* stx d,[rs1+0] */
82376cad711SPaolo Bonzini 
82476cad711SPaolo Bonzini { "stq",        F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI(~0),      "J,[1+2]", 0, v9 },
82576cad711SPaolo Bonzini { "stq",        F3(3, 0x26, 0), F3(~3, ~0x26, ~0)|ASI_RS2(~0),  "J,[1]", 0, v9 }, /* stq [rs1+%g0] */
82676cad711SPaolo Bonzini { "stq",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1),              "J,[1+i]", 0, v9 },
82776cad711SPaolo Bonzini { "stq",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1),              "J,[i+1]", 0, v9 },
82876cad711SPaolo Bonzini { "stq",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|RS1_G0,       "J,[i]", 0, v9 },
82976cad711SPaolo Bonzini { "stq",        F3(3, 0x26, 1), F3(~3, ~0x26, ~1)|SIMM13(~0),   "J,[1]", 0, v9 }, /* stq [rs1+0] */
83076cad711SPaolo Bonzini 
83176cad711SPaolo Bonzini { "stqa",       F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI(~0),      "J,[1+2]A", 0, v9 },
83276cad711SPaolo Bonzini { "stqa",       F3(3, 0x36, 0), F3(~3, ~0x36, ~0)|ASI_RS2(~0),  "J,[1]A", 0, v9 }, /* stqa [rs1+%g0] */
83376cad711SPaolo Bonzini { "stqa",       F3(3, 0x36, 1), F3(~3, ~0x36, ~1),              "J,[1+i]o", 0, v9 },
83476cad711SPaolo Bonzini { "stqa",       F3(3, 0x36, 1), F3(~3, ~0x36, ~1),              "J,[i+1]o", 0, v9 },
83576cad711SPaolo Bonzini { "stqa",       F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|RS1_G0,       "J,[i]o", 0, v9 },
83676cad711SPaolo Bonzini { "stqa",       F3(3, 0x36, 1), F3(~3, ~0x36, ~1)|SIMM13(~0),   "J,[1]o", 0, v9 }, /* stqa [rs1+0] */
83776cad711SPaolo Bonzini 
83876cad711SPaolo Bonzini { "swap",       F3(3, 0x0f, 0), F3(~3, ~0x0f, ~0)|ASI(~0),      "[1+2],d", 0, v7 },
83976cad711SPaolo Bonzini { "swap",       F3(3, 0x0f, 0), F3(~3, ~0x0f, ~0)|ASI_RS2(~0),  "[1],d", 0, v7 }, /* swap [rs1+%g0],d */
84076cad711SPaolo Bonzini { "swap",       F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1),              "[1+i],d", 0, v7 },
84176cad711SPaolo Bonzini { "swap",       F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1),              "[i+1],d", 0, v7 },
84276cad711SPaolo Bonzini { "swap",       F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1)|RS1_G0,       "[i],d", 0, v7 },
84376cad711SPaolo Bonzini { "swap",       F3(3, 0x0f, 1), F3(~3, ~0x0f, ~1)|SIMM13(~0),   "[1],d", 0, v7 }, /* swap [rs1+0],d */
84476cad711SPaolo Bonzini 
84576cad711SPaolo Bonzini { "swapa",      F3(3, 0x1f, 0), F3(~3, ~0x1f, ~0),              "[1+2]A,d", 0, v7 },
84676cad711SPaolo Bonzini { "swapa",      F3(3, 0x1f, 0), F3(~3, ~0x1f, ~0)|RS2(~0),      "[1]A,d", 0, v7 }, /* swapa [rs1+%g0],d */
84776cad711SPaolo Bonzini { "swapa",      F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1),              "[1+i]o,d", 0, v9 },
84876cad711SPaolo Bonzini { "swapa",      F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1),              "[i+1]o,d", 0, v9 },
84976cad711SPaolo Bonzini { "swapa",      F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1)|RS1_G0,       "[i]o,d", 0, v9 },
85076cad711SPaolo Bonzini { "swapa",      F3(3, 0x1f, 1), F3(~3, ~0x1f, ~1)|SIMM13(~0),   "[1]o,d", 0, v9 }, /* swap [rs1+0],d */
85176cad711SPaolo Bonzini 
85276cad711SPaolo Bonzini { "restore",    F3(2, 0x3d, 0), F3(~2, ~0x3d, ~0)|ASI(~0),                      "1,2,d", 0, v6 },
85376cad711SPaolo Bonzini { "restore",    F3(2, 0x3d, 0), F3(~2, ~0x3d, ~0)|RD_G0|RS1_G0|ASI_RS2(~0),     "", 0, v6 }, /* restore %g0,%g0,%g0 */
85476cad711SPaolo Bonzini { "restore",    F3(2, 0x3d, 1), F3(~2, ~0x3d, ~1),                              "1,i,d", 0, v6 },
85576cad711SPaolo Bonzini { "restore",    F3(2, 0x3d, 1), F3(~2, ~0x3d, ~1)|RD_G0|RS1_G0|SIMM13(~0),      "", 0, v6 }, /* restore %g0,0,%g0 */
85676cad711SPaolo Bonzini 
85776cad711SPaolo Bonzini { "rett",       F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|RD_G0|ASI(~0),        "1+2", F_UNBR|F_DELAYED, v6 }, /* rett rs1+rs2 */
85876cad711SPaolo Bonzini { "rett",       F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|RD_G0|ASI_RS2(~0),    "1", F_UNBR|F_DELAYED, v6 },    /* rett rs1,%g0 */
85976cad711SPaolo Bonzini { "rett",       F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0,                "1+i", F_UNBR|F_DELAYED, v6 }, /* rett rs1+X */
86076cad711SPaolo Bonzini { "rett",       F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0,                "i+1", F_UNBR|F_DELAYED, v6 }, /* rett X+rs1 */
86176cad711SPaolo Bonzini { "rett",       F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0|RS1_G0,         "i", F_UNBR|F_DELAYED, v6 }, /* rett X+rs1 */
86276cad711SPaolo Bonzini { "rett",       F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0|RS1_G0,         "i", F_UNBR|F_DELAYED, v6 },    /* rett X */
86376cad711SPaolo Bonzini { "rett",       F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RD_G0|SIMM13(~0),     "1", F_UNBR|F_DELAYED, v6 },    /* rett rs1+0 */
86476cad711SPaolo Bonzini 
86576cad711SPaolo Bonzini { "save",       F3(2, 0x3c, 0), F3(~2, ~0x3c, ~0)|ASI(~0),      "1,2,d", 0, v6 },
86676cad711SPaolo Bonzini { "save",       F3(2, 0x3c, 1), F3(~2, ~0x3c, ~1),              "1,i,d", 0, v6 },
86776cad711SPaolo Bonzini { "save",       0x81e00000,     ~0x81e00000,                    "", F_ALIAS, v6 },
86876cad711SPaolo Bonzini 
86976cad711SPaolo Bonzini { "ret",  F3(2, 0x38, 1)|RS1(0x1f)|SIMM13(8), F3(~2, ~0x38, ~1)|SIMM13(~8),            "", F_UNBR|F_DELAYED, v6 }, /* jmpl %i7+8,%g0 */
87076cad711SPaolo Bonzini { "retl", F3(2, 0x38, 1)|RS1(0x0f)|SIMM13(8), F3(~2, ~0x38, ~1)|RS1(~0x0f)|SIMM13(~8), "", F_UNBR|F_DELAYED, v6 }, /* jmpl %o7+8,%g0 */
87176cad711SPaolo Bonzini 
87276cad711SPaolo Bonzini { "jmpl",       F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|ASI(~0),      "1+2,d", F_JSR|F_DELAYED, v6 },
87376cad711SPaolo Bonzini { "jmpl",       F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|ASI_RS2(~0),  "1,d", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+%g0,d */
87476cad711SPaolo Bonzini { "jmpl",       F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|SIMM13(~0),   "1,d", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+0,d */
87576cad711SPaolo Bonzini { "jmpl",       F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RS1_G0,       "i,d", F_JSR|F_DELAYED, v6 }, /* jmpl %g0+i,d */
87676cad711SPaolo Bonzini { "jmpl",       F3(2, 0x38, 1), F3(~2, ~0x38, ~1),              "1+i,d", F_JSR|F_DELAYED, v6 },
87776cad711SPaolo Bonzini { "jmpl",       F3(2, 0x38, 1), F3(~2, ~0x38, ~1),              "i+1,d", F_JSR|F_DELAYED, v6 },
87876cad711SPaolo Bonzini 
87976cad711SPaolo Bonzini { "done",       F3(2, 0x3e, 0)|RD(0), F3(~2, ~0x3e, ~0)|RD(~0)|RS1_G0|SIMM13(~0),       "", 0, v9 },
88076cad711SPaolo Bonzini { "retry",      F3(2, 0x3e, 0)|RD(1), F3(~2, ~0x3e, ~0)|RD(~1)|RS1_G0|SIMM13(~0),       "", 0, v9 },
88176cad711SPaolo Bonzini { "saved",      F3(2, 0x31, 0)|RD(0), F3(~2, ~0x31, ~0)|RD(~0)|RS1_G0|SIMM13(~0),       "", 0, v9 },
88276cad711SPaolo Bonzini { "restored",   F3(2, 0x31, 0)|RD(1), F3(~2, ~0x31, ~0)|RD(~1)|RS1_G0|SIMM13(~0),       "", 0, v9 },
88376cad711SPaolo Bonzini { "allclean",   F3(2, 0x31, 0)|RD(2), F3(~2, ~0x31, ~0)|RD(~2)|RS1_G0|SIMM13(~0),       "", 0, v9 },
88476cad711SPaolo Bonzini { "otherw",     F3(2, 0x31, 0)|RD(3), F3(~2, ~0x31, ~0)|RD(~3)|RS1_G0|SIMM13(~0),       "", 0, v9 },
88576cad711SPaolo Bonzini { "normalw",    F3(2, 0x31, 0)|RD(4), F3(~2, ~0x31, ~0)|RD(~4)|RS1_G0|SIMM13(~0),       "", 0, v9 },
88676cad711SPaolo Bonzini { "invalw",     F3(2, 0x31, 0)|RD(5), F3(~2, ~0x31, ~0)|RD(~5)|RS1_G0|SIMM13(~0),       "", 0, v9 },
88776cad711SPaolo Bonzini { "sir",        F3(2, 0x30, 1)|RD(0xf), F3(~2, ~0x30, ~1)|RD(~0xf)|RS1_G0,              "i", 0, v9 },
88876cad711SPaolo Bonzini 
88976cad711SPaolo Bonzini { "flush",      F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI(~0),      "1+2", 0, v8 },
89076cad711SPaolo Bonzini { "flush",      F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI_RS2(~0),  "1", 0, v8 }, /* flush rs1+%g0 */
89176cad711SPaolo Bonzini { "flush",      F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|SIMM13(~0),   "1", 0, v8 }, /* flush rs1+0 */
89276cad711SPaolo Bonzini { "flush",      F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|RS1_G0,       "i", 0, v8 }, /* flush %g0+i */
89376cad711SPaolo Bonzini { "flush",      F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),              "1+i", 0, v8 },
89476cad711SPaolo Bonzini { "flush",      F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),              "i+1", 0, v8 },
89576cad711SPaolo Bonzini 
89676cad711SPaolo Bonzini /* IFLUSH was renamed to FLUSH in v8.  */
89776cad711SPaolo Bonzini { "iflush",     F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI(~0),      "1+2", F_ALIAS, v6 },
89876cad711SPaolo Bonzini { "iflush",     F3(2, 0x3b, 0), F3(~2, ~0x3b, ~0)|ASI_RS2(~0),  "1", F_ALIAS, v6 }, /* flush rs1+%g0 */
89976cad711SPaolo Bonzini { "iflush",     F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|SIMM13(~0),   "1", F_ALIAS, v6 }, /* flush rs1+0 */
90076cad711SPaolo Bonzini { "iflush",     F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1)|RS1_G0,       "i", F_ALIAS, v6 },
90176cad711SPaolo Bonzini { "iflush",     F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),              "1+i", F_ALIAS, v6 },
90276cad711SPaolo Bonzini { "iflush",     F3(2, 0x3b, 1), F3(~2, ~0x3b, ~1),              "i+1", F_ALIAS, v6 },
90376cad711SPaolo Bonzini 
90476cad711SPaolo Bonzini { "return",     F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|ASI(~0),      "1+2", 0, v9 },
90576cad711SPaolo Bonzini { "return",     F3(2, 0x39, 0), F3(~2, ~0x39, ~0)|ASI_RS2(~0),  "1", 0, v9 }, /* return rs1+%g0 */
90676cad711SPaolo Bonzini { "return",     F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|SIMM13(~0),   "1", 0, v9 }, /* return rs1+0 */
90776cad711SPaolo Bonzini { "return",     F3(2, 0x39, 1), F3(~2, ~0x39, ~1)|RS1_G0,       "i", 0, v9 }, /* return %g0+i */
90876cad711SPaolo Bonzini { "return",     F3(2, 0x39, 1), F3(~2, ~0x39, ~1),              "1+i", 0, v9 },
90976cad711SPaolo Bonzini { "return",     F3(2, 0x39, 1), F3(~2, ~0x39, ~1),              "i+1", 0, v9 },
91076cad711SPaolo Bonzini 
91176cad711SPaolo Bonzini { "flushw",     F3(2, 0x2b, 0), F3(~2, ~0x2b, ~0)|RD_G0|RS1_G0|ASI_RS2(~0),     "", 0, v9 },
91276cad711SPaolo Bonzini 
91376cad711SPaolo Bonzini { "membar",     F3(2, 0x28, 1)|RS1(0xf), F3(~2, ~0x28, ~1)|RD_G0|RS1(~0xf)|SIMM13(~127), "K", 0, v9 },
91476cad711SPaolo Bonzini { "stbar",      F3(2, 0x28, 0)|RS1(0xf), F3(~2, ~0x28, ~0)|RD_G0|RS1(~0xf)|SIMM13(~0), "", 0, v8 },
91576cad711SPaolo Bonzini 
91676cad711SPaolo Bonzini { "prefetch",   F3(3, 0x2d, 0), F3(~3, ~0x2d, ~0),              "[1+2],*", 0, v9 },
91776cad711SPaolo Bonzini { "prefetch",   F3(3, 0x2d, 0), F3(~3, ~0x2d, ~0)|RS2_G0,       "[1],*", 0, v9 }, /* prefetch [rs1+%g0],prefetch_fcn */
91876cad711SPaolo Bonzini { "prefetch",   F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1),              "[1+i],*", 0, v9 },
91976cad711SPaolo Bonzini { "prefetch",   F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1),              "[i+1],*", 0, v9 },
92076cad711SPaolo Bonzini { "prefetch",   F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1)|RS1_G0,       "[i],*", 0, v9 },
92176cad711SPaolo Bonzini { "prefetch",   F3(3, 0x2d, 1), F3(~3, ~0x2d, ~1)|SIMM13(~0),   "[1],*", 0, v9 }, /* prefetch [rs1+0],prefetch_fcn */
92276cad711SPaolo Bonzini { "prefetcha",  F3(3, 0x3d, 0), F3(~3, ~0x3d, ~0),              "[1+2]A,*", 0, v9 },
92376cad711SPaolo Bonzini { "prefetcha",  F3(3, 0x3d, 0), F3(~3, ~0x3d, ~0)|RS2_G0,       "[1]A,*", 0, v9 }, /* prefetcha [rs1+%g0],prefetch_fcn */
92476cad711SPaolo Bonzini { "prefetcha",  F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1),              "[1+i]o,*", 0, v9 },
92576cad711SPaolo Bonzini { "prefetcha",  F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1),              "[i+1]o,*", 0, v9 },
92676cad711SPaolo Bonzini { "prefetcha",  F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1)|RS1_G0,       "[i]o,*", 0, v9 },
92776cad711SPaolo Bonzini { "prefetcha",  F3(3, 0x3d, 1), F3(~3, ~0x3d, ~1)|SIMM13(~0),   "[1]o,*", 0, v9 }, /* prefetcha [rs1+0],d */
92876cad711SPaolo Bonzini 
92976cad711SPaolo Bonzini { "sll",        F3(2, 0x25, 0), F3(~2, ~0x25, ~0)|(1<<12)|(0x7f<<5),    "1,2,d", 0, v6 },
93076cad711SPaolo Bonzini { "sll",        F3(2, 0x25, 1), F3(~2, ~0x25, ~1)|(1<<12)|(0x7f<<5),    "1,X,d", 0, v6 },
93176cad711SPaolo Bonzini { "sra",        F3(2, 0x27, 0), F3(~2, ~0x27, ~0)|(1<<12)|(0x7f<<5),    "1,2,d", 0, v6 },
93276cad711SPaolo Bonzini { "sra",        F3(2, 0x27, 1), F3(~2, ~0x27, ~1)|(1<<12)|(0x7f<<5),    "1,X,d", 0, v6 },
93376cad711SPaolo Bonzini { "srl",        F3(2, 0x26, 0), F3(~2, ~0x26, ~0)|(1<<12)|(0x7f<<5),    "1,2,d", 0, v6 },
93476cad711SPaolo Bonzini { "srl",        F3(2, 0x26, 1), F3(~2, ~0x26, ~1)|(1<<12)|(0x7f<<5),    "1,X,d", 0, v6 },
93576cad711SPaolo Bonzini 
93676cad711SPaolo Bonzini { "sllx",       F3(2, 0x25, 0)|(1<<12), F3(~2, ~0x25, ~0)|(0x7f<<5),    "1,2,d", 0, v9 },
93776cad711SPaolo Bonzini { "sllx",       F3(2, 0x25, 1)|(1<<12), F3(~2, ~0x25, ~1)|(0x3f<<6),    "1,Y,d", 0, v9 },
93876cad711SPaolo Bonzini { "srax",       F3(2, 0x27, 0)|(1<<12), F3(~2, ~0x27, ~0)|(0x7f<<5),    "1,2,d", 0, v9 },
93976cad711SPaolo Bonzini { "srax",       F3(2, 0x27, 1)|(1<<12), F3(~2, ~0x27, ~1)|(0x3f<<6),    "1,Y,d", 0, v9 },
94076cad711SPaolo Bonzini { "srlx",       F3(2, 0x26, 0)|(1<<12), F3(~2, ~0x26, ~0)|(0x7f<<5),    "1,2,d", 0, v9 },
94176cad711SPaolo Bonzini { "srlx",       F3(2, 0x26, 1)|(1<<12), F3(~2, ~0x26, ~1)|(0x3f<<6),    "1,Y,d", 0, v9 },
94276cad711SPaolo Bonzini 
94376cad711SPaolo Bonzini { "mulscc",     F3(2, 0x24, 0), F3(~2, ~0x24, ~0)|ASI(~0),      "1,2,d", 0, v6 },
94476cad711SPaolo Bonzini { "mulscc",     F3(2, 0x24, 1), F3(~2, ~0x24, ~1),              "1,i,d", 0, v6 },
94576cad711SPaolo Bonzini 
94676cad711SPaolo Bonzini { "divscc",     F3(2, 0x1d, 0), F3(~2, ~0x1d, ~0)|ASI(~0),      "1,2,d", 0, sparclite },
94776cad711SPaolo Bonzini { "divscc",     F3(2, 0x1d, 1), F3(~2, ~0x1d, ~1),              "1,i,d", 0, sparclite },
94876cad711SPaolo Bonzini 
94976cad711SPaolo Bonzini { "scan",       F3(2, 0x2c, 0), F3(~2, ~0x2c, ~0)|ASI(~0),      "1,2,d", 0, sparclet|sparclite },
95076cad711SPaolo Bonzini { "scan",       F3(2, 0x2c, 1), F3(~2, ~0x2c, ~1),              "1,i,d", 0, sparclet|sparclite },
95176cad711SPaolo Bonzini 
95276cad711SPaolo Bonzini { "popc",       F3(2, 0x2e, 0), F3(~2, ~0x2e, ~0)|RS1_G0|ASI(~0),"2,d", 0, v9 },
95376cad711SPaolo Bonzini { "popc",       F3(2, 0x2e, 1), F3(~2, ~0x2e, ~1)|RS1_G0,       "i,d", 0, v9 },
95476cad711SPaolo Bonzini 
95576cad711SPaolo Bonzini { "clr",        F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|RD_G0|RS1_G0|ASI_RS2(~0),     "d", F_ALIAS, v6 }, /* or %g0,%g0,d */
95676cad711SPaolo Bonzini { "clr",        F3(2, 0x02, 1), F3(~2, ~0x02, ~1)|RS1_G0|SIMM13(~0),            "d", F_ALIAS, v6 }, /* or %g0,0,d       */
95776cad711SPaolo Bonzini { "clr",        F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|RD_G0|ASI(~0),                "[1+2]", F_ALIAS, v6 },
95876cad711SPaolo Bonzini { "clr",        F3(3, 0x04, 0), F3(~3, ~0x04, ~0)|RD_G0|ASI_RS2(~0),            "[1]", F_ALIAS, v6 }, /* st %g0,[rs1+%g0] */
95976cad711SPaolo Bonzini { "clr",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0,                        "[1+i]", F_ALIAS, v6 },
96076cad711SPaolo Bonzini { "clr",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0,                        "[i+1]", F_ALIAS, v6 },
96176cad711SPaolo Bonzini { "clr",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0|RS1_G0,                 "[i]", F_ALIAS, v6 },
96276cad711SPaolo Bonzini { "clr",        F3(3, 0x04, 1), F3(~3, ~0x04, ~1)|RD_G0|SIMM13(~0),             "[1]", F_ALIAS, v6 }, /* st %g0,[rs1+0] */
96376cad711SPaolo Bonzini 
96476cad711SPaolo Bonzini { "clrb",       F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|RD_G0|ASI(~0),        "[1+2]", F_ALIAS, v6 },
96576cad711SPaolo Bonzini { "clrb",       F3(3, 0x05, 0), F3(~3, ~0x05, ~0)|RD_G0|ASI_RS2(~0),    "[1]", F_ALIAS, v6 }, /* stb %g0,[rs1+%g0] */
96676cad711SPaolo Bonzini { "clrb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0,                "[1+i]", F_ALIAS, v6 },
96776cad711SPaolo Bonzini { "clrb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0,                "[i+1]", F_ALIAS, v6 },
96876cad711SPaolo Bonzini { "clrb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0|RS1_G0,         "[i]", F_ALIAS, v6 },
96976cad711SPaolo Bonzini { "clrb",       F3(3, 0x05, 1), F3(~3, ~0x05, ~1)|RD_G0|SIMM13(~0),     "[1]", F_ALIAS, v6 }, /* stb %g0,[rs1+0] */
97076cad711SPaolo Bonzini 
97176cad711SPaolo Bonzini { "clrh",       F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|RD_G0|ASI(~0),        "[1+2]", F_ALIAS, v6 },
97276cad711SPaolo Bonzini { "clrh",       F3(3, 0x06, 0), F3(~3, ~0x06, ~0)|RD_G0|ASI_RS2(~0),    "[1]", F_ALIAS, v6 }, /* sth %g0,[rs1+%g0] */
97376cad711SPaolo Bonzini { "clrh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0,                "[1+i]", F_ALIAS, v6 },
97476cad711SPaolo Bonzini { "clrh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0,                "[i+1]", F_ALIAS, v6 },
97576cad711SPaolo Bonzini { "clrh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0|RS1_G0,         "[i]", F_ALIAS, v6 },
97676cad711SPaolo Bonzini { "clrh",       F3(3, 0x06, 1), F3(~3, ~0x06, ~1)|RD_G0|SIMM13(~0),     "[1]", F_ALIAS, v6 }, /* sth %g0,[rs1+0] */
97776cad711SPaolo Bonzini 
97876cad711SPaolo Bonzini { "clrx",       F3(3, 0x0e, 0), F3(~3, ~0x0e, ~0)|RD_G0|ASI(~0),        "[1+2]", F_ALIAS, v9 },
97976cad711SPaolo Bonzini { "clrx",       F3(3, 0x0e, 0), F3(~3, ~0x0e, ~0)|RD_G0|ASI_RS2(~0),    "[1]", F_ALIAS, v9 }, /* stx %g0,[rs1+%g0] */
98076cad711SPaolo Bonzini { "clrx",       F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RD_G0,                "[1+i]", F_ALIAS, v9 },
98176cad711SPaolo Bonzini { "clrx",       F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RD_G0,                "[i+1]", F_ALIAS, v9 },
98276cad711SPaolo Bonzini { "clrx",       F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RD_G0|RS1_G0,         "[i]", F_ALIAS, v9 },
98376cad711SPaolo Bonzini { "clrx",       F3(3, 0x0e, 1), F3(~3, ~0x0e, ~1)|RD_G0|SIMM13(~0),     "[1]", F_ALIAS, v9 }, /* stx %g0,[rs1+0] */
98476cad711SPaolo Bonzini 
98576cad711SPaolo Bonzini { "orcc",       F3(2, 0x12, 0), F3(~2, ~0x12, ~0)|ASI(~0),      "1,2,d", 0, v6 },
98676cad711SPaolo Bonzini { "orcc",       F3(2, 0x12, 1), F3(~2, ~0x12, ~1),              "1,i,d", 0, v6 },
98776cad711SPaolo Bonzini { "orcc",       F3(2, 0x12, 1), F3(~2, ~0x12, ~1),              "i,1,d", 0, v6 },
98876cad711SPaolo Bonzini 
98976cad711SPaolo Bonzini /* This is not a commutative instruction.  */
99076cad711SPaolo Bonzini { "orncc",      F3(2, 0x16, 0), F3(~2, ~0x16, ~0)|ASI(~0),      "1,2,d", 0, v6 },
99176cad711SPaolo Bonzini { "orncc",      F3(2, 0x16, 1), F3(~2, ~0x16, ~1),              "1,i,d", 0, v6 },
99276cad711SPaolo Bonzini 
99376cad711SPaolo Bonzini /* This is not a commutative instruction.  */
99476cad711SPaolo Bonzini { "orn",        F3(2, 0x06, 0), F3(~2, ~0x06, ~0)|ASI(~0),      "1,2,d", 0, v6 },
99576cad711SPaolo Bonzini { "orn",        F3(2, 0x06, 1), F3(~2, ~0x06, ~1),              "1,i,d", 0, v6 },
99676cad711SPaolo Bonzini 
99776cad711SPaolo Bonzini { "tst",        F3(2, 0x12, 0), F3(~2, ~0x12, ~0)|RD_G0|ASI_RS2(~0),    "1", 0, v6 }, /* orcc rs1, %g0, %g0 */
99876cad711SPaolo Bonzini { "tst",        F3(2, 0x12, 0), F3(~2, ~0x12, ~0)|RD_G0|RS1_G0|ASI(~0), "2", 0, v6 }, /* orcc %g0, rs2, %g0 */
99976cad711SPaolo Bonzini { "tst",        F3(2, 0x12, 1), F3(~2, ~0x12, ~1)|RD_G0|SIMM13(~0),     "1", 0, v6 }, /* orcc rs1, 0, %g0 */
100076cad711SPaolo Bonzini 
100176cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0),         F3(~2, ~0x30, ~0)|ASI(~0),              "1,2,m", 0, v8 }, /* wr r,r,%asrX */
100276cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1),         F3(~2, ~0x30, ~1),                      "1,i,m", 0, v8 }, /* wr r,i,%asrX */
100376cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0),         F3(~2, ~0x30, ~0)|ASI_RS2(~0),          "1,m", F_ALIAS, v8 }, /* wr rs1,%g0,%asrX */
100476cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0),         F3(~2, ~0x30, ~0)|RD_G0|ASI(~0),        "1,2,y", 0, v6 }, /* wr r,r,%y */
100576cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1),         F3(~2, ~0x30, ~1)|RD_G0,                "1,i,y", 0, v6 }, /* wr r,i,%y */
100676cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0),         F3(~2, ~0x30, ~0)|RD_G0|ASI_RS2(~0),    "1,y", F_ALIAS, v6 }, /* wr rs1,%g0,%y */
100776cad711SPaolo Bonzini { "wr", F3(2, 0x31, 0),         F3(~2, ~0x31, ~0)|RD_G0|ASI(~0),        "1,2,p", 0, v6notv9 }, /* wr r,r,%psr */
100876cad711SPaolo Bonzini { "wr", F3(2, 0x31, 1),         F3(~2, ~0x31, ~1)|RD_G0,                "1,i,p", 0, v6notv9 }, /* wr r,i,%psr */
100976cad711SPaolo Bonzini { "wr", F3(2, 0x31, 0),         F3(~2, ~0x31, ~0)|RD_G0|ASI_RS2(~0),    "1,p", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%psr */
101076cad711SPaolo Bonzini { "wr", F3(2, 0x32, 0),         F3(~2, ~0x32, ~0)|RD_G0|ASI(~0),        "1,2,w", 0, v6notv9 }, /* wr r,r,%wim */
101176cad711SPaolo Bonzini { "wr", F3(2, 0x32, 1),         F3(~2, ~0x32, ~1)|RD_G0,                "1,i,w", 0, v6notv9 }, /* wr r,i,%wim */
101276cad711SPaolo Bonzini { "wr", F3(2, 0x32, 0),         F3(~2, ~0x32, ~0)|RD_G0|ASI_RS2(~0),    "1,w", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%wim */
101376cad711SPaolo Bonzini { "wr", F3(2, 0x33, 0),         F3(~2, ~0x33, ~0)|RD_G0|ASI(~0),        "1,2,t", 0, v6notv9 }, /* wr r,r,%tbr */
101476cad711SPaolo Bonzini { "wr", F3(2, 0x33, 1),         F3(~2, ~0x33, ~1)|RD_G0,                "1,i,t", 0, v6notv9 }, /* wr r,i,%tbr */
101576cad711SPaolo Bonzini { "wr", F3(2, 0x33, 0),         F3(~2, ~0x33, ~0)|RD_G0|ASI_RS2(~0),    "1,t", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%tbr */
101676cad711SPaolo Bonzini 
101776cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0)|RD(2),   F3(~2, ~0x30, ~0)|RD(~2)|ASI(~0),       "1,2,E", 0, v9 }, /* wr r,r,%ccr */
101876cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1)|RD(2),   F3(~2, ~0x30, ~1)|RD(~2),               "1,i,E", 0, v9 }, /* wr r,i,%ccr */
101976cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0)|RD(3),   F3(~2, ~0x30, ~0)|RD(~3)|ASI(~0),       "1,2,o", 0, v9 }, /* wr r,r,%asi */
102076cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1)|RD(3),   F3(~2, ~0x30, ~1)|RD(~3),               "1,i,o", 0, v9 }, /* wr r,i,%asi */
102176cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0)|RD(6),   F3(~2, ~0x30, ~0)|RD(~6)|ASI(~0),       "1,2,s", 0, v9 }, /* wr r,r,%fprs */
102276cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1)|RD(6),   F3(~2, ~0x30, ~1)|RD(~6),               "1,i,s", 0, v9 }, /* wr r,i,%fprs */
102376cad711SPaolo Bonzini 
102476cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0)|RD(16),  F3(~2, ~0x30, ~0)|RD(~16)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%pcr */
102576cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1)|RD(16),  F3(~2, ~0x30, ~1)|RD(~16),              "1,i,_", 0, v9a }, /* wr r,i,%pcr */
102676cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0)|RD(17),  F3(~2, ~0x30, ~0)|RD(~17)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%pic */
102776cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1)|RD(17),  F3(~2, ~0x30, ~1)|RD(~17),              "1,i,_", 0, v9a }, /* wr r,i,%pic */
102876cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0)|RD(18),  F3(~2, ~0x30, ~0)|RD(~18)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%dcr */
102976cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1)|RD(18),  F3(~2, ~0x30, ~1)|RD(~18),              "1,i,_", 0, v9a }, /* wr r,i,%dcr */
103076cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0)|RD(19),  F3(~2, ~0x30, ~0)|RD(~19)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%gsr */
103176cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1)|RD(19),  F3(~2, ~0x30, ~1)|RD(~19),              "1,i,_", 0, v9a }, /* wr r,i,%gsr */
103276cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0)|RD(20),  F3(~2, ~0x30, ~0)|RD(~20)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%set_softint */
103376cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1)|RD(20),  F3(~2, ~0x30, ~1)|RD(~20),              "1,i,_", 0, v9a }, /* wr r,i,%set_softint */
103476cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0)|RD(21),  F3(~2, ~0x30, ~0)|RD(~21)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%clear_softint */
103576cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1)|RD(21),  F3(~2, ~0x30, ~1)|RD(~21),              "1,i,_", 0, v9a }, /* wr r,i,%clear_softint */
103676cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0)|RD(22),  F3(~2, ~0x30, ~0)|RD(~22)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%softint */
103776cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1)|RD(22),  F3(~2, ~0x30, ~1)|RD(~22),              "1,i,_", 0, v9a }, /* wr r,i,%softint */
103876cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0)|RD(23),  F3(~2, ~0x30, ~0)|RD(~23)|ASI(~0),      "1,2,_", 0, v9a }, /* wr r,r,%tick_cmpr */
103976cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1)|RD(23),  F3(~2, ~0x30, ~1)|RD(~23),              "1,i,_", 0, v9a }, /* wr r,i,%tick_cmpr */
104076cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0)|RD(24),  F3(~2, ~0x30, ~0)|RD(~24)|ASI(~0),      "1,2,_", 0, v9b }, /* wr r,r,%sys_tick */
104176cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1)|RD(24),  F3(~2, ~0x30, ~1)|RD(~24),              "1,i,_", 0, v9b }, /* wr r,i,%sys_tick */
104276cad711SPaolo Bonzini { "wr", F3(2, 0x30, 0)|RD(25),  F3(~2, ~0x30, ~0)|RD(~25)|ASI(~0),      "1,2,_", 0, v9b }, /* wr r,r,%sys_tick_cmpr */
104376cad711SPaolo Bonzini { "wr", F3(2, 0x30, 1)|RD(25),  F3(~2, ~0x30, ~1)|RD(~25),              "1,i,_", 0, v9b }, /* wr r,i,%sys_tick_cmpr */
104476cad711SPaolo Bonzini 
104576cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0),                 F3(~2, ~0x28, ~0)|SIMM13(~0),           "M,d", 0, v8 }, /* rd %asrX,r */
104676cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0),                 F3(~2, ~0x28, ~0)|RS1_G0|SIMM13(~0),    "y,d", 0, v6 }, /* rd %y,r */
104776cad711SPaolo Bonzini { "rd", F3(2, 0x29, 0),                 F3(~2, ~0x29, ~0)|RS1_G0|SIMM13(~0),    "p,d", 0, v6notv9 }, /* rd %psr,r */
104876cad711SPaolo Bonzini { "rd", F3(2, 0x2a, 0),                 F3(~2, ~0x2a, ~0)|RS1_G0|SIMM13(~0),    "w,d", 0, v6notv9 }, /* rd %wim,r */
104976cad711SPaolo Bonzini { "rd", F3(2, 0x2b, 0),                 F3(~2, ~0x2b, ~0)|RS1_G0|SIMM13(~0),    "t,d", 0, v6notv9 }, /* rd %tbr,r */
105076cad711SPaolo Bonzini 
105176cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0)|RS1(2),          F3(~2, ~0x28, ~0)|RS1(~2)|SIMM13(~0),   "E,d", 0, v9 }, /* rd %ccr,r */
105276cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0)|RS1(3),          F3(~2, ~0x28, ~0)|RS1(~3)|SIMM13(~0),   "o,d", 0, v9 }, /* rd %asi,r */
105376cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0)|RS1(4),          F3(~2, ~0x28, ~0)|RS1(~4)|SIMM13(~0),   "W,d", 0, v9 }, /* rd %tick,r */
105476cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0)|RS1(5),          F3(~2, ~0x28, ~0)|RS1(~5)|SIMM13(~0),   "P,d", 0, v9 }, /* rd %pc,r */
105576cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0)|RS1(6),          F3(~2, ~0x28, ~0)|RS1(~6)|SIMM13(~0),   "s,d", 0, v9 }, /* rd %fprs,r */
105676cad711SPaolo Bonzini 
105776cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0)|RS1(16),         F3(~2, ~0x28, ~0)|RS1(~16)|SIMM13(~0),  "/,d", 0, v9a }, /* rd %pcr,r */
105876cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0)|RS1(17),         F3(~2, ~0x28, ~0)|RS1(~17)|SIMM13(~0),  "/,d", 0, v9a }, /* rd %pic,r */
105976cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0)|RS1(18),         F3(~2, ~0x28, ~0)|RS1(~18)|SIMM13(~0),  "/,d", 0, v9a }, /* rd %dcr,r */
106076cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0)|RS1(19),         F3(~2, ~0x28, ~0)|RS1(~19)|SIMM13(~0),  "/,d", 0, v9a }, /* rd %gsr,r */
106176cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0)|RS1(22),         F3(~2, ~0x28, ~0)|RS1(~22)|SIMM13(~0),  "/,d", 0, v9a }, /* rd %softint,r */
106276cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0)|RS1(23),         F3(~2, ~0x28, ~0)|RS1(~23)|SIMM13(~0),  "/,d", 0, v9a }, /* rd %tick_cmpr,r */
106376cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0)|RS1(24),         F3(~2, ~0x28, ~0)|RS1(~24)|SIMM13(~0),  "/,d", 0, v9b }, /* rd %sys_tick,r */
106476cad711SPaolo Bonzini { "rd", F3(2, 0x28, 0)|RS1(25),         F3(~2, ~0x28, ~0)|RS1(~25)|SIMM13(~0),  "/,d", 0, v9b }, /* rd %sys_tick_cmpr,r */
106576cad711SPaolo Bonzini 
106676cad711SPaolo Bonzini { "rdpr",       F3(2, 0x2a, 0),         F3(~2, ~0x2a, ~0)|SIMM13(~0),   "?,d", 0, v9 },   /* rdpr %priv,r */
106776cad711SPaolo Bonzini { "wrpr",       F3(2, 0x32, 0),         F3(~2, ~0x32, ~0),              "1,2,!", 0, v9 }, /* wrpr r1,r2,%priv */
106876cad711SPaolo Bonzini { "wrpr",       F3(2, 0x32, 0),         F3(~2, ~0x32, ~0)|SIMM13(~0),   "1,!", 0, v9 },   /* wrpr r1,%priv */
106976cad711SPaolo Bonzini { "wrpr",       F3(2, 0x32, 1),         F3(~2, ~0x32, ~1),              "1,i,!", 0, v9 }, /* wrpr r1,i,%priv */
107076cad711SPaolo Bonzini { "wrpr",       F3(2, 0x32, 1),         F3(~2, ~0x32, ~1),              "i,1,!", F_ALIAS, v9 }, /* wrpr i,r1,%priv */
107176cad711SPaolo Bonzini { "wrpr",       F3(2, 0x32, 1),         F3(~2, ~0x32, ~1)|RS1(~0),      "i,!", 0, v9 },   /* wrpr i,%priv */
107276cad711SPaolo Bonzini 
107376cad711SPaolo Bonzini { "rdhpr",      F3(2, 0x29, 0),         F3(~2, ~0x29, ~0)|SIMM13(~0),   "$,d", 0, v9 },   /* rdhpr %hpriv,r */
107476cad711SPaolo Bonzini { "wrhpr",      F3(2, 0x33, 0),         F3(~2, ~0x33, ~0),              "1,2,%", 0, v9 }, /* wrhpr r1,r2,%hpriv */
107576cad711SPaolo Bonzini { "wrhpr",      F3(2, 0x33, 0),         F3(~2, ~0x33, ~0)|SIMM13(~0),   "1,%", 0, v9 },   /* wrhpr r1,%hpriv */
107676cad711SPaolo Bonzini { "wrhpr",      F3(2, 0x33, 1),         F3(~2, ~0x33, ~1),              "1,i,%", 0, v9 }, /* wrhpr r1,i,%hpriv */
107776cad711SPaolo Bonzini { "wrhpr",      F3(2, 0x33, 1),         F3(~2, ~0x33, ~1),              "i,1,%", F_ALIAS, v9 }, /* wrhpr i,r1,%hpriv */
107876cad711SPaolo Bonzini { "wrhpr",      F3(2, 0x33, 1),         F3(~2, ~0x33, ~1)|RS1(~0),      "i,%", 0, v9 },   /* wrhpr i,%hpriv */
107976cad711SPaolo Bonzini 
108076cad711SPaolo Bonzini /* ??? This group seems wrong.  A three operand move?  */
108176cad711SPaolo Bonzini { "mov",        F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|ASI(~0),              "1,2,m", F_ALIAS, v8 }, /* wr r,r,%asrX */
108276cad711SPaolo Bonzini { "mov",        F3(2, 0x30, 1), F3(~2, ~0x30, ~1),                      "1,i,m", F_ALIAS, v8 }, /* wr r,i,%asrX */
108376cad711SPaolo Bonzini { "mov",        F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|RD_G0|ASI(~0),        "1,2,y", F_ALIAS, v6 }, /* wr r,r,%y */
108476cad711SPaolo Bonzini { "mov",        F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|RD_G0,                "1,i,y", F_ALIAS, v6 }, /* wr r,i,%y */
108576cad711SPaolo Bonzini { "mov",        F3(2, 0x31, 0), F3(~2, ~0x31, ~0)|RD_G0|ASI(~0),        "1,2,p", F_ALIAS, v6notv9 }, /* wr r,r,%psr */
108676cad711SPaolo Bonzini { "mov",        F3(2, 0x31, 1), F3(~2, ~0x31, ~1)|RD_G0,                "1,i,p", F_ALIAS, v6notv9 }, /* wr r,i,%psr */
108776cad711SPaolo Bonzini { "mov",        F3(2, 0x32, 0), F3(~2, ~0x32, ~0)|RD_G0|ASI(~0),        "1,2,w", F_ALIAS, v6notv9 }, /* wr r,r,%wim */
108876cad711SPaolo Bonzini { "mov",        F3(2, 0x32, 1), F3(~2, ~0x32, ~1)|RD_G0,                "1,i,w", F_ALIAS, v6notv9 }, /* wr r,i,%wim */
108976cad711SPaolo Bonzini { "mov",        F3(2, 0x33, 0), F3(~2, ~0x33, ~0)|RD_G0|ASI(~0),        "1,2,t", F_ALIAS, v6notv9 }, /* wr r,r,%tbr */
109076cad711SPaolo Bonzini { "mov",        F3(2, 0x33, 1), F3(~2, ~0x33, ~1)|RD_G0,                "1,i,t", F_ALIAS, v6notv9 }, /* wr r,i,%tbr */
109176cad711SPaolo Bonzini 
109276cad711SPaolo Bonzini { "mov",        F3(2, 0x28, 0), F3(~2, ~0x28, ~0)|SIMM13(~0),           "M,d", F_ALIAS, v8 }, /* rd %asr1,r */
109376cad711SPaolo Bonzini { "mov",        F3(2, 0x28, 0), F3(~2, ~0x28, ~0)|RS1_G0|SIMM13(~0),    "y,d", F_ALIAS, v6 }, /* rd %y,r */
109476cad711SPaolo Bonzini { "mov",        F3(2, 0x29, 0), F3(~2, ~0x29, ~0)|RS1_G0|SIMM13(~0),    "p,d", F_ALIAS, v6notv9 }, /* rd %psr,r */
109576cad711SPaolo Bonzini { "mov",        F3(2, 0x2a, 0), F3(~2, ~0x2a, ~0)|RS1_G0|SIMM13(~0),    "w,d", F_ALIAS, v6notv9 }, /* rd %wim,r */
109676cad711SPaolo Bonzini { "mov",        F3(2, 0x2b, 0), F3(~2, ~0x2b, ~0)|RS1_G0|SIMM13(~0),    "t,d", F_ALIAS, v6notv9 }, /* rd %tbr,r */
109776cad711SPaolo Bonzini 
109876cad711SPaolo Bonzini { "mov",        F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|ASI_RS2(~0),          "1,m", F_ALIAS, v8 }, /* wr rs1,%g0,%asrX */
109976cad711SPaolo Bonzini { "mov",        F3(2, 0x30, 1), F3(~2, ~0x30, ~1),                      "i,m", F_ALIAS, v8 }, /* wr %g0,i,%asrX */
110076cad711SPaolo Bonzini { "mov",        F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|SIMM13(~0),           "1,m", F_ALIAS, v8 }, /* wr rs1,0,%asrX */
110176cad711SPaolo Bonzini { "mov",        F3(2, 0x30, 0), F3(~2, ~0x30, ~0)|RD_G0|ASI_RS2(~0),    "1,y", F_ALIAS, v6 }, /* wr rs1,%g0,%y */
110276cad711SPaolo Bonzini { "mov",        F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|RD_G0,                "i,y", F_ALIAS, v6 }, /* wr %g0,i,%y */
110376cad711SPaolo Bonzini { "mov",        F3(2, 0x30, 1), F3(~2, ~0x30, ~1)|RD_G0|SIMM13(~0),     "1,y", F_ALIAS, v6 }, /* wr rs1,0,%y */
110476cad711SPaolo Bonzini { "mov",        F3(2, 0x31, 0), F3(~2, ~0x31, ~0)|RD_G0|ASI_RS2(~0),    "1,p", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%psr */
110576cad711SPaolo Bonzini { "mov",        F3(2, 0x31, 1), F3(~2, ~0x31, ~1)|RD_G0,                "i,p", F_ALIAS, v6notv9 }, /* wr %g0,i,%psr */
110676cad711SPaolo Bonzini { "mov",        F3(2, 0x31, 1), F3(~2, ~0x31, ~1)|RD_G0|SIMM13(~0),     "1,p", F_ALIAS, v6notv9 }, /* wr rs1,0,%psr */
110776cad711SPaolo Bonzini { "mov",        F3(2, 0x32, 0), F3(~2, ~0x32, ~0)|RD_G0|ASI_RS2(~0),    "1,w", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%wim */
110876cad711SPaolo Bonzini { "mov",        F3(2, 0x32, 1), F3(~2, ~0x32, ~1)|RD_G0,                "i,w", F_ALIAS, v6notv9 }, /* wr %g0,i,%wim */
110976cad711SPaolo Bonzini { "mov",        F3(2, 0x32, 1), F3(~2, ~0x32, ~1)|RD_G0|SIMM13(~0),     "1,w", F_ALIAS, v6notv9 }, /* wr rs1,0,%wim */
111076cad711SPaolo Bonzini { "mov",        F3(2, 0x33, 0), F3(~2, ~0x33, ~0)|RD_G0|ASI_RS2(~0),    "1,t", F_ALIAS, v6notv9 }, /* wr rs1,%g0,%tbr */
111176cad711SPaolo Bonzini { "mov",        F3(2, 0x33, 1), F3(~2, ~0x33, ~1)|RD_G0,                "i,t", F_ALIAS, v6notv9 }, /* wr %g0,i,%tbr */
111276cad711SPaolo Bonzini { "mov",        F3(2, 0x33, 1), F3(~2, ~0x33, ~1)|RD_G0|SIMM13(~0),     "1,t", F_ALIAS, v6notv9 }, /* wr rs1,0,%tbr */
111376cad711SPaolo Bonzini 
111476cad711SPaolo Bonzini { "mov",        F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|RS1_G0|ASI(~0),       "2,d", 0, v6 }, /* or %g0,rs2,d */
111576cad711SPaolo Bonzini { "mov",        F3(2, 0x02, 1), F3(~2, ~0x02, ~1)|RS1_G0,               "i,d", 0, v6 }, /* or %g0,i,d   */
111676cad711SPaolo Bonzini { "mov",        F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|ASI_RS2(~0),          "1,d", 0, v6 }, /* or rs1,%g0,d   */
111776cad711SPaolo Bonzini { "mov",        F3(2, 0x02, 1), F3(~2, ~0x02, ~1)|SIMM13(~0),           "1,d", 0, v6 }, /* or rs1,0,d */
111876cad711SPaolo Bonzini 
111976cad711SPaolo Bonzini { "or", F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|ASI(~0),      "1,2,d", 0, v6 },
112076cad711SPaolo Bonzini { "or", F3(2, 0x02, 1), F3(~2, ~0x02, ~1),              "1,i,d", 0, v6 },
112176cad711SPaolo Bonzini { "or", F3(2, 0x02, 1), F3(~2, ~0x02, ~1),              "i,1,d", 0, v6 },
112276cad711SPaolo Bonzini 
112376cad711SPaolo Bonzini { "bset",       F3(2, 0x02, 0), F3(~2, ~0x02, ~0)|ASI(~0),      "2,r", F_ALIAS, v6 },   /* or rd,rs2,rd */
112476cad711SPaolo Bonzini { "bset",       F3(2, 0x02, 1), F3(~2, ~0x02, ~1),              "i,r", F_ALIAS, v6 },   /* or rd,i,rd */
112576cad711SPaolo Bonzini 
112676cad711SPaolo Bonzini /* This is not a commutative instruction.  */
112776cad711SPaolo Bonzini { "andn",       F3(2, 0x05, 0), F3(~2, ~0x05, ~0)|ASI(~0),      "1,2,d", 0, v6 },
112876cad711SPaolo Bonzini { "andn",       F3(2, 0x05, 1), F3(~2, ~0x05, ~1),              "1,i,d", 0, v6 },
112976cad711SPaolo Bonzini 
113076cad711SPaolo Bonzini /* This is not a commutative instruction.  */
113176cad711SPaolo Bonzini { "andncc",     F3(2, 0x15, 0), F3(~2, ~0x15, ~0)|ASI(~0),      "1,2,d", 0, v6 },
113276cad711SPaolo Bonzini { "andncc",     F3(2, 0x15, 1), F3(~2, ~0x15, ~1),              "1,i,d", 0, v6 },
113376cad711SPaolo Bonzini 
113476cad711SPaolo Bonzini { "bclr",       F3(2, 0x05, 0), F3(~2, ~0x05, ~0)|ASI(~0),      "2,r", F_ALIAS, v6 },   /* andn rd,rs2,rd */
113576cad711SPaolo Bonzini { "bclr",       F3(2, 0x05, 1), F3(~2, ~0x05, ~1),              "i,r", F_ALIAS, v6 },   /* andn rd,i,rd */
113676cad711SPaolo Bonzini 
113776cad711SPaolo Bonzini { "cmp",        F3(2, 0x14, 0), F3(~2, ~0x14, ~0)|RD_G0|ASI(~0),        "1,2", 0, v6 }, /* subcc rs1,rs2,%g0 */
113876cad711SPaolo Bonzini { "cmp",        F3(2, 0x14, 1), F3(~2, ~0x14, ~1)|RD_G0,                "1,i", 0, v6 }, /* subcc rs1,i,%g0 */
113976cad711SPaolo Bonzini 
114076cad711SPaolo Bonzini { "sub",        F3(2, 0x04, 0), F3(~2, ~0x04, ~0)|ASI(~0),      "1,2,d", 0, v6 },
114176cad711SPaolo Bonzini { "sub",        F3(2, 0x04, 1), F3(~2, ~0x04, ~1),              "1,i,d", 0, v6 },
114276cad711SPaolo Bonzini 
114376cad711SPaolo Bonzini { "subcc",      F3(2, 0x14, 0), F3(~2, ~0x14, ~0)|ASI(~0),      "1,2,d", 0, v6 },
114476cad711SPaolo Bonzini { "subcc",      F3(2, 0x14, 1), F3(~2, ~0x14, ~1),              "1,i,d", 0, v6 },
114576cad711SPaolo Bonzini 
1146c470b663SRichard Henderson { "subc",       F3(2, 0x0c, 0), F3(~2, ~0x0c, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1147c470b663SRichard Henderson { "subc",       F3(2, 0x0c, 1), F3(~2, ~0x0c, ~1),              "1,i,d", 0, v6 },
114876cad711SPaolo Bonzini 
1149c470b663SRichard Henderson { "subccc",     F3(2, 0x1c, 0), F3(~2, ~0x1c, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1150c470b663SRichard Henderson { "subccc",     F3(2, 0x1c, 1), F3(~2, ~0x1c, ~1),              "1,i,d", 0, v6 },
115176cad711SPaolo Bonzini 
115276cad711SPaolo Bonzini { "and",        F3(2, 0x01, 0), F3(~2, ~0x01, ~0)|ASI(~0),      "1,2,d", 0, v6 },
115376cad711SPaolo Bonzini { "and",        F3(2, 0x01, 1), F3(~2, ~0x01, ~1),              "1,i,d", 0, v6 },
115476cad711SPaolo Bonzini { "and",        F3(2, 0x01, 1), F3(~2, ~0x01, ~1),              "i,1,d", 0, v6 },
115576cad711SPaolo Bonzini 
115676cad711SPaolo Bonzini { "andcc",      F3(2, 0x11, 0), F3(~2, ~0x11, ~0)|ASI(~0),      "1,2,d", 0, v6 },
115776cad711SPaolo Bonzini { "andcc",      F3(2, 0x11, 1), F3(~2, ~0x11, ~1),              "1,i,d", 0, v6 },
115876cad711SPaolo Bonzini { "andcc",      F3(2, 0x11, 1), F3(~2, ~0x11, ~1),              "i,1,d", 0, v6 },
115976cad711SPaolo Bonzini 
116076cad711SPaolo Bonzini { "dec",        F3(2, 0x04, 1)|SIMM13(0x1), F3(~2, ~0x04, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },      /* sub rd,1,rd */
116176cad711SPaolo Bonzini { "dec",        F3(2, 0x04, 1),             F3(~2, ~0x04, ~1),                 "i,r", F_ALIAS, v8 },    /* sub rd,imm,rd */
116276cad711SPaolo Bonzini { "deccc",      F3(2, 0x14, 1)|SIMM13(0x1), F3(~2, ~0x14, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },      /* subcc rd,1,rd */
116376cad711SPaolo Bonzini { "deccc",      F3(2, 0x14, 1),             F3(~2, ~0x14, ~1),                 "i,r", F_ALIAS, v8 },    /* subcc rd,imm,rd */
116476cad711SPaolo Bonzini { "inc",        F3(2, 0x00, 1)|SIMM13(0x1), F3(~2, ~0x00, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },      /* add rd,1,rd */
116576cad711SPaolo Bonzini { "inc",        F3(2, 0x00, 1),             F3(~2, ~0x00, ~1),                 "i,r", F_ALIAS, v8 },    /* add rd,imm,rd */
116676cad711SPaolo Bonzini { "inccc",      F3(2, 0x10, 1)|SIMM13(0x1), F3(~2, ~0x10, ~1)|SIMM13(~0x0001), "r", F_ALIAS, v6 },      /* addcc rd,1,rd */
116776cad711SPaolo Bonzini { "inccc",      F3(2, 0x10, 1),             F3(~2, ~0x10, ~1),                 "i,r", F_ALIAS, v8 },    /* addcc rd,imm,rd */
116876cad711SPaolo Bonzini 
116976cad711SPaolo Bonzini { "btst",       F3(2, 0x11, 0), F3(~2, ~0x11, ~0)|RD_G0|ASI(~0), "1,2", F_ALIAS, v6 },  /* andcc rs1,rs2,%g0 */
117076cad711SPaolo Bonzini { "btst",       F3(2, 0x11, 1), F3(~2, ~0x11, ~1)|RD_G0, "i,1", F_ALIAS, v6 },  /* andcc rs1,i,%g0 */
117176cad711SPaolo Bonzini 
117276cad711SPaolo Bonzini { "neg",        F3(2, 0x04, 0), F3(~2, ~0x04, ~0)|RS1_G0|ASI(~0), "2,d", F_ALIAS, v6 }, /* sub %g0,rs2,rd */
117376cad711SPaolo Bonzini { "neg",        F3(2, 0x04, 0), F3(~2, ~0x04, ~0)|RS1_G0|ASI(~0), "O", F_ALIAS, v6 }, /* sub %g0,rd,rd */
117476cad711SPaolo Bonzini 
117576cad711SPaolo Bonzini { "add",        F3(2, 0x00, 0), F3(~2, ~0x00, ~0)|ASI(~0),      "1,2,d", 0, v6 },
117676cad711SPaolo Bonzini { "add",        F3(2, 0x00, 1), F3(~2, ~0x00, ~1),              "1,i,d", 0, v6 },
117776cad711SPaolo Bonzini { "add",        F3(2, 0x00, 1), F3(~2, ~0x00, ~1),              "i,1,d", 0, v6 },
117876cad711SPaolo Bonzini { "addcc",      F3(2, 0x10, 0), F3(~2, ~0x10, ~0)|ASI(~0),      "1,2,d", 0, v6 },
117976cad711SPaolo Bonzini { "addcc",      F3(2, 0x10, 1), F3(~2, ~0x10, ~1),              "1,i,d", 0, v6 },
118076cad711SPaolo Bonzini { "addcc",      F3(2, 0x10, 1), F3(~2, ~0x10, ~1),              "i,1,d", 0, v6 },
118176cad711SPaolo Bonzini 
1182c470b663SRichard Henderson { "addc",       F3(2, 0x08, 0), F3(~2, ~0x08, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1183c470b663SRichard Henderson { "addc",       F3(2, 0x08, 1), F3(~2, ~0x08, ~1),              "1,i,d", 0, v6 },
1184c470b663SRichard Henderson { "addc",       F3(2, 0x08, 1), F3(~2, ~0x08, ~1),              "i,1,d", 0, v6 },
118576cad711SPaolo Bonzini 
1186c470b663SRichard Henderson { "addccc",     F3(2, 0x18, 0), F3(~2, ~0x18, ~0)|ASI(~0),      "1,2,d", 0, v6 },
1187c470b663SRichard Henderson { "addccc",     F3(2, 0x18, 1), F3(~2, ~0x18, ~1),              "1,i,d", 0, v6 },
1188c470b663SRichard Henderson { "addccc",     F3(2, 0x18, 1), F3(~2, ~0x18, ~1),              "i,1,d", 0, v6 },
118976cad711SPaolo Bonzini 
119076cad711SPaolo Bonzini { "smul",       F3(2, 0x0b, 0), F3(~2, ~0x0b, ~0)|ASI(~0),      "1,2,d", 0, v8 },
119176cad711SPaolo Bonzini { "smul",       F3(2, 0x0b, 1), F3(~2, ~0x0b, ~1),              "1,i,d", 0, v8 },
119276cad711SPaolo Bonzini { "smul",       F3(2, 0x0b, 1), F3(~2, ~0x0b, ~1),              "i,1,d", 0, v8 },
119376cad711SPaolo Bonzini { "smulcc",     F3(2, 0x1b, 0), F3(~2, ~0x1b, ~0)|ASI(~0),      "1,2,d", 0, v8 },
119476cad711SPaolo Bonzini { "smulcc",     F3(2, 0x1b, 1), F3(~2, ~0x1b, ~1),              "1,i,d", 0, v8 },
119576cad711SPaolo Bonzini { "smulcc",     F3(2, 0x1b, 1), F3(~2, ~0x1b, ~1),              "i,1,d", 0, v8 },
119676cad711SPaolo Bonzini { "umul",       F3(2, 0x0a, 0), F3(~2, ~0x0a, ~0)|ASI(~0),      "1,2,d", 0, v8 },
119776cad711SPaolo Bonzini { "umul",       F3(2, 0x0a, 1), F3(~2, ~0x0a, ~1),              "1,i,d", 0, v8 },
119876cad711SPaolo Bonzini { "umul",       F3(2, 0x0a, 1), F3(~2, ~0x0a, ~1),              "i,1,d", 0, v8 },
119976cad711SPaolo Bonzini { "umulcc",     F3(2, 0x1a, 0), F3(~2, ~0x1a, ~0)|ASI(~0),      "1,2,d", 0, v8 },
120076cad711SPaolo Bonzini { "umulcc",     F3(2, 0x1a, 1), F3(~2, ~0x1a, ~1),              "1,i,d", 0, v8 },
120176cad711SPaolo Bonzini { "umulcc",     F3(2, 0x1a, 1), F3(~2, ~0x1a, ~1),              "i,1,d", 0, v8 },
120276cad711SPaolo Bonzini { "sdiv",       F3(2, 0x0f, 0), F3(~2, ~0x0f, ~0)|ASI(~0),      "1,2,d", 0, v8 },
120376cad711SPaolo Bonzini { "sdiv",       F3(2, 0x0f, 1), F3(~2, ~0x0f, ~1),              "1,i,d", 0, v8 },
120476cad711SPaolo Bonzini { "sdiv",       F3(2, 0x0f, 1), F3(~2, ~0x0f, ~1),              "i,1,d", 0, v8 },
120576cad711SPaolo Bonzini { "sdivcc",     F3(2, 0x1f, 0), F3(~2, ~0x1f, ~0)|ASI(~0),      "1,2,d", 0, v8 },
120676cad711SPaolo Bonzini { "sdivcc",     F3(2, 0x1f, 1), F3(~2, ~0x1f, ~1),              "1,i,d", 0, v8 },
120776cad711SPaolo Bonzini { "sdivcc",     F3(2, 0x1f, 1), F3(~2, ~0x1f, ~1),              "i,1,d", 0, v8 },
120876cad711SPaolo Bonzini { "udiv",       F3(2, 0x0e, 0), F3(~2, ~0x0e, ~0)|ASI(~0),      "1,2,d", 0, v8 },
120976cad711SPaolo Bonzini { "udiv",       F3(2, 0x0e, 1), F3(~2, ~0x0e, ~1),              "1,i,d", 0, v8 },
121076cad711SPaolo Bonzini { "udiv",       F3(2, 0x0e, 1), F3(~2, ~0x0e, ~1),              "i,1,d", 0, v8 },
121176cad711SPaolo Bonzini { "udivcc",     F3(2, 0x1e, 0), F3(~2, ~0x1e, ~0)|ASI(~0),      "1,2,d", 0, v8 },
121276cad711SPaolo Bonzini { "udivcc",     F3(2, 0x1e, 1), F3(~2, ~0x1e, ~1),              "1,i,d", 0, v8 },
121376cad711SPaolo Bonzini { "udivcc",     F3(2, 0x1e, 1), F3(~2, ~0x1e, ~1),              "i,1,d", 0, v8 },
121476cad711SPaolo Bonzini 
121576cad711SPaolo Bonzini { "mulx",       F3(2, 0x09, 0), F3(~2, ~0x09, ~0)|ASI(~0),      "1,2,d", 0, v9 },
121676cad711SPaolo Bonzini { "mulx",       F3(2, 0x09, 1), F3(~2, ~0x09, ~1),              "1,i,d", 0, v9 },
121776cad711SPaolo Bonzini { "sdivx",      F3(2, 0x2d, 0), F3(~2, ~0x2d, ~0)|ASI(~0),      "1,2,d", 0, v9 },
121876cad711SPaolo Bonzini { "sdivx",      F3(2, 0x2d, 1), F3(~2, ~0x2d, ~1),              "1,i,d", 0, v9 },
121976cad711SPaolo Bonzini { "udivx",      F3(2, 0x0d, 0), F3(~2, ~0x0d, ~0)|ASI(~0),      "1,2,d", 0, v9 },
122076cad711SPaolo Bonzini { "udivx",      F3(2, 0x0d, 1), F3(~2, ~0x0d, ~1),              "1,i,d", 0, v9 },
122176cad711SPaolo Bonzini 
122276cad711SPaolo Bonzini { "call",       F1(0x1), F1(~0x1), "L", F_JSR|F_DELAYED, v6 },
122376cad711SPaolo Bonzini { "call",       F1(0x1), F1(~0x1), "L,#", F_JSR|F_DELAYED, v6 },
122476cad711SPaolo Bonzini 
122576cad711SPaolo Bonzini { "call",       F3(2, 0x38, 0)|RD(0xf), F3(~2, ~0x38, ~0)|RD(~0xf)|ASI(~0),     "1+2", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+rs2,%o7 */
122676cad711SPaolo Bonzini { "call",       F3(2, 0x38, 0)|RD(0xf), F3(~2, ~0x38, ~0)|RD(~0xf)|ASI(~0),     "1+2,#", F_JSR|F_DELAYED, v6 },
122776cad711SPaolo Bonzini { "call",       F3(2, 0x38, 0)|RD(0xf), F3(~2, ~0x38, ~0)|RD(~0xf)|ASI_RS2(~0), "1", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+%g0,%o7 */
122876cad711SPaolo Bonzini { "call",       F3(2, 0x38, 0)|RD(0xf), F3(~2, ~0x38, ~0)|RD(~0xf)|ASI_RS2(~0), "1,#", F_JSR|F_DELAYED, v6 },
122976cad711SPaolo Bonzini { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),             "1+i", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+i,%o7 */
123076cad711SPaolo Bonzini { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),             "1+i,#", F_JSR|F_DELAYED, v6 },
123176cad711SPaolo Bonzini { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),             "i+1", F_JSR|F_DELAYED, v6 }, /* jmpl i+rs1,%o7 */
123276cad711SPaolo Bonzini { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf),             "i+1,#", F_JSR|F_DELAYED, v6 },
123376cad711SPaolo Bonzini { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf)|RS1_G0,      "i", F_JSR|F_DELAYED, v6 }, /* jmpl %g0+i,%o7 */
123476cad711SPaolo Bonzini { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf)|RS1_G0,      "i,#", F_JSR|F_DELAYED, v6 },
123576cad711SPaolo Bonzini { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf)|SIMM13(~0),  "1", F_JSR|F_DELAYED, v6 }, /* jmpl rs1+0,%o7 */
123676cad711SPaolo Bonzini { "call",       F3(2, 0x38, 1)|RD(0xf), F3(~2, ~0x38, ~1)|RD(~0xf)|SIMM13(~0),  "1,#", F_JSR|F_DELAYED, v6 },
123776cad711SPaolo Bonzini 
123876cad711SPaolo Bonzini 
123976cad711SPaolo Bonzini /* Conditional instructions.
124076cad711SPaolo Bonzini 
124176cad711SPaolo Bonzini    Because this part of the table was such a mess earlier, I have
124276cad711SPaolo Bonzini    macrofied it so that all the branches and traps are generated from
124376cad711SPaolo Bonzini    a single-line description of each condition value.  John Gilmore. */
124476cad711SPaolo Bonzini 
124576cad711SPaolo Bonzini /* Define branches -- one annulled, one without, etc. */
124676cad711SPaolo Bonzini #define br(opcode, mask, lose, flags) \
124776cad711SPaolo Bonzini  { opcode, (mask)|ANNUL, (lose),       ",a l",   (flags), v6 }, \
124876cad711SPaolo Bonzini  { opcode, (mask)      , (lose)|ANNUL, "l",     (flags), v6 }
124976cad711SPaolo Bonzini 
125076cad711SPaolo Bonzini #define brx(opcode, mask, lose, flags) /* v9 */ \
125176cad711SPaolo Bonzini  { opcode, (mask)|(2<<20)|BPRED, ANNUL|(lose), "Z,G",      (flags), v9 }, \
125276cad711SPaolo Bonzini  { opcode, (mask)|(2<<20)|BPRED, ANNUL|(lose), ",T Z,G",   (flags), v9 }, \
125376cad711SPaolo Bonzini  { opcode, (mask)|(2<<20)|BPRED|ANNUL, (lose), ",a Z,G",   (flags), v9 }, \
125476cad711SPaolo Bonzini  { opcode, (mask)|(2<<20)|BPRED|ANNUL, (lose), ",a,T Z,G", (flags), v9 }, \
125576cad711SPaolo Bonzini  { opcode, (mask)|(2<<20), ANNUL|BPRED|(lose), ",N Z,G",   (flags), v9 }, \
125676cad711SPaolo Bonzini  { opcode, (mask)|(2<<20)|ANNUL, BPRED|(lose), ",a,N Z,G", (flags), v9 }, \
125776cad711SPaolo Bonzini  { opcode, (mask)|BPRED, ANNUL|(lose)|(2<<20), "z,G",      (flags), v9 }, \
125876cad711SPaolo Bonzini  { opcode, (mask)|BPRED, ANNUL|(lose)|(2<<20), ",T z,G",   (flags), v9 }, \
125976cad711SPaolo Bonzini  { opcode, (mask)|BPRED|ANNUL, (lose)|(2<<20), ",a z,G",   (flags), v9 }, \
126076cad711SPaolo Bonzini  { opcode, (mask)|BPRED|ANNUL, (lose)|(2<<20), ",a,T z,G", (flags), v9 }, \
126176cad711SPaolo Bonzini  { opcode, (mask), ANNUL|BPRED|(lose)|(2<<20), ",N z,G",   (flags), v9 }, \
126276cad711SPaolo Bonzini  { opcode, (mask)|ANNUL, BPRED|(lose)|(2<<20), ",a,N z,G", (flags), v9 }
126376cad711SPaolo Bonzini 
126476cad711SPaolo Bonzini /* Define four traps: reg+reg, reg + immediate, immediate alone, reg alone. */
126576cad711SPaolo Bonzini #define tr(opcode, mask, lose, flags) \
126676cad711SPaolo Bonzini  { opcode, (mask)|(2<<11)|IMMED, (lose)|RS1_G0, "Z,i",   (flags), v9 }, /* %g0 + imm */ \
126776cad711SPaolo Bonzini  { opcode, (mask)|(2<<11)|IMMED, (lose),        "Z,1+i", (flags), v9 }, /* rs1 + imm */ \
126876cad711SPaolo Bonzini  { opcode, (mask)|(2<<11), IMMED|(lose),        "Z,1+2", (flags), v9 }, /* rs1 + rs2 */ \
126976cad711SPaolo Bonzini  { opcode, (mask)|(2<<11), IMMED|(lose)|RS2_G0, "Z,1",   (flags), v9 }, /* rs1 + %g0 */ \
127076cad711SPaolo Bonzini  { opcode, (mask)|IMMED, (lose)|RS1_G0, "z,i",   (flags)|F_ALIAS, v9 }, /* %g0 + imm */ \
127176cad711SPaolo Bonzini  { opcode, (mask)|IMMED, (lose),        "z,1+i", (flags)|F_ALIAS, v9 }, /* rs1 + imm */ \
127276cad711SPaolo Bonzini  { opcode, (mask), IMMED|(lose),        "z,1+2", (flags)|F_ALIAS, v9 }, /* rs1 + rs2 */ \
127376cad711SPaolo Bonzini  { opcode, (mask), IMMED|(lose)|RS2_G0, "z,1",   (flags)|F_ALIAS, v9 }, /* rs1 + %g0 */ \
127476cad711SPaolo Bonzini  { opcode, (mask)|IMMED, (lose)|RS1_G0,         "i",     (flags), v6 }, /* %g0 + imm */ \
127576cad711SPaolo Bonzini  { opcode, (mask)|IMMED, (lose),                "1+i",   (flags), v6 }, /* rs1 + imm */ \
127676cad711SPaolo Bonzini  { opcode, (mask), IMMED|(lose),                "1+2",   (flags), v6 }, /* rs1 + rs2 */ \
127776cad711SPaolo Bonzini  { opcode, (mask), IMMED|(lose)|RS2_G0,         "1",     (flags), v6 } /* rs1 + %g0 */
127876cad711SPaolo Bonzini 
127976cad711SPaolo Bonzini /* v9: We must put `brx' before `br', to ensure that we never match something
128076cad711SPaolo Bonzini    v9: against an expression unless it is an expression.  Otherwise, we end
128176cad711SPaolo Bonzini    v9: up with undefined symbol tables entries, because they get added, but
128276cad711SPaolo Bonzini    v9: are not deleted if the pattern fails to match.  */
128376cad711SPaolo Bonzini 
128476cad711SPaolo Bonzini /* Define both branches and traps based on condition mask */
128576cad711SPaolo Bonzini #define cond(bop, top, mask, flags) \
128676cad711SPaolo Bonzini   brx(bop, F2(0, 1)|(mask), F2(~0, ~1)|((~mask)&COND(~0)), F_DELAYED|(flags)), /* v9 */ \
128776cad711SPaolo Bonzini   br(bop,  F2(0, 2)|(mask), F2(~0, ~2)|((~mask)&COND(~0)), F_DELAYED|(flags)), \
128876cad711SPaolo Bonzini   tr(top,  F3(2, 0x3a, 0)|(mask), F3(~2, ~0x3a, 0)|((~mask)&COND(~0)), ((flags) & ~(F_UNBR|F_CONDBR)))
128976cad711SPaolo Bonzini 
129076cad711SPaolo Bonzini /* Define all the conditions, all the branches, all the traps.  */
129176cad711SPaolo Bonzini 
129276cad711SPaolo Bonzini /* Standard branch, trap mnemonics */
129376cad711SPaolo Bonzini cond ("b",      "ta",   CONDA, F_UNBR),
129476cad711SPaolo Bonzini /* Alternative form (just for assembly, not for disassembly) */
129576cad711SPaolo Bonzini cond ("ba",     "t",    CONDA, F_UNBR|F_ALIAS),
129676cad711SPaolo Bonzini 
129776cad711SPaolo Bonzini cond ("bcc",    "tcc",  CONDCC, F_CONDBR),
129876cad711SPaolo Bonzini cond ("bcs",    "tcs",  CONDCS, F_CONDBR),
129976cad711SPaolo Bonzini cond ("be",     "te",   CONDE, F_CONDBR),
130076cad711SPaolo Bonzini cond ("beq",    "teq",  CONDE, F_CONDBR|F_ALIAS),
130176cad711SPaolo Bonzini cond ("bg",     "tg",   CONDG, F_CONDBR),
130276cad711SPaolo Bonzini cond ("bgt",    "tgt",  CONDG, F_CONDBR|F_ALIAS),
130376cad711SPaolo Bonzini cond ("bge",    "tge",  CONDGE, F_CONDBR),
130476cad711SPaolo Bonzini cond ("bgeu",   "tgeu", CONDGEU, F_CONDBR|F_ALIAS), /* for cc */
130576cad711SPaolo Bonzini cond ("bgu",    "tgu",  CONDGU, F_CONDBR),
130676cad711SPaolo Bonzini cond ("bl",     "tl",   CONDL, F_CONDBR),
130776cad711SPaolo Bonzini cond ("blt",    "tlt",  CONDL, F_CONDBR|F_ALIAS),
130876cad711SPaolo Bonzini cond ("ble",    "tle",  CONDLE, F_CONDBR),
130976cad711SPaolo Bonzini cond ("bleu",   "tleu", CONDLEU, F_CONDBR),
131076cad711SPaolo Bonzini cond ("blu",    "tlu",  CONDLU, F_CONDBR|F_ALIAS), /* for cs */
131176cad711SPaolo Bonzini cond ("bn",     "tn",   CONDN, F_CONDBR),
131276cad711SPaolo Bonzini cond ("bne",    "tne",  CONDNE, F_CONDBR),
131376cad711SPaolo Bonzini cond ("bneg",   "tneg", CONDNEG, F_CONDBR),
131476cad711SPaolo Bonzini cond ("bnz",    "tnz",  CONDNZ, F_CONDBR|F_ALIAS), /* for ne */
131576cad711SPaolo Bonzini cond ("bpos",   "tpos", CONDPOS, F_CONDBR),
131676cad711SPaolo Bonzini cond ("bvc",    "tvc",  CONDVC, F_CONDBR),
131776cad711SPaolo Bonzini cond ("bvs",    "tvs",  CONDVS, F_CONDBR),
131876cad711SPaolo Bonzini cond ("bz",     "tz",   CONDZ, F_CONDBR|F_ALIAS), /* for e */
131976cad711SPaolo Bonzini 
132076cad711SPaolo Bonzini #undef cond
132176cad711SPaolo Bonzini #undef br
132276cad711SPaolo Bonzini #undef brr /* v9 */
132376cad711SPaolo Bonzini #undef tr
132476cad711SPaolo Bonzini 
132576cad711SPaolo Bonzini #define brr(opcode, mask, lose, flags) /* v9 */ \
132676cad711SPaolo Bonzini  { opcode, (mask)|BPRED, ANNUL|(lose), "1,k",      F_DELAYED|(flags), v9 }, \
132776cad711SPaolo Bonzini  { opcode, (mask)|BPRED, ANNUL|(lose), ",T 1,k",   F_DELAYED|(flags), v9 }, \
132876cad711SPaolo Bonzini  { opcode, (mask)|BPRED|ANNUL, (lose), ",a 1,k",   F_DELAYED|(flags), v9 }, \
132976cad711SPaolo Bonzini  { opcode, (mask)|BPRED|ANNUL, (lose), ",a,T 1,k", F_DELAYED|(flags), v9 }, \
133076cad711SPaolo Bonzini  { opcode, (mask), ANNUL|BPRED|(lose), ",N 1,k",   F_DELAYED|(flags), v9 }, \
133176cad711SPaolo Bonzini  { opcode, (mask)|ANNUL, BPRED|(lose), ",a,N 1,k", F_DELAYED|(flags), v9 }
133276cad711SPaolo Bonzini 
133376cad711SPaolo Bonzini #define condr(bop, mask, flags) /* v9 */ \
133476cad711SPaolo Bonzini   brr(bop, F2(0, 3)|COND(mask), F2(~0, ~3)|COND(~(mask)), (flags)) /* v9 */
133576cad711SPaolo Bonzini 
133676cad711SPaolo Bonzini /* v9 */ condr("brnz", 0x5, F_CONDBR),
133776cad711SPaolo Bonzini /* v9 */ condr("brz", 0x1, F_CONDBR),
133876cad711SPaolo Bonzini /* v9 */ condr("brgez", 0x7, F_CONDBR),
133976cad711SPaolo Bonzini /* v9 */ condr("brlz", 0x3, F_CONDBR),
134076cad711SPaolo Bonzini /* v9 */ condr("brlez", 0x2, F_CONDBR),
134176cad711SPaolo Bonzini /* v9 */ condr("brgz", 0x6, F_CONDBR),
134276cad711SPaolo Bonzini 
134376cad711SPaolo Bonzini #undef condr /* v9 */
134476cad711SPaolo Bonzini #undef brr /* v9 */
134576cad711SPaolo Bonzini 
134676cad711SPaolo Bonzini #define movr(opcode, mask, flags) /* v9 */ \
134776cad711SPaolo Bonzini  { opcode, F3(2, 0x2f, 0)|RCOND(mask), F3(~2, ~0x2f, ~0)|RCOND(~(mask)), "1,2,d", (flags), v9 }, \
134876cad711SPaolo Bonzini  { opcode, F3(2, 0x2f, 1)|RCOND(mask), F3(~2, ~0x2f, ~1)|RCOND(~(mask)), "1,j,d", (flags), v9 }
134976cad711SPaolo Bonzini 
135076cad711SPaolo Bonzini #define fmrrs(opcode, mask, lose, flags) /* v9 */ \
135176cad711SPaolo Bonzini  { opcode, (mask), (lose), "1,f,g", (flags) | F_FLOAT, v9 }
135276cad711SPaolo Bonzini #define fmrrd(opcode, mask, lose, flags) /* v9 */ \
135376cad711SPaolo Bonzini  { opcode, (mask), (lose), "1,B,H", (flags) | F_FLOAT, v9 }
135476cad711SPaolo Bonzini #define fmrrq(opcode, mask, lose, flags) /* v9 */ \
135576cad711SPaolo Bonzini  { opcode, (mask), (lose), "1,R,J", (flags) | F_FLOAT, v9 }
135676cad711SPaolo Bonzini 
135776cad711SPaolo Bonzini #define fmovrs(mop, mask, flags) /* v9 */ \
135876cad711SPaolo Bonzini   fmrrs(mop, F3(2, 0x35, 0)|OPF_LOW5(5)|RCOND(mask), F3(~2, ~0x35, 0)|OPF_LOW5(~5)|RCOND(~(mask)), (flags)) /* v9 */
135976cad711SPaolo Bonzini #define fmovrd(mop, mask, flags) /* v9 */ \
136076cad711SPaolo Bonzini   fmrrd(mop, F3(2, 0x35, 0)|OPF_LOW5(6)|RCOND(mask), F3(~2, ~0x35, 0)|OPF_LOW5(~6)|RCOND(~(mask)), (flags)) /* v9 */
136176cad711SPaolo Bonzini #define fmovrq(mop, mask, flags) /* v9 */ \
136276cad711SPaolo Bonzini   fmrrq(mop, F3(2, 0x35, 0)|OPF_LOW5(7)|RCOND(mask), F3(~2, ~0x35, 0)|OPF_LOW5(~7)|RCOND(~(mask)), (flags)) /* v9 */
136376cad711SPaolo Bonzini 
136476cad711SPaolo Bonzini /* v9 */ movr("movrne", 0x5, 0),
136576cad711SPaolo Bonzini /* v9 */ movr("movre", 0x1, 0),
136676cad711SPaolo Bonzini /* v9 */ movr("movrgez", 0x7, 0),
136776cad711SPaolo Bonzini /* v9 */ movr("movrlz", 0x3, 0),
136876cad711SPaolo Bonzini /* v9 */ movr("movrlez", 0x2, 0),
136976cad711SPaolo Bonzini /* v9 */ movr("movrgz", 0x6, 0),
137076cad711SPaolo Bonzini /* v9 */ movr("movrnz", 0x5, F_ALIAS),
137176cad711SPaolo Bonzini /* v9 */ movr("movrz", 0x1, F_ALIAS),
137276cad711SPaolo Bonzini 
137376cad711SPaolo Bonzini /* v9 */ fmovrs("fmovrsne", 0x5, 0),
137476cad711SPaolo Bonzini /* v9 */ fmovrs("fmovrse", 0x1, 0),
137576cad711SPaolo Bonzini /* v9 */ fmovrs("fmovrsgez", 0x7, 0),
137676cad711SPaolo Bonzini /* v9 */ fmovrs("fmovrslz", 0x3, 0),
137776cad711SPaolo Bonzini /* v9 */ fmovrs("fmovrslez", 0x2, 0),
137876cad711SPaolo Bonzini /* v9 */ fmovrs("fmovrsgz", 0x6, 0),
137976cad711SPaolo Bonzini /* v9 */ fmovrs("fmovrsnz", 0x5, F_ALIAS),
138076cad711SPaolo Bonzini /* v9 */ fmovrs("fmovrsz", 0x1, F_ALIAS),
138176cad711SPaolo Bonzini 
138276cad711SPaolo Bonzini /* v9 */ fmovrd("fmovrdne", 0x5, 0),
138376cad711SPaolo Bonzini /* v9 */ fmovrd("fmovrde", 0x1, 0),
138476cad711SPaolo Bonzini /* v9 */ fmovrd("fmovrdgez", 0x7, 0),
138576cad711SPaolo Bonzini /* v9 */ fmovrd("fmovrdlz", 0x3, 0),
138676cad711SPaolo Bonzini /* v9 */ fmovrd("fmovrdlez", 0x2, 0),
138776cad711SPaolo Bonzini /* v9 */ fmovrd("fmovrdgz", 0x6, 0),
138876cad711SPaolo Bonzini /* v9 */ fmovrd("fmovrdnz", 0x5, F_ALIAS),
138976cad711SPaolo Bonzini /* v9 */ fmovrd("fmovrdz", 0x1, F_ALIAS),
139076cad711SPaolo Bonzini 
139176cad711SPaolo Bonzini /* v9 */ fmovrq("fmovrqne", 0x5, 0),
139276cad711SPaolo Bonzini /* v9 */ fmovrq("fmovrqe", 0x1, 0),
139376cad711SPaolo Bonzini /* v9 */ fmovrq("fmovrqgez", 0x7, 0),
139476cad711SPaolo Bonzini /* v9 */ fmovrq("fmovrqlz", 0x3, 0),
139576cad711SPaolo Bonzini /* v9 */ fmovrq("fmovrqlez", 0x2, 0),
139676cad711SPaolo Bonzini /* v9 */ fmovrq("fmovrqgz", 0x6, 0),
139776cad711SPaolo Bonzini /* v9 */ fmovrq("fmovrqnz", 0x5, F_ALIAS),
139876cad711SPaolo Bonzini /* v9 */ fmovrq("fmovrqz", 0x1, F_ALIAS),
139976cad711SPaolo Bonzini 
140076cad711SPaolo Bonzini #undef movr /* v9 */
140176cad711SPaolo Bonzini #undef fmovr /* v9 */
140276cad711SPaolo Bonzini #undef fmrr /* v9 */
140376cad711SPaolo Bonzini 
140476cad711SPaolo Bonzini #define movicc(opcode, cond, flags) /* v9 */ \
140576cad711SPaolo Bonzini   { opcode, F3(2, 0x2c, 0)|MCOND(cond,1)|ICC, F3(~2, ~0x2c, ~0)|MCOND(~cond,~1)|XCC|(1<<11), "z,2,d", flags, v9 }, \
140676cad711SPaolo Bonzini   { opcode, F3(2, 0x2c, 1)|MCOND(cond,1)|ICC, F3(~2, ~0x2c, ~1)|MCOND(~cond,~1)|XCC|(1<<11), "z,I,d", flags, v9 }, \
140776cad711SPaolo Bonzini   { opcode, F3(2, 0x2c, 0)|MCOND(cond,1)|XCC, F3(~2, ~0x2c, ~0)|MCOND(~cond,~1)|(1<<11),     "Z,2,d", flags, v9 }, \
140876cad711SPaolo Bonzini   { opcode, F3(2, 0x2c, 1)|MCOND(cond,1)|XCC, F3(~2, ~0x2c, ~1)|MCOND(~cond,~1)|(1<<11),     "Z,I,d", flags, v9 }
140976cad711SPaolo Bonzini 
141076cad711SPaolo Bonzini #define movfcc(opcode, fcond, flags) /* v9 */ \
141176cad711SPaolo Bonzini   { opcode, F3(2, 0x2c, 0)|FCC(0)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~0)|F3(~2, ~0x2c, ~0), "6,2,d", flags, v9 }, \
141276cad711SPaolo Bonzini   { opcode, F3(2, 0x2c, 1)|FCC(0)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~0)|F3(~2, ~0x2c, ~1), "6,I,d", flags, v9 }, \
141376cad711SPaolo Bonzini   { opcode, F3(2, 0x2c, 0)|FCC(1)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~1)|F3(~2, ~0x2c, ~0), "7,2,d", flags, v9 }, \
141476cad711SPaolo Bonzini   { opcode, F3(2, 0x2c, 1)|FCC(1)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~1)|F3(~2, ~0x2c, ~1), "7,I,d", flags, v9 }, \
141576cad711SPaolo Bonzini   { opcode, F3(2, 0x2c, 0)|FCC(2)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~2)|F3(~2, ~0x2c, ~0), "8,2,d", flags, v9 }, \
141676cad711SPaolo Bonzini   { opcode, F3(2, 0x2c, 1)|FCC(2)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~2)|F3(~2, ~0x2c, ~1), "8,I,d", flags, v9 }, \
141776cad711SPaolo Bonzini   { opcode, F3(2, 0x2c, 0)|FCC(3)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~3)|F3(~2, ~0x2c, ~0), "9,2,d", flags, v9 }, \
141876cad711SPaolo Bonzini   { opcode, F3(2, 0x2c, 1)|FCC(3)|MCOND(fcond,0), MCOND(~fcond,~0)|FCC(~3)|F3(~2, ~0x2c, ~1), "9,I,d", flags, v9 }
141976cad711SPaolo Bonzini 
142076cad711SPaolo Bonzini #define movcc(opcode, cond, fcond, flags) /* v9 */ \
142176cad711SPaolo Bonzini   movfcc (opcode, fcond, flags), /* v9 */ \
142276cad711SPaolo Bonzini   movicc (opcode, cond, flags) /* v9 */
142376cad711SPaolo Bonzini 
142476cad711SPaolo Bonzini /* v9 */ movcc  ("mova",        CONDA, FCONDA, 0),
142576cad711SPaolo Bonzini /* v9 */ movicc ("movcc",       CONDCC, 0),
142676cad711SPaolo Bonzini /* v9 */ movicc ("movgeu",      CONDGEU, F_ALIAS),
142776cad711SPaolo Bonzini /* v9 */ movicc ("movcs",       CONDCS, 0),
142876cad711SPaolo Bonzini /* v9 */ movicc ("movlu",       CONDLU, F_ALIAS),
142976cad711SPaolo Bonzini /* v9 */ movcc  ("move",        CONDE, FCONDE, 0),
143076cad711SPaolo Bonzini /* v9 */ movcc  ("movg",        CONDG, FCONDG, 0),
143176cad711SPaolo Bonzini /* v9 */ movcc  ("movge",       CONDGE, FCONDGE, 0),
143276cad711SPaolo Bonzini /* v9 */ movicc ("movgu",       CONDGU, 0),
143376cad711SPaolo Bonzini /* v9 */ movcc  ("movl",        CONDL, FCONDL, 0),
143476cad711SPaolo Bonzini /* v9 */ movcc  ("movle",       CONDLE, FCONDLE, 0),
143576cad711SPaolo Bonzini /* v9 */ movicc ("movleu",      CONDLEU, 0),
143676cad711SPaolo Bonzini /* v9 */ movfcc ("movlg",       FCONDLG, 0),
143776cad711SPaolo Bonzini /* v9 */ movcc  ("movn",        CONDN, FCONDN, 0),
143876cad711SPaolo Bonzini /* v9 */ movcc  ("movne",       CONDNE, FCONDNE, 0),
143976cad711SPaolo Bonzini /* v9 */ movicc ("movneg",      CONDNEG, 0),
144076cad711SPaolo Bonzini /* v9 */ movcc  ("movnz",       CONDNZ, FCONDNZ, F_ALIAS),
144176cad711SPaolo Bonzini /* v9 */ movfcc ("movo",        FCONDO, 0),
144276cad711SPaolo Bonzini /* v9 */ movicc ("movpos",      CONDPOS, 0),
144376cad711SPaolo Bonzini /* v9 */ movfcc ("movu",        FCONDU, 0),
144476cad711SPaolo Bonzini /* v9 */ movfcc ("movue",       FCONDUE, 0),
144576cad711SPaolo Bonzini /* v9 */ movfcc ("movug",       FCONDUG, 0),
144676cad711SPaolo Bonzini /* v9 */ movfcc ("movuge",      FCONDUGE, 0),
144776cad711SPaolo Bonzini /* v9 */ movfcc ("movul",       FCONDUL, 0),
144876cad711SPaolo Bonzini /* v9 */ movfcc ("movule",      FCONDULE, 0),
144976cad711SPaolo Bonzini /* v9 */ movicc ("movvc",       CONDVC, 0),
145076cad711SPaolo Bonzini /* v9 */ movicc ("movvs",       CONDVS, 0),
145176cad711SPaolo Bonzini /* v9 */ movcc  ("movz",        CONDZ, FCONDZ, F_ALIAS),
145276cad711SPaolo Bonzini 
145376cad711SPaolo Bonzini #undef movicc /* v9 */
145476cad711SPaolo Bonzini #undef movfcc /* v9 */
145576cad711SPaolo Bonzini #undef movcc /* v9 */
145676cad711SPaolo Bonzini 
145776cad711SPaolo Bonzini #define FM_SF 1         /* v9 - values for fpsize */
145876cad711SPaolo Bonzini #define FM_DF 2         /* v9 */
145976cad711SPaolo Bonzini #define FM_QF 3         /* v9 */
146076cad711SPaolo Bonzini 
146176cad711SPaolo Bonzini #define fmoviccx(opcode, fpsize, args, cond, flags) /* v9 */ \
146276cad711SPaolo Bonzini { opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z," args, flags, v9 }, \
146376cad711SPaolo Bonzini { opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z," args, flags, v9 }
146476cad711SPaolo Bonzini 
146576cad711SPaolo Bonzini #define fmovfccx(opcode, fpsize, args, fcond, flags) /* v9 */ \
146676cad711SPaolo Bonzini { opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags, v9 }, \
146776cad711SPaolo Bonzini { opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags, v9 }, \
146876cad711SPaolo Bonzini { opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags, v9 }, \
146976cad711SPaolo Bonzini { opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags, v9 }
147076cad711SPaolo Bonzini 
147176cad711SPaolo Bonzini /* FIXME: use fmovicc/fmovfcc? */ /* v9 */
147276cad711SPaolo Bonzini #define fmovccx(opcode, fpsize, args, cond, fcond, flags) /* v9 */ \
147376cad711SPaolo Bonzini { opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0),  "z," args, flags | F_FLOAT, v9 }, \
147476cad711SPaolo Bonzini { opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags | F_FLOAT, v9 }, \
147576cad711SPaolo Bonzini { opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0),  F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0),  "Z," args, flags | F_FLOAT, v9 }, \
147676cad711SPaolo Bonzini { opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags | F_FLOAT, v9 }, \
147776cad711SPaolo Bonzini { opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags | F_FLOAT, v9 }, \
147876cad711SPaolo Bonzini { opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags | F_FLOAT, v9 }
147976cad711SPaolo Bonzini 
148076cad711SPaolo Bonzini #define fmovicc(suffix, cond, flags) /* v9 */ \
148176cad711SPaolo Bonzini fmoviccx("fmovd" suffix, FM_DF, "B,H", cond, flags),            \
148276cad711SPaolo Bonzini fmoviccx("fmovq" suffix, FM_QF, "R,J", cond, flags),            \
148376cad711SPaolo Bonzini fmoviccx("fmovs" suffix, FM_SF, "f,g", cond, flags)
148476cad711SPaolo Bonzini 
148576cad711SPaolo Bonzini #define fmovfcc(suffix, fcond, flags) /* v9 */ \
148676cad711SPaolo Bonzini fmovfccx("fmovd" suffix, FM_DF, "B,H", fcond, flags),           \
148776cad711SPaolo Bonzini fmovfccx("fmovq" suffix, FM_QF, "R,J", fcond, flags),           \
148876cad711SPaolo Bonzini fmovfccx("fmovs" suffix, FM_SF, "f,g", fcond, flags)
148976cad711SPaolo Bonzini 
149076cad711SPaolo Bonzini #define fmovcc(suffix, cond, fcond, flags) /* v9 */ \
149176cad711SPaolo Bonzini fmovccx("fmovd" suffix, FM_DF, "B,H", cond, fcond, flags),      \
149276cad711SPaolo Bonzini fmovccx("fmovq" suffix, FM_QF, "R,J", cond, fcond, flags),      \
149376cad711SPaolo Bonzini fmovccx("fmovs" suffix, FM_SF, "f,g", cond, fcond, flags)
149476cad711SPaolo Bonzini 
149576cad711SPaolo Bonzini /* v9 */ fmovcc  ("a", CONDA, FCONDA, 0),
149676cad711SPaolo Bonzini /* v9 */ fmovicc ("cc", CONDCC, 0),
149776cad711SPaolo Bonzini /* v9 */ fmovicc ("cs", CONDCS, 0),
149876cad711SPaolo Bonzini /* v9 */ fmovcc  ("e", CONDE, FCONDE, 0),
149976cad711SPaolo Bonzini /* v9 */ fmovcc  ("g", CONDG, FCONDG, 0),
150076cad711SPaolo Bonzini /* v9 */ fmovcc  ("ge", CONDGE, FCONDGE, 0),
150176cad711SPaolo Bonzini /* v9 */ fmovicc ("geu", CONDGEU, F_ALIAS),
150276cad711SPaolo Bonzini /* v9 */ fmovicc ("gu", CONDGU, 0),
150376cad711SPaolo Bonzini /* v9 */ fmovcc  ("l", CONDL, FCONDL, 0),
150476cad711SPaolo Bonzini /* v9 */ fmovcc  ("le", CONDLE, FCONDLE, 0),
150576cad711SPaolo Bonzini /* v9 */ fmovicc ("leu", CONDLEU, 0),
150676cad711SPaolo Bonzini /* v9 */ fmovfcc ("lg", FCONDLG, 0),
150776cad711SPaolo Bonzini /* v9 */ fmovicc ("lu", CONDLU, F_ALIAS),
150876cad711SPaolo Bonzini /* v9 */ fmovcc  ("n", CONDN, FCONDN, 0),
150976cad711SPaolo Bonzini /* v9 */ fmovcc  ("ne", CONDNE, FCONDNE, 0),
151076cad711SPaolo Bonzini /* v9 */ fmovicc ("neg", CONDNEG, 0),
151176cad711SPaolo Bonzini /* v9 */ fmovcc  ("nz", CONDNZ, FCONDNZ, F_ALIAS),
151276cad711SPaolo Bonzini /* v9 */ fmovfcc ("o", FCONDO, 0),
151376cad711SPaolo Bonzini /* v9 */ fmovicc ("pos", CONDPOS, 0),
151476cad711SPaolo Bonzini /* v9 */ fmovfcc ("u", FCONDU, 0),
151576cad711SPaolo Bonzini /* v9 */ fmovfcc ("ue", FCONDUE, 0),
151676cad711SPaolo Bonzini /* v9 */ fmovfcc ("ug", FCONDUG, 0),
151776cad711SPaolo Bonzini /* v9 */ fmovfcc ("uge", FCONDUGE, 0),
151876cad711SPaolo Bonzini /* v9 */ fmovfcc ("ul", FCONDUL, 0),
151976cad711SPaolo Bonzini /* v9 */ fmovfcc ("ule", FCONDULE, 0),
152076cad711SPaolo Bonzini /* v9 */ fmovicc ("vc", CONDVC, 0),
152176cad711SPaolo Bonzini /* v9 */ fmovicc ("vs", CONDVS, 0),
152276cad711SPaolo Bonzini /* v9 */ fmovcc  ("z", CONDZ, FCONDZ, F_ALIAS),
152376cad711SPaolo Bonzini 
152476cad711SPaolo Bonzini #undef fmoviccx /* v9 */
152576cad711SPaolo Bonzini #undef fmovfccx /* v9 */
152676cad711SPaolo Bonzini #undef fmovccx /* v9 */
152776cad711SPaolo Bonzini #undef fmovicc /* v9 */
152876cad711SPaolo Bonzini #undef fmovfcc /* v9 */
152976cad711SPaolo Bonzini #undef fmovcc /* v9 */
153076cad711SPaolo Bonzini #undef FM_DF /* v9 */
153176cad711SPaolo Bonzini #undef FM_QF /* v9 */
153276cad711SPaolo Bonzini #undef FM_SF /* v9 */
153376cad711SPaolo Bonzini 
153476cad711SPaolo Bonzini /* Coprocessor branches.  */
153576cad711SPaolo Bonzini #define CBR(opcode, mask, lose, flags, arch) \
153676cad711SPaolo Bonzini  { opcode, (mask), ANNUL | (lose), "l",    flags | F_DELAYED, arch }, \
153776cad711SPaolo Bonzini  { opcode, (mask) | ANNUL, (lose), ",a l", flags | F_DELAYED, arch }
153876cad711SPaolo Bonzini 
153976cad711SPaolo Bonzini /* Floating point branches.  */
154076cad711SPaolo Bonzini #define FBR(opcode, mask, lose, flags) \
154176cad711SPaolo Bonzini  { opcode, (mask), ANNUL | (lose), "l",    flags | F_DELAYED | F_FBR, v6 }, \
154276cad711SPaolo Bonzini  { opcode, (mask) | ANNUL, (lose), ",a l", flags | F_DELAYED | F_FBR, v6 }
154376cad711SPaolo Bonzini 
154476cad711SPaolo Bonzini /* V9 extended floating point branches.  */
154576cad711SPaolo Bonzini #define FBRX(opcode, mask, lose, flags) /* v9 */ \
154676cad711SPaolo Bonzini  { opcode, FBFCC(0)|(mask)|BPRED, ANNUL|FBFCC(~0)|(lose), "6,G",      flags|F_DELAYED|F_FBR, v9 }, \
154776cad711SPaolo Bonzini  { opcode, FBFCC(0)|(mask)|BPRED, ANNUL|FBFCC(~0)|(lose), ",T 6,G",   flags|F_DELAYED|F_FBR, v9 }, \
154876cad711SPaolo Bonzini  { opcode, FBFCC(0)|(mask)|BPRED|ANNUL, FBFCC(~0)|(lose), ",a 6,G",   flags|F_DELAYED|F_FBR, v9 }, \
154976cad711SPaolo Bonzini  { opcode, FBFCC(0)|(mask)|BPRED|ANNUL, FBFCC(~0)|(lose), ",a,T 6,G", flags|F_DELAYED|F_FBR, v9 }, \
155076cad711SPaolo Bonzini  { opcode, FBFCC(0)|(mask), ANNUL|BPRED|FBFCC(~0)|(lose), ",N 6,G",   flags|F_DELAYED|F_FBR, v9 }, \
155176cad711SPaolo Bonzini  { opcode, FBFCC(0)|(mask)|ANNUL, BPRED|FBFCC(~0)|(lose), ",a,N 6,G", flags|F_DELAYED|F_FBR, v9 }, \
155276cad711SPaolo Bonzini  { opcode, FBFCC(1)|(mask)|BPRED, ANNUL|FBFCC(~1)|(lose), "7,G",      flags|F_DELAYED|F_FBR, v9 }, \
155376cad711SPaolo Bonzini  { opcode, FBFCC(1)|(mask)|BPRED, ANNUL|FBFCC(~1)|(lose), ",T 7,G",   flags|F_DELAYED|F_FBR, v9 }, \
155476cad711SPaolo Bonzini  { opcode, FBFCC(1)|(mask)|BPRED|ANNUL, FBFCC(~1)|(lose), ",a 7,G",   flags|F_DELAYED|F_FBR, v9 }, \
155576cad711SPaolo Bonzini  { opcode, FBFCC(1)|(mask)|BPRED|ANNUL, FBFCC(~1)|(lose), ",a,T 7,G", flags|F_DELAYED|F_FBR, v9 }, \
155676cad711SPaolo Bonzini  { opcode, FBFCC(1)|(mask), ANNUL|BPRED|FBFCC(~1)|(lose), ",N 7,G",   flags|F_DELAYED|F_FBR, v9 }, \
155776cad711SPaolo Bonzini  { opcode, FBFCC(1)|(mask)|ANNUL, BPRED|FBFCC(~1)|(lose), ",a,N 7,G", flags|F_DELAYED|F_FBR, v9 }, \
155876cad711SPaolo Bonzini  { opcode, FBFCC(2)|(mask)|BPRED, ANNUL|FBFCC(~2)|(lose), "8,G",      flags|F_DELAYED|F_FBR, v9 }, \
155976cad711SPaolo Bonzini  { opcode, FBFCC(2)|(mask)|BPRED, ANNUL|FBFCC(~2)|(lose), ",T 8,G",   flags|F_DELAYED|F_FBR, v9 }, \
156076cad711SPaolo Bonzini  { opcode, FBFCC(2)|(mask)|BPRED|ANNUL, FBFCC(~2)|(lose), ",a 8,G",   flags|F_DELAYED|F_FBR, v9 }, \
156176cad711SPaolo Bonzini  { opcode, FBFCC(2)|(mask)|BPRED|ANNUL, FBFCC(~2)|(lose), ",a,T 8,G", flags|F_DELAYED|F_FBR, v9 }, \
156276cad711SPaolo Bonzini  { opcode, FBFCC(2)|(mask), ANNUL|BPRED|FBFCC(~2)|(lose), ",N 8,G",   flags|F_DELAYED|F_FBR, v9 }, \
156376cad711SPaolo Bonzini  { opcode, FBFCC(2)|(mask)|ANNUL, BPRED|FBFCC(~2)|(lose), ",a,N 8,G", flags|F_DELAYED|F_FBR, v9 }, \
156476cad711SPaolo Bonzini  { opcode, FBFCC(3)|(mask)|BPRED, ANNUL|FBFCC(~3)|(lose), "9,G",      flags|F_DELAYED|F_FBR, v9 }, \
156576cad711SPaolo Bonzini  { opcode, FBFCC(3)|(mask)|BPRED, ANNUL|FBFCC(~3)|(lose), ",T 9,G",   flags|F_DELAYED|F_FBR, v9 }, \
156676cad711SPaolo Bonzini  { opcode, FBFCC(3)|(mask)|BPRED|ANNUL, FBFCC(~3)|(lose), ",a 9,G",   flags|F_DELAYED|F_FBR, v9 }, \
156776cad711SPaolo Bonzini  { opcode, FBFCC(3)|(mask)|BPRED|ANNUL, FBFCC(~3)|(lose), ",a,T 9,G", flags|F_DELAYED|F_FBR, v9 }, \
156876cad711SPaolo Bonzini  { opcode, FBFCC(3)|(mask), ANNUL|BPRED|FBFCC(~3)|(lose), ",N 9,G",   flags|F_DELAYED|F_FBR, v9 }, \
156976cad711SPaolo Bonzini  { opcode, FBFCC(3)|(mask)|ANNUL, BPRED|FBFCC(~3)|(lose), ",a,N 9,G", flags|F_DELAYED|F_FBR, v9 }
157076cad711SPaolo Bonzini 
157176cad711SPaolo Bonzini /* v9: We must put `FBRX' before `FBR', to ensure that we never match
157276cad711SPaolo Bonzini    v9: something against an expression unless it is an expression.  Otherwise,
157376cad711SPaolo Bonzini    v9: we end up with undefined symbol tables entries, because they get added,
157476cad711SPaolo Bonzini    v9: but are not deleted if the pattern fails to match.  */
157576cad711SPaolo Bonzini 
157676cad711SPaolo Bonzini #define CONDFC(fop, cop, mask, flags) \
157776cad711SPaolo Bonzini   FBRX(fop, F2(0, 5)|COND(mask), F2(~0, ~5)|COND(~(mask)), flags), /* v9 */ \
157876cad711SPaolo Bonzini   FBR(fop, F2(0, 6)|COND(mask), F2(~0, ~6)|COND(~(mask)), flags), \
157976cad711SPaolo Bonzini   CBR(cop, F2(0, 7)|COND(mask), F2(~0, ~7)|COND(~(mask)), flags, v6notlet)
158076cad711SPaolo Bonzini 
158176cad711SPaolo Bonzini #define CONDFCL(fop, cop, mask, flags) \
158276cad711SPaolo Bonzini   FBRX(fop, F2(0, 5)|COND(mask), F2(~0, ~5)|COND(~(mask)), flags), /* v9 */ \
158376cad711SPaolo Bonzini   FBR(fop, F2(0, 6)|COND(mask), F2(~0, ~6)|COND(~(mask)), flags), \
158476cad711SPaolo Bonzini   CBR(cop, F2(0, 7)|COND(mask), F2(~0, ~7)|COND(~(mask)), flags, v6)
158576cad711SPaolo Bonzini 
158676cad711SPaolo Bonzini #define CONDF(fop, mask, flags) \
158776cad711SPaolo Bonzini   FBRX(fop, F2(0, 5)|COND(mask), F2(~0, ~5)|COND(~(mask)), flags), /* v9 */ \
158876cad711SPaolo Bonzini   FBR(fop, F2(0, 6)|COND(mask), F2(~0, ~6)|COND(~(mask)), flags)
158976cad711SPaolo Bonzini 
159076cad711SPaolo Bonzini CONDFC  ("fb",    "cb",    0x8, F_UNBR),
159176cad711SPaolo Bonzini CONDFCL ("fba",   "cba",   0x8, F_UNBR|F_ALIAS),
159276cad711SPaolo Bonzini CONDFC  ("fbe",   "cb0",   0x9, F_CONDBR),
159376cad711SPaolo Bonzini CONDF   ("fbz",            0x9, F_CONDBR|F_ALIAS),
159476cad711SPaolo Bonzini CONDFC  ("fbg",   "cb2",   0x6, F_CONDBR),
159576cad711SPaolo Bonzini CONDFC  ("fbge",  "cb02",  0xb, F_CONDBR),
159676cad711SPaolo Bonzini CONDFC  ("fbl",   "cb1",   0x4, F_CONDBR),
159776cad711SPaolo Bonzini CONDFC  ("fble",  "cb01",  0xd, F_CONDBR),
159876cad711SPaolo Bonzini CONDFC  ("fblg",  "cb12",  0x2, F_CONDBR),
159976cad711SPaolo Bonzini CONDFCL ("fbn",   "cbn",   0x0, F_UNBR),
160076cad711SPaolo Bonzini CONDFC  ("fbne",  "cb123", 0x1, F_CONDBR),
160176cad711SPaolo Bonzini CONDF   ("fbnz",           0x1, F_CONDBR|F_ALIAS),
160276cad711SPaolo Bonzini CONDFC  ("fbo",   "cb012", 0xf, F_CONDBR),
160376cad711SPaolo Bonzini CONDFC  ("fbu",   "cb3",   0x7, F_CONDBR),
160476cad711SPaolo Bonzini CONDFC  ("fbue",  "cb03",  0xa, F_CONDBR),
160576cad711SPaolo Bonzini CONDFC  ("fbug",  "cb23",  0x5, F_CONDBR),
160676cad711SPaolo Bonzini CONDFC  ("fbuge", "cb023", 0xc, F_CONDBR),
160776cad711SPaolo Bonzini CONDFC  ("fbul",  "cb13",  0x3, F_CONDBR),
160876cad711SPaolo Bonzini CONDFC  ("fbule", "cb013", 0xe, F_CONDBR),
160976cad711SPaolo Bonzini 
161076cad711SPaolo Bonzini #undef CONDFC
161176cad711SPaolo Bonzini #undef CONDFCL
161276cad711SPaolo Bonzini #undef CONDF
161376cad711SPaolo Bonzini #undef CBR
161476cad711SPaolo Bonzini #undef FBR
161576cad711SPaolo Bonzini #undef FBRX     /* v9 */
161676cad711SPaolo Bonzini 
161776cad711SPaolo Bonzini { "jmp",        F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|RD_G0|ASI(~0),        "1+2", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+rs2,%g0 */
161876cad711SPaolo Bonzini { "jmp",        F3(2, 0x38, 0), F3(~2, ~0x38, ~0)|RD_G0|ASI_RS2(~0),    "1", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+%g0,%g0 */
161976cad711SPaolo Bonzini { "jmp",        F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0,                "1+i", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+i,%g0 */
162076cad711SPaolo Bonzini { "jmp",        F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0,                "i+1", F_UNBR|F_DELAYED, v6 }, /* jmpl i+rs1,%g0 */
162176cad711SPaolo Bonzini { "jmp",        F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0|RS1_G0,         "i", F_UNBR|F_DELAYED, v6 }, /* jmpl %g0+i,%g0 */
162276cad711SPaolo Bonzini { "jmp",        F3(2, 0x38, 1), F3(~2, ~0x38, ~1)|RD_G0|SIMM13(~0),     "1", F_UNBR|F_DELAYED, v6 }, /* jmpl rs1+0,%g0 */
162376cad711SPaolo Bonzini 
162476cad711SPaolo Bonzini { "nop",        F2(0, 4), 0xfeffffff, "", 0, v6 }, /* sethi 0, %g0 */
162576cad711SPaolo Bonzini 
162676cad711SPaolo Bonzini { "set",        F2(0x0, 0x4), F2(~0x0, ~0x4), "S0,d", F_ALIAS, v6 },
162776cad711SPaolo Bonzini { "setuw",      F2(0x0, 0x4), F2(~0x0, ~0x4), "S0,d", F_ALIAS, v9 },
162876cad711SPaolo Bonzini { "setsw",      F2(0x0, 0x4), F2(~0x0, ~0x4), "S0,d", F_ALIAS, v9 },
162976cad711SPaolo Bonzini { "setx",       F2(0x0, 0x4), F2(~0x0, ~0x4), "S0,1,d", F_ALIAS, v9 },
163076cad711SPaolo Bonzini 
163176cad711SPaolo Bonzini { "sethi",      F2(0x0, 0x4), F2(~0x0, ~0x4), "h,d", 0, v6 },
163276cad711SPaolo Bonzini 
163376cad711SPaolo Bonzini { "taddcc",     F3(2, 0x20, 0), F3(~2, ~0x20, ~0)|ASI(~0),      "1,2,d", 0, v6 },
163476cad711SPaolo Bonzini { "taddcc",     F3(2, 0x20, 1), F3(~2, ~0x20, ~1),              "1,i,d", 0, v6 },
163576cad711SPaolo Bonzini { "taddcc",     F3(2, 0x20, 1), F3(~2, ~0x20, ~1),              "i,1,d", 0, v6 },
163676cad711SPaolo Bonzini { "taddcctv",   F3(2, 0x22, 0), F3(~2, ~0x22, ~0)|ASI(~0),      "1,2,d", 0, v6 },
163776cad711SPaolo Bonzini { "taddcctv",   F3(2, 0x22, 1), F3(~2, ~0x22, ~1),              "1,i,d", 0, v6 },
163876cad711SPaolo Bonzini { "taddcctv",   F3(2, 0x22, 1), F3(~2, ~0x22, ~1),              "i,1,d", 0, v6 },
163976cad711SPaolo Bonzini 
164076cad711SPaolo Bonzini { "tsubcc",     F3(2, 0x21, 0), F3(~2, ~0x21, ~0)|ASI(~0),      "1,2,d", 0, v6 },
164176cad711SPaolo Bonzini { "tsubcc",     F3(2, 0x21, 1), F3(~2, ~0x21, ~1),              "1,i,d", 0, v6 },
164276cad711SPaolo Bonzini { "tsubcctv",   F3(2, 0x23, 0), F3(~2, ~0x23, ~0)|ASI(~0),      "1,2,d", 0, v6 },
164376cad711SPaolo Bonzini { "tsubcctv",   F3(2, 0x23, 1), F3(~2, ~0x23, ~1),              "1,i,d", 0, v6 },
164476cad711SPaolo Bonzini 
164576cad711SPaolo Bonzini { "unimp",      F2(0x0, 0x0), 0xffc00000, "n", 0, v6notv9 },
164676cad711SPaolo Bonzini { "illtrap",    F2(0, 0), F2(~0, ~0)|RD_G0, "n", 0, v9 },
164776cad711SPaolo Bonzini 
164876cad711SPaolo Bonzini /* This *is* a commutative instruction.  */
164976cad711SPaolo Bonzini { "xnor",       F3(2, 0x07, 0), F3(~2, ~0x07, ~0)|ASI(~0),      "1,2,d", 0, v6 },
165076cad711SPaolo Bonzini { "xnor",       F3(2, 0x07, 1), F3(~2, ~0x07, ~1),              "1,i,d", 0, v6 },
165176cad711SPaolo Bonzini { "xnor",       F3(2, 0x07, 1), F3(~2, ~0x07, ~1),              "i,1,d", 0, v6 },
165276cad711SPaolo Bonzini /* This *is* a commutative instruction.  */
165376cad711SPaolo Bonzini { "xnorcc",     F3(2, 0x17, 0), F3(~2, ~0x17, ~0)|ASI(~0),      "1,2,d", 0, v6 },
165476cad711SPaolo Bonzini { "xnorcc",     F3(2, 0x17, 1), F3(~2, ~0x17, ~1),              "1,i,d", 0, v6 },
165576cad711SPaolo Bonzini { "xnorcc",     F3(2, 0x17, 1), F3(~2, ~0x17, ~1),              "i,1,d", 0, v6 },
165676cad711SPaolo Bonzini { "xor",        F3(2, 0x03, 0), F3(~2, ~0x03, ~0)|ASI(~0),      "1,2,d", 0, v6 },
165776cad711SPaolo Bonzini { "xor",        F3(2, 0x03, 1), F3(~2, ~0x03, ~1),              "1,i,d", 0, v6 },
165876cad711SPaolo Bonzini { "xor",        F3(2, 0x03, 1), F3(~2, ~0x03, ~1),              "i,1,d", 0, v6 },
165976cad711SPaolo Bonzini { "xorcc",      F3(2, 0x13, 0), F3(~2, ~0x13, ~0)|ASI(~0),      "1,2,d", 0, v6 },
166076cad711SPaolo Bonzini { "xorcc",      F3(2, 0x13, 1), F3(~2, ~0x13, ~1),              "1,i,d", 0, v6 },
166176cad711SPaolo Bonzini { "xorcc",      F3(2, 0x13, 1), F3(~2, ~0x13, ~1),              "i,1,d", 0, v6 },
166276cad711SPaolo Bonzini 
166376cad711SPaolo Bonzini { "not",        F3(2, 0x07, 0), F3(~2, ~0x07, ~0)|ASI(~0), "1,d", F_ALIAS, v6 }, /* xnor rs1,%0,rd */
166476cad711SPaolo Bonzini { "not",        F3(2, 0x07, 0), F3(~2, ~0x07, ~0)|ASI(~0), "r", F_ALIAS, v6 }, /* xnor rd,%0,rd */
166576cad711SPaolo Bonzini 
166676cad711SPaolo Bonzini { "btog",       F3(2, 0x03, 0), F3(~2, ~0x03, ~0)|ASI(~0),      "2,r", F_ALIAS, v6 }, /* xor rd,rs2,rd */
166776cad711SPaolo Bonzini { "btog",       F3(2, 0x03, 1), F3(~2, ~0x03, ~1),              "i,r", F_ALIAS, v6 }, /* xor rd,i,rd */
166876cad711SPaolo Bonzini 
166976cad711SPaolo Bonzini /* FPop1 and FPop2 are not instructions.  Don't accept them.  */
167076cad711SPaolo Bonzini 
167176cad711SPaolo Bonzini { "fdtoi",      F3F(2, 0x34, 0x0d2), F3F(~2, ~0x34, ~0x0d2)|RS1_G0, "B,g", F_FLOAT, v6 },
167276cad711SPaolo Bonzini { "fstoi",      F3F(2, 0x34, 0x0d1), F3F(~2, ~0x34, ~0x0d1)|RS1_G0, "f,g", F_FLOAT, v6 },
167376cad711SPaolo Bonzini { "fqtoi",      F3F(2, 0x34, 0x0d3), F3F(~2, ~0x34, ~0x0d3)|RS1_G0, "R,g", F_FLOAT, v8 },
167476cad711SPaolo Bonzini 
167576cad711SPaolo Bonzini { "fdtox",      F3F(2, 0x34, 0x082), F3F(~2, ~0x34, ~0x082)|RS1_G0, "B,H", F_FLOAT, v9 },
167676cad711SPaolo Bonzini { "fstox",      F3F(2, 0x34, 0x081), F3F(~2, ~0x34, ~0x081)|RS1_G0, "f,H", F_FLOAT, v9 },
167776cad711SPaolo Bonzini { "fqtox",      F3F(2, 0x34, 0x083), F3F(~2, ~0x34, ~0x083)|RS1_G0, "R,H", F_FLOAT, v9 },
167876cad711SPaolo Bonzini 
167976cad711SPaolo Bonzini { "fitod",      F3F(2, 0x34, 0x0c8), F3F(~2, ~0x34, ~0x0c8)|RS1_G0, "f,H", F_FLOAT, v6 },
168076cad711SPaolo Bonzini { "fitos",      F3F(2, 0x34, 0x0c4), F3F(~2, ~0x34, ~0x0c4)|RS1_G0, "f,g", F_FLOAT, v6 },
168176cad711SPaolo Bonzini { "fitoq",      F3F(2, 0x34, 0x0cc), F3F(~2, ~0x34, ~0x0cc)|RS1_G0, "f,J", F_FLOAT, v8 },
168276cad711SPaolo Bonzini 
168376cad711SPaolo Bonzini { "fxtod",      F3F(2, 0x34, 0x088), F3F(~2, ~0x34, ~0x088)|RS1_G0, "B,H", F_FLOAT, v9 },
168476cad711SPaolo Bonzini { "fxtos",      F3F(2, 0x34, 0x084), F3F(~2, ~0x34, ~0x084)|RS1_G0, "B,g", F_FLOAT, v9 },
168576cad711SPaolo Bonzini { "fxtoq",      F3F(2, 0x34, 0x08c), F3F(~2, ~0x34, ~0x08c)|RS1_G0, "B,J", F_FLOAT, v9 },
168676cad711SPaolo Bonzini 
168776cad711SPaolo Bonzini { "fdtoq",      F3F(2, 0x34, 0x0ce), F3F(~2, ~0x34, ~0x0ce)|RS1_G0, "B,J", F_FLOAT, v8 },
168876cad711SPaolo Bonzini { "fdtos",      F3F(2, 0x34, 0x0c6), F3F(~2, ~0x34, ~0x0c6)|RS1_G0, "B,g", F_FLOAT, v6 },
168976cad711SPaolo Bonzini { "fqtod",      F3F(2, 0x34, 0x0cb), F3F(~2, ~0x34, ~0x0cb)|RS1_G0, "R,H", F_FLOAT, v8 },
169076cad711SPaolo Bonzini { "fqtos",      F3F(2, 0x34, 0x0c7), F3F(~2, ~0x34, ~0x0c7)|RS1_G0, "R,g", F_FLOAT, v8 },
169176cad711SPaolo Bonzini { "fstod",      F3F(2, 0x34, 0x0c9), F3F(~2, ~0x34, ~0x0c9)|RS1_G0, "f,H", F_FLOAT, v6 },
169276cad711SPaolo Bonzini { "fstoq",      F3F(2, 0x34, 0x0cd), F3F(~2, ~0x34, ~0x0cd)|RS1_G0, "f,J", F_FLOAT, v8 },
169376cad711SPaolo Bonzini 
169476cad711SPaolo Bonzini { "fdivd",      F3F(2, 0x34, 0x04e), F3F(~2, ~0x34, ~0x04e), "v,B,H", F_FLOAT, v6 },
169576cad711SPaolo Bonzini { "fdivq",      F3F(2, 0x34, 0x04f), F3F(~2, ~0x34, ~0x04f), "V,R,J", F_FLOAT, v8 },
169676cad711SPaolo Bonzini { "fdivx",      F3F(2, 0x34, 0x04f), F3F(~2, ~0x34, ~0x04f), "V,R,J", F_FLOAT|F_ALIAS, v8 },
169776cad711SPaolo Bonzini { "fdivs",      F3F(2, 0x34, 0x04d), F3F(~2, ~0x34, ~0x04d), "e,f,g", F_FLOAT, v6 },
169876cad711SPaolo Bonzini { "fmuld",      F3F(2, 0x34, 0x04a), F3F(~2, ~0x34, ~0x04a), "v,B,H", F_FLOAT, v6 },
169976cad711SPaolo Bonzini { "fmulq",      F3F(2, 0x34, 0x04b), F3F(~2, ~0x34, ~0x04b), "V,R,J", F_FLOAT, v8 },
170076cad711SPaolo Bonzini { "fmulx",      F3F(2, 0x34, 0x04b), F3F(~2, ~0x34, ~0x04b), "V,R,J", F_FLOAT|F_ALIAS, v8 },
170176cad711SPaolo Bonzini { "fmuls",      F3F(2, 0x34, 0x049), F3F(~2, ~0x34, ~0x049), "e,f,g", F_FLOAT, v6 },
170276cad711SPaolo Bonzini 
170376cad711SPaolo Bonzini { "fdmulq",     F3F(2, 0x34, 0x06e), F3F(~2, ~0x34, ~0x06e), "v,B,J", F_FLOAT, v8 },
170476cad711SPaolo Bonzini { "fdmulx",     F3F(2, 0x34, 0x06e), F3F(~2, ~0x34, ~0x06e), "v,B,J", F_FLOAT|F_ALIAS, v8 },
170576cad711SPaolo Bonzini { "fsmuld",     F3F(2, 0x34, 0x069), F3F(~2, ~0x34, ~0x069), "e,f,H", F_FLOAT, v8 },
170676cad711SPaolo Bonzini 
170776cad711SPaolo Bonzini { "fsqrtd",     F3F(2, 0x34, 0x02a), F3F(~2, ~0x34, ~0x02a)|RS1_G0, "B,H", F_FLOAT, v7 },
170876cad711SPaolo Bonzini { "fsqrtq",     F3F(2, 0x34, 0x02b), F3F(~2, ~0x34, ~0x02b)|RS1_G0, "R,J", F_FLOAT, v8 },
170976cad711SPaolo Bonzini { "fsqrtx",     F3F(2, 0x34, 0x02b), F3F(~2, ~0x34, ~0x02b)|RS1_G0, "R,J", F_FLOAT|F_ALIAS, v8 },
171076cad711SPaolo Bonzini { "fsqrts",     F3F(2, 0x34, 0x029), F3F(~2, ~0x34, ~0x029)|RS1_G0, "f,g", F_FLOAT, v7 },
171176cad711SPaolo Bonzini 
171276cad711SPaolo Bonzini { "fabsd",      F3F(2, 0x34, 0x00a), F3F(~2, ~0x34, ~0x00a)|RS1_G0, "B,H", F_FLOAT, v9 },
171376cad711SPaolo Bonzini { "fabsq",      F3F(2, 0x34, 0x00b), F3F(~2, ~0x34, ~0x00b)|RS1_G0, "R,J", F_FLOAT, v9 },
171476cad711SPaolo Bonzini { "fabsx",      F3F(2, 0x34, 0x00b), F3F(~2, ~0x34, ~0x00b)|RS1_G0, "R,J", F_FLOAT|F_ALIAS, v9 },
171576cad711SPaolo Bonzini { "fabss",      F3F(2, 0x34, 0x009), F3F(~2, ~0x34, ~0x009)|RS1_G0, "f,g", F_FLOAT, v6 },
171676cad711SPaolo Bonzini { "fmovd",      F3F(2, 0x34, 0x002), F3F(~2, ~0x34, ~0x002)|RS1_G0, "B,H", F_FLOAT, v9 },
171776cad711SPaolo Bonzini { "fmovq",      F3F(2, 0x34, 0x003), F3F(~2, ~0x34, ~0x003)|RS1_G0, "R,J", F_FLOAT, v9 },
171876cad711SPaolo Bonzini { "fmovx",      F3F(2, 0x34, 0x003), F3F(~2, ~0x34, ~0x003)|RS1_G0, "R,J", F_FLOAT|F_ALIAS, v9 },
171976cad711SPaolo Bonzini { "fmovs",      F3F(2, 0x34, 0x001), F3F(~2, ~0x34, ~0x001)|RS1_G0, "f,g", F_FLOAT, v6 },
172076cad711SPaolo Bonzini { "fnegd",      F3F(2, 0x34, 0x006), F3F(~2, ~0x34, ~0x006)|RS1_G0, "B,H", F_FLOAT, v9 },
172176cad711SPaolo Bonzini { "fnegq",      F3F(2, 0x34, 0x007), F3F(~2, ~0x34, ~0x007)|RS1_G0, "R,J", F_FLOAT, v9 },
172276cad711SPaolo Bonzini { "fnegx",      F3F(2, 0x34, 0x007), F3F(~2, ~0x34, ~0x007)|RS1_G0, "R,J", F_FLOAT|F_ALIAS, v9 },
172376cad711SPaolo Bonzini { "fnegs",      F3F(2, 0x34, 0x005), F3F(~2, ~0x34, ~0x005)|RS1_G0, "f,g", F_FLOAT, v6 },
172476cad711SPaolo Bonzini 
172576cad711SPaolo Bonzini { "faddd",      F3F(2, 0x34, 0x042), F3F(~2, ~0x34, ~0x042), "v,B,H", F_FLOAT, v6 },
172676cad711SPaolo Bonzini { "faddq",      F3F(2, 0x34, 0x043), F3F(~2, ~0x34, ~0x043), "V,R,J", F_FLOAT, v8 },
172776cad711SPaolo Bonzini { "faddx",      F3F(2, 0x34, 0x043), F3F(~2, ~0x34, ~0x043), "V,R,J", F_FLOAT|F_ALIAS, v8 },
172876cad711SPaolo Bonzini { "fadds",      F3F(2, 0x34, 0x041), F3F(~2, ~0x34, ~0x041), "e,f,g", F_FLOAT, v6 },
172976cad711SPaolo Bonzini { "fsubd",      F3F(2, 0x34, 0x046), F3F(~2, ~0x34, ~0x046), "v,B,H", F_FLOAT, v6 },
173076cad711SPaolo Bonzini { "fsubq",      F3F(2, 0x34, 0x047), F3F(~2, ~0x34, ~0x047), "V,R,J", F_FLOAT, v8 },
173176cad711SPaolo Bonzini { "fsubx",      F3F(2, 0x34, 0x047), F3F(~2, ~0x34, ~0x047), "V,R,J", F_FLOAT|F_ALIAS, v8 },
173276cad711SPaolo Bonzini { "fsubs",      F3F(2, 0x34, 0x045), F3F(~2, ~0x34, ~0x045), "e,f,g", F_FLOAT, v6 },
173376cad711SPaolo Bonzini 
173476cad711SPaolo Bonzini #define CMPFCC(x)       (((x)&0x3)<<25)
173576cad711SPaolo Bonzini 
173676cad711SPaolo Bonzini { "fcmpd",                F3F(2, 0x35, 0x052),            F3F(~2, ~0x35, ~0x052)|RD_G0,  "v,B",   F_FLOAT, v6 },
173776cad711SPaolo Bonzini { "fcmpd",      CMPFCC(0)|F3F(2, 0x35, 0x052), CMPFCC(~0)|F3F(~2, ~0x35, ~0x052),        "6,v,B", F_FLOAT, v9 },
173876cad711SPaolo Bonzini { "fcmpd",      CMPFCC(1)|F3F(2, 0x35, 0x052), CMPFCC(~1)|F3F(~2, ~0x35, ~0x052),        "7,v,B", F_FLOAT, v9 },
173976cad711SPaolo Bonzini { "fcmpd",      CMPFCC(2)|F3F(2, 0x35, 0x052), CMPFCC(~2)|F3F(~2, ~0x35, ~0x052),        "8,v,B", F_FLOAT, v9 },
174076cad711SPaolo Bonzini { "fcmpd",      CMPFCC(3)|F3F(2, 0x35, 0x052), CMPFCC(~3)|F3F(~2, ~0x35, ~0x052),        "9,v,B", F_FLOAT, v9 },
174176cad711SPaolo Bonzini { "fcmped",               F3F(2, 0x35, 0x056),            F3F(~2, ~0x35, ~0x056)|RD_G0,  "v,B",   F_FLOAT, v6 },
174276cad711SPaolo Bonzini { "fcmped",     CMPFCC(0)|F3F(2, 0x35, 0x056), CMPFCC(~0)|F3F(~2, ~0x35, ~0x056),        "6,v,B", F_FLOAT, v9 },
174376cad711SPaolo Bonzini { "fcmped",     CMPFCC(1)|F3F(2, 0x35, 0x056), CMPFCC(~1)|F3F(~2, ~0x35, ~0x056),        "7,v,B", F_FLOAT, v9 },
174476cad711SPaolo Bonzini { "fcmped",     CMPFCC(2)|F3F(2, 0x35, 0x056), CMPFCC(~2)|F3F(~2, ~0x35, ~0x056),        "8,v,B", F_FLOAT, v9 },
174576cad711SPaolo Bonzini { "fcmped",     CMPFCC(3)|F3F(2, 0x35, 0x056), CMPFCC(~3)|F3F(~2, ~0x35, ~0x056),        "9,v,B", F_FLOAT, v9 },
174676cad711SPaolo Bonzini { "fcmpq",                F3F(2, 0x35, 0x053),            F3F(~2, ~0x35, ~0x053)|RD_G0,  "V,R", F_FLOAT, v8 },
174776cad711SPaolo Bonzini { "fcmpq",      CMPFCC(0)|F3F(2, 0x35, 0x053), CMPFCC(~0)|F3F(~2, ~0x35, ~0x053),        "6,V,R", F_FLOAT, v9 },
174876cad711SPaolo Bonzini { "fcmpq",      CMPFCC(1)|F3F(2, 0x35, 0x053), CMPFCC(~1)|F3F(~2, ~0x35, ~0x053),        "7,V,R", F_FLOAT, v9 },
174976cad711SPaolo Bonzini { "fcmpq",      CMPFCC(2)|F3F(2, 0x35, 0x053), CMPFCC(~2)|F3F(~2, ~0x35, ~0x053),        "8,V,R", F_FLOAT, v9 },
175076cad711SPaolo Bonzini { "fcmpq",      CMPFCC(3)|F3F(2, 0x35, 0x053), CMPFCC(~3)|F3F(~2, ~0x35, ~0x053),        "9,V,R", F_FLOAT, v9 },
175176cad711SPaolo Bonzini { "fcmpeq",               F3F(2, 0x35, 0x057),            F3F(~2, ~0x35, ~0x057)|RD_G0,  "V,R", F_FLOAT, v8 },
175276cad711SPaolo Bonzini { "fcmpeq",     CMPFCC(0)|F3F(2, 0x35, 0x057), CMPFCC(~0)|F3F(~2, ~0x35, ~0x057),        "6,V,R", F_FLOAT, v9 },
175376cad711SPaolo Bonzini { "fcmpeq",     CMPFCC(1)|F3F(2, 0x35, 0x057), CMPFCC(~1)|F3F(~2, ~0x35, ~0x057),        "7,V,R", F_FLOAT, v9 },
175476cad711SPaolo Bonzini { "fcmpeq",     CMPFCC(2)|F3F(2, 0x35, 0x057), CMPFCC(~2)|F3F(~2, ~0x35, ~0x057),        "8,V,R", F_FLOAT, v9 },
175576cad711SPaolo Bonzini { "fcmpeq",     CMPFCC(3)|F3F(2, 0x35, 0x057), CMPFCC(~3)|F3F(~2, ~0x35, ~0x057),        "9,V,R", F_FLOAT, v9 },
175676cad711SPaolo Bonzini { "fcmpx",                F3F(2, 0x35, 0x053),            F3F(~2, ~0x35, ~0x053)|RD_G0,  "V,R", F_FLOAT|F_ALIAS, v8 },
175776cad711SPaolo Bonzini { "fcmpx",      CMPFCC(0)|F3F(2, 0x35, 0x053), CMPFCC(~0)|F3F(~2, ~0x35, ~0x053),        "6,V,R", F_FLOAT|F_ALIAS, v9 },
175876cad711SPaolo Bonzini { "fcmpx",      CMPFCC(1)|F3F(2, 0x35, 0x053), CMPFCC(~1)|F3F(~2, ~0x35, ~0x053),        "7,V,R", F_FLOAT|F_ALIAS, v9 },
175976cad711SPaolo Bonzini { "fcmpx",      CMPFCC(2)|F3F(2, 0x35, 0x053), CMPFCC(~2)|F3F(~2, ~0x35, ~0x053),        "8,V,R", F_FLOAT|F_ALIAS, v9 },
176076cad711SPaolo Bonzini { "fcmpx",      CMPFCC(3)|F3F(2, 0x35, 0x053), CMPFCC(~3)|F3F(~2, ~0x35, ~0x053),        "9,V,R", F_FLOAT|F_ALIAS, v9 },
176176cad711SPaolo Bonzini { "fcmpex",               F3F(2, 0x35, 0x057),            F3F(~2, ~0x35, ~0x057)|RD_G0,  "V,R", F_FLOAT|F_ALIAS, v8 },
176276cad711SPaolo Bonzini { "fcmpex",     CMPFCC(0)|F3F(2, 0x35, 0x057), CMPFCC(~0)|F3F(~2, ~0x35, ~0x057),        "6,V,R", F_FLOAT|F_ALIAS, v9 },
176376cad711SPaolo Bonzini { "fcmpex",     CMPFCC(1)|F3F(2, 0x35, 0x057), CMPFCC(~1)|F3F(~2, ~0x35, ~0x057),        "7,V,R", F_FLOAT|F_ALIAS, v9 },
176476cad711SPaolo Bonzini { "fcmpex",     CMPFCC(2)|F3F(2, 0x35, 0x057), CMPFCC(~2)|F3F(~2, ~0x35, ~0x057),        "8,V,R", F_FLOAT|F_ALIAS, v9 },
176576cad711SPaolo Bonzini { "fcmpex",     CMPFCC(3)|F3F(2, 0x35, 0x057), CMPFCC(~3)|F3F(~2, ~0x35, ~0x057),        "9,V,R", F_FLOAT|F_ALIAS, v9 },
176676cad711SPaolo Bonzini { "fcmps",                F3F(2, 0x35, 0x051),            F3F(~2, ~0x35, ~0x051)|RD_G0, "e,f",   F_FLOAT, v6 },
176776cad711SPaolo Bonzini { "fcmps",      CMPFCC(0)|F3F(2, 0x35, 0x051), CMPFCC(~0)|F3F(~2, ~0x35, ~0x051),        "6,e,f", F_FLOAT, v9 },
176876cad711SPaolo Bonzini { "fcmps",      CMPFCC(1)|F3F(2, 0x35, 0x051), CMPFCC(~1)|F3F(~2, ~0x35, ~0x051),        "7,e,f", F_FLOAT, v9 },
176976cad711SPaolo Bonzini { "fcmps",      CMPFCC(2)|F3F(2, 0x35, 0x051), CMPFCC(~2)|F3F(~2, ~0x35, ~0x051),        "8,e,f", F_FLOAT, v9 },
177076cad711SPaolo Bonzini { "fcmps",      CMPFCC(3)|F3F(2, 0x35, 0x051), CMPFCC(~3)|F3F(~2, ~0x35, ~0x051),        "9,e,f", F_FLOAT, v9 },
177176cad711SPaolo Bonzini { "fcmpes",               F3F(2, 0x35, 0x055),            F3F(~2, ~0x35, ~0x055)|RD_G0, "e,f",   F_FLOAT, v6 },
177276cad711SPaolo Bonzini { "fcmpes",     CMPFCC(0)|F3F(2, 0x35, 0x055), CMPFCC(~0)|F3F(~2, ~0x35, ~0x055),        "6,e,f", F_FLOAT, v9 },
177376cad711SPaolo Bonzini { "fcmpes",     CMPFCC(1)|F3F(2, 0x35, 0x055), CMPFCC(~1)|F3F(~2, ~0x35, ~0x055),        "7,e,f", F_FLOAT, v9 },
177476cad711SPaolo Bonzini { "fcmpes",     CMPFCC(2)|F3F(2, 0x35, 0x055), CMPFCC(~2)|F3F(~2, ~0x35, ~0x055),        "8,e,f", F_FLOAT, v9 },
177576cad711SPaolo Bonzini { "fcmpes",     CMPFCC(3)|F3F(2, 0x35, 0x055), CMPFCC(~3)|F3F(~2, ~0x35, ~0x055),        "9,e,f", F_FLOAT, v9 },
177676cad711SPaolo Bonzini 
177776cad711SPaolo Bonzini /* These Extended FPop (FIFO) instructions are new in the Fujitsu
177876cad711SPaolo Bonzini    MB86934, replacing the CPop instructions from v6 and later
177976cad711SPaolo Bonzini    processors.  */
178076cad711SPaolo Bonzini 
178176cad711SPaolo Bonzini #define EFPOP1_2(name, op, args) { name, F3F(2, 0x36, op), F3F(~2, ~0x36, ~op)|RS1_G0, args, 0, sparclite }
178276cad711SPaolo Bonzini #define EFPOP1_3(name, op, args) { name, F3F(2, 0x36, op), F3F(~2, ~0x36, ~op),        args, 0, sparclite }
178376cad711SPaolo Bonzini #define EFPOP2_2(name, op, args) { name, F3F(2, 0x37, op), F3F(~2, ~0x37, ~op)|RD_G0,  args, 0, sparclite }
178476cad711SPaolo Bonzini 
178576cad711SPaolo Bonzini EFPOP1_2 ("efitod",     0x0c8, "f,H"),
178676cad711SPaolo Bonzini EFPOP1_2 ("efitos",     0x0c4, "f,g"),
178776cad711SPaolo Bonzini EFPOP1_2 ("efdtoi",     0x0d2, "B,g"),
178876cad711SPaolo Bonzini EFPOP1_2 ("efstoi",     0x0d1, "f,g"),
178976cad711SPaolo Bonzini EFPOP1_2 ("efstod",     0x0c9, "f,H"),
179076cad711SPaolo Bonzini EFPOP1_2 ("efdtos",     0x0c6, "B,g"),
179176cad711SPaolo Bonzini EFPOP1_2 ("efmovs",     0x001, "f,g"),
179276cad711SPaolo Bonzini EFPOP1_2 ("efnegs",     0x005, "f,g"),
179376cad711SPaolo Bonzini EFPOP1_2 ("efabss",     0x009, "f,g"),
179476cad711SPaolo Bonzini EFPOP1_2 ("efsqrtd",    0x02a, "B,H"),
179576cad711SPaolo Bonzini EFPOP1_2 ("efsqrts",    0x029, "f,g"),
179676cad711SPaolo Bonzini EFPOP1_3 ("efaddd",     0x042, "v,B,H"),
179776cad711SPaolo Bonzini EFPOP1_3 ("efadds",     0x041, "e,f,g"),
179876cad711SPaolo Bonzini EFPOP1_3 ("efsubd",     0x046, "v,B,H"),
179976cad711SPaolo Bonzini EFPOP1_3 ("efsubs",     0x045, "e,f,g"),
180076cad711SPaolo Bonzini EFPOP1_3 ("efdivd",     0x04e, "v,B,H"),
180176cad711SPaolo Bonzini EFPOP1_3 ("efdivs",     0x04d, "e,f,g"),
180276cad711SPaolo Bonzini EFPOP1_3 ("efmuld",     0x04a, "v,B,H"),
180376cad711SPaolo Bonzini EFPOP1_3 ("efmuls",     0x049, "e,f,g"),
180476cad711SPaolo Bonzini EFPOP1_3 ("efsmuld",    0x069, "e,f,H"),
180576cad711SPaolo Bonzini EFPOP2_2 ("efcmpd",     0x052, "v,B"),
180676cad711SPaolo Bonzini EFPOP2_2 ("efcmped",    0x056, "v,B"),
180776cad711SPaolo Bonzini EFPOP2_2 ("efcmps",     0x051, "e,f"),
180876cad711SPaolo Bonzini EFPOP2_2 ("efcmpes",    0x055, "e,f"),
180976cad711SPaolo Bonzini 
181076cad711SPaolo Bonzini #undef EFPOP1_2
181176cad711SPaolo Bonzini #undef EFPOP1_3
181276cad711SPaolo Bonzini #undef EFPOP2_2
181376cad711SPaolo Bonzini 
181476cad711SPaolo Bonzini /* These are marked F_ALIAS, so that they won't conflict with sparclite insns
181576cad711SPaolo Bonzini    present.  Otherwise, the F_ALIAS flag is ignored.  */
181676cad711SPaolo Bonzini { "cpop1",      F3(2, 0x36, 0), F3(~2, ~0x36, ~1), "[1+2],d", F_ALIAS, v6notv9 },
181776cad711SPaolo Bonzini { "cpop2",      F3(2, 0x37, 0), F3(~2, ~0x37, ~1), "[1+2],d", F_ALIAS, v6notv9 },
181876cad711SPaolo Bonzini 
181976cad711SPaolo Bonzini /* sparclet specific insns */
182076cad711SPaolo Bonzini 
182176cad711SPaolo Bonzini COMMUTEOP ("umac", 0x3e, sparclet),
182276cad711SPaolo Bonzini COMMUTEOP ("smac", 0x3f, sparclet),
182376cad711SPaolo Bonzini COMMUTEOP ("umacd", 0x2e, sparclet),
182476cad711SPaolo Bonzini COMMUTEOP ("smacd", 0x2f, sparclet),
182576cad711SPaolo Bonzini COMMUTEOP ("umuld", 0x09, sparclet),
182676cad711SPaolo Bonzini COMMUTEOP ("smuld", 0x0d, sparclet),
182776cad711SPaolo Bonzini 
182876cad711SPaolo Bonzini { "shuffle",    F3(2, 0x2d, 0), F3(~2, ~0x2d, ~0)|ASI(~0),      "1,2,d", 0, sparclet },
182976cad711SPaolo Bonzini { "shuffle",    F3(2, 0x2d, 1), F3(~2, ~0x2d, ~1),              "1,i,d", 0, sparclet },
183076cad711SPaolo Bonzini 
183176cad711SPaolo Bonzini /* The manual isn't completely accurate on these insns.  The `rs2' field is
183276cad711SPaolo Bonzini    treated as being 6 bits to account for 6 bit immediates to cpush.  It is
183376cad711SPaolo Bonzini    assumed that it is intended that bit 5 is 0 when rs2 contains a reg.  */
183476cad711SPaolo Bonzini #define BIT5 (1<<5)
183576cad711SPaolo Bonzini { "crdcxt",     F3(2, 0x36, 0)|SLCPOP(4), F3(~2, ~0x36, ~0)|SLCPOP(~4)|BIT5|RS2(~0),    "U,d", 0, sparclet },
183676cad711SPaolo Bonzini { "cwrcxt",     F3(2, 0x36, 0)|SLCPOP(3), F3(~2, ~0x36, ~0)|SLCPOP(~3)|BIT5|RS2(~0),    "1,u", 0, sparclet },
183776cad711SPaolo Bonzini { "cpush",      F3(2, 0x36, 0)|SLCPOP(0), F3(~2, ~0x36, ~0)|SLCPOP(~0)|BIT5|RD(~0),     "1,2", 0, sparclet },
183876cad711SPaolo Bonzini { "cpush",      F3(2, 0x36, 1)|SLCPOP(0), F3(~2, ~0x36, ~1)|SLCPOP(~0)|RD(~0),          "1,Y", 0, sparclet },
183976cad711SPaolo Bonzini { "cpusha",     F3(2, 0x36, 0)|SLCPOP(1), F3(~2, ~0x36, ~0)|SLCPOP(~1)|BIT5|RD(~0),     "1,2", 0, sparclet },
184076cad711SPaolo Bonzini { "cpusha",     F3(2, 0x36, 1)|SLCPOP(1), F3(~2, ~0x36, ~1)|SLCPOP(~1)|RD(~0),          "1,Y", 0, sparclet },
184176cad711SPaolo Bonzini { "cpull",      F3(2, 0x36, 0)|SLCPOP(2), F3(~2, ~0x36, ~0)|SLCPOP(~2)|BIT5|RS1(~0)|RS2(~0), "d", 0, sparclet },
184276cad711SPaolo Bonzini #undef BIT5
184376cad711SPaolo Bonzini 
184476cad711SPaolo Bonzini /* sparclet coprocessor branch insns */
184576cad711SPaolo Bonzini #define SLCBCC2(opcode, mask, lose) \
184676cad711SPaolo Bonzini  { opcode, (mask), ANNUL|(lose), "l",    F_DELAYED|F_CONDBR, sparclet }, \
184776cad711SPaolo Bonzini  { opcode, (mask)|ANNUL, (lose), ",a l", F_DELAYED|F_CONDBR, sparclet }
184876cad711SPaolo Bonzini #define SLCBCC(opcode, mask) \
184976cad711SPaolo Bonzini   SLCBCC2(opcode, F2(0, 7)|COND(mask), F2(~0, ~7)|COND(~(mask)))
185076cad711SPaolo Bonzini 
185176cad711SPaolo Bonzini /* cbn,cba can't be defined here because they're defined elsewhere and GAS
185276cad711SPaolo Bonzini    requires all mnemonics of the same name to be consecutive.  */
185376cad711SPaolo Bonzini /*SLCBCC("cbn", 0), - already defined */
185476cad711SPaolo Bonzini SLCBCC("cbe", 1),
185576cad711SPaolo Bonzini SLCBCC("cbf", 2),
185676cad711SPaolo Bonzini SLCBCC("cbef", 3),
185776cad711SPaolo Bonzini SLCBCC("cbr", 4),
185876cad711SPaolo Bonzini SLCBCC("cber", 5),
185976cad711SPaolo Bonzini SLCBCC("cbfr", 6),
186076cad711SPaolo Bonzini SLCBCC("cbefr", 7),
186176cad711SPaolo Bonzini /*SLCBCC("cba", 8), - already defined */
186276cad711SPaolo Bonzini SLCBCC("cbne", 9),
186376cad711SPaolo Bonzini SLCBCC("cbnf", 10),
186476cad711SPaolo Bonzini SLCBCC("cbnef", 11),
186576cad711SPaolo Bonzini SLCBCC("cbnr", 12),
186676cad711SPaolo Bonzini SLCBCC("cbner", 13),
186776cad711SPaolo Bonzini SLCBCC("cbnfr", 14),
186876cad711SPaolo Bonzini SLCBCC("cbnefr", 15),
186976cad711SPaolo Bonzini 
187076cad711SPaolo Bonzini #undef SLCBCC2
187176cad711SPaolo Bonzini #undef SLCBCC
187276cad711SPaolo Bonzini 
187376cad711SPaolo Bonzini { "casa",       F3(3, 0x3c, 0), F3(~3, ~0x3c, ~0), "[1]A,2,d", 0, v9 },
187476cad711SPaolo Bonzini { "casa",       F3(3, 0x3c, 1), F3(~3, ~0x3c, ~1), "[1]o,2,d", 0, v9 },
187576cad711SPaolo Bonzini { "casxa",      F3(3, 0x3e, 0), F3(~3, ~0x3e, ~0), "[1]A,2,d", 0, v9 },
187676cad711SPaolo Bonzini { "casxa",      F3(3, 0x3e, 1), F3(~3, ~0x3e, ~1), "[1]o,2,d", 0, v9 },
187776cad711SPaolo Bonzini 
187876cad711SPaolo Bonzini /* v9 synthetic insns */
187976cad711SPaolo Bonzini { "iprefetch",  F2(0, 1)|(2<<20)|BPRED, F2(~0, ~1)|(1<<20)|ANNUL|COND(~0), "G", 0, v9 }, /* bn,a,pt %xcc,label */
188076cad711SPaolo Bonzini { "signx",      F3(2, 0x27, 0), F3(~2, ~0x27, ~0)|(1<<12)|ASI(~0)|RS2_G0, "1,d", F_ALIAS, v9 }, /* sra rs1,%g0,rd */
188176cad711SPaolo Bonzini { "signx",      F3(2, 0x27, 0), F3(~2, ~0x27, ~0)|(1<<12)|ASI(~0)|RS2_G0, "r", F_ALIAS, v9 }, /* sra rd,%g0,rd */
188276cad711SPaolo Bonzini { "clruw",      F3(2, 0x26, 0), F3(~2, ~0x26, ~0)|(1<<12)|ASI(~0)|RS2_G0, "1,d", F_ALIAS, v9 }, /* srl rs1,%g0,rd */
188376cad711SPaolo Bonzini { "clruw",      F3(2, 0x26, 0), F3(~2, ~0x26, ~0)|(1<<12)|ASI(~0)|RS2_G0, "r", F_ALIAS, v9 }, /* srl rd,%g0,rd */
188476cad711SPaolo Bonzini { "cas",        F3(3, 0x3c, 0)|ASI(0x80), F3(~3, ~0x3c, ~0)|ASI(~0x80), "[1],2,d", F_ALIAS, v9 }, /* casa [rs1]ASI_P,rs2,rd */
188576cad711SPaolo Bonzini { "casl",       F3(3, 0x3c, 0)|ASI(0x88), F3(~3, ~0x3c, ~0)|ASI(~0x88), "[1],2,d", F_ALIAS, v9 }, /* casa [rs1]ASI_P_L,rs2,rd */
188676cad711SPaolo Bonzini { "casx",       F3(3, 0x3e, 0)|ASI(0x80), F3(~3, ~0x3e, ~0)|ASI(~0x80), "[1],2,d", F_ALIAS, v9 }, /* casxa [rs1]ASI_P,rs2,rd */
188776cad711SPaolo Bonzini { "casxl",      F3(3, 0x3e, 0)|ASI(0x88), F3(~3, ~0x3e, ~0)|ASI(~0x88), "[1],2,d", F_ALIAS, v9 }, /* casxa [rs1]ASI_P_L,rs2,rd */
188876cad711SPaolo Bonzini 
188976cad711SPaolo Bonzini /* Ultrasparc extensions */
189076cad711SPaolo Bonzini { "shutdown",   F3F(2, 0x36, 0x080), F3F(~2, ~0x36, ~0x080)|RD_G0|RS1_G0|RS2_G0, "", 0, v9a },
189176cad711SPaolo Bonzini 
189276cad711SPaolo Bonzini /* FIXME: Do we want to mark these as F_FLOAT, or something similar?  */
189376cad711SPaolo Bonzini { "fpadd16",    F3F(2, 0x36, 0x050), F3F(~2, ~0x36, ~0x050), "v,B,H", 0, v9a },
189476cad711SPaolo Bonzini { "fpadd16s",   F3F(2, 0x36, 0x051), F3F(~2, ~0x36, ~0x051), "e,f,g", 0, v9a },
189576cad711SPaolo Bonzini { "fpadd32",    F3F(2, 0x36, 0x052), F3F(~2, ~0x36, ~0x052), "v,B,H", 0, v9a },
189676cad711SPaolo Bonzini { "fpadd32s",   F3F(2, 0x36, 0x053), F3F(~2, ~0x36, ~0x053), "e,f,g", 0, v9a },
189776cad711SPaolo Bonzini { "fpsub16",    F3F(2, 0x36, 0x054), F3F(~2, ~0x36, ~0x054), "v,B,H", 0, v9a },
189876cad711SPaolo Bonzini { "fpsub16s",   F3F(2, 0x36, 0x055), F3F(~2, ~0x36, ~0x055), "e,f,g", 0, v9a },
189976cad711SPaolo Bonzini { "fpsub32",    F3F(2, 0x36, 0x056), F3F(~2, ~0x36, ~0x056), "v,B,H", 0, v9a },
190076cad711SPaolo Bonzini { "fpsub32s",   F3F(2, 0x36, 0x057), F3F(~2, ~0x36, ~0x057), "e,f,g", 0, v9a },
190176cad711SPaolo Bonzini 
190276cad711SPaolo Bonzini { "fpack32",    F3F(2, 0x36, 0x03a), F3F(~2, ~0x36, ~0x03a), "v,B,H", 0, v9a },
190376cad711SPaolo Bonzini { "fpack16",    F3F(2, 0x36, 0x03b), F3F(~2, ~0x36, ~0x03b)|RS1_G0, "B,g", 0, v9a },
190476cad711SPaolo Bonzini { "fpackfix",   F3F(2, 0x36, 0x03d), F3F(~2, ~0x36, ~0x03d)|RS1_G0, "B,g", 0, v9a },
190576cad711SPaolo Bonzini { "fexpand",    F3F(2, 0x36, 0x04d), F3F(~2, ~0x36, ~0x04d)|RS1_G0, "f,H", 0, v9a },
190676cad711SPaolo Bonzini { "fpmerge",    F3F(2, 0x36, 0x04b), F3F(~2, ~0x36, ~0x04b), "e,f,H", 0, v9a },
190776cad711SPaolo Bonzini 
190876cad711SPaolo Bonzini /* Note that the mixing of 32/64 bit regs is intentional.  */
190976cad711SPaolo Bonzini { "fmul8x16",           F3F(2, 0x36, 0x031), F3F(~2, ~0x36, ~0x031), "e,B,H", 0, v9a },
191076cad711SPaolo Bonzini { "fmul8x16au",         F3F(2, 0x36, 0x033), F3F(~2, ~0x36, ~0x033), "e,f,H", 0, v9a },
191176cad711SPaolo Bonzini { "fmul8x16al",         F3F(2, 0x36, 0x035), F3F(~2, ~0x36, ~0x035), "e,f,H", 0, v9a },
191276cad711SPaolo Bonzini { "fmul8sux16",         F3F(2, 0x36, 0x036), F3F(~2, ~0x36, ~0x036), "v,B,H", 0, v9a },
191376cad711SPaolo Bonzini { "fmul8ulx16",         F3F(2, 0x36, 0x037), F3F(~2, ~0x36, ~0x037), "v,B,H", 0, v9a },
191476cad711SPaolo Bonzini { "fmuld8sux16",        F3F(2, 0x36, 0x038), F3F(~2, ~0x36, ~0x038), "e,f,H", 0, v9a },
191576cad711SPaolo Bonzini { "fmuld8ulx16",        F3F(2, 0x36, 0x039), F3F(~2, ~0x36, ~0x039), "e,f,H", 0, v9a },
191676cad711SPaolo Bonzini 
191776cad711SPaolo Bonzini { "alignaddr",  F3F(2, 0x36, 0x018), F3F(~2, ~0x36, ~0x018), "1,2,d", 0, v9a },
191876cad711SPaolo Bonzini { "alignaddrl", F3F(2, 0x36, 0x01a), F3F(~2, ~0x36, ~0x01a), "1,2,d", 0, v9a },
191976cad711SPaolo Bonzini { "faligndata", F3F(2, 0x36, 0x048), F3F(~2, ~0x36, ~0x048), "v,B,H", 0, v9a },
192076cad711SPaolo Bonzini 
192176cad711SPaolo Bonzini { "fzero",      F3F(2, 0x36, 0x060), F3F(~2, ~0x36, ~0x060), "H", 0, v9a },
192276cad711SPaolo Bonzini { "fzeros",     F3F(2, 0x36, 0x061), F3F(~2, ~0x36, ~0x061), "g", 0, v9a },
192376cad711SPaolo Bonzini { "fone",       F3F(2, 0x36, 0x07e), F3F(~2, ~0x36, ~0x07e), "H", 0, v9a },
192476cad711SPaolo Bonzini { "fones",      F3F(2, 0x36, 0x07f), F3F(~2, ~0x36, ~0x07f), "g", 0, v9a },
192576cad711SPaolo Bonzini { "fsrc1",      F3F(2, 0x36, 0x074), F3F(~2, ~0x36, ~0x074), "v,H", 0, v9a },
192676cad711SPaolo Bonzini { "fsrc1s",     F3F(2, 0x36, 0x075), F3F(~2, ~0x36, ~0x075), "e,g", 0, v9a },
192776cad711SPaolo Bonzini { "fsrc2",      F3F(2, 0x36, 0x078), F3F(~2, ~0x36, ~0x078), "B,H", 0, v9a },
192876cad711SPaolo Bonzini { "fsrc2s",     F3F(2, 0x36, 0x079), F3F(~2, ~0x36, ~0x079), "f,g", 0, v9a },
192976cad711SPaolo Bonzini { "fnot1",      F3F(2, 0x36, 0x06a), F3F(~2, ~0x36, ~0x06a), "v,H", 0, v9a },
193076cad711SPaolo Bonzini { "fnot1s",     F3F(2, 0x36, 0x06b), F3F(~2, ~0x36, ~0x06b), "e,g", 0, v9a },
193176cad711SPaolo Bonzini { "fnot2",      F3F(2, 0x36, 0x066), F3F(~2, ~0x36, ~0x066), "B,H", 0, v9a },
193276cad711SPaolo Bonzini { "fnot2s",     F3F(2, 0x36, 0x067), F3F(~2, ~0x36, ~0x067), "f,g", 0, v9a },
193376cad711SPaolo Bonzini { "for",        F3F(2, 0x36, 0x07c), F3F(~2, ~0x36, ~0x07c), "v,B,H", 0, v9a },
193476cad711SPaolo Bonzini { "fors",       F3F(2, 0x36, 0x07d), F3F(~2, ~0x36, ~0x07d), "e,f,g", 0, v9a },
193576cad711SPaolo Bonzini { "fnor",       F3F(2, 0x36, 0x062), F3F(~2, ~0x36, ~0x062), "v,B,H", 0, v9a },
193676cad711SPaolo Bonzini { "fnors",      F3F(2, 0x36, 0x063), F3F(~2, ~0x36, ~0x063), "e,f,g", 0, v9a },
193776cad711SPaolo Bonzini { "fand",       F3F(2, 0x36, 0x070), F3F(~2, ~0x36, ~0x070), "v,B,H", 0, v9a },
193876cad711SPaolo Bonzini { "fands",      F3F(2, 0x36, 0x071), F3F(~2, ~0x36, ~0x071), "e,f,g", 0, v9a },
193976cad711SPaolo Bonzini { "fnand",      F3F(2, 0x36, 0x06e), F3F(~2, ~0x36, ~0x06e), "v,B,H", 0, v9a },
194076cad711SPaolo Bonzini { "fnands",     F3F(2, 0x36, 0x06f), F3F(~2, ~0x36, ~0x06f), "e,f,g", 0, v9a },
194176cad711SPaolo Bonzini { "fxor",       F3F(2, 0x36, 0x06c), F3F(~2, ~0x36, ~0x06c), "v,B,H", 0, v9a },
194276cad711SPaolo Bonzini { "fxors",      F3F(2, 0x36, 0x06d), F3F(~2, ~0x36, ~0x06d), "e,f,g", 0, v9a },
194376cad711SPaolo Bonzini { "fxnor",      F3F(2, 0x36, 0x072), F3F(~2, ~0x36, ~0x072), "v,B,H", 0, v9a },
194476cad711SPaolo Bonzini { "fxnors",     F3F(2, 0x36, 0x073), F3F(~2, ~0x36, ~0x073), "e,f,g", 0, v9a },
194576cad711SPaolo Bonzini { "fornot1",    F3F(2, 0x36, 0x07a), F3F(~2, ~0x36, ~0x07a), "v,B,H", 0, v9a },
194676cad711SPaolo Bonzini { "fornot1s",   F3F(2, 0x36, 0x07b), F3F(~2, ~0x36, ~0x07b), "e,f,g", 0, v9a },
194776cad711SPaolo Bonzini { "fornot2",    F3F(2, 0x36, 0x076), F3F(~2, ~0x36, ~0x076), "v,B,H", 0, v9a },
194876cad711SPaolo Bonzini { "fornot2s",   F3F(2, 0x36, 0x077), F3F(~2, ~0x36, ~0x077), "e,f,g", 0, v9a },
194976cad711SPaolo Bonzini { "fandnot1",   F3F(2, 0x36, 0x068), F3F(~2, ~0x36, ~0x068), "v,B,H", 0, v9a },
195076cad711SPaolo Bonzini { "fandnot1s",  F3F(2, 0x36, 0x069), F3F(~2, ~0x36, ~0x069), "e,f,g", 0, v9a },
195176cad711SPaolo Bonzini { "fandnot2",   F3F(2, 0x36, 0x064), F3F(~2, ~0x36, ~0x064), "v,B,H", 0, v9a },
195276cad711SPaolo Bonzini { "fandnot2s",  F3F(2, 0x36, 0x065), F3F(~2, ~0x36, ~0x065), "e,f,g", 0, v9a },
195376cad711SPaolo Bonzini 
195476cad711SPaolo Bonzini { "fcmpgt16",   F3F(2, 0x36, 0x028), F3F(~2, ~0x36, ~0x028), "v,B,d", 0, v9a },
195576cad711SPaolo Bonzini { "fcmpgt32",   F3F(2, 0x36, 0x02c), F3F(~2, ~0x36, ~0x02c), "v,B,d", 0, v9a },
195676cad711SPaolo Bonzini { "fcmple16",   F3F(2, 0x36, 0x020), F3F(~2, ~0x36, ~0x020), "v,B,d", 0, v9a },
195776cad711SPaolo Bonzini { "fcmple32",   F3F(2, 0x36, 0x024), F3F(~2, ~0x36, ~0x024), "v,B,d", 0, v9a },
195876cad711SPaolo Bonzini { "fcmpne16",   F3F(2, 0x36, 0x022), F3F(~2, ~0x36, ~0x022), "v,B,d", 0, v9a },
195976cad711SPaolo Bonzini { "fcmpne32",   F3F(2, 0x36, 0x026), F3F(~2, ~0x36, ~0x026), "v,B,d", 0, v9a },
196076cad711SPaolo Bonzini { "fcmpeq16",   F3F(2, 0x36, 0x02a), F3F(~2, ~0x36, ~0x02a), "v,B,d", 0, v9a },
196176cad711SPaolo Bonzini { "fcmpeq32",   F3F(2, 0x36, 0x02e), F3F(~2, ~0x36, ~0x02e), "v,B,d", 0, v9a },
196276cad711SPaolo Bonzini 
196376cad711SPaolo Bonzini { "edge8",      F3F(2, 0x36, 0x000), F3F(~2, ~0x36, ~0x000), "1,2,d", 0, v9a },
196476cad711SPaolo Bonzini { "edge8l",     F3F(2, 0x36, 0x002), F3F(~2, ~0x36, ~0x002), "1,2,d", 0, v9a },
196576cad711SPaolo Bonzini { "edge16",     F3F(2, 0x36, 0x004), F3F(~2, ~0x36, ~0x004), "1,2,d", 0, v9a },
196676cad711SPaolo Bonzini { "edge16l",    F3F(2, 0x36, 0x006), F3F(~2, ~0x36, ~0x006), "1,2,d", 0, v9a },
196776cad711SPaolo Bonzini { "edge32",     F3F(2, 0x36, 0x008), F3F(~2, ~0x36, ~0x008), "1,2,d", 0, v9a },
196876cad711SPaolo Bonzini { "edge32l",    F3F(2, 0x36, 0x00a), F3F(~2, ~0x36, ~0x00a), "1,2,d", 0, v9a },
196976cad711SPaolo Bonzini 
197076cad711SPaolo Bonzini { "pdist",      F3F(2, 0x36, 0x03e), F3F(~2, ~0x36, ~0x03e), "v,B,H", 0, v9a },
197176cad711SPaolo Bonzini 
197276cad711SPaolo Bonzini { "array8",     F3F(2, 0x36, 0x010), F3F(~2, ~0x36, ~0x010), "1,2,d", 0, v9a },
197376cad711SPaolo Bonzini { "array16",    F3F(2, 0x36, 0x012), F3F(~2, ~0x36, ~0x012), "1,2,d", 0, v9a },
197476cad711SPaolo Bonzini { "array32",    F3F(2, 0x36, 0x014), F3F(~2, ~0x36, ~0x014), "1,2,d", 0, v9a },
197576cad711SPaolo Bonzini 
197676cad711SPaolo Bonzini /* Cheetah instructions */
197776cad711SPaolo Bonzini { "edge8n",    F3F(2, 0x36, 0x001), F3F(~2, ~0x36, ~0x001), "1,2,d", 0, v9b },
197876cad711SPaolo Bonzini { "edge8ln",   F3F(2, 0x36, 0x003), F3F(~2, ~0x36, ~0x003), "1,2,d", 0, v9b },
197976cad711SPaolo Bonzini { "edge16n",   F3F(2, 0x36, 0x005), F3F(~2, ~0x36, ~0x005), "1,2,d", 0, v9b },
198076cad711SPaolo Bonzini { "edge16ln",  F3F(2, 0x36, 0x007), F3F(~2, ~0x36, ~0x007), "1,2,d", 0, v9b },
198176cad711SPaolo Bonzini { "edge32n",   F3F(2, 0x36, 0x009), F3F(~2, ~0x36, ~0x009), "1,2,d", 0, v9b },
198276cad711SPaolo Bonzini { "edge32ln",  F3F(2, 0x36, 0x00b), F3F(~2, ~0x36, ~0x00b), "1,2,d", 0, v9b },
198376cad711SPaolo Bonzini 
198476cad711SPaolo Bonzini { "bmask",     F3F(2, 0x36, 0x019), F3F(~2, ~0x36, ~0x019), "1,2,d", 0, v9b },
198576cad711SPaolo Bonzini { "bshuffle",  F3F(2, 0x36, 0x04c), F3F(~2, ~0x36, ~0x04c), "v,B,H", 0, v9b },
198676cad711SPaolo Bonzini 
198776cad711SPaolo Bonzini { "siam",      F3F(2, 0x36, 0x081), F3F(~2, ~0x36, ~0x081)|RD_G0|RS1_G0|RS2(~7), "3", 0, v9b },
198876cad711SPaolo Bonzini 
198976cad711SPaolo Bonzini /* More v9 specific insns, these need to come last so they do not clash
199076cad711SPaolo Bonzini    with v9a instructions such as "edge8" which looks like impdep1. */
199176cad711SPaolo Bonzini 
199276cad711SPaolo Bonzini #define IMPDEP(name, code) \
199376cad711SPaolo Bonzini { name, F3(2, code, 0), F3(~2, ~code, ~0)|ASI(~0), "1,2,d", 0, v9notv9a }, \
199476cad711SPaolo Bonzini { name, F3(2, code, 1), F3(~2, ~code, ~1),         "1,i,d", 0, v9notv9a }, \
199576cad711SPaolo Bonzini { name, F3(2, code, 0), F3(~2, ~code, ~0),         "x,1,2,d", 0, v9notv9a }, \
199676cad711SPaolo Bonzini { name, F3(2, code, 0), F3(~2, ~code, ~0),         "x,e,f,g", 0, v9notv9a }
199776cad711SPaolo Bonzini 
199876cad711SPaolo Bonzini IMPDEP ("impdep1", 0x36),
199976cad711SPaolo Bonzini IMPDEP ("impdep2", 0x37),
200076cad711SPaolo Bonzini 
200176cad711SPaolo Bonzini #undef IMPDEP
200276cad711SPaolo Bonzini 
200390379ca8SRichard Henderson { "addxc", F3F(2, 0x36, 0x011), F3F(~2, ~0x36, ~0x011), "1,2,d", 0, v9b },
200490379ca8SRichard Henderson { "addxccc", F3F(2, 0x36, 0x013), F3F(~2, ~0x36, ~0x013), "1,2,d", 0, v9b },
2005de8301e5SRichard Henderson { "umulxhi", F3F(2, 0x36, 0x016), F3F(~2, ~0x36, ~0x016), "1,2,d", 0, v9b },
200690379ca8SRichard Henderson 
200776cad711SPaolo Bonzini };
200876cad711SPaolo Bonzini 
200976cad711SPaolo Bonzini static const int sparc_num_opcodes = ((sizeof sparc_opcodes)/(sizeof sparc_opcodes[0]));
201076cad711SPaolo Bonzini 
201176cad711SPaolo Bonzini /* Utilities for argument parsing.  */
201276cad711SPaolo Bonzini 
201376cad711SPaolo Bonzini typedef struct
201476cad711SPaolo Bonzini {
201576cad711SPaolo Bonzini   int value;
201676cad711SPaolo Bonzini   const char *name;
201776cad711SPaolo Bonzini } arg;
201876cad711SPaolo Bonzini 
201976cad711SPaolo Bonzini /* Look up VALUE in TABLE.  */
202076cad711SPaolo Bonzini 
202176cad711SPaolo Bonzini static const char *
lookup_value(const arg * table,int value)202276cad711SPaolo Bonzini lookup_value (const arg *table, int value)
202376cad711SPaolo Bonzini {
202476cad711SPaolo Bonzini   const arg *p;
202576cad711SPaolo Bonzini 
202676cad711SPaolo Bonzini   for (p = table; p->name; ++p)
202776cad711SPaolo Bonzini     if (value == p->value)
202876cad711SPaolo Bonzini       return p->name;
202976cad711SPaolo Bonzini 
203076cad711SPaolo Bonzini   return NULL;
203176cad711SPaolo Bonzini }
203276cad711SPaolo Bonzini 
203376cad711SPaolo Bonzini /* Handle ASI's.  */
203476cad711SPaolo Bonzini 
203576cad711SPaolo Bonzini static const arg asi_table_v8[] =
203676cad711SPaolo Bonzini {
203776cad711SPaolo Bonzini   { 0x00, "#ASI_M_RES00" },
203876cad711SPaolo Bonzini   { 0x01, "#ASI_M_UNA01" },
203976cad711SPaolo Bonzini   { 0x02, "#ASI_M_MXCC" },
204076cad711SPaolo Bonzini   { 0x03, "#ASI_M_FLUSH_PROBE" },
204176cad711SPaolo Bonzini   { 0x04, "#ASI_M_MMUREGS" },
204276cad711SPaolo Bonzini   { 0x05, "#ASI_M_TLBDIAG" },
204376cad711SPaolo Bonzini   { 0x06, "#ASI_M_DIAGS" },
204476cad711SPaolo Bonzini   { 0x07, "#ASI_M_IODIAG" },
204576cad711SPaolo Bonzini   { 0x08, "#ASI_M_USERTXT" },
204676cad711SPaolo Bonzini   { 0x09, "#ASI_M_KERNELTXT" },
204776cad711SPaolo Bonzini   { 0x0A, "#ASI_M_USERDATA" },
204876cad711SPaolo Bonzini   { 0x0B, "#ASI_M_KERNELDATA" },
204976cad711SPaolo Bonzini   { 0x0C, "#ASI_M_TXTC_TAG" },
205076cad711SPaolo Bonzini   { 0x0D, "#ASI_M_TXTC_DATA" },
205176cad711SPaolo Bonzini   { 0x0E, "#ASI_M_DATAC_TAG" },
205276cad711SPaolo Bonzini   { 0x0F, "#ASI_M_DATAC_DATA" },
205376cad711SPaolo Bonzini   { 0x10, "#ASI_M_FLUSH_PAGE" },
205476cad711SPaolo Bonzini   { 0x11, "#ASI_M_FLUSH_SEG" },
205576cad711SPaolo Bonzini   { 0x12, "#ASI_M_FLUSH_REGION" },
205676cad711SPaolo Bonzini   { 0x13, "#ASI_M_FLUSH_CTX" },
205776cad711SPaolo Bonzini   { 0x14, "#ASI_M_FLUSH_USER" },
205876cad711SPaolo Bonzini   { 0x17, "#ASI_M_BCOPY" },
205976cad711SPaolo Bonzini   { 0x18, "#ASI_M_IFLUSH_PAGE" },
206076cad711SPaolo Bonzini   { 0x19, "#ASI_M_IFLUSH_SEG" },
206176cad711SPaolo Bonzini   { 0x1A, "#ASI_M_IFLUSH_REGION" },
206276cad711SPaolo Bonzini   { 0x1B, "#ASI_M_IFLUSH_CTX" },
206376cad711SPaolo Bonzini   { 0x1C, "#ASI_M_IFLUSH_USER" },
206476cad711SPaolo Bonzini   { 0x1F, "#ASI_M_BFILL" },
206576cad711SPaolo Bonzini   { 0x20, "#ASI_M_BYPASS" },
206676cad711SPaolo Bonzini   { 0x29, "#ASI_M_FBMEM" },
206776cad711SPaolo Bonzini   { 0x2A, "#ASI_M_VMEUS" },
206876cad711SPaolo Bonzini   { 0x2B, "#ASI_M_VMEPS" },
206976cad711SPaolo Bonzini   { 0x2C, "#ASI_M_VMEUT" },
207076cad711SPaolo Bonzini   { 0x2D, "#ASI_M_VMEPT" },
207176cad711SPaolo Bonzini   { 0x2E, "#ASI_M_SBUS" },
207276cad711SPaolo Bonzini   { 0x2F, "#ASI_M_CTL" },
207376cad711SPaolo Bonzini   { 0x31, "#ASI_M_FLUSH_IWHOLE" },
207476cad711SPaolo Bonzini   { 0x36, "#ASI_M_IC_FLCLEAR" },
207576cad711SPaolo Bonzini   { 0x37, "#ASI_M_DC_FLCLEAR" },
207676cad711SPaolo Bonzini   { 0x39, "#ASI_M_DCDR" },
207776cad711SPaolo Bonzini   { 0x40, "#ASI_M_VIKING_TMP1" },
207876cad711SPaolo Bonzini   { 0x41, "#ASI_M_VIKING_TMP2" },
207976cad711SPaolo Bonzini   { 0x4c, "#ASI_M_ACTION" },
208076cad711SPaolo Bonzini   { 0, NULL }
208176cad711SPaolo Bonzini };
208276cad711SPaolo Bonzini 
208376cad711SPaolo Bonzini static const arg asi_table_v9[] =
208476cad711SPaolo Bonzini {
208576cad711SPaolo Bonzini   /* These are in the v9 architecture manual.  */
208676cad711SPaolo Bonzini   /* The shorter versions appear first, they're here because Sun's as has them.
208776cad711SPaolo Bonzini      Sun's as uses #ASI_P_L instead of #ASI_PL (which appears in the
208876cad711SPaolo Bonzini      UltraSPARC architecture manual).  */
208976cad711SPaolo Bonzini   { 0x04, "#ASI_N" },
209076cad711SPaolo Bonzini   { 0x0c, "#ASI_N_L" },
209176cad711SPaolo Bonzini   { 0x10, "#ASI_AIUP" },
209276cad711SPaolo Bonzini   { 0x11, "#ASI_AIUS" },
209376cad711SPaolo Bonzini   { 0x18, "#ASI_AIUP_L" },
209476cad711SPaolo Bonzini   { 0x19, "#ASI_AIUS_L" },
209576cad711SPaolo Bonzini   { 0x80, "#ASI_P" },
209676cad711SPaolo Bonzini   { 0x81, "#ASI_S" },
209776cad711SPaolo Bonzini   { 0x82, "#ASI_PNF" },
209876cad711SPaolo Bonzini   { 0x83, "#ASI_SNF" },
209976cad711SPaolo Bonzini   { 0x88, "#ASI_P_L" },
210076cad711SPaolo Bonzini   { 0x89, "#ASI_S_L" },
210176cad711SPaolo Bonzini   { 0x8a, "#ASI_PNF_L" },
210276cad711SPaolo Bonzini   { 0x8b, "#ASI_SNF_L" },
210376cad711SPaolo Bonzini   { 0x04, "#ASI_NUCLEUS" },
210476cad711SPaolo Bonzini   { 0x0c, "#ASI_NUCLEUS_LITTLE" },
210576cad711SPaolo Bonzini   { 0x10, "#ASI_AS_IF_USER_PRIMARY" },
210676cad711SPaolo Bonzini   { 0x11, "#ASI_AS_IF_USER_SECONDARY" },
210776cad711SPaolo Bonzini   { 0x18, "#ASI_AS_IF_USER_PRIMARY_LITTLE" },
210876cad711SPaolo Bonzini   { 0x19, "#ASI_AS_IF_USER_SECONDARY_LITTLE" },
210976cad711SPaolo Bonzini   { 0x80, "#ASI_PRIMARY" },
211076cad711SPaolo Bonzini   { 0x81, "#ASI_SECONDARY" },
211176cad711SPaolo Bonzini   { 0x82, "#ASI_PRIMARY_NOFAULT" },
211276cad711SPaolo Bonzini   { 0x83, "#ASI_SECONDARY_NOFAULT" },
211376cad711SPaolo Bonzini   { 0x88, "#ASI_PRIMARY_LITTLE" },
211476cad711SPaolo Bonzini   { 0x89, "#ASI_SECONDARY_LITTLE" },
211576cad711SPaolo Bonzini   { 0x8a, "#ASI_PRIMARY_NOFAULT_LITTLE" },
211676cad711SPaolo Bonzini   { 0x8b, "#ASI_SECONDARY_NOFAULT_LITTLE" },
211776cad711SPaolo Bonzini   /* These are UltraSPARC extensions.  */
211876cad711SPaolo Bonzini   { 0x14, "#ASI_PHYS_USE_EC"},
211976cad711SPaolo Bonzini   { 0x15, "#ASI_PHYS_BYPASS_EC_WITH_EBIT"},
212076cad711SPaolo Bonzini   { 0x45, "#ASI_LSU_CONTROL_REG"},
212176cad711SPaolo Bonzini   { 0x47, "#ASI_DCACHE_TAG"},
212276cad711SPaolo Bonzini   { 0x4a, "#ASI_UPA_CONFIG_REG"},
212376cad711SPaolo Bonzini   { 0x50, "#ASI_IMMU" },
212476cad711SPaolo Bonzini   { 0x51, "#ASI_IMMU_TSB_8KB_PTR_REG" },
212576cad711SPaolo Bonzini   { 0x52, "#ASI_IMMU_TSB_64KB_PTR_REG" },
212676cad711SPaolo Bonzini   /*{ 0x53, "#reserved?" },*/
212776cad711SPaolo Bonzini   { 0x54, "#ASI_ITLB_DATA_IN_REG" },
212876cad711SPaolo Bonzini   { 0x55, "#ASI_ITLB_DATA_ACCESS_REG" },
212976cad711SPaolo Bonzini   { 0x56, "#ASI_ITLB_TAG_READ_REG" },
213076cad711SPaolo Bonzini   { 0x57, "#ASI_IMMU_DEMAP" },
213176cad711SPaolo Bonzini   { 0x58, "#ASI_DMMU" },
213276cad711SPaolo Bonzini   { 0x59, "#ASI_DMMU_TSB_8KB_PTR_REG" },
213376cad711SPaolo Bonzini   { 0x5a, "#ASI_DMMU_TSB_64KB_PTR_REG" },
213476cad711SPaolo Bonzini   { 0x5b, "#ASI_DMMU_TSB_DIRECT_PTR_REG" },
213576cad711SPaolo Bonzini   { 0x5c, "#ASI_DTLB_DATA_IN_REG" },
213676cad711SPaolo Bonzini   { 0x5d, "#ASI_DTLB_DATA_ACCESS_REG" },
213776cad711SPaolo Bonzini   { 0x5e, "#ASI_DTLB_TAG_READ_REG" },
213876cad711SPaolo Bonzini   { 0x5f, "#ASI_DMMU_DEMAP" },
213976cad711SPaolo Bonzini   { 0x67, "#ASI_IC_TAG"},
214076cad711SPaolo Bonzini   /* FIXME: There are dozens of them.  Not sure we want them all.
214176cad711SPaolo Bonzini      Most are for kernel building but some are for vis type stuff.  */
214276cad711SPaolo Bonzini   { 0, NULL }
214376cad711SPaolo Bonzini };
214476cad711SPaolo Bonzini 
214576cad711SPaolo Bonzini /* Return the name for ASI value VALUE or NULL if not found.  */
214676cad711SPaolo Bonzini 
214776cad711SPaolo Bonzini static const char *
sparc_decode_asi_v9(int value)214876cad711SPaolo Bonzini sparc_decode_asi_v9 (int value)
214976cad711SPaolo Bonzini {
215076cad711SPaolo Bonzini   return lookup_value (asi_table_v9, value);
215176cad711SPaolo Bonzini }
215276cad711SPaolo Bonzini 
215376cad711SPaolo Bonzini static const char *
sparc_decode_asi_v8(int value)215476cad711SPaolo Bonzini sparc_decode_asi_v8 (int value)
215576cad711SPaolo Bonzini {
215676cad711SPaolo Bonzini   return lookup_value (asi_table_v8, value);
215776cad711SPaolo Bonzini }
215876cad711SPaolo Bonzini 
215976cad711SPaolo Bonzini /* Handle membar masks.  */
216076cad711SPaolo Bonzini 
216176cad711SPaolo Bonzini static const arg membar_table[] =
216276cad711SPaolo Bonzini {
216376cad711SPaolo Bonzini   { 0x40, "#Sync" },
216476cad711SPaolo Bonzini   { 0x20, "#MemIssue" },
216576cad711SPaolo Bonzini   { 0x10, "#Lookaside" },
216676cad711SPaolo Bonzini   { 0x08, "#StoreStore" },
216776cad711SPaolo Bonzini   { 0x04, "#LoadStore" },
216876cad711SPaolo Bonzini   { 0x02, "#StoreLoad" },
216976cad711SPaolo Bonzini   { 0x01, "#LoadLoad" },
217076cad711SPaolo Bonzini   { 0, NULL }
217176cad711SPaolo Bonzini };
217276cad711SPaolo Bonzini 
217376cad711SPaolo Bonzini /* Return the name for membar value VALUE or NULL if not found.  */
217476cad711SPaolo Bonzini 
217576cad711SPaolo Bonzini static const char *
sparc_decode_membar(int value)217676cad711SPaolo Bonzini sparc_decode_membar (int value)
217776cad711SPaolo Bonzini {
217876cad711SPaolo Bonzini   return lookup_value (membar_table, value);
217976cad711SPaolo Bonzini }
218076cad711SPaolo Bonzini 
218176cad711SPaolo Bonzini /* Handle prefetch args.  */
218276cad711SPaolo Bonzini 
218376cad711SPaolo Bonzini static const arg prefetch_table[] =
218476cad711SPaolo Bonzini {
218576cad711SPaolo Bonzini   { 0, "#n_reads" },
218676cad711SPaolo Bonzini   { 1, "#one_read" },
218776cad711SPaolo Bonzini   { 2, "#n_writes" },
218876cad711SPaolo Bonzini   { 3, "#one_write" },
218976cad711SPaolo Bonzini   { 4, "#page" },
219076cad711SPaolo Bonzini   { 16, "#invalidate" },
219176cad711SPaolo Bonzini   { 0, NULL }
219276cad711SPaolo Bonzini };
219376cad711SPaolo Bonzini 
219476cad711SPaolo Bonzini /* Return the name for prefetch value VALUE or NULL if not found.  */
219576cad711SPaolo Bonzini 
219676cad711SPaolo Bonzini static const char *
sparc_decode_prefetch(int value)219776cad711SPaolo Bonzini sparc_decode_prefetch (int value)
219876cad711SPaolo Bonzini {
219976cad711SPaolo Bonzini   return lookup_value (prefetch_table, value);
220076cad711SPaolo Bonzini }
220176cad711SPaolo Bonzini 
220276cad711SPaolo Bonzini /* Handle sparclet coprocessor registers.  */
220376cad711SPaolo Bonzini 
220476cad711SPaolo Bonzini static const arg sparclet_cpreg_table[] =
220576cad711SPaolo Bonzini {
220676cad711SPaolo Bonzini   { 0, "%ccsr" },
220776cad711SPaolo Bonzini   { 1, "%ccfr" },
220876cad711SPaolo Bonzini   { 2, "%cccrcr" },
220976cad711SPaolo Bonzini   { 3, "%ccpr" },
221076cad711SPaolo Bonzini   { 4, "%ccsr2" },
221176cad711SPaolo Bonzini   { 5, "%cccrr" },
221276cad711SPaolo Bonzini   { 6, "%ccrstr" },
221376cad711SPaolo Bonzini   { 0, NULL }
221476cad711SPaolo Bonzini };
221576cad711SPaolo Bonzini 
221676cad711SPaolo Bonzini /* Return the name for sparclet cpreg value VALUE or NULL if not found.  */
221776cad711SPaolo Bonzini 
221876cad711SPaolo Bonzini static const char *
sparc_decode_sparclet_cpreg(int value)221976cad711SPaolo Bonzini sparc_decode_sparclet_cpreg (int value)
222076cad711SPaolo Bonzini {
222176cad711SPaolo Bonzini   return lookup_value (sparclet_cpreg_table, value);
222276cad711SPaolo Bonzini }
222376cad711SPaolo Bonzini 
222476cad711SPaolo Bonzini #undef MASK_V9
222576cad711SPaolo Bonzini 
222676cad711SPaolo Bonzini /* opcodes/sparc-dis.c */
222776cad711SPaolo Bonzini 
222876cad711SPaolo Bonzini /* Print SPARC instructions.
222976cad711SPaolo Bonzini    Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
223076cad711SPaolo Bonzini    2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
223176cad711SPaolo Bonzini 
223276cad711SPaolo Bonzini    This program is free software; you can redistribute it and/or modify
223376cad711SPaolo Bonzini    it under the terms of the GNU General Public License as published by
223476cad711SPaolo Bonzini    the Free Software Foundation; either version 2 of the License, or
223576cad711SPaolo Bonzini    (at your option) any later version.
223676cad711SPaolo Bonzini 
223776cad711SPaolo Bonzini    This program is distributed in the hope that it will be useful,
223876cad711SPaolo Bonzini    but WITHOUT ANY WARRANTY; without even the implied warranty of
223976cad711SPaolo Bonzini    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
224076cad711SPaolo Bonzini    GNU General Public License for more details.
224176cad711SPaolo Bonzini 
224276cad711SPaolo Bonzini    You should have received a copy of the GNU General Public License
224376cad711SPaolo Bonzini    along with this program; if not, see <http://www.gnu.org/licenses/>.  */
224476cad711SPaolo Bonzini 
224576cad711SPaolo Bonzini /* Bitmask of v9 architectures.  */
224676cad711SPaolo Bonzini #define MASK_V9 ((1 << SPARC_OPCODE_ARCH_V9) \
224776cad711SPaolo Bonzini                  | (1 << SPARC_OPCODE_ARCH_V9A) \
224876cad711SPaolo Bonzini                  | (1 << SPARC_OPCODE_ARCH_V9B))
224976cad711SPaolo Bonzini /* 1 if INSN is for v9 only.  */
225076cad711SPaolo Bonzini #define V9_ONLY_P(insn) (! ((insn)->architecture & ~MASK_V9))
225176cad711SPaolo Bonzini /* 1 if INSN is for v9.  */
225276cad711SPaolo Bonzini #define V9_P(insn) (((insn)->architecture & MASK_V9) != 0)
225376cad711SPaolo Bonzini 
225476cad711SPaolo Bonzini /* The sorted opcode table.  */
225576cad711SPaolo Bonzini static const sparc_opcode **sorted_opcodes;
225676cad711SPaolo Bonzini 
225776cad711SPaolo Bonzini /* For faster lookup, after insns are sorted they are hashed.  */
225876cad711SPaolo Bonzini /* ??? I think there is room for even more improvement.  */
225976cad711SPaolo Bonzini 
226076cad711SPaolo Bonzini #define HASH_SIZE 256
226176cad711SPaolo Bonzini /* It is important that we only look at insn code bits as that is how the
226276cad711SPaolo Bonzini    opcode table is hashed.  OPCODE_BITS is a table of valid bits for each
226376cad711SPaolo Bonzini    of the main types (0,1,2,3).  */
226476cad711SPaolo Bonzini static const int opcode_bits[4] = { 0x01c00000, 0x0, 0x01f80000, 0x01f80000 };
226576cad711SPaolo Bonzini #define HASH_INSN(INSN) \
226676cad711SPaolo Bonzini   ((((INSN) >> 24) & 0xc0) | (((INSN) & opcode_bits[((INSN) >> 30) & 3]) >> 19))
226776cad711SPaolo Bonzini typedef struct sparc_opcode_hash
226876cad711SPaolo Bonzini {
226976cad711SPaolo Bonzini   struct sparc_opcode_hash *next;
227076cad711SPaolo Bonzini   const sparc_opcode *opcode;
227176cad711SPaolo Bonzini } sparc_opcode_hash;
227276cad711SPaolo Bonzini 
227376cad711SPaolo Bonzini static sparc_opcode_hash *opcode_hash_table[HASH_SIZE];
227476cad711SPaolo Bonzini 
227576cad711SPaolo Bonzini /* Sign-extend a value which is N bits long.  */
227676cad711SPaolo Bonzini #define SEX(value, bits) \
227776cad711SPaolo Bonzini         ((((int)(value)) << ((8 * sizeof (int)) - bits))        \
227876cad711SPaolo Bonzini                          >> ((8 * sizeof (int)) - bits) )
227976cad711SPaolo Bonzini 
228076cad711SPaolo Bonzini static const char * const reg_names[] =
228176cad711SPaolo Bonzini { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
228276cad711SPaolo Bonzini   "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
228376cad711SPaolo Bonzini   "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
228476cad711SPaolo Bonzini   "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
228576cad711SPaolo Bonzini   "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
228676cad711SPaolo Bonzini   "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
228776cad711SPaolo Bonzini   "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
228876cad711SPaolo Bonzini   "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
228976cad711SPaolo Bonzini   "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
229076cad711SPaolo Bonzini   "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47",
229176cad711SPaolo Bonzini   "f48", "f49", "f50", "f51", "f52", "f53", "f54", "f55",
229276cad711SPaolo Bonzini   "f56", "f57", "f58", "f59", "f60", "f61", "f62", "f63",
229376cad711SPaolo Bonzini /* psr, wim, tbr, fpsr, cpsr are v8 only.  */
229476cad711SPaolo Bonzini   "y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr"
229576cad711SPaolo Bonzini };
229676cad711SPaolo Bonzini 
229776cad711SPaolo Bonzini #define freg_names      (&reg_names[4 * 8])
229876cad711SPaolo Bonzini 
229976cad711SPaolo Bonzini /* These are ordered according to there register number in
230076cad711SPaolo Bonzini    rdpr and wrpr insns.  */
230176cad711SPaolo Bonzini static const char * const v9_priv_reg_names[] =
230276cad711SPaolo Bonzini {
230376cad711SPaolo Bonzini   "tpc", "tnpc", "tstate", "tt", "tick", "tba", "pstate", "tl",
230476cad711SPaolo Bonzini   "pil", "cwp", "cansave", "canrestore", "cleanwin", "otherwin",
230576cad711SPaolo Bonzini   "wstate", "fq", "gl"
230676cad711SPaolo Bonzini   /* "ver" - special cased */
230776cad711SPaolo Bonzini };
230876cad711SPaolo Bonzini 
230976cad711SPaolo Bonzini /* These are ordered according to there register number in
231076cad711SPaolo Bonzini    rdhpr and wrhpr insns.  */
231176cad711SPaolo Bonzini static const char * const v9_hpriv_reg_names[] =
231276cad711SPaolo Bonzini {
231376cad711SPaolo Bonzini   "hpstate", "htstate", "resv2", "hintp", "resv4", "htba", "hver",
231476cad711SPaolo Bonzini   "resv7", "resv8", "resv9", "resv10", "resv11", "resv12", "resv13",
231576cad711SPaolo Bonzini   "resv14", "resv15", "resv16", "resv17", "resv18", "resv19", "resv20",
231676cad711SPaolo Bonzini   "resv21", "resv22", "resv23", "resv24", "resv25", "resv26", "resv27",
231776cad711SPaolo Bonzini   "resv28", "resv29", "resv30", "hstick_cmpr"
231876cad711SPaolo Bonzini };
231976cad711SPaolo Bonzini 
232076cad711SPaolo Bonzini /* These are ordered according to there register number in
232176cad711SPaolo Bonzini    rd and wr insns (-16).  */
232276cad711SPaolo Bonzini static const char * const v9a_asr_reg_names[] =
232376cad711SPaolo Bonzini {
232476cad711SPaolo Bonzini   "pcr", "pic", "dcr", "gsr", "set_softint", "clear_softint",
232576cad711SPaolo Bonzini   "softint", "tick_cmpr", "sys_tick", "sys_tick_cmpr"
232676cad711SPaolo Bonzini };
232776cad711SPaolo Bonzini 
232876cad711SPaolo Bonzini /* Macros used to extract instruction fields.  Not all fields have
232976cad711SPaolo Bonzini    macros defined here, only those which are actually used.  */
233076cad711SPaolo Bonzini 
233176cad711SPaolo Bonzini #define X_RD(i)      (((i) >> 25) & 0x1f)
233276cad711SPaolo Bonzini #define X_RS1(i)     (((i) >> 14) & 0x1f)
233376cad711SPaolo Bonzini #define X_LDST_I(i)  (((i) >> 13) & 1)
233476cad711SPaolo Bonzini #define X_ASI(i)     (((i) >> 5) & 0xff)
233576cad711SPaolo Bonzini #define X_RS2(i)     (((i) >> 0) & 0x1f)
233676cad711SPaolo Bonzini #define X_IMM(i,n)   (((i) >> 0) & ((1 << (n)) - 1))
233776cad711SPaolo Bonzini #define X_SIMM(i,n)  SEX (X_IMM ((i), (n)), (n))
233876cad711SPaolo Bonzini #define X_DISP22(i)  (((i) >> 0) & 0x3fffff)
233976cad711SPaolo Bonzini #define X_IMM22(i)   X_DISP22 (i)
234076cad711SPaolo Bonzini #define X_DISP30(i)  (((i) >> 0) & 0x3fffffff)
234176cad711SPaolo Bonzini 
234276cad711SPaolo Bonzini /* These are for v9.  */
234376cad711SPaolo Bonzini #define X_DISP16(i)  (((((i) >> 20) & 3) << 14) | (((i) >> 0) & 0x3fff))
234476cad711SPaolo Bonzini #define X_DISP19(i)  (((i) >> 0) & 0x7ffff)
234576cad711SPaolo Bonzini #define X_MEMBAR(i)  ((i) & 0x7f)
234676cad711SPaolo Bonzini 
234776cad711SPaolo Bonzini /* Here is the union which was used to extract instruction fields
234876cad711SPaolo Bonzini    before the shift and mask macros were written.
234976cad711SPaolo Bonzini 
235076cad711SPaolo Bonzini    union sparc_insn
235176cad711SPaolo Bonzini      {
235276cad711SPaolo Bonzini        unsigned long int code;
235376cad711SPaolo Bonzini        struct
235476cad711SPaolo Bonzini          {
235576cad711SPaolo Bonzini            unsigned int anop:2;
235676cad711SPaolo Bonzini            #define      op      ldst.anop
235776cad711SPaolo Bonzini            unsigned int anrd:5;
235876cad711SPaolo Bonzini            #define      rd      ldst.anrd
235976cad711SPaolo Bonzini            unsigned int op3:6;
236076cad711SPaolo Bonzini            unsigned int anrs1:5;
236176cad711SPaolo Bonzini            #define      rs1     ldst.anrs1
236276cad711SPaolo Bonzini            unsigned int i:1;
236376cad711SPaolo Bonzini            unsigned int anasi:8;
236476cad711SPaolo Bonzini            #define      asi     ldst.anasi
236576cad711SPaolo Bonzini            unsigned int anrs2:5;
236676cad711SPaolo Bonzini            #define      rs2     ldst.anrs2
236776cad711SPaolo Bonzini            #define      shcnt   rs2
236876cad711SPaolo Bonzini          } ldst;
236976cad711SPaolo Bonzini        struct
237076cad711SPaolo Bonzini          {
237176cad711SPaolo Bonzini            unsigned int anop:2, anrd:5, op3:6, anrs1:5, i:1;
237276cad711SPaolo Bonzini            unsigned int IMM13:13;
237376cad711SPaolo Bonzini            #define      imm13   IMM13.IMM13
237476cad711SPaolo Bonzini          } IMM13;
237576cad711SPaolo Bonzini        struct
237676cad711SPaolo Bonzini          {
237776cad711SPaolo Bonzini            unsigned int anop:2;
237876cad711SPaolo Bonzini            unsigned int a:1;
237976cad711SPaolo Bonzini            unsigned int cond:4;
238076cad711SPaolo Bonzini            unsigned int op2:3;
238176cad711SPaolo Bonzini            unsigned int DISP22:22;
238276cad711SPaolo Bonzini            #define      disp22  branch.DISP22
238376cad711SPaolo Bonzini            #define      imm22   disp22
238476cad711SPaolo Bonzini          } branch;
238576cad711SPaolo Bonzini        struct
238676cad711SPaolo Bonzini          {
238776cad711SPaolo Bonzini            unsigned int anop:2;
238876cad711SPaolo Bonzini            unsigned int a:1;
238976cad711SPaolo Bonzini            unsigned int z:1;
239076cad711SPaolo Bonzini            unsigned int rcond:3;
239176cad711SPaolo Bonzini            unsigned int op2:3;
239276cad711SPaolo Bonzini            unsigned int DISP16HI:2;
239376cad711SPaolo Bonzini            unsigned int p:1;
239476cad711SPaolo Bonzini            unsigned int _rs1:5;
239576cad711SPaolo Bonzini            unsigned int DISP16LO:14;
239676cad711SPaolo Bonzini          } branch16;
239776cad711SPaolo Bonzini        struct
239876cad711SPaolo Bonzini          {
239976cad711SPaolo Bonzini            unsigned int anop:2;
240076cad711SPaolo Bonzini            unsigned int adisp30:30;
240176cad711SPaolo Bonzini            #define      disp30  call.adisp30
240276cad711SPaolo Bonzini          } call;
240376cad711SPaolo Bonzini      };  */
240476cad711SPaolo Bonzini 
240576cad711SPaolo Bonzini /* Nonzero if INSN is the opcode for a delayed branch.  */
240676cad711SPaolo Bonzini 
240776cad711SPaolo Bonzini static int
is_delayed_branch(unsigned long insn)240876cad711SPaolo Bonzini is_delayed_branch (unsigned long insn)
240976cad711SPaolo Bonzini {
241076cad711SPaolo Bonzini   sparc_opcode_hash *op;
241176cad711SPaolo Bonzini 
241276cad711SPaolo Bonzini   for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
241376cad711SPaolo Bonzini     {
241476cad711SPaolo Bonzini       const sparc_opcode *opcode = op->opcode;
241576cad711SPaolo Bonzini 
241676cad711SPaolo Bonzini       if ((opcode->match & insn) == opcode->match
241776cad711SPaolo Bonzini           && (opcode->lose & insn) == 0)
241876cad711SPaolo Bonzini         return opcode->flags & F_DELAYED;
241976cad711SPaolo Bonzini     }
242076cad711SPaolo Bonzini   return 0;
242176cad711SPaolo Bonzini }
242276cad711SPaolo Bonzini 
242376cad711SPaolo Bonzini /* extern void qsort (); */
242476cad711SPaolo Bonzini 
242576cad711SPaolo Bonzini /* Records current mask of SPARC_OPCODE_ARCH_FOO values, used to pass value
242676cad711SPaolo Bonzini    to compare_opcodes.  */
242776cad711SPaolo Bonzini static unsigned int current_arch_mask;
242876cad711SPaolo Bonzini 
242976cad711SPaolo Bonzini /* Given BFD mach number, return a mask of SPARC_OPCODE_ARCH_FOO values.  */
243076cad711SPaolo Bonzini 
243176cad711SPaolo Bonzini static int
compute_arch_mask(unsigned long mach)243276cad711SPaolo Bonzini compute_arch_mask (unsigned long mach)
243376cad711SPaolo Bonzini {
243476cad711SPaolo Bonzini   switch (mach)
243576cad711SPaolo Bonzini     {
243676cad711SPaolo Bonzini     case 0 :
243776cad711SPaolo Bonzini     case bfd_mach_sparc :
243876cad711SPaolo Bonzini       return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8);
243976cad711SPaolo Bonzini     case bfd_mach_sparc_sparclet :
244076cad711SPaolo Bonzini       return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLET);
244176cad711SPaolo Bonzini     case bfd_mach_sparc_sparclite :
244276cad711SPaolo Bonzini     case bfd_mach_sparc_sparclite_le :
244376cad711SPaolo Bonzini       /* sparclites insns are recognized by default (because that's how
244476cad711SPaolo Bonzini          they've always been treated, for better or worse).  Kludge this by
244576cad711SPaolo Bonzini          indicating generic v8 is also selected.  */
244676cad711SPaolo Bonzini       return (SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLITE)
244776cad711SPaolo Bonzini               | SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8));
244876cad711SPaolo Bonzini     case bfd_mach_sparc_v8plus :
244976cad711SPaolo Bonzini     case bfd_mach_sparc_v9 :
245076cad711SPaolo Bonzini       return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9);
245176cad711SPaolo Bonzini     case bfd_mach_sparc_v8plusa :
245276cad711SPaolo Bonzini     case bfd_mach_sparc_v9a :
245376cad711SPaolo Bonzini       return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9A);
245476cad711SPaolo Bonzini     case bfd_mach_sparc_v8plusb :
245576cad711SPaolo Bonzini     case bfd_mach_sparc_v9b :
245676cad711SPaolo Bonzini       return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9B);
245776cad711SPaolo Bonzini     }
245876cad711SPaolo Bonzini   abort ();
245976cad711SPaolo Bonzini }
246076cad711SPaolo Bonzini 
246176cad711SPaolo Bonzini /* Compare opcodes A and B.  */
246276cad711SPaolo Bonzini 
246376cad711SPaolo Bonzini static int
compare_opcodes(const void * a,const void * b)246476cad711SPaolo Bonzini compare_opcodes (const void * a, const void * b)
246576cad711SPaolo Bonzini {
246676cad711SPaolo Bonzini   sparc_opcode *op0 = * (sparc_opcode **) a;
246776cad711SPaolo Bonzini   sparc_opcode *op1 = * (sparc_opcode **) b;
246876cad711SPaolo Bonzini   unsigned long int match0 = op0->match, match1 = op1->match;
246976cad711SPaolo Bonzini   unsigned long int lose0 = op0->lose, lose1 = op1->lose;
247076cad711SPaolo Bonzini   register unsigned int i;
247176cad711SPaolo Bonzini 
247276cad711SPaolo Bonzini   /* If one (and only one) insn isn't supported by the current architecture,
247376cad711SPaolo Bonzini      prefer the one that is.  If neither are supported, but they're both for
247476cad711SPaolo Bonzini      the same architecture, continue processing.  Otherwise (both unsupported
247576cad711SPaolo Bonzini      and for different architectures), prefer lower numbered arch's (fudged
247676cad711SPaolo Bonzini      by comparing the bitmasks).  */
247776cad711SPaolo Bonzini   if (op0->architecture & current_arch_mask)
247876cad711SPaolo Bonzini     {
247976cad711SPaolo Bonzini       if (! (op1->architecture & current_arch_mask))
248076cad711SPaolo Bonzini         return -1;
248176cad711SPaolo Bonzini     }
248276cad711SPaolo Bonzini   else
248376cad711SPaolo Bonzini     {
248476cad711SPaolo Bonzini       if (op1->architecture & current_arch_mask)
248576cad711SPaolo Bonzini         return 1;
248676cad711SPaolo Bonzini       else if (op0->architecture != op1->architecture)
248776cad711SPaolo Bonzini         return op0->architecture - op1->architecture;
248876cad711SPaolo Bonzini     }
248976cad711SPaolo Bonzini 
249076cad711SPaolo Bonzini   /* If a bit is set in both match and lose, there is something
249176cad711SPaolo Bonzini      wrong with the opcode table.  */
249276cad711SPaolo Bonzini   if (match0 & lose0)
249376cad711SPaolo Bonzini     {
249476cad711SPaolo Bonzini       fprintf
249576cad711SPaolo Bonzini         (stderr,
249676cad711SPaolo Bonzini          /* xgettext:c-format */
2497ca66f1a1SLluís Vilanova          "Internal error:  bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n",
249876cad711SPaolo Bonzini          op0->name, match0, lose0);
249976cad711SPaolo Bonzini       op0->lose &= ~op0->match;
250076cad711SPaolo Bonzini       lose0 = op0->lose;
250176cad711SPaolo Bonzini     }
250276cad711SPaolo Bonzini 
250376cad711SPaolo Bonzini   if (match1 & lose1)
250476cad711SPaolo Bonzini     {
250576cad711SPaolo Bonzini       fprintf
250676cad711SPaolo Bonzini         (stderr,
250776cad711SPaolo Bonzini          /* xgettext:c-format */
2508ca66f1a1SLluís Vilanova          "Internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n",
250976cad711SPaolo Bonzini          op1->name, match1, lose1);
251076cad711SPaolo Bonzini       op1->lose &= ~op1->match;
251176cad711SPaolo Bonzini       lose1 = op1->lose;
251276cad711SPaolo Bonzini     }
251376cad711SPaolo Bonzini 
251476cad711SPaolo Bonzini   /* Because the bits that are variable in one opcode are constant in
251576cad711SPaolo Bonzini      another, it is important to order the opcodes in the right order.  */
251676cad711SPaolo Bonzini   for (i = 0; i < 32; ++i)
251776cad711SPaolo Bonzini     {
251876cad711SPaolo Bonzini       unsigned long int x = 1 << i;
251976cad711SPaolo Bonzini       int x0 = (match0 & x) != 0;
252076cad711SPaolo Bonzini       int x1 = (match1 & x) != 0;
252176cad711SPaolo Bonzini 
252276cad711SPaolo Bonzini       if (x0 != x1)
252376cad711SPaolo Bonzini         return x1 - x0;
252476cad711SPaolo Bonzini     }
252576cad711SPaolo Bonzini 
252676cad711SPaolo Bonzini   for (i = 0; i < 32; ++i)
252776cad711SPaolo Bonzini     {
252876cad711SPaolo Bonzini       unsigned long int x = 1 << i;
252976cad711SPaolo Bonzini       int x0 = (lose0 & x) != 0;
253076cad711SPaolo Bonzini       int x1 = (lose1 & x) != 0;
253176cad711SPaolo Bonzini 
253276cad711SPaolo Bonzini       if (x0 != x1)
253376cad711SPaolo Bonzini         return x1 - x0;
253476cad711SPaolo Bonzini     }
253576cad711SPaolo Bonzini 
253676cad711SPaolo Bonzini   /* They are functionally equal.  So as long as the opcode table is
253776cad711SPaolo Bonzini      valid, we can put whichever one first we want, on aesthetic grounds.  */
253876cad711SPaolo Bonzini 
253976cad711SPaolo Bonzini   /* Our first aesthetic ground is that aliases defer to real insns.  */
254076cad711SPaolo Bonzini   {
254176cad711SPaolo Bonzini     int alias_diff = (op0->flags & F_ALIAS) - (op1->flags & F_ALIAS);
254276cad711SPaolo Bonzini 
254376cad711SPaolo Bonzini     if (alias_diff != 0)
254476cad711SPaolo Bonzini       /* Put the one that isn't an alias first.  */
254576cad711SPaolo Bonzini       return alias_diff;
254676cad711SPaolo Bonzini   }
254776cad711SPaolo Bonzini 
254876cad711SPaolo Bonzini   /* Except for aliases, two "identical" instructions had
254976cad711SPaolo Bonzini      better have the same opcode.  This is a sanity check on the table.  */
255076cad711SPaolo Bonzini   i = strcmp (op0->name, op1->name);
255176cad711SPaolo Bonzini   if (i)
255276cad711SPaolo Bonzini     {
255376cad711SPaolo Bonzini       if (op0->flags & F_ALIAS) /* If they're both aliases, be arbitrary.  */
255476cad711SPaolo Bonzini         return i;
255576cad711SPaolo Bonzini       else
255676cad711SPaolo Bonzini         fprintf (stderr,
255776cad711SPaolo Bonzini                  /* xgettext:c-format */
2558ca66f1a1SLluís Vilanova                  "Internal error: bad sparc-opcode.h: \"%s\" == \"%s\"\n",
255976cad711SPaolo Bonzini                  op0->name, op1->name);
256076cad711SPaolo Bonzini     }
256176cad711SPaolo Bonzini 
256276cad711SPaolo Bonzini   /* Fewer arguments are preferred.  */
256376cad711SPaolo Bonzini   {
256476cad711SPaolo Bonzini     int length_diff = strlen (op0->args) - strlen (op1->args);
256576cad711SPaolo Bonzini 
256676cad711SPaolo Bonzini     if (length_diff != 0)
256776cad711SPaolo Bonzini       /* Put the one with fewer arguments first.  */
256876cad711SPaolo Bonzini       return length_diff;
256976cad711SPaolo Bonzini   }
257076cad711SPaolo Bonzini 
257176cad711SPaolo Bonzini   /* Put 1+i before i+1.  */
257276cad711SPaolo Bonzini   {
257376cad711SPaolo Bonzini     char *p0 = (char *) strchr (op0->args, '+');
257476cad711SPaolo Bonzini     char *p1 = (char *) strchr (op1->args, '+');
257576cad711SPaolo Bonzini 
257676cad711SPaolo Bonzini     if (p0 && p1)
257776cad711SPaolo Bonzini       {
257876cad711SPaolo Bonzini         /* There is a plus in both operands.  Note that a plus
257976cad711SPaolo Bonzini            sign cannot be the first character in args,
258076cad711SPaolo Bonzini            so the following [-1]'s are valid.  */
258176cad711SPaolo Bonzini         if (p0[-1] == 'i' && p1[1] == 'i')
258276cad711SPaolo Bonzini           /* op0 is i+1 and op1 is 1+i, so op1 goes first.  */
258376cad711SPaolo Bonzini           return 1;
258476cad711SPaolo Bonzini         if (p0[1] == 'i' && p1[-1] == 'i')
258576cad711SPaolo Bonzini           /* op0 is 1+i and op1 is i+1, so op0 goes first.  */
258676cad711SPaolo Bonzini           return -1;
258776cad711SPaolo Bonzini       }
258876cad711SPaolo Bonzini   }
258976cad711SPaolo Bonzini 
259076cad711SPaolo Bonzini   /* Put 1,i before i,1.  */
259176cad711SPaolo Bonzini   {
259276cad711SPaolo Bonzini     int i0 = strncmp (op0->args, "i,1", 3) == 0;
259376cad711SPaolo Bonzini     int i1 = strncmp (op1->args, "i,1", 3) == 0;
259476cad711SPaolo Bonzini 
259576cad711SPaolo Bonzini     if (i0 ^ i1)
259676cad711SPaolo Bonzini       return i0 - i1;
259776cad711SPaolo Bonzini   }
259876cad711SPaolo Bonzini 
259976cad711SPaolo Bonzini   /* They are, as far as we can tell, identical.
260076cad711SPaolo Bonzini      Since qsort may have rearranged the table partially, there is
260176cad711SPaolo Bonzini      no way to tell which one was first in the opcode table as
260276cad711SPaolo Bonzini      written, so just say there are equal.  */
260376cad711SPaolo Bonzini   /* ??? This is no longer true now that we sort a vector of pointers,
260476cad711SPaolo Bonzini      not the table itself.  */
260576cad711SPaolo Bonzini   return 0;
260676cad711SPaolo Bonzini }
260776cad711SPaolo Bonzini 
260876cad711SPaolo Bonzini /* Build a hash table from the opcode table.
260976cad711SPaolo Bonzini    OPCODE_TABLE is a sorted list of pointers into the opcode table.  */
261076cad711SPaolo Bonzini 
261176cad711SPaolo Bonzini static void
build_hash_table(const sparc_opcode ** opcode_table,sparc_opcode_hash ** hash_table,int num_opcodes)261276cad711SPaolo Bonzini build_hash_table (const sparc_opcode **opcode_table,
261376cad711SPaolo Bonzini                   sparc_opcode_hash **hash_table,
261476cad711SPaolo Bonzini                   int num_opcodes)
261576cad711SPaolo Bonzini {
261676cad711SPaolo Bonzini   int i;
261776cad711SPaolo Bonzini   int hash_count[HASH_SIZE];
261876cad711SPaolo Bonzini   static sparc_opcode_hash *hash_buf = NULL;
261976cad711SPaolo Bonzini 
262076cad711SPaolo Bonzini   /* Start at the end of the table and work backwards so that each
262176cad711SPaolo Bonzini      chain is sorted.  */
262276cad711SPaolo Bonzini 
262376cad711SPaolo Bonzini   memset (hash_table, 0, HASH_SIZE * sizeof (hash_table[0]));
262476cad711SPaolo Bonzini   memset (hash_count, 0, HASH_SIZE * sizeof (hash_count[0]));
262576cad711SPaolo Bonzini   free(hash_buf);
262676cad711SPaolo Bonzini   hash_buf = malloc (sizeof (* hash_buf) * num_opcodes);
262776cad711SPaolo Bonzini   for (i = num_opcodes - 1; i >= 0; --i)
262876cad711SPaolo Bonzini     {
262976cad711SPaolo Bonzini       int hash = HASH_INSN (opcode_table[i]->match);
263076cad711SPaolo Bonzini       sparc_opcode_hash *h = &hash_buf[i];
263176cad711SPaolo Bonzini 
263276cad711SPaolo Bonzini       h->next = hash_table[hash];
263376cad711SPaolo Bonzini       h->opcode = opcode_table[i];
263476cad711SPaolo Bonzini       hash_table[hash] = h;
263576cad711SPaolo Bonzini       ++hash_count[hash];
263676cad711SPaolo Bonzini     }
263776cad711SPaolo Bonzini 
263876cad711SPaolo Bonzini #if 0 /* for debugging */
263976cad711SPaolo Bonzini   {
264076cad711SPaolo Bonzini     int min_count = num_opcodes, max_count = 0;
264176cad711SPaolo Bonzini     int total;
264276cad711SPaolo Bonzini 
264376cad711SPaolo Bonzini     for (i = 0; i < HASH_SIZE; ++i)
264476cad711SPaolo Bonzini       {
264576cad711SPaolo Bonzini         if (hash_count[i] < min_count)
264676cad711SPaolo Bonzini           min_count = hash_count[i];
264776cad711SPaolo Bonzini         if (hash_count[i] > max_count)
264876cad711SPaolo Bonzini           max_count = hash_count[i];
264976cad711SPaolo Bonzini         total += hash_count[i];
265076cad711SPaolo Bonzini       }
265176cad711SPaolo Bonzini 
265276cad711SPaolo Bonzini     printf ("Opcode hash table stats: min %d, max %d, ave %f\n",
265376cad711SPaolo Bonzini             min_count, max_count, (double) total / HASH_SIZE);
265476cad711SPaolo Bonzini   }
265576cad711SPaolo Bonzini #endif
265676cad711SPaolo Bonzini }
265776cad711SPaolo Bonzini 
265876cad711SPaolo Bonzini /* Print one instruction from MEMADDR on INFO->STREAM.
265976cad711SPaolo Bonzini 
266076cad711SPaolo Bonzini    We suffix the instruction with a comment that gives the absolute
266176cad711SPaolo Bonzini    address involved, as well as its symbolic form, if the instruction
266276cad711SPaolo Bonzini    is preceded by a findable `sethi' and it either adds an immediate
266376cad711SPaolo Bonzini    displacement to that register, or it is an `add' or `or' instruction
266476cad711SPaolo Bonzini    on that register.  */
266576cad711SPaolo Bonzini 
266676cad711SPaolo Bonzini int
print_insn_sparc(bfd_vma memaddr,disassemble_info * info)266776cad711SPaolo Bonzini print_insn_sparc (bfd_vma memaddr, disassemble_info *info)
266876cad711SPaolo Bonzini {
266976cad711SPaolo Bonzini   FILE *stream = info->stream;
267076cad711SPaolo Bonzini   bfd_byte buffer[4];
267176cad711SPaolo Bonzini   unsigned long insn;
267276cad711SPaolo Bonzini   sparc_opcode_hash *op;
267376cad711SPaolo Bonzini   /* Nonzero of opcode table has been initialized.  */
267476cad711SPaolo Bonzini   static int opcodes_initialized = 0;
267576cad711SPaolo Bonzini   /* bfd mach number of last call.  */
267676cad711SPaolo Bonzini   static unsigned long current_mach = 0;
267776cad711SPaolo Bonzini   bfd_vma (*getword) (const unsigned char *);
267876cad711SPaolo Bonzini 
267976cad711SPaolo Bonzini   if (!opcodes_initialized
268076cad711SPaolo Bonzini       || info->mach != current_mach)
268176cad711SPaolo Bonzini     {
268276cad711SPaolo Bonzini       int i;
268376cad711SPaolo Bonzini 
268476cad711SPaolo Bonzini       current_arch_mask = compute_arch_mask (info->mach);
268576cad711SPaolo Bonzini 
268676cad711SPaolo Bonzini       if (!opcodes_initialized)
268776cad711SPaolo Bonzini         sorted_opcodes =
268876cad711SPaolo Bonzini           malloc (sparc_num_opcodes * sizeof (sparc_opcode *));
268976cad711SPaolo Bonzini       /* Reset the sorted table so we can resort it.  */
269076cad711SPaolo Bonzini       for (i = 0; i < sparc_num_opcodes; ++i)
269176cad711SPaolo Bonzini         sorted_opcodes[i] = &sparc_opcodes[i];
269276cad711SPaolo Bonzini       qsort ((char *) sorted_opcodes, sparc_num_opcodes,
269376cad711SPaolo Bonzini              sizeof (sorted_opcodes[0]), compare_opcodes);
269476cad711SPaolo Bonzini 
269576cad711SPaolo Bonzini       build_hash_table (sorted_opcodes, opcode_hash_table, sparc_num_opcodes);
269676cad711SPaolo Bonzini       current_mach = info->mach;
269776cad711SPaolo Bonzini       opcodes_initialized = 1;
269876cad711SPaolo Bonzini     }
269976cad711SPaolo Bonzini 
270076cad711SPaolo Bonzini   {
270176cad711SPaolo Bonzini     int status =
270276cad711SPaolo Bonzini       (*info->read_memory_func) (memaddr, buffer, sizeof (buffer), info);
270376cad711SPaolo Bonzini 
270476cad711SPaolo Bonzini     if (status != 0)
270576cad711SPaolo Bonzini       {
270676cad711SPaolo Bonzini         (*info->memory_error_func) (status, memaddr, info);
270776cad711SPaolo Bonzini         return -1;
270876cad711SPaolo Bonzini       }
270976cad711SPaolo Bonzini   }
271076cad711SPaolo Bonzini 
271176cad711SPaolo Bonzini   /* On SPARClite variants such as DANlite (sparc86x), instructions
271276cad711SPaolo Bonzini      are always big-endian even when the machine is in little-endian mode.  */
271376cad711SPaolo Bonzini   if (info->endian == BFD_ENDIAN_BIG || info->mach == bfd_mach_sparc_sparclite)
271476cad711SPaolo Bonzini     getword = bfd_getb32;
271576cad711SPaolo Bonzini   else
271676cad711SPaolo Bonzini     getword = bfd_getl32;
271776cad711SPaolo Bonzini 
271876cad711SPaolo Bonzini   insn = getword (buffer);
271976cad711SPaolo Bonzini 
272076cad711SPaolo Bonzini   info->insn_info_valid = 1;                    /* We do return this info.  */
272176cad711SPaolo Bonzini   info->insn_type = dis_nonbranch;              /* Assume non branch insn.  */
272276cad711SPaolo Bonzini   info->branch_delay_insns = 0;                 /* Assume no delay.  */
272376cad711SPaolo Bonzini   info->target = 0;                             /* Assume no target known.  */
272476cad711SPaolo Bonzini 
272576cad711SPaolo Bonzini   for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
272676cad711SPaolo Bonzini     {
272776cad711SPaolo Bonzini       const sparc_opcode *opcode = op->opcode;
272876cad711SPaolo Bonzini 
272976cad711SPaolo Bonzini       /* If the insn isn't supported by the current architecture, skip it.  */
273076cad711SPaolo Bonzini       if (! (opcode->architecture & current_arch_mask))
273176cad711SPaolo Bonzini         continue;
273276cad711SPaolo Bonzini 
273376cad711SPaolo Bonzini       if ((opcode->match & insn) == opcode->match
273476cad711SPaolo Bonzini           && (opcode->lose & insn) == 0)
273576cad711SPaolo Bonzini         {
273676cad711SPaolo Bonzini           /* Nonzero means that we have found an instruction which has
273776cad711SPaolo Bonzini              the effect of adding or or'ing the imm13 field to rs1.  */
273876cad711SPaolo Bonzini           int imm_added_to_rs1 = 0;
273976cad711SPaolo Bonzini           int imm_ored_to_rs1 = 0;
274076cad711SPaolo Bonzini 
274176cad711SPaolo Bonzini           /* Nonzero means that we have found a plus sign in the args
274276cad711SPaolo Bonzini              field of the opcode table.  */
274376cad711SPaolo Bonzini           int found_plus = 0;
274476cad711SPaolo Bonzini 
274576cad711SPaolo Bonzini           /* Nonzero means we have an annulled branch.  */
274676cad711SPaolo Bonzini           /* int is_annulled = 0; */ /* see FIXME below */
274776cad711SPaolo Bonzini 
274876cad711SPaolo Bonzini           /* Do we have an `add' or `or' instruction combining an
274976cad711SPaolo Bonzini              immediate with rs1?  */
275076cad711SPaolo Bonzini           if (opcode->match == 0x80102000) /* or */
275176cad711SPaolo Bonzini             imm_ored_to_rs1 = 1;
275276cad711SPaolo Bonzini           if (opcode->match == 0x80002000) /* add */
275376cad711SPaolo Bonzini             imm_added_to_rs1 = 1;
275476cad711SPaolo Bonzini 
275576cad711SPaolo Bonzini           if (X_RS1 (insn) != X_RD (insn)
275676cad711SPaolo Bonzini               && strchr (opcode->args, 'r') != NULL)
275776cad711SPaolo Bonzini               /* Can't do simple format if source and dest are different.  */
275876cad711SPaolo Bonzini               continue;
275976cad711SPaolo Bonzini           if (X_RS2 (insn) != X_RD (insn)
276076cad711SPaolo Bonzini               && strchr (opcode->args, 'O') != NULL)
276176cad711SPaolo Bonzini               /* Can't do simple format if source and dest are different.  */
276276cad711SPaolo Bonzini               continue;
276376cad711SPaolo Bonzini 
276476cad711SPaolo Bonzini           (*info->fprintf_func) (stream, "%s", opcode->name);
276576cad711SPaolo Bonzini 
276676cad711SPaolo Bonzini           {
276776cad711SPaolo Bonzini             const char *s;
276876cad711SPaolo Bonzini 
276976cad711SPaolo Bonzini             if (opcode->args[0] != ',')
277076cad711SPaolo Bonzini               (*info->fprintf_func) (stream, " ");
277176cad711SPaolo Bonzini 
277276cad711SPaolo Bonzini             for (s = opcode->args; *s != '\0'; ++s)
277376cad711SPaolo Bonzini               {
277476cad711SPaolo Bonzini                 while (*s == ',')
277576cad711SPaolo Bonzini                   {
277676cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, ",");
277776cad711SPaolo Bonzini                     ++s;
277876cad711SPaolo Bonzini                     switch (*s)
277976cad711SPaolo Bonzini                       {
278076cad711SPaolo Bonzini                       case 'a':
278176cad711SPaolo Bonzini                         (*info->fprintf_func) (stream, "a");
278276cad711SPaolo Bonzini                         /* is_annulled = 1; */ /* see FIXME below */
278376cad711SPaolo Bonzini                         ++s;
278476cad711SPaolo Bonzini                         continue;
278576cad711SPaolo Bonzini                       case 'N':
278676cad711SPaolo Bonzini                         (*info->fprintf_func) (stream, "pn");
278776cad711SPaolo Bonzini                         ++s;
278876cad711SPaolo Bonzini                         continue;
278976cad711SPaolo Bonzini 
279076cad711SPaolo Bonzini                       case 'T':
279176cad711SPaolo Bonzini                         (*info->fprintf_func) (stream, "pt");
279276cad711SPaolo Bonzini                         ++s;
279376cad711SPaolo Bonzini                         continue;
279476cad711SPaolo Bonzini 
279576cad711SPaolo Bonzini                       default:
279676cad711SPaolo Bonzini                         break;
279776cad711SPaolo Bonzini                       }
279876cad711SPaolo Bonzini                   }
279976cad711SPaolo Bonzini 
280076cad711SPaolo Bonzini                 (*info->fprintf_func) (stream, " ");
280176cad711SPaolo Bonzini 
280276cad711SPaolo Bonzini                 switch (*s)
280376cad711SPaolo Bonzini                   {
280476cad711SPaolo Bonzini                   case '+':
280576cad711SPaolo Bonzini                     found_plus = 1;
280676cad711SPaolo Bonzini                     /* Fall through.  */
280776cad711SPaolo Bonzini 
280876cad711SPaolo Bonzini                   default:
280976cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%c", *s);
281076cad711SPaolo Bonzini                     break;
281176cad711SPaolo Bonzini 
281276cad711SPaolo Bonzini                   case '#':
281376cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "0");
281476cad711SPaolo Bonzini                     break;
281576cad711SPaolo Bonzini 
281676cad711SPaolo Bonzini #define reg(n)  (*info->fprintf_func) (stream, "%%%s", reg_names[n])
281776cad711SPaolo Bonzini                   case '1':
281876cad711SPaolo Bonzini                   case 'r':
281976cad711SPaolo Bonzini                     reg (X_RS1 (insn));
282076cad711SPaolo Bonzini                     break;
282176cad711SPaolo Bonzini 
282276cad711SPaolo Bonzini                   case '2':
282376cad711SPaolo Bonzini                   case 'O':
282476cad711SPaolo Bonzini                     reg (X_RS2 (insn));
282576cad711SPaolo Bonzini                     break;
282676cad711SPaolo Bonzini 
282776cad711SPaolo Bonzini                   case 'd':
282876cad711SPaolo Bonzini                     reg (X_RD (insn));
282976cad711SPaolo Bonzini                     break;
283076cad711SPaolo Bonzini #undef  reg
283176cad711SPaolo Bonzini 
283276cad711SPaolo Bonzini #define freg(n)         (*info->fprintf_func) (stream, "%%%s", freg_names[n])
283376cad711SPaolo Bonzini #define fregx(n)        (*info->fprintf_func) (stream, "%%%s", freg_names[((n) & ~1) | (((n) & 1) << 5)])
283476cad711SPaolo Bonzini                   case 'e':
283576cad711SPaolo Bonzini                     freg (X_RS1 (insn));
283676cad711SPaolo Bonzini                     break;
283776cad711SPaolo Bonzini                   case 'v':     /* Double/even.  */
283876cad711SPaolo Bonzini                   case 'V':     /* Quad/multiple of 4.  */
283976cad711SPaolo Bonzini                     fregx (X_RS1 (insn));
284076cad711SPaolo Bonzini                     break;
284176cad711SPaolo Bonzini 
284276cad711SPaolo Bonzini                   case 'f':
284376cad711SPaolo Bonzini                     freg (X_RS2 (insn));
284476cad711SPaolo Bonzini                     break;
284576cad711SPaolo Bonzini                   case 'B':     /* Double/even.  */
284676cad711SPaolo Bonzini                   case 'R':     /* Quad/multiple of 4.  */
284776cad711SPaolo Bonzini                     fregx (X_RS2 (insn));
284876cad711SPaolo Bonzini                     break;
284976cad711SPaolo Bonzini 
285076cad711SPaolo Bonzini                   case 'g':
285176cad711SPaolo Bonzini                     freg (X_RD (insn));
285276cad711SPaolo Bonzini                     break;
285376cad711SPaolo Bonzini                   case 'H':     /* Double/even.  */
285476cad711SPaolo Bonzini                   case 'J':     /* Quad/multiple of 4.  */
285576cad711SPaolo Bonzini                     fregx (X_RD (insn));
285676cad711SPaolo Bonzini                     break;
285776cad711SPaolo Bonzini #undef  freg
285876cad711SPaolo Bonzini #undef  fregx
285976cad711SPaolo Bonzini 
286076cad711SPaolo Bonzini #define creg(n) (*info->fprintf_func) (stream, "%%c%u", (unsigned int) (n))
286176cad711SPaolo Bonzini                   case 'b':
286276cad711SPaolo Bonzini                     creg (X_RS1 (insn));
286376cad711SPaolo Bonzini                     break;
286476cad711SPaolo Bonzini 
286576cad711SPaolo Bonzini                   case 'c':
286676cad711SPaolo Bonzini                     creg (X_RS2 (insn));
286776cad711SPaolo Bonzini                     break;
286876cad711SPaolo Bonzini 
286976cad711SPaolo Bonzini                   case 'D':
287076cad711SPaolo Bonzini                     creg (X_RD (insn));
287176cad711SPaolo Bonzini                     break;
287276cad711SPaolo Bonzini #undef  creg
287376cad711SPaolo Bonzini 
287476cad711SPaolo Bonzini                   case 'h':
287576cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%hi(%#x)",
287676cad711SPaolo Bonzini                                            ((unsigned) 0xFFFFFFFF
287776cad711SPaolo Bonzini                                             & ((int) X_IMM22 (insn) << 10)));
287876cad711SPaolo Bonzini                     break;
287976cad711SPaolo Bonzini 
288076cad711SPaolo Bonzini                   case 'i':     /* 13 bit immediate.  */
288176cad711SPaolo Bonzini                   case 'I':     /* 11 bit immediate.  */
288276cad711SPaolo Bonzini                   case 'j':     /* 10 bit immediate.  */
288376cad711SPaolo Bonzini                     {
288476cad711SPaolo Bonzini                       int imm;
288576cad711SPaolo Bonzini 
288676cad711SPaolo Bonzini                       if (*s == 'i')
288776cad711SPaolo Bonzini                         imm = X_SIMM (insn, 13);
288876cad711SPaolo Bonzini                       else if (*s == 'I')
288976cad711SPaolo Bonzini                         imm = X_SIMM (insn, 11);
289076cad711SPaolo Bonzini                       else
289176cad711SPaolo Bonzini                         imm = X_SIMM (insn, 10);
289276cad711SPaolo Bonzini 
289376cad711SPaolo Bonzini                       /* Check to see whether we have a 1+i, and take
289476cad711SPaolo Bonzini                          note of that fact.
289576cad711SPaolo Bonzini 
289676cad711SPaolo Bonzini                          Note: because of the way we sort the table,
289776cad711SPaolo Bonzini                          we will be matching 1+i rather than i+1,
289876cad711SPaolo Bonzini                          so it is OK to assume that i is after +,
289976cad711SPaolo Bonzini                          not before it.  */
290076cad711SPaolo Bonzini                       if (found_plus)
290176cad711SPaolo Bonzini                         imm_added_to_rs1 = 1;
290276cad711SPaolo Bonzini 
290376cad711SPaolo Bonzini                       if (imm <= 9)
290476cad711SPaolo Bonzini                         (*info->fprintf_func) (stream, "%d", imm);
290576cad711SPaolo Bonzini                       else
290676cad711SPaolo Bonzini                         (*info->fprintf_func) (stream, "%#x", imm);
290776cad711SPaolo Bonzini                     }
290876cad711SPaolo Bonzini                     break;
290976cad711SPaolo Bonzini 
291076cad711SPaolo Bonzini                   case 'X':     /* 5 bit unsigned immediate.  */
291176cad711SPaolo Bonzini                   case 'Y':     /* 6 bit unsigned immediate.  */
291276cad711SPaolo Bonzini                     {
291376cad711SPaolo Bonzini                       int imm = X_IMM (insn, *s == 'X' ? 5 : 6);
291476cad711SPaolo Bonzini 
291576cad711SPaolo Bonzini                       if (imm <= 9)
291676cad711SPaolo Bonzini                         (info->fprintf_func) (stream, "%d", imm);
291776cad711SPaolo Bonzini                       else
291876cad711SPaolo Bonzini                         (info->fprintf_func) (stream, "%#x", (unsigned) imm);
291976cad711SPaolo Bonzini                     }
292076cad711SPaolo Bonzini                     break;
292176cad711SPaolo Bonzini 
292276cad711SPaolo Bonzini                   case '3':
292376cad711SPaolo Bonzini                     (info->fprintf_func) (stream, "%ld", X_IMM (insn, 3));
292476cad711SPaolo Bonzini                     break;
292576cad711SPaolo Bonzini 
292676cad711SPaolo Bonzini                   case 'K':
292776cad711SPaolo Bonzini                     {
292876cad711SPaolo Bonzini                       int mask = X_MEMBAR (insn);
292976cad711SPaolo Bonzini                       int bit = 0x40, printed_one = 0;
293076cad711SPaolo Bonzini                       const char *name;
293176cad711SPaolo Bonzini 
293276cad711SPaolo Bonzini                       if (mask == 0)
293376cad711SPaolo Bonzini                         (info->fprintf_func) (stream, "0");
293476cad711SPaolo Bonzini                       else
293576cad711SPaolo Bonzini                         while (bit)
293676cad711SPaolo Bonzini                           {
293776cad711SPaolo Bonzini                             if (mask & bit)
293876cad711SPaolo Bonzini                               {
293976cad711SPaolo Bonzini                                 if (printed_one)
294076cad711SPaolo Bonzini                                   (info->fprintf_func) (stream, "|");
294176cad711SPaolo Bonzini                                 name = sparc_decode_membar (bit);
294276cad711SPaolo Bonzini                                 (info->fprintf_func) (stream, "%s", name);
294376cad711SPaolo Bonzini                                 printed_one = 1;
294476cad711SPaolo Bonzini                               }
294576cad711SPaolo Bonzini                             bit >>= 1;
294676cad711SPaolo Bonzini                           }
294776cad711SPaolo Bonzini                       break;
294876cad711SPaolo Bonzini                     }
294976cad711SPaolo Bonzini 
295076cad711SPaolo Bonzini                   case 'k':
295176cad711SPaolo Bonzini                     info->target = memaddr + SEX (X_DISP16 (insn), 16) * 4;
295276cad711SPaolo Bonzini                     (*info->print_address_func) (info->target, info);
295376cad711SPaolo Bonzini                     break;
295476cad711SPaolo Bonzini 
295576cad711SPaolo Bonzini                   case 'G':
295676cad711SPaolo Bonzini                     info->target = memaddr + SEX (X_DISP19 (insn), 19) * 4;
295776cad711SPaolo Bonzini                     (*info->print_address_func) (info->target, info);
295876cad711SPaolo Bonzini                     break;
295976cad711SPaolo Bonzini 
296076cad711SPaolo Bonzini                   case '6':
296176cad711SPaolo Bonzini                   case '7':
296276cad711SPaolo Bonzini                   case '8':
296376cad711SPaolo Bonzini                   case '9':
296476cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%fcc%c", *s - '6' + '0');
296576cad711SPaolo Bonzini                     break;
296676cad711SPaolo Bonzini 
296776cad711SPaolo Bonzini                   case 'z':
296876cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%icc");
296976cad711SPaolo Bonzini                     break;
297076cad711SPaolo Bonzini 
297176cad711SPaolo Bonzini                   case 'Z':
297276cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%xcc");
297376cad711SPaolo Bonzini                     break;
297476cad711SPaolo Bonzini 
297576cad711SPaolo Bonzini                   case 'E':
297676cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%ccr");
297776cad711SPaolo Bonzini                     break;
297876cad711SPaolo Bonzini 
297976cad711SPaolo Bonzini                   case 's':
298076cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%fprs");
298176cad711SPaolo Bonzini                     break;
298276cad711SPaolo Bonzini 
298376cad711SPaolo Bonzini                   case 'o':
298476cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%asi");
298576cad711SPaolo Bonzini                     break;
298676cad711SPaolo Bonzini 
298776cad711SPaolo Bonzini                   case 'W':
298876cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%tick");
298976cad711SPaolo Bonzini                     break;
299076cad711SPaolo Bonzini 
299176cad711SPaolo Bonzini                   case 'P':
299276cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%pc");
299376cad711SPaolo Bonzini                     break;
299476cad711SPaolo Bonzini 
299576cad711SPaolo Bonzini                   case '?':
299676cad711SPaolo Bonzini                     if (X_RS1 (insn) == 31)
299776cad711SPaolo Bonzini                       (*info->fprintf_func) (stream, "%%ver");
299876cad711SPaolo Bonzini                     else if ((unsigned) X_RS1 (insn) < 17)
299976cad711SPaolo Bonzini                       (*info->fprintf_func) (stream, "%%%s",
300076cad711SPaolo Bonzini                                              v9_priv_reg_names[X_RS1 (insn)]);
300176cad711SPaolo Bonzini                     else
300276cad711SPaolo Bonzini                       (*info->fprintf_func) (stream, "%%reserved");
300376cad711SPaolo Bonzini                     break;
300476cad711SPaolo Bonzini 
300576cad711SPaolo Bonzini                   case '!':
300676cad711SPaolo Bonzini                     if ((unsigned) X_RD (insn) < 17)
300776cad711SPaolo Bonzini                       (*info->fprintf_func) (stream, "%%%s",
300876cad711SPaolo Bonzini                                              v9_priv_reg_names[X_RD (insn)]);
300976cad711SPaolo Bonzini                     else
301076cad711SPaolo Bonzini                       (*info->fprintf_func) (stream, "%%reserved");
301176cad711SPaolo Bonzini                     break;
301276cad711SPaolo Bonzini 
301376cad711SPaolo Bonzini                   case '$':
301476cad711SPaolo Bonzini                     if ((unsigned) X_RS1 (insn) < 32)
301576cad711SPaolo Bonzini                       (*info->fprintf_func) (stream, "%%%s",
301676cad711SPaolo Bonzini                                              v9_hpriv_reg_names[X_RS1 (insn)]);
301776cad711SPaolo Bonzini                     else
301876cad711SPaolo Bonzini                       (*info->fprintf_func) (stream, "%%reserved");
301976cad711SPaolo Bonzini                     break;
302076cad711SPaolo Bonzini 
302176cad711SPaolo Bonzini                   case '%':
302276cad711SPaolo Bonzini                     if ((unsigned) X_RD (insn) < 32)
302376cad711SPaolo Bonzini                       (*info->fprintf_func) (stream, "%%%s",
302476cad711SPaolo Bonzini                                              v9_hpriv_reg_names[X_RD (insn)]);
302576cad711SPaolo Bonzini                     else
302676cad711SPaolo Bonzini                       (*info->fprintf_func) (stream, "%%reserved");
302776cad711SPaolo Bonzini                     break;
302876cad711SPaolo Bonzini 
302976cad711SPaolo Bonzini                   case '/':
303076cad711SPaolo Bonzini                     if (X_RS1 (insn) < 16 || X_RS1 (insn) > 25)
303176cad711SPaolo Bonzini                       (*info->fprintf_func) (stream, "%%reserved");
303276cad711SPaolo Bonzini                     else
303376cad711SPaolo Bonzini                       (*info->fprintf_func) (stream, "%%%s",
303476cad711SPaolo Bonzini                                              v9a_asr_reg_names[X_RS1 (insn)-16]);
303576cad711SPaolo Bonzini                     break;
303676cad711SPaolo Bonzini 
303776cad711SPaolo Bonzini                   case '_':
303876cad711SPaolo Bonzini                     if (X_RD (insn) < 16 || X_RD (insn) > 25)
303976cad711SPaolo Bonzini                       (*info->fprintf_func) (stream, "%%reserved");
304076cad711SPaolo Bonzini                     else
304176cad711SPaolo Bonzini                       (*info->fprintf_func) (stream, "%%%s",
304276cad711SPaolo Bonzini                                              v9a_asr_reg_names[X_RD (insn)-16]);
304376cad711SPaolo Bonzini                     break;
304476cad711SPaolo Bonzini 
304576cad711SPaolo Bonzini                   case '*':
304676cad711SPaolo Bonzini                     {
304776cad711SPaolo Bonzini                       const char *name = sparc_decode_prefetch (X_RD (insn));
304876cad711SPaolo Bonzini 
304976cad711SPaolo Bonzini                       if (name)
305076cad711SPaolo Bonzini                         (*info->fprintf_func) (stream, "%s", name);
305176cad711SPaolo Bonzini                       else
305276cad711SPaolo Bonzini                         (*info->fprintf_func) (stream, "%ld", X_RD (insn));
305376cad711SPaolo Bonzini                       break;
305476cad711SPaolo Bonzini                     }
305576cad711SPaolo Bonzini 
305676cad711SPaolo Bonzini                   case 'M':
305776cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%asr%ld", X_RS1 (insn));
305876cad711SPaolo Bonzini                     break;
305976cad711SPaolo Bonzini 
306076cad711SPaolo Bonzini                   case 'm':
306176cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%asr%ld", X_RD (insn));
306276cad711SPaolo Bonzini                     break;
306376cad711SPaolo Bonzini 
306476cad711SPaolo Bonzini                   case 'L':
306576cad711SPaolo Bonzini                     info->target = memaddr + SEX (X_DISP30 (insn), 30) * 4;
306676cad711SPaolo Bonzini                     (*info->print_address_func) (info->target, info);
306776cad711SPaolo Bonzini                     break;
306876cad711SPaolo Bonzini 
306976cad711SPaolo Bonzini                   case 'n':
307076cad711SPaolo Bonzini                     (*info->fprintf_func)
307176cad711SPaolo Bonzini                       (stream, "%#x", SEX (X_DISP22 (insn), 22));
307276cad711SPaolo Bonzini                     break;
307376cad711SPaolo Bonzini 
307476cad711SPaolo Bonzini                   case 'l':
307576cad711SPaolo Bonzini                     info->target = memaddr + SEX (X_DISP22 (insn), 22) * 4;
307676cad711SPaolo Bonzini                     (*info->print_address_func) (info->target, info);
307776cad711SPaolo Bonzini                     break;
307876cad711SPaolo Bonzini 
307976cad711SPaolo Bonzini                   case 'A':
308076cad711SPaolo Bonzini                     {
308176cad711SPaolo Bonzini                       const char *name;
308276cad711SPaolo Bonzini 
308376cad711SPaolo Bonzini                       if ((info->mach == bfd_mach_sparc_v8plusa) ||
308476cad711SPaolo Bonzini                           ((info->mach >= bfd_mach_sparc_v9) &&
308576cad711SPaolo Bonzini                            (info->mach <= bfd_mach_sparc_v9b)))
308676cad711SPaolo Bonzini                         name = sparc_decode_asi_v9 (X_ASI (insn));
308776cad711SPaolo Bonzini                       else
308876cad711SPaolo Bonzini                         name = sparc_decode_asi_v8 (X_ASI (insn));
308976cad711SPaolo Bonzini 
309076cad711SPaolo Bonzini                       if (name)
309176cad711SPaolo Bonzini                         (*info->fprintf_func) (stream, "%s", name);
309276cad711SPaolo Bonzini                       else
309376cad711SPaolo Bonzini                         (*info->fprintf_func) (stream, "(%ld)", X_ASI (insn));
309476cad711SPaolo Bonzini                       break;
309576cad711SPaolo Bonzini                     }
309676cad711SPaolo Bonzini 
309776cad711SPaolo Bonzini                   case 'C':
309876cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%csr");
309976cad711SPaolo Bonzini                     break;
310076cad711SPaolo Bonzini 
310176cad711SPaolo Bonzini                   case 'F':
310276cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%fsr");
310376cad711SPaolo Bonzini                     break;
310476cad711SPaolo Bonzini 
310576cad711SPaolo Bonzini                   case 'p':
310676cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%psr");
310776cad711SPaolo Bonzini                     break;
310876cad711SPaolo Bonzini 
310976cad711SPaolo Bonzini                   case 'q':
311076cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%fq");
311176cad711SPaolo Bonzini                     break;
311276cad711SPaolo Bonzini 
311376cad711SPaolo Bonzini                   case 'Q':
311476cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%cq");
311576cad711SPaolo Bonzini                     break;
311676cad711SPaolo Bonzini 
311776cad711SPaolo Bonzini                   case 't':
311876cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%tbr");
311976cad711SPaolo Bonzini                     break;
312076cad711SPaolo Bonzini 
312176cad711SPaolo Bonzini                   case 'w':
312276cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%wim");
312376cad711SPaolo Bonzini                     break;
312476cad711SPaolo Bonzini 
312576cad711SPaolo Bonzini                   case 'x':
312676cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%ld",
312776cad711SPaolo Bonzini                                            ((X_LDST_I (insn) << 8)
312876cad711SPaolo Bonzini                                             + X_ASI (insn)));
312976cad711SPaolo Bonzini                     break;
313076cad711SPaolo Bonzini 
313176cad711SPaolo Bonzini                   case 'y':
313276cad711SPaolo Bonzini                     (*info->fprintf_func) (stream, "%%y");
313376cad711SPaolo Bonzini                     break;
313476cad711SPaolo Bonzini 
313576cad711SPaolo Bonzini                   case 'u':
313676cad711SPaolo Bonzini                   case 'U':
313776cad711SPaolo Bonzini                     {
313876cad711SPaolo Bonzini                       int val = *s == 'U' ? X_RS1 (insn) : X_RD (insn);
313976cad711SPaolo Bonzini                       const char *name = sparc_decode_sparclet_cpreg (val);
314076cad711SPaolo Bonzini 
314176cad711SPaolo Bonzini                       if (name)
314276cad711SPaolo Bonzini                         (*info->fprintf_func) (stream, "%s", name);
314376cad711SPaolo Bonzini                       else
314476cad711SPaolo Bonzini                         (*info->fprintf_func) (stream, "%%cpreg(%d)", val);
314576cad711SPaolo Bonzini                       break;
314676cad711SPaolo Bonzini                     }
314776cad711SPaolo Bonzini                   }
314876cad711SPaolo Bonzini               }
314976cad711SPaolo Bonzini           }
315076cad711SPaolo Bonzini 
315176cad711SPaolo Bonzini           /* If we are adding or or'ing something to rs1, then
315276cad711SPaolo Bonzini              check to see whether the previous instruction was
315376cad711SPaolo Bonzini              a sethi to the same register as in the sethi.
315476cad711SPaolo Bonzini              If so, attempt to print the result of the add or
315576cad711SPaolo Bonzini              or (in this context add and or do the same thing)
315676cad711SPaolo Bonzini              and its symbolic value.  */
315776cad711SPaolo Bonzini           if (imm_ored_to_rs1 || imm_added_to_rs1)
315876cad711SPaolo Bonzini             {
315976cad711SPaolo Bonzini               unsigned long prev_insn;
316076cad711SPaolo Bonzini               int errcode;
316176cad711SPaolo Bonzini 
316276cad711SPaolo Bonzini               if (memaddr >= 4)
316376cad711SPaolo Bonzini                 errcode =
316476cad711SPaolo Bonzini                   (*info->read_memory_func)
316576cad711SPaolo Bonzini                   (memaddr - 4, buffer, sizeof (buffer), info);
316676cad711SPaolo Bonzini               else
316776cad711SPaolo Bonzini                 errcode = 1;
316876cad711SPaolo Bonzini 
316976cad711SPaolo Bonzini               prev_insn = getword (buffer);
317076cad711SPaolo Bonzini 
317176cad711SPaolo Bonzini               if (errcode == 0)
317276cad711SPaolo Bonzini                 {
317376cad711SPaolo Bonzini                   /* If it is a delayed branch, we need to look at the
317476cad711SPaolo Bonzini                      instruction before the delayed branch.  This handles
317576cad711SPaolo Bonzini                      sequences such as:
317676cad711SPaolo Bonzini 
317776cad711SPaolo Bonzini                      sethi %o1, %hi(_foo), %o1
317876cad711SPaolo Bonzini                      call _printf
317976cad711SPaolo Bonzini                      or %o1, %lo(_foo), %o1  */
318076cad711SPaolo Bonzini 
318176cad711SPaolo Bonzini                   if (is_delayed_branch (prev_insn))
318276cad711SPaolo Bonzini                     {
318376cad711SPaolo Bonzini                       if (memaddr >= 8)
318476cad711SPaolo Bonzini                         errcode = (*info->read_memory_func)
318576cad711SPaolo Bonzini                           (memaddr - 8, buffer, sizeof (buffer), info);
318676cad711SPaolo Bonzini                       else
318776cad711SPaolo Bonzini                         errcode = 1;
318876cad711SPaolo Bonzini 
318976cad711SPaolo Bonzini                       prev_insn = getword (buffer);
319076cad711SPaolo Bonzini                     }
319176cad711SPaolo Bonzini                 }
319276cad711SPaolo Bonzini 
319376cad711SPaolo Bonzini               /* If there was a problem reading memory, then assume
319476cad711SPaolo Bonzini                  the previous instruction was not sethi.  */
319576cad711SPaolo Bonzini               if (errcode == 0)
319676cad711SPaolo Bonzini                 {
319776cad711SPaolo Bonzini                   /* Is it sethi to the same register?  */
319876cad711SPaolo Bonzini                   if ((prev_insn & 0xc1c00000) == 0x01000000
319976cad711SPaolo Bonzini                       && X_RD (prev_insn) == X_RS1 (insn))
320076cad711SPaolo Bonzini                     {
320176cad711SPaolo Bonzini                       (*info->fprintf_func) (stream, "\t! ");
320276cad711SPaolo Bonzini                       info->target =
320376cad711SPaolo Bonzini                         ((unsigned) 0xFFFFFFFF
320476cad711SPaolo Bonzini                          & ((int) X_IMM22 (prev_insn) << 10));
320576cad711SPaolo Bonzini                       if (imm_added_to_rs1)
320676cad711SPaolo Bonzini                         info->target += X_SIMM (insn, 13);
320776cad711SPaolo Bonzini                       else
320876cad711SPaolo Bonzini                         info->target |= X_SIMM (insn, 13);
320976cad711SPaolo Bonzini                       (*info->print_address_func) (info->target, info);
321076cad711SPaolo Bonzini                       info->insn_type = dis_dref;
321176cad711SPaolo Bonzini                       info->data_size = 4;  /* FIXME!!! */
321276cad711SPaolo Bonzini                     }
321376cad711SPaolo Bonzini                 }
321476cad711SPaolo Bonzini             }
321576cad711SPaolo Bonzini 
321676cad711SPaolo Bonzini           if (opcode->flags & (F_UNBR|F_CONDBR|F_JSR))
321776cad711SPaolo Bonzini             {
321876cad711SPaolo Bonzini                 /* FIXME -- check is_annulled flag.  */
321976cad711SPaolo Bonzini               if (opcode->flags & F_UNBR)
322076cad711SPaolo Bonzini                 info->insn_type = dis_branch;
322176cad711SPaolo Bonzini               if (opcode->flags & F_CONDBR)
322276cad711SPaolo Bonzini                 info->insn_type = dis_condbranch;
322376cad711SPaolo Bonzini               if (opcode->flags & F_JSR)
322476cad711SPaolo Bonzini                 info->insn_type = dis_jsr;
322576cad711SPaolo Bonzini               if (opcode->flags & F_DELAYED)
322676cad711SPaolo Bonzini                 info->branch_delay_insns = 1;
322776cad711SPaolo Bonzini             }
322876cad711SPaolo Bonzini 
322976cad711SPaolo Bonzini           return sizeof (buffer);
323076cad711SPaolo Bonzini         }
323176cad711SPaolo Bonzini     }
323276cad711SPaolo Bonzini 
323376cad711SPaolo Bonzini   info->insn_type = dis_noninsn;        /* Mark as non-valid instruction.  */
323476cad711SPaolo Bonzini   (*info->fprintf_func) (stream, ".long %#08lx", insn);
323576cad711SPaolo Bonzini   return sizeof (buffer);
323676cad711SPaolo Bonzini }
3237