Home | History | Annotate | Line # | Download | only in sparc
      1 /*	$NetBSD: db_disasm.c,v 1.23 2021/04/06 16:10:08 simonb Exp $ */
      2 
      3 /*
      4  * Copyright (c) 1994 David S. Miller, davem (at) nadzieja.rutgers.edu
      5  * Copyright (c) 1995 Paul Kranenburg
      6  * All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  * 2. Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in the
     15  *    documentation and/or other materials provided with the distribution.
     16  * 3. All advertising materials mentioning features or use of this software
     17  *    must display the following acknowledgement:
     18  *      This product includes software developed by David Miller.
     19  * 4. The name of the author may not be used to endorse or promote products
     20  *    derived from this software without specific prior written permission
     21  *
     22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     25  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     27  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     31  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32  */
     33 
     34 #include <sys/cdefs.h>
     35 __KERNEL_RCSID(0, "$NetBSD: db_disasm.c,v 1.23 2021/04/06 16:10:08 simonb Exp $");
     36 
     37 #include <sys/param.h>
     38 #include <machine/db_machdep.h>
     39 #include <machine/instr.h>
     40 #include <ddb/db_sym.h>
     41 #include <ddb/db_interface.h>
     42 #include <ddb/db_user.h>
     43 #include <ddb/db_extern.h>
     44 #include <ddb/db_output.h>
     45 #include <ddb/db_access.h>
     46 
     47 #ifndef _KERNEL
     48 #include <stdlib.h>
     49 #endif
     50 
     51 /* Sign extend values */
     52 #define	SIGNEX(v,width)		({					\
     53 	unsigned s = sizeof(long)*8-(width);				\
     54 	(((long)(v) << s) >> s);					\
     55 })
     56 #define SIGN(v)			(((v)<0)?"-":"")
     57 
     58 /*
     59  * All Sparc instructions are 32-bits, with the one exception being
     60  * the set instruction which is actually a macro which expands into
     61  * two instructions...
     62  *
     63  * There are 5 different fields that can be used to identify which
     64  * operation is encoded into a particular 32-bit insn. There are 3
     65  * formats for instructions, which one being used is determined by
     66  * bits 30-31 of the insn. Here are the bit fields and their names:
     67  *
     68  * 1100 0000 0000 0000 0000 0000 0000 0000 op field, determines format
     69  * 0000 0001 1100 0000 0000 0000 0000 0000 op2 field, format 2 only
     70  * 0000 0001 1111 1000 0000 0000 0000 0000 op3 field, format 3 only
     71  * 0000 0000 0000 0000 0010 0000 0000 0000 f3i bit, format 3 only
     72  * 0000 0000 0000 0000 0001 0000 0000 0000 X bit, format 3 only
     73  */
     74 
     75 #define OP(x)	(((x) & 0x3) << 30)
     76 #define OP2(x)	(((x) & 0x7) << 22)
     77 #define OP3(x)	(((x) & 0x3f) << 19)
     78 #define OPF(x)	(((x) & 0x1ff) << 5)
     79 #define F3I(x)	(((x) & 0x1) << 13)
     80 
     81 /* various other fields */
     82 
     83 #define A(x)		(((x) & 0x1) << 29)
     84 #define P(x)		(((x) & 0x1) << 19)
     85 #define X(x)		(((x) & 0x1) << 12)
     86 #define FCN(x)		(((x) & 0x1f) << 25)
     87 #define RCOND2(x)	(((x) & 0x7) << 25)
     88 #define RCOND34(x)	(((x) & 0x7) << 10)
     89 #define COND(x)		(((x) & 0xf) << 25)
     90 #define SW_TRAP(x)	((x) & 0x7f)
     91 #define SHCNT32(x)	((x) & 0x1f)
     92 #define SHCNT64(x)	((x) & 0x3f)
     93 #define IMM11(x)	((x) & 0x7ff)
     94 #define IMM22(x)	((x) & 0x3fffff)
     95 #define DISP19(x)	((x) & 0x7ffff)
     96 #define DISP22(x)	((x) & 0x3fffff)
     97 #define DISP30(x)	((x) & 0x3fffffffL)
     98 
     99 /* Register Operand Fields */
    100 #define RS1(x)		(((x) & 0x1f) << 14)
    101 #define RS2(x)		((x) & 0x1f)
    102 #define RD(x)		(((x) & 0x1f) << 25)
    103 
    104 /* FORMAT macros used in sparc_i table to decode each opcode */
    105 #define FORMAT1(a)	(OP(a))
    106 #define FORMAT2(a,b)	(OP(a) | OP2(b))
    107 #define FORMAT3(a,b,c)	(OP(a) | OP3(b) | F3I(c))
    108 #define FORMAT3F(a,b,c)	(OP(a) | OP3(b) | OPF(c))
    109 
    110 /* Helper macros to construct OP3 & OPF */
    111 #define OP3_X(x,y)	((((x) & 3) << 4) | ((y) & 0xf))
    112 #define OPF_X(x,y)	((((x) & 0x1f) << 4) | ((y) & 0xf))
    113 
    114 /* COND condition codes field... */
    115 #define COND2(y,x)	(((((y)<<4) & 1)|((x) & 0xf)) << 14)
    116 
    117 struct sparc_insn {
    118 	  unsigned int match;
    119 	  const char* name;
    120 	  const char* format;
    121 };
    122 
    123 const char* regs[] = {
    124 	"g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
    125 	"o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
    126 	"l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
    127 	"i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7"
    128 };
    129 
    130 const char* priv_regs[] = {
    131 	"tpc", "tnpc", "tstate", "tt", "tick", "tba", "pstate", "tl",
    132 	"pil", "cwp", "cansave", "canrestore", "cleanwin", "otherwin",
    133 	"wstate", "fq",
    134 	"", "", "", "", "", "", "", "",
    135 	"", "", "", "", "", "", "", "ver"
    136 };
    137 
    138 const char* state_regs[] = {
    139 	"y", "", "ccr", "asi", "tick", "pc", "fprs", "asr",
    140 	"", "", "", "", "", "", "", "",
    141 	"pcr", "pic", "dcr", "gsr", "set_softint", "clr_softint", "softint", "tick_cmpr", "",
    142 	"", "", "", "", "", "", "", ""
    143 };
    144 
    145 const char* ccodes[] = {
    146 	"fcc0", "fcc1", "fcc2", "fcc3", "icc", "", "xcc", ""
    147 };
    148 
    149 const char* prefetch[] = {
    150 	"n_reads", "one_read", "n_writes", "one_write", "page"
    151 };
    152 
    153 
    154 /* The sparc instruction table has a format field which tells what
    155    the operand structure for this instruction is. Here are the codes:
    156 
    157 Modifiers (nust be first):
    158 	a -- opcode has annul bit
    159 	p -- opcode has branch prediction bit
    160 
    161 Codes:
    162         1 -- source register operand stored in rs1
    163 	2 -- source register operand stored in rs2
    164 	d -- destination register operand stored in rd
    165 	3 -- floating source register in rs1
    166 	4 -- floating source register in rs2
    167 	e -- floating destination register in rd
    168 	i -- 13-bit immediate value stored in simm13
    169 	j -- 11-bit immediate value stored in simm11
    170 	l -- displacement using d16lo and d16hi
    171 	m -- 22-bit fcc displacement value
    172 	n -- 30-bit displacement used in call insns
    173 	o -- %fcc number specified in cc1 and cc0 fields
    174 	p -- address computed by the contents of rs1+rs2
    175 	q -- address computed by the contents of rs1+simm13
    176 	r -- prefetch
    177 	s -- %asi is implicit in the insn, rs1 value not used
    178 	t -- immediate 8-bit asi value
    179 	u -- 19-bit fcc displacement value
    180 	5 -- hard register, %fsr lower-half
    181 	6 -- hard register, %fsr all
    182 	7 -- [reg_addr rs1+rs2] imm_asi
    183 	8 -- [reg_addr rs1+simm13] %asi
    184 	9 -- logical or of the cmask and mmask fields (membar insn)
    185 	0 -- icc or xcc condition codes register
    186 	. -- %fcc, %icc, or %xcc in opf_cc field
    187 	r -- prefection function stored in fcn field
    188 	A -- privileged register encoded in rs1
    189 	B -- state register encoded in rs1
    190 	C -- %hi(value) where value is stored in imm22 field
    191 	D -- 32-bit shift count in shcnt32
    192 	E -- 64-bit shift count in shcnt64
    193 	F -- software trap number stored in sw_trap
    194 	G -- privileged register encoded in rd
    195 	H -- state register encoded in rd
    196 
    197 V8 only:
    198 	Y -- write y register
    199 	P -- write psr register
    200 	T -- write tbr register
    201 	W -- write wim register
    202 */
    203 
    204 
    205 struct sparc_insn sparc_i[] = {
    206 
    207 	/*
    208 	 * Format 1: Call
    209 	 */
    210 	{(FORMAT1(1)), "call", "n"},
    211 
    212 	/*
    213 	 * Format 0: Sethi & Branches
    214 	 */
    215 	/* Illegal Instruction Trap */
    216 	{(FORMAT2(0, 0)), "illtrap", "m"},
    217 
    218 	/* Note: if imm22 is zero then this is actually a "nop" grrr... */
    219 	{(FORMAT2(0, 0x4)), "sethi", "Cd"},
    220 
    221 	/* Branch on Integer Condition Codes "Bicc" */
    222 	{(FORMAT2(0, 2) | COND(8)), "ba", "a,m"},
    223 	{(FORMAT2(0, 2) | COND(0)), "bn", "a,m"},
    224 	{(FORMAT2(0, 2) | COND(9)), "bne", "a,m"},
    225 	{(FORMAT2(0, 2) | COND(1)), "be", "a,m"},
    226 	{(FORMAT2(0, 2) | COND(10)), "bg", "a,m"},
    227 	{(FORMAT2(0, 2) | COND(2)), "ble", "a,m"},
    228 	{(FORMAT2(0, 2) | COND(11)), "bge", "a,m"},
    229 	{(FORMAT2(0, 2) | COND(3)), "bl", "a,m"},
    230 	{(FORMAT2(0, 2) | COND(12)), "bgu", "a,m"},
    231 	{(FORMAT2(0, 2) | COND(4)), "bleu", "a,m"},
    232 	{(FORMAT2(0, 2) | COND(13)), "bcc", "a,m"},
    233 	{(FORMAT2(0, 2) | COND(5)), "bcs", "a,m"},
    234 	{(FORMAT2(0, 2) | COND(14)), "bpos", "a,m"},
    235 	{(FORMAT2(0, 2) | COND(6)), "bneg", "a,m"},
    236 	{(FORMAT2(0, 2) | COND(15)), "bvc", "a,m"},
    237 	{(FORMAT2(0, 2) | COND(7)), "bvs", "a,m"},
    238 
    239 	/* Branch on Integer Condition Codes with Prediction "BPcc" */
    240 	{(FORMAT2(0, 1) | COND(8)), "ba", "ap,u"},
    241 	{(FORMAT2(0, 1) | COND(0)), "bn", "ap,u"},
    242 	{(FORMAT2(0, 1) | COND(9)), "bne", "ap,u"},
    243 	{(FORMAT2(0, 1) | COND(1)), "be", "ap,u"},
    244 	{(FORMAT2(0, 1) | COND(10)), "bg", "ap,u"},
    245 	{(FORMAT2(0, 1) | COND(2)), "ble", "ap,u"},
    246 	{(FORMAT2(0, 1) | COND(11)), "bge", "ap,u"},
    247 	{(FORMAT2(0, 1) | COND(3)), "bl", "ap,u"},
    248 	{(FORMAT2(0, 1) | COND(12)), "bgu", "ap,u"},
    249 	{(FORMAT2(0, 1) | COND(4)), "bleu", "ap,u"},
    250 	{(FORMAT2(0, 1) | COND(13)), "bcc", "ap,u"},
    251 	{(FORMAT2(0, 1) | COND(5)), "bcs", "ap,u"},
    252 	{(FORMAT2(0, 1) | COND(14)), "bpos", "ap,u"},
    253 	{(FORMAT2(0, 1) | COND(6)), "bneg", "ap,u"},
    254 	{(FORMAT2(0, 1) | COND(15)), "bvc", "ap,u"},
    255 	{(FORMAT2(0, 1) | COND(7)), "bvs", "ap,u"},
    256 
    257 	/* Branch on Integer Register with Prediction "BPr" */
    258 	{(FORMAT2(0, 3) | RCOND2(1)), "brz", "ap,1l"},
    259 	{(FORMAT2(0, 3) | A(1) | P(1) | RCOND2(2)), "brlex", "ap,1l"},
    260 	{(FORMAT2(0, 3) | RCOND2(3)), "brlz", "ap,1l"},
    261 	{(FORMAT2(0, 3) | RCOND2(5)), "brnz", "ap,1l"},
    262 	{(FORMAT2(0, 3) | RCOND2(6)), "brgz", "ap,1l"},
    263 	{(FORMAT2(0, 3) | RCOND2(7)), "brgez", "ap,1l"},
    264 
    265 	/* Branch on Floating-Point Condition Codes with Prediction "FBPfcc" */
    266 	{(FORMAT2(0, 5) | COND(8)), "fba", "ap,m"},
    267 	{(FORMAT2(0, 5) | COND(0)), "fbn", "ap,m"},
    268 	{(FORMAT2(0, 5) | COND(7)), "fbu", "ap,m"},
    269 	{(FORMAT2(0, 5) | COND(6)), "fbg", "ap,m"},
    270 	{(FORMAT2(0, 5) | COND(5)), "fbug", "ap,m"},
    271 	{(FORMAT2(0, 5) | COND(4)), "fbl", "ap,m"},
    272 	{(FORMAT2(0, 5) | COND(3)), "fbul", "ap,m"},
    273 	{(FORMAT2(0, 5) | COND(2)), "fblg", "ap,m"},
    274 	{(FORMAT2(0, 5) | COND(1)), "fbne", "ap,m"},
    275 	{(FORMAT2(0, 5) | COND(9)), "fbe", "ap,m"},
    276 	{(FORMAT2(0, 5) | COND(10)), "fbue", "ap,m"},
    277 	{(FORMAT2(0, 5) | COND(11)), "fbge", "ap,m"},
    278 	{(FORMAT2(0, 5) | COND(12)), "fbuge", "ap,m"},
    279 	{(FORMAT2(0, 5) | COND(13)), "fble", "ap,m"},
    280 	{(FORMAT2(0, 5) | COND(14)), "fbule", "ap,m"},
    281 	{(FORMAT2(0, 5) | COND(15)), "fbo", "ap,m"},
    282 
    283 	/* Branch on Floating-Point Condition Codes "FBfcc" */
    284 	{(FORMAT2(0, 6) | COND(8)), "fba", "a,m"},
    285 	{(FORMAT2(0, 6) | COND(0)), "fbn", "a,m"},
    286 	{(FORMAT2(0, 6) | COND(7)), "fbu", "a,m"},
    287 	{(FORMAT2(0, 6) | COND(6)), "fbg", "a,m"},
    288 	{(FORMAT2(0, 6) | COND(5)), "fbug", "a,m"},
    289 	{(FORMAT2(0, 6) | COND(4)), "fbl", "a,m"},
    290 	{(FORMAT2(0, 6) | COND(3)), "fbul", "a,m"},
    291 	{(FORMAT2(0, 6) | COND(2)), "fblg", "a,m"},
    292 	{(FORMAT2(0, 6) | COND(1)), "fbne", "a,m"},
    293 	{(FORMAT2(0, 6) | COND(9)), "fbe", "a,m"},
    294 	{(FORMAT2(0, 6) | COND(10)), "fbue", "a,m"},
    295 	{(FORMAT2(0, 6) | COND(11)), "fbge", "a,m"},
    296 	{(FORMAT2(0, 6) | COND(12)), "fbuge", "a,m"},
    297 	{(FORMAT2(0, 6) | COND(13)), "fble", "a,m"},
    298 	{(FORMAT2(0, 6) | COND(14)), "fbule", "a,m"},
    299 	{(FORMAT2(0, 6) | COND(15)), "fbo", "a,m"},
    300 
    301 
    302 
    303 	/*
    304 	 * Format 3/2: Arithmetic & misc (table 32, appendix E)
    305 	 */
    306 	{FORMAT3(2, OP3_X(0,0), 0), "add", "12d"},
    307 	{FORMAT3(2, OP3_X(0,0), 1), "add", "1id"},
    308 	{FORMAT3(2, OP3_X(1,0), 0), "addcc", "12d"},
    309 	{FORMAT3(2, OP3_X(1,0), 1), "addcc", "1id"},
    310 	{FORMAT3(2, OP3_X(2,0), 0), "taddcc", "12d"},
    311 	{FORMAT3(2, OP3_X(2,0), 1), "taddcc", "1id"},
    312 #ifdef V9
    313 	{(FORMAT3(2, 0x30, 1) | RD(0xf)), "sir", "i"},
    314 	{FORMAT3(2, OP3_X(3,0), 0), "wr", "12H"},
    315 	{FORMAT3(2, OP3_X(3,0), 1), "wr", "1iH"},
    316 #else
    317 	{FORMAT3(2, OP3_X(3,0), 0), "wr", "12Y"}, /* wr 1, 2, %y  */
    318 	{FORMAT3(2, OP3_X(3,0), 1), "wr", "1iY"}, /* wr 1, i, %y */
    319 #endif
    320 
    321 	{FORMAT3(2, OP3_X(0,1), 0), "and", "12d"},
    322 	{FORMAT3(2, OP3_X(0,1), 1), "and", "1id"},
    323 	{FORMAT3(2, OP3_X(1,1), 0), "andcc", "12d"},
    324 	{FORMAT3(2, OP3_X(1,1), 1), "andcc", "1id"},
    325 	{FORMAT3(2, OP3_X(2,1), 0), "tsubcc", "12d"},
    326 	{FORMAT3(2, OP3_X(2,1), 1), "tsubcc", "1id"},
    327 #ifdef V9
    328 	{FORMAT3(2, OP3_X(3,1), 0), "saved", ""},
    329 	{FORMAT3(2, OP3_X(3,1), 0)|FCN(1), "restored", ""},
    330 #else
    331 	{FORMAT3(2, OP3_X(3,1), 0), "wr", "12P"}, /* wr 1, 2, %psr  */
    332 	{FORMAT3(2, OP3_X(3,1), 1), "wr", "1iP"}, /* wr 1, i, %psr */
    333 #endif
    334 
    335 	{FORMAT3(2, OP3_X(0,2), 0), "or", "12d"},
    336 	{FORMAT3(2, OP3_X(0,2), 1), "or", "1id"},
    337 	{FORMAT3(2, OP3_X(1,2), 0), "orcc", "12d"},
    338 	{FORMAT3(2, OP3_X(1,2), 1), "orcc", "1id"},
    339 	{FORMAT3(2, OP3_X(2,2), 0), "taddcctv", "12d"},
    340 	{FORMAT3(2, OP3_X(2,2), 1), "taddcctv", "1id"},
    341 #ifdef V9
    342 	{FORMAT3(2, OP3_X(3,2), 0), "wrpr", "12G"},
    343 	{FORMAT3(2, OP3_X(3,2), 1), "wrpr", "1iG"},
    344 #else
    345 	{FORMAT3(2, OP3_X(3,2), 0), "wr", "12W"}, /* wr 1, 2, %wim */
    346 	{FORMAT3(2, OP3_X(3,2), 1), "wr", "1iW"}, /* wr 1, i, %wim */
    347 #endif
    348 
    349 	{FORMAT3(2, OP3_X(0,3), 0), "xor", "12d"},
    350 	{FORMAT3(2, OP3_X(0,3), 1), "xor", "1id"},
    351 	{FORMAT3(2, OP3_X(1,3), 0), "xorcc", "12d"},
    352 	{FORMAT3(2, OP3_X(1,3), 1), "xorcc", "1id"},
    353 	{FORMAT3(2, OP3_X(2,3), 0), "tsubcctv", "12d"},
    354 	{FORMAT3(2, OP3_X(2,3), 1), "tsubcctv", "1id"},
    355 #ifdef V9
    356 	{FORMAT3(2, OP3_X(3,3), 0), "UNDEFINED", ""},
    357 #else
    358 	{FORMAT3(2, OP3_X(3,3), 0), "wr", "12T"}, /* wr 1, 2, %tbr */
    359 	{FORMAT3(2, OP3_X(3,3), 1), "wr", "1iT"}, /* wr 1, i, %tbr */
    360 #endif
    361 
    362 	{FORMAT3(2, OP3_X(0,4), 0), "sub", "12d"},
    363 	{FORMAT3(2, OP3_X(0,4), 1), "sub", "1id"},
    364 	{FORMAT3(2, OP3_X(1,4), 0), "subcc", "12d"},
    365 	{FORMAT3(2, OP3_X(1,4), 1), "subcc", "1id"},
    366 	{FORMAT3(2, OP3_X(2,4), 0), "mulscc", "12d"},
    367 	{FORMAT3(2, OP3_X(2,4), 1), "mulscc", "1id"},
    368 	{FORMAT3(2, OP3_X(3,4), 1), "FPop1", ""},	/* see below */
    369 
    370 	{FORMAT3(2, OP3_X(0,5), 0), "andn", "12d"},
    371 	{FORMAT3(2, OP3_X(0,5), 1), "andn", "1id"},
    372 	{FORMAT3(2, OP3_X(1,5), 0), "andncc", "12d"},
    373 	{FORMAT3(2, OP3_X(1,5), 1), "andncc", "1id"},
    374 	{FORMAT3(2, OP3_X(2,5), 0), "sll", "12d"},
    375 	{FORMAT3(2, OP3_X(2,5), 1), "sll", "1Dd"},
    376 	{FORMAT3(2, OP3_X(2,5), 0)|X(1), "sllx", "12d"},
    377 	{FORMAT3(2, OP3_X(2,5), 1)|X(1), "sllx", "1Ed"},
    378 	{FORMAT3(2, OP3_X(3,5), 1), "FPop2", ""},	/* see below */
    379 
    380 	{FORMAT3(2, OP3_X(0,6), 0), "orn", "12d"},
    381 	{FORMAT3(2, OP3_X(0,6), 1), "orn", "1id"},
    382 	{FORMAT3(2, OP3_X(1,6), 0), "orncc", "12d"},
    383 	{FORMAT3(2, OP3_X(1,6), 1), "orncc", "1id"},
    384 	{FORMAT3(2, OP3_X(2,6), 0), "srl", "12d"},
    385 	{FORMAT3(2, OP3_X(2,6), 1), "srl", "1Dd"},
    386 	{FORMAT3(2, OP3_X(2,6), 0)|X(1), "srlx", "12d"},
    387 	{FORMAT3(2, OP3_X(2,6), 1)|X(1), "srlx", "1Ed"},
    388 	{FORMAT3(2, OP3_X(3,6), 1), "impdep1", ""},
    389 
    390 	{FORMAT3(2, OP3_X(0,7), 0), "xorn", "12d"},
    391 	{FORMAT3(2, OP3_X(0,7), 1), "xorn", "1id"},
    392 	{FORMAT3(2, OP3_X(1,7), 0), "xorncc", "12d"},
    393 	{FORMAT3(2, OP3_X(1,7), 1), "xorncc", "1id"},
    394 	{FORMAT3(2, OP3_X(2,7), 0), "sra", "12d"},
    395 	{FORMAT3(2, OP3_X(2,7), 1), "sra", "1Dd"},
    396 	{FORMAT3(2, OP3_X(2,7), 0)|X(1), "srax", "12d"},
    397 	{FORMAT3(2, OP3_X(2,7), 1)|X(1), "srax", "1Ed"},
    398 	{FORMAT3(2, OP3_X(3,7), 1), "impdep2", ""},
    399 
    400 	{FORMAT3(2, OP3_X(0,8), 0), "addc", "12d"},
    401 	{FORMAT3(2, OP3_X(0,8), 1), "addc", "1id"},
    402 	{FORMAT3(2, OP3_X(1,8), 0), "addccc", "12d"},
    403 	{FORMAT3(2, OP3_X(1,8), 1), "addccc", "1id"},
    404 #ifdef V9
    405 	{(FORMAT3(2, 0x28, 1) | RS1(15)), "membar", "9"},
    406 	{(FORMAT3(2, 0x28, 0) | RS1(15)), "stbar", ""},
    407 	{FORMAT3(2, OP3_X(2,8), 0), "rd", "Bd"},
    408 #else
    409 	{FORMAT3(2, OP3_X(2,8), 0), "rd", "Yd"},
    410 #endif
    411 
    412 	{FORMAT3(2, OP3_X(3,8), 0), "jmpl", "pd"},
    413 	{FORMAT3(2, OP3_X(3,8), 1), "jmpl", "qd"},
    414 
    415 	{FORMAT3(2, OP3_X(0,9), 0), "mulx", "12d"},
    416 	{FORMAT3(2, OP3_X(0,9), 1), "mulx", "1id"},
    417 	{FORMAT3(2, OP3_X(1,9), 0), "UNDEFINED", ""},
    418 #ifdef V9
    419 	{FORMAT3(2, OP3_X(2,9), 0), "UNDEFINED", ""},
    420 #else
    421 	{FORMAT3(2, OP3_X(2,9), 0), "rd", "Pd"},
    422 #endif
    423 	{FORMAT3(2, OP3_X(3,9), 0), "return", "p"},
    424 	{FORMAT3(2, OP3_X(3,9), 1), "return", "q"},
    425 
    426 	{FORMAT3(2, OP3_X(0,10), 0), "umul", "12d"},
    427 	{FORMAT3(2, OP3_X(0,10), 1), "umul", "1id"},
    428 	{FORMAT3(2, OP3_X(1,10), 0), "umulcc", "12d"},
    429 	{FORMAT3(2, OP3_X(1,10), 1), "umulcc", "1id"},
    430 #ifdef V9
    431 	{FORMAT3(2, OP3_X(2,10), 0), "rdpr", "Ad"},
    432 #else
    433 	{FORMAT3(2, OP3_X(2,10), 0), "rd", "Wd"},
    434 #endif
    435 		/*
    436 		 * OP3 = (3,10): TCC: Trap on Integer Condition Codes
    437 		 */
    438 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0x8)), "ta", "12F"},
    439 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0x8)), "ta", "0F"},
    440 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0x0)), "tn", "12F"},
    441 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0x0)), "tn", "0F"},
    442 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0x9)), "tne", "12F"},
    443 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0x9)), "tne", "0F"},
    444 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0x1)), "te", "12F"},
    445 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0x1)), "te", "0F"},
    446 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0xa)), "tg", "12F"},
    447 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0xa)), "tg", "0F"},
    448 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0x2)), "tle", "12F"},
    449 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0x2)), "tle", "0F"},
    450 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0xb)), "tge", "12F"},
    451 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0xb)), "tge", "0F"},
    452 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0x3)), "tl", "12F"},
    453 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0x3)), "tl", "0F"},
    454 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0xc)), "tgu", "12F"},
    455 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0xc)), "tgu", "0F"},
    456 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0x4)), "tleu", "12F"},
    457 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0x4)), "tleu", "0F"},
    458 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0xd)), "tcc", "12F"},
    459 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0xd)), "tcc", "0F"},
    460 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0x5)), "tcs", "12F"},
    461 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0x5)), "tcs", "0F"},
    462 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0xe)), "tpos", "12F"},
    463 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0xe)), "tpos", "0F"},
    464 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0x6)), "tneg", "12F"},
    465 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0x6)), "tneg", "0F"},
    466 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0xf)), "tvc", "12F"},
    467 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0xf)), "tvc", "0F"},
    468 		{(FORMAT3(2, OP3_X(3,10), 0) | COND(0x7)), "tvs", "12F"},
    469 		{(FORMAT3(2, OP3_X(3,10), 1) | COND(0x7)), "tvs", "0F"},
    470 
    471 	{FORMAT3(2, OP3_X(0,11), 0), "smul", "12d"},
    472 	{FORMAT3(2, OP3_X(0,11), 1), "smul", "1id"},
    473 	{FORMAT3(2, OP3_X(1,11), 0), "smulcc", "12d"},
    474 	{FORMAT3(2, OP3_X(1,11), 1), "smulcc", "1id"},
    475 #ifdef V9
    476 	{FORMAT3(2, OP3_X(2,11), 0), "flushw", ""},
    477 #else
    478 	{FORMAT3(2, OP3_X(2,11), 0), "rd", "Td"},
    479 #endif
    480 	{FORMAT3(2, OP3_X(3,11), 0), "flush", "p"},
    481 	{FORMAT3(2, OP3_X(3,11), 1), "flush", "q"},
    482 
    483 	{FORMAT3(2, OP3_X(0,12), 0), "subc", "12d"},
    484 	{FORMAT3(2, OP3_X(0,12), 1), "subc", "1id"},
    485 	{FORMAT3(2, OP3_X(1,12), 0), "subccc", "12d"},
    486 	{FORMAT3(2, OP3_X(1,12), 1), "subccc", "1id"},
    487 		/*
    488 		 * OP3 = (2,12): MOVcc, Move Integer Register on Condition
    489 		 */
    490 		/* For Integer Condition Codes */
    491 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,8)), "mova", "0jd"},
    492 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,8)), "mova", "02d"},
    493 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,0)), "movn", "0jd"},
    494 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,0)), "movn", "02d"},
    495 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,9)), "movne", "0jd"},
    496 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,9)), "movne", "02d"},
    497 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,1)), "move", "0jd"},
    498 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,1)), "move", "02d"},
    499 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,10)), "movg", "0jd"},
    500 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,10)), "movg", "02d"},
    501 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,2)), "movle", "0jd"},
    502 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,2)), "movle", "02d"},
    503 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,11)), "movge", "0jd"},
    504 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,11)), "movge", "02d"},
    505 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,3)), "movl", "0jd"},
    506 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,3)), "movl", "02d"},
    507 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,12)), "movgu", "0jd"},
    508 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,12)), "movgu", "02d"},
    509 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,4)), "movleu", "0jd"},
    510 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,4)), "movleu", "02d"},
    511 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,13)), "movcc", "0jd"},
    512 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,13)), "movcc", "02d"},
    513 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,5)), "movcs", "0jd"},
    514 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,5)), "movcs", "02d"},
    515 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,14)), "movpos", "0jd"},
    516 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,14)), "movpos", "02d"},
    517 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,6)), "movneg", "0jd"},
    518 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,6)), "movneg", "02d"},
    519 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,15)), "movvc", "0jd"},
    520 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,15)), "movvc", "02d"},
    521 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(1,7)), "movvs", "0jd"},
    522 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(1,7)), "movvs", "02d"},
    523 
    524 		/* For Floating-Point Condition Codes */
    525 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,8)), "mova", "ojd"},
    526 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,8)), "mova", "o2d"},
    527 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,0)), "movn", "ojd"},
    528 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,0)), "movn", "o2d"},
    529 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,7)), "movu", "ojd"},
    530 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,7)), "movu", "o2d"},
    531 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,6)), "movg", "ojd"},
    532 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,6)), "movg", "o2d"},
    533 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,5)), "movug", "ojd"},
    534 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,5)), "movug", "o2d"},
    535 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,4)), "movl", "ojd"},
    536 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,4)), "movl", "o2d"},
    537 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,3)), "movul", "ojd"},
    538 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,3)), "movul", "o2d"},
    539 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,2)), "movlg", "ojd"},
    540 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,2)), "movlg", "o2d"},
    541 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,1)), "movne", "ojd"},
    542 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,1)), "movne", "o2d"},
    543 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,9)), "move", "ojd"},
    544 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,9)), "move", "o2d"},
    545 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,10)), "movue", "ojd"},
    546 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,10)), "movue", "o2d"},
    547 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,11)), "movge", "ojd"},
    548 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,11)), "movge", "o2d"},
    549 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,12)), "movuge", "ojd"},
    550 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,12)), "movuge", "o2d"},
    551 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,13)), "movle", "ojd"},
    552 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,13)), "movle", "o2d"},
    553 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,14)), "movule", "ojd"},
    554 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,14)), "movule", "o2d"},
    555 		{(FORMAT3(2, OP3_X(2,12), 1) | COND2(0,15)), "movo", "ojd"},
    556 		{(FORMAT3(2, OP3_X(2,12), 0) | COND2(0,15)), "movo", "o2d"},
    557 
    558 	{FORMAT3(2, OP3_X(3,12), 0), "save", "12d"},
    559 	{FORMAT3(2, OP3_X(3,12), 1), "save", "1id"},
    560 
    561 	{FORMAT3(2, OP3_X(0,13), 0), "udivx", "12d"},
    562 	{FORMAT3(2, OP3_X(0,13), 1), "udivx", "1id"},
    563 	{FORMAT3(2, OP3_X(1,13), 0), "UNDEFINED", ""},
    564 	{FORMAT3(2, OP3_X(2,13), 0), "sdivx", "12d"},
    565 	{FORMAT3(2, OP3_X(2,13), 1), "sdivx", "1id"},
    566 	{FORMAT3(2, OP3_X(3,13), 0), "restore", "12d"},
    567 	{FORMAT3(2, OP3_X(3,13), 1), "restore", "1id"},
    568 
    569 	{FORMAT3(2, OP3_X(0,14), 0), "udiv", "12d"},
    570 	{FORMAT3(2, OP3_X(0,14), 1), "udiv", "1id"},
    571 	{FORMAT3(2, OP3_X(1,14), 0), "udivcc", "12d"},
    572 	{FORMAT3(2, OP3_X(1,14), 1), "udivcc", "1id"},
    573 	{FORMAT3(2, OP3_X(2,14), 0), "popc", "2d"},
    574 	{FORMAT3(2, OP3_X(2,14), 1), "popc", "id"},
    575 
    576 	{FORMAT3(2, OP3_X(3,14), 0), "done", ""},
    577 	{FORMAT3(2, OP3_X(3,14)|FCN(1), 1), "retry", ""},
    578 
    579 	{FORMAT3(2, OP3_X(0,15), 0), "sdiv", "12d"},
    580 	{FORMAT3(2, OP3_X(0,15), 1), "sdiv", "1id"},
    581 	{FORMAT3(2, OP3_X(1,15), 0), "sdivcc", "12d"},
    582 	{FORMAT3(2, OP3_X(1,15), 1), "sdivcc", "1id"},
    583 		/*
    584 		 * OP3 = (2,15): MOVr:
    585 		 * 	Move Integer Register on Register Condition
    586 		 */
    587 		{(FORMAT3(2, OP3_X(2,15), 1) | RCOND34(1)), "movrz", "1jd"},
    588 		{(FORMAT3(2, OP3_X(2,15), 0) | RCOND34(1)), "movrz", "12d"},
    589 		{(FORMAT3(2, OP3_X(2,15), 1) | RCOND34(2)), "movrlez", "1jd"},
    590 		{(FORMAT3(2, OP3_X(2,15), 0) | RCOND34(2)), "movrlez", "12d"},
    591 		{(FORMAT3(2, OP3_X(2,15), 1) | RCOND34(3)), "movrlz", "1jd"},
    592 		{(FORMAT3(2, OP3_X(2,15), 0) | RCOND34(3)), "movrlz", "12d"},
    593 		{(FORMAT3(2, OP3_X(2,15), 1) | RCOND34(5)), "movrnz", "1jd"},
    594 		{(FORMAT3(2, OP3_X(2,15), 0) | RCOND34(5)), "movrnz", "12d"},
    595 		{(FORMAT3(2, OP3_X(2,15), 1) | RCOND34(6)), "movrgz", "1jd"},
    596 		{(FORMAT3(2, OP3_X(2,15), 0) | RCOND34(6)), "movrgz", "12d"},
    597 		{(FORMAT3(2, OP3_X(2,15), 1) | RCOND34(7)), "movrgez", "1jd"},
    598 		{(FORMAT3(2, OP3_X(2,15), 0) | RCOND34(7)), "movrgez", "12d"},
    599 
    600 	{FORMAT3(2, OP3_X(3,15), 0), "UNDEFINED", ""},
    601 
    602 
    603 	/*
    604 	 * Format 3/3: Load and store (appendix E, table 33)
    605 	 */
    606 
    607 	/* Loads */
    608 	{(FORMAT3(3, OP3_X(0,0), 0)), "ld", "pd"},	/* officially: lduw */
    609 	{(FORMAT3(3, OP3_X(0,0), 1)), "ld", "qd"},
    610 	{(FORMAT3(3, OP3_X(1,0), 0)), "lda", "7d"},	/* officially: lduwa */
    611 	{(FORMAT3(3, OP3_X(1,0), 1)), "lda", "8d"},
    612 	{(FORMAT3(3, OP3_X(2,0), 0)), "ldf", "pe"},
    613 	{(FORMAT3(3, OP3_X(2,0), 1)), "ldf", "qe"},
    614 	{(FORMAT3(3, OP3_X(3,0), 0)), "ldfa", "7e"},
    615 	{(FORMAT3(3, OP3_X(3,0), 1)), "ldfa", "8e"},
    616 
    617 	{(FORMAT3(3, OP3_X(0,1), 0)), "ldub", "pd"},
    618 	{(FORMAT3(3, OP3_X(0,1), 1)), "ldub", "qd"},
    619 	{(FORMAT3(3, OP3_X(1,1), 0)), "lduba", "7d"},
    620 	{(FORMAT3(3, OP3_X(1,1), 1)), "lduba", "8d"},
    621 	{(FORMAT3(3, OP3_X(2,1), 0) | RD(0)), "ld", "p5"},
    622 	{(FORMAT3(3, OP3_X(2,1), 1) | RD(0)), "ld", "q5"},
    623 	{(FORMAT3(3, OP3_X(2,1), 0) | RD(1)), "ldx", "p6"},
    624 	{(FORMAT3(3, OP3_X(2,1), 1) | RD(1)), "ldx", "q6"},
    625 
    626 	{(FORMAT3(3, OP3_X(0,2), 0)), "lduh", "pd"},
    627 	{(FORMAT3(3, OP3_X(0,2), 1)), "lduh", "qd"},
    628 	{(FORMAT3(3, OP3_X(1,2), 0)), "lduha", "7d"},
    629 	{(FORMAT3(3, OP3_X(1,2), 1)), "lduha", "8d"},
    630 	{(FORMAT3(3, OP3_X(2,2), 0)), "ldq", "pe"},
    631 	{(FORMAT3(3, OP3_X(2,2), 1)), "ldq", "qe"},
    632 	{(FORMAT3(3, OP3_X(3,2), 0)), "ldqa", "7e"},
    633 	{(FORMAT3(3, OP3_X(3,2), 1)), "ldqa", "8e"},
    634 
    635 	{(FORMAT3(3, OP3_X(0,3), 0)), "ldd", "pd"},
    636 	{(FORMAT3(3, OP3_X(0,3), 1)), "ldd", "qd"},
    637 	{(FORMAT3(3, OP3_X(1,3), 0)), "ldda", "7d"},
    638 	{(FORMAT3(3, OP3_X(1,3), 1)), "ldda", "8d"},
    639 	{(FORMAT3(3, OP3_X(2,3), 0)), "ldd", "pe"},
    640 	{(FORMAT3(3, OP3_X(2,3), 1)), "ldd", "qe"},
    641 	{(FORMAT3(3, OP3_X(3,3), 0)), "ldda", "7e"},
    642 	{(FORMAT3(3, OP3_X(3,3), 1)), "ldda", "8e"},
    643 
    644 	{(FORMAT3(3, OP3_X(0,4), 0)), "st", "dp"},	/* officially: stw */
    645 	{(FORMAT3(3, OP3_X(0,4), 1)), "st", "dq"},
    646 	{(FORMAT3(3, OP3_X(1,4), 0)), "sta", "d7"},	/* officially: stwa */
    647 	{(FORMAT3(3, OP3_X(1,4), 1)), "sta", "d8"},
    648 	{(FORMAT3(3, OP3_X(2,4), 0)), "st", "ep"},
    649 	{(FORMAT3(3, OP3_X(2,4), 1)), "st", "eq"},
    650 	{(FORMAT3(3, OP3_X(3,4), 0)), "sta", "e7"},
    651 	{(FORMAT3(3, OP3_X(3,4), 1)), "sta", "e8"},
    652 
    653 	{(FORMAT3(3, OP3_X(0,5), 0)), "stb", "dp"},
    654 	{(FORMAT3(3, OP3_X(0,5), 1)), "stb", "dq"},
    655 	{(FORMAT3(3, OP3_X(1,5), 0)), "stba", "d7"},
    656 	{(FORMAT3(3, OP3_X(1,5), 1)), "stba", "d8"},
    657 	{(FORMAT3(3, OP3_X(2,5), 0)), "st", "5p"},
    658 	{(FORMAT3(3, OP3_X(2,5), 1)), "st", "5q"},
    659 	{(FORMAT3(3, OP3_X(2,5), 0)|RD(1)), "stx", "6p"},
    660 	{(FORMAT3(3, OP3_X(2,5), 1)|RD(1)), "stx", "6q"},
    661 
    662 	{(FORMAT3(3, OP3_X(0,6), 0)), "sth", "dp"},
    663 	{(FORMAT3(3, OP3_X(0,6), 1)), "sth", "dq"},
    664 	{(FORMAT3(3, OP3_X(1,6), 0)), "stha", "d7"},
    665 	{(FORMAT3(3, OP3_X(1,6), 1)), "stha", "d8"},
    666 	{(FORMAT3(3, OP3_X(2,6), 0)), "stq", "ep"},
    667 	{(FORMAT3(3, OP3_X(2,6), 1)), "stq", "eq"},
    668 	{(FORMAT3(3, OP3_X(3,6), 0)), "stqa", "e7"},
    669 	{(FORMAT3(3, OP3_X(3,6), 1)), "stqa", "e8"},
    670 
    671 	{(FORMAT3(3, OP3_X(0,7), 0)), "std", "dp"},
    672 	{(FORMAT3(3, OP3_X(0,7), 1)), "std", "dq"},
    673 	{(FORMAT3(3, OP3_X(1,7), 0)), "stda", "d7"},
    674 	{(FORMAT3(3, OP3_X(1,7), 1)), "stda", "d8"},
    675 	{(FORMAT3(3, OP3_X(2,7), 0)), "std", "ep"},
    676 	{(FORMAT3(3, OP3_X(2,7), 1)), "std", "eq"},
    677 	{(FORMAT3(3, OP3_X(3,7), 0)), "stda", "e7"},
    678 	{(FORMAT3(3, OP3_X(3,7), 1)), "stda", "e8"},
    679 
    680 	{(FORMAT3(3, OP3_X(0,8), 0)), "ldsw", "pd"},
    681 	{(FORMAT3(3, OP3_X(0,8), 1)), "ldsw", "qd"},
    682 	{(FORMAT3(3, OP3_X(1,8), 0)), "ldswa", "7d"},
    683 	{(FORMAT3(3, OP3_X(1,8), 1)), "ldswa", "8d"},
    684 
    685 	{(FORMAT3(3, OP3_X(0,9), 0)), "ldsb", "pd"},
    686 	{(FORMAT3(3, OP3_X(0,9), 1)), "ldsb", "qd"},
    687 	{(FORMAT3(3, OP3_X(1,9), 0)), "ldsba", "7d"},
    688 	{(FORMAT3(3, OP3_X(1,9), 1)), "ldsba", "8d"},
    689 
    690 	{(FORMAT3(3, OP3_X(0,10), 0)), "ldsh", "pd"},
    691 	{(FORMAT3(3, OP3_X(0,10), 1)), "ldsh", "qd"},
    692 	{(FORMAT3(3, OP3_X(1,10), 0)), "ldsha", "7d"},
    693 	{(FORMAT3(3, OP3_X(1,10), 1)), "ldsha", "8d"},
    694 
    695 	{(FORMAT3(3, OP3_X(0,11), 0)), "ldx", "pd"},
    696 	{(FORMAT3(3, OP3_X(0,11), 1)), "ldx", "qd"},
    697 	{(FORMAT3(3, OP3_X(1,11), 0)), "ldxa", "7d"},
    698 	{(FORMAT3(3, OP3_X(1,11), 1)), "ldxa", "8d"},
    699 
    700 	{(FORMAT3(3, OP3_X(3,12), 1)), "casa", "s2d"},
    701 	{(FORMAT3(3, OP3_X(3,12), 0)), "casa", "t2d"},
    702 
    703 	{(FORMAT3(3, OP3_X(0,13), 0)), "ldstub", "7d"},
    704 	{(FORMAT3(3, OP3_X(0,13), 1)), "ldstub", "8d"},
    705 	{(FORMAT3(3, OP3_X(1,13), 0)), "ldstuba", "pd"},
    706 	{(FORMAT3(3, OP3_X(1,13), 1)), "ldstuba", "qd"},
    707 	{(FORMAT3(3, OP3_X(2,13), 0)), "prefetch", "pr"},
    708 	{(FORMAT3(3, OP3_X(2,13), 1)), "prefetch", "qr"},
    709 	{(FORMAT3(3, OP3_X(3,13), 0)), "prefetcha", "7r"},
    710 	{(FORMAT3(3, OP3_X(3,13), 1)), "prefetcha", "8r"},
    711 
    712 	{(FORMAT3(3, OP3_X(0,14), 0)), "stx", "dp"},
    713 	{(FORMAT3(3, OP3_X(0,14), 1)), "stx", "dq"},
    714 	{(FORMAT3(3, OP3_X(1,14), 0)), "stwa", "d7"},
    715 	{(FORMAT3(3, OP3_X(1,14), 1)), "stwa", "d8"},
    716 	{(FORMAT3(3, OP3_X(3,14), 0)), "casxa", "t2d"},
    717 	{(FORMAT3(3, OP3_X(3,14), 1)), "casxa", "s2d"},
    718 
    719 	/* Swap Register */
    720 	{(FORMAT3(3, OP3_X(0,15), 0)), "swap", "pd"},
    721 	{(FORMAT3(3, OP3_X(0,15), 1)), "swap", "qd"},
    722 	{(FORMAT3(3, OP3_X(1,15), 0)), "swapa", "7d"},
    723 	{(FORMAT3(3, OP3_X(1,15), 1)), "swapa", "8d"},
    724 
    725 
    726 	/*
    727 	 * OP3 = (3,4): FPop1 (table 34)
    728 	 */
    729 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,1))), "fmovs", ".4e"},
    730 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,2))), "fmovd", ".4e"},
    731 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,3))), "fmovq", ".4e"},
    732 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,5))), "fnegs", "4e"},
    733 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,6))), "fnegd", "4e"},
    734 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,7))), "fnegq", "4e"},
    735 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,9))), "fabss", "4e"},
    736 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,10))), "fabsd", "4e"},
    737 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(0,11))), "fabsq", "4e"},
    738 
    739 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(2,9))), "fsqrts", "4e"},
    740 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(2,10))), "fsqrtd", "4e"},
    741 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(2,11))), "fsqrtq", "4e"},
    742 
    743 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,1))), "fadds", "34e"},
    744 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,2))), "faddd", "34e"},
    745 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,3))), "faddq", "34e"},
    746 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,5))), "fsubs", "34e"},
    747 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,6))), "fsubd", "34e"},
    748 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,7))), "fsubq", "34e"},
    749 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,9))), "fmuls", "34e"},
    750 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,10))), "fmuld", "34e"},
    751 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,11))), "fmulq", "34e"},
    752 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,13))), "fdivs", "34e"},
    753 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,14))), "fdivd", "34e"},
    754 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(4,15))), "fdivq", "34e"},
    755 
    756 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(6,9))), "fsmuld", "34e"},
    757 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(6,14))), "fdmulq", "34e"},
    758 
    759 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(8,1))), "fstox", "4e"},
    760 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(8,2))), "fdtox", "4e"},
    761 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(8,3))), "fqtox", "4e"},
    762 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(8,4))), "fxtos", "4e"},
    763 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(8,8))), "fxtod", "4e"},
    764 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(8,12))), "fxtoq", "4e"},
    765 
    766 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,4))), "fitos", "4e"},
    767 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,6))), "fdtos", "4e"},
    768 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,7))), "fqtos", "4e"},
    769 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,8))), "fitod", "4e"},
    770 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,9))), "fstod", "4e"},
    771 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,11))), "fqtod", "4e"},
    772 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,12))), "fitoq", "4e"},
    773 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,13))), "fstoq", "4e"},
    774 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(12,14))), "fdtoq", "4e"},
    775 
    776 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(13,1))), "fstoi", "4e"},
    777 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(13,2))), "fdtoi", "4e"},
    778 	{(FORMAT3F(2, OP3_X(3,4), OPF_X(13,3))), "fqtoi", "4e"},
    779 
    780 
    781 #ifdef xxx
    782 	/*
    783 	 * OP3 =(3,5): FPop2 (table 35)
    784 	 */
    785 	{(FORMAT3F(2, OP3_X(3,5), 81)), "fcmps", "o34"},
    786 	{(FORMAT3F(2, OP3_X(3,5), 82)), "fcmpd", "o34"},
    787 	{(FORMAT3F(2, OP3_X(3,5), 83)), "fcmpq", "o34"},
    788 	{(FORMAT3F(2, OP3_X(3,5), 85)), "fcmpes", "o34"},
    789 	{(FORMAT3F(2, OP3_X(3,5), 86)), "fcmped", "o34"},
    790 	{(FORMAT3F(2, OP3_X(3,5), 87)), "fcmpeq", "o34"},
    791 
    792 	/* Move Floating-Point Register on Condition "FMOVcc" */
    793 	/* FIXME should check for single, double, and quad movements */
    794 	/* Integer Condition Codes */
    795 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,8)), "fmova", "04e"},
    796 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,0)), "fmovn", "04e"},
    797 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,9)), "fmovne", "04e"},
    798 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,1)), "fmove", "04e"},
    799 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,10)), "fmovg", "04e"},
    800 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,2)), "fmovle", "04e"},
    801 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,11)), "fmovge", "04e"},
    802 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,3)), "fmovl", "04e"},
    803 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,12)), "fmovgu", "04e"},
    804 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,4)), "fmovleu", "04e"},
    805 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,13)), "fmovcc", "04e"},
    806 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,5)), "fmovcs", "04e"},
    807 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,14)), "fmovpos", "04e"},
    808 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,6)), "fmovneg", "04e"},
    809 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,15)), "fmovvc", "04e"},
    810 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,7)), "fmovvs", "04e"},
    811 
    812 	/* Floating-Point Condition Codes */
    813 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,8)), "fmova", "o4e"},
    814 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,0)), "fmovn", "o4e"},
    815 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,7)), "fmovu", "o4e"},
    816 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,6)), "fmovg", "o4e"},
    817 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,5)), "fmovug", "o4e"},
    818 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,4)), "fmovk", "o4e"},
    819 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,3)), "fmovul", "o4e"},
    820 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,2)), "fmovlg", "o4e"},
    821 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,1)), "fmovne", "o4e"},
    822 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,9)), "fmove", "o4e"},
    823 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,10)), "fmovue", "o4e"},
    824 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,11)), "fmovge", "o4e"},
    825 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,12)), "fmovuge", "o4e"},
    826 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,13)), "fmovle", "o4e"},
    827 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,14)), "fmovule", "o4e"},
    828 	{(FORMAT3(2, OP3_X(3,5), 0) | COND2(0,15)), "fmovo", "o4e"},
    829 
    830 	/* Move F-P Register on Integer Register Condition "FMOVr" */
    831 	/* FIXME: check for short, double, and quad's */
    832 	{(FORMAT3(2, OP3_X(3,5), 0) | RCOND34(1)), "fmovre", "14e"},
    833 	{(FORMAT3(2, OP3_X(3,5), 0) | RCOND34(2)), "fmovrlez", "14e"},
    834 	{(FORMAT3(2, OP3_X(3,5), 0) | RCOND34(3)), "fmovrlz", "14e"},
    835 	{(FORMAT3(2, OP3_X(3,5), 0) | RCOND34(5)), "fmovrne", "14e"},
    836 	{(FORMAT3(2, OP3_X(3,5), 0) | RCOND34(6)), "fmovrgz", "14e"},
    837 	{(FORMAT3(2, OP3_X(3,5), 0) | RCOND34(7)), "fmovrgez", "14e"},
    838 #endif
    839 	/* FP logical insns -- UltraSPARC extens */
    840 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,0))), "fzero", "e"},
    841 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,1))), "fzeros", "e"},
    842 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,14))), "fone", "e"},
    843 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,15))), "fones", "e"},
    844 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,4))), "fsrc1", "3e"},
    845 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,5))), "fsrc1s", "3e"},
    846 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,8))), "fsrc2", "4e"},
    847 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,9))), "fsrc2s", "4e"},
    848 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,10))), "fnot1", "3e"},
    849 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,11))), "fnot1s", "3e"},
    850 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,6))), "fnot2", "4e"},
    851 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,7))), "fnot2s", "4e"},
    852 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,12))), "for", "34e"},
    853 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,13))), "fors", "34e"},
    854 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,2))), "fnor", "34e"},
    855 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,3))), "fnors", "34e"},
    856 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,0))), "fand", "34e"},
    857 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,1))), "fands", "34e"},
    858 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,14))), "fnand", "34e"},
    859 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,15))), "fnands", "34e"},
    860 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,12))), "fxor", "34e"},
    861 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,13))), "fxors", "34e"},
    862 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,2))), "fxnor", "34e"},
    863 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,3))), "fxnors", "34e"},
    864 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,10))), "fornot1", "34e"},
    865 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,11))), "fornot1s", "34e"},
    866 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,6))), "fornot2", "34e"},
    867 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(7,7))), "fornot2s", "34e"},
    868 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,8))), "fandnot1", "34e"},
    869 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,9))), "fandnot1s", "34e"},
    870 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,4))), "fandnot2", "34e"},
    871 	{(FORMAT3F(2, OP3_X(3,6), OPF_X(6,5))), "fandnot2s", "34e"},
    872 
    873 	/* grrrr.... */
    874 	{0, 0, 0}
    875 
    876 };
    877 
    878 db_addr_t
    879 db_disasm(db_addr_t loc, bool altfmt)
    880 {
    881 	struct sparc_insn*	i_ptr = (struct sparc_insn *)&sparc_i;
    882 
    883 	unsigned int insn, you_lose, bitmask;
    884 	int matchp;
    885 	const char* f_ptr, *cp;
    886 
    887 	you_lose = 0;
    888 	matchp = 0;
    889 	insn = db_get_value(loc, 4, 0);
    890 
    891 	if (insn == 0x01000000) {
    892 		db_printf("nop\n");
    893 		return loc + 4;
    894 	}
    895 
    896 	while (i_ptr->name) {
    897 		/* calculate YOU_LOSE value */
    898 		bitmask= (i_ptr->match);
    899 		you_lose = (~bitmask);
    900 
    901 		if (((bitmask>>30) & 0x3) == 0x1) {
    902 			/* Call */
    903 			you_lose = ((~0x1U)<<30);
    904 		} else if (((bitmask>>30) & 0x3) == 0x0) {
    905 			if (((bitmask>>22) & 0x7) == 0x4) {
    906 				/* Sethi */
    907 				you_lose &= (FORMAT2(0x3,0x7));
    908 			} else {
    909 				/* Branches */
    910 				you_lose &= (FORMAT2(0x3,0x7)|COND(0xf));
    911 			}
    912 		} else if (((bitmask>>30) & 0x3) == 0x2 &&
    913 			   ((bitmask>>19) & 0x3f) == 0x34) /* XXX */ {
    914 			/* FPop1 */
    915 			you_lose &= (FORMAT3(0x3,0x3f,0x1) | OPF(0x1ff));
    916 		} else if (((bitmask>>30) & 0x3) == 0x2 &&
    917 			   ((bitmask>>19) & 0x3f) == 0x3a) /* XXX */ {
    918 			/* Tcc */
    919 			you_lose &= (FORMAT3(0x3,0x3f,0x1) | COND(0xf));
    920 		} else if (((bitmask>>30) & 0x3) == 0x2 &&
    921 			   ((bitmask>>21) & 0xf) == 0x9 &&
    922 			   ((bitmask>>19) & 0x3) != 0) /* XXX */ {
    923 			/* shifts */
    924 			you_lose &= (FORMAT3(0x3,0x3f,0x1))|X(1);
    925 		} else if (((bitmask>>30) & 0x3) == 0x2 &&
    926 			   ((bitmask>>19) & 0x3f) == 0x2c) /* XXX */ {
    927 			/* cmov */
    928 			you_lose &= (FORMAT3(0x3,0x3f,0x1) | COND2(1,0xf));
    929 		} else if (((bitmask>>30) & 0x3) == 0x2 &&
    930 			   ((bitmask>>19) & 0x3f) == 0x35) /* XXX */ {
    931 			/* fmov */
    932 			you_lose &= (FORMAT3(0x3,0x3f,0x1) | COND2(1,0xf));
    933 		} else {
    934 			you_lose &= (FORMAT3(0x3,0x3f,0x1));
    935 		}
    936 
    937 		if (((bitmask & insn) == bitmask) && ((you_lose & insn) == 0)) {
    938 			matchp = 1;
    939 			break;
    940 		}
    941 		i_ptr++;
    942 	};
    943 
    944 	if (!matchp) {
    945 		db_printf("undefined\n");
    946 		return loc + 4;
    947 	}
    948 
    949 	db_printf("%s", i_ptr->name);
    950 
    951 	f_ptr = i_ptr->format;
    952 
    953 	for (cp = f_ptr; *cp; cp++) {
    954 		if (*cp == ',') {
    955 			for (;f_ptr < cp; f_ptr++)
    956 				switch (*f_ptr) {
    957 				case 'a':
    958 					if (insn & A(1))
    959 						db_printf(",a");
    960 					break;
    961 				case 'p':
    962 					if (insn & P(1))
    963 						db_printf(",pt");
    964 					else
    965 						db_printf(",pn");
    966 					break;
    967 				}
    968 			f_ptr++;
    969 			break;
    970 		}
    971 	}
    972 	db_printf("      \t");
    973 
    974 	while (*f_ptr) {
    975 		switch (*f_ptr) {
    976 			int64_t val;
    977 		case '1':
    978 			db_printf("%%%s", regs[((insn >> 14) & 0x1f)]);
    979 			break;
    980 		case '2':
    981 			db_printf("%%%s", regs[(insn & 0x1f)]);
    982 			break;
    983 		case 'd':
    984 			db_printf("%%%s", regs[((insn >> 25) & 0x1f)]);
    985 			break;
    986 		case '3':
    987 			db_printf("%%f%d", ((insn >> 14) & 0x1f));
    988 			break;
    989 		case '4':
    990 			db_printf("%%f%d", (insn & 0x1f));
    991 			break;
    992 		case 'e':
    993 			db_printf("%%f%d", ((insn >> 25) & 0x1f));
    994 			break;
    995 		case 'i':
    996 			/* simm13 -- signed */
    997 			val = SIGNEX(insn, 13);
    998 			db_printf("%s0x%x", SIGN(val), abs((int)val));
    999 			break;
   1000 		case 'j':
   1001 			/* simm11 -- signed */
   1002 			val = SIGNEX(insn, 11);
   1003 			db_printf("%s0x%x", SIGN(val), abs((int)val));
   1004 			break;
   1005 		case 'l':
   1006 			val = (((insn>>20)&0x3)<<13)|(insn & 0x1fff);
   1007 			val = SIGNEX(val, 16);
   1008 			db_printsym((db_addr_t)(loc + (4 * val)),
   1009 			    DB_STGY_ANY, db_printf);
   1010 			break;
   1011 		case 'm':
   1012 			db_printsym((db_addr_t)(loc + (4 * SIGNEX(insn, 22))),
   1013 				DB_STGY_ANY, db_printf);
   1014 			break;
   1015 		case 'u':
   1016 			db_printsym((db_addr_t)(loc + (4 * SIGNEX(insn, 19))),
   1017 			    DB_STGY_ANY, db_printf);
   1018 			break;
   1019 		case 'n':
   1020 			db_printsym((db_addr_t)(loc + (4 * SIGNEX(insn, 30))),
   1021 			    DB_STGY_PROC, db_printf);
   1022 			break;
   1023 		case 's':
   1024 			db_printf("%%asi");
   1025 			break;
   1026 		case 't':
   1027 			db_printf("0x%-2.2x", ((insn >> 5) & 0xff));
   1028 			break;
   1029 		case 'o':
   1030 			db_printf("%%fcc%d", ((insn >> 25) & 0x3));
   1031 			break;
   1032 		case 'p':
   1033 		case '7':
   1034 			db_printf("[%%%s + %%%s]",
   1035 				  regs[((insn >> 14) & 0x1f)],
   1036 				  regs[(insn & 0x1f)]);
   1037 			if (*f_ptr == '7')
   1038 				db_printf(" %d", ((insn >> 5) & 0xff));
   1039 			break;
   1040 		case 'q':
   1041 		case '8':
   1042 			val = SIGNEX(insn, 13);
   1043 			db_printf("[%%%s %c 0x%x]",
   1044 				regs[((insn >> 14) & 0x1f)],
   1045 				(int)((val<0)?'-':'+'),
   1046 				abs((int)val));
   1047 			if (*f_ptr == '8')
   1048 				db_printf(" %%asi");
   1049 			break;
   1050 		case '5':
   1051 			db_printf("%%fsr");
   1052 			break;
   1053 		case '6':
   1054 			db_printf("%%fsr");
   1055 			break;
   1056 		case '9':
   1057 			db_printf("0x%xl",
   1058 				  ((insn & 0xf) | ((insn >> 4) & 0x7)));
   1059 			break;
   1060 		case '0':
   1061 			db_printf("%%%s", ccodes[((insn >> 11) & 0x3) + 4]);
   1062 			break;
   1063 		case '.':
   1064 			db_printf("%%%s", ccodes[((insn >> 11) & 0x7)]);
   1065 			break;
   1066 		case 'r':
   1067 			db_printf("#%s", prefetch[((insn >> 25) & 0x1f)]);
   1068 			break;
   1069 		case 'A':
   1070 			db_printf("%%%s", priv_regs[((insn >> 14) & 0x1f)]);
   1071 			break;
   1072 		case 'B':
   1073 			db_printf("%%%s", state_regs[((insn >> 14) & 0x1f)]);
   1074 			break;
   1075 		case 'C':
   1076 			db_printf("%%hi(0x%x)", ((insn & 0x3fffff) << 10));
   1077 			break;
   1078 		case 'D':
   1079 			db_printf("0x%x", (insn & 0x1f));
   1080 			break;
   1081 		case 'E':
   1082 			db_printf("%d", (insn & 0x3f));
   1083 			break;
   1084 		case 'F':
   1085 			db_printf("%d", (insn & 0x3f));
   1086 			break;
   1087 		case 'G':
   1088 			db_printf("%%%s", priv_regs[((insn >> 25) & 0x1f)]);
   1089 			break;
   1090 		case 'H':
   1091 			db_printf("%%%s", state_regs[((insn >> 25) & 0x1f)]);
   1092 			break;
   1093 #ifndef V9
   1094 		case 'P':
   1095 			db_printf("%%psr");
   1096 			break;
   1097 		case 'T':
   1098 			db_printf("%%tbr");
   1099 			break;
   1100 		case 'W':
   1101 			db_printf("%%wim");
   1102 			break;
   1103 		case 'Y':
   1104 			db_printf("%%y");
   1105 			break;
   1106 #endif
   1107 		default:
   1108 			db_printf("(UNKNOWN)");
   1109 			break;
   1110 		}
   1111 		if (*(++f_ptr))
   1112 			db_printf(", ");
   1113 	};
   1114 
   1115 	db_printf("\n");
   1116 
   1117 	return (loc + 4);
   1118 }
   1119