------- Additional Comments From Thomas dot Koenig at online dot de 2005-02-14 20:06 ------- Same thing for complex division, where the performance penalty is probably also pretty severe:
$ cat c-div.c #include <math.h> #include <complex.h> int main() { float a; complex float b,c; foo(&a,&b); c = b/a; return creal(c) + cimag(c) < 0; } $ gcc -fdump-tree-all-all -O3 -S c-div.c $ tail -20 c-div.c.t65.optimized complex floatD.25 c.20D.2363; complex floatD.25 c.19D.2362; intD.0 D.2361; complex floatD.25 D.2360; complex floatD.25 D.2359; floatD.21 a.18D.2358; # BLOCK 0 # PRED: ENTRY [100.0%] (fallthru,exec) # aD.2354_25 = V_MAY_DEF <aD.2354_1>; # bD.2355_26 = V_MAY_DEF <bD.2355_5>; foo (&aD.2354, &bD.2355); # D.2360_11 = V_MUST_DEF <D.2360_10>; D.2360 = __divsc3 (REALPART_EXPR <bD.2355>, IMAGPART_EXPR <bD.2355>, aD.2354,0.0); return (doubleD.22) REALPART_EXPR <D.2360> + (doubleD.22) IMAGPART_EXPR <D.2360> < 0.0; # SUCC: EXIT [100.0%] } Addition has the same problem. Here, a floating point register is carefully zeroed in order to add something to it: $ cat c-add.c #include <math.h> #include <complex.h> int main() { float a; complex float b,c; foo(&a,&b); c = b+a; return creal(c) + cimag(c) < 0; } $ gcc -fdump-tree-all-all -O3 -S c-add.c $ tail -20 c-add.c.t65.optimized doubleD.22 D.2365; floatD.21 D.2364; complex floatD.25 c.20D.2363; complex floatD.25 c.19D.2362; intD.0 D.2361; complex floatD.25 D.2360; complex floatD.25 D.2359; floatD.21 a.18D.2358; # BLOCK 0 # PRED: ENTRY [100.0%] (fallthru,exec) # aD.2354_27 = V_MAY_DEF <aD.2354_1>; # bD.2355_28 = V_MAY_DEF <bD.2355_7>; foo (&aD.2354, &bD.2355); return (doubleD.22) (aD.2354 + REALPART_EXPR <bD.2355>) + (doubleD.22) (IMAGPART_EXPR <bD.2355> + 0.0) < 0.0; # SUCC: EXIT [100.0%] } $ tail -20 c-add.s leal -4(%ebp), %eax movl %eax, (%esp) call foo flds -12(%ebp) fldz fadds -8(%ebp) fxch %st(1) fadds -4(%ebp) leave faddp %st, %st(1) fldz fucompp fnstsw %ax testb $69, %ah sete %al movzbl %al, %eax ret .size main, .-main .ident "GCC: (GNU) 4.0.0 20050212 (experimental)" .section .note.GNU-stack,"",@progbits If somebody tackles this, it would also be nice if purely imaginary numbers were also special-cased. -- What |Removed |Added ---------------------------------------------------------------------------- Summary|Special-case real*complex |Special-case real + complex |multiplication for |arithmetic operation |flag_complex_method=2 | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19953