adc $0
指令是否是在x86 / 64上将Carry Flag
添加到%rdx
的唯一方法?
add %rax,%rcx
adc $0 ,%rdx
答案 0 :(得分:2)
这是最好的方式。
其他选项包括使用jc
(跳过inc
),cmovc
(可能使用lea
表示无标记add-1)或{{ 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.
是Intel CPUs before Broadwell上的2-uop指令。 (由于Haswell引入了FMA的硬件更改以解码为单个uop,Broadwell和Skylake还将其他一些3输入指令作为单个uop处理,包括adc
和adc
。)
将CF放入寄存器的更糟糕的选择是慢速旋转携带cmov
(在归零寄存器上)。