1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
/* $NetBSD: fpu.h,v 1.8 2021/07/22 01:39:18 thorpej Exp $ */
/*-
* Copyright (c) 2001 Ross Harvey
* All rights reserved.
*
* This software was written for NetBSD.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _ALPHA_FPU_H_
#define _ALPHA_FPU_H_
/*
* Most of these next definitions were moved from <ieeefp.h>. Apparently the
* names happen to match those exported by Compaq and Linux from their fpu.h
* files.
*/
/*
* Bits in the Alpha Floating Point Control register. This is the hardware
* register, and should not be directly manipulated by application software.
*/
#define FPCR_SUM __BIT(63) /* Summary (OR of all exception bits) */
#define FPCR_INED __BIT(62) /* Inexact trap Disable */
#define FPCR_UNFD __BIT(61) /* Underflow trap Disable */
#define FPCR_UNDZ __BIT(60) /* Underflow to Zero */
#define FPCR_DYN_RM __BITS(58,59) /* Dynamic Rounding Mode */
/* 00 Chopped */
/* 01 Minus Infinity */
/* 10 Normal (round nearest) */
/* 11 Plus Infinity */
#define FPCR_IOV __BIT(57) /* Integer Overflow */
#define FPCR_INE __BIT(56) /* Inexact Result */
#define FPCR_UNF __BIT(55) /* Underflow */
#define FPCR_OVF __BIT(54) /* Overflow */
#define FPCR_DZE __BIT(53) /* Division By Zero */
#define FPCR_INV __BIT(52) /* Invalid Operation */
#define FPCR_OVFD __BIT(51) /* Overflow trap Disable */
#define FPCR_DZED __BIT(50) /* Division By Zero trap Disable */
#define FPCR_INVD __BIT(49) /* Invalid Operation trap Disable */
#define FPCR_DNZ __BIT(48) /* Denormal Operands to Zero */
#define FPCR_DNOD __BIT(47) /* Denormal Operation tap Disable */
#define FPCR_MIRRORED (FPCR_INE | FPCR_UNF | FPCR_OVF | FPCR_DZE | FPCR_INV)
#define FPCR_MIR_START 52
/* NetBSD default - no traps enabled, round-to-nearest */
#define FPCR_DEFAULT (__SHIFTIN(FP_RN, FPCR_DYN_RM) | \
FPCR_INED | FPCR_UNFD | FPCR_OVFD | \
FPCR_DZED | FPCR_INVD | FPCR_DNOD)
/*
* IEEE Floating Point Control (FP_C) Quadword. This is a software
* virtual register that abstracts the FPCR and software complation
* performed by the kernel.
*
* The AARM specifies the bit positions of the software word used for
* user mode interface to the control and status of the kernel completion
* routines. Although it largely just redefines the FPCR, it shuffles
* the bit order. The names of the bits are defined in the AARM, and
* the definition prefix can easily be determined from public domain
* programs written to either the Compaq or Linux interfaces, which
* appear to be identical.
*
* Bits 63-48 are reserved for implementation software.
* Bits 47-23 are reserved for future archiecture definition.
* Bits 16-12 are reserved for implementation software.
* Bits 11-7 are reserved for future architecture definition.
* Bit 0 is reserved for implementation software.
*/
#define IEEE_STATUS_DNO __BIT(22) /* Denormal Operand */
#define IEEE_STATUS_INE __BIT(21) /* Inexact Result */
#define IEEE_STATUS_UNF __BIT(20) /* Underflow */
#define IEEE_STATUS_OVF __BIT(19) /* Overflow */
#define IEEE_STATUS_DZE __BIT(18) /* Division By Zero */
#define IEEE_STATUS_INV __BIT(17) /* Invalid Operation */
#define IEEE_TRAP_ENABLE_DNO __BIT(6) /* Denormal Operation trap */
#define IEEE_TRAP_ENABLE_INE __BIT(5) /* Inexact Result trap */
#define IEEE_TRAP_ENABLE_UNF __BIT(4) /* Underflow trap */
#define IEEE_TRAP_ENABLE_OVF __BIT(3) /* Overflow trap */
#define IEEE_TRAP_ENABLE_DZE __BIT(2) /* Division By Zero trap */
#define IEEE_TRAP_ENABLE_INV __BIT(1) /* Invalid Operation trap */
#define IEEE_INHERIT __BIT(14)
#define IEEE_MAP_UMZ __BIT(13) /* Map underflowed outputs to zero */
#define IEEE_MAP_DMZ __BIT(12) /* Map denormal inputs to zero */
#define FP_C_ALLBITS __BITS(1,22)
#define FP_C_MIRRORED (IEEE_STATUS_INE | IEEE_STATUS_UNF | IEEE_STATUS_OVF \
| IEEE_STATUS_DZE | IEEE_STATUS_INV)
#define FP_C_MIR_START 17
/* NetBSD default - no traps enabled (see FPCR default) */
#define FP_C_DEFAULT 0
#ifdef _KERNEL
#define FLD_MASK(len) ((1UL << (len)) - 1)
#define FLD_CLEAR(obj, origin, len) \
((obj) & ~(FLD_MASK(len) << (origin)))
#define FLD_INSERT(obj, origin, len, value) \
(FLD_CLEAR(obj, origin, len) | (value) << origin)
#define FP_C_TO_NETBSD_MASK(fp_c) ((fp_c) >> 1 & 0x3f)
#define FP_C_TO_NETBSD_FLAG(fp_c) ((fp_c) >> 17 & 0x3f)
#define NETBSD_MASK_TO_FP_C(m) (((m) & 0x3f) << 1)
#define NETBSD_FLAG_TO_FP_C(s) (((s) & 0x3f) << 17)
#define CLEAR_FP_C_MASK(fp_c) ((fp_c) & ~(0x3f << 1))
#define CLEAR_FP_C_FLAG(fp_c) ((fp_c) & ~(0x3f << 17))
#define SET_FP_C_MASK(fp_c, m) (CLEAR_FP_C_MASK(fp_c) | NETBSD_MASK_TO_FP_C(m))
#define SET_FP_C_FLAG(fp_c, m) (CLEAR_FP_C_FLAG(fp_c) | NETBSD_FLAG_TO_FP_C(m))
#endif /* _KERNEL */
#endif /* _ALPHA_FPU_H_ */
|