mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-09 23:00:07 +00:00
Fix tgmath.h for __int128 (bug 21686).
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.
This commit is contained in:
parent
b7f95f493b
commit
42df8d5921
13
ChangeLog
13
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
|
||||
|
@ -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)
|
||||
|
@ -129,8 +129,7 @@
|
||||
: (__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 \
|
||||
@ -152,8 +151,7 @@
|
||||
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)) \
|
||||
@ -170,8 +168,7 @@
|
||||
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) \
|
||||
@ -183,8 +180,7 @@
|
||||
: 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 \
|
||||
@ -206,9 +202,7 @@
|
||||
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), \
|
||||
@ -312,8 +306,8 @@
|
||||
/* 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), \
|
||||
|
Loading…
Reference in New Issue
Block a user