https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103973
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- With -O2 -fno-trapping-math, we get: ucomisd %xmm1, %xmm0 jp .L9 movl $0, %eax jne .L9 ret .p2align 4,,10 .p2align 3 .L9: ucomisd %xmm0, %xmm1 ja .L12 ucomisd %xmm1, %xmm0 setbe %al addl $1, %eax ret .p2align 4,,10 .p2align 3 .L12: movl $-1, %eax ret With -O2 -fno-trapping-math -ffinite-math-only we get: comisd %xmm1, %xmm0 je .L12 jb .L13 movl $1, %edx movl $2, %eax cmova %edx, %eax ret .p2align 4,,10 .p2align 3 .L12: xorl %eax, %eax ret .p2align 4,,10 .p2align 3 .L13: movl $-1, %eax ret The main reason is NaNs are interesting and trapping comparisons are also interesting. Note LLVM does not implement trapping math at all which is why their code gen is different too.