|
235 | 235 | double atanh (double x); |
236 | 236 | long double atanhl(long double x); |
237 | 237 |
|
238 | | - int isfinitef(float x); |
239 | | - int isfinite (double x); |
240 | | - int isfinitel(long double x); |
241 | | - |
242 | 238 | int ilogbf(float x); |
243 | 239 | int ilogb (double x); |
244 | 240 | int ilogbl(long double x); |
|
254 | 250 |
|
255 | 251 | namespace std |
256 | 252 | { |
257 | | - inline bool isfinite (float x) { return (::isfinitef(x) == 1); } |
258 | | - inline bool isfinite (double x) { return (::isfinite (x) == 1); } |
259 | | - inline bool isfinite (long double x) { return (::isfinitel(x) == 1); } |
| 253 | + namespace cmath_detail { |
| 254 | + |
| 255 | + __ATTR_CONST__ static __ATTR_ALWAYS_INLINE__ int isfinitef_impl(float my_x) |
| 256 | + { |
| 257 | + unsigned char my_exp { }; |
| 258 | + |
| 259 | + asm volatile |
| 260 | + ( |
| 261 | + "mov %0, %C1" "\n\t" |
| 262 | + "lsl %0" "\n\t" |
| 263 | + "mov %0, %D1" "\n\t" |
| 264 | + "rol %0" |
| 265 | + : "=&r" (my_exp) |
| 266 | + : "r" (my_x) |
| 267 | + ); |
| 268 | + |
| 269 | + return ((my_exp != static_cast<unsigned char>(0xFFU)) ? 1 : 0); |
| 270 | + } |
| 271 | + |
| 272 | + } // namespace cmath_detail |
| 273 | + |
| 274 | + inline bool isfinite (float x) { return (::std::cmath_detail::isfinitef_impl(x) == 1); } |
| 275 | + inline bool isfinite (double x) { return (::std::cmath_detail::isfinitef_impl(static_cast<float>(x)) == 1); } |
| 276 | + inline bool isfinite (long double x) { return (::std::cmath_detail::isfinitef_impl(static_cast<float>(x)) == 1); } |
260 | 277 | inline bool isnan (float x) { return (__BUILTIN_ISNANF(x) == 1); } |
261 | 278 | inline bool isnan (double x) { return (__BUILTIN_ISNAN (x) == 1); } |
262 | 279 | inline bool isnan (long double x) { return (__BUILTIN_ISNANL(x) == 1); } |
|
266 | 283 |
|
267 | 284 | namespace cmath_detail { |
268 | 285 |
|
269 | | - inline bool isinf_impl(float x) { return (__BUILTIN_ISINFF(x) == 1); } |
270 | | - inline bool isinf_impl(double x) { return (__BUILTIN_ISINF (x) == 1); } |
271 | | - inline bool isinf_impl(long double x) { return (__BUILTIN_ISINFL(x) == 1); } |
| 286 | + __ATTR_CONST__ static __ATTR_ALWAYS_INLINE__ bool isinf_impl(float x) { return (__BUILTIN_ISINFF(x) == 1); } |
| 287 | + __ATTR_CONST__ static __ATTR_ALWAYS_INLINE__ bool isinf_impl(double x) { return (__BUILTIN_ISINF (x) == 1); } |
| 288 | + __ATTR_CONST__ static __ATTR_ALWAYS_INLINE__ bool isinf_impl(long double x) { return (__BUILTIN_ISINFL(x) == 1); } |
272 | 289 |
|
273 | 290 | } // namespace cmath_detail |
274 | 291 |
|
275 | | - inline bool isinf(float x) { return cmath_detail::isinf_impl(x); } |
276 | | - inline bool isinf(double x) { return cmath_detail::isinf_impl(x); } |
277 | | - inline bool isinf(long double x) { return cmath_detail::isinf_impl(x); } |
| 292 | + inline bool isinf(float x) { return ::std::cmath_detail::isinf_impl(x); } |
| 293 | + inline bool isinf(double x) { return ::std::cmath_detail::isinf_impl(x); } |
| 294 | + inline bool isinf(long double x) { return ::std::cmath_detail::isinf_impl(x); } |
278 | 295 |
|
279 | 296 | namespace cmath_detail { |
280 | 297 |
|
|
321 | 338 |
|
322 | 339 | } // namespace cmath_detail |
323 | 340 |
|
324 | | - inline int fpclassify(float x) { return cmath_detail::fpclassify_impl(x); } |
325 | | - inline int fpclassify(double x) { return cmath_detail::fpclassify_impl(x); } |
326 | | - inline int fpclassify(long double x) { return cmath_detail::fpclassify_impl(x); } |
| 341 | + inline int fpclassify(float x) { return ::std::cmath_detail::fpclassify_impl(x); } |
| 342 | + inline int fpclassify(double x) { return ::std::cmath_detail::fpclassify_impl(x); } |
| 343 | + inline int fpclassify(long double x) { return ::std::cmath_detail::fpclassify_impl(x); } |
327 | 344 |
|
328 | 345 | inline int ilogb (float x) { return ::ilogbf (x); } |
329 | 346 | inline int ilogb (double x) { return ::ilogb (x); } |
|
720 | 737 |
|
721 | 738 | } // namespace cmath_detail |
722 | 739 |
|
723 | | - inline bool isinf(float x) { return cmath_detail::isinf_impl(x); } |
724 | | - inline bool isinf(double x) { return cmath_detail::isinf_impl(x); } |
725 | | - inline bool isinf(long double x) { return cmath_detail::isinf_impl(x); } |
| 740 | + inline bool isinf(float x) { return ::std::cmath_detail::isinf_impl(x); } |
| 741 | + inline bool isinf(double x) { return ::std::cmath_detail::isinf_impl(x); } |
| 742 | + inline bool isinf(long double x) { return ::std::cmath_detail::isinf_impl(x); } |
726 | 743 |
|
727 | 744 | using ::isnan; |
728 | 745 | using ::abs; |
|
774 | 791 |
|
775 | 792 | } // namespace cmath_detail |
776 | 793 |
|
777 | | - inline int fpclassify(float x) { return cmath_detail::fpclassify_impl(x); } |
778 | | - inline int fpclassify(double x) { return cmath_detail::fpclassify_impl(x); } |
779 | | - inline int fpclassify(long double x) { return cmath_detail::fpclassify_impl(x); } |
| 794 | + inline int fpclassify(float x) { return ::std::cmath_detail::fpclassify_impl(x); } |
| 795 | + inline int fpclassify(double x) { return ::std::cmath_detail::fpclassify_impl(x); } |
| 796 | + inline int fpclassify(long double x) { return ::std::cmath_detail::fpclassify_impl(x); } |
780 | 797 |
|
781 | 798 | using ::modf; |
782 | 799 | using ::floor; |
|
0 commit comments