https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89726
--- Comment #3 from Xan Lopez <xan at igalia dot com> --- FWIW, the previous testcase I was using, which is a bit more convoluted, is this one: #include <math.h> #include <stdio.h> double mathCeil(double n) { return ceil(n); } int main() { double a = -0.9; double result = mathCeil(a); if (signbit(result)) printf("CORRECT: result is %f\n", result); else printf("ERROR: result is %f (should be -0)\n", result); return 0; } Testing, compiling with SSE2 instead of x87, gives: niraikanai:~/js/32bit%/home/xan/gccbuild/bin/gcc -march=pentium4 -msse2 -mfpmath=sse -m32 -O2 -fPIC -o ceil ceil.c -lm niraikanai:~/js/32bit%./ceil ERROR: result is 0.000000 (should be -0) niraikanai:~/js/32bit%/home/xan/gccbuild/bin/gcc -march=pentium4 -msse2 -mfpmath=sse -m32 -O2 -o ceil ceil.c -lm niraikanai:~/js/32bit%./ceil CORRECT: result is -0.000000 niraikanai:~/js/32bit% Apparently in this case what makes the error show up is passing the -fPIC flag.