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