aboutsummaryrefslogtreecommitdiff
path: root/libgcc/libgcc2.c
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2016-09-08 00:02:56 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2016-09-08 00:02:56 +0100
commitd758aeb5ff42960da0b3859b453bb302f5c03e17 (patch)
treeb2d035589299cc6d5f834625b1830b4412fe7a20 /libgcc/libgcc2.c
parent34718542cb800bc0d8f0189033912f2817198bdc (diff)
downloadgcc-d758aeb5ff42960da0b3859b453bb302f5c03e17.zip
gcc-d758aeb5ff42960da0b3859b453bb302f5c03e17.tar.gz
gcc-d758aeb5ff42960da0b3859b453bb302f5c03e17.tar.bz2
Correct libgcc complex multiply excess precision handling (PR libgcc/77519).
libgcc complex multiply is meant to eliminate excess precision from certain internal values by forcing them to memory in exactly those cases where the type has excess precision. But in https://gcc.gnu.org/ml/gcc-patches/2014-09/msg01894.html I accidentally inverted the logic so that values get forced to memory in exactly the cases where it's not needed. (This is a pessimization in the no-excess-precision case, in principle could lead to bad results depending on code generation in the excess-precision case. Note: I do not have a test demonstrating bad results.) Bootstrapped with no regressions on x86_64-pc-linux-gnu. Code size went down on x86_64 as expected; old sizes: text data bss dec hex filename 887 0 0 887 377 _muldc3.o 810 0 0 810 32a _mulsc3.o 2032 0 0 2032 7f0 _multc3.o 983 0 0 983 3d7 _mulxc3.o New sizes: 847 0 0 847 34f _muldc3.o 770 0 0 770 302 _mulsc3.o 2032 0 0 2032 7f0 _multc3.o 951 0 0 951 3b7 _mulxc3.o PR libgcc/77519 * libgcc2.c (NOTRUNC): Invert settings. From-SVN: r240033
Diffstat (limited to 'libgcc/libgcc2.c')
-rw-r--r--libgcc/libgcc2.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/libgcc/libgcc2.c b/libgcc/libgcc2.c
index 0a716bf..4f0e199 100644
--- a/libgcc/libgcc2.c
+++ b/libgcc/libgcc2.c
@@ -1866,25 +1866,25 @@ NAME (TYPE x, int m)
# define CTYPE SCtype
# define MODE sc
# define CEXT __LIBGCC_SF_FUNC_EXT__
-# define NOTRUNC __LIBGCC_SF_EXCESS_PRECISION__
+# define NOTRUNC (!__LIBGCC_SF_EXCESS_PRECISION__)
#elif defined(L_muldc3) || defined(L_divdc3)
# define MTYPE DFtype
# define CTYPE DCtype
# define MODE dc
# define CEXT __LIBGCC_DF_FUNC_EXT__
-# define NOTRUNC __LIBGCC_DF_EXCESS_PRECISION__
+# define NOTRUNC (!__LIBGCC_DF_EXCESS_PRECISION__)
#elif defined(L_mulxc3) || defined(L_divxc3)
# define MTYPE XFtype
# define CTYPE XCtype
# define MODE xc
# define CEXT __LIBGCC_XF_FUNC_EXT__
-# define NOTRUNC __LIBGCC_XF_EXCESS_PRECISION__
+# define NOTRUNC (!__LIBGCC_XF_EXCESS_PRECISION__)
#elif defined(L_multc3) || defined(L_divtc3)
# define MTYPE TFtype
# define CTYPE TCtype
# define MODE tc
# define CEXT __LIBGCC_TF_FUNC_EXT__
-# define NOTRUNC __LIBGCC_TF_EXCESS_PRECISION__
+# define NOTRUNC (!__LIBGCC_TF_EXCESS_PRECISION__)
#else
# error
#endif