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