Сборка OpenCV 3.2.0 с MinGW-w64 6.1.0: сбой оценки аргумента во время компиляции

Компилятор терпит неудачу с этим выводом:

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 ..., но это не дало никакого эффекта.

Единственный обходной путь, который я нашел, это здесь, но не отвечает, почему маски не являются немедленными, и почему на это могут влиять потоки.

Любой способ исправить это более или менее прилично, кроме жесткого кодирования 0x88 и 0xDD как _mm_shuffle_ps(v_r0, v_r1, 0x88)?
Это работает, но явно не является хорошим решением. Более того, проблема не только в этом файле.

Кроме того, почему даже constexpr int mask_lo = 0x88 не считается немедленным?


person Alex    schedule 28.01.2017    source источник