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