]> git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/powerpc/fpu/math_private.h
Split fenv_private.h out of math_private.h more consistently.
[thirdparty/glibc.git] / sysdeps / powerpc / fpu / math_private.h
1 /* Private inline math functions for powerpc.
2 Copyright (C) 2006-2018 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
18
19 #ifndef _PPC_MATH_PRIVATE_H_
20 #define _PPC_MATH_PRIVATE_H_
21
22 #include <sysdep.h>
23 #include <ldsodefs.h>
24 #include <dl-procinfo.h>
25
26 #include_next <math_private.h>
27
28 #if defined _ARCH_PWR9 && __HAVE_DISTINCT_FLOAT128
29 extern __always_inline _Float128
30 __ieee754_sqrtf128 (_Float128 __x)
31 {
32 _Float128 __z;
33 asm ("xssqrtqp %0,%1" : "=v" (__z) : "v" (__x));
34 return __z;
35 }
36 #endif
37
38 #if defined _ARCH_PWR5X
39
40 # ifndef __round
41 # define __round(x) \
42 ({ double __z; \
43 __asm __volatile ( \
44 " frin %0,%1\n" \
45 : "=f" (__z) \
46 : "f" (x)); \
47 __z; })
48 # endif
49 # ifndef __roundf
50 # define __roundf(x) \
51 ({ float __z; \
52 __asm __volatile ( \
53 " frin %0,%1\n" \
54 " frsp %0,%0\n" \
55 : "=f" (__z) \
56 : "f" (x)); \
57 __z; })
58 # endif
59
60 # ifndef __trunc
61 # define __trunc(x) \
62 ({ double __z; \
63 __asm __volatile ( \
64 " friz %0,%1\n" \
65 : "=f" (__z) \
66 : "f" (x)); \
67 __z; })
68 # endif
69 # ifndef __truncf
70 # define __truncf(x) \
71 ({ float __z; \
72 __asm __volatile ( \
73 " friz %0,%1\n" \
74 " frsp %0,%0\n" \
75 : "=f" (__z) \
76 : "f" (x)); \
77 __z; })
78 # endif
79
80 # ifndef __ceil
81 # define __ceil(x) \
82 ({ double __z; \
83 __asm __volatile ( \
84 " frip %0,%1\n" \
85 : "=f" (__z) \
86 : "f" (x)); \
87 __z; })
88 # endif
89 # ifndef __ceilf
90 # define __ceilf(x) \
91 ({ float __z; \
92 __asm __volatile ( \
93 " frip %0,%1\n" \
94 " frsp %0,%0\n" \
95 : "=f" (__z) \
96 : "f" (x)); \
97 __z; })
98 # endif
99
100 # ifndef __floor
101 # define __floor(x) \
102 ({ double __z; \
103 __asm __volatile ( \
104 " frim %0,%1\n" \
105 : "=f" (__z) \
106 : "f" (x)); \
107 __z; })
108 # endif
109 # ifndef __floorf
110 # define __floorf(x) \
111 ({ float __z; \
112 __asm __volatile ( \
113 " frim %0,%1\n" \
114 " frsp %0,%0\n" \
115 : "=f" (__z) \
116 : "f" (x)); \
117 __z; })
118 # endif
119
120 #endif /* defined _ARCH_PWR5X */
121
122 #endif /* _PPC_MATH_PRIVATE_H_ */