2016-01-17 34 views
2

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

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

有一些相关但更复杂的方法,如调零寄存器并使用它来代替零字面量。还有其他人。你有什么问题? –

+0

它关于学习其他选择:D –

回答

2

这是最好的方法

其它选项包括使用jc(与lea可能是一个没有标记添加-1)(跳过一个inc),cmovc,或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. 

这些选项都明显差很多,即使adcIntel CPUs before Broadwell 2 UOP指令。 (由于Haswell的引入的硬件更改为FMA解码到单个微指令,Broadwell微架构和SKYLAKE微架构还处理一些其他3输入指令作为单个UOP,包括adccmov。)

更糟糕的选项用于获取CF成一个寄存器将缓慢旋转并带进rcl(在归零寄存器上)。

+0

非常感谢! :d –