Annotation of sys/arch/hppa64/hppa64/db_disasm.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: db_disasm.c,v 1.2 2006/02/06 17:19:31 jmc Exp $ */
! 2:
! 3: /* TODO parse 64bit insns or rewrite */
! 4:
! 5: /*
! 6: * Copyright (c) 2005 Michael Shalayeff
! 7: * All rights reserved.
! 8: *
! 9: * Permission to use, copy, modify, and distribute this software for any
! 10: * purpose with or without fee is hereby granted, provided that the above
! 11: * copyright notice and this permission notice appear in all copies.
! 12: *
! 13: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 14: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 15: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 16: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 17: * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
! 18: * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
! 19: * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 20: */
! 21: /*
! 22: * (c) Copyright 1992 HEWLETT-PACKARD COMPANY
! 23: *
! 24: * To anyone who acknowledges that this file is provided "AS IS"
! 25: * without any express or implied warranty:
! 26: * permission to use, copy, modify, and distribute this file
! 27: * for any purpose is hereby granted without fee, provided that
! 28: * the above copyright notice and this notice appears in all
! 29: * copies, and that the name of Hewlett-Packard Company not be
! 30: * used in advertising or publicity pertaining to distribution
! 31: * of the software without specific, written prior permission.
! 32: * Hewlett-Packard Company makes no representations about the
! 33: * suitability of this software for any purpose.
! 34: */
! 35:
! 36: /*
! 37: * unasm.c -- HP_PA Instruction Printer
! 38: */
! 39:
! 40: #include <sys/param.h>
! 41: #include <sys/systm.h>
! 42:
! 43: #include <machine/db_machdep.h>
! 44: #include <ddb/db_access.h>
! 45: #include <ddb/db_sym.h>
! 46: #include <ddb/db_output.h>
! 47: #include <ddb/db_interface.h>
! 48:
! 49:
! 50: /* IMPORTANT NOTE:
! 51: * All modules using this header may assume that the datatype "int" is a
! 52: * 32-bit (or > 32-bit) signed quantity.
! 53: */
! 54:
! 55:
! 56: /* Spectrum Architecturally Defined Datatypes */
! 57: struct doubleword {
! 58: int wd0;
! 59: int wd1;
! 60: };
! 61:
! 62: struct quadword {
! 63: struct doubleword d0;
! 64: struct doubleword d1;
! 65: };
! 66:
! 67: /* datatypes for halfword and byte fields of a word are defined
! 68: * in ssBits.h */
! 69:
! 70: /* Memory addressing datatypes */
! 71: typedef unsigned int SID, /* range [0..MAXSID] */
! 72: PGID, /* range [0..MAXPGID] */
! 73: OFS, /* range [0..MAXINT] */
! 74: REALADR; /* range [0..MAXINT] */
! 75:
! 76:
! 77: /* data sizes */
! 78: enum datasize { Byte, Halfword, Word, Doubleword, Quadword, Variable };
! 79:
! 80: /* Miscellaneous datatypes */
! 81: typedef unsigned int FLAGS;
! 82:
! 83: /* struct for entry in unwind table */
! 84: struct ute {
! 85: int word1;
! 86: int word2;
! 87: int word3;
! 88: int word4;
! 89: };
! 90: /*
! 91: * Header: /n/schirf/u/baford/CVS/mach4-parisc/kernel_unused/parisc/kdb/unasm.c,v 1.5 1994/07/21 22:32:05 mike Exp
! 92: *
! 93: * Spectrum Instruction Set Condition Completer Bit Assignments
! 94: * Dan Magenheimer - 6/14/82
! 95: * Terrence Miller - 6/21/82
! 96: * Computer Research Center, Hewlett-Packard Labs
! 97: *
! 98: * (c) copyright 1982
! 99: * (p) protected 1982
! 100: * The Hewlett-Packard Company
! 101: * Hewlett-Packard Laboratories
! 102: * Computer Research Center
! 103: * Palo Alto, California
! 104: *
! 105: * *** HP Company Confidential ***
! 106: *
! 107: * Log: unasm.c,v
! 108: * Revision 1.5 1994/07/21 22:32:05 mike
! 109: * official HP copyright notice
! 110: *
! 111: * Revision 1.4 1992/07/08 12:19:52 dalton
! 112: * Checkin before split to 1.0.4 release (by LBS).
! 113: *
! 114: * Revision 1.3 92/06/06 16:16:45 dalton
! 115: * *** empty log message ***
! 116: *
! 117: * Revision 1.2 92/06/06 15:42:28 dalton
! 118: * Changed include to be a path relative to hp800.
! 119: *
! 120: * Revision 1.1 92/06/06 14:05:33 dalton
! 121: * Initial revision
! 122: *
! 123: * Revision 1.2 91/04/14 20:29:49 osfrcs
! 124: * Initial version.
! 125: * [91/03/30 09:20:34 brezak]
! 126: *
! 127: * Revision 1.1.2.2 91/04/02 10:42:50 brezak
! 128: * Initial version.
! 129: * [91/03/30 09:20:34 brezak]
! 130: *
! 131: * Revision 1.1.1.2 91/03/30 09:20:34 brezak
! 132: * Initial version.
! 133: *
! 134: * Revision 1.1 88/07/11 14:05:15 14:05:15 ren (Bob Naas)
! 135: * Initial revision
! 136: *
! 137: * Revision 5.2 87/07/02 14:45:57 14:45:57 kent (Kent McMullen)
! 138: * added constants to support addDasm and addDCond added to ssDID.c
! 139: *
! 140: * Revision 5.1 87/02/27 11:12:08 11:12:08 kent (Kent McMullen)
! 141: * update all src to 5.1
! 142: *
! 143: * Revision 5.0 87/02/18 16:31:15 16:31:15 kent (Kent McMullen)
! 144: * update all revision numbers to 5.0 for release
! 145: *
! 146: * Revision 1.1 86/07/15 08:34:55 08:34:55 kent (Kent McMullen)
! 147: * Initial revision
! 148: *
! 149: * Revision 4.1 83/10/25 17:01:22 17:01:22 djm (Daniel J Magenheimer)
! 150: * First release for ACD v4
! 151: *
! 152: * Revision 3.0 83/06/13 10:22:59 djm (Daniel Magenheimer)
! 153: * First release for distribution
! 154: *
! 155: *
! 156: */
! 157:
! 158:
! 159: /* Arithmetic/Logical Conditions */
! 160: #define NEV 0x0
! 161: #define EQZ 0x2
! 162: #define LT 0x4
! 163: #define LE 0x6
! 164: #define LLT 0x8
! 165: #define NUV 0x8
! 166: #define LLE 0xA
! 167: #define ZNV 0xA
! 168: #define SV 0xC
! 169: #define OD 0xE
! 170: #define TR 0x1
! 171: #define NEQZ 0x3
! 172: #define GE 0x5
! 173: #define GT 0x7
! 174: #define LGE 0x9
! 175: #define UV 0x9
! 176: #define LGT 0xB
! 177: #define VNZ 0xB
! 178: #define NSV 0xD
! 179: #define EV 0xF
! 180:
! 181: /* unit conditions */
! 182: #define SBZ 0x4
! 183: #define SHZ 0x6
! 184: #define SDC 0x8
! 185: #define SBC 0xC
! 186: #define SHC 0xE
! 187: #define NBZ 0x5
! 188: #define NHZ 0x7
! 189: #define NDC 0x9
! 190: #define NBC 0xD
! 191: #define NHC 0xF
! 192:
! 193: /*field conditions */
! 194: #define XEQ 0x1
! 195: #define XLT 0x2
! 196: #define XOD 0x3
! 197: #define XTR 0x4
! 198: #define XNE 0x5
! 199: #define XGE 0x6
! 200: #define XEV 0x7
! 201:
! 202:
! 203:
! 204: /*
! 205: * These macros are designed to be portable to all machines that have
! 206: * a wordsize greater than or equal to 32 bits that support the portable
! 207: * C compiler and the standard C preprocessor. Wordsize (default 32)
! 208: * and bitfield assignment (default left-to-right, unlike VAX, PDP-11)
! 209: * should be predefined using the constants HOSTWDSZ and BITFRL and
! 210: * the C compiler "-D" flag (e.g., -DHOSTWDSZ=36 -DBITFLR for the DEC-20).
! 211: * Note that the macro arguments assume that the integer being referenced
! 212: * is a 32-bit integer (right-justified on the 20) and that bit 0 is the
! 213: * most significant bit.
! 214: */
! 215:
! 216: #ifndef HOSTWDSZ
! 217: #define HOSTWDSZ 32
! 218: #endif
! 219:
! 220: #ifdef vax
! 221: #ifndef BITFLR
! 222: #define BITFRL
! 223: #endif
! 224: #else
! 225: #define BITFLR
! 226: #endif
! 227:
! 228: /*########################### Macros ######################################*/
! 229:
! 230: /*---------------------------------------------------------------------------
! 231: * DeclareBitfield$Reference - Declare a structure to be used to reference
! 232: * a specified bitfield within an integer (using BitfR, see below).
! 233: * The argument "n" must be an identifier name not used elsewhere in the
! 234: * program , "s" and "l" must (alas!) be constants. (Suggestion: if
! 235: * "s" == 2 and "l" == 8, use _b28 for "n".) The name "BITFLR" should
! 236: * be pre-defined if the compiler assigns bitfields from left-to-right.
! 237: * The resultant macro expansion defines a structure in which the bit field
! 238: * starting at position "s" with length "l" may be referenced by accessing
! 239: * member "n". [Note: The leftmost bits in a 36-bit word may be accessed
! 240: * by specifying -4 <= s < 0 on the DEC-20.]
! 241: *---------------------------------------------------------------------------*/
! 242:
! 243: #ifdef BITFRL
! 244: #define DeclBitfR(s,l,n) struct n { int:(HOSTWDSZ-(s)-(l)); unsigned n:l;};
! 245: #else
! 246: #define DeclBitfR(s,l,n) struct n { int:((s)+(HOSTWDSZ-32)); unsigned n:l;};
! 247: #endif
! 248:
! 249: /*---------------------------------------------------------------------------
! 250: * Bitfield$Reference - Reference a specified bitfield within an integer.
! 251: * The argument "i" must be an addressable variable (i.e., not a register
! 252: * variable or an expression... but see BitfX below), "n" must be an
! 253: * identifier name declared in a DeclBitfR invocation. The resultant
! 254: * macro expansion references the bit field in "i" described by the
! 255: * DeclBitfR invocation with the same name ("n"). BitfR may be used as
! 256: * an lvalue or an rvalue. (i.e., either side of an assignment statement)
! 257: * The "s" and "l" arguments are historical and are now unused. (They
! 258: * correspond to the "s" and "l" arguments in DeclBitfR)
! 259: * Translates to a single instruction on both the VAX and the DEC-20.
! 260: *---------------------------------------------------------------------------*/
! 261: #define BitfR(i,s,l,n) (((struct n *)&i)->n)
! 262:
! 263: /*---------------------------------------------------------------------------
! 264: * Bitfield$eXtract - Extract the specified field from an integer. Arguments
! 265: * are the same as for BitfR (except no "n"), however both "s" and "l" need
! 266: * no longer be constants. May only be used as an rvalue. Translates to
! 267: * two instructions on the VAX, three on the DEC-20.
! 268: *---------------------------------------------------------------------------*/
! 269:
! 270: #define BitfX(i,s,l) (((i) >> (32-(s)-(l))) & ((1 << (l)) - 1))
! 271:
! 272:
! 273: /*---------------------------------------------------------------------------
! 274: * Mask$32bits - Mask the low order 32 bits of passed word. No-op on 32
! 275: * bit machines.
! 276: *---------------------------------------------------------------------------*/
! 277:
! 278: #if HOSTWDSZ > 32
! 279: #define Mask32(x) ((x) & 0xffffffff)
! 280: #else
! 281: #define Mask32(x) (x)
! 282: #endif
! 283:
! 284:
! 285: /*---------------------------------------------------------------------------
! 286: * SignExtend$32bits - Force the high-order bits in machines with wordsize
! 287: * longer than 32 to match bit 0.
! 288: *---------------------------------------------------------------------------*/
! 289:
! 290: #if HOSTWDSZ > 32
! 291: #define SignEx32(x) (((x) & 0x80000000) ? ((x) | ((unsigned)-1 << 32)) \
! 292: : Mask32(x))
! 293: #else
! 294: #define SignEx32(x) (x)
! 295: #endif
! 296:
! 297: /**************************/
! 298: /* bit field declarations */
! 299: /**************************/
! 300:
! 301: /* since the compiler complains if a structure name is declared twice, even
! 302: * if the declarations are identical, all DeclBitfR invocations are
! 303: * given here in one file. */
! 304:
! 305: DeclBitfR(0,1,_b01)
! 306: DeclBitfR(0,15,_b015)
! 307: DeclBitfR(0,16,_b016)
! 308: DeclBitfR(0,4,_b04)
! 309: DeclBitfR(0,6,_b06)
! 310: DeclBitfR(0,8,_b08)
! 311: DeclBitfR(4,1,_b41)
! 312: DeclBitfR(4,4,_b44)
! 313: DeclBitfR(6,1,_b61)
! 314: DeclBitfR(6,13,_b613)
! 315: DeclBitfR(6,15,_b615)
! 316: DeclBitfR(6,17,_b617)
! 317: DeclBitfR(6,26,_b626)
! 318: DeclBitfR(6,5,_b65)
! 319: DeclBitfR(7,1,_b71)
! 320: DeclBitfR(8,1,_b81)
! 321: DeclBitfR(8,4,_b84)
! 322: DeclBitfR(8,8,_b88)
! 323: DeclBitfR(9,1,_b91)
! 324: DeclBitfR(10,1,_b101)
! 325: DeclBitfR(11,1,_b111)
! 326: DeclBitfR(11,10,_b1110)
! 327: DeclBitfR(11,4,_b114)
! 328: DeclBitfR(11,5,_b115)
! 329: DeclBitfR(12,1,_b121)
! 330: DeclBitfR(12,4,_b124)
! 331: DeclBitfR(13,1,_b131)
! 332: DeclBitfR(14,1,_b141)
! 333: DeclBitfR(15,1,_b151)
! 334: DeclBitfR(16,1,_b161)
! 335: DeclBitfR(16,15,_b1615)
! 336: DeclBitfR(16,16,_b1616)
! 337: DeclBitfR(16,2,_b162)
! 338: DeclBitfR(16,3,_b163)
! 339: DeclBitfR(16,4,_b164)
! 340: DeclBitfR(16,5,_b165)
! 341: DeclBitfR(16,8,_b168)
! 342: DeclBitfR(17,1,_b171)
! 343: DeclBitfR(18,1,_b181)
! 344: DeclBitfR(18,13,_b1813)
! 345: DeclBitfR(18,2,_b182)
! 346: DeclBitfR(18,7,_b187)
! 347: DeclBitfR(19,1,_b191)
! 348: DeclBitfR(19,8,_b198)
! 349: DeclBitfR(19,10,_b1910)
! 350: DeclBitfR(20,11,_b2011)
! 351: DeclBitfR(20,2,_b202)
! 352: DeclBitfR(20,4,_b204)
! 353: DeclBitfR(21,10,_b2110)
! 354: DeclBitfR(21,2,_b212)
! 355: DeclBitfR(21,5,_b215)
! 356: DeclBitfR(22,5,_b225)
! 357: DeclBitfR(23,3,_b233)
! 358: DeclBitfR(24,1,_b241)
! 359: DeclBitfR(24,4,_b244)
! 360: DeclBitfR(24,8,_b248)
! 361: DeclBitfR(25,1,_b251)
! 362: DeclBitfR(26,1,_b261)
! 363: DeclBitfR(27,1,_b271)
! 364: DeclBitfR(27,4,_b274)
! 365: DeclBitfR(27,5,_b275)
! 366: DeclBitfR(28,1,_b281)
! 367: DeclBitfR(28,4,_b284)
! 368: DeclBitfR(29,1,_b291)
! 369: DeclBitfR(30,1,_b301)
! 370: DeclBitfR(30,2,_b302)
! 371: DeclBitfR(31,1,_b311)
! 372:
! 373: /******************/
! 374: /* Word subfields */
! 375: /******************/
! 376:
! 377: #define Sign(i) BitfR(i,0,1,_b01)
! 378: /* halfwords */
! 379: #define Hwd0(i) BitfR(i,0,16,_b016)
! 380: #define Hwd1sign(i) BitfR(i,16,1,_b161)
! 381: #define Hwd1(i) BitfR(i,16,16,_b1616)
! 382: /* bytes */
! 383: #define Byte0(i) BitfR(i,0,8,_b08)
! 384: #define Byte1sign(i) BitfR(i,8,1,_b81)
! 385: #define Byte1(i) BitfR(i,8,8,_b88)
! 386: #define Byte2(i) BitfR(i,16,8,_b168)
! 387: #define Byte3sign(i) BitfR(i,24,1,_b241)
! 388: #define Byte3(i) BitfR(i,24,8,_b248)
! 389: /* digits */
! 390: #define Digit0(i) BitfR(i,0,4,_b04)
! 391: #define Digit1(i) BitfR(i,4,4,_b44)
! 392: #define Digit2(i) BitfR(i,8,4,_b84)
! 393: #define Digit3(i) BitfR(i,12,4,_b124)
! 394: #define Digit4(i) BitfR(i,16,4,_b164)
! 395: #define Digit5(i) BitfR(i,20,4,_b204)
! 396: #define Digit6(i) BitfR(i,24,4,_b244)
! 397: #define Digit7(i) BitfR(i,28,4,_b284)
! 398:
! 399: /* Wordsize definitions */
! 400:
! 401: #define BIT_P_DW 64 /* bits/doubleword */
! 402: #define BIT_P_WD 32 /* bits/word */
! 403: #define BIT_P_HW 16 /* bits/halfword */
! 404: #define BIT_P_BYT 8 /* bits/byte */
! 405: #define BYT_P_DW 8 /* bytes/doubleword */
! 406: #define BYT_P_WD 4 /* bytes/word */
! 407: #define BYT_P_HW 2 /* bytes/halfword */
! 408:
! 409: /* Masks */
! 410:
! 411: #define WDMASK 0xffffffff /* 32-bit mask */
! 412: #define OFSMASK 0xffffffff /* 32-bit mask */
! 413: #define SIDMASK 0xffffffff /* 32-bit mask */
! 414: #define SIGNMASK 0x80000000 /* 32 bit word sign bit */
! 415:
! 416: /* Alignments */
! 417:
! 418: #define wdalign(ofs) (ofs &= ~3)
! 419: /*
! 420: * Header: /n/schirf/u/baford/CVS/mach4-parisc/kernel_unused/parisc/kdb/unasm.c,v 1.5 1994/07/21 22:32:05 mike Exp
! 421: *
! 422: * Spectrum Simulator Instruction Opcode Definitions
! 423: * Dan Magenheimer
! 424: * Computer Research Center, Hewlett-Packard Labs
! 425: *
! 426: * (c) copyright 1982
! 427: * (p) protected 1982
! 428: * The Hewlett-Packard Company
! 429: * Hewlett-Packard Laboratories
! 430: * Computer Research Center
! 431: * Palo Alto, California
! 432: *
! 433: * *** HP Company Confidential ***
! 434: *
! 435: * Log: unasm.c,v
! 436: * Revision 1.5 1994/07/21 22:32:05 mike
! 437: * official HP copyright notice
! 438: *
! 439: * Revision 1.4 1992/07/08 12:19:52 dalton
! 440: * Checkin before split to 1.0.4 release (by LBS).
! 441: *
! 442: * Revision 1.3 92/06/06 16:16:45 dalton
! 443: * *** empty log message ***
! 444: *
! 445: * Revision 1.2 92/06/06 15:42:28 dalton
! 446: * Changed include to be a path relative to hp800.
! 447: *
! 448: * Revision 1.1 92/06/06 14:05:33 dalton
! 449: * Initial revision
! 450: *
! 451: * Revision 1.2 91/04/14 20:29:49 osfrcs
! 452: * Initial version.
! 453: * [91/03/30 09:20:34 brezak]
! 454: *
! 455: * Revision 1.1.2.2 91/04/02 10:42:50 brezak
! 456: * Initial version.
! 457: * [91/03/30 09:20:34 brezak]
! 458: *
! 459: * Revision 1.1.1.2 91/03/30 09:20:34 brezak
! 460: * Initial version.
! 461: *
! 462: * Revision 6.1 89/09/06 10:39:58 burroughs
! 463: * Added shadow registers for gr0-gr7.
! 464: * gr0-7 are copied into sh0-7 whenever a trap occurs
! 465: * the instruction RFIR restores gr0-7 from sh0-7 and returns from
! 466: * interrupt.
! 467: * the "sh" command displays the shadow registers
! 468: * = sh7 0x789 works, too.
! 469: *
! 470: * Revision 6.0 89/09/01 15:46:37 15:46:37 burroughs (Greg Burroughs)
! 471: * baseline for pcx simple offsite
! 472: *
! 473: * Revision 5.2 87/09/02 14:30:23 14:30:23 kent
! 474: * separated stat gathering for indexed vs short.
! 475: * this will NOT work if cache hints ever get used
! 476: * since this field was assumed always zero
! 477: *
! 478: * Revision 5.1 87/02/27 11:12:16 11:12:16 kent (Kent McMullen)
! 479: * update all src to 5.1
! 480: *
! 481: * Revision 5.0 87/02/18 16:31:35 16:31:35 kent (Kent McMullen)
! 482: * update all revision numbers to 5.0 for release
! 483: *
! 484: * Revision 1.1 86/07/15 08:34:57 08:34:57 kent (Kent McMullen)
! 485: * Initial revision
! 486: *
! 487: * Revision 4.1 83/10/25 17:02:34 17:02:34 djm (Daniel J Magenheimer)
! 488: * First release for ACD v4
! 489: *
! 490: * Revision 3.0 83/06/13 10:24:45 djm (Daniel Magenheimer)
! 491: * First release for distribution
! 492: *
! 493: *
! 494: */
! 495:
! 496: /*
! 497: * Changes:
! 498: * 01/30/90 ejf Simplify SPOPn support, now only gives assist emulation trap.
! 499: * 01/19/90 ejf Replace linpak instructions with just FSTQ[SX].
! 500: * 12/19/89 ejf Add PA89 new floating point opcode 0E.
! 501: * 12/18/89 ejf Change 5 ops to PA89 format.
! 502: * 12/01/89 ejf Move additional instructions fmas, fmaa, fld2, fst2 to ssILst
! 503: * 09/22/89 ejf Fix unbalanced comments.
! 504: */
! 505:
! 506:
! 507: /* ..and modified by hand to remove the load/store short references */
! 508: /* ..and modified by hand to make memory management ops conform to the
! 509: * requirement that all subops of a major opcode begin in the same
! 510: * place and have the same length */
! 511:
! 512: #define LDW 0x12, 0x00, 0, 0 /* LOAD WORD */
! 513: #define LDWM 0x13, 0x00, 0, 0 /* LOAD WORD and MODIFY */
! 514: #define LDH 0x11, 0x00, 0, 0 /* LOAD HALFWORD */
! 515: #define LDB 0x10, 0x00, 0, 0 /* LOAD BYTE */
! 516: #define LDO 0x0d, 0x00, 0, 0 /* LOAD OFFSET */
! 517: #define STW 0x1a, 0x00, 0, 0 /* STORE WORD */
! 518: #define STWM 0x1b, 0x00, 0, 0 /* STORE WORD and MODIFY */
! 519: #define STH 0x19, 0x00, 0, 0 /* STORE HALFWORD */
! 520: #define STB 0x18, 0x00, 0, 0 /* STORE BYTE */
! 521: #define LDWX 0x03, 0x02, 19, 7 /* LOAD WORD INDEXED */
! 522: #define LDHX 0x03, 0x01, 19, 7 /* LOAD HALFWORD INDEXED */
! 523: #define LDBX 0x03, 0x00, 19, 7 /* LOAD BYTE INDEXED */
! 524: #define LDWAX 0x03, 0x06, 19, 7 /* LOAD WORD ABSOLUTE INDEXED */
! 525: #define LDCWX 0x03, 0x07, 19, 7 /* LOAD and CLEAR WORD INDEXED */
! 526: #define LDWS 0x03, 0x42, 19, 7 /* LOAD WORD SHORT DISP */
! 527: #define LDHS 0x03, 0x41, 19, 7 /* LOAD HALFWORD SHORT DISP */
! 528: #define LDBS 0x03, 0x40, 19, 7 /* LOAD BYTE SHORT DISP */
! 529: #define LDWAS 0x03, 0x46, 19, 7 /* LOAD WORD ABSOLUTE SHORT DISP */
! 530: #define LDCWS 0x03, 0x47, 19, 7 /* LOAD and CLEAR WORD SHORT DISP */
! 531: #define STWS 0x03, 0x4a, 19, 7 /* STORE WORD SHORT DISP */
! 532: #define STHS 0x03, 0x49, 19, 7 /* STORE HALFWORD SHORT DISP */
! 533: #define STBS 0x03, 0x48, 19, 7 /* STORE BYTE SHORT DISP */
! 534: #define STWAS 0x03, 0x4e, 19, 7 /* STORE WORD ABSOLUTE SHORT DISP */
! 535: #define STBYS 0x03, 0x4c, 19, 7 /* STORE BYTES SHORT DISP */
! 536: #define LDIL 0x08, 0x00, 0, 0 /* LOAD IMMED LEFT */
! 537: #define ADDIL 0x0a, 0x00, 0, 0 /* ADD IMMED LEFT */
! 538: #define BL 0x3a, 0x00, 16, 3 /* BRANCH [and LINK] */
! 539: #define GATE 0x3a, 0x01, 16, 3 /* GATEWAY */
! 540: #define BLR 0x3a, 0x02, 16, 3 /* BRANCH and LINK REGISTER */
! 541: #define BV 0x3a, 0x06, 16, 3 /* BRANCH VECTORED */
! 542: #define BE 0x38, 0x00, 0, 0 /* BRANCH EXTERNAL */
! 543: #define BLE 0x39, 0x00, 0, 0 /* BRANCH and LINK EXTERNAL */
! 544: #define MOVB 0x32, 0x00, 0, 0 /* MOVE and BRANCH */
! 545: #define MOVIB 0x33, 0x00, 0, 0 /* MOVE IMMED and BRANCH */
! 546: #define COMBT 0x20, 0x00, 0, 0 /* COMPARE and BRANCH if TRUE */
! 547: #define COMBF 0x22, 0x00, 0, 0 /* COMPARE and BRANCH if FALSE */
! 548: #define COMIBT 0x21, 0x00, 0, 0 /* COMPARE IMMED and BRANCH if TRUE */
! 549: #define COMIBF 0x23, 0x00, 0, 0 /* COMPARE IMMED and BRANCH if FALSE */
! 550: #define ADDBT 0x28, 0x00, 0, 0 /* ADD and BRANCH if TRUE */
! 551: #define ADDBF 0x2a, 0x00, 0, 0 /* ADD and BRANCH if FALSE */
! 552: #define ADDIBT 0x29, 0x00, 0, 0 /* ADD IMMED and BRANCH if TRUE */
! 553: #define ADDIBF 0x2b, 0x00, 0, 0 /* ADD IMMED and BRANCH if FALSE */
! 554: #define BVB 0x30, 0x00, 0, 0 /* BRANCH on VARIABLE BIT */
! 555: #define BB 0x31, 0x00, 0, 0 /* BRANCH on BIT */
! 556: #define ADD 0x02, 0x30, 20, 7 /* ADD */
! 557: #define ADDL 0x02, 0x50, 20, 7 /* ADD LOGICAL */
! 558: #define ADDO 0x02, 0x70, 20, 7 /* ADD and TRAP on OVFLO */
! 559: #define SH1ADD 0x02, 0x32, 20, 7 /* SHIFT 1, ADD */
! 560: #define SH1ADDL 0x02, 0x52, 20, 7 /* SHIFT 1, ADD LOGICAL */
! 561: #define SH1ADDO 0x02, 0x72, 20, 7 /* SHIFT 1, ADD and TRAP on OVFLO */
! 562: #define SH2ADD 0x02, 0x34, 20, 7 /* SHIFT 2, ADD */
! 563: #define SH2ADDL 0x02, 0x54, 20, 7 /* SHIFT 2, ADD LOGICAL */
! 564: #define SH2ADDO 0x02, 0x74, 20, 7 /* SHIFT 2, ADD and TRAP on OVFLO */
! 565: #define SH3ADD 0x02, 0x36, 20, 7 /* SHIFT 3, ADD */
! 566: #define SH3ADDL 0x02, 0x56, 20, 7 /* SHIFT 3, ADD LOGICAL */
! 567: #define SH3ADDO 0x02, 0x76, 20, 7 /* SHIFT 3, ADD and TRAP on OVFLO */
! 568: #define ADDC 0x02, 0x38, 20, 7 /* ADD with CARRY */
! 569: #define ADDCO 0x02, 0x78, 20, 7 /* ADD with CARRY and TRAP on OVFLO */
! 570: #define SUB 0x02, 0x20, 20, 7 /* SUBTRACT */
! 571: #define SUBO 0x02, 0x60, 20, 7 /* SUBTRACT and TRAP on OVFLO */
! 572: #define SUBB 0x02, 0x28, 20, 7 /* SUBTRACT with BORROW */
! 573: #define SUBBO 0x02, 0x68, 20, 7 /* SUBTRACT with BORROW and TRAP on OVFLO */
! 574: #define SUBT 0x02, 0x26, 20, 7 /* SUBTRACT and TRAP on COND */
! 575: #define SUBTO 0x02, 0x66, 20, 7 /* SUBTRACT and TRAP on COND or OVFLO */
! 576: #define DS 0x02, 0x22, 20, 7 /* DIVIDE STEP */
! 577: #define COMCLR 0x02, 0x44, 20, 7 /* COMPARE and CLEAR */
! 578: #define OR 0x02, 0x12, 20, 7 /* INCLUSIVE OR */
! 579: #define XOR 0x02, 0x14, 20, 7 /* EXCLUSIVE OR */
! 580: #define AND 0x02, 0x10, 20, 7 /* AND */
! 581: #define ANDCM 0x02, 0x00, 20, 7 /* AND COMPLEMENT */
! 582: #define UXOR 0x02, 0x1c, 20, 7 /* UNIT XOR */
! 583: #define UADDCM 0x02, 0x4c, 20, 7 /* UNIT ADD COMPLEMENT */
! 584: #define UADDCMT 0x02, 0x4e, 20, 7 /* UNIT ADD COMPLEMENT and TRAP on COND */
! 585: #define DCOR 0x02, 0x5c, 20, 7 /* DECIMAL CORRECT */
! 586: #define IDCOR 0x02, 0x5e, 20, 7 /* INTERMEDIATE DECIMAL CORRECT */
! 587: #define ADDI 0x2d, 0x00, 20, 1 /* ADD to IMMED */
! 588: #define ADDIO 0x2d, 0x01, 20, 1 /* ADD to IMMED and TRAP on OVFLO */
! 589: #define ADDIT 0x2c, 0x00, 20, 1 /* ADD to IMMED and TRAP on COND */
! 590: #define ADDITO 0x2c, 0x01, 20, 1 /* ADD to IMMED and TRAP on COND or OVFLO */
! 591: #define SUBI 0x25, 0x00, 20, 1 /* SUBTRACT from IMMED */
! 592: #define SUBIO 0x25, 0x01, 20, 1 /* SUBTRACT from IMMED and TRAP on OVFLO */
! 593: #define COMICLR 0x24, 0x00, 0, 0 /* COMPARE IMMED and CLEAR */
! 594: #define VSHD 0x34, 0x00, 19, 3 /* VARIABLE SHIFT DOUBLE */
! 595: #define SHD 0x34, 0x02, 19, 3 /* SHIFT DOUBLE */
! 596: #define VEXTRU 0x34, 0x04, 19, 3 /* VARIABLE EXTRACT RIGHT UNSIGNED */
! 597: #define VEXTRS 0x34, 0x05, 19, 3 /* VARIABLE EXTRACT RIGHT SIGNED */
! 598: #define EXTRU 0x34, 0x06, 19, 3 /* EXTRACT RIGHT UNSIGNED */
! 599: #define EXTRS 0x34, 0x07, 19, 3 /* EXTRACT RIGHT SIGNED */
! 600: #define VDEP 0x35, 0x01, 19, 3 /* VARIABLE DEPOSIT */
! 601: #define DEP 0x35, 0x03, 19, 3 /* DEPOSIT */
! 602: #define VDEPI 0x35, 0x05, 19, 3 /* VARIABLE DEPOSIT IMMED */
! 603: #define DEPI 0x35, 0x07, 19, 3 /* DEPOSIT IMMED */
! 604: #define ZVDEP 0x35, 0x00, 19, 3 /* ZERO and VARIABLE DEPOSIT */
! 605: #define ZDEP 0x35, 0x02, 19, 3 /* ZERO and DEPOSIT */
! 606: #define ZVDEPI 0x35, 0x04, 19, 3 /* ZERO and VARIABLE DEPOSIT IMMED */
! 607: #define ZDEPI 0x35, 0x06, 19, 3 /* ZERO and DEPOSIT IMMED */
! 608: #define BREAK 0x00, 0x00, 19, 8 /* BREAK */
! 609: #define RFI 0x00, 0x60, 19, 8 /* RETURN FROM INTERRUPTION */
! 610: #define RFIR 0x00, 0x65, 19, 8 /* RFI & RESTORE SHADOW REGISTERS */
! 611: #define SSM 0x00, 0x6b, 19, 8 /* SET SYSTEM MASK */
! 612: #define RSM 0x00, 0x73, 19, 8 /* RESET SYSTEM MASK */
! 613: #define MTSM 0x00, 0xc3, 19, 8 /* MOVE TO SYSTEM MASK */
! 614: #define LDSID 0x00, 0x85, 19, 8 /* LOAD SPACE IDENTIFIER */
! 615: #define MTSP 0x00, 0xc1, 19, 8 /* MOVE TO SPACE REGISTER */
! 616: #define MTCTL 0x00, 0xc2, 19, 8 /* MOVE TO SYSTEM CONTROL REGISTER */
! 617: #define MFSP 0x00, 0x25, 19, 8 /* MOVE FROM SPACE REGISTER */
! 618: #define MFCTL 0x00, 0x45, 19, 8 /* MOVE FROM SYSTEM CONTROL REGISTER */
! 619: #define SYNC 0x00, 0x20, 19, 8 /* SYNCHRONIZE DATA CACHE */
! 620: #define DIAG 0x05, 0x00, 0, 0 /* DIAGNOSE */
! 621: #define SPOP 0x04, 0x00, 0, 0 /* SPECIAL FUNCTION UNIT */
! 622: #define COPR 0x0c, 0x00, 0, 0 /* COPROCESSOR */
! 623: #define CLDWX 0x09, 0x00, 19, 4 /* COPROCESSOR LOAD WORD INDEXED */
! 624: #define CLDDX 0x0b, 0x00, 19, 4 /* COPROCESSOR LOAD WORD INDEXED */
! 625: #define CSTWX 0x09, 0x01, 19, 4 /* COPROCESSOR STORE WORD INDEXED */
! 626: #define CSTDX 0x0b, 0x01, 19, 4 /* COPROCESSOR STORE WORD INDEXED */
! 627: #define CLDWS 0x09, 0x08, 19, 4 /* COPROCESSOR LOAD WORD SHORT */
! 628: #define CLDDS 0x0b, 0x08, 19, 4 /* COPROCESSOR LOAD WORD SHORT */
! 629: #define CSTWS 0x09, 0x09, 19, 4 /* COPROCESSOR STORE WORD SHORT */
! 630: #define CSTDS 0x0b, 0x09, 19, 4 /* COPROCESSOR STORE WORD SHORT */
! 631: #define FLOAT0 0x0e, 0x00, 21, 2 /* FLOATING POINT CLASS 0 */
! 632: #define FLOAT1 0x0e, 0x01, 21, 2 /* FLOATING POINT CLASS 1 */
! 633: #define FLOAT2 0x0e, 0x02, 21, 2 /* FLOATING POINT CLASS 2 */
! 634: #define FLOAT3 0x0e, 0x03, 21, 2 /* FLOATING POINT CLASS 3 */
! 635: #define FMPYSUB 0x26, 0x00, 0, 0 /* FP MULTIPLY AND SUBTRACT */
! 636: #define FMPYADD 0x06, 0x00, 0, 0 /* FP MULTIPLY AND ADD/TRUNCATE */
! 637: #define FSTQX 0x0f, 0x01, 19, 4 /* FLOATING POINT STORE QUAD INDEXED */
! 638: #define FSTQS 0x0f, 0x09, 19, 4 /* FLOATING POINT STORE QUAD SHORT */
! 639: /* all of the following have been pushed around to conform */
! 640: #define PROBER 0x01, 0x46, 19, 7 /* PROBE READ ACCESS */
! 641: #ifdef notdef
! 642: #define PROBERI 0x01, 0xc6, 19, 7 /* PROBE READ ACCESS IMMEDIATE */
! 643: #endif
! 644: #define PROBEW 0x01, 0x47, 19, 7 /* PROBE WRITE ACCESS */
! 645: #ifdef notdef
! 646: #define PROBEWI 0x01, 0xc7, 19, 7 /* PROBE WRITE ACCESS IMMEDIATE */
! 647: #endif
! 648: #define LPA 0x01, 0x4d, 19, 7 /* LOAD PHYSICAL ADDRESS */
! 649: #define LHA 0x01, 0x4c, 19, 7 /* LOAD HASH ADDRESS */
! 650: #define PDTLB 0x01, 0x48, 19, 7 /* PURGE DATA TRANS LOOKASIDE BUFFER */
! 651: #define PITLB 0x01, 0x08, 19, 7 /* PURGE INST TRANS LOOKASIDE BUFFER */
! 652: #define PDTLBE 0x01, 0x49, 19, 7 /* PURGE DATA TLB ENTRY */
! 653: #define PITLBE 0x01, 0x09, 19, 7 /* PURGE INST TLB ENTRY */
! 654: #define IDTLBA 0x01, 0x41, 19, 7 /* INSERT DATA TLB ADDRESS */
! 655: #define IITLBA 0x01, 0x01, 19, 7 /* INSERT INSTRUCTION TLB ADDRESS */
! 656: #define IDTLBP 0x01, 0x40, 19, 7 /* INSERT DATA TLB PROTECTION */
! 657: #define IITLBP 0x01, 0x00, 19, 7 /* INSERT INSTRUCTION TLB PROTECTION */
! 658: #define PDC 0x01, 0x4e, 19, 7 /* PURGE DATA CACHE */
! 659: #define FDC 0x01, 0x4a, 19, 7 /* FLUSH DATA CACHE */
! 660: #define FIC 0x01, 0x0a, 19, 7 /* FLUSH INSTRUCTION CACHE */
! 661: #define FDCE 0x01, 0x4b, 19, 7 /* FLUSH DATA CACHE ENTRY */
! 662: #define FICE 0x01, 0x0b, 19, 7 /* FLUSH DATA CACHE ENTRY */
! 663:
! 664: /*
! 665: * Header: /n/schirf/u/baford/CVS/mach4-parisc/kernel_unused/parisc/kdb/unasm.c,v 1.5 1994/07/21 22:32:05 mike Exp
! 666: *
! 667: * Spectrum Simulator Instruction Set Constants and Datatypes
! 668: * Dan Magenheimer - 4/28/82
! 669: * Computer Research Center, Hewlett-Packard Labs
! 670: *
! 671: * (c) copyright 1982
! 672: * (p) protected 1982
! 673: * The Hewlett-Packard Company
! 674: * Hewlett-Packard Laboratories
! 675: * Computer Research Center
! 676: * Palo Alto, California
! 677: *
! 678: * *** HP Company Confidential ***
! 679: *
! 680: * Log: unasm.c,v
! 681: * Revision 1.5 1994/07/21 22:32:05 mike
! 682: * official HP copyright notice
! 683: *
! 684: * Revision 1.4 1992/07/08 12:19:52 dalton
! 685: * Checkin before split to 1.0.4 release (by LBS).
! 686: *
! 687: * Revision 1.3 92/06/06 16:16:45 dalton
! 688: * *** empty log message ***
! 689: *
! 690: * Revision 1.2 92/06/06 15:42:28 dalton
! 691: * Changed include to be a path relative to hp800.
! 692: *
! 693: * Revision 1.1 92/06/06 14:05:33 dalton
! 694: * Initial revision
! 695: *
! 696: * Revision 1.2 91/04/14 20:29:49 osfrcs
! 697: * Initial version.
! 698: * [91/03/30 09:20:34 brezak]
! 699: *
! 700: * Revision 1.1.2.2 91/04/02 10:42:50 brezak
! 701: * Initial version.
! 702: * [91/03/30 09:20:34 brezak]
! 703: *
! 704: * Revision 1.1.1.2 91/03/30 09:20:34 brezak
! 705: * Initial version.
! 706: *
! 707: ;Revision 1.1 88/07/11 14:05:21 14:05:21 ren (Bob Naas)
! 708: ;Initial revision
! 709: ;
! 710: * Revision 5.1 87/02/27 11:12:23 11:12:23 kent (Kent McMullen)
! 711: * update all src to 5.1
! 712: *
! 713: * Revision 5.0 87/02/18 16:31:52 16:31:52 kent (Kent McMullen)
! 714: * update all revision numbers to 5.0 for release
! 715: *
! 716: * Revision 1.1 86/07/15 08:35:00 08:35:00 kent (Kent McMullen)
! 717: * Initial revision
! 718: *
! 719: * Revision 4.3 85/11/12 09:28:44 09:28:44 viggy (Viggy Mokkarala)
! 720: * first mpsim version, partially stable
! 721: *
! 722: * Revision 4.2 84/07/16 17:20:57 17:20:57 djm ()
! 723: * Define field macros for COPR and SFU insts
! 724: *
! 725: * Revision 4.1 83/10/25 17:10:14 djm (Daniel Magenheimer)
! 726: * First release for ACD v4
! 727: *
! 728: * Revision 3.1 83/08/03 14:09:59 djm (Daniel Magenheimer)
! 729: * Sys calls, args, -S, bug fixes, etc.
! 730: *
! 731: * Revision 3.0 83/06/13 10:25:13 djm (Daniel Magenheimer)
! 732: * First release for distribution
! 733: *
! 734: *
! 735: */
! 736: /*
! 737: * Changes:
! 738: * 12/01/89 ejf Add Rsd(), Rse(), Rtd(), Rte() for 5 ops.
! 739: * 11/30/89 ejf Make instruction use counters shared, not per cpu.
! 740: * 11/28/89 ejf Change majoropcode for quicker extension extract.
! 741: */
! 742:
! 743:
! 744:
! 745: /*
! 746: * Dependencies: std.h, ssDefs.h, bits.h
! 747: */
! 748:
! 749:
! 750: /* Lookup/Execute structure for instructions */
! 751: struct inst {
! 752: u_char majopc; /* major opcode of instruction, 0..MAXOPC */
! 753: u_char opcext; /* opcode extension, 0 if not applic. */
! 754: u_char extbs; /* starting bit pos of extension field */
! 755: u_char extbl; /* bit length of extension field */
! 756: u_int count; /* frequency counter for analysis */
! 757: char mnem[8]; /* ascii mnemonic */
! 758: /* disassembly function */
! 759: int (*dasmfcn)(const struct inst *, OFS, int);
! 760: };
! 761:
! 762:
! 763: #define NMAJOPCS 64
! 764:
! 765: struct majoropcode {
! 766: const struct inst **subops; /* pointer to table of subops indexed by
! 767: * opcode extension */
! 768: u_int maxsubop; /* largest opcode extension value or 0 */
! 769: u_int extshft; /* right shift amount for extension field */
! 770: u_int extmask; /* post shift mask for extension field */
! 771: };
! 772:
! 773: #define OpExt(i,m) ((i >> m->extshft) & m->extmask) /* extract opcode extension */
! 774:
! 775:
! 776: /*****************************/
! 777: /* Miscellaneous definitions */
! 778: /*****************************/
! 779:
! 780: /* Load/Store Indexed Opcode Extension Cache Control */
! 781: #define NOACTION 0
! 782: #define STACKREF 1
! 783: #define SEQPASS 2
! 784: #define PREFETCH 3
! 785:
! 786: /******************************/
! 787: /* Fields within instructions */
! 788: /******************************/
! 789:
! 790: /* opcode */
! 791: #define Opcode(i) BitfR(i,0,6,_b06)
! 792: /* opcode true/false bit */
! 793: #define OpcTF(i) BitfR(i,4,1,_b41)
! 794: /* register sources */
! 795: #define Rsa(i) BitfR(i,11,5,_b115)
! 796: #define Rsb(i) BitfR(i,6,5,_b65)
! 797: #define Rsc(i) BitfR(i,27,5,_b275)
! 798: #define Rsd(i) BitfR(i,21,5,_b215)
! 799: #define Rse(i) BitfR(i,16,5,_b165)
! 800: /* register targets */
! 801: #define Rta(i) BitfR(i,11,5,_b115)
! 802: #define Rtb(i) BitfR(i,6,5,_b65)
! 803: #define Rtc(i) BitfR(i,27,5,_b275)
! 804: #define Rtd(i) BitfR(i,21,5,_b215)
! 805: #define Rte(i) BitfR(i,16,5,_b165)
! 806: /* 5-bit immediates (Magnitude, Sign) */
! 807: #define Imb5(i) BitfR(i,6,5,_b65)
! 808: #define Ima5M(i) BitfR(i,11,4,_b114)
! 809: #define Ima5S(i) BitfR(i,15,1,_b151)
! 810: #define Ima5A(i) BitfR(i,11,5,_b115)
! 811: #define Imd5(i) BitfR(i,22,5,_b225)
! 812: #define Imc5M(i) BitfR(i,27,4,_b274)
! 813: #define Imc5S(i) BitfR(i,31,1,_b311)
! 814: #define Imc5A(i) BitfR(i,27,5,_b275)
! 815: /* Other immediates */
! 816: #define Im21L(i) BitfR(i,18,2,_b182)
! 817: #define Im21H(i) BitfR(i,20,11,_b2011)
! 818: #define Im21M1(i) BitfR(i,16,2,_b162)
! 819: #define Im21M2(i) BitfR(i,11,5,_b115)
! 820: #define Im21S(i) BitfR(i,31,1,_b311)
! 821: #define Im11M(i) BitfR(i,21,10,_b2110)
! 822: #define Im11S(i) BitfR(i,31,1,_b311)
! 823: /* displacements/offsets */
! 824: #define DispM(i) BitfR(i,18,13,_b1813)
! 825: #define DispS(i) BitfR(i,31,1,_b311)
! 826: #define Off5(i) BitfR(i,11,5,_b115)
! 827: #define Off11H(i) BitfR(i,19,10,_b1910)
! 828: #define Off11L(i) BitfR(i,29,1,_b291)
! 829: #define OffS(i) BitfR(i,31,1,_b311)
! 830: /* miscellaneous */
! 831: #define Dss(i) BitfR(i,16,2,_b162)
! 832: #define Cond(i) BitfR(i,16,3,_b163)
! 833: #define Cneg(i) BitfR(i,19,1,_b191)
! 834: #define Cond4(i) BitfR(i,16,4,_b164) /* Cond AND Cneg */
! 835: #define Nu(i) BitfR(i,30,1,_b301)
! 836: #define SrL(i) BitfR(i,16,2,_b162)
! 837: #define SrH(i) BitfR(i,18,1,_b181)
! 838: #define ShortDisp(i) BitfR(i,19,1,_b191)
! 839: #define IndxShft(i) BitfR(i,18,1,_b181)
! 840: #define ModBefore(i) BitfR(i,18,1,_b181)
! 841: #define CacheCtrl(i) BitfR(i,20,2,_b202)
! 842: #define Modify(i) BitfR(i,26,1,_b261)
! 843: #define ProbeI(i) BitfR(i,18,1,_b181)
! 844: #define Uid(i) BitfR(i,23,3,_b233)
! 845: #define Sfu(i) BitfR(i,23,3,_b233)
! 846: #define CopExt17(i) BitfR(i,6,17,_b617)
! 847: #define CopExt5(i) BitfR(i,27,5,_b275)
! 848: #define SpopType(i) BitfR(i,21,2,_b212)
! 849: #define SpopExt15(i) BitfR(i,6,15,_b615)
! 850: #define SpopExt10(i) BitfR(i,11,10,_b1110)
! 851: #define SpopExt5L(i) BitfR(i,16,5,_b165)
! 852: #define SpopExt5(i) BitfR(i,27,5,_b275)
! 853: #define NoMajOpc(i) BitfR(i,6,26,_b626)
! 854: #define Bi1(i) BitfR(i,27,5,_b275) /* fields in BREAK */
! 855: #define Bi2(i) BitfR(i,6,13,_b613)
! 856:
! 857: /* fragmented field collating macros */
! 858: #define Ima5(i) (Ima5S(i) ? Ima5M(i) | (-1<<4) : Ima5M(i))
! 859:
! 860: #define Imc5(i) (Imc5S(i) ? Imc5M(i) | (-1<<4) : Imc5M(i))
! 861:
! 862: #define Disp(i) (DispS(i) ? DispM(i) | (-1<<13) : DispM(i))
! 863:
! 864: #define Im21(i) (Im21S(i) << 31 | Im21H(i) << 20 | Im21M1(i) << 18 | \
! 865: Im21M2(i) << 13 | Im21L(i) << 11)
! 866:
! 867: #define Im11(i) (Im11S(i) ? Im11M(i) | (-1<<10) : Im11M(i))
! 868:
! 869: #define Bdisp(i) ((OffS(i) ? (Off5(i)<<11 | Off11L(i)<<10|Off11H(i)) \
! 870: /* branch displacement (bytes) */ | (-1 << 16) \
! 871: : (Off5(i)<<11|Off11L(i)<<10|Off11H(i))) << 2)
! 872:
! 873: #define Cbdisp(i) ((OffS(i) ? (Off11L(i) << 10 | Off11H(i)) \
! 874: /* compare/branch disp (bytes) */ | (-1 << 11) \
! 875: : Off11L(i) << 10 | Off11H(i)) << 2)
! 876:
! 877: #define Sr(i) (SrH(i)<<2 | SrL(i))
! 878:
! 879: /* sfu/copr */
! 880: #define CoprExt1(i) (CopExt17(i))
! 881: #define CoprExt2(i) (CopExt5(i))
! 882: #define CoprExt(i) ((CopExt17(i)<<5) | CopExt5(i))
! 883: #define Spop0Ext(i) ((SpopExt15(i)<<5) | SpopExt5(i))
! 884: #define Spop1Ext(i) (SpopExt15(i))
! 885: #define Spop2Ext(i) ((SpopExt10(i)<<5) | SpopExt5(i))
! 886: #define Spop3Ext(i) ((SpopExt5L(i)<<5) | SpopExt5(i))
! 887:
! 888:
! 889: /*##################### Globals - Imports ##################################*/
! 890:
! 891: /* Disassembly functions */
! 892: int fcoprDasm(int w, u_int op1, u_int);
! 893: char *edDCond(u_int cond);
! 894: char *unitDCond(u_int cond);
! 895: char *addDCond(u_int cond);
! 896: char *subDCond(u_int cond);
! 897: int blDasm(const struct inst *i, OFS ofs, int w);
! 898: int ldDasm(const struct inst *, OFS, int);
! 899: int stDasm(const struct inst *i, OFS, int);
! 900: int addDasm(const struct inst *i, OFS, int);
! 901: int unitDasm(const struct inst *i, OFS, int);
! 902: int iaDasm(const struct inst *i, OFS, int);
! 903: int shdDasm(const struct inst *i, OFS, int);
! 904: int extrDasm(const struct inst *i, OFS, int);
! 905: int vextrDasm(const struct inst *i, OFS, int);
! 906: int depDasm(const struct inst *i, OFS, int);
! 907: int vdepDasm(const struct inst *i, OFS, int);
! 908: int depiDasm(const struct inst *i, OFS, int);
! 909: int vdepiDasm(const struct inst *i, OFS, int);
! 910: int limmDasm(const struct inst *i, OFS, int);
! 911: int brkDasm(const struct inst *i, OFS, int);
! 912: int lpkDasm(const struct inst *i, OFS, int);
! 913: int fmpyaddDasm(const struct inst *i, OFS, int);
! 914: int fmpysubDasm(const struct inst *i, OFS, int);
! 915: int floatDasm(const struct inst *i, OFS, int);
! 916: int coprDasm(const struct inst *i, OFS, int);
! 917: int diagDasm(const struct inst *i, OFS, int);
! 918: int scDasm(const struct inst *i, OFS, int);
! 919: int mmgtDasm(const struct inst *i, OFS, int);
! 920: int ldxDasm(const struct inst *i, OFS, int);
! 921: int stsDasm(const struct inst *i, OFS, int);
! 922: int stbysDasm(const struct inst *i, OFS, int);
! 923: int brDasm(const struct inst *i, OFS, int);
! 924: int bvDasm(const struct inst *i, OFS, int);
! 925: int beDasm(const struct inst *i, OFS, int);
! 926: int cbDasm(const struct inst *i,OFS ofs, int);
! 927: int cbiDasm(const struct inst *i,OFS ofs, int);
! 928: int bbDasm(const struct inst *i,OFS ofs, int);
! 929: int ariDasm(const struct inst *i, OFS, int);
! 930:
! 931: /*##################### Globals - Exports ##################################*/
! 932: /*##################### Local Variables ####################################*/
! 933:
! 934: static const char fmtStrTbl[][5] = { "sgl", "dbl", "sgl", "quad" };
! 935: static const char condStrTbl[][7] = {
! 936: "false?", "false", "?", "!<=>", "=", "=t", "?=", "!<>",
! 937: "!?>=", "<", "?<", "!>=", "!?>", "<=", "?<=", "!>",
! 938: "!?<=", ">", "?>", "!<=", "!?<", ">=", "?>=", "!<",
! 939: "!?=", "<>", "!=", "!=t", "!?", "<=>", "true?", "true"
! 940: };
! 941: static const char fsreg[][5] = {
! 942: "r0L", "r0R", "r1L", "r1R", "r2L", "r2R", "r3L", "r3R",
! 943: "r4L", "r4R", "r5L", "r5R", "r6L", "r6R", "r7L", "r7R",
! 944: "r8L", "r8R", "r9L", "r9R", "r10L", "r10R", "r11L", "r11R",
! 945: "r12L", "r12R", "r13L", "r13R", "r14L", "r14R", "r15L", "r15R",
! 946: "r16L", "r16R", "r17L", "r17R", "r18L", "r18R", "r19L", "r19R",
! 947: "r20L", "r20R", "r21L", "r21R", "r22L", "r22R", "r23L", "r23R",
! 948: "r24L", "r24R", "r25L", "r25R", "r26L", "r26R", "r27L", "r27R",
! 949: "r28L", "r28R", "r29L", "r29R", "r30L", "r30R", "r31L", "r31R"
! 950: };
! 951: static const char fdreg[][4] = {
! 952: "r0", "r0", "r1", "r1", "r2", "r2", "r3", "r3",
! 953: "r4", "r4", "r5", "r5", "r6", "r6", "r7", "r7",
! 954: "r8", "r8", "r9", "r9", "r10", "r10", "r11", "r11",
! 955: "r12", "r12", "r13", "r13", "r14", "r14", "r15", "r15",
! 956: "r16", "r16", "r17", "r17", "r18", "r18", "r19", "r19",
! 957: "r20", "r20", "r21", "r21", "r22", "r22", "r23", "r23",
! 958: "r24", "r24", "r25", "r25", "r26", "r26", "r27", "r27",
! 959: "r28", "r28", "r29", "r29", "r30", "r30", "r31", "r31"
! 960: };
! 961:
! 962: /*##################### Macros #############################################*/
! 963:
! 964: #define Match(s) (strncmp(s,i->mnem,sizeof(s)-1) == 0)
! 965:
! 966: /* bits for assist ops */
! 967: #define AstNu(w) Modify(w)
! 968: #define Fpi(w) (Uid(w)>3)
! 969:
! 970: /* bits for 5 ops */
! 971: #define SinglePrec(i) Modify(i)
! 972: #define Ms1(i) ((Rsb(i)<<1)+(SinglePrec(i)?((Rsb(i)>15)?1:32):0))
! 973: #define Ms2(i) ((Rsa(i)<<1)+(SinglePrec(i)?((Rsa(i)>15)?1:32):0))
! 974: #define Mt(i) ((Rtc(i)<<1)+(SinglePrec(i)?((Rtc(i)>15)?1:32):0))
! 975: #define As(i) ((Rsd(i)<<1)+(SinglePrec(i)?((Rsd(i)>15)?1:32):0))
! 976: #define Ad(i) ((Rte(i)<<1)+(SinglePrec(i)?((Rte(i)>15)?1:32):0))
! 977:
! 978: /*##################### Globals - Exports ##################################*/
! 979:
! 980: /* To replace instr function, do the following: */
! 981: /* a) locate the desired entry in instrs[] below */
! 982: /* b) change the 3rd field if an alternate mneumonic is */
! 983: /* desired for window disassembly */
! 984: /* c) change the 4th field to the name of the function being */
! 985: /* used for replacement (i.e. ldwRepl instead of ldw) */
! 986: /* d) change the 5th field if an alternate disassembly routine */
! 987: /* is desired (i.e. ldDasmRepl) */
! 988:
! 989: static const struct inst instrs[] = {
! 990: { LDW, 0, "ldw", ldDasm },
! 991: { LDH, 0, "ldh", ldDasm },
! 992: { LDB, 0, "ldb", ldDasm },
! 993: { LDWM, 0, "ldwm", ldDasm },
! 994: { LDO, 0, "ldo", ldDasm },
! 995: { STW, 0, "stw", stDasm },
! 996: { STH, 0, "sth", stDasm },
! 997: { STB, 0, "stb", stDasm },
! 998: { STWM, 0, "stwm", stDasm },
! 999: { LDWX, 0, "ldw", ldxDasm },
! 1000: { LDHX, 0, "ldh", ldxDasm },
! 1001: { LDBX, 0, "ldb", ldxDasm },
! 1002: { LDCWX, 0, "ldcw", ldxDasm },
! 1003: { LDWAX, 0, "ldwa", ldxDasm },
! 1004: { LDWS, 0, "ldw", ldxDasm },
! 1005: { LDHS, 0, "ldh", ldxDasm },
! 1006: { LDBS, 0, "ldb", ldxDasm },
! 1007: { LDCWS, 0, "ldcw", ldxDasm },
! 1008: { LDWAS, 0, "ldwa", ldxDasm },
! 1009: { STWS, 0, "stws", stsDasm },
! 1010: { STHS, 0, "sths", stsDasm },
! 1011: { STBS, 0, "stbs", stsDasm },
! 1012: { STWAS, 0, "stwas", stsDasm },
! 1013: { STBYS, 0, "stbys", stbysDasm },
! 1014: { LDIL, 0, "ldil", limmDasm },
! 1015: { ADDIL, 0, "addil", limmDasm },
! 1016: { GATE, 0, "gate", blDasm },
! 1017: { BL, 0, "b", blDasm },
! 1018: { BLR, 0, "blr", brDasm },
! 1019: { BV, 0, "bv", bvDasm },
! 1020: { BE, 0, "be", beDasm },
! 1021: { BLE, 0, "ble", beDasm },
! 1022: { COMBT, 0, "combt", cbDasm },
! 1023: { COMBF, 0, "combf", cbDasm },
! 1024: { COMIBT, 0, "comibt", cbiDasm },
! 1025: { COMIBF, 0, "comibf", cbiDasm },
! 1026: { ADDBT, 0, "addbt", cbDasm },
! 1027: { ADDBF, 0, "addbf", cbDasm },
! 1028: { ADDIBT, 0, "addibt", cbiDasm },
! 1029: { ADDIBF, 0, "addibf", cbiDasm },
! 1030: { MOVB, 0, "movb", cbDasm },
! 1031: { MOVIB, 0, "movib", cbiDasm },
! 1032: { BB, 0, "bb", bbDasm },
! 1033: { BVB, 0, "bvb", bbDasm },
! 1034: { SUBO, 0, "subo", ariDasm },
! 1035: { ADD, 0, "add", addDasm },
! 1036: { ADDL, 0, "addl", addDasm },
! 1037: { ADDO, 0, "addo", ariDasm },
! 1038: { SH1ADD, 0, "sh1add", ariDasm },
! 1039: { SH1ADDL,0, "sh1addl", ariDasm },
! 1040: { SH1ADDO,0, "sh1addo", ariDasm },
! 1041: { SH2ADD, 0, "sh2add", ariDasm },
! 1042: { SH2ADDL,0, "sh2addl", ariDasm },
! 1043: { SH2ADDO,0, "sh2addo", ariDasm },
! 1044: { SH3ADD, 0, "sh3add", ariDasm },
! 1045: { SH3ADDL,0, "sh3addl", ariDasm },
! 1046: { SH3ADDO,0, "sh3addo", ariDasm },
! 1047: { SUB, 0, "sub", ariDasm },
! 1048: { ADDCO, 0, "addco", ariDasm },
! 1049: { SUBBO, 0, "subbo", ariDasm },
! 1050: { ADDC, 0, "addc", ariDasm },
! 1051: { SUBB, 0, "subb", ariDasm },
! 1052: { COMCLR, 0, "comclr", ariDasm },
! 1053: { OR, 0, "or", ariDasm },
! 1054: { AND, 0, "and", ariDasm },
! 1055: { XOR, 0, "xor", ariDasm },
! 1056: { ANDCM, 0, "andcm", ariDasm },
! 1057: { DS, 0, "ds", ariDasm },
! 1058: { UXOR, 0, "uxor", unitDasm },
! 1059: { UADDCM, 0, "uaddcm", unitDasm },
! 1060: { UADDCMT,0, "uaddcmt", unitDasm },
! 1061: { SUBTO, 0, "subto", ariDasm },
! 1062: { SUBT, 0, "subt", ariDasm },
! 1063: { DCOR, 0, "dcor", unitDasm },
! 1064: { IDCOR, 0, "idcor", unitDasm },
! 1065: { ADDIO, 0, "addio", iaDasm },
! 1066: { SUBIO, 0, "subio", iaDasm },
! 1067: { ADDI, 0, "addi", iaDasm },
! 1068: { SUBI, 0, "subi", iaDasm },
! 1069: { COMICLR,0, "comiclr", iaDasm },
! 1070: { ADDITO, 0, "addito", iaDasm },
! 1071: { ADDIT, 0, "addit", iaDasm },
! 1072: { SHD, 0, "shd", shdDasm },
! 1073: { VSHD, 0, "vshd", shdDasm },
! 1074: { EXTRU, 0, "extru", extrDasm },
! 1075: { EXTRS, 0, "extrs", extrDasm },
! 1076: { VEXTRU, 0, "vextru", vextrDasm },
! 1077: { VEXTRS, 0, "vextrs", vextrDasm },
! 1078: { DEP, 0, "dep", depDasm },
! 1079: { VDEP, 0, "vdep", vdepDasm },
! 1080: { DEPI, 0, "depi", depiDasm },
! 1081: { VDEPI, 0, "vdepi", vdepiDasm },
! 1082: { ZDEP, 0, "zdep", depDasm },
! 1083: { ZVDEP, 0, "zvdep", vdepDasm },
! 1084: { ZDEPI, 0, "zdepi", depiDasm },
! 1085: { ZVDEPI, 0, "zvdepi", vdepiDasm },
! 1086: { BREAK, 0, "break", brkDasm },
! 1087: { RFI, 0, "rfi", 0 },
! 1088: { RFIR, 0, "rfir", 0 },
! 1089: { SSM, 0, "ssm", scDasm },
! 1090: { RSM, 0, "rsm", scDasm },
! 1091: { MTSM, 0, "mtsm", scDasm },
! 1092: { PROBER, 0, "prober", mmgtDasm },
! 1093: { PROBEW, 0, "probew", mmgtDasm },
! 1094: { LPA, 0, "lpa", mmgtDasm },
! 1095: { LHA, 0, "lha", mmgtDasm },
! 1096: { LDSID, 0, "ldsid", scDasm },
! 1097: { PDTLB, 0, "pdtlb", mmgtDasm },
! 1098: { PDTLBE, 0, "pdtlbe", mmgtDasm },
! 1099: { PITLB, 0, "pitlb", mmgtDasm },
! 1100: { PITLBE, 0, "pitlbe", mmgtDasm },
! 1101: { IDTLBA, 0, "idtlba", mmgtDasm },
! 1102: { IITLBA, 0, "iitlba", mmgtDasm },
! 1103: { IDTLBP, 0, "idtlbp", mmgtDasm },
! 1104: { IITLBP, 0, "iitlbp", mmgtDasm },
! 1105: { FIC, 0, "fic", mmgtDasm },
! 1106: { FICE, 0, "fice", mmgtDasm },
! 1107: { PDC, 0, "pdc", mmgtDasm },
! 1108: { FDC, 0, "fdc", mmgtDasm },
! 1109: { FDCE, 0, "fdce", mmgtDasm },
! 1110: { SYNC, 0, "sync", 0 },
! 1111: { MTSP, 0, "mtsp", scDasm },
! 1112: { MTCTL, 0, "mtctl", scDasm },
! 1113: { MFSP, 0, "mfsp", scDasm },
! 1114: { MFCTL, 0, "mfctl", scDasm },
! 1115: { DIAG, 0, "diag", diagDasm },
! 1116: { SPOP, 0, "???", 0 },
! 1117: { COPR, 0, "copr", coprDasm },
! 1118: { CLDWX, 0, "cldw", coprDasm },
! 1119: { CLDDX, 0, "cldd", coprDasm },
! 1120: { CSTWX, 0, "cstw", coprDasm },
! 1121: { CSTDX, 0, "cstd", coprDasm },
! 1122: { CLDWS, 0, "cldw", coprDasm },
! 1123: { CLDDS, 0, "cldd", coprDasm },
! 1124: { CSTWS, 0, "cstw", coprDasm },
! 1125: { CSTDS, 0, "cstd", coprDasm },
! 1126: { FLOAT0, 0, "f", floatDasm },
! 1127: { FLOAT1, 0, "fcnv", floatDasm },
! 1128: { FLOAT2, 0, "f", floatDasm },
! 1129: { FLOAT3, 0, "f", floatDasm },
! 1130: { FMPYSUB,0, "fmpy", fmpysubDasm },
! 1131: { FMPYADD,0, "fmpy", fmpyaddDasm },
! 1132: { FSTQX, 0, "fstqx", lpkDasm },
! 1133: { FSTQS, 0, "fstqs", lpkDasm },
! 1134: {0}
! 1135: };
! 1136:
! 1137:
! 1138: static const struct inst illeg = { 0, 0, 0, 0, 0, "???", 0 };
! 1139: static const struct inst *so_sysop[0xd0];
! 1140: static const struct inst *so_mmuop[0x50];
! 1141: static const struct inst *so_arith[0x80];
! 1142: static const struct inst *so_loads[0x50];
! 1143: static const struct inst *so_cldw [0x0A];
! 1144: static const struct inst *so_cldd [0x0A];
! 1145: static const struct inst *so_float[0x04];
! 1146: static const struct inst *so_fstq [0x0A];
! 1147: static const struct inst *so_ebran[0x08];
! 1148: static const struct inst *so_addit[0x02];
! 1149: static const struct inst *so_addi [0x02];
! 1150: static const struct inst *so_subi [0x02];
! 1151: static const struct inst *so_shext[0x08];
! 1152: static const struct inst *so_deps [0x08];
! 1153:
! 1154: #define ILLEG (const struct inst **)&illeg
! 1155: #define NENTS(a) (sizeof(a)/sizeof(a[0])-1)
! 1156: static struct majoropcode majopcs[NMAJOPCS] = {
! 1157: { so_sysop, NENTS(so_sysop) }, /* 00 */
! 1158: { so_mmuop, NENTS(so_mmuop) }, /* 01 */
! 1159: { so_arith, NENTS(so_arith) }, /* 02 */
! 1160: { so_loads, NENTS(so_loads) }, /* 03 */
! 1161: { ILLEG, 1 }, /* 04 */
! 1162: { ILLEG, 1 }, /* 05 */
! 1163: { ILLEG, 1 }, /* 06 */
! 1164: { ILLEG, 1 }, /* 07 */
! 1165: { ILLEG, 1 }, /* 08 */
! 1166: { so_cldw , NENTS(so_cldw ) }, /* 09 */
! 1167: { ILLEG, 1 }, /* 0A */
! 1168: { so_cldd , NENTS(so_cldd ) }, /* 0B */
! 1169: { ILLEG, 1 }, /* 0C */
! 1170: { ILLEG, 1 }, /* 0D */
! 1171: { so_float, NENTS(so_float) }, /* 0E */
! 1172: { so_fstq , NENTS(so_fstq ) }, /* 0F */
! 1173: { ILLEG, 1 }, /* 10 */
! 1174: { ILLEG, 1 }, /* 11 */
! 1175: { ILLEG, 1 }, /* 12 */
! 1176: { ILLEG, 1 }, /* 13 */
! 1177: { ILLEG, 1 }, /* 14 */
! 1178: { ILLEG, 1 }, /* 15 */
! 1179: { ILLEG, 1 }, /* 16 */
! 1180: { ILLEG, 1 }, /* 17 */
! 1181: { ILLEG, 1 }, /* 18 */
! 1182: { ILLEG, 1 }, /* 19 */
! 1183: { ILLEG, 1 }, /* 1A */
! 1184: { ILLEG, 1 }, /* 1B */
! 1185: { ILLEG, 1 }, /* 1C */
! 1186: { ILLEG, 1 }, /* 1D */
! 1187: { ILLEG, 1 }, /* 1E */
! 1188: { ILLEG, 1 }, /* 1F */
! 1189: { ILLEG, 1 }, /* 20 */
! 1190: { ILLEG, 1 }, /* 21 */
! 1191: { ILLEG, 1 }, /* 22 */
! 1192: { ILLEG, 1 }, /* 23 */
! 1193: { ILLEG, 1 }, /* 24 */
! 1194: { so_subi , NENTS(so_subi ) }, /* 25 */
! 1195: { ILLEG, 1 }, /* 26 */
! 1196: { ILLEG, 1 }, /* 27 */
! 1197: { ILLEG, 1 }, /* 28 */
! 1198: { ILLEG, 1 }, /* 29 */
! 1199: { ILLEG, 1 }, /* 2A */
! 1200: { ILLEG, 1 }, /* 2B */
! 1201: { so_addit, NENTS(so_addit) }, /* 2C */
! 1202: { so_addi , NENTS(so_addi ) }, /* 2D */
! 1203: { ILLEG, 1 }, /* 2E */
! 1204: { ILLEG, 1 }, /* 2F */
! 1205: { ILLEG, 1 }, /* 30 */
! 1206: { ILLEG, 1 }, /* 31 */
! 1207: { ILLEG, 1 }, /* 32 */
! 1208: { ILLEG, 1 }, /* 33 */
! 1209: { so_shext, NENTS(so_shext) }, /* 34 */
! 1210: { so_deps , NENTS(so_deps ) }, /* 35 */
! 1211: { ILLEG, 1 }, /* 36 */
! 1212: { ILLEG, 1 }, /* 37 */
! 1213: { ILLEG, 1 }, /* 38 */
! 1214: { ILLEG, 1 }, /* 39 */
! 1215: { so_ebran, NENTS(so_ebran) }, /* 3A */
! 1216: { ILLEG, 1 }, /* 3B */
! 1217: { ILLEG, 1 }, /* 3C */
! 1218: { ILLEG, 1 }, /* 3D */
! 1219: { ILLEG, 1 }, /* 3E */
! 1220: { ILLEG, 1 }, /* 3F */
! 1221: };
! 1222: #undef NENTS
! 1223: #undef ILLEG
! 1224:
! 1225: /*--------------------------------------------------------------------------
! 1226: * instruction$ExecutionInitialize - Initialize the instruction execution
! 1227: * data structures.
! 1228: *---------------------------------------------------------------------------*/
! 1229: int
! 1230: iExInit(void)
! 1231: {
! 1232: static int unasm_initted = 0;
! 1233: register const struct inst *i;
! 1234: register struct majoropcode *m;
! 1235: u_int shft, mask;
! 1236:
! 1237: if (unasm_initted)
! 1238: return 0;
! 1239:
! 1240: /*
! 1241: * Determine maxsubop for each major opcode.
! 1242: * Also, check all instructions of a given major opcode
! 1243: * for consistent opcode extension field definition, and
! 1244: * save a converted form of this definition in the majopcs
! 1245: * entry for this major opcode.
! 1246: */
! 1247: for (i = &instrs[0]; *i->mnem; i++) {
! 1248: m = &majopcs[i->majopc];
! 1249: if (m->maxsubop < i->opcext)
! 1250: panic("iExInit not enough space for opcode %d",
! 1251: i->majopc);
! 1252: shft = 32 - i->extbs - i->extbl;
! 1253: mask = (1 << i->extbl) - 1;
! 1254: if (m->extshft || m->extmask) {
! 1255: if (m->extshft != shft || m->extmask != mask) {
! 1256: db_printf("%s - Bad instruction initialization!\n", i->mnem);
! 1257: return (0);
! 1258: }
! 1259: } else {
! 1260: m->extshft = shft;
! 1261: m->extmask = mask;
! 1262: }
! 1263: }
! 1264:
! 1265: /*
! 1266: * Lastly, fill in all legal subops with the appropriate info.
! 1267: */
! 1268: for (i = &instrs[0]; *i->mnem; i++) {
! 1269: m = &majopcs[i->majopc];
! 1270: if (m->maxsubop == 1)
! 1271: m->subops = (const struct inst **)i;
! 1272: else
! 1273: m->subops[i->opcext] = i;
! 1274: }
! 1275:
! 1276: unasm_initted++;
! 1277: return (1);
! 1278: }
! 1279:
! 1280:
! 1281:
! 1282: /*##################### Functions and Subroutines ##########################*/
! 1283:
! 1284: /**************************************/
! 1285: /* Miscellaneous Disassembly Routines */
! 1286: /**************************************/
! 1287:
! 1288: /* Add instructions */
! 1289: int
! 1290: addDasm(i, ofs, w)
! 1291: const struct inst *i;
! 1292: OFS ofs;
! 1293: int w;
! 1294: {
! 1295: db_printf("%s\t%%r%d,%%r%d,%%r%d",addDCond(Cond4(w)),
! 1296: Rsa(w),Rsb(w),Rtc(w));
! 1297: return (1);
! 1298: }
! 1299:
! 1300: /* Unit instructions */
! 1301: int
! 1302: unitDasm(i, ofs, w)
! 1303: const struct inst *i;
! 1304: OFS ofs;
! 1305: int w;
! 1306: {
! 1307: db_printf(unitDCond(Cond4(w)));
! 1308: if (Match("dcor") || Match("idcor"))
! 1309: db_printf("\t%%r%d,%%r%d",Rsb(w),Rtc(w));
! 1310: else
! 1311: db_printf("\t%%r%d,%%r%d,%%r%d",Rsa(w),Rsb(w),Rtc(w));
! 1312: return (1);
! 1313: }
! 1314:
! 1315: /* Immediate Arithmetic instructions */
! 1316: int
! 1317: iaDasm(i, ofs, w)
! 1318: const struct inst *i;
! 1319: OFS ofs;
! 1320: int w;
! 1321: {
! 1322: if (Match("addi"))
! 1323: db_printf("%s\t%d,%%r%d,%%r%d",
! 1324: addDCond(Cond4(w)),Im11(w),Rsb(w),Rta(w));
! 1325: else
! 1326: db_printf("%s\t%d,%%r%d,%%r%d",
! 1327: subDCond(Cond4(w)),Im11(w),Rsb(w),Rta(w));
! 1328: return (1);
! 1329: }
! 1330:
! 1331: /* Shift double instructions */
! 1332: int
! 1333: shdDasm(i, ofs, w)
! 1334: const struct inst *i;
! 1335: OFS ofs;
! 1336: int w;
! 1337: {
! 1338: if (Match("vshd"))
! 1339: db_printf("%s\t%%r%d,%%r%d,%%r%d",
! 1340: edDCond(Cond(w)), Rsa(w),Rsb(w),Rtc(w));
! 1341: else
! 1342: db_printf("%s\t%%r%d,%%r%d,%d,%%r%d",
! 1343: edDCond(Cond(w)),Rsa(w),Rsb(w),31-Imd5(w),Rtc(w));
! 1344: return (1);
! 1345: }
! 1346:
! 1347: /* Extract instructions */
! 1348: int
! 1349: extrDasm(i, ofs, w)
! 1350: const struct inst *i;
! 1351: OFS ofs;
! 1352: int w;
! 1353: {
! 1354: db_printf("%s\t%%r%d,%d,%d,%%r%d",
! 1355: edDCond(Cond(w)),Rsb(w),Imd5(w),32 - Rsc(w),Rta(w));
! 1356: return (1);
! 1357: }
! 1358:
! 1359:
! 1360: /* Variable extract instructions */
! 1361: int
! 1362: vextrDasm(i, ofs, w)
! 1363: const struct inst *i;
! 1364: OFS ofs;
! 1365: int w;
! 1366: {
! 1367: db_printf("%s\t%%r%d,%d,%%r%d",
! 1368: edDCond(Cond(w)),Rsb(w),32 - Rsc(w),Rta(w));
! 1369: return (1);
! 1370: }
! 1371:
! 1372:
! 1373: /* Deposit instructions */
! 1374: int
! 1375: depDasm(i, ofs, w)
! 1376: const struct inst *i;
! 1377: OFS ofs;
! 1378: int w;
! 1379: {
! 1380: db_printf("%s\t%%r%d,%d,%d,%%r%d",
! 1381: edDCond(Cond(w)),Rsa(w),31 - Imd5(w),32 - Rsc(w),Rtb(w));
! 1382: return (1);
! 1383: }
! 1384:
! 1385:
! 1386: /* Variable deposit instructions */
! 1387: int
! 1388: vdepDasm(i, ofs, w)
! 1389: const struct inst *i;
! 1390: OFS ofs;
! 1391: int w;
! 1392: {
! 1393: db_printf("%s\t%%r%d,%d,%%r%d",
! 1394: edDCond(Cond(w)),Rsa(w),32 - Rsc(w),Rtb(w));
! 1395: return (1);
! 1396: }
! 1397:
! 1398:
! 1399: /* Deposit Immediate instructions */
! 1400: int
! 1401: depiDasm(i, ofs, w)
! 1402: const struct inst *i;
! 1403: OFS ofs;
! 1404: int w;
! 1405: {
! 1406: db_printf("%s\t%d,%d,%d,%%r%d",
! 1407: edDCond(Cond(w)),Ima5(w),31 - Imd5(w),32 - Imc5A(w),Rtb(w));
! 1408: return (1);
! 1409: }
! 1410:
! 1411: /* Variable Deposit Immediate instructions */
! 1412: int
! 1413: vdepiDasm(i, ofs, w)
! 1414: const struct inst *i;
! 1415: OFS ofs;
! 1416: int w;
! 1417: {
! 1418: db_printf("%s\t%d,%d,%%r%d",edDCond(Cond(w)),Ima5(w),32-Imc5A(w),Rtb(w));
! 1419: return (1);
! 1420: }
! 1421:
! 1422: /*---------------------------------------------------------------------------
! 1423: * conditionType$DisassembleCondition - Return a string which contains the
! 1424: * ascii description of the passed numeric condition.
! 1425: *---------------------------------------------------------------------------*/
! 1426:
! 1427: char *
! 1428: subDCond(cond)
! 1429: u_int cond;
! 1430: {
! 1431: switch(cond) {
! 1432: case EQZ: return(",=");
! 1433: case LT: return(",<");
! 1434: case LE: return(",<=");
! 1435: case LLT: return(",<<");
! 1436: case LLE: return(",<<=");
! 1437: case SV: return(",sv");
! 1438: case OD: return(",od");
! 1439: case NEQZ: return(",<>");
! 1440: case GE: return(",>=");
! 1441: case GT: return(",>");
! 1442: case LGE: return(",>>=");
! 1443: case LGT: return(",>>");
! 1444: case NSV: return(",nsv");
! 1445: case EV: return(",ev");
! 1446: case TR: return(",tr");
! 1447: case NEV: return("");
! 1448: default:
! 1449: panic("subDCond: unknown condition");
! 1450: }
! 1451: }
! 1452:
! 1453:
! 1454: /*---------------------------------------------------------------------------
! 1455: * conditionType$DisassembleCondition - Return a string which contains the
! 1456: * ascii description of the passed numeric condition.
! 1457: *---------------------------------------------------------------------------*/
! 1458:
! 1459: char *
! 1460: addDCond(cond)
! 1461: u_int cond;
! 1462: {
! 1463: switch(cond) {
! 1464: case EQZ: return(",=");
! 1465: case LT: return(",<");
! 1466: case LE: return(",<=");
! 1467: case NUV: return(",nuv");
! 1468: case ZNV: return(",znv");
! 1469: case SV: return(",sv");
! 1470: case OD: return(",od");
! 1471: case NEQZ: return(",<>");
! 1472: case GE: return(",>=");
! 1473: case GT: return(",>");
! 1474: case UV: return(",uv");
! 1475: case VNZ: return(",vnz");
! 1476: case NSV: return(",nsv");
! 1477: case EV: return(",ev");
! 1478: case TR: return(",tr");
! 1479: case NEV: return("");
! 1480: default:
! 1481: panic("addDCond: unknown condition");
! 1482: }
! 1483: }
! 1484:
! 1485: char *
! 1486: unitDCond(cond)
! 1487: u_int cond;
! 1488: {
! 1489: switch(cond) {
! 1490: case SHC: return(",shc");
! 1491: case SHZ: return(",shz");
! 1492: case SBC: return(",sbc");
! 1493: case SBZ: return(",sbz");
! 1494: case SDC: return(",sdc");
! 1495: case NHC: return(",nhc");
! 1496: case NHZ: return(",nhz");
! 1497: case NBC: return(",nbc");
! 1498: case NBZ: return(",nbz");
! 1499: case NDC: return(",ndc");
! 1500: case TR: return(",tr");
! 1501: case NEV: return("");
! 1502: default:
! 1503: panic("unitDCond: unknown condition");
! 1504: }
! 1505: }
! 1506:
! 1507: char *
! 1508: edDCond(cond)
! 1509: u_int cond;
! 1510: {
! 1511: switch(cond) {
! 1512: case XOD: return(",od");
! 1513: case XTR: return(",tr");
! 1514: case XNE: return(",<>");
! 1515: case XLT: return(",<");
! 1516: case XEQ: return(",=");
! 1517: case XGE: return(",>=");
! 1518: case XEV: return(",ev");
! 1519: case NEV: return("");
! 1520: default:
! 1521: panic("edDCond: unknown condition");
! 1522: }
! 1523: }
! 1524:
! 1525:
! 1526:
! 1527: /****************************************/
! 1528: /* Format Specific Disassembly Routines */
! 1529: /****************************************/
! 1530:
! 1531:
! 1532: /* Load [modify] instructions */
! 1533: int
! 1534: ldDasm(i, ofs, w)
! 1535: const struct inst *i;
! 1536: OFS ofs;
! 1537: int w;
! 1538: {
! 1539: register int d = Disp(w);
! 1540: char s[2];
! 1541:
! 1542: s[1] = '\0';
! 1543: if (d < 0) {
! 1544: d = -d;
! 1545: s[0] = '-';
! 1546: } else
! 1547: s[0] = '\0';
! 1548:
! 1549: if (Rsb(w) == 0 && Match("ldo")) {
! 1550: db_printf("ldi\t%s%X,%%r%d",s,d,Rta(w));
! 1551: return (1);
! 1552: }
! 1553: db_printf("%s\t%s%s%X",i->mnem,(d < 2048? "R'":""), s, d);
! 1554: if (Dss(w))
! 1555: db_printf("(%%sr%d,%%r%d),%%r%d",Dss(w),Rsb(w),Rta(w));
! 1556: else
! 1557: db_printf("(%%r%d),%%r%d",Rsb(w),Rta(w));
! 1558: return (1);
! 1559: }
! 1560:
! 1561: /* Store [modify] instructions */
! 1562: int
! 1563: stDasm(i, ofs, w)
! 1564: const struct inst *i;
! 1565: OFS ofs;
! 1566: int w;
! 1567: {
! 1568: register int d = Disp(w);
! 1569: char s[2];
! 1570:
! 1571: db_printf("\t%%r%d,",Rta(w));
! 1572:
! 1573: s[1] = '\0';
! 1574: if (d < 0) {
! 1575: d = -d;
! 1576: s[0] = '-';
! 1577: } else
! 1578: s[0] = '\0';
! 1579:
! 1580: db_printf("%s%s%X", (d < 2048? "R'":""), s, d);
! 1581:
! 1582: if (Dss(w))
! 1583: db_printf("(%%sr%d,%%r%d)",Dss(w),Rsb(w));
! 1584: else
! 1585: db_printf("(%%r%d)",Rsb(w));
! 1586: return (1);
! 1587: }
! 1588:
! 1589: /* Load indexed instructions */
! 1590: int
! 1591: ldxDasm(i, ofs, w)
! 1592: const struct inst *i;
! 1593: OFS ofs;
! 1594: int w;
! 1595: {
! 1596: register const char *p;
! 1597:
! 1598: if (ShortDisp(w)) {
! 1599: db_printf("s");
! 1600: if (Modify(w))
! 1601: db_printf(",m%s", ModBefore(w)? "b": "a");
! 1602: } else {
! 1603: db_printf("x");
! 1604: if (Modify(w))
! 1605: db_printf(",%sm", IndxShft(w)? "s":"");
! 1606: }
! 1607: switch (CacheCtrl(w)) {
! 1608: case NOACTION: p = ""; break;
! 1609: case STACKREF: p = ",c"; break;
! 1610: case SEQPASS: p = ",q"; break;
! 1611: case PREFETCH: p = ",p"; break;
! 1612: }
! 1613: if (ShortDisp(w))
! 1614: db_printf("%s\t%d", p, Ima5(w));
! 1615: else
! 1616: db_printf("%s\t%%r%d", p, Rsa(w));
! 1617:
! 1618: if (Dss(w))
! 1619: db_printf("(%%sr%d,%%r%d),%%r%d",Dss(w),Rsb(w),Rtc(w));
! 1620: else
! 1621: db_printf("(%%r%d),%%r%d",Rsb(w),Rtc(w));
! 1622: return (1);
! 1623: }
! 1624:
! 1625: /* Store short displacement instructions */
! 1626: int
! 1627: stsDasm(i, ofs, w)
! 1628: const struct inst *i;
! 1629: OFS ofs;
! 1630: int w;
! 1631: {
! 1632: register const char *p;
! 1633: if (Modify(w))
! 1634: db_printf(",m%s", ModBefore(w)? "b":"a");
! 1635:
! 1636: switch (CacheCtrl(w)) {
! 1637: case NOACTION: p = ""; break;
! 1638: case STACKREF: p = ",c"; break;
! 1639: case SEQPASS: p = ",q"; break;
! 1640: case PREFETCH: p = ",p"; break;
! 1641: }
! 1642: db_printf("%s\t%%r%d,", p, Rta(w));
! 1643: if (Dss(w))
! 1644: db_printf("%d(%%sr%d,%%r%d)",Imc5(w),Dss(w),Rsb(w));
! 1645: else
! 1646: db_printf("%d(%%r%d)",Imc5(w),Rsb(w));
! 1647: return (1);
! 1648: }
! 1649:
! 1650: /* Store Bytes Instruction */
! 1651: int
! 1652: stbysDasm(i, ofs, w)
! 1653: const struct inst *i;
! 1654: OFS ofs;
! 1655: int w;
! 1656: {
! 1657: register const char *p;
! 1658: db_printf(ModBefore(w)? ",e":",b");
! 1659: if (Modify(w))
! 1660: db_printf(",m");
! 1661: switch (CacheCtrl(w)) {
! 1662: case NOACTION: p = ""; break;
! 1663: case STACKREF: p = ",f"; break;
! 1664: case SEQPASS: p = ",r"; break;
! 1665: case PREFETCH: p = ",z"; break;
! 1666: }
! 1667: db_printf("%s\t%%r%d,", p, Rta(w));
! 1668: if (Dss(w))
! 1669: db_printf("%d(%%sr%d,%%r%d)",Imc5(w),Dss(w),Rsb(w));
! 1670: else
! 1671: db_printf("%d(%%r%d)",Imc5(w),Rsb(w));
! 1672: return (1);
! 1673: }
! 1674:
! 1675: /* Long Immediate instructions */
! 1676: int
! 1677: limmDasm(i, ofs, w)
! 1678: const struct inst *i;
! 1679: OFS ofs;
! 1680: int w;
! 1681: {
! 1682: db_printf("\tL'%X,%%r%d", Im21(w), Rtb(w));
! 1683: return (1);
! 1684: }
! 1685:
! 1686:
! 1687: /* Branch and Link instruction(s) (Branch, too!!) */
! 1688: int
! 1689: blDasm(i, ofs, w)
! 1690: const struct inst *i;
! 1691: OFS ofs;
! 1692: int w;
! 1693: {
! 1694: register OFS tgtofs = ofs + 8 + Bdisp(w);
! 1695: register u_int link = Rtb(w);
! 1696:
! 1697: if (link && !Match("gate"))
! 1698: db_printf("l");
! 1699: if (Nu(w))
! 1700: db_printf(",n");
! 1701: db_printf("\t");
! 1702:
! 1703: db_printsym((db_addr_t)tgtofs, DB_STGY_ANY, db_printf);
! 1704:
! 1705: if (link || Match("gate"))
! 1706: db_printf(",%%r%d",link);
! 1707:
! 1708: return (1);
! 1709: }
! 1710:
! 1711: /* Branch Register instruction */
! 1712: int
! 1713: brDasm(i, ofs, w)
! 1714: const struct inst *i;
! 1715: OFS ofs;
! 1716: int w;
! 1717: {
! 1718: db_printf("%s\t%%r%d,%%r%d", Nu(w)?",n":"", Rsa(w), Rtb(w));
! 1719: return (1);
! 1720: }
! 1721:
! 1722: /* Dispatch instructions */
! 1723: int
! 1724: bvDasm(i, ofs, w)
! 1725: const struct inst *i;
! 1726: OFS ofs;
! 1727: int w;
! 1728: {
! 1729: db_printf("%s\t%%r%d(%%r%d)", Nu(w)?",n":"", Rsa(w), Rsb(w));
! 1730: return (1);
! 1731: }
! 1732:
! 1733: /* Branch External instructions */
! 1734: int
! 1735: beDasm(i, ofs, w)
! 1736: const struct inst *i;
! 1737: OFS ofs;
! 1738: int w;
! 1739: {
! 1740: register int d = Bdisp(w);
! 1741: register const char *p;
! 1742: char s[2];
! 1743:
! 1744: s[1] = '\0';
! 1745: if (d < 0) {
! 1746: d = -d;
! 1747: s[0] = '-';
! 1748: } else
! 1749: s[0] = '\0';
! 1750:
! 1751: p = Nu(w)? ",n":"";
! 1752: db_printf("%s\tR'%s%X(%%sr%d,%%r%d)", p, s, d, Sr(w), Rsb(w));
! 1753: return (1);
! 1754: }
! 1755:
! 1756:
! 1757: /* Compare/Add and Branch instructions */
! 1758: int
! 1759: cbDasm(i, ofs, w)
! 1760: const struct inst *i;
! 1761: OFS ofs;
! 1762: int w;
! 1763: {
! 1764: register OFS tgtofs = ofs + 8 + Cbdisp(w);
! 1765:
! 1766: if (Match("movb"))
! 1767: db_printf(edDCond(Cond(w)));
! 1768: else if (Match("addb"))
! 1769: db_printf(addDCond(Cond(w) << 1));
! 1770: else
! 1771: db_printf(subDCond(Cond(w) << 1));
! 1772: db_printf("%s\t%%r%d,%%r%d,", Nu(w)?",n":"", Rsa(w), Rsb(w));
! 1773: db_printsym((db_addr_t)tgtofs, DB_STGY_ANY, db_printf);
! 1774: return (1);
! 1775: }
! 1776:
! 1777: /* Compare/Add and Branch Immediate instructions */
! 1778: int
! 1779: cbiDasm(i, ofs, w)
! 1780: const struct inst *i;
! 1781: OFS ofs;
! 1782: int w;
! 1783: {
! 1784: register OFS tgtofs = ofs + 8 + Cbdisp(w);
! 1785:
! 1786: if (Match("movib"))
! 1787: db_printf(edDCond(Cond(w)));
! 1788: else if (Match("addib"))
! 1789: db_printf(addDCond(Cond(w) << 1));
! 1790: else
! 1791: db_printf(subDCond(Cond(w) << 1));
! 1792: db_printf("%s\t%d,%%r%d,", Nu(w)? ",n":"", Ima5(w), Rsb(w));
! 1793: db_printsym((db_addr_t)tgtofs, DB_STGY_ANY, db_printf);
! 1794: return (1);
! 1795: }
! 1796:
! 1797: /* Branch on Bit instructions */
! 1798: int
! 1799: bbDasm(i, ofs, w)
! 1800: const struct inst *i;
! 1801: OFS ofs;
! 1802: int w;
! 1803: {
! 1804: register OFS tgtofs = ofs + 8 + Cbdisp(w);
! 1805: register const char *p;
! 1806:
! 1807: db_printf(edDCond(Cond(w)));
! 1808: p = Nu(w)? ",n":"";
! 1809: if (Match("bvb"))
! 1810: db_printf("%s\t%%r%d,", p, Rta(w));
! 1811: else
! 1812: db_printf("%s\t%%r%d,%d,", p, Rsa(w), Imb5(w));
! 1813: db_printsym((db_addr_t)tgtofs, DB_STGY_ANY, db_printf);
! 1814: return (1);
! 1815: }
! 1816:
! 1817: /* Arithmetic instructions */
! 1818: int
! 1819: ariDasm(i, ofs, w)
! 1820: const struct inst *i;
! 1821: OFS ofs;
! 1822: int w;
! 1823: {
! 1824: if (Match("or") && Rsb(w) == 0 && Cond4(w) == NEV) {
! 1825: if (Rsa(w) == 0 && Rtc(w) == 0)
! 1826: db_printf("nop");
! 1827: else
! 1828: db_printf("copy\t%%r%d,%%r%d",Rsa(w),Rtc(w));
! 1829: } else
! 1830: db_printf("%s%s\t%%r%d,%%r%d,%%r%d", i->mnem,
! 1831: subDCond(Cond4(w)), Rsa(w),Rsb(w),Rtc(w));
! 1832: return(1);
! 1833: }
! 1834:
! 1835: /* System control operations */
! 1836: int
! 1837: scDasm(i, ofs, w)
! 1838: const struct inst *i;
! 1839: OFS ofs;
! 1840: int w;
! 1841: {
! 1842: if (Match("mtctl")) {
! 1843: if (Rtb(w) == 11)
! 1844: db_printf("mtsar\t%%r%d",Rsa(w));
! 1845: else
! 1846: db_printf("mtctl\t%%r%d,%%cr%d",Rsa(w),Rtb(w));
! 1847: return (1);
! 1848: }
! 1849: db_printf(i->mnem);
! 1850: if (Match("ssm") || Match("rsm"))
! 1851: db_printf("\t%d,%%r%d",Ima5A(w),Rtc(w));
! 1852: else if (Match("mtsm")) db_printf("\t%%r%d",Rsa(w));
! 1853: else if (Match("ldprid")) db_printf("\t%%r%d",Rtc(w));
! 1854: else if (Match("mtsp")) db_printf("\t%%r%d,%%sr%d",Rsa(w),Sr(w));
! 1855: else if (Match("mfsp")) db_printf("\t%%sr%d,%%r%d",Sr(w),Rtc(w));
! 1856: else if (Match("mfctl")) db_printf("\t%%cr%d,%%r%d",Rsb(w),Rtc(w));
! 1857: else if (Match("ldsid")) {
! 1858: if (Dss(w))
! 1859: db_printf("\t(%%sr%d,%%r%d),%%r%d",Dss(w),Rsb(w),Rtc(w));
! 1860: else
! 1861: db_printf("\t(%%r%d),%%r%d",Rsb(w),Rtc(w));
! 1862: } else
! 1863: return (0);
! 1864:
! 1865: return (1);
! 1866: }
! 1867:
! 1868: /* Instruction cache/tlb control instructions */
! 1869: int
! 1870: mmgtDasm(i, ofs, w)
! 1871: const struct inst *i;
! 1872: OFS ofs;
! 1873: int w;
! 1874: {
! 1875: if (Match("probe")) {
! 1876: if (ProbeI(w)) {
! 1877: if (Dss(w))
! 1878: db_printf("i\t(%%sr%d,%%r%d),%d,%%r%d",
! 1879: Dss(w),Rsb(w),Rsa(w),Rtc(w));
! 1880: else
! 1881: db_printf("i\t(%%r%d),%d,%%r%d",
! 1882: Rsb(w),Rsa(w),Rtc(w));
! 1883: } else {
! 1884: if (Dss(w))
! 1885: db_printf("\t(%%sr%d,%%r%d),%%r%d,%%r%d",
! 1886: Dss(w),Rsb(w),Rsa(w),Rtc(w));
! 1887: else
! 1888: db_printf("\t(%%r%d),%%r%d,%%r%d",
! 1889: Rsb(w),Rsa(w),Rtc(w));
! 1890: }
! 1891: }
! 1892: else if (Match("lha") || Match("lpa")) {
! 1893: if (Modify(w))
! 1894: db_printf(",m");
! 1895: if (Dss(w))
! 1896: db_printf("\t%%r%d(%%sr%d,%%r%d),%%r%d",
! 1897: Rsa(w),Dss(w),Rsb(w),Rtc(w));
! 1898: else
! 1899: db_printf("\t%%r%d(%%r%d),%%r%d",Rsa(w),Rsb(w),Rtc(w));
! 1900: }
! 1901: else if (Match("pdtlb") || Match("pdc") || Match("fdc")) {
! 1902: if (Modify(w)) db_printf(",m");
! 1903: if (Dss(w))
! 1904: db_printf("\t%%r%d(%%sr%d,%%r%d)",Rsa(w),Dss(w),Rsb(w));
! 1905: else
! 1906: db_printf("\t%%r%d(%%r%d)",Rsa(w),Rsb(w));
! 1907: }
! 1908: else if (Match("pitlb") || Match("fic")) {
! 1909: if (Modify(w))
! 1910: db_printf(",m");
! 1911: db_printf("\t%%r%d(%%sr%d,%%r%d)",Rsa(w),Sr(w),Rsb(w));
! 1912: }
! 1913: else if (Match("idtlb")) {
! 1914: if (Dss(w))
! 1915: db_printf("\t%%r%d,(%%sr%d,%%r%d)",Rsa(w),Dss(w),Rsb(w));
! 1916: else
! 1917: db_printf("\t%%r%d,(%%r%d)",Rsa(w),Rsb(w));
! 1918: }
! 1919: else if (Match("iitlb"))
! 1920: db_printf("\t%%r%d,(%%sr%d,%%r%d)",Rsa(w),Sr(w),Rsb(w));
! 1921: else
! 1922: return (0);
! 1923:
! 1924: return(1);
! 1925: }
! 1926:
! 1927: /* break instruction */
! 1928: int
! 1929: brkDasm(i, ofs, w)
! 1930: const struct inst *i;
! 1931: OFS ofs;
! 1932: int w;
! 1933: {
! 1934: db_printf("\t%d,%d",Bi1(w),Bi2(w));
! 1935: return (1);
! 1936: }
! 1937:
! 1938: int
! 1939: floatDasm(i, ofs, w)
! 1940: const struct inst *i;
! 1941: OFS ofs;
! 1942: int w;
! 1943: {
! 1944: register u_int op1, r1, fmt, t;
! 1945: u_int op2, r2, dfmt;
! 1946: char *p;
! 1947:
! 1948: op1 = CoprExt1(w);
! 1949: op2 = CoprExt2(w);
! 1950: fmt = (op1 >> 2) & 3; /* get precision of source */
! 1951:
! 1952: #define ST(r) ((fmt & 1)? fdreg[(r)]:fsreg[(r)])
! 1953: /*
! 1954: * get first (or only) source register
! 1955: * (independent of class)
! 1956: */
! 1957: r1 = (op1 >> 11) & 0x3e;
! 1958: if ((fmt & 1) == 0 && (Uid(w) & 2))
! 1959: r1++;
! 1960:
! 1961: if (op1 & 2) { /* class 2 or 3 */
! 1962: /*
! 1963: * get second source register
! 1964: */
! 1965: r2 = (op1 >> 6) & 0x3e;
! 1966: if (fmt == 2)
! 1967: r2++;
! 1968:
! 1969: if ((op1 & 1) == 0) { /* class 2 */
! 1970: /* Opclass 2: 2 sources, no destination */
! 1971: switch((op1 >> 4) & 7) {
! 1972: case 0:
! 1973: p = "cmp";
! 1974: break;
! 1975: default:
! 1976: return(0);
! 1977: }
! 1978: db_printf("%s,%s",p,fmtStrTbl[fmt]);
! 1979: db_printf(",%s\t%%f%s,%%f%s",
! 1980: condStrTbl[op2], ST(r1), ST(r2));
! 1981: return (1);
! 1982: }
! 1983: /*
! 1984: * get target register (class 3)
! 1985: */
! 1986: t = (op2 << 1);
! 1987: if ((fmt & 1) == 0 && (Uid(w) & 1))
! 1988: t++;
! 1989: /* Opclass 3: 2 sources, 1 destination */
! 1990: switch((op1 >> 4) & 7) {
! 1991: case 0: p = "add"; break;
! 1992: case 1: p = "sub"; break;
! 1993: case 2: p = (Fpi(w)) ? "mpyi" : "mpy"; break;
! 1994: case 3: p = "div"; break;
! 1995: case 4: p = "rem"; break;
! 1996: default: return (0);
! 1997: }
! 1998: db_printf("%s,%s", p, fmtStrTbl[fmt]);
! 1999: db_printf("\t%%f%s,%%f%s,%%f%s",ST(r1),ST(r2),ST(t));
! 2000: } else if (op1 & 1) { /* class 1 */
! 2001: dfmt = (op1 >> 4) & 3;
! 2002: #define DT(r) ((dfmt & 1)? fdreg[(r)]:fsreg[(r)])
! 2003:
! 2004: /*
! 2005: * get target register
! 2006: */
! 2007: t = (op2 << 1);
! 2008: if ((dfmt & 1) == 0 && (Uid(w) & 1))
! 2009: t++;
! 2010: /* Opclass 1: 1 source, 1 destination conversions */
! 2011: switch((op1 >> 6) & 3) {
! 2012: case 0: p = "ff"; break;
! 2013: case 1: p = "xf"; break;
! 2014: case 2: p = "fx"; break;
! 2015: case 3: p = "fxt"; break;
! 2016: }
! 2017: db_printf("%s,%s", p, fmtStrTbl[fmt]);
! 2018: db_printf(",%s\t%%f%s,%%f%s",fmtStrTbl[dfmt],ST(r1),DT(t));
! 2019: } else { /* class 0 */
! 2020: /*
! 2021: * get target register
! 2022: */
! 2023: t = (op2 << 1);
! 2024: if ((fmt & 1) == 0 && (Uid(w) & 1))
! 2025: t++;
! 2026: /* Opclass 0: 1 source, 1 destination */
! 2027: switch((op1 >> 4) & 7) {
! 2028: case 1: p = "rsqrt"; break;
! 2029: case 2: p = "cpy"; break;
! 2030: case 3: p = "abs"; break;
! 2031: case 4: p = "sqrt"; break;
! 2032: case 5: p = "rnd"; break;
! 2033: default: return (0);
! 2034: }
! 2035: db_printf("%s,%s",p,fmtStrTbl[fmt]);
! 2036: db_printf("\t%%f%s,%%f%s",ST(r1),ST(t));
! 2037: }
! 2038: return (1);
! 2039: }
! 2040:
! 2041: int
! 2042: fcoprDasm(w, op1, op2)
! 2043: int w;
! 2044: u_int op1, op2;
! 2045: {
! 2046: register u_int r1, r2, t, fmt, dfmt;
! 2047: register char *p;
! 2048:
! 2049: if (AstNu(w) && op1 == ((1<<4) | 2)) {
! 2050: if (op2 == 0 || op2 == 1 || op2 == 2) {
! 2051: db_printf("ftest");
! 2052: if (op2 == 1)
! 2053: db_printf(",acc");
! 2054: else if (op2 == 2)
! 2055: db_printf(",rej");
! 2056: return (1);
! 2057: }
! 2058: return (0);
! 2059: } else if (0 == op1 && 0 == op2) {
! 2060: db_printf("fcopr identify");
! 2061: return (1);
! 2062: }
! 2063: switch(op1 & 3) {
! 2064: case 0:
! 2065: /* Opclass 0: 1 source, 1 destination */
! 2066: r1 = (op1 >> 12) & 0x1f; t = op2; fmt = (op1 >> 2) & 3;
! 2067: switch((op1 >> 4) & 7) {
! 2068: case 1: p = "rsqrt"; break;
! 2069: case 2: p = "cpy"; break;
! 2070: case 3: p = "abs"; break;
! 2071: case 4: p = "sqrt"; break;
! 2072: case 5: p = "rnd"; break;
! 2073: default: return(0);
! 2074: }
! 2075: db_printf("f%s,%s\t%%fr%d,%%fr%d", p, fmtStrTbl[fmt], r1, t);
! 2076: break;
! 2077: case 1:
! 2078: /* Opclass 1: 1 source, 1 destination conversions */
! 2079: r1 = (op1 >> 12) & 0x1f; t = op2;
! 2080: fmt = (op1 >> 2) & 3; dfmt = (op1 >> 4) & 3;
! 2081: switch((op1 >> 6) & 3) {
! 2082: case 0: p = "ff"; break;
! 2083: case 1: p = "xf"; break;
! 2084: case 2: p = "fx"; break;
! 2085: case 3: p = "fxt"; break;
! 2086: }
! 2087: db_printf("fcnv%s,%s,%s\t%%fr%d,%%fr%d",
! 2088: p, fmtStrTbl[fmt], fmtStrTbl[dfmt], r1, t);
! 2089: break;
! 2090: case 2:
! 2091: /* Opclass 2: 2 sources, no destination */
! 2092: r1 = (op1 >> 12) & 0x1f; r2 = (op1 >> 7) & 0x1f;
! 2093: fmt = (op1 >> 2) & 3;
! 2094: switch((op1 >> 4) & 7) {
! 2095: case 0: p = "fcmp"; break;
! 2096: default: return (0);
! 2097: }
! 2098: db_printf("%s,%s,%s\t%%fr%d,%%fr%d",
! 2099: p,fmtStrTbl[fmt],condStrTbl[op2],r1,r2);
! 2100: break;
! 2101: case 3:
! 2102: /* Opclass 3: 2 sources, 1 destination */
! 2103: r1 = (op1 >> 12) & 0x1f; r2 = (op1 >> 7) & 0x1f; t = op2;
! 2104: fmt = (op1 >> 2) & 3;
! 2105: switch((op1 >> 4) & 7) {
! 2106: case 0: p = "add"; break;
! 2107: case 1: p = "sub"; break;
! 2108: case 2: p = "mpy"; break;
! 2109: case 3: p = "div"; break;
! 2110: case 4: p = "rem"; break;
! 2111: default: return (0);
! 2112: }
! 2113: db_printf("f%s,%s\t%%fr%d,%%fr%d,%%fr%d",
! 2114: p, fmtStrTbl[fmt], r1, r2, t);
! 2115: break;
! 2116: default:
! 2117: return(0);
! 2118: }
! 2119: return (1);
! 2120: }
! 2121:
! 2122: int
! 2123: coprDasm(i, ofs, w)
! 2124: const struct inst *i;
! 2125: OFS ofs;
! 2126: int w;
! 2127: {
! 2128: register u_int uid = Uid(w);
! 2129: register int load = 0;
! 2130: register char *pfx = uid > 1 ? "c" : "f";
! 2131: register int dreg = 0;
! 2132:
! 2133: if (Match("copr")) {
! 2134: if (uid) {
! 2135: db_printf("copr,%d,0x%x",uid,CoprExt(w));
! 2136: if (AstNu(w))
! 2137: db_printf(",n");
! 2138: return (1);
! 2139: }
! 2140: return fcoprDasm(w, CoprExt1(w),CoprExt2(w));
! 2141: }
! 2142: if (Match("cldd")) {
! 2143: dreg = 1;
! 2144: load = 1;
! 2145: db_printf("%sldd",pfx);
! 2146: } else if (Match("cldw")) {
! 2147: load = 1;
! 2148: db_printf("%sldw",pfx);
! 2149: } else if (Match("cstd")) {
! 2150: dreg = 1;
! 2151: db_printf("%sstd",pfx);
! 2152: } else if (Match("cstw"))
! 2153: db_printf("%sstw",pfx);
! 2154: else
! 2155: return (0);
! 2156:
! 2157: if (ShortDisp(w)) {
! 2158: db_printf("s");
! 2159: if (AstNu(w))
! 2160: db_printf(",m%s", ModBefore(w)?"b":"a");
! 2161: }
! 2162: else {
! 2163: db_printf("x");
! 2164: if (AstNu(w))
! 2165: db_printf(",%sm", IndxShft(w)?"s":"");
! 2166: else if (IndxShft(w))
! 2167: db_printf(",s");
! 2168: }
! 2169: switch (CacheCtrl(w)) {
! 2170: case NOACTION: break;
! 2171: case STACKREF: db_printf(",c"); break;
! 2172: case SEQPASS: db_printf(",q"); break;
! 2173: case PREFETCH: db_printf(",p"); break;
! 2174: }
! 2175: if (load) {
! 2176: register const char *p;
! 2177:
! 2178: if (dreg)
! 2179: p = fdreg[(Rtc(w)<<1)+(uid&1)];
! 2180: else
! 2181: p = fsreg[(Rtc(w)<<1)+(uid&1)];
! 2182:
! 2183: if (ShortDisp(w))
! 2184: db_printf("\t%d",Ima5(w));
! 2185: else
! 2186: db_printf("\t%%r%d",Rsa(w));
! 2187: if (Dss(w))
! 2188: db_printf("(%%sr%d,%%r%d),%%f%s", Dss(w),Rsb(w), p);
! 2189: else
! 2190: db_printf("(%%r%d),%%f%s",Rsb(w), p);
! 2191: } else {
! 2192: register const char *p;
! 2193:
! 2194: if (dreg)
! 2195: p = fdreg[(Rsc(w)<<1)+(uid&1)];
! 2196: else
! 2197: p = fsreg[(Rsc(w)<<1)+(uid&1)];
! 2198:
! 2199: if (ShortDisp(w))
! 2200: db_printf("\t%%f%s,%d", p, Ima5(w));
! 2201: else
! 2202: db_printf("\t%%f%s,%%r%d", p, Rta(w));
! 2203: if (Dss(w))
! 2204: db_printf("(%%sr%d,%%r%d)",Dss(w),Rsb(w));
! 2205: else
! 2206: db_printf("(%%r%d)",Rsb(w));
! 2207: }
! 2208: return (1);
! 2209: }
! 2210:
! 2211: int
! 2212: lpkDasm(i, ofs, w)
! 2213: const struct inst *i;
! 2214: OFS ofs;
! 2215: int w;
! 2216: {
! 2217: /*
! 2218: * Floating point STore Quad
! 2219: * Short or Indexed
! 2220: */
! 2221: if (ShortDisp(w)) {
! 2222: if (Modify(w))
! 2223: db_printf(",m%s", ModBefore(w)?"b":"a");
! 2224: } else {
! 2225: if (Modify(w))
! 2226: db_printf(",%sm", IndxShft(w)? "s":"");
! 2227: else if (IndxShft(w))
! 2228: db_printf(",s");
! 2229: }
! 2230: switch (CacheCtrl(w)) {
! 2231: case NOACTION: break;
! 2232: case STACKREF: db_printf(",c"); break;
! 2233: case SEQPASS: db_printf(",q"); break;
! 2234: case PREFETCH: db_printf(",p"); break;
! 2235: }
! 2236: if (ShortDisp(w))
! 2237: db_printf("\t%%fr%d,%d",Rsc(w),Ima5(w));
! 2238: else
! 2239: db_printf("\t%%fr%d,%%r%d",Rsc(w),Rta(w));
! 2240: if (Dss(w))
! 2241: db_printf("(%%sr%d,%%r%d)",Dss(w),Rsb(w));
! 2242: else
! 2243: db_printf("(%%r%d)",Rsb(w));
! 2244: return (1);
! 2245: }
! 2246:
! 2247: int
! 2248: diagDasm(i, ofs, w)
! 2249: const struct inst *i;
! 2250: OFS ofs;
! 2251: int w;
! 2252: {
! 2253: if (0x0b0 == BitfR(w,19,8,_b198)) /* mtcpu */
! 2254: db_printf("mtcpu\t%%r%d,%%dr%d", Rsa(w), Rtb(w));
! 2255: else if (0x0d0 == BitfR(w,19,8,_b198)) /* mfcpu */
! 2256: db_printf("mfcpu\t%%dr%d,%%r%d", Rsb(w), Rta(w));
! 2257: else {
! 2258: db_printf(i->mnem);
! 2259: if (Match("diag"))
! 2260: db_printf("\t0x%X",w & 0x03ffffff);
! 2261: else
! 2262: return (0);
! 2263: }
! 2264: return (1);
! 2265: }
! 2266:
! 2267: int
! 2268: fmpysubDasm(i, ofs, w)
! 2269: const struct inst *i;
! 2270: OFS ofs;
! 2271: int w;
! 2272: {
! 2273: if (SinglePrec(w))
! 2274: db_printf("SUB,SGL\t%%f%s,%%f%s,%%f%s,%%f%s,%%f%s",
! 2275: fsreg[Ms1(w)], fsreg[Ms2(w)], fsreg[Mt(w)],
! 2276: fsreg[As(w)], fsreg[Ad(w)]);
! 2277: else
! 2278: db_printf("SUB,DBL\t%%f%s,%%f%s,%%f%s,%%f%s,%%f%s",
! 2279: fdreg[Ms1(w)], fdreg[Ms2(w)], fdreg[Mt(w)],
! 2280: fdreg[As(w)], fdreg[Ad(w)]);
! 2281: return (1);
! 2282: }
! 2283:
! 2284: int
! 2285: fmpyaddDasm(i, ofs, w)
! 2286: const struct inst *i;
! 2287: OFS ofs;
! 2288: int w;
! 2289: {
! 2290: register const char
! 2291: *ms1 = SinglePrec(w) ? fsreg[Ms1(w)] : fdreg[Ms1(w)],
! 2292: *ms2 = SinglePrec(w) ? fsreg[Ms2(w)] : fdreg[Ms2(w)],
! 2293: *mt = SinglePrec(w) ? fsreg[Mt(w)] : fdreg[Mt(w)],
! 2294: *as = SinglePrec(w) ? fsreg[As(w)] : fdreg[As(w)],
! 2295: *ad = SinglePrec(w) ? fsreg[Ad(w)] : fdreg[Ad(w)];
! 2296:
! 2297: if (Rsd(w) == 0)
! 2298: db_printf("\t%%fcfxt,%s,%%f%s,%%f%s,%%f%s",
! 2299: ((SinglePrec(w)) ? "sgl" : "dbl"), ms1, ms2, mt);
! 2300: else
! 2301: db_printf("add%s\t%%f%s,%%f%s,%%f%s,%%f%s,%%f%s",
! 2302: ((SinglePrec(w)) ? "sgl" : "dbl"), ms1, ms2, mt, as, ad);
! 2303:
! 2304: return (1);
! 2305: }
! 2306:
! 2307: vaddr_t
! 2308: db_disasm(loc, flag)
! 2309: vaddr_t loc;
! 2310: boolean_t flag;
! 2311: {
! 2312: register const struct inst *i;
! 2313: register const struct majoropcode *m;
! 2314: register u_int ext;
! 2315: int ok, instruct;
! 2316: OFS ofs = 0;
! 2317:
! 2318: iExInit();
! 2319: /* TODO if (loc == PC_REGS(&ddb_regs) && ddb_regs.tf_iir)
! 2320: instruct = ddb_regs.tf_iir;
! 2321: else */ if (USERMODE(loc)) {
! 2322: if (copyin((caddr_t)(loc &~ HPPA_PC_PRIV_MASK),
! 2323: &instruct, sizeof(instruct)))
! 2324: instruct = 0;
! 2325: } else
! 2326: instruct = *(int *)loc;
! 2327:
! 2328: ok = 0;
! 2329: m = &majopcs[Opcode(instruct)];
! 2330: ext = OpExt(instruct, m);
! 2331: if (ext <= m->maxsubop) {
! 2332: /* special hack for majopcs table layout */
! 2333: if (m->maxsubop == 1)
! 2334: i = (const struct inst *)m->subops;
! 2335: else
! 2336: i = m->subops[ext];
! 2337:
! 2338: if (i && i->mnem[0] != '?') {
! 2339: if (i->dasmfcn != coprDasm && i->dasmfcn != diagDasm &&
! 2340: i->dasmfcn != ariDasm && i->dasmfcn != scDasm &&
! 2341: i->dasmfcn != ldDasm)
! 2342: db_printf(i->mnem);
! 2343: if (i->dasmfcn)
! 2344: ok = (*i->dasmfcn)(i, ofs, instruct);
! 2345: }
! 2346: }
! 2347:
! 2348: if (!ok)
! 2349: db_printf("<%08x>", instruct);
! 2350:
! 2351: db_printf("\n");
! 2352: return (loc + sizeof(instruct));
! 2353: }
CVSweb