[Bug target/27277] New: standard i387 constant loading insns (fldz, fld1) are not generated anymore
uros at kss-loka dot si
gcc-bugzilla@gcc.gnu.org
Mon Apr 24 08:42:00 GMT 2006
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
More information about the Gcc-bugs
mailing list