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