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