|
|
1.1 root 1: /* @(#)reg.h 1.16 92/04/28 SMI */
2:
3: /*
4: * Copyright (c) 1985 by Sun Microsystems, Inc.
5: */
6:
7: #ifndef _sparc_reg_h
8: #define _sparc_reg_h
9:
10: /*
11: * Location of the users' stored
12: * registers relative to R0.
13: * Usage is u.u_ar0[XX].
14: */
15: #define PSR (0)
16: #define PC (1)
17: #define nPC (2)
18: #define SPARC_Y (3)
19: #define G1 (4)
20: #define G2 (5)
21: #define G3 (6)
22: #define G4 (7)
23: #define G5 (8)
24: #define G6 (9)
25: #define G7 (10)
26: #define O0 (11)
27: #define O1 (12)
28: #define O2 (13)
29: #define O3 (14)
30: #define O4 (15)
31: #define O5 (16)
32: #define O6 (17)
33: #define O7 (18)
34:
35: /* the following defines are for portability */
36: #define PS PSR
37: #define SP O6
38: #define R0 O0
39: #define R1 O1
40:
41: /*
42: * And now for something completely the same...
43: */
44: #ifndef __ASSEMBLER__
45: struct regs {
46: int r_psr; /* processor status register */
47: int r_pc; /* program counter */
48: int r_npc; /* next program counter */
49: int r_y; /* the y register */
50: int r_g1; /* user global regs */
51: int r_g2;
52: int r_g3;
53: int r_g4;
54: int r_g5;
55: int r_g6;
56: int r_g7;
57: int r_o0;
58: int r_o1;
59: int r_o2;
60: int r_o3;
61: int r_o4;
62: int r_o5;
63: int r_o6;
64: int r_o7;
65: };
66:
67: #define r_ps r_psr /* for portablility */
68: #define r_r0 r_o0
69: #define r_sp r_o6
70:
71: #endif !__ASSEMBLER__
72:
73: /*
74: * Floating point definitions.
75: */
76:
77: #define FPU /* we have an external float unit */
78:
79: #ifndef __ASSEMBLER__
80:
81: #define FQ_DEPTH 16 /* maximum instuctions in FQ */
82:
83: /*
84: * struct fpu_status is the floating point processor state
85: * struct fpu is the sum total of all possible floating point state
86: * which includes the state of external floating point hardware,
87: * fpa registers, etc..., if it exists.
88: */
89: struct fpq {
90: unsigned long *addr; /* address */
91: unsigned long instr; /* instruction */
92: };
93: struct fq {
94: union { /* FPU inst/addr queue */
95: double whole;
96: struct fpq fpq;
97: } FQu;
98: };
99:
100:
101: #define FPU_REGS_TYPE unsigned
102: #define FPU_FSR_TYPE unsigned
103:
104: struct fpu {
105: union { /* FPU floating point regs */
106: FPU_REGS_TYPE Fpu_regs[32]; /* 32 singles */
107: double Fpu_dregs[16]; /* 16 doubles */
108: } fpu_fr;
109: FPU_FSR_TYPE Fpu_fsr; /* FPU status register */
110: unsigned Fpu_flags; /* control flags */
111: unsigned Fpu_extra; /* extra word */
112: unsigned Fpu_qcnt; /* count of valid entries in fps_q */
113: struct fq Fpu_q[FQ_DEPTH]; /* FPU instruction address queue */
114: };
115:
116: #define fpu_regs fpu_fr.Fpu_regs
117: #define fpu_dregs fpu_fr.Fpu_dregs
118: #define fpu_fsr Fpu_fsr
119: #define fpu_flags Fpu_flags
120: #define fpu_extra Fpu_extra
121: #define fpu_q Fpu_q
122: #define fpu_qcnt Fpu_qcnt
123:
124: #endif !__ASSEMBLER__
125:
126:
127: /*
128: * Definition of bits in the Sun-4 FSR (Floating-point Status Register)
129: * ________________________________________________________________________
130: * | RD | RP | TEM | NS | res | vers | FTT | QNE | PR | FCC | AEXC | CEXC |
131: * |-----|---- |-----|----|-----|------|-----|-----|----|-----|------|------|
132: * 31 30 29 28 27 23 22 21 20 19 17 16 14 13 12 11 10 9 5 4 0
133: */
134: #define FSR_CEXC 0x0000001f /* Current Exception */
135: #define FSR_AEXC 0x000003e0 /* ieee accrued exceptions */
136: #define FSR_FCC 0x00000c00 /* Floating-point Condition Codes */
137: #define FSR_PR 0x00001000 /* Partial Remainder */
138: #define FSR_QNE 0x00002000 /* Queue not empty */
139: #define FSR_FTT 0x0001c000 /* Floating-point Trap Type */
140: #define FSR_VERS 0x000e0000 /* version field */
141: #define FSR_RESV 0x00300000 /* reserved */
142: #define FSR_NS 0x00400000 /* non-standard fp */
143: #define FSR_TEM 0x0f800000 /* ieee Trap Enable Mask */
144: #define FSR_RP 0x30000000 /* Rounding Precision */
145: #define FSR_RD 0xc0000000 /* Rounding Direction */
146:
147: #define FSR_VERS_SHIFT (17) /* amount to shift version field */
148:
149: /*
150: * Definition of CEXC (Current EXCeption) bit field of fsr
151: */
152: #define FSR_CEXC_NX 0x00000001 /* inexact */
153: #define FSR_CEXC_DZ 0x00000002 /* divide-by-zero */
154: #define FSR_CEXC_UF 0x00000004 /* underflow */.
155: #define FSR_CEXC_OF 0x00000008 /* overflow */
156: #define FSR_CEXC_NV 0x00000010 /* invalid */
157:
158: /*
159: * Definition of AEXC (Accrued EXCeption) bit field of fsr
160: */
161: #define FSR_AEXC_NX (0x1 << 5) /* inexact */
162: #define FSR_AEXC_DZ (0x2 << 5) /* divide-by-zero */
163: #define FSR_AEXC_UF (0x4 << 5) /* underflow */.
164: #define FSR_AEXC_OF (0x8 << 5) /* overflow */
165: #define FSR_AEXC_NV (0x10 << 5) /* invalid */
166:
167: /*
168: * Defintion of FTT (Floating-point Trap Type) field within the FSR
169: */
170: #define FTT_NONE 0 /* no excepitons */
171: #define FTT_IEEE 1 /* IEEE exception */
172: #define FTT_UNFIN 2 /* unfinished fpop */
173: #define FTT_UNIMP 3 /* unimplemented fpop */
174: #define FTT_SEQ 4 /* sequence error */
175: #define FTT_ALIGN 5 /* alignment, by software convention */
176: #define FTT_DFAULT 6 /* data fault, by software convention */
177: #define FSR_FTT_SHIFT 14 /* shift needed to justfy ftt field */
178: #define FSR_FTT_IEEE (FTT_IEEE << FSR_FTT_SHIFT)
179: #define FSR_FTT_UNFIN (FTT_UNFIN << FSR_FTT_SHIFT)
180: #define FSR_FTT_UNIMP (FTT_UNIMP << FSR_FTT_SHIFT)
181: #define FSR_FTT_SEQ (FTT_SEQ << FSR_FTT_SHIFT)
182: #define FSR_FTT_ALIGN (FTT_ALIGN << FSR_FTT_SHIFT)
183: #define FSR_FTT_DFAULT (FTT_DFAULT << FSR_FTT_SHIFT)
184:
185: /*
186: * Values of VERS (version) field within the FSR
187: * NOTE: these values are overloaded; the cpu type must be used to
188: * further discriminate amongst these. For that reason, no #defines are
189: * provided.
190: *
191: * Version cpu = 21-22, 51-54 cpu = 23-24, 55-57
192: * 0 Weitek 1164/5 (FAB 1-4) TI 8847
193: * 1 Weitek 1164/5 (FAB 5-6) LSI L64814
194: * 2 TI 8847 TI TMS390C602A
195: * 3 Weitek 3170 Weitek 3171
196: * 4 Meiko ?
197: * 5 ? ?
198: * 6 ? ?
199: * 7 No FP Hardware No FP Hardware
200: */
201:
202:
203: /*
204: * Definition of TEM (Trap Enable Mask) bit field of fsr
205: */
206: #define FSR_TEM_NX (0x1 << 23) /* inexact */
207: #define FSR_TEM_DZ (0x2 << 23) /* divide-by-zero */
208: #define FSR_TEM_UF (0x4 << 23) /* underflow */.
209: #define FSR_TEM_OF (0x8 << 23) /* overflow */
210: #define FSR_TEM_NV (0x10 << 23) /* invalid */
211:
212: /*
213: * Definition of RP (Rounding Precision) field of fsr
214: */
215: #define RP_DBLEXT 0 /* double-extended */
216: #define RP_SINGLE 1 /* single */
217: #define RP_DOUBLE 2 /* double */
218: #define RP_RESERVED 3 /* unused and reserved */
219:
220: /*
221: * Defintion of RD (Rounding Direction) field of fsr
222: */
223: #define RD_NEAR 0 /* nearest or even if tie */
224: #define RD_ZER0 1 /* to zero */
225: #define RD_POSINF 2 /* positive infinity */
226: #define RD_NEGINF 3 /* negative infinity */
227:
228: /*
229: * Definition of the FP enable flags of the pcb struct
230: * Normal operation, all flags are zero
231: */
232: #define FP_UNINITIALIZED 1
233: #define FP_STARTSIG 2
234: #define FP_DISABLE 4
235: #define FP_ENABLE 8
236:
237: #ifndef __ASSEMBLER__
238: /*
239: * How a register window looks on the stack.
240: */
241: struct rwindow {
242: int rw_local[8]; /* locals */
243: int rw_in[8]; /* ins */
244: };
245:
246: #define rw_fp rw_in[6] /* frame pointer */
247: #define rw_rtn rw_in[7] /* return address */
248:
249: #endif !__ASSEMBLER__
250:
251:
252: /*
253: * Definition of bits in the Sun-4 PSR (Processor Status Register)
254: * ____________________________________________________________________
255: * | IMPL | VER | ICC | res | EC | EF | PIL | S | PS | ET | CWP |
256: * |-----------|-----|------|-----|----|----|-------|---|----|----|-----|
257: * 31 28 27 24 23 20 19 14 13 12 11 8 7 6 5 4 0
258: */
259:
260:
261: struct p_status {
262: union {
263: unsigned int psr;
264: struct {
265: unsigned int
266: impl:4,
267: ver:4,
268: icc:4,
269: reserved:6,
270: ec:1,
271: ef:1,
272: pil:4,
273: s:1,
274: ps:1,
275: et:1,
276: cwp:5;
277: } psr_bits;
278: } PSRREG;
279: };
280:
281: struct f_status {
282: union {
283: FPU_FSR_TYPE Fpu_fsr; /* FPU status register */
284: struct {
285: unsigned int
286: rd:2,
287: rp:2,
288: tem:5,
289: res:6,
290: ftt:3,
291: qne:1,
292: pr:1,
293: fcc:2,
294: aexc:5,
295: cexc:5;
296: } Fpu_fsr_bits;
297: } FPUREG;
298: };
299:
300: #endif /*!_sparc_reg_h*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.