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