2
adc $0
指令是在x86/64上添加Carry Flag
到%rdx
的唯一方法吗?
add %rax,%rcx
adc $0 ,%rdx
adc $0
指令是在x86/64上添加Carry Flag
到%rdx
的唯一方法吗?
add %rax,%rcx
adc $0 ,%rdx
这是最好的方法。
其它选项包括使用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.
这些选项都明显差很多,即使adc
是Intel CPUs before Broadwell 2 UOP指令。 (由于Haswell的引入的硬件更改为FMA解码到单个微指令,Broadwell微架构和SKYLAKE微架构还处理一些其他3输入指令作为单个UOP,包括adc
和cmov
。)
更糟糕的选项用于获取CF成一个寄存器将缓慢旋转并带进rcl
(在归零寄存器上)。
非常感谢! :d –
有一些相关但更复杂的方法,如调零寄存器并使用它来代替零字面量。还有其他人。你有什么问题? –
它关于学习其他选择:D –