Fix bootstrapped AVX512 code

SIMD_ALWAYS isn't defined and function targets not working during bootstrap

Fixes: QTBUG-100817
Change-Id: I3008db3a32d28f9e4285517a6a23198307e236bc
Reviewed-by: Samuli Piippo <samuli.piippo@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
Allan Sandfeld Jensen 2022-02-14 11:32:00 +01:00
parent bfcf47ab9d
commit 40bc850597
1 changed files with 13 additions and 7 deletions

View File

@ -192,6 +192,14 @@ int qfloat16::fpClassify() const noexcept
*/
#if QT_COMPILER_SUPPORTS_HERE(F16C)
static inline bool hasFastF16()
{
// qsimd.cpp:detectProcessorFeatures() turns off this feature if AVX
// state-saving is not enabled by the OS
return qCpuHasFeature(F16C);
}
#if QT_COMPILER_SUPPORTS_HERE(AVX512VL) && QT_COMPILER_SUPPORTS_HERE(AVX512BW)
#define QT_FUNCTION_TARGET_STRING_AVX512VLBW \
QT_FUNCTION_TARGET_STRING_AVX512VL "," \
QT_FUNCTION_TARGET_STRING_AVX512BW "," \
@ -205,13 +213,6 @@ static bool hasFastF16Avx256()
return qCpuHasFeature(AVX512VLBW);
}
static inline bool hasFastF16()
{
// qsimd.cpp:detectProcessorFeatures() turns off this feature if AVX
// state-saving is not enabled by the OS
return qCpuHasFeature(F16C);
}
static QT_FUNCTION_TARGET(AVX512VLBW)
void qFloatToFloat16_tail_avx256(quint16 *out, const float *in, qsizetype len) noexcept
{
@ -229,6 +230,7 @@ void qFloatFromFloat16_tail_avx256(float *out, const quint16 *in, qsizetype len)
__m256 f32 = _mm256_cvtph_ps(f16);
_mm256_mask_storeu_ps(out, mask, f32);
};
#endif
QT_FUNCTION_TARGET(F16C)
static void qFloatToFloat16_fast(quint16 *out, const float *in, qsizetype len) noexcept
@ -253,8 +255,10 @@ static void qFloatToFloat16_fast(quint16 *out, const float *in, qsizetype len) n
return convertOneChunk(len - Step);
}
#if QT_COMPILER_SUPPORTS_HERE(AVX512VL) && QT_COMPILER_SUPPORTS_HERE(AVX512BW)
if (hasFastF16Avx256())
return qFloatToFloat16_tail_avx256(out, in, len);
#endif
if (len >= HalfStep) {
auto convertOneChunk = [=](qsizetype offset) QT_FUNCTION_TARGET(F16C) {
@ -296,8 +300,10 @@ static void qFloatFromFloat16_fast(float *out, const quint16 *in, qsizetype len)
return convertOneChunk(len - Step);
}
#if QT_COMPILER_SUPPORTS_HERE(AVX512VL) && QT_COMPILER_SUPPORTS_HERE(AVX512BW)
if (hasFastF16Avx256())
return qFloatFromFloat16_tail_avx256(out, in, len);
#endif
if (len >= HalfStep) {
auto convertOneChunk = [=](qsizetype offset) QT_FUNCTION_TARGET(F16C) {