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