如何启用 SSSE3 内置函数但禁用编译器优化中对其的使用

5
我有一段代码,使用了SSSE3内置命令(注意是三个S),并且运行时检查是否要使用它,因此我认为该应用程序应该在没有SSSE3支持的CPU上执行。 然而,当使用-mssse3和-O1优化时,编译器也会插入未经我显式调用的SSSE3指令,导致程序崩溃。
有没有一种方法可以在我明确调用相关的内置函数时启用SSSE3代码,但停止编译器添加自己的SSSE3代码?
请注意,我无法禁用-O1优化。

相关问题:https://dev59.com/CWUp5IYBdhLWcg3wAj7y - yohjp
使用不同的设置编译不同的TU。 - PlasmaHH
1
编译不同选项的不同文件,或使用不同选项(pragma、attribute)编译不同函数,或使用gcc-4.9。 - Marc Glisse
@MarcGlisse - gcc 4.9会如何帮助我? - Mark S
4
啊,没错,在这里提到的很简短:http://gcc.gnu.org/gcc-4.9/changes.html。gcc-4.9允许您在当前编译模式表示不可用时仍然使用内部函数。 - Marc Glisse
2个回答

10

解决这个问题的方法是不要使用-mssse3选项编译所有程序代码,只需要对实际使用这些功能的部分进行编译。换句话说:

 // main.cpp
 ... 

     if (use_ssse3()) 
         do_something_ssse3();
     else
         do_something_traditional();

 // traditional.cpp:
 void do_something_traditional()
 {
     ... 
     code goes here ... 
 }

 // ssse3.cpp:
 void do_something_ssse3()
 {
     ... 
     code goes here ... 
 }

只有 "ssse3.cpp" 应该用 -mssse3 标志编译。



0
如果您使用gcc,可以直接编译代码而不使用-mssse3开关,并通过以下方式引入SSSE3内部函数:
#define __SSSE3__ 1
#include <tmmintrin.h>

在你需要它们的地方。


3
请注意,这样做是行不通的,因为当编译器展开由内置功能声明的内联函数时,__builtin_some_intrinsic将不存在,因此不能正确地编译。编译器通过-msse选项控制声明哪些内置函数。 - Mats Petersson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接