携带标志添加指令与adc $ 0不同?

时间:2016-01-17 03:01:40

标签: assembly carryflag

adc $0指令是否是在x86 / 64上将Carry Flag添加到%rdx的唯一方法?

add %rax,%rcx
adc $0  ,%rdx

1 个答案:

答案 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处理,包括adcadc。)

将CF放入寄存器的更糟糕的选择是慢速旋转携带cmov(在归零寄存器上)。