diff options
author | Joseph Myers <joseph@codesourcery.com> | 2014-02-12 23:24:49 +0000 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2014-02-12 23:24:49 +0000 |
commit | 9acf28f153b65a5846fa05db300ed0442942ed2f (patch) | |
tree | a4459861fa9875cdaf31855a407a355d3c33e063 /libgcc/soft-fp/op-common.h | |
parent | f494a60736382fadf1b11f39c754fcfd2346b946 (diff) | |
download | gcc-9acf28f153b65a5846fa05db300ed0442942ed2f.zip gcc-9acf28f153b65a5846fa05db300ed0442942ed2f.tar.gz gcc-9acf28f153b65a5846fa05db300ed0442942ed2f.tar.bz2 |
float128-mul-underflow.c, [...]: New tests.
gcc/testsuite:
* gcc.dg/torture/float128-mul-underflow.c,
gcc.dg/torture/float128-truncdf-underflow.c,
gcc.dg/torture/float128-truncsf-underflow.c: New tests.
libgcc:
* soft-fp/adddf3.c: Update from glibc.
* soft-fp/addsf3.c: Likewise.
* soft-fp/addtf3.c: Likewise.
* soft-fp/divdf3.c: Likewise.
* soft-fp/divsf3.c: Likewise.
* soft-fp/divtf3.c: Likewise.
* soft-fp/double.h: Likewise.
* soft-fp/eqdf2.c: Likewise.
* soft-fp/eqsf2.c: Likewise.
* soft-fp/eqtf2.c: Likewise.
* soft-fp/extenddftf2.c: Likewise.
* soft-fp/extended.h: Likewise.
* soft-fp/extendsfdf2.c: Likewise.
* soft-fp/extendsftf2.c: Likewise.
* soft-fp/extendxftf2.c: Likewise.
* soft-fp/fixdfdi.c: Likewise.
* soft-fp/fixdfsi.c: Likewise.
* soft-fp/fixdfti.c: Likewise.
* soft-fp/fixsfdi.c: Likewise.
* soft-fp/fixsfsi.c: Likewise.
* soft-fp/fixsfti.c: Likewise.
* soft-fp/fixtfdi.c: Likewise.
* soft-fp/fixtfsi.c: Likewise.
* soft-fp/fixtfti.c: Likewise.
* soft-fp/fixunsdfdi.c: Likewise.
* soft-fp/fixunsdfsi.c: Likewise.
* soft-fp/fixunsdfti.c: Likewise.
* soft-fp/fixunssfdi.c: Likewise.
* soft-fp/fixunssfsi.c: Likewise.
* soft-fp/fixunssfti.c: Likewise.
* soft-fp/fixunstfdi.c: Likewise.
* soft-fp/fixunstfsi.c: Likewise.
* soft-fp/fixunstfti.c: Likewise.
* soft-fp/floatdidf.c: Likewise.
* soft-fp/floatdisf.c: Likewise.
* soft-fp/floatditf.c: Likewise.
* soft-fp/floatsidf.c: Likewise.
* soft-fp/floatsisf.c: Likewise.
* soft-fp/floatsitf.c: Likewise.
* soft-fp/floattidf.c: Likewise.
* soft-fp/floattisf.c: Likewise.
* soft-fp/floattitf.c: Likewise.
* soft-fp/floatundidf.c: Likewise.
* soft-fp/floatundisf.c: Likewise.
* soft-fp/floatunditf.c: Likewise.
* soft-fp/floatunsidf.c: Likewise.
* soft-fp/floatunsisf.c: Likewise.
* soft-fp/floatunsitf.c: Likewise.
* soft-fp/floatuntidf.c: Likewise.
* soft-fp/floatuntisf.c: Likewise.
* soft-fp/floatuntitf.c: Likewise.
* soft-fp/gedf2.c: Likewise.
* soft-fp/gesf2.c: Likewise.
* soft-fp/getf2.c: Likewise.
* soft-fp/ledf2.c: Likewise.
* soft-fp/lesf2.c: Likewise.
* soft-fp/letf2.c: Likewise.
* soft-fp/muldf3.c: Likewise.
* soft-fp/mulsf3.c: Likewise.
* soft-fp/multf3.c: Likewise.
* soft-fp/negdf2.c: Likewise.
* soft-fp/negsf2.c: Likewise.
* soft-fp/negtf2.c: Likewise.
* soft-fp/op-1.h: Likewise.
* soft-fp/op-2.h: Likewise.
* soft-fp/op-4.h: Likewise.
* soft-fp/op-8.h: Likewise.
* soft-fp/op-common.h: Likewise.
* soft-fp/quad.h: Likewise.
* soft-fp/single.h: Likewise.
* soft-fp/soft-fp.h: Likewise.
* soft-fp/subdf3.c: Likewise.
* soft-fp/subsf3.c: Likewise.
* soft-fp/subtf3.c: Likewise.
* soft-fp/truncdfsf2.c: Likewise.
* soft-fp/trunctfdf2.c: Likewise.
* soft-fp/trunctfsf2.c: Likewise.
* soft-fp/trunctfxf2.c: Likewise.
* soft-fp/unorddf2.c: Likewise.
* soft-fp/unordsf2.c: Likewise.
* soft-fp/unordtf2.c: Likewise.
* config/aarch64/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING): New
macro.
* config/arm/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
* config/c6x/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
* config/cris/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
* config/i386/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
* config/ia64/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
* config/lm32/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
* config/mips/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
* config/moxie/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
* config/nds32/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
* config/nios2/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
* config/rs6000/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
* config/score/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
* config/tilegx/sfp-machine32.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
* config/tilegx/sfp-machine64.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
* config/tilepro/sfp-machine.h (_FP_TININESS_AFTER_ROUNDING):
Likewise.
From-SVN: r207742
Diffstat (limited to 'libgcc/soft-fp/op-common.h')
-rw-r--r-- | libgcc/soft-fp/op-common.h | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/libgcc/soft-fp/op-common.h b/libgcc/soft-fp/op-common.h index 67cdc33..6f8c1f3 100644 --- a/libgcc/soft-fp/op-common.h +++ b/libgcc/soft-fp/op-common.h @@ -1,5 +1,5 @@ /* Software floating-point emulation. Common operations. - Copyright (C) 1997-2013 Free Software Foundation, Inc. + Copyright (C) 1997-2014 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), @@ -32,7 +32,7 @@ #define _FP_DECL(wc, X) \ _FP_I_TYPE X##_c __attribute__ ((unused)); \ _FP_I_TYPE X##_s __attribute__ ((unused)); \ - _FP_I_TYPE X##_e; \ + _FP_I_TYPE X##_e __attribute__ ((unused)); \ _FP_FRAC_DECL_##wc (X) /* Test whether the qNaN bit denotes a signaling NaN. */ @@ -191,8 +191,22 @@ #define _FP_PACK_SEMIRAW(fs, wc, X) \ do \ { \ + int _FP_PACK_SEMIRAW_is_tiny \ + = X##_e == 0 && !_FP_FRAC_ZEROP_##wc (X); \ + if (_FP_TININESS_AFTER_ROUNDING \ + && _FP_PACK_SEMIRAW_is_tiny) \ + { \ + FP_DECL_##fs (_FP_PACK_SEMIRAW_T); \ + _FP_FRAC_COPY_##wc (_FP_PACK_SEMIRAW_T, X); \ + _FP_PACK_SEMIRAW_T##_s = X##_s; \ + _FP_PACK_SEMIRAW_T##_e = X##_e; \ + _FP_FRAC_SLL_##wc (_FP_PACK_SEMIRAW_T, 1); \ + _FP_ROUND (wc, _FP_PACK_SEMIRAW_T); \ + if (_FP_FRAC_OVERP_##wc (fs, _FP_PACK_SEMIRAW_T)) \ + _FP_PACK_SEMIRAW_is_tiny = 0; \ + } \ _FP_ROUND (wc, X); \ - if (X##_e == 0 && !_FP_FRAC_ZEROP_##wc (X)) \ + if (_FP_PACK_SEMIRAW_is_tiny) \ { \ if ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT) \ || (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW)) \ @@ -279,6 +293,17 @@ else \ { \ /* we've got a denormalized number */ \ + int _FP_PACK_CANONICAL_is_tiny = 1; \ + if (_FP_TININESS_AFTER_ROUNDING && X##_e == 0) \ + { \ + FP_DECL_##fs (_FP_PACK_CANONICAL_T); \ + _FP_FRAC_COPY_##wc (_FP_PACK_CANONICAL_T, X); \ + _FP_PACK_CANONICAL_T##_s = X##_s; \ + _FP_PACK_CANONICAL_T##_e = X##_e; \ + _FP_ROUND (wc, _FP_PACK_CANONICAL_T); \ + if (_FP_FRAC_OVERP_##wc (fs, _FP_PACK_CANONICAL_T)) \ + _FP_PACK_CANONICAL_is_tiny = 0; \ + } \ X##_e = -X##_e + 1; \ if (X##_e <= _FP_WFRACBITS_##fs) \ { \ @@ -296,8 +321,10 @@ X##_e = 0; \ _FP_FRAC_SRL_##wc (X, _FP_WORKBITS); \ } \ - if ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT) \ - || (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW)) \ + if (_FP_PACK_CANONICAL_is_tiny \ + && ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT) \ + || (FP_TRAPPING_EXCEPTIONS \ + & FP_EX_UNDERFLOW))) \ FP_SET_EXCEPTION (FP_EX_UNDERFLOW); \ } \ else \ |