9

有什么方法可以让 Clang、GCC 或 VS 仅使用 Standard-C++(98/11/14)生成 adc(带进位相加)指令?(编辑:我的意思是在 x64 模式下,如果不清楚,抱歉。)

4

3 回答 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 回答