所以我在尝试编译Dolphin时遇到了这个错误。我已经尝试过clang-3.7和3.8以及GCC 5.2和6.3。奇怪的是,所有其他_mm函数似乎都有效,它只是这一个。
答案 0 :(得分:1)
SSE2是x86-64的基线,这就是其他_mm
函数有效的原因(您可能只尝试过SSE2函数,而不是_mm_abs_epi8
或{{1}等任何其他SSE3 / SSSE3 / SSE4函数})。
与MSVC不同,您需要_mm_cvtepi16_epi32
(在您的情况下由-mssse3
或-march=native
启用)才能使用SSSE3内在函数与gcc / clang 。
请注意,-march=znver1
未设置-mssse3
,但-mtune=
确实设置了调整,因此最好使用-march=
而不是仅使用{启用一对ISA扩展{1}}或者其他什么,特别是如果你只打算在一个目标CPU上运行二进制文件。
例如,要启用AVX2,最好使用-march=native
或-mpopcnt -msse4.1
,因为-march=haswell
不会覆盖-march=znver1
的{{1}}行为,即使没有支持AVX2的CPU受益(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80568)。即-mavx2
始终使用完全通用的调整设置,而不是调整支持启用的扩展的任何CPU集。
Sandybridge确实受益于-mtune=generic
/ -mavx256-split-unaligned-load
,但它只支持AVX,而不支持AVX2。即使这样,只有当数据在运行时实际上未对齐时,如果您的数据在99%的时间内都是对齐的,那么您可能不希望这样。