http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49257
--- Comment #13 from Richard Henderson <rth at gcc dot gnu.org> 2011-06-07 18:40:48 UTC --- I apologize. The error you're seeing here is the sort that's handled by the second #if section in libgcc's __floatdisf. In particular, /* Protect against double-rounding error. Represent any low-order bits, that might be truncated by a bit that won't be lost. The bit can go in anywhere below the rounding position of the FSTYPE. A fixed mask and bit position handles all usual configurations. */ if (! (- ((DWtype) 1 << FSIZE) < u && u < ((DWtype) 1 << FSIZE))) This is because, while DF > 2*SF bits, DF < DI bits, so we've already lost a bit while converting to DFmode. This doesn't appear to be supportable inline without excessive code bloat.