]> sourceware.org Git - glibc.git/commitdiff
Fix tgmath.h for __int128 (bug 21686).
authorJoseph Myers <joseph@codesourcery.com>
Wed, 2 Aug 2017 20:16:05 +0000 (20:16 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 2 Aug 2017 20:16:05 +0000 (20:16 +0000)
When a tgmath.h macro is passed a double argument and an argument of
type __int128, it generates a call to a long double function (although
the result still gets converted to type double).  __int128 is similar
enough to integer types that it should be handled consistently like
them, so always like double for these macros rather than sometimes
like double and sometimes like long double.  This patch fixes the
logic accordingly and makes gen-tgmath-tests.py generate tests for
__int128.

Tested for x86_64 and x86.

[BZ #21686]
* math/tgmath.h (__TGMATH_BINARY_REAL_ONLY): Add arguments before
comparing size with that of double.
(__TGMATH_BINARY_REAL_STD_ONLY): Likewise.
(__TGMATH_BINARY_REAL_RET_ONLY): Likewise.
(__TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY): Likewise.
(__TGMATH_TERNARY_REAL_ONLY): Likewise.
(__TGMATH_BINARY_REAL_IMAG): Likewise.
* math/gen-tgmath-tests.py (Type.init_types): Create __int128 and
unsigned __int128 types.

ChangeLog
math/gen-tgmath-tests.py
math/tgmath.h

index 2125236df898888c2ef3427965c0aa8a44c2cb23..a3bc654f650e7089b008825d009d869577edf385 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2017-08-02  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #21686]
+       * math/tgmath.h (__TGMATH_BINARY_REAL_ONLY): Add arguments before
+       comparing size with that of double.
+       (__TGMATH_BINARY_REAL_STD_ONLY): Likewise.
+       (__TGMATH_BINARY_REAL_RET_ONLY): Likewise.
+       (__TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY): Likewise.
+       (__TGMATH_TERNARY_REAL_ONLY): Likewise.
+       (__TGMATH_BINARY_REAL_IMAG): Likewise.
+       * math/gen-tgmath-tests.py (Type.init_types): Create __int128 and
+       unsigned __int128 types.
+
 2017-08-02  Steve Ellcey  <sellcey@cavium.com>
 
        * localedata/Makefile (CFLAGS-tst_iswalnum.c, CFLAGS-tst_iswalpha.c
index e749e3d8b0f227e518cefdd47b95db880c716994..9044670326a1d5e5c40c342bb6ed334f74fa5989 100755 (executable)
@@ -195,6 +195,10 @@ class Type(object):
         Type.create_type('unsigned long int', integer=True)
         Type.create_type('long long int', integer=True)
         Type.create_type('unsigned long long int', integer=True)
+        Type.create_type('__int128', integer=True,
+                         condition='defined __SIZEOF_INT128__')
+        Type.create_type('unsigned __int128', integer=True,
+                         condition='defined __SIZEOF_INT128__')
         Type.create_type('enum e', integer=True, complex_ok=False)
         Type.create_type('_Bool', integer=True, complex_ok=False)
         Type.create_type('bit_field', integer=True, complex_ok=False)
index 211948c2e4c322e08e42ca933cd9a4a7e3cfaa33..019f072e3ee6407887ecd8d53783f8d51d1b2f67 100644 (file)
                     : (__tgmath_real_type (Val1)) __tgml(Fct) (Val1, Val2)))
 
 # define __TGMATH_BINARY_REAL_ONLY(Val1, Val2, Fct) \
-     (__extension__ (((sizeof (+(Val1)) > sizeof (double)                    \
-                      || sizeof (+(Val2)) > sizeof (double))                 \
+     (__extension__ ((sizeof ((Val1) + (Val2)) > sizeof (double)             \
                      && __builtin_classify_type ((Val1) + (Val2)) == 8)      \
                     ? __TGMATH_F128 ((Val1) + (Val2),                        \
                                      (__typeof                               \
                       Fct##f (Val1, Val2)))
 
 # define __TGMATH_BINARY_REAL_STD_ONLY(Val1, Val2, Fct) \
-     (__extension__ (((sizeof (+(Val1)) > sizeof (double)                    \
-                      || sizeof (+(Val2)) > sizeof (double))                 \
+     (__extension__ ((sizeof ((Val1) + (Val2)) > sizeof (double)             \
                      && __builtin_classify_type ((Val1) + (Val2)) == 8)      \
                     ? (__typeof ((__tgmath_real_type (Val1)) 0               \
                                  + (__tgmath_real_type (Val2)) 0))           \
                       Fct##f (Val1, Val2)))
 
 # define __TGMATH_BINARY_REAL_RET_ONLY(Val1, Val2, Fct) \
-     (__extension__ (((sizeof (+(Val1)) > sizeof (double)                    \
-                      || sizeof (+(Val2)) > sizeof (double))                 \
+     (__extension__ ((sizeof ((Val1) + (Val2)) > sizeof (double)             \
                      && __builtin_classify_type ((Val1) + (Val2)) == 8)      \
                     ? __TGMATH_F128 ((Val1) + (Val2), Fct, (Val1, Val2))     \
                     __tgml(Fct) (Val1, Val2)                                 \
                     : Fct##f (Val1, Val2)))
 
 # define __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY(Val1, Val2, Val3, Fct) \
-     (__extension__ (((sizeof (+(Val1)) > sizeof (double)                    \
-                      || sizeof (+(Val2)) > sizeof (double))                 \
+     (__extension__ ((sizeof ((Val1) + (Val2)) > sizeof (double)             \
                      && __builtin_classify_type ((Val1) + (Val2)) == 8)      \
                     ? __TGMATH_F128 ((Val1) + (Val2),                        \
                                      (__typeof                               \
                       Fct##f (Val1, Val2, Val3)))
 
 # define __TGMATH_TERNARY_REAL_ONLY(Val1, Val2, Val3, Fct) \
-     (__extension__ (((sizeof (+(Val1)) > sizeof (double)                    \
-                      || sizeof (+(Val2)) > sizeof (double)                  \
-                      || sizeof (+(Val3)) > sizeof (double))                 \
+     (__extension__ ((sizeof ((Val1) + (Val2) + (Val3)) > sizeof (double)     \
                      && __builtin_classify_type ((Val1) + (Val2) + (Val3))   \
                         == 8)                                                \
                     ? __TGMATH_F128 ((Val1) + (Val2) + (Val3),               \
 /* XXX This definition has to be changed as soon as the compiler understands
    the imaginary keyword.  */
 # define __TGMATH_BINARY_REAL_IMAG(Val1, Val2, Fct, Cfct) \
-     (__extension__ (((sizeof (+__real__ (Val1)) > sizeof (double)           \
-                      || sizeof (+__real__ (Val2)) > sizeof (double))        \
+     (__extension__ ((sizeof (__real__ (Val1)                                \
+                             + __real__ (Val2)) > sizeof (double)            \
                      && __builtin_classify_type (__real__ (Val1)             \
                                                  + __real__ (Val2)) == 8)    \
                     ? __TGMATH_CF128 ((Val1) + (Val2),                       \
This page took 0.051506 seconds and 5 git commands to generate.