1 /* Copyright (c) 2017  SiFive Inc. All rights reserved.
2 
3    This copyrighted material is made available to anyone wishing to use,
4    modify, copy, or redistribute it subject to the terms and conditions
5    of the FreeBSD License.   This program is distributed in the hope that
6    it will be useful, but WITHOUT ANY WARRANTY expressed or implied,
7    including the implied warranties of MERCHANTABILITY or FITNESS FOR
8    A PARTICULAR PURPOSE.  A copy of this license is available at
9    http://www.opensource.org/licenses.
10 */
11 
12 #ifndef _SYS_FENV_H
13 #define _SYS_FENV_H
14 
15 #include <stddef.h>
16 
17 #if defined(__riscv_flen) || defined(__riscv_zfinx)
18 
19 /* Per "The RISC-V Instruction Set Manual: Volume I: User-Level ISA:
20  * Version 2.1", Section 8.2, "Floating-Point Control and Status
21  * Register":
22  *
23  * Flag Mnemonic Flag Meaning
24  * ------------- -----------------
25  * NV            Invalid Operation
26  * DZ            Divide by Zero
27  * OF            Overflow
28  * UF            Underflow
29  * NX            Inexact
30  */
31 
32 #define FE_INVALID   0x00000010
33 #define FE_DIVBYZERO 0x00000008
34 #define FE_OVERFLOW  0x00000004
35 #define FE_UNDERFLOW 0x00000002
36 #define FE_INEXACT   0x00000001
37 
38 #define FE_ALL_EXCEPT (FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW|FE_UNDERFLOW|FE_INEXACT)
39 
40 /* Per "The RISC-V Instruction Set Manual: Volume I: User-Level ISA:
41  * Version 2.1", Section 8.2, "Floating-Point Control and Status
42  * Register":
43  *
44  * Rounding Mode  Mnemonic Meaning  Meaning
45  * -------------  ----------------  -------
46  * 000            RNE               Round to Nearest, ties to Even
47  * 001            RTZ               Round towards Zero
48  * 010            RDN               Round Down (towards −∞)
49  * 011            RUP               Round Up (towards +∞)
50  * 100            RMM               Round to Nearest, ties to Max Magnitude
51  * 101                              Invalid. Reserved for future use.
52  * 110                              Invalid. Reserved for future use.
53  * 111                              In instruction’s rm field, selects dynamic rounding mode;
54  *                                  In Rounding Mode register, Invalid
55  */
56 
57 #define FE_TONEAREST_MM 0x00000004
58 #define FE_UPWARD     	0x00000003
59 #define FE_DOWNWARD   	0x00000002
60 #define FE_TOWARDZERO 	0x00000001
61 #define FE_TONEAREST  	0x00000000
62 
63 #define FE_RMODE_MASK   0x7
64 #endif
65 
66 /* Per "The RISC-V Instruction Set Manual: Volume I: User-Level ISA:
67  * Version 2.1":
68  *
69  * "The F extension adds 32 floating-point registers, f0–f31, each 32
70  * bits wide, and a floating-point control and status register fcsr,
71  * which contains the operating mode and exception status of the
72  * floating-point unit."
73  */
74 
75 typedef size_t fenv_t;
76 typedef size_t fexcept_t;
77 
78 #if !defined(__declare_fenv_inline) && defined(__declare_extern_inline)
79 #define	__declare_fenv_inline(type) __declare_extern_inline(type)
80 #endif
81 
82 #ifdef __declare_fenv_inline
83 #if defined(__riscv_flen) || defined(__riscv_zfinx)
84 #include <machine/fenv-fp.h>
85 #else
86 #include <machine/fenv-softfloat.h>
87 #endif
88 #endif
89 
90 #endif /* _SYS_FENV_H */
91