It looks that standard i387 constant loading insns are not generated anymore.
This testcase:

--cut here--
double test(void)
{
   return 1.0;
}
--cut here--

generates (gcc -O2 -fomit-frame-pointer):
test:
        flds    .LC0            <<<< fld1 should be here
        ret

.LC0:
        .long   1065353216

The problem is in extendsfdf2 expander, which expects CONST_DOUBLE as an
operand[1] to generate simple constant move instruction. The constant is pushed
to the constant pool (as a SFmode constant) for some reason, so the expander
receives a (reg:SF 60) as an operand[1]. Following RTL sequence is produced:

(insn 9 8 10 (set (reg:SF 60)
        (mem/u/c/i:SF (symbol_ref/u:SI ("*.LC0") [flags 0x2]) [2 S4 A32])) -1
(nil)
    (expr_list:REG_EQUAL (const_double:SF 1.0e+0 [0x0.8p+1])
        (nil)))

(insn 10 9 11 (set (reg:DF 58 [ <result> ])
        (float_extend:DF (reg:SF 60))) -1 (nil)
    (expr_list:REG_EQUAL (const_double:DF 1.0e+0 [0x0.8p+1])
        (nil)))

this sequence corresponds to final asm:

test:
        flds    .LC0    # 16    *extendsfdf2_i387/1     [length = 6]
        ret     # 30    return_internal [length = 1]

The same problem arises for other i387 constants.


-- 
           Summary: standard i387 constant loading insns (fldz, fld1) are
                    not generated anymore
           Product: gcc
           Version: 4.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: uros at kss-loka dot si
GCC target triplet: i386-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27277

Reply via email to