Add NT_PPC_PKEY from Linux 4.16 to elf.h.
[glibc.git] / sysdeps / powerpc / fpu / math_private.h
blobb9fc721257235a549873beb9e31fa30085b76d4a
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.
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.
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.
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/>. */
19 #ifndef _PPC_MATH_PRIVATE_H_
20 #define _PPC_MATH_PRIVATE_H_
22 #include <sysdep.h>
23 #include <ldsodefs.h>
24 #include <dl-procinfo.h>
25 #include <fenv_private.h>
27 /* Avoid putting floating point values in memory. */
28 # define math_opt_barrier(x) \
29 ({ __typeof (x) __x = (x); __asm ("" : "+dwa" (__x)); __x; })
30 # define math_force_eval(x) \
31 ({ __typeof (x) __x = (x); __asm __volatile__ ("" : : "dwa" (__x)); })
33 #include_next <math_private.h>
35 #if defined _ARCH_PWR9 && __HAVE_DISTINCT_FLOAT128
36 extern __always_inline _Float128
37 __ieee754_sqrtf128 (_Float128 __x)
39 _Float128 __z;
40 asm ("xssqrtqp %0,%1" : "=v" (__z) : "v" (__x));
41 return __z;
43 #endif
45 #if defined _ARCH_PWR5X
47 # ifndef __round
48 # define __round(x) \
49 ({ double __z; \
50 __asm __volatile ( \
51 " frin %0,%1\n" \
52 : "=f" (__z) \
53 : "f" (x)); \
54 __z; })
55 # endif
56 # ifndef __roundf
57 # define __roundf(x) \
58 ({ float __z; \
59 __asm __volatile ( \
60 " frin %0,%1\n" \
61 " frsp %0,%0\n" \
62 : "=f" (__z) \
63 : "f" (x)); \
64 __z; })
65 # endif
67 # ifndef __trunc
68 # define __trunc(x) \
69 ({ double __z; \
70 __asm __volatile ( \
71 " friz %0,%1\n" \
72 : "=f" (__z) \
73 : "f" (x)); \
74 __z; })
75 # endif
76 # ifndef __truncf
77 # define __truncf(x) \
78 ({ float __z; \
79 __asm __volatile ( \
80 " friz %0,%1\n" \
81 " frsp %0,%0\n" \
82 : "=f" (__z) \
83 : "f" (x)); \
84 __z; })
85 # endif
87 # ifndef __ceil
88 # define __ceil(x) \
89 ({ double __z; \
90 __asm __volatile ( \
91 " frip %0,%1\n" \
92 : "=f" (__z) \
93 : "f" (x)); \
94 __z; })
95 # endif
96 # ifndef __ceilf
97 # define __ceilf(x) \
98 ({ float __z; \
99 __asm __volatile ( \
100 " frip %0,%1\n" \
101 " frsp %0,%0\n" \
102 : "=f" (__z) \
103 : "f" (x)); \
104 __z; })
105 # endif
107 # ifndef __floor
108 # define __floor(x) \
109 ({ double __z; \
110 __asm __volatile ( \
111 " frim %0,%1\n" \
112 : "=f" (__z) \
113 : "f" (x)); \
114 __z; })
115 # endif
116 # ifndef __floorf
117 # define __floorf(x) \
118 ({ float __z; \
119 __asm __volatile ( \
120 " frim %0,%1\n" \
121 " frsp %0,%0\n" \
122 : "=f" (__z) \
123 : "f" (x)); \
124 __z; })
125 # endif
127 #endif /* defined _ARCH_PWR5X */
129 #endif /* _PPC_MATH_PRIVATE_H_ */