------- 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