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