有什么方法可以让 Clang、GCC 或 VS 仅使用 Standard-C++(98/11/14)生成 adc(带进位相加)指令?(编辑:我的意思是在 x64 模式下,如果不清楚,抱歉。)
问问题
1233 次
3 回答
3
如果您的代码进行比较并将比较结果添加到某物,则adc
通常由 gcc 5 发出 an(顺便说一下,gcc 4.8 不会在adc
此处发出 an )。例如,
unsigned foo(unsigned a, unsigned b, unsigned c, unsigned d)
{
return (a + b + (c < d));
}
组装到
foo:
cmpl %ecx, %edx
movl %edi, %eax
adcl %esi, %eax
ret
但是,让 gcc 真正发出adc
.
于 2016-06-29T09:53:36.757 回答
2
GCC 上有一种__int128_t
类型可用于 amd64 和其他 64 位目标,它将使用一对add
/adc
指令进行简单的添加。(请参阅下面的 Godbolt 链接)。
此外,这个纯 ISO C 代码可以编译为 adc:
uint64_t adc(uint64_t a, uint64_t b)
{
a += b;
if (a < b) /* should simplify to nothing (setting carry is implicit in the add) */
a++; /* should simplify to adc r0, 0 */
return a;
}
对我(ARM)来说,它产生了一些愚蠢的东西,但它为 x86-64(在Godbolt 编译器资源管理器上)编译为:
mov rax, rdi # a, a
add rax, rsi # a, b
adc rax, 0 # a,
ret
于 2013-06-28T21:38:33.830 回答
1
如果为 X86(int64_t
在 C++ 11 中)编译 64 位有符号加法,编译后的代码将包含一条adc
指令。
编辑:代码示例:
int64_t add_numbers(int64_t x, int64_t y) {
return x + y;
}
在 X86 上,加法是使用一条add
指令后跟一条adc
指令来实现的。在 X64 上,只使用一条add
指令。
于 2013-06-28T18:56:53.027 回答