https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81478
--- Comment #6 from Sean McAllister <smcallis at gmail dot com> --- FWIW, it seems the compute, check, re-compute if necessary is what clang does. Rather than "setp %al" and "jne" on that, they just use the "jp" instruction directly after ucomiss: 0x00000000004005d5 <+133>: subss %xmm6,%xmm0 ; compute real part 0x00000000004005d9 <+137>: addss %xmm4,%xmm5 ; compute imaginary part 0x00000000004005dd <+141>: ucomiss %xmm0,%xmm0 ; check for NaN on real 0x00000000004005e0 <+144>: jnp 0x4005e7 <main+151> ; if OK, continue 0x00000000004005e2 <+146>: ucomiss %xmm5,%xmm5 ; check for NaN on imag 0x00000000004005e5 <+149>: jp 0x400602 <main+178> ; recompute if bad result 0x00000000004005e7 <+151>: cvtss2sd %xmm0,%xmm0 0x00000000004005eb <+155>: cvtss2sd %xmm5,%xmm1 0x00000000004005ef <+159>: mov $0x400944,%edi 0x00000000004005f4 <+164>: mov $0x2,%al 0x00000000004005f6 <+166>: callq 0x400430 <printf@plt> 0x00000000004005fb <+171>: xor %eax,%eax 0x00000000004005fd <+173>: add $0x18,%rsp 0x0000000000400601 <+177>: retq 0x0000000000400602 <+178>: movaps %xmm7,%xmm0 0x0000000000400605 <+181>: callq 0x400620 <__mulsc3> 0x000000000040060a <+186>: movaps %xmm0,%xmm5 0x000000000040060d <+189>: shufps $0xe5,%xmm5,%xmm5 0x0000000000400611 <+193>: jmp 0x4005e7 <main+151>