1139825Simp/*-
280709Sjake * Copyright (c) 1994 David S. Miller, davem@nadzieja.rutgers.edu
380709Sjake * Copyright (c) 1995 Paul Kranenburg
480709Sjake * All rights reserved.
580709Sjake *
680709Sjake * Redistribution and use in source and binary forms, with or without
780709Sjake * modification, are permitted provided that the following conditions
880709Sjake * are met:
980709Sjake * 1. Redistributions of source code must retain the above copyright
1080709Sjake *    notice, this list of conditions and the following disclaimer.
1180709Sjake * 2. Redistributions in binary form must reproduce the above copyright
1280709Sjake *    notice, this list of conditions and the following disclaimer in the
1380709Sjake *    documentation and/or other materials provided with the distribution.
1480709Sjake * 3. All advertising materials mentioning features or use of this software
1580709Sjake *    must display the following acknowledgement:
1680709Sjake *      This product includes software developed by David Miller.
1780709Sjake * 4. The name of the author may not be used to endorse or promote products
1880709Sjake *    derived from this software without specific prior written permission
1980709Sjake *
2080709Sjake * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2180709Sjake * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2280709Sjake * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2380709Sjake * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2480709Sjake * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2580709Sjake * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2680709Sjake * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2780709Sjake * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2880709Sjake * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2980709Sjake * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3080709Sjake *	from: NetBSD: db_disasm.c,v 1.9 2000/08/16 11:29:42 pk Exp
3180709Sjake */
3280709Sjake
33181640Smarius#include <sys/cdefs.h>
34181640Smarius__FBSDID("$FreeBSD$");
35181640Smarius
3680709Sjake#include <sys/param.h>
37109375Smdodd#include <sys/systm.h>
3880709Sjake
3980709Sjake#include <ddb/ddb.h>
4080709Sjake#include <ddb/db_access.h>
4180709Sjake#include <ddb/db_sym.h>
4280709Sjake
4380709Sjake#include <machine/db_machdep.h>
4486146Stmm#include <machine/instr.h>
4580709Sjake
4680709Sjake#define SIGN(v)			(((v)<0)?"-":"")
4780709Sjake
4880709Sjake/*
4980709Sjake * All Sparc instructions are 32-bits, with the one exception being
5080709Sjake * the set instruction which is actually a macro which expands into
5180709Sjake * two instructions...
5280709Sjake *
5380709Sjake * There are 5 different fields that can be used to identify which
5480709Sjake * operation is encoded into a particular 32-bit insn. There are 3
5580709Sjake * formats for instuctions, which one being used is determined by
5680709Sjake * bits 30-31 of the insn. Here are the bit fields and their names:
5780709Sjake *
5880709Sjake * 1100 0000 0000 0000 0000 0000 0000 0000 op field, determines format
5980709Sjake * 0000 0001 1100 0000 0000 0000 0000 0000 op2 field, format 2 only
6080709Sjake * 0000 0001 1111 1000 0000 0000 0000 0000 op3 field, format 3 only
6180709Sjake * 0000 0000 0000 0000 0010 0000 0000 0000 f3i bit, format 3 only
6280709Sjake * 0000 0000 0000 0000 0001 0000 0000 0000 X bit, format 3 only
6380709Sjake */
6480709Sjake
6580709Sjake/* FORMAT macros used in sparc_i table to decode each opcode */
6686146Stmm#define FORMAT1(a)	(EIF_OP(a))
6786146Stmm#define FORMAT2(a,b)	(EIF_OP(a) | EIF_F2_OP2(b))
6886146Stmm/* For formats 3 and 4 */
6986146Stmm#define FORMAT3(a,b,c)	(EIF_OP(a) | EIF_F3_OP3(b) | EIF_F3_I(c))
7086146Stmm#define FORMAT3F(a,b,c)	(EIF_OP(a) | EIF_F3_OP3(b) | EIF_F3_OPF(c))
7180709Sjake
7280709Sjake/* Helper macros to construct OP3 & OPF */
7380709Sjake#define OP3_X(x,y)	((((x) & 3) << 4) | ((y) & 0xf))
7480709Sjake#define OPF_X(x,y)	((((x) & 0x1f) << 4) | ((y) & 0xf))
7580709Sjake
7680709Sjake/* COND condition codes field... */
7780709Sjake#define COND2(y,x)	(((((y)<<4) & 1)|((x) & 0xf)) << 14)
7880709Sjake
7980709Sjakestruct sparc_insn {
8080709Sjake	  unsigned int match;
81181640Smarius	  const char* name;
82181640Smarius	  const char* format;
8380709Sjake};
8480709Sjake
85190003Smariusstatic const char *const regs[] = {
8680709Sjake	"g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
8780709Sjake	"o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
8880709Sjake	"l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
8980709Sjake	"i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7"
9080709Sjake};
9180709Sjake
92190003Smariusstatic const char *const priv_regs[] = {
9380709Sjake	"tpc", "tnpc", "tstate", "tt", "tick", "tba", "pstate", "tl",
9480709Sjake	"pil", "cwp", "cansave", "canrestore", "cleanwin", "otherwin",
9580709Sjake	"wstate", "fq",
9680709Sjake	"", "", "", "", "", "", "", "",
9780709Sjake	"", "", "", "", "", "", "", "ver"
9880709Sjake};
9980709Sjake
100190003Smariusstatic const char *const state_regs[] = {
10180709Sjake	"y", "", "ccr", "asi", "tick", "pc", "fprs", "asr",
10280709Sjake	"", "", "", "", "", "", "", "",
103181640Smarius	"pcr", "pic", "dcr", "gsr", "set_softint", "clr_softint", "softint",
104181640Smarius	"tick_cmpr", "sys_tick", "sys_tick_cmpr", "", "", "", "", "", "", ""
10580709Sjake};
10680709Sjake
107190003Smariusstatic const char *const ccodes[] = {
10880709Sjake	"fcc0", "fcc1", "fcc2", "fcc3", "icc", "", "xcc", ""
10980709Sjake};
11080709Sjake
111190003Smariusstatic const char *const prefetch[] = {
11280709Sjake	"n_reads", "one_read", "n_writes", "one_write", "page"
11380709Sjake};
11480709Sjake
11580709Sjake
11680709Sjake/* The sparc instruction table has a format field which tells what
11780709Sjake   the operand structure for this instruction is. Here are the codes:
11880709Sjake
11980709SjakeModifiers (nust be first):
12080709Sjake	a -- opcode has annul bit
12180709Sjake	p -- opcode has branch prediction bit
12280709Sjake
12380709SjakeCodes:
12480709Sjake        1 -- source register operand stored in rs1
12580709Sjake	2 -- source register operand stored in rs2
12680709Sjake	d -- destination register operand stored in rd
12780709Sjake	3 -- floating source register in rs1
12880709Sjake	4 -- floating source register in rs2
12980709Sjake	e -- floating destination register in rd
13080709Sjake	i -- 13-bit immediate value stored in simm13
13180709Sjake	j -- 11-bit immediate value stored in simm11
13280709Sjake	l -- displacement using d16lo and d16hi
13380709Sjake	m -- 22-bit fcc displacement value
13480709Sjake	n -- 30-bit displacement used in call insns
13580709Sjake	o -- %fcc number specified in cc1 and cc0 fields
13680709Sjake	p -- address computed by the contents of rs1+rs2
13780709Sjake	q -- address computed by the contents of rs1+simm13
13880709Sjake	r -- prefetch
13980709Sjake	s -- %asi is implicit in the insn, rs1 value not used
14080709Sjake	t -- immediate 8-bit asi value
14180709Sjake	u -- 19-bit fcc displacement value
14280709Sjake	5 -- hard register, %fsr lower-half
14380709Sjake	6 -- hard register, %fsr all
14480709Sjake	7 -- [reg_addr rs1+rs2] imm_asi
14580709Sjake	8 -- [reg_addr rs1+simm13] %asi
14680709Sjake	9 -- logical or of the cmask and mmask fields (membar insn)
14780709Sjake	0 -- icc or xcc condition codes register
14880709Sjake	. -- %fcc, %icc, or %xcc in opf_cc field
14980709Sjake	r -- prefection function stored in fcn field
15080709Sjake	A -- privileged register encoded in rs1
15180709Sjake	B -- state register encoded in rs1
15280709Sjake	C -- %hi(value) where value is stored in imm22 field
15380709Sjake	D -- 32-bit shift count in shcnt32
15480709Sjake	E -- 64-bit shift count in shcnt64
15580709Sjake	F -- software trap number stored in sw_trap
15680709Sjake	G -- privileged register encoded in rd
15780709Sjake	H -- state register encoded in rd
15880709Sjake
15980709SjakeV8 only:
16080709Sjake	Y -- write y register
16180709Sjake	P -- write psr register
16280709Sjake	T -- write tbr register
16380709Sjake	W -- write wim register
16480709Sjake*/
16580709Sjake
16680709Sjake
167181640Smariusstatic const struct sparc_insn sparc_i[] = {
16880709Sjake
16980709Sjake	/*
17080709Sjake	 * Format 1: Call
17180709Sjake	 */
17280709Sjake	{(FORMAT1(1)), "call", "n"},
17380709Sjake
17480709Sjake	/*
17580709Sjake	 * Format 0: Sethi & Branches
17680709Sjake	 */
17780709Sjake	/* Illegal Instruction Trap */
17880709Sjake	{(FORMAT2(0, 0)), "illtrap", "m"},
17980709Sjake
18080709Sjake	/* Note: if imm22 is zero then this is actually a "nop" grrr... */
18180709Sjake	{(FORMAT2(0, 0x4)), "sethi", "Cd"},
18280709Sjake
18380709Sjake	/* Branch on Integer Co`ndition Codes "Bicc" */
18486146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(8)), "ba", "a,m"},
18586146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(0)), "bn", "a,m"},
18686146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(9)), "bne", "a,m"},
18786146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(1)), "be", "a,m"},
18886146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(10)), "bg", "a,m"},
18986146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(2)), "ble", "a,m"},
19086146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(11)), "bge", "a,m"},
19186146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(3)), "bl", "a,m"},
19286146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(12)), "bgu", "a,m"},
19386146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(4)), "bleu", "a,m"},
19486146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(13)), "bcc", "a,m"},
19586146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(5)), "bcs", "a,m"},
19686146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(14)), "bpos", "a,m"},
19786146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(6)), "bneg", "a,m"},
19886146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(15)), "bvc", "a,m"},
19986146Stmm	{(FORMAT2(0, 2) | EIF_F2_COND(7)), "bvs", "a,m"},
20080709Sjake
20180709Sjake	/* Branch on Integer Condition Codes with Prediction "BPcc" */
20286146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(8)), "ba", "ap,u"},
20386146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(0)), "bn", "ap,u"},
20486146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(9)), "bne", "ap,u"},
20586146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(1)), "be", "ap,u"},
20686146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(10)), "bg", "ap,u"},
20786146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(2)), "ble", "ap,u"},
20886146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(11)), "bge", "ap,u"},
20986146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(3)), "bl", "ap,u"},
21086146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(12)), "bgu", "ap,u"},
21186146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(4)), "bleu", "ap,u"},
21286146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(13)), "bcc", "ap,u"},
21386146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(5)), "bcs", "ap,u"},
21486146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(14)), "bpos", "ap,u"},
21586146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(6)), "bneg", "ap,u"},
21686146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(15)), "bvc", "ap,u"},
21786146Stmm	{(FORMAT2(0, 1) | EIF_F2_COND(7)), "bvs", "ap,u"},
21880709Sjake
21980709Sjake	/* Branch on Integer Register with Prediction "BPr" */
22086146Stmm	{(FORMAT2(0, 3) | EIF_F2_RCOND(1)), "brz", "ap,1l"},
22186146Stmm	{(FORMAT2(0, 3) | EIF_F2_A(1) | EIF_F2_P(1) |
22286146Stmm	    EIF_F2_RCOND(2)), "brlex", "ap,1l"},
22386146Stmm	{(FORMAT2(0, 3) | EIF_F2_RCOND(3)), "brlz", "ap,1l"},
22486146Stmm	{(FORMAT2(0, 3) | EIF_F2_RCOND(5)), "brnz", "ap,1l"},
22586146Stmm	{(FORMAT2(0, 3) | EIF_F2_RCOND(6)), "brgz", "ap,1l"},
22686146Stmm	{(FORMAT2(0, 3) | EIF_F2_RCOND(7)), "brgez", "ap,1l"},
22780709Sjake
22880709Sjake	/* Branch on Floating-Point Condition Codes with Prediction "FBPfcc" */
22986146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(8)), "fba", "ap,m"},
23086146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(0)), "fbn", "ap,m"},
23186146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(7)), "fbu", "ap,m"},
23286146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(6)), "fbg", "ap,m"},
23386146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(5)), "fbug", "ap,m"},
23486146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(4)), "fbl", "ap,m"},
23586146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(3)), "fbul", "ap,m"},
23686146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(2)), "fblg", "ap,m"},
23786146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(1)), "fbne", "ap,m"},
23886146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(9)), "fbe", "ap,m"},
23986146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(10)), "fbue", "ap,m"},
24086146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(11)), "fbge", "ap,m"},
24186146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(12)), "fbuge", "ap,m"},
24286146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(13)), "fble", "ap,m"},
24386146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(14)), "fbule", "ap,m"},
24486146Stmm	{(FORMAT2(0, 5) | EIF_F2_COND(15)), "fbo", "ap,m"},
24580709Sjake
24680709Sjake	/* Branch on Floating-Point Condition Codes "FBfcc" */
24786146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(8)), "fba", "a,m"},
24886146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(0)), "fbn", "a,m"},
24986146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(7)), "fbu", "a,m"},
25086146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(6)), "fbg", "a,m"},
25186146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(5)), "fbug", "a,m"},
25286146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(4)), "fbl", "a,m"},
25386146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(3)), "fbul", "a,m"},
25486146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(2)), "fblg", "a,m"},
25586146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(1)), "fbne", "a,m"},
25686146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(9)), "fbe", "a,m"},
25786146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(10)), "fbue", "a,m"},
25886146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(11)), "fbge", "a,m"},
25986146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(12)), "fbuge", "a,m"},
26086146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(13)), "fble", "a,m"},
26186146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(14)), "fbule", "a,m"},
26286146Stmm	{(FORMAT2(0, 6) | EIF_F2_COND(15)), "fbo", "a,m"},
26380709Sjake
26480709Sjake
26580709Sjake
26680709Sjake	/*
26780709Sjake	 * Format 3/2: Arithmetic & misc (table 32, appendix E)
26880709Sjake	 */
26980709Sjake	{FORMAT3(2, OP3_X(0,0), 0), "add", "12d"},
27080709Sjake	{FORMAT3(2, OP3_X(0,0), 1), "add", "1id"},
27180709Sjake	{FORMAT3(2, OP3_X(1,0), 0), "addcc", "12d"},
27280709Sjake	{FORMAT3(2, OP3_X(1,0), 1), "addcc", "1id"},
27380709Sjake	{FORMAT3(2, OP3_X(2,0), 0), "taddcc", "12d"},
27480709Sjake	{FORMAT3(2, OP3_X(2,0), 1), "taddcc", "1id"},
27586146Stmm	{(FORMAT3(2, 0x30, 1) | EIF_F3_RD(0xf)), "sir", "i"},
27680709Sjake	{FORMAT3(2, OP3_X(3,0), 0), "wr", "12H"},
27780709Sjake	{FORMAT3(2, OP3_X(3,0), 1), "wr", "1iH"},
27880709Sjake
27980709Sjake	{FORMAT3(2, OP3_X(0,1), 0), "and", "12d"},
28080709Sjake	{FORMAT3(2, OP3_X(0,1), 1), "and", "1id"},
28180709Sjake	{FORMAT3(2, OP3_X(1,1), 0), "andcc", "12d"},
28280709Sjake	{FORMAT3(2, OP3_X(1,1), 1), "andcc", "1id"},
28380709Sjake	{FORMAT3(2, OP3_X(2,1), 0), "tsubcc", "12d"},
28480709Sjake	{FORMAT3(2, OP3_X(2,1), 1), "tsubcc", "1id"},
28580709Sjake	{FORMAT3(2, OP3_X(3,1), 0), "saved", ""},
28686146Stmm	{FORMAT3(2, OP3_X(3,1), 0) | EIF_F3_FCN(1), "restored", ""},
28780709Sjake
28880709Sjake	{FORMAT3(2, OP3_X(0,2), 0), "or", "12d"},
28980709Sjake	{FORMAT3(2, OP3_X(0,2), 1), "or", "1id"},
29080709Sjake	{FORMAT3(2, OP3_X(1,2), 0), "orcc", "12d"},
29180709Sjake	{FORMAT3(2, OP3_X(1,2), 1), "orcc", "1id"},
29280709Sjake	{FORMAT3(2, OP3_X(2,2), 0), "taddcctv", "12d"},
29380709Sjake	{FORMAT3(2, OP3_X(2,2), 1), "taddcctv", "1id"},
29480709Sjake	{FORMAT3(2, OP3_X(3,2), 0), "wrpr", "12G"},
29580709Sjake	{FORMAT3(2, OP3_X(3,2), 1), "wrpr", "1iG"},
29680709Sjake
29780709Sjake	{FORMAT3(2, OP3_X(0,3), 0), "xor", "12d"},
29880709Sjake	{FORMAT3(2, OP3_X(0,3), 1), "xor", "1id"},
29980709Sjake	{FORMAT3(2, OP3_X(1,3), 0), "xorcc", "12d"},
30080709Sjake	{FORMAT3(2, OP3_X(1,3), 1), "xorcc", "1id"},
30180709Sjake	{FORMAT3(2, OP3_X(2,3), 0), "tsubcctv", "12d"},
30280709Sjake	{FORMAT3(2, OP3_X(2,3), 1), "tsubcctv", "1id"},
30380709Sjake	{FORMAT3(2, OP3_X(3,3), 0), "UNDEFINED", ""},
30480709Sjake
30580709Sjake	{FORMAT3(2, OP3_X(0,4), 0), "sub", "12d"},
30680709Sjake	{FORMAT3(2, OP3_X(0,4), 1), "sub", "1id"},
30780709Sjake	{FORMAT3(2, OP3_X(1,4), 0), "subcc", "12d"},
30880709Sjake	{FORMAT3(2, OP3_X(1,4), 1), "subcc", "1id"},
30980709Sjake	{FORMAT3(2, OP3_X(2,4), 0), "mulscc", "12d"},
31080709Sjake	{FORMAT3(2, OP3_X(2,4), 1), "mulscc", "1id"},
31180709Sjake	{FORMAT3(2, OP3_X(3,4), 1), "FPop1", ""},	/* see below */
31280709Sjake
31380709Sjake	{FORMAT3(2, OP3_X(0,5), 0), "andn", "12d"},
31480709Sjake	{FORMAT3(2, OP3_X(0,5), 1), "andn", "1id"},
31580709Sjake	{FORMAT3(2, OP3_X(1,5), 0), "andncc", "12d"},
31680709Sjake	{FORMAT3(2, OP3_X(1,5), 1), "andncc", "1id"},
31780709Sjake	{FORMAT3(2, OP3_X(2,5), 0), "sll", "12d"},
31880709Sjake	{FORMAT3(2, OP3_X(2,5), 1), "sll", "1Dd"},
31986146Stmm	{FORMAT3(2, OP3_X(2,5), 0) | EIF_F3_X(1), "sllx", "12d"},
32086146Stmm	{FORMAT3(2, OP3_X(2,5), 1) | EIF_F3_X(1), "sllx", "1Ed"},
32180709Sjake	{FORMAT3(2, OP3_X(3,5), 1), "FPop2", ""},	/* see below */
32280709Sjake
32380709Sjake	{FORMAT3(2, OP3_X(0,6), 0), "orn", "12d"},
32480709Sjake	{FORMAT3(2, OP3_X(0,6), 1), "orn", "1id"},
32580709Sjake	{FORMAT3(2, OP3_X(1,6), 0), "orncc", "12d"},
32680709Sjake	{FORMAT3(2, OP3_X(1,6), 1), "orncc", "1id"},
32780709Sjake	{FORMAT3(2, OP3_X(2,6), 0), "srl", "12d"},
32880709Sjake	{FORMAT3(2, OP3_X(2,6), 1), "srl", "1Dd"},
32986146Stmm	{FORMAT3(2, OP3_X(2,6), 0) | EIF_F3_X(1), "srlx", "12d"},
33086146Stmm	{FORMAT3(2, OP3_X(2,6), 1) | EIF_F3_X(1), "srlx", "1Ed"},
33180709Sjake	{FORMAT3(2, OP3_X(3,6), 1), "impdep1", ""},
33280709Sjake
33380709Sjake	{FORMAT3(2, OP3_X(0,7), 0), "xorn", "12d"},
33480709Sjake	{FORMAT3(2, OP3_X(0,7), 1), "xorn", "1id"},
33580709Sjake	{FORMAT3(2, OP3_X(1,7), 0), "xorncc", "12d"},
33680709Sjake	{FORMAT3(2, OP3_X(1,7), 1), "xorncc", "1id"},
33780709Sjake	{FORMAT3(2, OP3_X(2,7), 0), "sra", "12d"},
33880709Sjake	{FORMAT3(2, OP3_X(2,7), 1), "sra", "1Dd"},
33986146Stmm	{FORMAT3(2, OP3_X(2,7), 0) | EIF_F3_X(1), "srax", "12d"},
34086146Stmm	{FORMAT3(2, OP3_X(2,7), 1) | EIF_F3_X(1), "srax", "1Ed"},
34180709Sjake	{FORMAT3(2, OP3_X(3,7), 1), "impdep2", ""},
34280709Sjake
34380709Sjake	{FORMAT3(2, OP3_X(0,8), 0), "addc", "12d"},
34480709Sjake	{FORMAT3(2, OP3_X(0,8), 1), "addc", "1id"},
34580709Sjake	{FORMAT3(2, OP3_X(1,8), 0), "addccc", "12d"},
34680709Sjake	{FORMAT3(2, OP3_X(1,8), 1), "addccc", "1id"},
34786146Stmm	{(FORMAT3(2, 0x28, 1) | EIF_F3_RS1(15)), "membar", "9"},
34886146Stmm	{(FORMAT3(2, 0x28, 0) | EIF_F3_RS1(15)), "stbar", ""},
34980709Sjake	{FORMAT3(2, OP3_X(2,8), 0), "rd", "Bd"},
35080709Sjake
35180709Sjake	{FORMAT3(2, OP3_X(3,8), 0), "jmpl", "pd"},
35280709Sjake	{FORMAT3(2, OP3_X(3,8), 1), "jmpl", "qd"},
35380709Sjake
35480709Sjake	{FORMAT3(2, OP3_X(0,9), 0), "mulx", "12d"},
35580709Sjake	{FORMAT3(2, OP3_X(0,9), 1), "mulx", "1id"},
35680709Sjake	{FORMAT3(2, OP3_X(1,9), 0), "UNDEFINED", ""},
35780709Sjake	{FORMAT3(2, OP3_X(2,9), 0), "UNDEFINED", ""},
35880709Sjake	{FORMAT3(2, OP3_X(3,9), 0), "return", "p"},
35980709Sjake	{FORMAT3(2, OP3_X(3,9), 1), "return", "q"},
36080709Sjake
36180709Sjake	{FORMAT3(2, OP3_X(0,10), 0), "umul", "12d"},
36280709Sjake	{FORMAT3(2, OP3_X(0,10), 1), "umul", "1id"},
36380709Sjake	{FORMAT3(2, OP3_X(1,10), 0), "umulcc", "12d"},
36480709Sjake	{FORMAT3(2, OP3_X(1,10), 1), "umulcc", "1id"},
36580709Sjake	{FORMAT3(2, OP3_X(2,10), 0), "rdpr", "Ad"},
36680709Sjake		/*
36780709Sjake		 * OP3 = (3,10): TCC: Trap on Integer Condition Codes
36880709Sjake		 */
36986146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x8)), "ta", "12F"},
37086146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x8)), "ta", "0F"},
37186146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x0)), "tn", "12F"},
37286146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x0)), "tn", "0F"},
37386146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x9)), "tne", "12F"},
37486146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x9)), "tne", "0F"},
37586146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x1)), "te", "12F"},
37686146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x1)), "te", "0F"},
37786146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0xa)), "tg", "12F"},
37886146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0xa)), "tg", "0F"},
37986146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x2)), "tle", "12F"},
38086146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x2)), "tle", "0F"},
38186146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0xb)), "tge", "12F"},
38286146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0xb)), "tge", "0F"},
38386146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x3)), "tl", "12F"},
38486146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x3)), "tl", "0F"},
38586146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0xc)), "tgu", "12F"},
38686146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0xc)), "tgu", "0F"},
38786146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x4)), "tleu", "12F"},
38886146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x4)), "tleu", "0F"},
38986146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0xd)), "tcc", "12F"},
39086146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0xd)), "tcc", "0F"},
39186146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x5)), "tcs", "12F"},
39286146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x5)), "tcs", "0F"},
39386146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0xe)), "tpos", "12F"},
39486146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0xe)), "tpos", "0F"},
39586146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x6)), "tneg", "12F"},
39686146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x6)), "tneg", "0F"},
39786146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0xf)), "tvc", "12F"},
39886146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0xf)), "tvc", "0F"},
39986146Stmm		{(FORMAT3(2, OP3_X(3,10), 0) | EIF_F4_TCOND(0x7)), "tvs", "12F"},
40086146Stmm		{(FORMAT3(2, OP3_X(3,10), 1) | EIF_F4_TCOND(0x7)), "tvs", "0F"},
40180709Sjake
40280709Sjake	{FORMAT3(2, OP3_X(0,11), 0), "smul", "12d"},
40380709Sjake	{FORMAT3(2, OP3_X(0,11), 1), "smul", "1id"},
40480709Sjake	{FORMAT3(2, OP3_X(1,11), 0), "smulcc", "12d"},
40580709Sjake	{FORMAT3(2, OP3_X(1,11), 1), "smulcc", "1id"},
40680709Sjake	{FORMAT3(2, OP3_X(2,11), 0), "flushw", ""},
40780709Sjake	{FORMAT3(2, OP3_X(3,11), 0), "flush", "p"},
40880709Sjake	{FORMAT3(2, OP3_X(3,11), 1), "flush", "q"},
40980709Sjake
41080709Sjake	{FORMAT3(2, OP3_X(0,12), 0), "subc", "12d"},
41180709Sjake	{FORMAT3(2, OP3_X(0,12), 1), "subc", "1id"},
41280709Sjake	{FORMAT3(2, OP3_X(1,12), 0), "subccc", "12d"},
41380709Sjake	{FORMAT3(2, OP3_X(1,12), 1), "subccc", "1id"},
41480709Sjake		/*
41580709Sjake		 * OP3 = (2,12): MOVcc, Move Integer Register on Condition
41680709Sjake		 */
41780709Sjake		/* For Integer Condition Codes */
41880709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,8)), "mova", "0jd"},
41980709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,8)), "mova", "02d"},
42080709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,0)), "movn", "0jd"},
42180709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,0)), "movn", "02d"},
42280709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,9)), "movne", "0jd"},
42380709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,9)), "movne", "02d"},
42480709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,1)), "move", "0jd"},
42580709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,1)), "move", "02d"},
42680709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,10)), "movg", "0jd"},
42780709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,10)), "movg", "02d"},
42880709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,2)), "movle", "0jd"},
42980709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,2)), "movle", "02d"},
43080709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,11)), "movge", "0jd"},
43180709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,11)), "movge", "02d"},
43280709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,3)), "movl", "0jd"},
43380709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,3)), "movl", "02d"},
43480709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,12)), "movgu", "0jd"},
43580709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,12)), "movgu", "02d"},
43680709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,4)), "movleu", "0jd"},
43780709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,4)), "movleu", "02d"},
43880709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,13)), "movcc", "0jd"},
43980709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,13)), "movcc", "02d"},
44080709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,5)), "movcs", "0jd"},
44180709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,5)), "movcs", "02d"},
44280709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,14)), "movpos", "0jd"},
44380709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,14)), "movpos", "02d"},
44480709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,6)), "movneg", "0jd"},
44580709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,6)), "movneg", "02d"},
44680709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,15)), "movvc", "0jd"},
44780709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,15)), "movvc", "02d"},
44880709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,7)), "movvs", "0jd"},
44980709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,7)), "movvs", "02d"},
45080709Sjake
45180709Sjake		/* For Floating-Point Condition Codes */
45280709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,8)), "mova", "ojd"},
45380709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,8)), "mova", "o2d"},
45480709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,0)), "movn", "ojd"},
45580709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,0)), "movn", "o2d"},
45680709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,7)), "movu", "ojd"},
45780709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,7)), "movu", "o2d"},
45880709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,6)), "movg", "ojd"},
45980709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,6)), "movg", "o2d"},
46080709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,5)), "movug", "ojd"},
46180709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,5)), "movug", "o2d"},
46280709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,4)), "movl", "ojd"},
46380709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,4)), "movl", "o2d"},
46480709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,3)), "movul", "ojd"},
46580709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,3)), "movul", "o2d"},
46680709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,2)), "movlg", "ojd"},
46780709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,2)), "movlg", "o2d"},
46880709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,1)), "movne", "ojd"},
46980709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,1)), "movne", "o2d"},
47080709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,9)), "move", "ojd"},
47180709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,9)), "move", "o2d"},
47280709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,10)), "movue", "ojd"},
47380709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,10)), "movue", "o2d"},
47480709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,11)), "movge", "ojd"},
47580709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,11)), "movge", "o2d"},
47680709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,12)), "movuge", "ojd"},
47780709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,12)), "movuge", "o2d"},
47880709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,13)), "movle", "ojd"},
47980709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,13)), "movle", "o2d"},
48080709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,14)), "movule", "ojd"},
48180709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,14)), "movule", "o2d"},
48280709Sjake		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,15)), "movo", "ojd"},
48380709Sjake		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,15)), "movo", "o2d"},
48480709Sjake
48580709Sjake	{FORMAT3(2, OP3_X(3,12), 0), "save", "12d"},
48680709Sjake	{FORMAT3(2, OP3_X(3,12), 1), "save", "1id"},
48780709Sjake
48880709Sjake	{FORMAT3(2, OP3_X(0,13), 0), "udivx", "12d"},
48980709Sjake	{FORMAT3(2, OP3_X(0,13), 1), "udivx", "1id"},
49080709Sjake	{FORMAT3(2, OP3_X(1,13), 0), "UNDEFINED", ""},
49180709Sjake	{FORMAT3(2, OP3_X(2,13), 0), "sdivx", "12d"},
49280709Sjake	{FORMAT3(2, OP3_X(2,13), 1), "sdivx", "1id"},
49380709Sjake	{FORMAT3(2, OP3_X(3,13), 0), "restore", "12d"},
49480709Sjake	{FORMAT3(2, OP3_X(3,13), 1), "restore", "1id"},
49580709Sjake
49680709Sjake	{FORMAT3(2, OP3_X(0,14), 0), "udiv", "12d"},
49780709Sjake	{FORMAT3(2, OP3_X(0,14), 1), "udiv", "1id"},
49880709Sjake	{FORMAT3(2, OP3_X(1,14), 0), "udivcc", "12d"},
49980709Sjake	{FORMAT3(2, OP3_X(1,14), 1), "udivcc", "1id"},
50080709Sjake	{FORMAT3(2, OP3_X(2,14), 0), "popc", "2d"},
50180709Sjake	{FORMAT3(2, OP3_X(2,14), 1), "popc", "id"},
50280709Sjake
50380709Sjake	{FORMAT3(2, OP3_X(3,14), 0), "done", ""},
50486146Stmm	{FORMAT3(2, OP3_X(3,14) | EIF_F3_FCN(1), 1), "retry", ""},
50580709Sjake
50680709Sjake	{FORMAT3(2, OP3_X(0,15), 0), "sdiv", "12d"},
50780709Sjake	{FORMAT3(2, OP3_X(0,15), 1), "sdiv", "1id"},
50880709Sjake	{FORMAT3(2, OP3_X(1,15), 0), "sdivcc", "12d"},
50980709Sjake	{FORMAT3(2, OP3_X(1,15), 1), "sdivcc", "1id"},
51080709Sjake		/*
51180709Sjake		 * OP3 = (2,15): MOVr:
51280709Sjake		 * 	Move Integer Register on Register Condition
51380709Sjake		 */
51486146Stmm		{(FORMAT3(2, OP3_X(2,15), 1) | EIF_F3_RCOND(1)), "movrz", "1jd"},
51586146Stmm		{(FORMAT3(2, OP3_X(2,15), 0) | EIF_F3_RCOND(1)), "movrz", "12d"},
51686146Stmm		{(FORMAT3(2, OP3_X(2,15), 1) | EIF_F3_RCOND(2)), "movrlez", "1jd"},
51786146Stmm		{(FORMAT3(2, OP3_X(2,15), 0) | EIF_F3_RCOND(2)), "movrlez", "12d"},
51886146Stmm		{(FORMAT3(2, OP3_X(2,15), 1) | EIF_F3_RCOND(3)), "movrlz", "1jd"},
51986146Stmm		{(FORMAT3(2, OP3_X(2,15), 0) | EIF_F3_RCOND(3)), "movrlz", "12d"},
52086146Stmm		{(FORMAT3(2, OP3_X(2,15), 1) | EIF_F3_RCOND(5)), "movrnz", "1jd"},
52186146Stmm		{(FORMAT3(2, OP3_X(2,15), 0) | EIF_F3_RCOND(5)), "movrnz", "12d"},
52286146Stmm		{(FORMAT3(2, OP3_X(2,15), 1) | EIF_F3_RCOND(6)), "movrgz", "1jd"},
52386146Stmm		{(FORMAT3(2, OP3_X(2,15), 0) | EIF_F3_RCOND(6)), "movrgz", "12d"},
52486146Stmm		{(FORMAT3(2, OP3_X(2,15), 1) | EIF_F3_RCOND(7)), "movrgez", "1jd"},
52586146Stmm		{(FORMAT3(2, OP3_X(2,15), 0) | EIF_F3_RCOND(7)), "movrgez", "12d"},
52680709Sjake
52780709Sjake	{FORMAT3(2, OP3_X(3,15), 0), "UNDEFINED", ""},
52880709Sjake
52980709Sjake
53080709Sjake	/*
53180709Sjake	 * Format 3/3: Load and store (appendix E, table 33)
53280709Sjake	 */
53380709Sjake
53480709Sjake	/* Loads */
53588662Sjake	{(FORMAT3(3, OP3_X(0,0), 0)), "lduw", "pd"},
53688662Sjake	{(FORMAT3(3, OP3_X(0,0), 1)), "lduw", "qd"},
53788662Sjake	{(FORMAT3(3, OP3_X(1,0), 0)), "lduwa", "7d"},
53888662Sjake	{(FORMAT3(3, OP3_X(1,0), 1)), "lduwa", "8d"},
53980709Sjake	{(FORMAT3(3, OP3_X(2,0), 0)), "ldf", "pe"},
54080709Sjake	{(FORMAT3(3, OP3_X(2,0), 1)), "ldf", "qe"},
54180709Sjake	{(FORMAT3(3, OP3_X(3,0), 0)), "ldfa", "7e"},
54280709Sjake	{(FORMAT3(3, OP3_X(3,0), 1)), "ldfa", "8e"},
54380709Sjake
54480709Sjake	{(FORMAT3(3, OP3_X(0,1), 0)), "ldub", "pd"},
54580709Sjake	{(FORMAT3(3, OP3_X(0,1), 1)), "ldub", "qd"},
54680709Sjake	{(FORMAT3(3, OP3_X(1,1), 0)), "lduba", "7d"},
54780709Sjake	{(FORMAT3(3, OP3_X(1,1), 1)), "lduba", "8d"},
54888662Sjake	{(FORMAT3(3, OP3_X(2,1), 0) | EIF_F3_RD(0)), "lduw", "p5"},
54988662Sjake	{(FORMAT3(3, OP3_X(2,1), 1) | EIF_F3_RD(0)), "lduw", "q5"},
55086146Stmm	{(FORMAT3(3, OP3_X(2,1), 0) | EIF_F3_RD(1)), "ldx", "p6"},
55186146Stmm	{(FORMAT3(3, OP3_X(2,1), 1) | EIF_F3_RD(1)), "ldx", "q6"},
55280709Sjake
55380709Sjake	{(FORMAT3(3, OP3_X(0,2), 0)), "lduh", "pd"},
55480709Sjake	{(FORMAT3(3, OP3_X(0,2), 1)), "lduh", "qd"},
55580709Sjake	{(FORMAT3(3, OP3_X(1,2), 0)), "lduha", "7d"},
55680709Sjake	{(FORMAT3(3, OP3_X(1,2), 1)), "lduha", "8d"},
55780709Sjake	{(FORMAT3(3, OP3_X(2,2), 0)), "ldq", "pe"},
55880709Sjake	{(FORMAT3(3, OP3_X(2,2), 1)), "ldq", "qe"},
55980709Sjake	{(FORMAT3(3, OP3_X(3,2), 0)), "ldqa", "7e"},
56080709Sjake	{(FORMAT3(3, OP3_X(3,2), 1)), "ldqa", "8e"},
56180709Sjake
56280709Sjake	{(FORMAT3(3, OP3_X(0,3), 0)), "ldd", "pd"},
56380709Sjake	{(FORMAT3(3, OP3_X(0,3), 1)), "ldd", "qd"},
56480709Sjake	{(FORMAT3(3, OP3_X(1,3), 0)), "ldda", "7d"},
56580709Sjake	{(FORMAT3(3, OP3_X(1,3), 1)), "ldda", "8d"},
56680709Sjake	{(FORMAT3(3, OP3_X(2,3), 0)), "ldd", "pe"},
56780709Sjake	{(FORMAT3(3, OP3_X(2,3), 1)), "ldd", "qe"},
56880709Sjake	{(FORMAT3(3, OP3_X(3,3), 0)), "ldda", "7e"},
56980709Sjake	{(FORMAT3(3, OP3_X(3,3), 1)), "ldda", "8e"},
57080709Sjake
57188662Sjake	{(FORMAT3(3, OP3_X(0,4), 0)), "stw", "dp"},
57288662Sjake	{(FORMAT3(3, OP3_X(0,4), 1)), "stw", "dq"},
57388662Sjake	{(FORMAT3(3, OP3_X(1,4), 0)), "stwa", "d7"},
57488662Sjake	{(FORMAT3(3, OP3_X(1,4), 1)), "stwa", "d8"},
57588662Sjake	{(FORMAT3(3, OP3_X(2,4), 0)), "stf", "ep"},
57688662Sjake	{(FORMAT3(3, OP3_X(2,4), 1)), "stf", "eq"},
57788662Sjake	{(FORMAT3(3, OP3_X(3,4), 0)), "stfa", "e7"},
57888662Sjake	{(FORMAT3(3, OP3_X(3,4), 1)), "stfa", "e8"},
57980709Sjake
58080709Sjake	{(FORMAT3(3, OP3_X(0,5), 0)), "stb", "dp"},
58180709Sjake	{(FORMAT3(3, OP3_X(0,5), 1)), "stb", "dq"},
58280709Sjake	{(FORMAT3(3, OP3_X(1,5), 0)), "stba", "d7"},
58380709Sjake	{(FORMAT3(3, OP3_X(1,5), 1)), "stba", "d8"},
58488662Sjake	{(FORMAT3(3, OP3_X(2,5), 0)), "stw", "5p"},
58588662Sjake	{(FORMAT3(3, OP3_X(2,5), 1)), "stw", "5q"},
58686146Stmm	{(FORMAT3(3, OP3_X(2,5), 0) | EIF_F3_RD(1)), "stx", "6p"},
58786146Stmm	{(FORMAT3(3, OP3_X(2,5), 1) | EIF_F3_RD(1)), "stx", "6q"},
58880709Sjake
58980709Sjake	{(FORMAT3(3, OP3_X(0,6), 0)), "sth", "dp"},
59080709Sjake	{(FORMAT3(3, OP3_X(0,6), 1)), "sth", "dq"},
59180709Sjake	{(FORMAT3(3, OP3_X(1,6), 0)), "stha", "d7"},
59280709Sjake	{(FORMAT3(3, OP3_X(1,6), 1)), "stha", "d8"},
59380709Sjake	{(FORMAT3(3, OP3_X(2,6), 0)), "stq", "ep"},
59480709Sjake	{(FORMAT3(3, OP3_X(2,6), 1)), "stq", "eq"},
59580709Sjake	{(FORMAT3(3, OP3_X(3,6), 0)), "stqa", "e7"},
59680709Sjake	{(FORMAT3(3, OP3_X(3,6), 1)), "stqa", "e8"},
59780709Sjake
59880709Sjake	{(FORMAT3(3, OP3_X(0,7), 0)), "std", "dp"},
59980709Sjake	{(FORMAT3(3, OP3_X(0,7), 1)), "std", "dq"},
60080709Sjake	{(FORMAT3(3, OP3_X(1,7), 0)), "stda", "d7"},
60180709Sjake	{(FORMAT3(3, OP3_X(1,7), 1)), "stda", "d8"},
60280709Sjake	{(FORMAT3(3, OP3_X(2,7), 0)), "std", "ep"},
60380709Sjake	{(FORMAT3(3, OP3_X(2,7), 1)), "std", "eq"},
60480709Sjake	{(FORMAT3(3, OP3_X(3,7), 0)), "stda", "e7"},
60580709Sjake	{(FORMAT3(3, OP3_X(3,7), 1)), "stda", "e8"},
60680709Sjake
60780709Sjake	{(FORMAT3(3, OP3_X(0,8), 0)), "ldsw", "pd"},
60880709Sjake	{(FORMAT3(3, OP3_X(0,8), 1)), "ldsw", "qd"},
60980709Sjake	{(FORMAT3(3, OP3_X(1,8), 0)), "ldswa", "7d"},
61080709Sjake	{(FORMAT3(3, OP3_X(1,8), 1)), "ldswa", "8d"},
61180709Sjake
61280709Sjake	{(FORMAT3(3, OP3_X(0,9), 0)), "ldsb", "pd"},
61380709Sjake	{(FORMAT3(3, OP3_X(0,9), 1)), "ldsb", "qd"},
61480709Sjake	{(FORMAT3(3, OP3_X(1,9), 0)), "ldsba", "7d"},
61580709Sjake	{(FORMAT3(3, OP3_X(1,9), 1)), "ldsba", "8d"},
61680709Sjake
61780709Sjake	{(FORMAT3(3, OP3_X(0,10), 0)), "ldsh", "pd"},
61880709Sjake	{(FORMAT3(3, OP3_X(0,10), 1)), "ldsh", "qd"},
61980709Sjake	{(FORMAT3(3, OP3_X(1,10), 0)), "ldsha", "7d"},
62080709Sjake	{(FORMAT3(3, OP3_X(1,10), 1)), "ldsha", "8d"},
62180709Sjake
62280709Sjake	{(FORMAT3(3, OP3_X(0,11), 0)), "ldx", "pd"},
62380709Sjake	{(FORMAT3(3, OP3_X(0,11), 1)), "ldx", "qd"},
62480709Sjake	{(FORMAT3(3, OP3_X(1,11), 0)), "ldxa", "7d"},
62580709Sjake	{(FORMAT3(3, OP3_X(1,11), 1)), "ldxa", "8d"},
62680709Sjake
62780709Sjake	{(FORMAT3(3, OP3_X(3,12), 1)), "casa", "s2d"},
62880709Sjake	{(FORMAT3(3, OP3_X(3,12), 0)), "casa", "t2d"},
62980709Sjake
63080709Sjake	{(FORMAT3(3, OP3_X(0,13), 0)), "ldstub", "7d"},
63180709Sjake	{(FORMAT3(3, OP3_X(0,13), 1)), "ldstub", "8d"},
63280709Sjake	{(FORMAT3(3, OP3_X(1,13), 0)), "ldstuba", "pd"},
63380709Sjake	{(FORMAT3(3, OP3_X(1,13), 1)), "ldstuba", "qd"},
63480709Sjake	{(FORMAT3(3, OP3_X(2,13), 0)), "prefetch", "pr"},
63580709Sjake	{(FORMAT3(3, OP3_X(2,13), 1)), "prefetch", "qr"},
63680709Sjake	{(FORMAT3(3, OP3_X(3,13), 0)), "prefetcha", "7r"},
63780709Sjake	{(FORMAT3(3, OP3_X(3,13), 1)), "prefetcha", "8r"},
63880709Sjake
63980709Sjake	{(FORMAT3(3, OP3_X(0,14), 0)), "stx", "dp"},
64080709Sjake	{(FORMAT3(3, OP3_X(0,14), 1)), "stx", "dq"},
64188662Sjake	{(FORMAT3(3, OP3_X(1,14), 0)), "stxa", "d7"},
64288662Sjake	{(FORMAT3(3, OP3_X(1,14), 1)), "stxa", "d8"},
64380709Sjake	{(FORMAT3(3, OP3_X(3,14), 0)), "casxa", "t2d"},
64480709Sjake	{(FORMAT3(3, OP3_X(3,14), 1)), "casxa", "s2d"},
64580709Sjake
64680709Sjake	/* Swap Register */
64780709Sjake	{(FORMAT3(3, OP3_X(0,15), 0)), "swap", "pd"},
64880709Sjake	{(FORMAT3(3, OP3_X(0,15), 1)), "swap", "qd"},
64980709Sjake	{(FORMAT3(3, OP3_X(1,15), 0)), "swapa", "7d"},
65080709Sjake	{(FORMAT3(3, OP3_X(1,15), 1)), "swapa", "8d"},
65180709Sjake
65280709Sjake
65380709Sjake	/*
65480709Sjake	 * OP3 = (3,4): FPop1 (table 34)
65580709Sjake	 */
65680709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,1))), "fmovs", ".4e"},
65780709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,2))), "fmovd", ".4e"},
65880709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,3))), "fmovq", ".4e"},
65980709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,5))), "fnegs", "4e"},
66080709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,6))), "fnegd", "4e"},
66180709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,7))), "fnegq", "4e"},
66280709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,9))), "fabss", "4e"},
66380709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,10))), "fabsd", "4e"},
66480709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,11))), "fabsq", "4e"},
66580709Sjake
66680709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(2,9))), "fsqrts", "4e"},
66780709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(2,10))), "fsqrtd", "4e"},
66880709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(2,11))), "fsqrtq", "4e"},
66980709Sjake
67080709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,1))), "fadds", "34e"},
67180709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,2))), "faddd", "34e"},
67280709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,3))), "faddq", "34e"},
67380709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,5))), "fsubs", "34e"},
67480709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,6))), "fsubd", "34e"},
67580709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,7))), "fsubq", "34e"},
67680709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,9))), "fmuls", "34e"},
67780709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,10))), "fmuld", "34e"},
67880709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,11))), "fmulq", "34e"},
67980709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,13))), "fdivs", "34e"},
68080709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,14))), "fdivd", "34e"},
68180709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,15))), "fdivq", "34e"},
68280709Sjake
68380709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(6,9))), "fsmuld", "34e"},
68480709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(6,14))), "fdmulq", "34e"},
68580709Sjake
68680709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(8,1))), "fstox", "4e"},
68780709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(8,2))), "fdtox", "4e"},
68880709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(8,3))), "fqtox", "4e"},
68980709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(8,4))), "fxtos", "4e"},
69080709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(8,8))), "fxtod", "4e"},
69180709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(8,12))), "fxtoq", "4e"},
69280709Sjake
69380709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,4))), "fitos", "4e"},
69480709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,6))), "fdtos", "4e"},
69580709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,7))), "fqtos", "4e"},
69680709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,8))), "fitod", "4e"},
69780709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,9))), "fstod", "4e"},
69880709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,11))), "fqtod", "4e"},
69980709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,12))), "fitoq", "4e"},
70080709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,13))), "fstoq", "4e"},
70180709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,14))), "fdtoq", "4e"},
70280709Sjake
70380709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(13,1))), "fstoi", "4e"},
70480709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(13,2))), "fdtoi", "4e"},
70580709Sjake	{(FORMAT3F(2, OP3_X(3,4), OPF_X(13,3))), "fqtoi", "4e"},
70680709Sjake
70780709Sjake
70880709Sjake#ifdef xxx
70980709Sjake	/*
71080709Sjake	 * OP3 =(3,5): FPop2 (table 35)
71180709Sjake	 */
71280709Sjake	{(FORMAT3F(2, OP3_X(3,5), 81)), "fcmps", "o34"},
71380709Sjake	{(FORMAT3F(2, OP3_X(3,5), 82)), "fcmpd", "o34"},
71480709Sjake	{(FORMAT3F(2, OP3_X(3,5), 83)), "fcmpq", "o34"},
71580709Sjake	{(FORMAT3F(2, OP3_X(3,5), 85)), "fcmpes", "o34"},
71680709Sjake	{(FORMAT3F(2, OP3_X(3,5), 86)), "fcmped", "o34"},
71780709Sjake	{(FORMAT3F(2, OP3_X(3,5), 87)), "fcmpeq", "o34"},
71880709Sjake
71980709Sjake	/* Move Floating-Point Register on Condition "FMOVcc" */
72080709Sjake	/* FIXME should check for single, double, and quad movements */
72180709Sjake	/* Integer Condition Codes */
72280709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,8)), "fmova", "04e"},
72380709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,0)), "fmovn", "04e"},
72480709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,9)), "fmovne", "04e"},
72580709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,1)), "fmove", "04e"},
72680709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,10)), "fmovg", "04e"},
72780709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,2)), "fmovle", "04e"},
72880709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,11)), "fmovge", "04e"},
72980709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,3)), "fmovl", "04e"},
73080709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,12)), "fmovgu", "04e"},
73180709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,4)), "fmovleu", "04e"},
73280709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,13)), "fmovcc", "04e"},
73380709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,5)), "fmovcs", "04e"},
73480709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,14)), "fmovpos", "04e"},
73580709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,6)), "fmovneg", "04e"},
73680709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,15)), "fmovvc", "04e"},
73780709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,7)), "fmovvs", "04e"},
73880709Sjake
73980709Sjake	/* Floating-Point Condition Codes */
74080709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,8)), "fmova", "o4e"},
74180709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,0)), "fmovn", "o4e"},
74280709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,7)), "fmovu", "o4e"},
74380709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,6)), "fmovg", "o4e"},
74480709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,5)), "fmovug", "o4e"},
74580709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,4)), "fmovk", "o4e"},
74680709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,3)), "fmovul", "o4e"},
74780709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,2)), "fmovlg", "o4e"},
74880709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,1)), "fmovne", "o4e"},
74980709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,9)), "fmove", "o4e"},
75080709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,10)), "fmovue", "o4e"},
75180709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,11)), "fmovge", "o4e"},
75280709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,12)), "fmovuge", "o4e"},
75380709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,13)), "fmovle", "o4e"},
75480709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,14)), "fmovule", "o4e"},
75580709Sjake	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,15)), "fmovo", "o4e"},
75680709Sjake
75780709Sjake	/* Move F-P Register on Integer Register Condition "FMOVr" */
75880709Sjake	/* FIXME: check for short, double, and quad's */
75986146Stmm	{(FORMAT3(2, OP3_X(3,5), 0) | EIF_F3_RCOND(1)), "fmovre", "14e"},
76086146Stmm	{(FORMAT3(2, OP3_X(3,5), 0) | EIF_F3_RCOND(2)), "fmovrlez", "14e"},
76186146Stmm	{(FORMAT3(2, OP3_X(3,5), 0) | EIF_F3_RCOND(3)), "fmovrlz", "14e"},
76286146Stmm	{(FORMAT3(2, OP3_X(3,5), 0) | EIF_F3_RCOND(5)), "fmovrne", "14e"},
76386146Stmm	{(FORMAT3(2, OP3_X(3,5), 0) | EIF_F3_RCOND(6)), "fmovrgz", "14e"},
76486146Stmm	{(FORMAT3(2, OP3_X(3,5), 0) | EIF_F3_RCOND(7)), "fmovrgez", "14e"},
76580709Sjake#endif
76680709Sjake	/* FP logical insns -- UltraSPARC extens */
76780709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,0))), "fzero", "e"},
76880709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,1))), "fzeros", "e"},
76980709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,14))), "fone", "e"},
77080709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,15))), "fones", "e"},
77180709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,4))), "fsrc1", "3e"},
77280709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,5))), "fsrc1s", "3e"},
77380709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,8))), "fsrc2", "4e"},
77480709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,9))), "fsrc2s", "4e"},
77580709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,10))), "fnot1", "3e"},
77680709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,11))), "fnot1s", "3e"},
77780709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,6))), "fnot2", "4e"},
77880709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,7))), "fnot2s", "4e"},
77980709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,12))), "for", "34e"},
78080709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,13))), "fors", "34e"},
78180709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,2))), "fnor", "34e"},
78280709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,3))), "fnors", "34e"},
78380709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,0))), "fand", "34e"},
78480709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,1))), "fands", "34e"},
78580709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,14))), "fnand", "34e"},
78680709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,15))), "fnands", "34e"},
78780709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,12))), "fxor", "34e"},
78880709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,13))), "fxors", "34e"},
78980709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,2))), "fxnor", "34e"},
79080709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,3))), "fxnors", "34e"},
79180709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,10))), "fornot1", "34e"},
79280709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,11))), "fornot1s", "34e"},
79380709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,6))), "fornot2", "34e"},
79480709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,7))), "fornot2s", "34e"},
79580709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,8))), "fandnot1", "34e"},
79680709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,9))), "fandnot1s", "34e"},
79780709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,4))), "fandnot2", "34e"},
79880709Sjake	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,5))), "fandnot2s", "34e"},
79980709Sjake
80080709Sjake	/* grrrr.... */
80180709Sjake	{0, 0, 0}
80280709Sjake
80380709Sjake};
80480709Sjake
80580709Sjakedb_addr_t
80693051Stmmdb_disasm(db_addr_t loc, boolean_t altfmt)
80780709Sjake{
808181640Smarius	const struct sparc_insn* i_ptr = (struct sparc_insn *)&sparc_i;
80980709Sjake	unsigned int insn, you_lose, bitmask;
81080709Sjake	int matchp;
811181640Smarius	const char* f_ptr, *cp;
81280709Sjake
81380709Sjake	you_lose = 0;
81480709Sjake	matchp = 0;
81580709Sjake	insn = db_get_value(loc, 4, 0);
81680709Sjake
81780709Sjake	if (insn == 0x01000000) {
81880709Sjake		db_printf("nop\n");
81980709Sjake		return loc + 4;
82080709Sjake	}
82180709Sjake
82280709Sjake	while (i_ptr->name) {
82380709Sjake		/* calculate YOU_LOSE value */
82480709Sjake		bitmask= (i_ptr->match);
82580709Sjake		you_lose = (~bitmask);
82680709Sjake
82780709Sjake		if (((bitmask>>30) & 0x3) == 0x1) {
82880709Sjake			/* Call */
82980709Sjake			you_lose = ((~0x1)<<30);
83080709Sjake		} else if (((bitmask>>30) & 0x3) == 0x0) {
83180709Sjake			if (((bitmask>>22) & 0x7) == 0x4) {
83280709Sjake				/* Sethi */
83380709Sjake				you_lose &= (FORMAT2(0x3,0x7));
83480709Sjake			} else {
83580709Sjake				/* Branches */
83686146Stmm				you_lose &= (FORMAT2(0x3,0x7) |
83786146Stmm				    EIF_F2_COND(0xf));
83880709Sjake			}
83980709Sjake		} else if (((bitmask>>30) & 0x3) == 0x2 &&
84080709Sjake			   ((bitmask>>19) & 0x3f) == 0x34) /* XXX */ {
84180709Sjake			/* FPop1 */
84286146Stmm			you_lose &= (FORMAT3(0x3,0x3f,0x1) |
84386146Stmm			    EIF_F3_OPF(0x1ff));
84480709Sjake		} else if (((bitmask>>30) & 0x3) == 0x2 &&
84580709Sjake			   ((bitmask>>19) & 0x3f) == 0x3a) /* XXX */ {
84680709Sjake			/* Tcc */
84786146Stmm			you_lose &= (FORMAT3(0x3,0x3f,0x1) | EIF_F4_TCOND(0xf));
84880709Sjake		} else if (((bitmask>>30) & 0x3) == 0x2 &&
84980709Sjake			   ((bitmask>>21) & 0xf) == 0x9 &&
85080709Sjake			   ((bitmask>>19) & 0x3) != 0) /* XXX */ {
85180709Sjake			/* shifts */
85286146Stmm			you_lose &= (FORMAT3(0x3,0x3f,0x1)) | EIF_F3_X(1);
85380709Sjake		} else if (((bitmask>>30) & 0x3) == 0x2 &&
85480709Sjake			   ((bitmask>>19) & 0x3f) == 0x2c) /* XXX */ {
85580709Sjake			/* cmov */
85680709Sjake			you_lose &= (FORMAT3(0x3,0x3f,0x1) | COND2(1,0xf));
85780709Sjake		} else if (((bitmask>>30) & 0x3) == 0x2 &&
85880709Sjake			   ((bitmask>>19) & 0x3f) == 0x35) /* XXX */ {
85980709Sjake			/* fmov */
86080709Sjake			you_lose &= (FORMAT3(0x3,0x3f,0x1) | COND2(1,0xf));
86180709Sjake		} else {
86280709Sjake			you_lose &= (FORMAT3(0x3,0x3f,0x1));
86380709Sjake		}
86480709Sjake
86580709Sjake		if (((bitmask & insn) == bitmask) && ((you_lose & insn) == 0)) {
86680709Sjake			matchp = 1;
86780709Sjake			break;
86880709Sjake		}
86980709Sjake		i_ptr++;
87080709Sjake	};
87180709Sjake
87280709Sjake	if (!matchp) {
87380709Sjake		db_printf("undefined\n");
87480709Sjake		return loc + 4;
87580709Sjake	}
87680709Sjake
87780709Sjake	db_printf("%s", i_ptr->name);
87880709Sjake
87980709Sjake	f_ptr = i_ptr->format;
88080709Sjake
88180709Sjake	for (cp = f_ptr; *cp; cp++) {
88280709Sjake		if (*cp == ',') {
88380709Sjake			for (;f_ptr < cp; f_ptr++)
88480709Sjake				switch (*f_ptr) {
88580709Sjake				case 'a':
88686146Stmm					if (insn & EIF_F2_A(1))
88780709Sjake						db_printf(",a");
88880709Sjake					break;
88980709Sjake				case 'p':
89086146Stmm					if (insn & EIF_F2_P(1))
89180709Sjake						db_printf(",pt");
89280709Sjake					else
89380709Sjake						db_printf(",pn");
89480709Sjake					break;
89580709Sjake				}
89680709Sjake			f_ptr++;
89780709Sjake			break;
89880709Sjake		}
89980709Sjake	}
90080709Sjake	db_printf("      \t");
90180709Sjake
90280709Sjake	while (*f_ptr) {
90380709Sjake		switch (*f_ptr) {
90480709Sjake			int64_t val;
90580709Sjake		case '1':
90680709Sjake			db_printf("%%%s", regs[((insn >> 14) & 0x1f)]);
90780709Sjake			break;
90880709Sjake		case '2':
90980709Sjake			db_printf("%%%s", regs[(insn & 0x1f)]);
91080709Sjake			break;
91180709Sjake		case 'd':
91280709Sjake			db_printf("%%%s", regs[((insn >> 25) & 0x1f)]);
91380709Sjake			break;
91480709Sjake		case '3':
91580709Sjake			db_printf("%%f%d", ((insn >> 14) & 0x1f));
91680709Sjake			break;
91780709Sjake		case '4':
91880709Sjake			db_printf("%%f%d", (insn & 0x1f));
91980709Sjake			break;
92080709Sjake		case 'e':
92180709Sjake			db_printf("%%f%d", ((insn >> 25) & 0x1f));
92280709Sjake			break;
92380709Sjake		case 'i':
92480709Sjake			/* simm13 -- signed */
92586146Stmm			val = IF_SIMM(insn, 13);
92680709Sjake			db_printf("%s0x%x", SIGN(val), (int)abs(val));
92780709Sjake			break;
92880709Sjake		case 'j':
92980709Sjake			/* simm11 -- signed */
93086146Stmm			val = IF_SIMM(insn, 11);
93180709Sjake			db_printf("%s0x%x", SIGN(val), (int)abs(val));
93280709Sjake			break;
93380709Sjake		case 'l':
93480709Sjake			val = (((insn>>20)&0x3)<<13)|(insn & 0x1fff);
93586146Stmm			val = IF_SIMM(val, 16);
93680709Sjake			db_printsym((db_addr_t)(loc + (4 * val)), DB_STGY_ANY);
93780709Sjake			break;
93880709Sjake		case 'm':
93986146Stmm			db_printsym((db_addr_t)(loc + (4 * IF_SIMM(insn, 22))),
94080709Sjake				DB_STGY_ANY);
94180709Sjake			break;
94280709Sjake		case 'u':
94386146Stmm			db_printsym((db_addr_t)(loc + (4 * IF_SIMM(insn, 19))),
94480709Sjake			    DB_STGY_ANY);
94580709Sjake			break;
94680709Sjake		case 'n':
94786146Stmm			db_printsym((db_addr_t)(loc + (4 * IF_SIMM(insn, 30))),
94880709Sjake			    DB_STGY_PROC);
94980709Sjake			break;
95080709Sjake		case 's':
95180709Sjake			db_printf("%%asi");
95280709Sjake			break;
95380709Sjake		case 't':
95480709Sjake			db_printf("0x%-2.2x", ((insn >> 5) & 0xff));
95580709Sjake			break;
95680709Sjake		case 'o':
95780709Sjake			db_printf("%%fcc%d", ((insn >> 25) & 0x3));
95880709Sjake			break;
95980709Sjake		case 'p':
96080709Sjake		case '7':
96180709Sjake			db_printf("[%%%s + %%%s]",
96280709Sjake				  regs[((insn >> 14) & 0x1f)],
96380709Sjake				  regs[(insn & 0x1f)]);
96480709Sjake			if (*f_ptr == '7')
96580709Sjake				db_printf(" %d", ((insn >> 5) & 0xff));
96680709Sjake			break;
96780709Sjake		case 'q':
96880709Sjake		case '8':
96986146Stmm			val = IF_SIMM(insn, 13);
97080709Sjake			db_printf("[%%%s %c 0x%x]",
97180709Sjake				regs[((insn >> 14) & 0x1f)],
97280709Sjake				(int)((val<0)?'-':'+'),
97380709Sjake				(int)abs(val));
97480709Sjake			if (*f_ptr == '8')
97580709Sjake				db_printf(" %%asi");
97680709Sjake			break;
97780709Sjake		case '5':
97880709Sjake			db_printf("%%fsr");
97980709Sjake			break;
98080709Sjake		case '6':
98180709Sjake			db_printf("%%fsr");
98280709Sjake			break;
98380709Sjake		case '9':
98480709Sjake			db_printf("0x%xl",
98580709Sjake				  ((insn & 0xf) | ((insn >> 4) & 0x7)));
98680709Sjake			break;
98780709Sjake		case '0':
98880709Sjake			db_printf("%%%s", ccodes[((insn >> 11) & 0x3) + 4]);
98980709Sjake			break;
99080709Sjake		case '.':
99180709Sjake			db_printf("%%%s", ccodes[((insn >> 11) & 0x7)]);
99280709Sjake			break;
99380709Sjake		case 'r':
99480709Sjake			db_printf("#%s", prefetch[((insn >> 25) & 0x1f)]);
99580709Sjake			break;
99680709Sjake		case 'A':
99780709Sjake			db_printf("%%%s", priv_regs[((insn >> 14) & 0x1f)]);
99880709Sjake			break;
99980709Sjake		case 'B':
100080709Sjake			db_printf("%%%s", state_regs[((insn >> 14) & 0x1f)]);
100180709Sjake			break;
100280709Sjake		case 'C':
100380709Sjake			db_printf("%%hi(0x%x)", ((insn & 0x3fffff) << 10));
100480709Sjake			break;
100580709Sjake		case 'D':
100680709Sjake			db_printf("0x%x", (insn & 0x1f));
100780709Sjake			break;
100880709Sjake		case 'E':
100980709Sjake			db_printf("%d", (insn & 0x3f));
101080709Sjake			break;
101180709Sjake		case 'F':
101280709Sjake			db_printf("%d", (insn & 0x3f));
101380709Sjake			break;
101480709Sjake		case 'G':
101580709Sjake			db_printf("%%%s", priv_regs[((insn >> 25) & 0x1f)]);
101680709Sjake			break;
101780709Sjake		case 'H':
101880709Sjake			db_printf("%%%s", state_regs[((insn >> 25) & 0x1f)]);
101980709Sjake			break;
102080709Sjake		default:
102180709Sjake			db_printf("(UNKNOWN)");
102280709Sjake			break;
102380709Sjake		}
102480709Sjake		if (*(++f_ptr))
102580709Sjake			db_printf(", ");
102680709Sjake	};
102780709Sjake
102880709Sjake	db_printf("\n");
102980709Sjake
103080709Sjake	return (loc + 4);
103180709Sjake}
1032