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.