------- Comment #8 from pinskia at gcc dot gnu dot org 2005-12-13 22:51 -------
(In reply to comment #7)
> Could you please send me the preprocessed source for this?
/* Compile with -O2 -m32 -fPIC */
typedef float DFtype __attribute__ ((mode (DF)));
typedef _Complex float DCtype __attribute__ ((mode (DC)));
DCtype
__muldc3 (DFtype a, DFtype b, DFtype c, DFtype d)
{
DFtype ac, bd, ad, bc, x, y;
bd = b * d;
__asm__ ("" : "=m"(ad) : "m"(ad));
__asm__ ("" : "=m"(bc) : "m"(bc));
x = ac - bd;
y = ad + bc;
if (__builtin_expect ((x) != (x), 0) && __builtin_expect ((y) != (y), 0))
{
_Bool recalc = 0;
if (__builtin_expect (!__builtin_expect ((a) != (a), 0) &
!__builtin_expect (!__builtin_expect (((a) - (a)) != ((a) - (a)), 0), 1), 0) ||
__builtin_expect (!__builtin_expect ((b) != (b), 0) & !__builtin_expect
(!__builtin_expect (((b) - (b)) != ((b) - (b)), 0), 1), 0))
{
a = __builtin_copysign (__builtin_expect (!__builtin_expect ((a) != (a), 0)
& !__builtin_expect (!__builtin_expect (((a) - (a)) != ((a) - (a)), 0), 1), 0)
? 1 : 0, a);
b = __builtin_copysign (__builtin_expect (!__builtin_expect ((b) != (b), 0)
& !__builtin_expect (!__builtin_expect (((b) - (b)) != ((b) - (b)), 0), 1), 0)
? 1 : 0, b);
if (__builtin_expect ((d) != (d), 0)) d = __builtin_copysign (0, d);
recalc = 1;
}
if (__builtin_expect (!__builtin_expect ((c) != (c), 0) &
!__builtin_expect (!__builtin_expect (((c) - (c)) != ((c) - (c)), 0), 1), 0) ||
__builtin_expect (!__builtin_expect ((d) != (d), 0) & !__builtin_expect
(!__builtin_expect (((d) - (d)) != ((d) - (d)), 0), 1), 0))
{
c = __builtin_copysign (__builtin_expect (!__builtin_expect ((c) != (c), 0)
& !__builtin_expect (!__builtin_expect (((c) - (c)) != ((c) - (c)), 0), 1), 0)
? 1 : 0, c);
}
if (!recalc
&& (__builtin_expect (!__builtin_expect ((ac) != (ac), 0) &
!__builtin_expect (!__builtin_expect (((ac) - (ac)) != ((ac) - (ac)), 0), 1),
0) || __builtin_expect (!__builtin_expect ((bd) != (bd), 0) & !__builtin_expect
(!__builtin_expect (((bd) - (bd)) != ((bd) - (bd)), 0), 1), 0)
|| __builtin_expect (!__builtin_expect ((ad) != (ad), 0) &
!__builtin_expect (!__builtin_expect (((ad) - (ad)) != ((ad) - (ad)), 0), 1),
0) || __builtin_expect (!__builtin_expect ((bc) != (bc), 0) & !__builtin_expect
(!__builtin_expect (((bc) - (bc)) != ((bc) - (bc)), 0), 1), 0)))
{
recalc = 1;
}
if (recalc)
{
x = __builtin_inf () * (a * c - b * d);
}
}
return x + 1i * y;
}
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25397