使用MinGW-w64构建OpenCV 3.2.0 6.1.0:编译时参数评估faiIure

时间:2017-01-28 18:25:59

标签: c++ opencv build constexpr compile-time-constant

编译器因输出失败:

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,但它没有回答为什么掩码不是即时的,以及为什么线程会影响它。

除了0x880xDD之类的_mm_shuffle_ps(v_r0, v_r1, 0x88)硬编码外,还有其他方法可以解决这个问题吗? 它确实有效,但显然不是一个好的解决方案。而且,这个文件并不是唯一有这个问题的文件。

另外,为什么甚至不将constexpr int mask_lo = 0x88视为立即?

0 个答案:

没有答案