http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46080
--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> 2010-10-21 20:55:58 UTC --- fsqrt insn is always used, and if the result is NaN, it calls library sqrtf function so that errno is set correctly. The (conditional) call causes (some of) the values to be forced into stack and thus rounded to IEEE single precision, if they aren't forced into stack, they will have long double precision. You can use -fno-errno-math if you don't want errno to be set, then there will be no calls to sqrtf and all 3 calls should at least when optimizing evaluate in extended precision.