当前位置: 首页 > 知识库问答 >
问题:

获取编译器以生成adc指令

蒯硕
2023-03-14

有没有办法让Clang、GCC或VS仅使用标准-C(98/11/14)生成adc(带进位添加)指令?(编辑:我的意思是在x64模式下,如果不清楚,对不起。)

共有3个答案

公孙智
2023-03-14

如果为X86编译64位有符号加法(C 11中的int64\u t),编译后的代码将包含adc指令。

编辑:代码示例:

int64_t add_numbers(int64_t x, int64_t y) {
    return x + y;
}

在X86上,加法是使用add指令和adc指令实现的。在X64上,只使用一条添加指令。

湛安宁
2023-03-14

在GCC上有一个__int128_t类型可用于amd64和其他64位目标,它将使用一对add/adc指令进行简单的添加。(请参阅下面的gobolt链接)。

此外,这个纯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)来说,它生成了一些愚蠢的东西,但它(在Godbolt编译器浏览器上)为x86-64编译如下:

    mov     rax, rdi  # a, a
    add     rax, rsi  # a, b
    adc     rax, 0    # a,
    ret
葛驰
2023-03-14

如果您的代码进行比较并将比较结果添加到某个内容中,则gcc 5通常会发出一个adc(顺便说一句,gcc 4.8在此不发出adc)。例如

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有点困难。

 类似资料:
  • 为了在运行windows 7 pro的intel core 2上完成一些cmov指令,我编写了以下代码。它所做的就是从控制台获取一个字符串作为输入,应用一些移位操作来生成一个随机种子,然后将该种子传递给srand,以生成一个小的伪随机数数组。然后评估伪随机数是否满足谓词函数(更任意的位随机),并输出“*”或“\u1”。实验的目的是生成cmov指令,但正如您在下面的反汇编中所看到的,没有。 有没有关

  • 我的分析器已将以下函数分析确定为热点。 特别是一条汇编指令MOVZX(零扩展移动)负责运行时的大部分。if语句编译为 我想诱使编译器不生成这条指令,但我想我首先需要了解为什么会生成这条指令。考虑到我正在使用相同的数据类型,为什么要使用加宽/零扩展? (在godbolt编译器资源管理器上找到整个函数。)

  • 问题内容: 我应该使用什么编译器(我正在使用gcj 4.x)选项来生成供我的Java应用程序在Windows中运行的“ exe”文件? 问题答案: 要编译Java程序MyJavaProg.java,请输入: 要链接它,请使用以下命令: 然后链接以创建可执行文件mycxxprog.exe

  • 问题内容: 请帮助我,如何使AngularJS编译指令生成的代码? 您甚至可以在这里找到相同的代码,http://jsbin.com/obuqip/4/edit 的HTML Java脚本 问题答案: 这是一个既不使用编译功能也不使用链接功能的版本: 请注意,模板被包装在中,因为模板需要具有一个根元素。(如果没有,它将有两个 根元素。) 需要对HTML进行少许修改以进行插值: 小提琴。

  • 至少在GCC中,如果我们提供生成汇编代码的选项,编译器会通过创建一个包含汇编代码的文件来服从。但是,当我们简单地运行命令而没有任何选项时,它不会在内部生成汇编代码吗? 如果是,那么为什么它需要首先生成一个汇编代码,然后将其翻译成机器语言?

  • 我正在尝试创建一个自定义注释,例如,确保字段或方法既是又是,如果字段或方法既不是又不是,则会生成编译时错误,如以下示例所示: 到目前为止,我已经完成了两个自定义注释接口: 和: 正如所暗示的,我不知道如何生成编译时错误。Processor的文档清楚地表明我不应该抛出异常, 如果处理器抛出未捕获的异常,该工具可能会停止其他活动注释处理器。 它接着描述了当提出错误条件时会发生什么,现在是如何提出错误条