Walter Bright:

> is not done because of roundoff error. Also,
>     0 * x => 0
> is also not done because it is not a correct replacement if x is a NaN.

I have done a little experiment, compiling this D1 code with LDC:


import tango.stdc.stdio: printf;
void main(char[][] args) {
    double x = cast(double)args.length;
    double y = 0 * x;
    printf("%f\n", y);
}


I think the asm generated by ldc shows what you say:


ldc -O3 -release -inline -output-s test
_Dmain:
        pushl   %ebp
        movl    %esp, %ebp
        andl    $-16, %esp
        subl    $32, %esp
        movsd   .LCPI1_0, %xmm0
        movd    8(%ebp), %xmm1
        orps    %xmm0, %xmm1
        subsd   %xmm0, %xmm1
        pxor    %xmm0, %xmm0
        mulsd   %xmm1, %xmm0
        movsd   %xmm0, 4(%esp)
        movl    $.str, (%esp)
        call    printf
        xorl    %eax, %eax
        movl    %ebp, %esp
        popl    %ebp
        ret     $8



So I have added an extra "unsafe floating point" optimization:

ldc -O3 -release -inline -enable-unsafe-fp-math -output-s test
_Dmain:
        subl    $12, %esp
        movl    $0, 8(%esp)
        movl    $0, 4(%esp)
        movl    $.str, (%esp)
        call    printf
        xorl    %eax, %eax
        addl    $12, %esp
        ret     $8


GCC has similar switches.

Bye,
bearophile

Reply via email to