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