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