如果为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上,只使用一条添加指令。
在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
如果您的代码进行比较并将比较结果添加到某个内容中,则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的文档清楚地表明我不应该抛出异常, 如果处理器抛出未捕获的异常,该工具可能会停止其他活动注释处理器。 它接着描述了当提出错误条件时会发生什么,现在是如何提出错误条