[BACK]Return to db_disasm.c CVS log [TXT][DIR] Up to [local] / sys / arch / sparc64 / sparc64

Annotation of sys/arch/sparc64/sparc64/db_disasm.c, Revision 1.1.1.1

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

CVSweb