Hi!
I have this little code that drives me crazy about the code generation (GCC 
4.3.3).

extern double tle_mk_inf(int);

double tle_exp(double dval)
{
        if (dval == 0.0)
                return 0.0;
        if (dval > 10000)
                return tle_mk_inf(1);

        return -1.2;
}


If I compiled it with -O2 or -O3, the insn output is missing an 'fcmp' 
('cmpdf'), like you can see below:


$LC0:
        long   0
        long   0
$LC1:
        long   0
        long   1086556160
$LC2:
        long   858993459
        long   -1074580685

_tle_exp:
        push    FP
        mov     SP,FP
        push    r8
        fpush   x8
        lea     $LC0,r8
        ldr.f    r8,x8
        fcmp    x0,x8
        jz $L4
        lea     $LC1,r8
        ldr.f    r8,x8
<<<<<< MISSING 'fcmp x0,x8'
        ja $L5
        lea     $LC2,r8
        ldr.f    r8,x8
$L4:
        fdmov   x8,x0
        fpop    x8
        pop     r8
        mov     FP,SP
        pop     FP
        ret
$L5:
        mov     1,r0
        call   _tle_mk_inf
        fpop    x8
        pop     r8
        mov     FP,SP
        pop     FP
        ret


If I disable the optimizations, everything is fine and the 'fcmp' is there.
Even with optimizations enabled, the RTL dump shows the missing 'cmpdf' present
and correctly recognized. It being:

(define_insn "cmpdf"
  [(set (cc0)
        (compare (match_operand:DF 0 "fullreg_operand" "x")
                 (match_operand:DF 1 "fullreg_operand" "x")))]
  ""
  "fcmp\t%0,%1"
  [
   (set_attr "length" "3")
   (set_attr "cc" "compare")
  ]
)


Any hints?



 - Jamie



      

Reply via email to