* math/tgmath.h: Make nested function calls work.
This commit is contained in:
Ulrich Drepper 1998-10-20 21:18:11 +00:00
parent 10411f2d14
commit 48244d0931
6 changed files with 2011 additions and 73 deletions

View File

@ -1,5 +1,7 @@
1998-10-19 Ulrich Drepper <drepper@cygnus.com>
* math/tgmath.h: Make nested function calls work.
* include/ldsodefs.h: Fix typo.
* posix/Makefile (tests): Add tst-preadwrite.

26
FAQ
View File

@ -89,6 +89,7 @@ please let me know.
which is not acceptable for me. What can I do?
2.22. I just upgraded my Linux system to glibc and now I get
errors whenever I try to link any program.
2.23. When I use nscd the machine freezes.
3. Source and binary incompatibilities, and what to do about them
@ -223,16 +224,16 @@ to them.
1.5. Which compiler should I use for powerpc?
{GK} You want to use egcs 1.0.1 or later (together with the right versions
{GK} You want to use egcs 1.1 or later (together with the right versions
of all the other tools, of course).
In fact, egcs 1.0.1 has a serious bug that prevents a clean make, relating
to switch statement folding. It also causes the resulting shared libraries
to use more memory than they should. There is a patch at:
In fact, egcs 1.1 has a bug that causes linuxthreads to be
miscompiled, resulting in segmentation faults when using condition
variables. There is a temporary patch at:
<http://discus.anu.edu.au/~geoffk/egcs-1.0.1-geoffk.diff>
<http://discus.anu.edu.au/~geoffk/egcs-3.diff>
Later versions of egcs may fix these problems.
Later versions of egcs may fix this problem.
1.6. Do I need some more things to compile GNU C Library?
@ -889,6 +890,19 @@ an installation of glibc that is configured with --prefix=/usr should help
detect these situations. If the script reports problems, something is
really screwed up.
2.23. When I use nscd the machine freezes.
{UD} It is well known that you cannot use nscd with Linux 2.0.*. There
is functionality missing in the kernel and work-arounds are not suitable.
Beside this some parts of the kernel are too buggy when it comes to using
threads.
So you have the possibilities to run Linux 2.0.* or update to a higher
version and start using nscd.
Note that I have at this point no information about any other platform.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12
FAQ.in
View File

@ -731,6 +731,18 @@ an installation of glibc that is configured with --prefix=/usr should help
detect these situations. If the script reports problems, something is
really screwed up.
?? When I use nscd the machine freezes.
{UD} It is well known that you cannot use nscd with Linux 2.0.*. There
is functionality missing in the kernel and work-arounds are not suitable.
Beside this some parts of the kernel are too buggy when it comes to using
threads.
So you have the possibilities to run Linux 2.0.* or update to a higher
version and start using nscd.
Note that I have at this point no information about any other platform.
? Source and binary incompatibilities, and what to do about them
?? I expect GNU libc to be 100% source code compatible with

1508
INTERFACE Normal file

File diff suppressed because it is too large Load Diff

360
NEWS
View File

@ -55,8 +55,30 @@ Version 2.1
* An implementation of profiling shared libraries was added by Ulrich Drepper.
* Thorsten Kukuk provided an implementation for a caching daemon for NSS
(nscd).
* Thorsten Kukuk and Ulrich Drepper provided an implementation for a caching
daemon for NSS (nscd).
Missing a better place here are some numbers on improvements. Under
Linux 2.1.125 un-tar-ing the kernel sources takes
user system wall
using local files 12.19s 6.88s 22.91s
using NIS 13.92s 8.91s 26.34s
using NIS & nscd 10.37s 7.34s 25.30s
using NIS & old nscd [1] 13.83s 8.32s 29.60s
When NIS+ is used instead of NIS the benefit from using nscd is much bigger.
Keep in mind that non-namelookup related operations dominate above times.
It was just a common complain that using NIS+ unpacking the kernel is
horribly slow. When using nscd unpacking is now even faster than using
NIS.
[1] The old nscd implementation is not anymore available since it was
distributed with glibc up to version 2.0.98.
* Tim Waugh provided an implementation of the POSIX.2 wordexp function family.
@ -66,6 +88,340 @@ Version 2.1
and $PLATFORM) in RPATHs and similar strings (Ulrich Drepper).
* rcmd can now handle netgroups (Dick Streefland).
* Interface changes relative to the latest 2.0.x release:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
addseverity NEW: fmtmsg
alphasort64 NEW: LFS
argp_err_exit_status NEW: argp
argp_error NEW: argp
argp_failure NEW: argp
argp_help NEW: argp
argp_parse NEW: argp
argp_program_bug_address NEW: argp
argp_program_version NEW: argp
argp_program_version_hook NEW: argp
argp_state_help NEW: argp
argp_usage NEW: argp
authdes_create NEW: NIS+
authdes_getucred NEW: NIS+
authdes_pk_create NEW: NIS+
backtrace NEW: GNU ext.
backtrace_symbols NEW: GNU ext.
backtrace_symbols_fd NEW: GNU ext.
cacos NEW: ISO C 9x
cacosf NEW: ISO C 9x
cacosh NEW: ISO C 9x
cacoshf NEW: ISO C 9x
cacoshl NEW: ISO C 9x
cacosl NEW: ISO C 9x
capget NEW: kernel
capset NEW: kernel
carg NEW: ISO C 9x
cargf NEW: ISO C 9x
cargl NEW: ISO C 9x
casin NEW: ISO C 9x
casinf NEW: ISO C 9x
casinh NEW: ISO C 9x
casinhf NEW: ISO C 9x
casinhl NEW: ISO C 9x
casinl NEW: ISO C 9x
catan NEW: ISO C 9x
catanf NEW: ISO C 9x
catanh NEW: ISO C 9x
catanhf NEW: ISO C 9x
catanhl NEW: ISO C 9x
catanl NEW: ISO C 9x
cbc_crypt NEW: NIS+
ccos NEW: ISO C 9x
ccosf NEW: ISO C 9x
ccosh NEW: ISO C 9x
ccoshf NEW: ISO C 9x
ccoshl NEW: ISO C 9x
ccosl NEW: ISO C 9x
cexp NEW: ISO C 9x
cexpf NEW: ISO C 9x
cexpl NEW: ISO C 9x
cimag NEW: ISO C 9x
cimagf NEW: ISO C 9x
cimagl NEW: ISO C 9x
clearerr_locked REMOVED
clntunix_create NEW: sunrpc ext
clog NEW: ISO C 9x
clog10 NEW: ISO C 9x
clog10f NEW: ISO C 9x
clog10l NEW: ISO C 9x
clogf NEW: ISO C 9x
clogl NEW: ISO C 9x
conj NEW: ISO C 9x
conjf NEW: ISO C 9x
conjl NEW: ISO C 9x
cpow NEW: ISO C 9x
cpowf NEW: ISO C 9x
cpowl NEW: ISO C 9x
cproj NEW: ISO C 9x
cprojf NEW: ISO C 9x
cprojl NEW: ISO C 9x
creal NEW: ISO C 9x
crealf NEW: ISO C 9x
creall NEW: ISO C 9x
creat64 NEW: LFS
csin NEW: ISO C 9x
csinf NEW: ISO C 9x
csinh NEW: ISO C 9x
csinhf NEW: ISO C 9x
csinhl NEW: ISO C 9x
csinl NEW: ISO C 9x
csqrt NEW: ISO C 9x
csqrtf NEW: ISO C 9x
csqrtl NEW: ISO C 9x
ctan NEW: ISO C 9x
ctanf NEW: ISO C 9x
ctanh NEW: ISO C 9x
ctanhf NEW: ISO C 9x
ctanhl NEW: ISO C 9x
ctanl NEW: ISO C 9x
des_setparity NEW: NIS+
ecb_crypt NEW: NIS+
endutxent NEW: utmpx
exp10 NEW: ISO C 9x
exp10f NEW: ISO C 9x
exp10l NEW: ISO C 9x
exp2 NEW: ISO C 9x
exp2f NEW: ISO C 9x
exp2l NEW: ISO C 9x
fattach NEW: STREAMS
fdetach NEW: STREAMS
fdim NEW: ISO C 9x
fdimf NEW: ISO C 9x
fdiml NEW: ISO C 9x
feclearexcept NEW: ISO C 9x
fegetenv NEW: ISO C 9x
fegetexceptflag NEW: ISO C 9x
fegetround NEW: ISO C 9x
feholdexcept NEW: ISO C 9x
feof_locked REMOVED
feraiseexcept NEW: ISO C 9x
ferror_locked REMOVED
fesetenv NEW: ISO C 9x
fesetexceptflag NEW: ISO C 9x
fesetround NEW: ISO C 9x
fetestexcept NEW: ISO C 9x
feupdateenv NEW: ISO C 9x
fflush_locked REMOVED
ffsl NEW: GNU ext.
ffsll NEW: GNU ext.
fgetpos64 NEW: LFS
fgets_unlocked NEW: GNU ext.
fileno_locked REMOVED
fma NEW: ISO C 9x
fmaf NEW: ISO C 9x
fmal NEW: ISO C 9x
fmax NEW: ISO C 9x
fmaxf NEW: ISO C 9x
fmaxl NEW: ISO C 9x
fmin NEW: ISO C 9x
fminf NEW: ISO C 9x
fminl NEW: ISO C 9x
fmtmsg NEW: fmtmsg
fopen64 NEW: LFS
fputc_locked REMOVED
fputs_unlocked NEW: GNU ext.
fread_unlocked NEW: GNU ext.
freopen64 NEW: LFS
fseeko NEW: Unix98
fsetpos64 NEW: LFS
fstatfs64 NEW: LFS
fstatvfs NEW: Unix98
fstatvfs64 NEW: LFS
ftello NEW: Unix98
ftello64 NEW: LFS
ftruncate64 NEW: LFS
ftw64 NEW: LFS
fwrite_unlocked NEW: GNU ext.
gai_strerror NEW: IPv6
gamma_r REMOVED
gammaf_r REMOVED
gammal_r REMOVED
getchar_locked REMOVED
getdate NEW: Unix98
getdate_err NEW: Unix98
getdate_r NEW: GNU ext.
getmsg NEW: STREAMS
getnameinfo NEW: IPv6
getnetname NEW: IPv6
getpmsg NEW: STREAMS
getpt NEW: Unix98 PTY
getrlimit64 NEW: LFS
getutxent NEW: utmpx
getutxid NEW: utmpx
getutxline NEW: utmpx
glob64 NEW: GNU ext.
globfree64 NEW: GNU ext.
gnu_get_libc_release NEW: GNU ext.
gnu_get_libc_version NEW: GNU ext.
grantpt NEW: Unix98 PTY
host2netname NEW: IPv6
iconv NEW: iconv
iconv_close NEW: iconv
iconv_open NEW: iconv
if_freenameindex NEW: IPv6
if_indextoname NEW: IPv6
if_nameindex NEW: IPv6
if_nametoindex NEW: IPv6
in6addr_any NEW: IPv6
in6addr_loopback NEW: IPv6
inet6_isipv4mapped NEW: IPv6
isastream NEW: STREAMS
iswblank NEW: GNU ext.
key_decryptsession NEW: NIS+
key_decryptsession_pk NEW: NIS+
key_encryptsession NEW: NIS+
key_encryptsession_pk NEW: NIS+
key_gendes NEW: NIS+
key_get_conv NEW: NIS+
key_secretkey_is_set NEW: NIS+
key_setnet NEW: NIS+
key_setsecret NEW: NIS+
llrint NEW: ISO C 9x
llrintf NEW: ISO C 9x
llrintl NEW: ISO C 9x
llround NEW: ISO C 9x
llroundf NEW: ISO C 9x
llroundl NEW: ISO C 9x
log2 NEW: ISO C 9x
log2f NEW: ISO C 9x
log2l NEW: ISO C 9x
lrint NEW: ISO C 9x
lrintf NEW: ISO C 9x
lrintl NEW: ISO C 9x
lround NEW: ISO C 9x
lroundf NEW: ISO C 9x
lroundl NEW: ISO C 9x
lseek64 NEW: LFS
makecontext NEW: Unix98
mempcpy NEW: GNU ext.
mmap64 NEW: LFS
moncontrol REMOVED
modify_ldt NEW: kernel
nan NEW: ISO C 9x
nanf NEW: ISO C 9x
nanl NEW: ISO C 9x
nearbyint NEW: ISO C 9x
nearbyintf NEW: ISO C 9x
nearbyintl NEW: ISO C 9x
netname2host NEW: IPv6
netname2user NEW: IPv6
nextafterx NEW: ISO C 9x
nextafterxf NEW: ISO C 9x
nftw NEW: Unix98
nftw64 NEW: LFS
open64 NEW: LFS
passwd2des NEW: NIS+
pow10 NEW: GNU ext.
pow10f NEW: GNU ext.
pow10l NEW: GNU ext.
pread NEW: Unix98
pread64 NEW: LFS
printf_size NEW: GNU ext.
printf_size_info NEW: GNU ext.
profil_counter REMOVED
pthread_mutexattr_getkind_np REPLACED
pthread_mutexattr_setkind_np REPLACED
ptsname NEW: Unix98 PTY
ptsname_r NEW: Unix98 PTY
putc_locked REMOVED
putchar_locked REMOVED
putgrent NEW: GNU ext.
putmsg NEW: STREAMS
putpmsg NEW: STREAMS
pututxline NEW: utmpx
pwrite NEW: Unix98
pwrite64 NEW: LFS
readdir64 NEW: LFS
readdir64_r NEW: LFS
remquo NEW: ISO C 9x
remquof NEW: ISO C 9x
remquol NEW: ISO C 9x
round NEW: ISO C 9x
roundf NEW: ISO C 9x
roundl NEW: ISO C 9x
rtime NEW: GNU ext.
scalbln NEW: ISO C 9x
scalblnf NEW: ISO C 9x
scalblnl NEW: ISO C 9x
scandir64 NEW: LFS
sendfile NEW: kernel
setcontext NEW: Unix98
setrlimit64 NEW: LFS
setutxent NEW: utmpx
sighold NEW: Unix98
sigignore NEW: Unix98
sigqueue NEW: POSIX.1b
sigrelse NEW: Unix98
sigset NEW: POSIX.1b
sigtimedwait NEW: POSIX.1b
sigwaitinfo NEW: POSIX.1b
sincos NEW: GNU ext.
sincosf NEW: GNU ext.
sincosl NEW: GNU ext.
statfs64 NEW: LFS
statvfs NEW: Unix98
statvfs64 NEW: LFS
strcasestr NEW: GNU ext.
strfxtime NEW: ISO C 9x
strtoimax NEW: ISO C 9x
strtoumax NEW: ISO C 9x
strverscmp NEW: GNU ext.
svcauthdes_stats NEW: NIS+
svcunix_create NEW: sunrpc etx
svcunixfd_create NEW: sunrpc ext
swapcontext NEW: Unix98
tcgetsid NEW: Unix98 PTY
tdestroy NEW: GNU ext.
tgamma NEW: ISO C 9x
tgammaf NEW: ISO C 9x
tgammal NEW: ISO C 9x
tmpfile64 NEW: LFS
trunc NEW: ISO C 9x
truncate64 NEW: LFS
truncf NEW: ISO C 9x
truncl NEW: ISO C 9x
umount2 NEW: kernel
unlockpt NEW: Unix98 PTY
updwtmpx NEW: utmpx
user2netname NEW: IPv6
utmpxname NEW: utmpx
versionsort NEW: GNU ext.
versionsort64 NEW: LFS
waitid NEW: Unix98
wcscasecmp NEW: GNU ext.
wcsncasecmp NEW: GNU ext.
wcsnlen NEW: GNU ext.
wcstoimax NEW: ISO C 9x
wcstoll NEW: ISO C 9x
wcstoull NEW: ISO C 9x
wcstoumax NEW: ISO C 9x
wcswcs NEW: Unix98
wordexp NEW: POSIX.2
wordfree NEW: POSIX.2
write_profiling REMOVED
xdecrypt NEW: NIS+
xdr_authdes_cred NEW: NIS+
xdr_authdes_verf NEW: NIS+
xdr_cryptkeyarg NEW: NIS+
xdr_cryptkeyarg2 NEW: NIS+
xdr_cryptkeyres NEW: NIS+
xdr_getcredres NEW: NIS+
xdr_key_netstarg NEW: NIS+
xdr_key_netstres NEW: NIS+
xdr_keybuf NEW: NIS+
xdr_keystatus NEW: NIS+
xdr_netnamestr NEW: NIS+
xdr_sizeof NEW: NIS+
xdr_unixcred NEW: sunrpc ext
xencrypt NEW: NIS+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Version 2.0.5

View File

@ -40,87 +40,133 @@
only defined on real valued parameters and those which are defined
for complex functions as well. */
# define __TGMATH_UNARY_REAL_ONLY(Val, Fct) \
(__extension__ (sizeof (Val) == sizeof (double) \
? Fct (Val) \
: (sizeof (Val) == sizeof (long double) \
? Fct##l (Val) \
: Fct##f (Val))))
(__extension__ ({ __typeof__ (Val) __tgmres; \
if (sizeof (Val) == sizeof (double)) \
__tgmres = Fct (Val); \
else if (sizeof (Val) == sizeof (float)) \
__tgmres = Fct##f (Val); \
else \
__tgmres = Fct##l (Val); \
__tgmres; }))
# define __TGMATH_BINARY_FIRST_REAL_ONLY(Val1, Val2, Fct) \
(__extension__ (sizeof (Val1) > sizeof (double) \
? Fct##l (Val1, Val2) \
: (sizeof (Val1) == sizeof (double) \
? Fct (Val1, Val2) \
: Fct##f (Val1, Val2))))
(__extension__ ({ __typeof__ (Val1) __tgmres; \
if (sizeof (Val1) == sizeof (double)) \
__tgmres = Fct (Val1, Val2); \
else if (sizeof (Val1) == sizeof (float)) \
__tgmres = Fct##f (Val1, Val2); \
else \
__tgmres = Fct##l (Val1, Val2); \
__tgmres; }))
# define __TGMATH_BINARY_REAL_ONLY(Val1, Val2, Fct) \
(__extension__ (sizeof (Val1) > sizeof (double) \
|| sizeof (Val2) > sizeof (double) \
? Fct##l (Val1, Val2) \
: (sizeof (Val1) == sizeof (double) \
|| sizeof (Val2) == sizeof (double) \
? Fct (Val1, Val2) \
: Fct##f (Val1, Val2))))
(__extension__ ({ __typeof__ ((Val1) + (Val2)) __tgmres; \
if (sizeof (Val1) > sizeof (double) \
|| sizeof (Val2) > sizeof (double)) \
__tgmres = Fct##l (Val1, Val2); \
else if (sizeof (Val1) == sizeof (double) \
|| sizeof (Val2) == sizeof (double)) \
__tgmres = Fct (Val1, Val2); \
else \
__tgmres = Fct (Val1, Val2); \
__tgmres; }))
# define __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY(Val1, Val2, Val3, Fct) \
(__extension__ (sizeof (Val1) > sizeof (double) \
|| sizeof (Val2) > sizeof (double) \
? Fct##l (Val1, Val2, Val3) \
: (sizeof (Val1) == sizeof (double) \
|| sizeof (Val2) == sizeof (double) \
? Fct (Val1, Val2, Val3) \
: Fct##f (Val1, Val2, Val3))))
(__extension__ ({ __typeof__ ((Val1) + (Val2)) __tgmres; \
if (sizeof (Val1) > sizeof (double) \
|| sizeof (Val2) > sizeof (double)) \
__tgmres = Fct##l (Val1, Val2, Val3); \
else if (sizeof (Val1) == sizeof (double) \
|| sizeof (Val2) == sizeof (double)) \
__tgmres = Fct (Val1, Val2, Val3); \
else \
__tgmres = Fct (Val1, Val2, Val3); \
__tgmres; }))
# define __TGMATH_TERNARY_REAL_ONLY(Val1, Val2, Val3, Fct) \
(__extension__ (sizeof (Val1) > sizeof (double) \
|| sizeof (Val2) > sizeof (double) \
|| sizeof (Val3) > sizeof (double) \
? Fct##l (Val1, Val2, Val3) \
: (sizeof (Val1) == sizeof (double) \
|| sizeof (Val2) == sizeof (double) \
|| sizeof (Val3) == sizeof (double) \
? Fct (Val1, Val2, Val3) \
: Fct##f (Val1, Val2, Val3))))
(__extension__ ({ __typeof__ ((Val1) + (Val2) + (Val3)) __tgmres; \
if (sizeof (Val1) > sizeof (double) \
|| sizeof (Val2) > sizeof (double) \
|| sizeof (Val3) > sizeof (double)) \
__tgmres = Fct##l (Val1, Val2, Val3); \
else if (sizeof (Val1) == sizeof (double) \
|| sizeof (Val2) == sizeof (double) \
|| sizeof (Val3) == sizeof (double)) \
__tgmres = Fct (Val1, Val2, Val3); \
else \
__tgmres = Fct (Val1, Val2, Val3); \
__tgmres; }))
/* XXX This definition has to be changed as soon as the compiler understands
the imaginary keyword. */
# define __TGMATH_UNARY_REAL_IMAG(Val, Fct, Cfct) \
(__extension__ (sizeof (__real__ (Val)) > sizeof (double) \
? (sizeof (__real__ (Val)) == sizeof (Val) \
? Fct##l (Val) \
: Cfct##l (Val)) \
: (sizeof (__real__ (Val)) == sizeof (double) \
? (sizeof (__real__ (Val)) == sizeof (Val) \
? Fct (Val) \
: Cfct (Val)) \
: (sizeof (__real__ (Val)) == sizeof (Val) \
? Fct##f (Val) \
: Cfct##f (Val)))))
(__extension__ ({ __typeof__ (Val) __tgmres; \
if (sizeof (__real__ (Val)) > sizeof (double)) \
{ \
if (sizeof (__real__ (Val)) == sizeof (Val)) \
__tgmres = Fct##l (Val); \
else \
__tgmres = Cfct##l (Val); \
} \
else if (sizeof (__real__ (Val)) == sizeof (double)) \
{ \
if (sizeof (__real__ (Val)) == sizeof (Val)) \
__tgmres = Fct (Val); \
else \
__tgmres = Cfct (Val); \
} \
else \
{ \
if (sizeof (__real__ (Val)) == sizeof (Val)) \
__tgmres = Fct##f (Val); \
else \
__tgmres = Cfct##f (Val); \
} \
__tgmres; }))
/* XXX This definition has to be changed as soon as the compiler understands
the imaginary keyword. */
# define __TGMATH_UNARY_IMAG_ONLY(Val, Fct) \
(__extension__ (sizeof (Val) > sizeof (__complex__ double) \
? Fct##l (Val) \
: (sizeof (Val) == sizeof (__complex__ double) \
? Fct (Val) \
: Fct##f (Val))))
(__extension__ ({ __typeof__ (Val) __tgmres; \
if (sizeof (Val) == sizeof (__complex__ double)) \
__tgmres = Fct (Val); \
else if (sizeof (Val) == sizeof (__complex__ float)) \
__tgmres = Fct##f (Val); \
else \
__tgmres = Fct##l (Val); \
__tgmres; }))
/* 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) \
? (sizeof (__real__ (Val1)) == sizeof (Val1) \
&& sizeof (__real__ (Val2)) == sizeof (Val2) \
? Fct##l (Val1, Val2) \
: Cfct##l (Val1, Val2)) \
: (sizeof (__real__ (Val1)) == sizeof (double) \
|| sizeof (__real__ (Val2)) == sizeof (double) \
? (sizeof (__real__ (Val1)) == sizeof (Val1) \
&& sizeof (__real__ (Val2)) == sizeof (Val2) \
? Fct (Val1, Val2) \
: Cfct (Val1, Val2)) \
: (sizeof (__real__ (Val1)) == sizeof (Val1) \
&& sizeof (__real__ (Val2)) == sizeof (Val2) \
? Fct##f (Val1, Val2) \
: Cfct##f (Val1, Val2)))))
(__extension__ ({ __typeof__ ((Val1) + (Val2)) __tgmres; \
if (sizeof (__real__ (Val1)) > sizeof (double) \
|| sizeof (__real__ (Val2)) > sizeof (double)) \
{ \
if (sizeof (__real__ (Val1)) == sizeof (Val1) \
&& sizeof (__real__ (Val2)) == sizeof (Val2)) \
__tgmres = Fct##l (Val1, Val2); \
else \
__tgmres = Cfct##l (Val1, Val2); \
} \
else if (sizeof (__real__ (Val1)) == sizeof (double) \
|| sizeof (__real__ (Val2)) == sizeof(double))\
{ \
if (sizeof (__real__ (Val1)) == sizeof (Val1) \
&& sizeof (__real__ (Val2)) == sizeof (Val2)) \
__tgmres = Fct (Val1, Val2); \
else \
__tgmres = Cfct (Val1, Val2); \
} \
else \
{ \
if (sizeof (__real__ (Val1)) == sizeof (Val1) \
&& sizeof (__real__ (Val2)) == sizeof (Val2)) \
__tgmres = Fct##f (Val1, Val2); \
else \
__tgmres = Cfct##f (Val1, Val2); \
} \
__tgmres; }))
#else
# error "Unsupported compiler; you cannot use <tgmath.h>"
#endif