C++ 操作数类型"__m128i“;不允许用于约束“+;x";

C++ 操作数类型"__m128i“;不允许用于约束“+;x";,c++,sse,inline-assembly,sunstudio,C++,Sse,Inline Assembly,Sunstudio,我正在使用Sun Studio 12.2在Solaris 11.3上进行测试。我在编译SSE shuffle时遇到问题: solaris:$ cat test.cxx #include <stdint.h> #include <emmintrin.h> int main(int argc, char* argv[]) { __m128i a, b; asm ("pshufb %1, %0" : "+x"(a) : "xm"(b)); return

我正在使用Sun Studio 12.2在Solaris 11.3上进行测试。我在编译SSE shuffle时遇到问题:

solaris:$ cat test.cxx
#include <stdint.h>
#include <emmintrin.h>

int main(int argc, char* argv[])
{
    __m128i a, b;
    asm ("pshufb %1, %0" : "+x"(a) : "xm"(b));
    return 0;
}
pshufb
是一条SSSE3指令,但我很难确定Sun Studio 12.2是否支持它(搜索过程中有太多无关噪音)。我相信Sun Studio支持它。Sun Studio 12.3及更高版本使用内嵌程序集


为什么会出现错误,如何修复它?

为什么不直接使用正确的内在函数()?它不仅效率更高,而且在不同的编译器之间更具可移植性。@Paul-“为什么不使用正确的内在函数…”-我们无法判断何时允许使用内在函数。Sun编译器不像Clang和GCC那样发出信号。像
\uuuu SSE2\uuuuuuu
\uuuuu SSSE3\uuuuuu
这样的宏从未定义过。在没有信号的情况下,我们使用内联ASM。ASM始终可用。另外,如果您的目标是支持SSSE3的硬件,那么您可能是使用
-xarch=SSSE3
(或更高版本)进行编译,在这种情况下,您应该能够使用
中的内部函数,没有?@Paul-用户可能不会使用
-xarch=XXX
选项。这要求用户使用RTFM。如果这一战略能够奏效,那么它将在过去四五十年左右发生。我们发现更好的办法是围绕用户进行设计,并进入“它只是工作”状态。当一切正常运行时,用户不需要做任何事情就可以得到SSE2、SSSE3、SSE4、AES、CLMUL、RDRAND、RDSEED、AVX{2}、BMI{2}和SHA(带有适当的运行时保护)。好的-所以问题是您希望在源代码中有多个代码路径,您没有任何预处理器宏或其他编译时机制来测试您将要运行的CPU吗?因此,您必须在运行时测试CPU能力,并相应地进行调度?为什么不使用正确的内在()呢?它不仅效率更高,而且在不同的编译器之间更具可移植性。@Paul-“为什么不使用正确的内在函数…”-我们无法判断何时允许使用内在函数。Sun编译器不像Clang和GCC那样发出信号。像
\uuuu SSE2\uuuuuuu
\uuuuu SSSE3\uuuuuu
这样的宏从未定义过。在没有信号的情况下,我们使用内联ASM。ASM始终可用。另外,如果您的目标是支持SSSE3的硬件,那么您可能是使用
-xarch=SSSE3
(或更高版本)进行编译,在这种情况下,您应该能够使用
中的内部函数,没有?@Paul-用户可能不会使用
-xarch=XXX
选项。这要求用户使用RTFM。如果这一战略能够奏效,那么它将在过去四五十年左右发生。我们发现更好的办法是围绕用户进行设计,并进入“它只是工作”状态。当一切正常运行时,用户不需要做任何事情就可以得到SSE2、SSSE3、SSE4、AES、CLMUL、RDRAND、RDSEED、AVX{2}、BMI{2}和SHA(带有适当的运行时保护)。好的-所以问题是您希望在源代码中有多个代码路径,您没有任何预处理器宏或其他编译时机制来测试您将要运行的CPU吗?所以您必须在运行时测试CPU能力,并相应地进行调度?
solaris:$ /opt/solstudio12.2/bin/CC test.cxx -o test.exe
"test.cxx", line 7: Error: The operand type "__m128i_" is not allowed for the constraint "+x".
1 Error(s) detected.