1/*	$NetBSD: instr.h,v 1.4 2005/12/11 12:18:43 christos Exp $ */
2/* $FreeBSD$ */
3
4/*
5 * Copyright (c) 1992, 1993
6 *	The Regents of the University of California.  All rights reserved.
7 *
8 * This software was developed by the Computer Systems Engineering group
9 * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
10 * contributed to Berkeley.
11 *
12 * All advertising materials mentioning features or use of this software
13 * must display the following acknowledgement:
14 *	This product includes software developed by the University of
15 *	California, Lawrence Berkeley Laboratory.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
20 * 1. Redistributions of source code must retain the above copyright
21 *    notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 *    notice, this list of conditions and the following disclaimer in the
24 *    documentation and/or other materials provided with the distribution.
25 * 3. Neither the name of the University nor the names of its contributors
26 *    may be used to endorse or promote products derived from this software
27 *    without specific prior written permission.
28 *
29 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
30 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 * SUCH DAMAGE.
40 *
41 *	@(#)instr.h	8.1 (Berkeley) 6/11/93
42 */
43
44/*
45 * An instruction.
46 */
47union instr {
48	int	i_int;			/* as a whole */
49
50	/*
51	 * Any instruction type.
52	 */
53	struct {
54		u_int	i_opcd:6;	/* first-level decode */
55		u_int	:25;
56		u_int	i_rc:1;
57	} i_any;
58
59	/*
60	 * Format A
61	 */
62	struct {
63		u_int	i_opcd:6;
64		u_int	i_frt:5;
65		u_int	i_fra:5;
66		u_int	i_frb:5;
67		u_int	i_frc:5;
68		u_int	i_xo:5;
69		u_int	i_rc:1;
70	} i_a;
71
72	/*
73	 * Format B
74	 */
75	struct {
76		u_int	i_opcd:6;
77		int	i_bo:5;
78		int	i_bi:5;
79		int	i_bd:14;
80		int	i_aa:1;
81		int	i_lk:1;
82	} i_b;
83
84	/*
85	 * Format D
86	 */
87	struct {
88		u_int	i_opcd:6;
89		u_int	i_rs:5;
90		u_int	i_ra:5;
91		int	i_d:16;
92	} i_d;
93
94	/*
95	 * Format DE
96	 */
97	struct {
98		u_int	i_opcd:6;
99		u_int	i_rs:5;
100		u_int	i_ra:5;
101		int	i_d:12;
102		u_int	i_xo:4;
103	} i_de;
104
105	/*
106	 * Format I
107	 */
108	struct {
109		u_int	i_opcd:6;
110		int	i_li:24;
111		int	i_aa:1;
112		int	i_lk:1;
113	} i_i;
114
115	/*
116	 * Format M
117	 */
118	struct {
119		u_int	i_opcd:6;
120		u_int	i_rs:5;
121		u_int	i_ra:5;
122		u_int	i_rb:5;
123		int	i_mb:5;
124		int	i_me:5;
125		u_int	i_rc:1;
126	} i_m;
127
128	/*
129	 * Format MD
130	 */
131	struct {
132		u_int	i_opcd:6;
133		u_int	i_rs:5;
134		u_int	i_ra:5;
135		u_int	i_rb:5;
136		int	i_sh1_5:5;
137		int	i_mb:6;
138		u_int	i_xo:3;
139		int	i_sh0:2;
140		u_int	i_rc:1;
141	} i_md;
142
143	/*
144	 * Format MDS
145	 */
146	struct {
147		u_int	i_opcd:6;
148		u_int	i_rs:5;
149		u_int	i_ra:5;
150		u_int	i_rb:5;
151		int	i_sh:5;
152		int	i_mb:6;
153		u_int	i_xo:4;
154		u_int	i_rc:1;
155	} i_mds;
156
157
158	/*
159	 * Format S
160	 */
161	struct {
162		u_int	i_opcd:6;
163		int	:24;
164		int	i_i:1;
165		int	:1;
166	} i_s;
167
168	/*
169	 * Format X
170	 */
171	struct {
172		u_int	i_opcd:6;
173		u_int	i_rs:5;
174		u_int	i_ra:5;
175		u_int	i_rb:5;
176		u_int	i_xo:10;
177		u_int	i_rc:1;
178	} i_x;
179
180	/*
181	 * Format XFL
182	 */
183	struct {
184		u_int	i_opcd:6;
185		int	:1;
186		int	i_flm:8;
187		int	:1;
188		int	i_frb:5;
189		u_int	i_xo:10;
190		int	:1;
191	} i_xfl;
192
193	/*
194	 * Format XFX
195	 */
196	struct {
197		u_int	i_opcd:6;
198		int	i_dcrn:10;
199		u_int	i_xo:10;
200		int	:1;
201	} i_xfx;
202
203	/*
204	 * Format XL
205	 */
206	struct {
207		u_int	i_opcd:6;
208		int	i_bt:5;
209		int	i_ba:5;
210		int	i_bb:5;
211		u_int	i_xo:10;
212		int	i_lk:1;
213	} i_xl;
214
215	/*
216	 * Format XS
217	 */
218	struct {
219		u_int	i_opcd:6;
220		u_int	i_rs:5;
221		u_int	i_ra:5;
222		int	i_sh0_4:5;
223		u_int	i_xo:9;
224		int	i_sh5:1;
225		u_int	i_rc:1;
226	} i_xs;
227
228};
229
230#define	i_rt	i_rs
231
232/*
233 * Primary opcode numbers:
234 */
235
236#define	OPC_TDI		0x02
237#define	OPC_TWI		0x03
238#define	OPC_MULLI	0x07
239#define	OPC_SUBFIC	0x08
240#define	OPC_BCE		0x09
241#define	OPC_CMPLI	0x0a
242#define	OPC_CMPI	0x0b
243#define	OPC_ADDIC	0x0c
244#define	OPC_ADDIC_DOT	0x0d
245#define	OPC_ADDI	0x0e
246#define	OPC_ADDIS	0x0f
247#define	OPC_BC		0x10
248#define	OPC_SC		0x11
249#define	OPC_B		0x12
250#define	OPC_branch_19	0x13
251#define	OPC_RLWIMI	0x14
252#define	OPC_RLWINM	0x15
253#define	OPC_BE		0x16
254#define	OPC_RLWNM	0x17
255#define	OPC_ORI		0x18
256#define	OPC_ORIS	0x19
257#define	OPC_XORI	0x1a
258#define	OPC_XORIS	0x1b
259#define	OPC_ANDI	0x1c
260#define	OPC_ANDIS	0x1d
261#define	OPC_dwe_rot_30	0x1e
262#define	OPC_integer_31	0x1f
263#define	OPC_LWZ		0x20
264#define	OPC_LWZU	0x21
265#define	OPC_LBZ		0x22
266#define	OPC_LBZU	0x23
267#define	OPC_STW		0x24
268#define	OPC_STWU	0x25
269#define	OPC_STB		0x26
270#define	OPC_STBU	0x27
271#define	OPC_LHZ		0x28
272#define	OPC_LHZU	0x29
273#define	OPC_LHA		0x2a
274#define	OPC_LHAU	0x2b
275#define	OPC_STH		0x2c
276#define	OPC_STHU	0x2d
277#define	OPC_LMW		0x2e
278#define	OPC_STMW	0x2f
279#define	OPC_LFS		0x30
280#define	OPC_LFSU	0x31
281#define	OPC_LFD		0x32
282#define	OPC_LFDU	0x33
283#define	OPC_STFS	0x34
284#define	OPC_STFSU	0x35
285#define	OPC_STFD	0x36
286#define	OPC_STFDU	0x37
287#define	OPC_load_st_58	0x3a
288#define	OPC_sp_fp_59	0x3b
289#define	OPC_load_st_62	0x3e
290#define	OPC_dp_fp_63	0x3f
291
292/*
293 * Opcode 31 sub-types (FP only)
294 */
295#define	OPC31_TW	0x004
296#define	OPC31_LFSX	0x217
297#define	OPC31_LFSUX	0x237
298#define	OPC31_LFDX	0x257
299#define	OPC31_LFDUX	0x277
300#define	OPC31_STFSX	0x297
301#define	OPC31_STFSUX	0x2b7
302#define	OPC31_STFDX	0x2d7
303#define	OPC31_STFDUX	0x2f7
304#define	OPC31_STFIWX	0x3d7
305
306/* Mask for all valid indexed FP load/store ops (except stfiwx) */
307#define	OPC31_FPMASK	0x31f
308#define	OPC31_FPOP	0x217
309
310/*
311 * Opcode 59 sub-types:
312 */
313
314#define	OPC59_FDIVS	0x12
315#define	OPC59_FSUBS	0x14
316#define	OPC59_FADDS	0x15
317#define	OPC59_FSQRTS	0x16
318#define	OPC59_FRES	0x18
319#define	OPC59_FMULS	0x19
320#define	OPC59_FMSUBS	0x1c
321#define	OPC59_FMADDS	0x1d
322#define	OPC59_FNMSUBS	0x1e
323#define	OPC59_FNMADDS	0x1f
324
325/*
326 * Opcode 62 sub-types:
327 */
328#define	OPC62_LDE	0x0
329#define	OPC62_LDEU	0x1
330#define	OPC62_LFSE	0x4
331#define	OPC62_LFSEU	0x5
332#define	OPC62_LFDE	0x6
333#define	OPC62_LFDEU	0x7
334#define	OPC62_STDE	0x8
335#define	OPC62_STDEU	0x9
336#define	OPC62_STFSE	0xc
337#define	OPC62_STFSEU	0xd
338#define	OPC62_STFDE	0xe
339#define	OPC62_STFDEU	0xf
340
341/*
342 * Opcode 63 sub-types:
343 *
344 * (The first group are masks....)
345 */
346
347#define	OPC63M_MASK	0x10
348#define	OPC63M_FDIV	0x12
349#define	OPC63M_FSUB	0x14
350#define	OPC63M_FADD	0x15
351#define	OPC63M_FSQRT	0x16
352#define	OPC63M_FSEL	0x17
353#define	OPC63M_FMUL	0x19
354#define	OPC63M_FRSQRTE	0x1a
355#define	OPC63M_FMSUB	0x1c
356#define	OPC63M_FMADD	0x1d
357#define	OPC63M_FNMSUB	0x1e
358#define	OPC63M_FNMADD	0x1f
359
360#define	OPC63_FCMPU	0x00
361#define	OPC63_FRSP	0x0c
362#define	OPC63_FCTIW	0x0e
363#define	OPC63_FCTIWZ	0x0f
364#define	OPC63_FCMPO	0x20
365#define	OPC63_MTFSB1	0x26
366#define	OPC63_FNEG	0x28
367#define	OPC63_MCRFS	0x40
368#define	OPC63_MTFSB0	0x46
369#define	OPC63_FMR	0x48
370#define	OPC63_MTFSFI	0x86
371#define	OPC63_FNABS	0x88
372#define	OPC63_FABS	0x108
373#define	OPC63_MFFS	0x247
374#define	OPC63_MTFSF	0x2c7
375#define	OPC63_FCTID	0x32e
376#define	OPC63_FCTIDZ	0x32f
377#define	OPC63_FCFID	0x34e
378
379/*
380 * FPU data types.
381 */
382#define FTYPE_LNG	-1	/* data = 64-bit signed long integer */
383#define	FTYPE_INT	0	/* data = 32-bit signed integer */
384#define	FTYPE_SNG	1	/* data = 32-bit float */
385#define	FTYPE_DBL	2	/* data = 64-bit double */
386
387