2

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

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

1 回答 1

2

这是最好的办法

其他选项包括使用jc(跳过inc)、cmovclea对于无标志添加 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 处理,包括和。)adccmov

将 CF 放入寄存器的更糟糕的选择是慢速旋转进位rcl(在零寄存器上)。

于 2016-01-17T03:15:33.080 回答