Сборка 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
считается немедленным?