aboutsummaryrefslogtreecommitdiff
path: root/soft-fp
AgeCommit message (Collapse)AuthorFilesLines
2017-01-24 * soft-fp/op-common.h (_FP_MUL, _FP_FMA, _FP_DIV): AddJakub Jelinek1-0/+5
/* FALLTHRU */ comments.
2017-01-01Update copyright dates with scripts/update-copyrights.Joseph Myers95-95/+95
2016-09-21[soft-fp] Add support for various half-precision conversion routines.James Greenhalgh7-0/+455
This patch adds conversion routines required for _Float16 support in AArch64. These are one-step conversions to and from TImode and TFmode. We need these on AArch64 regardless of presence of the ARMv8.2-A 16-bit floating-point extensions. In the patch, soft-fp/half.h is derived from soft-fp/single.h . The conversion routines are derivatives of their respective SFmode variants. * soft-fp/extendhftf2.c: New. * soft-fp/fixhfti.c: Likewise. * soft-fp/fixunshfti.c: Likewise. * soft-fp/floattihf.c: Likewise. * soft-fp/floatuntihf.c: Likewise. * soft-fp/half.h: Likewise. * soft-fp/trunctfhf2.c: Likewise.
2016-08-16Fix soft-fp extended.h unpacking (GCC bug 77265).Joseph Myers1-0/+4
soft-fp unpacking for x86 "extended" fails to clear the implicit mantissa high bit that is explicit in that format, resulting in problems for operations that expect this bit to be clear in raw unpacked values. Specifically, the code for this format is used only for conversions to and from TFmode (__float128) in libgcc, where this issue results in GCC bug 77265, extension of long double infinity to __float128 wrongly produces a NaN. This patch fixes this by always masking out the implicit bit on unpacking, so that the results of unpacking meet the expectations of the rest of the soft-fp code for a normal IEEE format. Tested for x86_64 in libgcc in conjunction with a GCC testcase for this issue (this code isn't used in glibc, only in libgcc). * soft-fp/extended.h [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_RAW_E): Mask implicit bit out of unpacked value. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_RAW_EP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_RAW_E): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_RAW_EP): Likewise.
2016-01-04Update copyright dates with scripts/update-copyrights.Joseph Myers88-88/+88
2015-10-27Remove GCC version conditionals on -Wmaybe-uninitialized pragmas.Joseph Myers3-12/+0
One common case of __GNUC_PREREQ (4, 7) conditionals is use of diagnostic control pragmas for -Wmaybe-uninitialized, an option introduced in GCC 4.7 where older GCC needed -Wuninitialized to be controlled instead if the warning appeared with older GCC. This patch removes such conditionals. (There remain several older uses of -Wno-uninitialized in makefiles that still need to be converted to diagnostic control pragmas if the issue is still present with current sources and supported GCC versions, and it's likely that in most cases those pragmas also will end up controlling -Wmaybe-uninitialized.) Tested for x86_64 and x86 (testsuite, and that installed stripped shared libraries are unchanged by the patch, except for libresolv since res_send.c contains assertions whose line numbers are changed by the patch). * resolv/res_send.c (send_vc) [__GNUC_PREREQ (4, 7)]: Make code unconditional. * soft-fp/fmadf4.c [__GNUC_PREREQ (4, 7)]: Likewise. [!__GNUC_PREREQ (4, 7)]: Remove conditional code. * soft-fp/fmasf4.c [__GNUC_PREREQ (4, 7)]: Make code unconditional. [!__GNUC_PREREQ (4, 7)]: Remove conditional code. * soft-fp/fmatf4.c [__GNUC_PREREQ (4, 7)]: Make code unconditional. [!__GNUC_PREREQ (4, 7)]: Remove conditional code. * stdlib/setenv.c [((__GNUC__ << 16) + __GNUC_MINOR__) >= ((4 << 16) + 7)]: Make code unconditional. [!(((__GNUC__ << 16) + __GNUC_MINOR__) >= ((4 << 16) + 7))]: Remove conditional code. * sysdeps/ieee754/dbl-64/e_lgamma_r.c (__ieee754_lgamma_r) [__GNUC_PREREQ (4, 7)]: Make code unconditional. (__ieee754_lgamma_r) [!__GNUC_PREREQ (4, 7)]: Remove conditional code. * sysdeps/ieee754/flt-32/e_lgammaf_r.c (__ieee754_lgammaf_r) [__GNUC_PREREQ (4, 7)]: Make code unconditional. (__ieee754_lgammaf_r) [!__GNUC_PREREQ (4, 7)]: Remove conditional code. * sysdeps/ieee754/ldbl-128/k_tanl.c (__kernel_tanl) [__GNUC_PREREQ (4, 7)]: Make code unconditional. (__kernel_tanl) [!__GNUC_PREREQ (4, 7)]: Remove conditional code. * sysdeps/ieee754/ldbl-128ibm/k_tanl.c (__kernel_tanl) [__GNUC_PREREQ (4, 7)]: Make code unconditional. (__kernel_tanl) [!__GNUC_PREREQ (4, 7)]: Remove conditional code. * sysdeps/ieee754/ldbl-96/e_lgammal_r.c (__ieee754_lgammal_r) [__GNUC_PREREQ (4, 7)]: Make code unconditional. (__ieee754_lgammal_r) [!__GNUC_PREREQ (4, 7)]: Remove conditional code. * sysdeps/ieee754/ldbl-96/k_tanl.c (__kernel_tanl) [__GNUC_PREREQ (4, 7)]: Make code unconditional. (__kernel_tanl) [!__GNUC_PREREQ (4, 7)]: Remove conditional code.
2015-08-27 Fix undefined warning messages in GCC 6.Steve Ellcey3-33/+45
GCC 6 puts out warnings in a different location then GCC 5. Move the DIAG macros so that the warnings are supressed for both compilers. ChangeLog: * soft-fp/fmasf4.c: Add include of sys/cdefs.h. Move DIAG_PUSH_NEEDS_COMMENT, DIAG_IGNORE_NEEDS_COMMENT to front of file, move DIAG_POP_NEEDS_COMMENT to end of file. * soft-fp/fmadf4.c: Ditto. * soft-fp/fmatf4.c: Ditto.
2015-05-22Fix soft-fp fma for -Wuninitialized.Joseph Myers3-0/+36
The soft-fp implementations of fma produce -Wuninitialized warnings because, in the cases where the result is not a nonzero finite value, the soft-fp does not set the exponent of the result since the (cooked) packing will do so, but the compiler does not then see that the exponent is always set in packing before it's used if it wasn't set earlier. This patch uses DIAG_* macros to suppress those warnings. Tested for mips64. (In fact this allows the mips64 build to complete with the -Wno-uninitialized removed from math/Makefile, but more cleanups are still needed in the ldbl-128ibm code for uninitialized warnings there.) * soft-fp/fmadf4.c: Include <libc-internal.h>. (__fma): Ignore uninitialized warnings around packing. * soft-fp/fmasf4.c: Include <libc-internal.h>. (__fmaf): Ignore uninitialized warnings around packing. * soft-fp/fmatf4.c: Include <libc-internal.h>. (__fmal): Ignore uninitialized warnings around packing.
2015-05-19soft-fp: Fix alpha kernel build problemRichard Henderson1-3/+2
* soft-fp/op-common.h (_FP_FROM_INT): Don't write to R.
2015-03-12soft-fp: Define and use _FP_STATIC_ASSERT.Joseph Myers3-32/+51
This patch makes soft-fp use static assertions in place of conditional calls to abort, in places where there are checks for conditions (on the types for which a macro is used) that the code is not prepared to handle. The fallback definition of _FP_STATIC_ASSERT (for kernel use only, as only relevant to compilers not supported for building glibc) is as in misc/sys/cdefs.h. This means that soft-fp only ever calls abort for _FP_UNREACHABLE calls in builds with GCC versions before 4.5. Thus, there is no need for an abort declaration or <stdlib.h> include, since the kernel code handles defining abort as a macro itself - and so this avoids any need for an __KERNEL__ condition on the abort declaration to avoid it breaking with the kernel's macro definition. That is, this patch is intended to make glibc's soft-fp code suitable for kernel use with no kernel-local changes to the soft-fp code needed at all. Tested for powerpc-nofpu that installed stripped shared libraries are unchanged by the patch. One explicit <stdlib.h> include had to be added to a file that was relying on the include from soft-fp.h. * soft-fp/soft-fp.h (_FP_STATIC_ASSERT): New macro. [_LIBC]: Do not include <stdlib.h>. [!_LIBC] (abort): Remove declaration. * soft-fp/op-2.h (_FP_MUL_MEAT_2_120_240_double): Use _FP_STATIC_ASSERT instead of conditionally calling abort. * soft-fp/op-common.h (_FP_FROM_INT): Likewise. (_FP_EXTEND_CNAN): Likewise. (FP_TRUNC): Likewise. (__FP_CLZ): Likewise. * sysdeps/powerpc/nofpu/flt-rounds.c: Include <stdlib.h>.
2015-03-11soft-fp: Add _FP_UNREACHABLE.Joseph Myers2-4/+13
This patch makes soft-fp use a new macro _FP_UNREACHABLE in place of calling abort in unreachable default cases of switch statements. _FP_UNREACHABLE expands to call __builtin_unreachable for GCC 4.5 and later; the fallback to abort is thus only for kernel use. Tested for powerpc-nofpu that installed stripped shared libraries are unchanged by this patch. Also tested with the math/ tests for mips64 (in the case of fma there *was* previously an abort call generated, unlike for the other operations - one switch only deals with a subset of classes for one operand based on what could have been generated in the earlier part of fma, whereas the other switches deal with all combinations of two classes - and this is apparently too complicated for the default case to have been optimized away). * soft-fp/soft-fp.h (_FP_UNREACHABLE): New macro. * soft-fp/op-common.h (_FP_MUL): Use _FP_UNREACHABLE instead of abort. (_FP_FMA): Likewise. (_FP_DIV): Likewise.
2015-03-10soft-fp: Use multiple-include guards.Joseph Myers10-2/+47
This patch makes soft-fp headers consistently use multiple-include guards, something previously done mainly only in the Linux kernel version. The guard macros aren't the same as those used in the Linux kernel, but there seems to be enough variation in such guards in Linux kernel code that hopefully this version will be acceptable there. Tested for powerpc-nofpu that installed stripped shared libraries are unchanged by this patch. * soft-fp/double.h [SOFT_FP_DOUBLE_H]: New multiple-include guard. * soft-fp/extended.h [SOFT_FP_EXTENDED_H]: Likewise. * soft-fp/op-1.h [SOFT_FP_OP_1_H]: Likewise. * soft-fp/op-2.h [SOFT_FP_OP_2_H]: Likewise. * soft-fp/op-4.h [SOFT_FP_OP_4_H]: Likewise. * soft-fp/op-8.h [SOFT_FP_OP_8_H]: Likewise. * soft-fp/op-common.h [SOFT_FP_OP_COMMON_H]: Likewise. * soft-fp/quad.h [SOFT_FP_QUAD_H]: Likewise. * soft-fp/single.h [SOFT_FP_SINGLE_H]: Likewise. * soft-fp/soft-fp.h (SOFT_FP_H): Define to 1 rather than empty. Add comment on closing #endif.
2015-03-07soft-fp: Support conditional zero-initialization in declarations.Joseph Myers4-6/+18
In the Linux kernel, some architectures have a single function that uses different kinds of unpacking and packing depending on the instruction being emulated, meaning it is not readily visible to the compiler that variables from _FP_DECL and _FP_FRAC_DECL_* macros are only used in cases where they were initialized. The existing copy of soft-fp in the Linux kernel uses zero-initialization to avoid warnings in this case, so while frowned upon as a warning suppression mechanism in code built for glibc it seems appropriate to have such zero-initialization conditional on __KERNEL__. This patch duly adds it, via a macro _FP_ZERO_INIT that expands to empty for non-kernel compilations. Tested for powerpc-nofpu that installed stripped shared libraries are unchanged by this patch. * soft-fp/soft-fp.h (_FP_ZERO_INIT): New macro. Define depending on [__KERNEL__]. * soft-fp/op-1.h (_FP_FRAC_DECL_1): Use _FP_ZERO_INIT. * soft-fp/op-2.h (_FP_FRAC_DECL_2): Likewise. * soft-fp/op-common.h (_FP_DECL): Likewise.
2015-03-07Fix /* in comment in previous commit.Joseph Myers1-1/+1
2015-03-07soft-fp: Condition sfp-machine.h include path on __KERNEL__.Joseph Myers1-0/+4
My Linux kernel patch to update the kernel to current glibc soft-fp <https://sourceware.org/ml/libc-alpha/2015-02/msg00107.html> still leaves a few small differences between the two copies of soft-fp. I think it's desirable to avoid such differences completely if possible by having one set of sources suitable for use in both places. To that end, this patch introduces a conditional on __KERNEL__ for the path by which sfp-machine.h is included. Tested for powerpc-nofpu that installed stripped shared libraries are unchanged by this patch. * soft-fp/soft-fp.h [!_LIBC && __KERNEL__]: Include <asm/sfp-machine.h> instead of <sfp-machine.h>.
2015-02-20soft-fp: Adjust call to abort for kernel use.Joseph Myers1-1/+1
soft-fp calls abort in various cases that the code doesn't handle, all cases that should never actually occur for any supported choice of types. Calling an abort function is not appropriate for kernel use, so the Linux kernel redefines abort as a macro in various ways in the ports using this code, typically to "return 0" or similar. One use of abort in soft-fp is inside a comma expression and doesn't work with such a macro. This patch changes it to use a statement expression. Tested for powerpc-nofpu that installed shared libraries are unchanged by this patch. (There are two classes of aborts: those to make control flow visible to the compiler, in default cases of switches over _FP_CLS_COMBINE, which could reasonably change to __builtin_unreachable for glibc but would still need to handle pre-4.5 compilers for kernel use, and those intended to detect any use of soft-fp for combinations of types the code doesn't know how to handle, which could reasonably become link failures if the calls should always be optimized away. But those are separate possible future enhancements.) * soft-fp/op-common.h (_FP_FROM_INT): Wrap call to abort in expression inside statement expression.
2015-02-06soft-fp: Fix _FP_FMA when product is zero and third argument is finite (bug ↵Joseph Myers1-0/+1
17932). soft-fp's _FP_FMA fails to set the result's exponent for cases where the result of the multiplication is 0, yielding incorrect (arbitrary, depending on uninitialized values) results for those cases. This affects libm for architectures using soft-fp to implement fma. This patch adds the exponent setting and tests for this case. Tested for ARM soft-float (which uses soft-fp fma), x86_64 and x86 (to verify not introducing new libm test failures there). (This bug showed up in testing my patch to move the Linux kernel to current soft-fp. math/Makefile has "override CFLAGS += -Wno-uninitialized" which would have stopped compiler warnings from showing up this problem, although I wouldn't be surprised if removing that shows spurious warnings from this code, if the compiler fails to follow that various cases where the exponent is uninitialized don't need it initialized because the class is set to a value meaning the uninitialized exponent isn't used.) [BZ #17932] * soft-fp/op-common.h (_FP_FMA): Set exponent of result in case where multiplication results in zero and third argument is finite and nonzero. * math/auto-libm-test-in: Add more tests of fma. * math/auto-libm-test-out: Regenerated.
2015-02-06soft-fp: Refine FP_EX_DENORM handling for comparisons.Joseph Myers1-4/+45
In <https://sourceware.org/ml/libc-alpha/2014-09/msg00488.html>, I noted that comparisons in soft-fp did not set FP_EX_DENORM unless denormal operands were flushed to zero. This patch fixes soft-fp to check for denormal operands for comparisons and set that exception whenever FP_EX_DENORM is not zero. In particular, for the one architecture for which the Linux kernel defines FP_EX_DENORM (alpha), this corresponds to the existing logic for comparisons and so allows that logic to be replaced by a simple call to FP_CMP_D when soft-fp is updated in the kernel. Tested for powerpc (e500) that installed stripped shared libraries are unchanged by this patch. * soft-fp/op-common.h (_FP_CMP_CHECK_DENORM): New macro. (_FP_CMP_CHECK_FLUSH_ZERO): Likewise. (_FP_CMP): Use_FP_CMP_CHECK_DENORM and _FP_CMP_CHECK_FLUSH_ZERO. (_FP_CMP_EQ): Likewise. (_FP_CMP_UNORD): Use _FP_CMP_CHECK_DENORM.
2015-02-06soft-fp: Support floating-point extensions without quieting sNaNs.Joseph Myers1-4/+10
One special case needed in soft-fp to replace the old version in the Linux kernel is extending from a narrower floating-point format to a wider one without quieting signaling NaNs. (This is for arch/powerpc/math-emu/lfs.c, where previously it used the old FP_CONV which didn't do anything special for NaNs, then handled packing specially for NaNs to avoid quieting at packing time, and discarded the exceptions from unpacking.) This patch accordingly refactors FP_EXTEND, creating a separate _FP_EXTEND_CNAN that offers a choice of how NaNs are handled, with FP_EXTEND reimplemented as a wrapper that provides the common case of the IEEE operation that does quiet signaling NaNs and raise exceptions for them. Tested for powerpc (e500) that installed stripped shared libraries are unchanged by this patch. * soft-fp/op-common.h (FP_EXTEND): Rename to _FP_EXTEND_CNAN with extra argument CHECK_NAN. Redefine as wrapper around _FP_EXTEND_CNAN.
2015-01-22soft-fp: Use __label__ for all labels within macros.Joseph Myers1-0/+5
soft-fp has various macros containing labels and goto statements. Because label names are function-scoped, this is problematic for using the same macro more than once within a function, which some architectures do in the Linux kernel (the soft-fp version there predates the addition of any of these labels and gotos). This patch fixes this by using __label__ to make the labels local to the block with the __label__ declaration. Tested for powerpc-nofpu that installed stripped shared libraries are unchanged by this patch. * soft-fp/op-common.h (_FP_ADD_INTERNAL): Declare labels with __label__. (_FP_FMA): Likewise. (_FP_TO_INT_ROUND): Likewise. (_FP_FROM_INT): Likewise.
2015-01-02Update copyright dates with scripts/update-copyrights.Joseph Myers88-88/+88
2014-11-04soft-fp: Add _FP_TO_INT_ROUND.Joseph Myers5-0/+226
Continuing the series of patches adding soft-fp features from the kernel version of soft-fp to glibc so that glibc's version is able to replace the old fork of soft-fp in the kernel, this patch adds the last major such feature: _FP_TO_INT_ROUND, converting a floating-point number to an integer with rounding according to the current rounding direction (as opposed to truncating towards zero, which _FP_TO_INT does). The general structure of the implementation follows that of _FP_TO_INT, but of course is more complicated. As with glibc's _FP_TO_INT it works with raw input (the kernel versions of these macros predate the conversion of _FP_TO_INT and many other macros to raw or semi-raw input). I have not tried to work out what bugs there might be in the kernel version that this might fix; it's a from-scratch implementation based on _FP_TO_INT. Tested for powerpc (soft-float) that there is no change to the installed shared libraries; also tested with the libm tests with lrint / lrintf / llrint / llrintf made to use _FP_TO_INT_ROUND, to provide some test of the functionality. As we don't have benchmarks for those functions, I haven't actually included the soft-fp versions of them, although I expect them to be faster than the existing code (given that the existing code involves adding and subtracting numbers such as 0x1p52 to achieve the desired rounding, which is not particularly efficient when the underlying floating point is software floating point). 2014-11-04 Joseph Myers <joseph@codesourcery.com> * soft-fp/op-common.h (_FP_TO_INT_ROUND): New macro. * soft-fp/double.h [_FP_W_TYPE_SIZE < 64] (FP_TO_INT_ROUND_D): New macro. [_FP_W_TYPE_SIZE >= 64] (FP_TO_INT_ROUND_D): Likewise. * soft-fp/extended.h [_FP_W_TYPE_SIZE < 64] (FP_TO_INT_ROUND_E): New macro. [_FP_W_TYPE_SIZE >= 64] (FP_TO_INT_ROUND_E): Likewise. * soft-fp/quad.h [_FP_W_TYPE_SIZE < 64] (FP_TO_INT_ROUND_Q): New macro. [_FP_W_TYPE_SIZE >= 64] (FP_TO_INT_ROUND_Q): Likewise. * soft-fp/single.h (FP_TO_INT_ROUND_S): New macro.
2014-10-09soft-fp: Use parentheses around macro arguments.Joseph Myers8-305/+328
This patch cleans up the soft-fp code to use parentheses around macro arguments (where possible; many macro arguments are identifiers used with ## rather than arbitrary expressions, so cannot be put in parentheses). (I'm not aware of any bugs caused by the lack of parentheses, but this is generally good practice. The patch is not exhaustive regarding internal macros where the arguments always come directly from the mantissa of a floating-point number, although probably those should be cleaned up in this regard as well.) Tested for powerpc-nofpu that the installed shared libraries are unchanged by this patch. * soft-fp/double.h [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_RAW_D): Use parentheses around macro arguments. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_RAW_DP): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_RAW_D): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_RAW_DP): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_D): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_DP): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_SEMIRAW_D): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_SEMIRAW_DP): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_D): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_DP): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_SEMIRAW_D): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_SEMIRAW_DP): Likewise. [_FP_W_TYPE_SIZE < 64] (_FP_SQRT_MEAT_D): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_CMP_D): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_CMP_EQ_D): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_CMP_UNORD_D): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_TO_INT_D): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_FROM_INT_D): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_RAW_D): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_RAW_DP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_RAW_D): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_RAW_DP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_D): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_DP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_SEMIRAW_D): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_SEMIRAW_DP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_D): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_DP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_SEMIRAW_D): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_SEMIRAW_DP): Likewise. [_FP_W_TYPE_SIZE >= 64] (_FP_SQRT_MEAT_D): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_CMP_D): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_CMP_EQ_D): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_CMP_UNORD_D): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_TO_INT_D): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_FROM_INT_D): Likewise. * soft-fp/extended.h [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_E): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_EP): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_SEMIRAW_E): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_SEMIRAW_EP): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_E): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_EP): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_SEMIRAW_E): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_SEMIRAW_EP): Likewise. [_FP_W_TYPE_SIZE < 64] (_FP_SQRT_MEAT_E): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_CMP_E): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_CMP_EQ_E): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_CMP_UNORD_E): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_TO_INT_E): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_FROM_INT_E): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_E): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_EP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_SEMIRAW_E): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_SEMIRAW_EP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_E): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_EP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_SEMIRAW_E): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_SEMIRAW_EP): Likewise. [_FP_W_TYPE_SIZE >= 64] (_FP_SQRT_MEAT_E): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_CMP_E): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_CMP_EQ_E): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_CMP_UNORD_E): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_TO_INT_E): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_FROM_INT_E): Likewise. * soft-fp/op-1.h (_FP_FRAC_SRST_1): Likewise. (_FP_FRAC_SRS_1): Likewise. (_FP_FRAC_CLZ_1): Likewise. (_FP_MUL_MEAT_1_imm): Likewise. (_FP_MUL_MEAT_1_wide): Likewise. (_FP_MUL_MEAT_1_hard): Likewise. (_FP_SQRT_MEAT_1): Likewise. (_FP_FRAC_ASSEMBLE_1): Likewise. (_FP_FRAC_DISASSEMBLE_1): Likewise. * soft-fp/op-2.h (_FP_FRAC_CLZ_2): Likewise. (__FP_CLZ_2): Likewise. (_FP_MUL_MEAT_2_wide): Likewise. (_FP_MUL_MEAT_2_wide_3mul): Likewise. (_FP_MUL_MEAT_2_gmp): Likewise. (_FP_MUL_MEAT_2_120_240_double): Likewise. (_FP_SQRT_MEAT_2): Likewise. (_FP_FRAC_ASSEMBLE_2): Likewise. (_FP_FRAC_DISASSEMBLE_2): Likewise. * soft-fp/op-4.h (_FP_FRAC_SRS_4): Likewise. (_FP_FRAC_CLZ_4): Likewise. (_FP_MUL_MEAT_4_wide): Likewise. (_FP_MUL_MEAT_4_gmp): Likewise. (_FP_SQRT_MEAT_4): Likewise. (_FP_FRAC_ASSEMBLE_4): Likewise. (_FP_FRAC_DISASSEMBLE_4): Likewise. * soft-fp/op-common.h (_FP_CMP): Likewise. (_FP_CMP_EQ): Likewise. (_FP_CMP_UNORD): Likewise. (_FP_TO_INT): Likewise. (_FP_FROM_INT): Likewise. [!__FP_CLZ] (__FP_CLZ): Likewise. (_FP_DIV_HELP_imm): Likewise. * soft-fp/quad.h [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_RAW_Q): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_RAW_QP): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_RAW_Q): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_RAW_QP): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_Q): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_QP): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_SEMIRAW_Q): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_UNPACK_SEMIRAW_QP): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_Q): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_QP): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_SEMIRAW_Q): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_PACK_SEMIRAW_QP): Likewise. [_FP_W_TYPE_SIZE < 64] (_FP_SQRT_MEAT_Q): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_CMP_Q): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_CMP_EQ_Q): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_CMP_UNORD_Q): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_TO_INT_Q): Likewise. [_FP_W_TYPE_SIZE < 64] (FP_FROM_INT_Q): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_RAW_Q): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_RAW_QP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_RAW_Q): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_RAW_QP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_Q): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_QP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_SEMIRAW_Q): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_UNPACK_SEMIRAW_QP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_Q): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_QP): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_SEMIRAW_Q): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_PACK_SEMIRAW_QP): Likewise. [_FP_W_TYPE_SIZE >= 64] (_FP_SQRT_MEAT_Q): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_CMP_Q): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_CMP_EQ_Q): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_CMP_UNORD_Q): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_TO_INT_Q): Likewise. [_FP_W_TYPE_SIZE >= 64] (FP_FROM_INT_Q): Likewise. * soft-fp/single.h (FP_UNPACK_RAW_S): Likewise. (FP_UNPACK_RAW_SP): Likewise. (FP_PACK_RAW_S): Likewise. (FP_PACK_RAW_SP): Likewise. (FP_UNPACK_S): Likewise. (FP_UNPACK_SP): Likewise. (FP_UNPACK_SEMIRAW_S): Likewise. (FP_UNPACK_SEMIRAW_SP): Likewise. (FP_PACK_S): Likewise. (FP_PACK_SP): Likewise. (FP_PACK_SEMIRAW_S): Likewise. (FP_PACK_SEMIRAW_SP): Likewise. (_FP_SQRT_MEAT_S): Likewise. (FP_CMP_S): Likewise. (FP_CMP_EQ_S): Likewise. (FP_CMP_UNORD_S): Likewise. (FP_TO_INT_S): Likewise. (FP_FROM_INT_S): Likewise.
2014-10-09soft-fp: Support rsigned == 2 in _FP_TO_INT.Joseph Myers1-7/+38
Continuing the addition of soft-fp features in the Linux kernel version, this patch adds _FP_TO_INT support for rsigned == 2 (reduce overflowing results modulo 2^rsize to fit in the destination, used for alpha emulation). The kernel version is buggy; it can left shift by a negative amount when right shifting is required in an overflow case (the kernel version also has other bugs fixed long ago in glibc; at least, spurious exceptions converting to the most negative integer). This version avoids that by handling overflow (other than to 0) for rsigned == 2 along with the normal non-overflow case, which already properly determines the direction in which to shift. Tested for powerpc-nofpu. Some functions get slightly bigger and some get slightly smaller, no doubt as a result of the change to where in the macro "inexact" is raised, but I don't think those changes are significant. Also tested for powerpc-nofpu with the relevant __fix* functions changed to use rsigned == 2 (which is after all just as valid as rsigned == 1 in IEEE terms), including verifying the results and exceptions for various cases of conversions. With these seven patches, the one remaining feature to add for the soft-fp code to have all the features of the kernel version is _FP_TO_INT_ROUND. * soft-fp/op-common.h (_FP_TO_INT): Handle rsigned == 2.
2014-10-09soft-fp: Support more precise "invalid" exceptions.Joseph Myers2-81/+147
As previously discussed <https://sourceware.org/ml/libc-alpha/2013-10/msg00345.html>, it would be desirable to be able to use the same version of the soft-fp code in the Linux kernel as well as in glibc and libgcc (instead of an old version in the kernel that's missing ten years of bug fixes, performance improvements and new features), and to that end it is useful to add to glibc's copy features in the kernel's copy, even when they are not directly useful in glibc. To that end, this patch adds one of those features: support for more precise "invalid" exceptions describing the particular kind of invalid operation. These are relevant for powerpc emulation, and are also as described in IEEE 754-2008 as sub-exceptions. The set of sub-exceptions here is the union of those supported on powerpc and those from IEEE 754-2008 (the former adds a distinction between 0/0 and Inf/Inf; the latter adds a distinction between Inf*0 from multiplication and the same from fma). This includes sub-exceptions for sqrt, conversions to integer and comparisons that are not supported in the kernel; I see no obvious reason for these being missing from the kernel support, given that they are supported on powerpc so accurate powerpc emulation should generate them. Tested for powerpc-nofpu that the disassembly of installed shared libraries is unchanged by this patch. * soft-fp/soft-fp.h (FP_EX_INVALID_SNAN): New macro. (FP_EX_INVALID_IMZ): Likewise. (FP_EX_INVALID_IMZ_FMA): Likewise. (FP_EX_INVALID_ISI): Likewise. (FP_EX_INVALID_ZDZ): Likewise. (FP_EX_INVALID_IDI): Likewise. (FP_EX_INVALID_SQRT): Likewise. (FP_EX_INVALID_CVI): Likewise. (FP_EX_INVALID_VC): Likewise. * soft-fp/op-common.h (_FP_UNPACK_CANONICAL): Specify more precise "invalid" exceptions. (_FP_CHECK_SIGNAN_SEMIRAW): Likewise. (_FP_ADD_INTERNAL): Likewise. (_FP_MUL): Likewise. (_FP_FMA): Likewise. (_FP_DIV): Likewise. (_FP_CMP_CHECK_NAN): Likewise. (_FP_SQRT): Likewise. (_FP_TO_INT): Likewise. (FP_EXTEND): Likewise.
2014-10-09soft-fp: Add FP_DENORM_ZERO.Joseph Myers2-1/+38
Continuing the addition of soft-fp features used in the Linux kernel, this patch adds soft-fp support for FP_DENORM_ZERO (flushing input subnormal operands to zero of the same sign). There are some differences from the kernel version. In the kernel, the "inexact" exception is set when flushing to zero. This does not appear to match the documented semantics for either of the architectures (alpha and sh) for which the kernel uses FP_DENORM_ZERO, so this patch does not set "inexact" in this case. More operations now use raw or semi-raw unpacking for optimization than did in the ten-year-old soft-fp version in the kernel, so checks of FP_DENORM_ZERO are inserted in those operations. They are also inserted for comparisons (which already used raw unpacking in the old version) as I believe that's the correct thing to do when input subnormals are flushed to zero. They are *not* inserted for _FP_NEG. (If any processors do flush input subnormals to zero for negation, or otherwise vary from the rules implemented when FP_DENORM_ZERO is set, further macros for sfp-machine.h to control this may need to be added.) Although the addition for comparisons will cause FP_EX_DENORM to be set in this case, it still won't be set for comparisons involving subnormals when not flushed to zero. It's quite possible that accurate emulation of processors that have such an exception for subnorm