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