diff options
Diffstat (limited to 'REORG.TODO/sysdeps/alpha/soft-fp')
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/Makefile | 11 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/Versions | 8 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/e_sqrtl.c | 49 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/local-soft-fp.h | 55 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/ots_add.c | 38 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/ots_cmp.c | 63 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/ots_cmpe.c | 77 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtqux.c | 39 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtqx.c | 38 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/ots_cvttx.c | 47 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtxq.c | 41 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtxt.c | 43 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/ots_div.c | 38 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/ots_mul.c | 38 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/ots_nintxq.c | 51 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/ots_sub.c | 38 | ||||
-rw-r--r-- | REORG.TODO/sysdeps/alpha/soft-fp/sfp-machine.h | 99 |
17 files changed, 773 insertions, 0 deletions
diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/Makefile b/REORG.TODO/sysdeps/alpha/soft-fp/Makefile new file mode 100644 index 0000000000..83baa7c49d --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/Makefile @@ -0,0 +1,11 @@ +# Software floating-point emulation. + +ifeq ($(subdir),soft-fp) +sysdep_routines += ots_add ots_sub ots_mul ots_div ots_cmp ots_cmpe \ + ots_cvtxq ots_cvtqx ots_cvtqux ots_cvttx ots_cvtxt ots_nintxq \ + fraiseexcpt +endif + +ifeq ($(subdir),math) +CPPFLAGS += -I../soft-fp +endif diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/Versions b/REORG.TODO/sysdeps/alpha/soft-fp/Versions new file mode 100644 index 0000000000..3901287115 --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/Versions @@ -0,0 +1,8 @@ +libc { + GLIBC_2.3.4 { + _OtsAddX; _OtsSubX; _OtsMulX; _OtsDivX; + _OtsEqlX; _OtsNeqX; _OtsLssX; _OtsLeqX; _OtsGtrX; _OtsGeqX; + _OtsCvtQX; _OtsCvtQUX; _OtsCvtXQ; _OtsNintXQ; + _OtsConvertFloatTX; _OtsConvertFloatXT; + } +} diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/e_sqrtl.c b/REORG.TODO/sysdeps/alpha/soft-fp/e_sqrtl.c new file mode 100644 index 0000000000..8b30bcbc52 --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/e_sqrtl.c @@ -0,0 +1,49 @@ +/* long double square root in software floating-point emulation. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <soft-fp.h> +#include <quad.h> +#include <shlib-compat.h> + +long double +__ieee754_sqrtl (const long double a) +{ + FP_DECL_EX; + FP_DECL_Q(A); FP_DECL_Q(C); + long double c; + long _round = 4; /* dynamic rounding */ + + FP_INIT_ROUNDMODE; + FP_UNPACK_Q(A, a); + FP_SQRT_Q(C, A); + FP_PACK_Q(c, C); + FP_HANDLE_EXCEPTIONS; + return c; +} + +/* ??? We forgot to add this symbol in 2.15. Getting this into 2.18 isn't as + straight-forward as just adding the alias, since a generic Versions file + includes the 2.15 version and the linker uses the first one it sees. */ +#if SHLIB_COMPAT (libm, GLIBC_2_15, GLIBC_2_18) +versioned_symbol (libm, __ieee754_sqrtl, __sqrtl_finite, GLIBC_2_18); +#else +strong_alias(__ieee754_sqrtl, __sqrtl_finite) +#endif diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/local-soft-fp.h b/REORG.TODO/sysdeps/alpha/soft-fp/local-soft-fp.h new file mode 100644 index 0000000000..d562e0829e --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/local-soft-fp.h @@ -0,0 +1,55 @@ +#include <stdlib.h> +#include <soft-fp.h> +#include <quad.h> + +/* Helpers for the Ots functions which receive long double arguments + in two integer registers, and return values in $16+$17. */ + +#define AXP_UNPACK_RAW_Q(X, val) \ + do { \ + union _FP_UNION_Q _flo; \ + _flo.longs.a = val##l; \ + _flo.longs.b = val##h; \ + FP_UNPACK_RAW_QP(X, &_flo); \ + } while (0) + +#define AXP_UNPACK_SEMIRAW_Q(X, val) \ + do { \ + union _FP_UNION_Q _flo; \ + _flo.longs.a = val##l; \ + _flo.longs.b = val##h; \ + FP_UNPACK_SEMIRAW_QP(X, &_flo); \ + } while (0) + +#define AXP_UNPACK_Q(X, val) \ + do { \ + AXP_UNPACK_RAW_Q(X, val); \ + _FP_UNPACK_CANONICAL(Q, 2, X); \ + } while (0) + +#define AXP_PACK_RAW_Q(val, X) FP_PACK_RAW_QP(&val##_flo, X) + +#define AXP_PACK_SEMIRAW_Q(val, X) \ + do { \ + _FP_PACK_SEMIRAW(Q, 2, X); \ + AXP_PACK_RAW_Q(val, X); \ + } while (0) + +#define AXP_PACK_Q(val, X) \ + do { \ + _FP_PACK_CANONICAL(Q, 2, X); \ + AXP_PACK_RAW_Q(val, X); \ + } while (0) + +#define AXP_DECL_RETURN_Q(X) union _FP_UNION_Q X##_flo + +/* ??? We don't have a real way to tell the compiler that we're wanting + to return values in $16+$17. Instead use a volatile asm to make sure + that the values are live, and just hope that nothing kills the values + in between here and the end of the function. */ +#define AXP_RETURN_Q(X) \ + do { \ + register long r16 __asm__("16") = X##_flo.longs.a; \ + register long r17 __asm__("17") = X##_flo.longs.b; \ + asm volatile ("" : : "r"(r16), "r"(r17)); \ + } while (0) diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/ots_add.c b/REORG.TODO/sysdeps/alpha/soft-fp/ots_add.c new file mode 100644 index 0000000000..7291a730e7 --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/ots_add.c @@ -0,0 +1,38 @@ +/* Software floating-point emulation: addition. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include "local-soft-fp.h" + +void +_OtsAddX(long al, long ah, long bl, long bh, long _round) +{ + FP_DECL_EX; + FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(C); + AXP_DECL_RETURN_Q(c); + + FP_INIT_ROUNDMODE; + AXP_UNPACK_SEMIRAW_Q(A, a); + AXP_UNPACK_SEMIRAW_Q(B, b); + FP_ADD_Q(C, A, B); + AXP_PACK_SEMIRAW_Q(c, C); + FP_HANDLE_EXCEPTIONS; + + AXP_RETURN_Q(c); +} diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/ots_cmp.c b/REORG.TODO/sysdeps/alpha/soft-fp/ots_cmp.c new file mode 100644 index 0000000000..84498f8059 --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/ots_cmp.c @@ -0,0 +1,63 @@ +/* Software floating-point emulation: comparison. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include "local-soft-fp.h" + +static long +internal_equality (long al, long ah, long bl, long bh, long neq) +{ + FP_DECL_EX; + FP_DECL_Q(A); FP_DECL_Q(B); + long r; + + AXP_UNPACK_RAW_Q(A, a); + AXP_UNPACK_RAW_Q(B, b); + + if ((A_e == _FP_EXPMAX_Q && !_FP_FRAC_ZEROP_2(A)) + || (B_e == _FP_EXPMAX_Q && !_FP_FRAC_ZEROP_2(B))) + { + /* EQ and NE signal invalid operation only if either operand is SNaN. */ + if (FP_ISSIGNAN_Q(A) || FP_ISSIGNAN_Q(B)) + { + FP_SET_EXCEPTION(FP_EX_INVALID); + FP_HANDLE_EXCEPTIONS; + } + return -1; + } + + r = (A_e == B_e + && _FP_FRAC_EQ_2 (A, B) + && (A_s == B_s || (!A_e && _FP_FRAC_ZEROP_2(A)))); + r ^= neq; + + return r; +} + +long +_OtsEqlX (long al, long ah, long bl, long bh) +{ + return internal_equality (al, ah, bl, bh, 0); +} + +long +_OtsNeqX (long al, long ah, long bl, long bh) +{ + return internal_equality (al, ah, bl, bh, 1); +} diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/ots_cmpe.c b/REORG.TODO/sysdeps/alpha/soft-fp/ots_cmpe.c new file mode 100644 index 0000000000..d1e950d991 --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/ots_cmpe.c @@ -0,0 +1,77 @@ +/* Software floating-point emulation: comparison. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include "local-soft-fp.h" + +static long +internal_compare (long al, long ah, long bl, long bh) +{ + FP_DECL_EX; + FP_DECL_Q(A); FP_DECL_Q(B); + long r; + + AXP_UNPACK_RAW_Q(A, a); + AXP_UNPACK_RAW_Q(B, b); + FP_CMP_Q (r, A, B, 2, 2); + + FP_HANDLE_EXCEPTIONS; + + return r; +} + +long +_OtsLssX (long al, long ah, long bl, long bh) +{ + long r = internal_compare (al, ah, bl, bh); + if (r == 2) + return -1; + else + return r < 0; +} + +long +_OtsLeqX (long al, long ah, long bl, long bh) +{ + long r = internal_compare (al, ah, bl, bh); + if (r == 2) + return -1; + else + return r <= 0; +} + +long +_OtsGtrX (long al, long ah, long bl, long bh) +{ + long r = internal_compare (al, ah, bl, bh); + if (r == 2) + return -1; + else + return r > 0; +} + +long +_OtsGeqX (long al, long ah, long bl, long bh) +{ + long r = internal_compare (al, ah, bl, bh); + if (r == 2) + return -1; + else + return r >= 0; +} diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtqux.c b/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtqux.c new file mode 100644 index 0000000000..bb6fac00a3 --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtqux.c @@ -0,0 +1,39 @@ +/* Software floating-point emulation: unsigned integer to float conversion. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include "local-soft-fp.h" + +/* Should never actually be used, since we've more bits of precision + than the incomming long, but needed for linkage. */ +#undef FP_ROUNDMODE +#define FP_ROUNDMODE FP_RND_ZERO + +void +_OtsCvtQUX (unsigned long a) +{ + FP_DECL_EX; + FP_DECL_Q(C); + AXP_DECL_RETURN_Q(c); + + FP_FROM_INT_Q(C, a, 64, unsigned long); + AXP_PACK_RAW_Q(c, C); + + AXP_RETURN_Q(c); +} diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtqx.c b/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtqx.c new file mode 100644 index 0000000000..e1d8a7a4ae --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtqx.c @@ -0,0 +1,38 @@ +/* Software floating-point emulation: signed integer to float conversion. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include "local-soft-fp.h" + +/* Should never actually be used, since we've more bits of precision + than the incomming long, but needed for linkage. */ +#undef FP_ROUNDMODE +#define FP_ROUNDMODE FP_RND_ZERO + +void +_OtsCvtQX (long a) +{ + FP_DECL_EX; + FP_DECL_Q(C); + AXP_DECL_RETURN_Q(c); + + FP_FROM_INT_Q(C, a, 64, unsigned long); + AXP_PACK_RAW_Q(c, C); + AXP_RETURN_Q(c); +} diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvttx.c b/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvttx.c new file mode 100644 index 0000000000..00e13f3396 --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvttx.c @@ -0,0 +1,47 @@ +/* Software floating-point emulation: floating point extension. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include "local-soft-fp.h" +#include "double.h" + +/* Should never actually be used, since we're extending, but needed + for linkage. */ +#undef FP_ROUNDMODE +#define FP_ROUNDMODE FP_RND_ZERO + +void +_OtsConvertFloatTX(double a) +{ + FP_DECL_EX; + FP_DECL_D(A); + FP_DECL_Q(C); + AXP_DECL_RETURN_Q(c); + + FP_UNPACK_RAW_D(A, a); +#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q + FP_EXTEND(Q,D,4,2,C,A); +#else + FP_EXTEND(Q,D,2,1,C,A); +#endif + AXP_PACK_RAW_Q(c, C); + FP_HANDLE_EXCEPTIONS; + + AXP_RETURN_Q(c); +} diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtxq.c b/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtxq.c new file mode 100644 index 0000000000..eda0074ef0 --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtxq.c @@ -0,0 +1,41 @@ +/* Software floating-point emulation: float to integer conversion. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include "local-soft-fp.h" + +long +_OtsCvtXQ (long al, long ah, long _round) +{ + FP_DECL_EX; + FP_DECL_Q(A); + unsigned long r; + long s; + + /* If bit 3 is set, then integer overflow detection is requested. */ + s = _round & 8 ? 1 : -1; + _round = _round & 3; + + FP_INIT_ROUNDMODE; + AXP_UNPACK_RAW_Q(A, a); + FP_TO_INT_Q(r, A, 64, s); + FP_HANDLE_EXCEPTIONS; + + return r; +} diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtxt.c b/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtxt.c new file mode 100644 index 0000000000..59be37e394 --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/ots_cvtxt.c @@ -0,0 +1,43 @@ +/* Software floating-point emulation: floating point truncation. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include "local-soft-fp.h" +#include "double.h" + +double +_OtsConvertFloatXT (long al, long ah, long _round) +{ + FP_DECL_EX; + FP_DECL_Q(A); + FP_DECL_D(R); + double r; + + FP_INIT_ROUNDMODE; + AXP_UNPACK_SEMIRAW_Q(A, a); +#if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q + FP_TRUNC(D,Q,2,4,R,A); +#else + FP_TRUNC(D,Q,1,2,R,A); +#endif + FP_PACK_SEMIRAW_D(r, R); + FP_HANDLE_EXCEPTIONS; + + return r; +} diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/ots_div.c b/REORG.TODO/sysdeps/alpha/soft-fp/ots_div.c new file mode 100644 index 0000000000..1ce38ced05 --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/ots_div.c @@ -0,0 +1,38 @@ +/* Software floating-point emulation: division. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include "local-soft-fp.h" + +void +_OtsDivX(long al, long ah, long bl, long bh, long _round) +{ + FP_DECL_EX; + FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(C); + AXP_DECL_RETURN_Q(c); + + FP_INIT_ROUNDMODE; + AXP_UNPACK_Q(A, a); + AXP_UNPACK_Q(B, b); + FP_DIV_Q(C, A, B); + AXP_PACK_Q(c, C); + FP_HANDLE_EXCEPTIONS; + + AXP_RETURN_Q(c); +} diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/ots_mul.c b/REORG.TODO/sysdeps/alpha/soft-fp/ots_mul.c new file mode 100644 index 0000000000..937c24246d --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/ots_mul.c @@ -0,0 +1,38 @@ +/* Software floating-point emulation: multiplication. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include "local-soft-fp.h" + +void +_OtsMulX(long al, long ah, long bl, long bh, long _round) +{ + FP_DECL_EX; + FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(C); + AXP_DECL_RETURN_Q(c); + + FP_INIT_ROUNDMODE; + AXP_UNPACK_Q(A, a); + AXP_UNPACK_Q(B, b); + FP_MUL_Q(C, A, B); + AXP_PACK_Q(c, C); + FP_HANDLE_EXCEPTIONS; + + AXP_RETURN_Q(c); +} diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/ots_nintxq.c b/REORG.TODO/sysdeps/alpha/soft-fp/ots_nintxq.c new file mode 100644 index 0000000000..ce3be4fd62 --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/ots_nintxq.c @@ -0,0 +1,51 @@ +/* Software floating-point emulation: convert to fortran nearest. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include "local-soft-fp.h" + +long +_OtsNintXQ (long al, long ah, long _round) +{ + FP_DECL_EX; + FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(C); + unsigned long r; + long s; + + /* If bit 3 is set, then integer overflow detection is requested. */ + s = _round & 8 ? 1 : -1; + _round = _round & 3; + + FP_INIT_ROUNDMODE; + AXP_UNPACK_SEMIRAW_Q(A, a); + + /* Build 0.5 * sign(A) */ + B_e = _FP_EXPBIAS_Q; + __FP_FRAC_SET_2 (B, 0, 0); + B_s = A_s; + + FP_ADD_Q(C, A, B); + _FP_FRAC_SRL_2(C, _FP_WORKBITS); + _FP_FRAC_HIGH_RAW_Q(C) &= ~(_FP_W_TYPE)_FP_IMPLBIT_Q; + FP_TO_INT_Q(r, C, 64, s); + if (s > 0 && (_fex &= FP_EX_INVALID)) + FP_HANDLE_EXCEPTIONS; + + return r; +} diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/ots_sub.c b/REORG.TODO/sysdeps/alpha/soft-fp/ots_sub.c new file mode 100644 index 0000000000..69893f1ea8 --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/ots_sub.c @@ -0,0 +1,38 @@ +/* Software floating-point emulation: subtraction. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include "local-soft-fp.h" + +void +_OtsSubX(long al, long ah, long bl, long bh, long _round) +{ + FP_DECL_EX; + FP_DECL_Q(A); FP_DECL_Q(B); FP_DECL_Q(C); + AXP_DECL_RETURN_Q(c); + + FP_INIT_ROUNDMODE; + AXP_UNPACK_SEMIRAW_Q(A, a); + AXP_UNPACK_SEMIRAW_Q(B, b); + FP_SUB_Q(C, A, B); + AXP_PACK_SEMIRAW_Q(c, C); + FP_HANDLE_EXCEPTIONS; + + AXP_RETURN_Q(c); +} diff --git a/REORG.TODO/sysdeps/alpha/soft-fp/sfp-machine.h b/REORG.TODO/sysdeps/alpha/soft-fp/sfp-machine.h new file mode 100644 index 0000000000..7935b540db --- /dev/null +++ b/REORG.TODO/sysdeps/alpha/soft-fp/sfp-machine.h @@ -0,0 +1,99 @@ +/* Machine-dependent software floating-point definitions. + Alpha userland IEEE 128-bit version. + Copyright (C) 2004-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com), + Jakub Jelinek (jj@ultra.linux.cz) and + David S. Miller (davem@redhat.com). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <http://www.gnu.org/licenses/>. */ + +#include <fenv_libc.h> + +#define _FP_W_TYPE_SIZE 64 +#define _FP_W_TYPE unsigned long +#define _FP_WS_TYPE signed long +#define _FP_I_TYPE long + +#define _FP_MUL_MEAT_S(R,X,Y) \ + _FP_MUL_MEAT_1_imm(_FP_WFRACBITS_S,R,X,Y) +#define _FP_MUL_MEAT_D(R,X,Y) \ + _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm) +#define _FP_MUL_MEAT_Q(R,X,Y) \ + _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) + +#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_imm(S,R,X,Y,_FP_DIV_HELP_imm) +#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_1_udiv_norm(D,R,X,Y) +#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_2_udiv(Q,R,X,Y) + +#define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1) +#define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1) +#define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1 +#define _FP_NANSIGN_S 0 +#define _FP_NANSIGN_D 0 +#define _FP_NANSIGN_Q 0 + +#define _FP_KEEPNANFRACP 1 +#define _FP_QNANNEGATEDP 0 + +/* Alpha Architecture Handbook, 4.7.10.4 sez that we should prefer any + type of NaN in Fb, then Fa. */ +#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \ + do { \ + R##_s = Y##_s; \ + _FP_FRAC_COPY_##wc(R,X); \ + R##_c = FP_CLS_NAN; \ + } while (0) + +/* Rounding mode settings. */ +#define FP_RND_NEAREST FE_TONEAREST +#define FP_RND_ZERO FE_TOWARDZERO +#define FP_RND_PINF FE_UPWARD +#define FP_RND_MINF FE_DOWNWARD + +/* Obtain the current rounding mode. It's given as an argument to + all the Ots functions, with 4 meaning "dynamic". */ +#define FP_ROUNDMODE _round + +/* Exception flags. */ +#define FP_EX_INVALID FE_INVALID +#define FP_EX_OVERFLOW FE_OVERFLOW +#define FP_EX_UNDERFLOW FE_UNDERFLOW +#define FP_EX_DIVZERO FE_DIVBYZERO +#define FP_EX_INEXACT FE_INEXACT + +#define _FP_TININESS_AFTER_ROUNDING 1 + +#define FP_INIT_ROUNDMODE \ +do { \ + if (__builtin_expect (_round == 4, 0)) \ + { \ + unsigned long t; \ + __asm__ __volatile__("excb; mf_fpcr %0" : "=f"(t)); \ + _round = (t >> FPCR_ROUND_SHIFT) & 3; \ + } \ +} while (0) + +/* We copy the libm function into libc for soft-fp. */ +extern int __feraiseexcept (int __excepts) attribute_hidden; + +#define FP_HANDLE_EXCEPTIONS \ +do { \ + if (__builtin_expect (_fex, 0)) \ + __feraiseexcept (_fex); \ +} while (0) + +#define FP_TRAPPING_EXCEPTIONS \ + ((__ieee_get_fp_control () & SWCR_ENABLE_MASK) << SWCR_ENABLE_SHIFT) |