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