]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/sparc/fpu/fenv_private.h
Make fma use of Dekker and Knuth algorithms use round-to-nearest (bug 14796).
[thirdparty/glibc.git] / sysdeps / sparc / fpu / fenv_private.h
CommitLineData
5df98260
DM
1#ifndef FENV_PRIVATE_H
2#define FENV_PRIVATE_H 1
3
4#include <fenv.h>
5
6static __always_inline void
7libc_feholdexcept (fenv_t *e)
8{
9 fenv_t etmp;
10 __fenv_stfsr(etmp);
11 *(e) = etmp;
12 etmp = etmp & ~((0x1f << 23) | FE_ALL_EXCEPT);
13 __fenv_ldfsr(etmp);
14}
15
5b5b04d6
JM
16static __always_inline void
17libc_fesetround (int r)
18{
19 fenv_t etmp;
20 __fenv_stfsr(etmp);
21 etmp = (etmp & ~__FE_ROUND_MASK) | (r);
22 __fenv_ldfsr(etmp);
23}
24
5df98260
DM
25static __always_inline void
26libc_feholdexcept_setround (fenv_t *e, int r)
27{
28 fenv_t etmp;
29 __fenv_stfsr(etmp);
30 *(e) = etmp;
31 etmp = etmp & ~((0x1f << 23) | FE_ALL_EXCEPT);
32 etmp = (etmp & ~__FE_ROUND_MASK) | (r);
33 __fenv_ldfsr(etmp);
34}
35
36static __always_inline int
37libc_fetestexcept (int e)
38{
39 fenv_t etmp;
40 __fenv_stfsr(etmp);
41 return etmp & (e) & FE_ALL_EXCEPT;
42}
43
44static __always_inline void
45libc_fesetenv (fenv_t *e)
46{
47 __fenv_ldfsr(*e);
48}
49
50static __always_inline int
51libc_feupdateenv_test (fenv_t *e, int ex)
52{
53 fenv_t etmp;
54
55 __fenv_stfsr(etmp);
56 etmp &= FE_ALL_EXCEPT;
57
58 __fenv_ldfsr(*e);
59
60 __feraiseexcept (etmp);
61
62 return etmp & ex;
63}
64
65static __always_inline void
66libc_feupdateenv (fenv_t *e)
67{
68 libc_feupdateenv_test (e, 0);
69}
70
71static __always_inline void
72libc_feholdsetround (fenv_t *e, int r)
73{
74 fenv_t etmp;
75 __fenv_stfsr(etmp);
76 *(e) = etmp;
77 etmp = (etmp & ~__FE_ROUND_MASK) | (r);
78 __fenv_ldfsr(etmp);
79}
80
81static __always_inline void
82libc_feresetround (fenv_t *e)
83{
84 fenv_t etmp;
85 __fenv_stfsr(etmp);
86 etmp = (etmp & ~__FE_ROUND_MASK) | (*e & __FE_ROUND_MASK);
87 __fenv_ldfsr(etmp);
88}
89
90#define libc_feholdexceptf libc_feholdexcept
5b5b04d6 91#define libc_fesetroundf libc_fesetround
5df98260
DM
92#define libc_feholdexcept_setroundf libc_feholdexcept_setround
93#define libc_fetestexceptf libc_fetestexcept
94#define libc_fesetenvf libc_fesetenv
95#define libc_feupdateenv_testf libc_feupdateenv_test
96#define libc_feupdateenvf libc_feupdateenv
97#define libc_feholdsetroundf libc_feholdsetround
98#define libc_feresetroundf libc_feresetround
99#define libc_feholdexcept libc_feholdexcept
5b5b04d6 100#define libc_fesetround libc_fesetround
5df98260
DM
101#define libc_feholdexcept_setround libc_feholdexcept_setround
102#define libc_fetestexcept libc_fetestexcept
103#define libc_fesetenv libc_fesetenv
104#define libc_feupdateenv_test libc_feupdateenv_test
105#define libc_feupdateenv libc_feupdateenv
106#define libc_feholdsetround libc_feholdsetround
107#define libc_feresetround libc_feresetround
108#define libc_feholdexceptl libc_feholdexcept
5b5b04d6 109#define libc_fesetroundl libc_fesetround
5df98260
DM
110#define libc_feholdexcept_setroundl libc_feholdexcept_setround
111#define libc_fetestexceptl libc_fetestexcept
112#define libc_fesetenvl libc_fesetenv
113#define libc_feupdateenv_testl libc_feupdateenv_test
114#define libc_feupdateenvl libc_feupdateenv
115#define libc_feholdsetroundl libc_feholdsetround
116#define libc_feresetroundl libc_feresetround
117
118#endif /* FENV_PRIVATE_H */