该指令是在 x86/64 上adc $0
添加的唯一方法吗?Carry Flag
%rdx
add %rax,%rcx
adc $0 ,%rdx
这是最好的办法。
其他选项包括使用jc
(跳过inc
)、cmovc
(lea
对于无标志添加 1 可能使用)或setc
. 使用 setc:
xor %edi, %edi
add %rax, %rcx
setc %dil # %rdi = CF, since we already zeroed the upper bytes
add %rdi, %rdx # no partial-register stall/extra uop from reading rdi after writing dil, because we used a recognized zeroing idiom (xor) to zero it.
这些选项显然要糟糕得多,即使是在 Broadwell 之前的 Intel CPUadc
上的 2-uop 指令。(自从 Haswell 引入了 FMA 的硬件更改以将其解码为单个 uop,Broadwell 和 Skylake 也将其他一些 3 输入指令作为单个 uop 处理,包括和。)adc
cmov
将 CF 放入寄存器的更糟糕的选择是慢速旋转进位rcl
(在零寄存器上)。