gpt4 book ai didi

c++ - 是否可以从 C++ 中的程序集调用内置函数

转载 作者:太空狗 更新时间:2023-10-29 23:29:45 24 4
gpt4 key购买 nike

考虑以下汇编代码循环:

#include <iostream>

#define ADD_LOOP(i, n, v) \
asm volatile ( \
"movw %1, %%cx ;" \
"movq %2, %%rax ;" \
"movq $0, %%rbx ;" \
"for: ;" \
"addq %%rax, %%rbx ;" \
"decw %%cx ;" \
"jnz for ;" \
"movq %%rbx, %0 ;" \
: "=x"(v) \
: "n"(i), "x"(n) \
: "%cx", "%rax", "%rbx" \
);

int main() {
uint16_t iter(10000);
uint64_t num(5);
uint64_t val;

ADD_LOOP(iter, num, val)

std::cout << val << std::endl;

return 0;
}

是否可以从上面指定的循环中调用 C 函数(或其机器代码输出)?

例如:

#include <wmmintrin.h>

int main() {
__m128i x, y;

for(int i = 0; i < 10; i++) {
x = __builtin_ia32_aesenc128(x, y);
}

return 0;
}

谢谢

最佳答案

没有。内置函数不是您可以使用 call 调用的真实函数.在 C/C++ 中使用时,它们总是内联。

例如,如果您想要 int __builtin_popcount (unsigned int x) 得到 popcnt -mpopcnt 的目标说明,或不支持 popcnt 的目标的逐字节查找表指导,你倒霉了。你必须 #ifdef自己并使用 popcnt或替代指令序列。


你说的函数,__builtin_ia32_aesenc128只是 the aesenc assembly instruction 的包装器如果用 asm 编写,你可以直接使用它。


如果您正在编写 asm 而不是使用 C++ 内在函数(如 #include <immintrin.h>)来提高性能,则需要查看 http://agner.org/optimize/编写更高效的 asm。例如使用 %ecx作为循环计数器,而不是 %cx .使用 16 位部分寄存器对您没有任何好处。

您还可以编写更高效的内联汇编约束,例如movq %%rbx, %0是浪费一条指令。你可以使用 %0整个时间而不是明确的%rbx .如果您的内联 asm 以 mov 指令开始或结束以复制到/从输出/输入操作数,通常您做错了。让编译器为你分配寄存器。查看标记维基。

或者更好,https://gcc.gnu.org/wiki/DontUseInlineAsm 。具有内在函数的代码通常可以很好地针对 x86 进行编译。参见 Intel's intrinsics guide : #include <immintrin.h>并使用 __m128i _mm_aesenc_si128 (__m128i a, __m128i RoundKey) . (在 gcc 中,这只是 __builtin_ia32_aesenc128 的包装器,但它使您的代码可移植到其他 x86 编译器。)

关于c++ - 是否可以从 C++ 中的程序集调用内置函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47927158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com