特定于体系结构的内联汇编

时间:2018-03-28 05:28:35

标签: gcc assembly inline-assembly autotools

我想为函数的一部分手工编写一些内联汇编,但只有在编译它所编写的体系结构时才使用该汇编,而是回到其他体系结构上的通用C实现。

在匹配的体系结构上,编译器使用内联汇编的最佳方法是什么?是否有case $host in x86_64-*) AC_DEFINE([AMD64]) ;; esac 块的语法指定它仅适用于特定体系结构,或者我应该使用配置脚本中的autoconf target triplet来定义预处理器符号?例如

configure.ac:

void f() { #ifdef AMD64 asm (/* ... */) #else /* C code */ #endif }

.c源文件:

AM_CONDITIONAL

我认为对于更大或独立的函数,可以使用.c类似地选择程序集或C来选择不同的源文件(.s或特定于平台的asm "i386" ( ... ) )。

还有其他选择吗?这是惯用的吗?

编辑:问题更多的是关于是否有替代品,如

asm "aarch64" ( ... )

ifdef

不会涉及预处理器unarchiveTopLevelObjectWithData的其他替代方案。

编辑2:我正在寻找GCC的Function Multiversioning功能,根据具体的架构可以提供多个替代实现,并且链接器在运行时自动选择最佳版本。如果我允许我重新开启这个问题,我会把它放在答案中。

编辑3:该问题既适用于x86 / amd64 / arm64等架构系列,也适用于x86-SSE2,amd64-AVX等instruction set architectures (ISAs)

1 个答案:

答案 0 :(得分:0)

对于编译时架构选择(例如amd64和arm64之间的区别),compiler-defined preprocessor directives上的#ifdef是常见的方法。 cpp -dM -提供了编译器定义的宏的列表:

例如:

#ifdef __x86_64__
// impl.
#else
// default impl
#endif

当CPU支持时,为了选择优化的程序集替代品的运行时链接,Function Multi-versioning提供了一种运送函数的多个实现的方法。运行时链接程序根据可用的CPU功能确定使用哪个。

__attribute__ ((target("default")))
void f() {
}

__attribute__ ((target("sse4.2")))
void f() {
}