1 /* Test for signaling NaN. 2 Copyright (C) 2013-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 #include "quadmath-imp.h" 20 21 int 22 issignalingq (__float128 x) 23 { 24 uint64_t hxi, lxi __attribute__ ((unused)); 25 GET_FLT128_WORDS64 (hxi, lxi, x); 26 #if HIGH_ORDER_BIT_IS_SET_FOR_SNAN 27 /* We only have to care about the high-order bit of x's significand, because 28 having it set (sNaN) already makes the significand different from that 29 used to designate infinity. */ 30 return ((hxi & UINT64_C (0x7fff800000000000)) 31 == UINT64_C (0x7fff800000000000)); 32 #else 33 /* To keep the following comparison simple, toggle the quiet/signaling bit, 34 so that it is set for sNaNs. This is inverse to IEEE 754-2008 (as well as 35 common practice for IEEE 754-1985). */ 36 hxi ^= UINT64_C (0x0000800000000000); 37 /* If lxi != 0, then set any suitable bit of the significand in hxi. */ 38 hxi |= (lxi | -lxi) >> 63; 39 /* We have to compare for greater (instead of greater or equal), because x's 40 significand being all-zero designates infinity not NaN. */ 41 return (hxi & UINT64_C (0x7fffffffffffffff)) > UINT64_C (0x7fff800000000000); 42 #endif 43 } 44