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