summaryrefslogtreecommitdiff
path: root/sys/arch/alpha/include/fpu.h
blob: 3c91ae2eeaee7deec212a804078efb2ff6d84cb3 (plain)
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_ */