head 1.1; branch 1.1.1; access; symbols netbsd-11-0-RC5:1.1.1.2 netbsd-11-0-RC4:1.1.1.2 netbsd-11-0-RC3:1.1.1.2 netbsd-11-0-RC2:1.1.1.2 netbsd-11-0-RC1:1.1.1.2 gcc-14-3-0:1.1.1.3 perseant-exfatfs-base-20250801:1.1.1.2 netbsd-11:1.1.1.2.0.4 netbsd-11-base:1.1.1.2 gcc-12-5-0:1.1.1.2 netbsd-10-1-RELEASE:1.1.1.1 perseant-exfatfs-base-20240630:1.1.1.2 gcc-12-4-0:1.1.1.2 perseant-exfatfs:1.1.1.2.0.2 perseant-exfatfs-base:1.1.1.2 netbsd-10-0-RELEASE:1.1.1.1 netbsd-10-0-RC6:1.1.1.1 netbsd-10-0-RC5:1.1.1.1 netbsd-10-0-RC4:1.1.1.1 netbsd-10-0-RC3:1.1.1.1 netbsd-10-0-RC2:1.1.1.1 netbsd-10-0-RC1:1.1.1.1 gcc-12-3-0:1.1.1.2 gcc-10-5-0:1.1.1.1 netbsd-10:1.1.1.1.0.6 netbsd-10-base:1.1.1.1 gcc-10-4-0:1.1.1.1 cjep_sun2x-base1:1.1.1.1 cjep_sun2x:1.1.1.1.0.4 cjep_sun2x-base:1.1.1.1 cjep_staticlib_x-base1:1.1.1.1 cjep_staticlib_x:1.1.1.1.0.2 cjep_staticlib_x-base:1.1.1.1 gcc-10-3-0:1.1.1.1 FSF:1.1.1; locks; strict; comment @# @; 1.1 date 2021.04.10.22.10.14; author mrg; state Exp; branches 1.1.1.1; next ; commitid eC4g0MRpqTvEkNOC; 1.1.1.1 date 2021.04.10.22.10.14; author mrg; state Exp; branches; next 1.1.1.2; commitid eC4g0MRpqTvEkNOC; 1.1.1.2 date 2023.07.30.05.21.29; author mrg; state Exp; branches; next 1.1.1.3; commitid tk6nV4mbc9nVEMyE; 1.1.1.3 date 2025.09.13.23.45.59; author mrg; state Exp; branches; next ; commitid KwhwN4krNWa6XBaG; desc @@ 1.1 log @Initial revision @ text @/* Implementation of the degree trignometric functions COSD, SIND, TAND. Copyright (C) 2020 Free Software Foundation, Inc. Contributed by Steven G. Kargl and Fritz Reese This file is part of the GNU Fortran runtime library (libgfortran). Libgfortran 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 of the License, or (at your option) any later version. Libgfortran 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 . */ /* This file is included from both the FE and the runtime library code. Operations are generalized using GMP/MPFR functions. When included from libgfortran, these should be overridden using macros which will use native operations conforming to the same API. From the FE, the GMP/MPFR functions can be used as-is. The following macros are used and must be defined, unless listed as [optional]: FTYPE Type name for the real-valued parameter. Variables of this type are constructed/destroyed using mpfr_init() and mpfr_clear. RETTYPE Return type of the functions. RETURN(x) Insert code to return a value. The parameter x is the result variable, which was also the input parameter. ITYPE Type name for integer types. SIND, COSD, TRIGD Names for the degree-valued trig functions defined by this module. ENABLE_SIND, ENABLE_COSD, ENABLE_TAND Whether the degree-valued trig functions can be enabled. ERROR_RETURN(f, k, x) If ENABLE_D is not defined, this is substituted to assert an error condition for function f, kind k, and parameter x. The function argument is one of {sind, cosd, tand}. ISFINITE(x) Whether x is a regular number or zero (not inf or NaN). D2R(x) Convert x from radians to degrees. SET_COSD30(x) Set x to COSD(30), or equivalently, SIND(60). TINY_LITERAL [optional] Value subtracted from 1 to cause raise INEXACT for COSD(x) for x << 1. If not set, COSD(x) for x <= COSD_SMALL_LITERAL simply returns 1. COSD_SMALL_LITERAL [optional] Value such that x <= COSD_SMALL_LITERAL implies COSD(x) = 1 to within the precision of FTYPE. If not set, this condition is not checked. SIND_SMALL_LITERAL [optional] Value such that x <= SIND_SMALL_LITERAL implies SIND(x) = D2R(x) to within the precision of FTYPE. If not set, this condition is not checked. */ #ifdef SIND /* Compute sind(x) = sin(x * pi / 180). */ RETTYPE SIND (FTYPE x) { #ifdef ENABLE_SIND if (ISFINITE (x)) { FTYPE s, one; /* sin(-x) = - sin(x). */ mpfr_init (s); mpfr_init_set_ui (one, 1, GFC_RND_MODE); mpfr_copysign (s, one, x, GFC_RND_MODE); mpfr_clear (one); #ifdef SIND_SMALL_LITERAL /* sin(x) = x as x -> 0; but only for some precisions. */ FTYPE ax; mpfr_init (ax); mpfr_abs (ax, x, GFC_RND_MODE); if (mpfr_cmp_ld (ax, SIND_SMALL_LITERAL) < 0) { D2R (x); mpfr_clear (ax); return x; } mpfr_swap (x, ax); mpfr_clear (ax); #else mpfr_abs (x, x, GFC_RND_MODE); #endif /* SIND_SMALL_LITERAL */ /* Reduce angle to x in [0,360]. */ FTYPE period; mpfr_init_set_ui (period, 360, GFC_RND_MODE); mpfr_fmod (x, x, period, GFC_RND_MODE); mpfr_clear (period); /* Special cases with exact results. */ ITYPE n; mpz_init (n); if (mpfr_get_z (n, x, GFC_RND_MODE) == 0 && mpz_divisible_ui_p (n, 30)) { /* Flip sign for odd n*pi (x is % 360 so this is only for 180). This respects sgn(sin(x)) = sgn(d/dx sin(x)) = sgn(cos(x)). */ if (mpz_divisible_ui_p (n, 180)) { mpfr_set_ui (x, 0, GFC_RND_MODE); if (mpz_cmp_ui (n, 180) == 0) mpfr_neg (s, s, GFC_RND_MODE); } else if (mpz_divisible_ui_p (n, 90)) mpfr_set_si (x, (mpz_cmp_ui (n, 90) == 0 ? 1 : -1), GFC_RND_MODE); else if (mpz_divisible_ui_p (n, 60)) { SET_COSD30 (x); if (mpz_cmp_ui (n, 180) >= 0) mpfr_neg (x, x, GFC_RND_MODE); } else mpfr_set_ld (x, (mpz_cmp_ui (n, 180) < 0 ? 0.5L : -0.5L), GFC_RND_MODE); } /* Fold [0,360] into the range [0,45], and compute either SIN() or COS() depending on symmetry of shifting into the [0,45] range. */ else { bool fold_cos = false; if (mpfr_cmp_ui (x, 180) <= 0) { if (mpfr_cmp_ui (x, 90) <= 0) { if (mpfr_cmp_ui (x, 45) > 0) { /* x = COS(D2R(90 - x)) */ mpfr_ui_sub (x, 90, x, GFC_RND_MODE); fold_cos = true; } } else { if (mpfr_cmp_ui (x, 135) <= 0) { mpfr_sub_ui (x, x, 90, GFC_RND_MODE); fold_cos = true; } else mpfr_ui_sub (x, 180, x, GFC_RND_MODE); } } else if (mpfr_cmp_ui (x, 270) <= 0) { if (mpfr_cmp_ui (x, 225) <= 0) mpfr_sub_ui (x, x, 180, GFC_RND_MODE); else { mpfr_ui_sub (x, 270, x, GFC_RND_MODE); fold_cos = true; } mpfr_neg (s, s, GFC_RND_MODE); } else { if (mpfr_cmp_ui (x, 315) <= 0) { mpfr_sub_ui (x, x, 270, GFC_RND_MODE); fold_cos = true; } else mpfr_ui_sub (x, 360, x, GFC_RND_MODE); mpfr_neg (s, s, GFC_RND_MODE); } D2R (x); if (fold_cos) mpfr_cos (x, x, GFC_RND_MODE); else mpfr_sin (x, x, GFC_RND_MODE); } mpfr_mul (x, x, s, GFC_RND_MODE); mpz_clear (n); mpfr_clear (s); } /* Return NaN for +-Inf and NaN and raise exception. */ else mpfr_sub (x, x, x, GFC_RND_MODE); RETURN (x); #else ERROR_RETURN(sind, KIND, x); #endif // ENABLE_SIND } #endif // SIND #ifdef COSD /* Compute cosd(x) = cos(x * pi / 180). */ RETTYPE COSD (FTYPE x) { #ifdef ENABLE_COSD #if defined(TINY_LITERAL) && defined(COSD_SMALL_LITERAL) static const volatile FTYPE tiny = TINY_LITERAL; #endif if (ISFINITE (x)) { #ifdef COSD_SMALL_LITERAL FTYPE ax; mpfr_init (ax); mpfr_abs (ax, x, GFC_RND_MODE); /* No spurious underflows!. In radians, cos(x) = 1-x*x/2 as x -> 0. */ if (mpfr_cmp_ld (ax, COSD_SMALL_LITERAL) <= 0) { mpfr_set_ui (x, 1, GFC_RND_MODE); #ifdef TINY_LITERAL /* Cause INEXACT. */ if (!mpfr_zero_p (ax)) mpfr_sub_d (x, x, tiny, GFC_RND_MODE); #endif mpfr_clear (ax); return x; } mpfr_swap (x, ax); mpfr_clear (ax); #else mpfr_abs (x, x, GFC_RND_MODE); #endif /* COSD_SMALL_LITERAL */ /* Reduce angle to ax in [0,360]. */ FTYPE period; mpfr_init_set_ui (period, 360, GFC_RND_MODE); mpfr_fmod (x, x, period, GFC_RND_MODE); mpfr_clear (period); /* Special cases with exact results. Return negative zero for cosd(270) for consistency with libm cos(). */ ITYPE n; mpz_init (n); if (mpfr_get_z (n, x, GFC_RND_MODE) == 0 && mpz_divisible_ui_p (n, 30)) { if (mpz_divisible_ui_p (n, 180)) mpfr_set_si (x, (mpz_cmp_ui (n, 180) == 0 ? -1 : 1), GFC_RND_MODE); else if (mpz_divisible_ui_p (n, 90)) mpfr_set_zero (x, 0); else if (mpz_divisible_ui_p (n, 60)) { mpfr_set_ld (x, 0.5, GFC_RND_MODE); if (mpz_cmp_ui (n, 60) != 0 && mpz_cmp_ui (n, 300) != 0) mpfr_neg (x, x, GFC_RND_MODE); } else { SET_COSD30 (x); if (mpz_cmp_ui (n, 30) != 0 && mpz_cmp_ui (n, 330) != 0) mpfr_neg (x, x, GFC_RND_MODE); } } /* Fold [0,360] into the range [0,45], and compute either SIN() or COS() depending on symmetry of shifting into the [0,45] range. */ else { bool neg = false; bool fold_sin = false; if (mpfr_cmp_ui (x, 180) <= 0) { if (mpfr_cmp_ui (x, 90) <= 0) { if (mpfr_cmp_ui (x, 45) > 0) { mpfr_ui_sub (x, 90, x, GFC_RND_MODE); fold_sin = true; } } else { if (mpfr_cmp_ui (x, 135) <= 0) { mpfr_sub_ui (x, x, 90, GFC_RND_MODE); fold_sin = true; } else mpfr_ui_sub (x, 180, x, GFC_RND_MODE); neg = true; } } else if (mpfr_cmp_ui (x, 270) <= 0) { if (mpfr_cmp_ui (x, 225) <= 0) mpfr_sub_ui (x, x, 180, GFC_RND_MODE); else { mpfr_ui_sub (x, 270, x, GFC_RND_MODE); fold_sin = true; } neg = true; } else { if (mpfr_cmp_ui (x, 315) <= 0) { mpfr_sub_ui (x, x, 270, GFC_RND_MODE); fold_sin = true; } else mpfr_ui_sub (x, 360, x, GFC_RND_MODE); } D2R (x); if (fold_sin) mpfr_sin (x, x, GFC_RND_MODE); else mpfr_cos (x, x, GFC_RND_MODE); if (neg) mpfr_neg (x, x, GFC_RND_MODE); } mpz_clear (n); } /* Return NaN for +-Inf and NaN and raise exception. */ else mpfr_sub (x, x, x, GFC_RND_MODE); RETURN (x); #else ERROR_RETURN(cosd, KIND, x); #endif // ENABLE_COSD } #endif // COSD #ifdef TAND /* Compute tand(x) = tan(x * pi / 180). */ RETTYPE TAND (FTYPE x) { #ifdef ENABLE_TAND if (ISFINITE (x)) { FTYPE s, one; /* tan(-x) = - tan(x). */ mpfr_init (s); mpfr_init_set_ui (one, 1, GFC_RND_MODE); mpfr_copysign (s, one, x, GFC_RND_MODE); mpfr_clear (one); #ifdef SIND_SMALL_LITERAL /* tan(x) = x as x -> 0; but only for some precisions. */ FTYPE ax; mpfr_init (ax); mpfr_abs (ax, x, GFC_RND_MODE); if (mpfr_cmp_ld (ax, SIND_SMALL_LITERAL) < 0) { D2R (x); mpfr_clear (ax); return x; } mpfr_swap (x, ax); mpfr_clear (ax); #else mpfr_abs (x, x, GFC_RND_MODE); #endif /* SIND_SMALL_LITERAL */ /* Reduce angle to x in [0,360]. */ FTYPE period; mpfr_init_set_ui (period, 360, GFC_RND_MODE); mpfr_fmod (x, x, period, GFC_RND_MODE); mpfr_clear (period); /* Special cases with exact results. */ ITYPE n; mpz_init (n); if (mpfr_get_z (n, x, GFC_RND_MODE) == 0 && mpz_divisible_ui_p (n, 45)) { if (mpz_divisible_ui_p (n, 180)) mpfr_set_zero (x, 0); /* Though mathematically NaN is more appropriate for tan(n*90), returning +/-Inf offers the advantage that 1/tan(n*90) returns 0, which is mathematically sound. In fact we rely on this behavior to implement COTAND(x) = 1 / TAND(x). */ else if (mpz_divisible_ui_p (n, 90)) mpfr_set_inf (x, mpz_cmp_ui (n, 90) == 0 ? 0 : 1); else { mpfr_set_ui (x, 1, GFC_RND_MODE); if (mpz_cmp_ui (n, 45) != 0 && mpz_cmp_ui (n, 225) != 0) mpfr_neg (x, x, GFC_RND_MODE); } } else { /* Fold [0,360] into the range [0,90], and compute TAN(). */ if (mpfr_cmp_ui (x, 180) <= 0) { if (mpfr_cmp_ui (x, 90) > 0) { mpfr_ui_sub (x, 180, x, GFC_RND_MODE); mpfr_neg (s, s, GFC_RND_MODE); } } else { if (mpfr_cmp_ui (x, 270) <= 0) { mpfr_sub_ui (x, x, 180, GFC_RND_MODE); } else { mpfr_ui_sub (x, 360, x, GFC_RND_MODE); mpfr_neg (s, s, GFC_RND_MODE); } } D2R (x); mpfr_tan (x, x, GFC_RND_MODE); } mpfr_mul (x, x, s, GFC_RND_MODE); mpz_clear (n); mpfr_clear (s); } /* Return NaN for +-Inf and NaN and raise exception. */ else mpfr_sub (x, x, x, GFC_RND_MODE); RETURN (x); #else ERROR_RETURN(tand, KIND, x); #endif // ENABLE_TAND } #endif // TAND /* vim: set ft=c: */ @ 1.1.1.1 log @initial import of GCC 10.3.0. main changes include: caveats: - ABI issue between c++14 and c++17 fixed - profile mode is removed from libstdc++ - -fno-common is now the default new features: - new flags -fallocation-dce, -fprofile-partial-training, -fprofile-reproducible, -fprofile-prefix-path, and -fanalyzer - many new compile and link time optimisations - enhanced drive optimisations - openacc 2.6 support - openmp 5.0 features - new warnings: -Wstring-compare and -Wzero-length-bounds - extended warnings: -Warray-bounds, -Wformat-overflow, -Wrestrict, -Wreturn-local-addr, -Wstringop-overflow, -Warith-conversion, -Wmismatched-tags, and -Wredundant-tags - some likely C2X features implemented - more C++20 implemented - many new arm & intel CPUs known hundreds of reported bugs are fixed. full list of changes can be found at: https://gcc.gnu.org/gcc-10/changes.html @ text @@ 1.1.1.2 log @initial import of GCC 12.3.0. major changes in GCC 11 included: - The default mode for C++ is now -std=gnu++17 instead of -std=gnu++14. - When building GCC itself, the host compiler must now support C++11, rather than C++98. - Some short options of the gcov tool have been renamed: -i to -j and -j to -H. - ThreadSanitizer improvements. - Introduce Hardware-assisted AddressSanitizer support. - For targets that produce DWARF debugging information GCC now defaults to DWARF version 5. This can produce up to 25% more compact debug information compared to earlier versions. - Many optimisations. - The existing malloc attribute has been extended so that it can be used to identify allocator/deallocator API pairs. A pair of new -Wmismatched-dealloc and -Wmismatched-new-delete warnings are added. - Other new warnings: -Wsizeof-array-div, enabled by -Wall, warns about divisions of two sizeof operators when the first one is applied to an array and the divisor does not equal the size of the array element. -Wstringop-overread, enabled by default, warns about calls to string functions reading past the end of the arrays passed to them as arguments. -Wtsan, enabled by default, warns about unsupported features in ThreadSanitizer (currently std::atomic_thread_fence). - Enchanced warnings: -Wfree-nonheap-object detects many more instances of calls to deallocation functions with pointers not returned from a dynamic memory allocation function. -Wmaybe-uninitialized diagnoses passing pointers or references to uninitialized memory to functions taking const-qualified arguments. -Wuninitialized detects reads from uninitialized dynamically allocated memory. -Warray-parameter warns about functions with inconsistent array forms. -Wvla-parameter warns about functions with inconsistent VLA forms. - Several new features from the upcoming C2X revision of the ISO C standard are supported with -std=c2x and -std=gnu2x. - Several C++20 features have been implemented. - The C++ front end has experimental support for some of the upcoming C++23 draft. - Several new C++ warnings. - Enhanced Arm, AArch64, x86, and RISC-V CPU support. - The implementation of how program state is tracked within -fanalyzer has been completely rewritten with many enhancements. see https://gcc.gnu.org/gcc-11/changes.html for a full list. major changes in GCC 12 include: - An ABI incompatibility between C and C++ when passing or returning by value certain aggregates containing zero width bit-fields has been discovered on various targets. x86-64, ARM and AArch64 will always ignore them (so there is a C ABI incompatibility between GCC 11 and earlier with GCC 12 or later), PowerPC64 ELFv2 always take them into account (so there is a C++ ABI incompatibility, GCC 4.4 and earlier compatible with GCC 12 or later, incompatible with GCC 4.5 through GCC 11). RISC-V has changed the handling of these already starting with GCC 10. As the ABI requires, MIPS takes them into account handling function return values so there is a C++ ABI incompatibility with GCC 4.5 through 11. - STABS: Support for emitting the STABS debugging format is deprecated and will be removed in the next release. All ports now default to emit DWARF (version 2 or later) debugging info or are obsoleted. - Vectorization is enabled at -O2 which is now equivalent to the original -O2 -ftree-vectorize -fvect-cost-model=very-cheap. - GCC now supports the ShadowCallStack sanitizer. - Support for __builtin_shufflevector compatible with the clang language extension was added. - Support for attribute unavailable was added. - Support for __builtin_dynamic_object_size compatible with the clang language extension was added. - New warnings: -Wbidi-chars warns about potentially misleading UTF-8 bidirectional control characters. -Warray-compare warns about comparisons between two operands of array type. - Some new features from the upcoming C2X revision of the ISO C standard are supported with -std=c2x and -std=gnu2x. - Several C++23 features have been implemented. - Many C++ enhancements across warnings and -f options. see https://gcc.gnu.org/gcc-12/changes.html for a full list. @ text @d2 1 a2 1 Copyright (C) 2020-2022 Free Software Foundation, Inc. @ 1.1.1.3 log @initial import of GCC 14.3.0. major changes in GCC 13: - improved sanitizer - zstd debug info compression - LTO improvements - SARIF based diagnostic support - new warnings: -Wxor-used-as-pow, -Wenum-int-mismatch, -Wself-move, -Wdangling-reference - many new -Wanalyzer* specific warnings - enhanced warnings: -Wpessimizing-move, -Wredundant-move - new attributes to mark file descriptors, c++23 "assume" - several C23 features added - several C++23 features added - many new features for Arm, x86, RISC-V major changes in GCC 14: - more strict C99 or newer support - ia64* marked deprecated (but seemingly still in GCC 15.) - several new hardening features - support for "hardbool", which can have user supplied values of true/false - explicit support for stack scrubbing upon function exit - better auto-vectorisation support - added clang-compatible __has_feature and __has_extension - more C23, including -std=c23 - several C++26 features added - better diagnostics in C++ templates - new warnings: -Wnrvo, Welaborated-enum-base - many new features for Arm, x86, RISC-V - possible ABI breaking change for SPARC64 and small structures with arrays of floats. @ text @d2 1 a2 1 Copyright (C) 2020-2024 Free Software Foundation, Inc. @