编译器因输出失败:
In file included from C:/mingw-w64/x86_64-6.1.0-win32-seh-rt_v5-rev0/mingw64/lib/gcc/x86_64-w64-mingw32/6.1.0/include/emmintrin.h:31:0,
from C:/lib/opencv/sources/modules/core/include/opencv2/core/cvdef.h:168,
from C:/lib/opencv/sources/modules/core/include/opencv2/core.hpp:52,
from C:/lib/opencv/sources/modules/core/include/opencv2/core/utility.hpp:56,
from C:/lib/opencv/sources/cmake-build-debug/modules/core/precomp.hpp:49:
C:/lib/opencv/sources/modules/core/include/opencv2/core/sse_utils.hpp:
In function 'void _mm_interleave_ps(__m128&, __m128&, __m128&, __m128&)':
C:/lib/opencv/sources/modules/core/include/opencv2/core/sse_utils.hpp:572:28:
error: the last argument must be an 8-bit immediate
__m128 layer2_chunk0 = _mm_shuffle_ps(v_r0, v_r1, mask_lo);
^
在此功能:
inline void _mm_interleave_ps(__m128 & v_r0, __m128 & v_r1, __m128 & v_g0, __m128 & v_g1)
{
const int mask_lo = _MM_SHUFFLE(2, 0, 2, 0), mask_hi = _MM_SHUFFLE(3, 1, 3, 1);
__m128 layer2_chunk0 = _mm_shuffle_ps(v_r0, v_r1, mask_lo);
...
考虑_MM_SHUFFLE
是一个宏,掩码应该是编译时可计算的:
#define _MM_SHUFFLE(fp3,fp2,fp1,fp0) \
(((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | (fp0))
所以我尝试将const int ...
替换为constexpr int ...
,但没有效果。
我找到的唯一解决方法是here,但它没有回答为什么掩码不是即时的,以及为什么线程会影响它。
除了0x88
和0xDD
之类的_mm_shuffle_ps(v_r0, v_r1, 0x88)
硬编码外,还有其他方法可以解决这个问题吗?
它确实有效,但显然不是一个好的解决方案。而且,这个文件并不是唯一有这个问题的文件。
另外,为什么甚至不将constexpr int mask_lo = 0x88
视为立即?