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