在我的一个研究项目中,我正在编写C ++代码。但是,生成的程序集是项目的关键点之一。C ++不提供对标志操作指令的直接访问,特别是对C ++,ADC但只要编译器足够聪明地使用它,这就不成问题。考虑:
constexpr unsigned X = 0;
unsigned f1(unsigned a, unsigned b) {
b += a;
unsigned c = b < a;
return c + b + X;
}
Run Code Online (Sandbox Code Playgroud)
Variable c是一种变通方法,可让我掌握进位标志并将其添加到b和中X。看起来我很幸运,(g++ -O3,版本9.1)生成的代码是这样的:
f1(unsigned int, unsigned int):
add %edi,%esi
mov %esi,%eax
adc $0x0,%eax
retq
Run Code Online (Sandbox Code Playgroud)
对于X我测试过的所有值,代码均与上面相同(当然,立即$0x0更改的立即值除外)。但我发现了一个例外:何时X == -1(或0xFFFFFFFFu或~0u,...的拼写方式并不重要)生成的代码为:
f1(unsigned int, unsigned int):
xor %eax,%eax
add %edi,%esi
setb %al
lea -0x1(%rsi,%rax,1),%eax
retq …Run Code Online (Sandbox Code Playgroud)