让编译器生成adc指令
Getting a compiler to generate adc instruction
是否有任何方法可以让Clang、GCC或VS仅使用Standard-C++(98/11/14)生成adc(带进位加法)指令?(编辑:我的意思是在x64模式下,如果不清楚的话,很抱歉。)
如果您的代码进行比较并将比较结果添加到某个值,那么adc
通常由gcc 5发出(顺便说一句,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
有点棘手。
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
如果为X86(C++11中的int64_t
)编译64位有符号加法,则编译的代码将包含adc
指令。
编辑:代码示例:
int64_t add_numbers(int64_t x, int64_t y) {
return x + y;
}
在X86上,加法是使用add
指令和adc
指令来实现的。在X64上,仅使用一条add
指令。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++:对不存在的命名空间使用命名空间指令
- 函数名是c中该函数的第一条指令的地址吗
- 如何用RISC-V GD32VF103CBT6开发板卸载精确的ADC过采样
- 错误:无效的预处理指令 #i 的意思是 #if?
- 组装指令中乘法的下部和上部是什么
- OpenMP 与有序和关键指令并行
- C++中的移动分配出现问题.非法指令: 4.
- 嵌套命名空间的"using"指令,但需要命名内部命名空间
- C++CMake编译指令与
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- AVX 指令中寄存器和指针之间的客观差异
- while 循环 c++ 中的非法指令
- 如何在编译时定义C++预处理器指令的值?
- 存储指令是否会阻止缓存未命中的后续指令?
- 保证编译器指令在C++中重新排序
- VS2008中的AVX-512指令库
- 让编译器生成adc指令