https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51954
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- We get this now: movq %rdi, %rax movq %rsi, %rdx negq %rax adcq $0, %rdx negq %rdx ICC produces: xorl %edx, %edx #3.10 xorl %eax, %eax #3.10 subq %rdi, %rax #3.10 sbbq %rsi, %rdx #3.10 ret #3.10 Which seems even better. LLVM does produce: movq %rdi, %rax xorl %edx, %edx negq %rax sbbq %rsi, %rdx Which basically combines the addcq and negq together and changes one mov into an exor.