123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- /* Subroutines for long double support.
- Copyright (C) 2000-2022 Free Software Foundation, Inc.
- This file is part of GCC.
- GCC is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3, or (at your option)
- any later version.
- GCC is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- Under Section 7 of GPL version 3, you are granted additional
- permissions described in the GCC Runtime Library Exception, version
- 3.1, as published by the Free Software Foundation.
- You should have received a copy of the GNU General Public License and
- a copy of the GCC Runtime Library Exception along with this program;
- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
- <http://www.gnu.org/licenses/>. */
- /* HPUX TFmode compare requires a library call to _U_Qfcmp. It takes
- a magic number as its third argument which indicates what to do.
- The return value is an integer to be compared against zero. The
- comparison conditions are the same as those listed in Table 8-12
- of the PA-RISC 2.0 Architecture book for the fcmp instruction. */
- /* Raise FP_INVALID on SNaN as a side effect. */
- #define QCMP_INV 1
- /* Comparison relations. */
- #define QCMP_UNORD 2
- #define QCMP_EQ 4
- #define QCMP_LT 8
- #define QCMP_GT 16
- int _U_Qfcmp (long double a, long double b, int);
- long _U_Qfcnvfxt_quad_to_sgl (long double);
- int _U_Qfeq (long double, long double);
- int _U_Qfne (long double, long double);
- int _U_Qfgt (long double, long double);
- int _U_Qfge (long double, long double);
- int _U_Qflt (long double, long double);
- int _U_Qfle (long double, long double);
- int _U_Qfltgt (long double, long double);
- int _U_Qfunle (long double, long double);
- int _U_Qfunlt (long double, long double);
- int _U_Qfunge (long double, long double);
- int _U_Qfungt (long double, long double);
- int _U_Qfuneq (long double, long double);
- int _U_Qfunord (long double, long double);
- int _U_Qford (long double, long double);
- int _U_Qfcomp (long double, long double);
- long double _U_Qfneg (long double);
- long double _U_Qfcopysign (long double, long double);
- #ifdef __LP64__
- int __U_Qfcnvfxt_quad_to_sgl (long double);
- #endif
- unsigned int _U_Qfcnvfxt_quad_to_usgl(long double);
- long double _U_Qfcnvxf_usgl_to_quad (unsigned int);
- unsigned long long _U_Qfcnvfxt_quad_to_udbl(long double);
- long double _U_Qfcnvxf_udbl_to_quad (unsigned long long);
- int
- _U_Qfeq (long double a, long double b)
- {
- return (_U_Qfcmp (a, b, QCMP_EQ) != 0);
- }
- int
- _U_Qfne (long double a, long double b)
- {
- return (_U_Qfcmp (a, b, QCMP_EQ) == 0);
- }
-
- int
- _U_Qfgt (long double a, long double b)
- {
- return (_U_Qfcmp (a, b, QCMP_INV | QCMP_GT) != 0);
- }
- int
- _U_Qfge (long double a, long double b)
- {
- return (_U_Qfcmp (a, b, QCMP_INV | QCMP_EQ | QCMP_GT) != 0);
- }
- int
- _U_Qflt (long double a, long double b)
- {
- return (_U_Qfcmp (a, b, QCMP_INV | QCMP_LT) != 0);
- }
- int
- _U_Qfle (long double a, long double b)
- {
- return (_U_Qfcmp (a, b, QCMP_INV | QCMP_EQ | QCMP_LT) != 0);
- }
- int
- _U_Qfltgt (long double a, long double b)
- {
- return (_U_Qfcmp (a, b, QCMP_INV | QCMP_LT | QCMP_GT) != 0);
- }
- int
- _U_Qfunle (long double a, long double b)
- {
- return (_U_Qfcmp (a, b, QCMP_INV | QCMP_UNORD | QCMP_EQ | QCMP_LT) != 0);
- }
- int
- _U_Qfunlt (long double a, long double b)
- {
- return (_U_Qfcmp (a, b, QCMP_INV | QCMP_UNORD | QCMP_LT) != 0);
- }
- int
- _U_Qfunge (long double a, long double b)
- {
- return (_U_Qfcmp (a, b, QCMP_INV | QCMP_UNORD | QCMP_EQ | QCMP_GT) != 0);
- }
- int
- _U_Qfungt (long double a, long double b)
- {
- return (_U_Qfcmp (a, b, QCMP_INV | QCMP_UNORD | QCMP_GT) != 0);
- }
- int
- _U_Qfuneq (long double a, long double b)
- {
- return (_U_Qfcmp (a, b, QCMP_INV | QCMP_UNORD | QCMP_EQ) != 0);
- }
- int
- _U_Qfunord (long double a, long double b)
- {
- return (_U_Qfcmp (a, b, QCMP_INV | QCMP_UNORD) != 0);
- }
- int
- _U_Qford (long double a, long double b)
- {
- return (_U_Qfcmp (a, b, QCMP_INV | QCMP_EQ | QCMP_LT | QCMP_GT) != 0);
- }
- int
- _U_Qfcomp (long double a, long double b)
- {
- if (_U_Qfcmp (a, b, QCMP_EQ) == 0)
- return 0;
- return (_U_Qfcmp (a, b, QCMP_UNORD | QCMP_EQ | QCMP_GT) != 0 ? 1 : -1);
- }
- /* Negate long double A. */
- long double
- _U_Qfneg (long double a)
- {
- union
- {
- long double ld;
- int i[4];
- } u;
- u.ld = a;
- u.i[0] ^= 0x80000000;
- return u.ld;
- }
- /* Return long double A with sign changed to sign of long double B. */
- long double
- _U_Qfcopysign (long double a, long double b)
- {
- union
- {
- long double ld;
- int i[4];
- } ua, ub;
- ua.ld = a;
- ub.ld = b;
- ua.i[0] &= 0x7fffffff;
- ua.i[0] |= (0x80000000 & ub.i[0]);
- return ua.ld;
- }
- #ifdef __LP64__
- /* This routine is only necessary for the PA64 port; for reasons unknown
- _U_Qfcnvfxt_quad_to_sgl returns the integer in the high 32bits of the
- return value. Ugh. */
- int
- __U_Qfcnvfxt_quad_to_sgl (long double a)
- {
- return _U_Qfcnvfxt_quad_to_sgl (a) >> 32;
- }
- #endif
- /* HP only has signed conversion in the C library, so need to synthesize
- unsigned versions. */
- unsigned int
- _U_Qfcnvfxt_quad_to_usgl (long double a)
- {
- extern long long _U_Qfcnvfxt_quad_to_dbl (long double a);
- return (unsigned int) _U_Qfcnvfxt_quad_to_dbl (a);
- }
- long double
- _U_Qfcnvxf_usgl_to_quad (unsigned int a)
- {
- extern long double _U_Qfcnvxf_dbl_to_quad (long long);
- return _U_Qfcnvxf_dbl_to_quad ((long long) a);
- }
- typedef union {
- unsigned long long u[2];
- long double d[1];
- } quad_type;
- unsigned long long
- _U_Qfcnvfxt_quad_to_udbl (long double a)
- {
- extern quad_type _U_Qfcnvfxt_quad_to_quad (long double a);
- quad_type u;
- u = _U_Qfcnvfxt_quad_to_quad(a);
- return u.u[1];
- }
- long double
- _U_Qfcnvxf_udbl_to_quad (unsigned long long a)
- {
- extern long double _U_Qfcnvxf_quad_to_quad (quad_type a);
- quad_type u;
- u.u[0] = 0;
- u.u[1] = a;
- return _U_Qfcnvxf_quad_to_quad (u);
- }
|