[Interest] Wrong compiler caps check or missing /arch:avx?

Olivier B. perso.olivier.barthelemy at gmail.com
Mon Jan 21 17:18:16 CET 2019


Compiling 5.12.0 with vs 2015
Configure detects SSE up to 4.2 , and AVX up to AVX2

qdrawhelper_sse4.cpp
C:\sdk\src\qt-everywhere-src-5.12.0\qtbase\src\gui\painting\qdrawhelper_sse4.cpp(164):
error C3861: 'qUnpremultiply_sse4': identifier not found
C:\sdk\src\qt-everywhere-src-5.12.0\qtbase\src\gui\painting\qdrawhelper_sse4.cpp(290):
note: see reference to function template instantiation 'void
convertARGBFromARGB32PM_sse4<false,true>(uint *,const uint *,int)'
being compiled
C:\sdk\src\qt-everywhere-src-5.12.0\qtbase\src\gui\painting\qdrawhelper_sse4.cpp(258):
error C2065: 'qConvertRgba64ToRgb32_sse4': undeclared identifier
C:\sdk\src\qt-everywhere-src-5.12.0\qtbase\src\gui\painting\qdrawhelper_sse4.cpp(326):
note: see reference to function template instantiation 'void
convertARGBFromRGBA64PM_sse4<false>(uint *,const QRgba64 *,int)' being
compiled
C:\sdk\src\qt-everywhere-src-5.12.0\qtbase\src\gui\painting\qdrawhelper_sse4.cpp(258):
warning C4804: '<': unsafe use of type 'bool' in operation
C:\sdk\src\qt-everywhere-src-5.12.0\qtbase\src\gui\painting\qdrawhelper_sse4.cpp(320):
error C2065: 'qConvertArgb32ToA2rgb30_sse4': undeclared identifier
C:\sdk\src\qt-everywhere-src-5.12.0\qtbase\src\gui\painting\qdrawhelper_sse4.cpp(351):
note: see reference to function template instantiation 'void
storeA2RGB30PMFromARGB32PM_sse4<PixelOrderBGR>(uchar *,const uint
*,int,int,const QVector<uint> *,QDitherInfo *)' being compiled

It seems that code of the cpp that is compiled "if defined
QT_COMPILER_SUPPORTS_SSE4_1" (present in my qconfig.h) references code
of qdrawingprimitive_sse2_p.h that is defined "if
QT_COMPILER_SUPPORTS_HERE(SSE4_1)" (absent because __SSE_4_1__ is not
defined in qsimd_p.h, because configure does not add /arch:avx on the
command line)

Adding /arch:avx, or replacing the #if
QT_COMPILER_SUPPORTS_HERE(SSE4_1) by #if defined
QT_COMPILER_SUPPORTS_SSE4_1. The SSE4 test of configure succeeds
without using -arch:avx

I did not pass any cpu-specific type flags to configure, and i am not
sure i want to. What is the proper fix of the cpu checks and flags
that will make this build, without making the code dependant on avx or
SSE4.1?



More information about the Interest mailing list