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