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 (®_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