qfloat16: re-merge the F16C content into qfloat16.cpp
The bugs we had noticed previously are believed to be fixed. MSVC will do per-function updating of AVX content where necessary and the ICC issue is no longer relevant. Change-Id: I2bbf422288924c198645fffd16a9235f2d73cc19 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
parent
cb0ea39895
commit
0df7831d01
@ -558,23 +558,6 @@ qt_internal_extend_target(Core CONDITION GCC AND (CMAKE_CXX_COMPILER_VERSION VER
|
||||
# CMAKE_INSTALL_DATA_DIR = "$$[QT_HOST_DATA]/"
|
||||
# CMAKE_INSTALL_DATA_DIR_IS_ABSOLUTE = "True"
|
||||
|
||||
#### Keys ignored in scope 20:.:global:global/global.pri:QT_CPU_FEATURES__ss_QT_ARCH___contains___f16c:
|
||||
# f16c_cxx = "true"
|
||||
|
||||
#### Keys ignored in scope 22:.:global:global/global.pri:CLANG OR intel_icl OR ICC:
|
||||
# f16c_cxx = "false"
|
||||
|
||||
#### Keys ignored in scope 24:.:global:global/global.pri:GCC AND f16c AND x86SimdAlways:
|
||||
# f16c_cxx = "true"
|
||||
|
||||
#### Keys ignored in scope 26:.:global:global/global.pri:MSVC AND QT_CPU_FEATURES__ss_QT_ARCH___contains___avx:
|
||||
# f16c_cxx = "true"
|
||||
|
||||
#### Keys ignored in scope 27:.:global:global/global.pri:else:
|
||||
# f16c_cxx = "false"
|
||||
|
||||
# qt_internal_extend_target(Core CONDITION _ss_f16c_cxx ... # special case remove: Handled manually
|
||||
|
||||
# special case begin
|
||||
# Remove this because it's handled manually
|
||||
#qt_internal_extend_target(Core CONDITION NOT _x_-armcc_x_ AND NOT cross_compile AND NOT static AND (hurd_x_ OR linux_x_)
|
||||
@ -1291,21 +1274,6 @@ qt_internal_extend_target(Core CONDITION WASM
|
||||
kernel/qeventdispatcher_wasm.cpp kernel/qeventdispatcher_wasm_p.h
|
||||
)
|
||||
|
||||
# special case begin
|
||||
# needs refinement for the other compiler specific cases.
|
||||
if(TEST_arch_${TEST_architecture_arch}_subarch_f16c)
|
||||
# Equivalent to contains(QT_CPU_FEATURES.$$QT_ARCH, f16c)
|
||||
qt_internal_extend_target(Core
|
||||
DEFINES
|
||||
QFLOAT16_INCLUDE_FAST
|
||||
)
|
||||
else()
|
||||
qt_internal_add_simd_part(Core SIMD f16c
|
||||
SOURCES
|
||||
global/qfloat16_f16c.c
|
||||
)
|
||||
endif()
|
||||
|
||||
set_source_files_properties(
|
||||
thread/qmutex_mac.cpp
|
||||
thread/qmutex_unix.cpp
|
||||
|
@ -197,17 +197,36 @@ static inline bool hasFastF16()
|
||||
return qCpuHasFeature(F16C) && qCpuHasFeature(AVX);
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
#ifdef QFLOAT16_INCLUDE_FAST
|
||||
# define f16cextern static
|
||||
#else
|
||||
# define f16cextern extern
|
||||
#endif
|
||||
QT_FUNCTION_TARGET(F16C)
|
||||
void qFloatToFloat16_fast(quint16 *out, const float *in, qsizetype len) Q_DECL_NOEXCEPT
|
||||
{
|
||||
qsizetype i = 0;
|
||||
int epilog_i;
|
||||
for (; i < len - 7; i += 8)
|
||||
_mm_storeu_si128((__m128i *)(out + i), _mm256_cvtps_ph(_mm256_loadu_ps(in + i), 0));
|
||||
if (i < len - 3) {
|
||||
_mm_storel_epi64((__m128i *)(out + i), _mm_cvtps_ph(_mm_loadu_ps(in + i), 0));
|
||||
i += 4;
|
||||
}
|
||||
// Inlining "qfloat16::qfloat16(float f)":
|
||||
for (epilog_i = 0; i < len && epilog_i < 3; ++i, ++epilog_i)
|
||||
out[i] = _mm_extract_epi16(_mm_cvtps_ph(_mm_set_ss(in[i]), 0), 0);
|
||||
}
|
||||
|
||||
f16cextern void qFloatToFloat16_fast(quint16 *out, const float *in, qsizetype len) noexcept;
|
||||
f16cextern void qFloatFromFloat16_fast(float *out, const quint16 *in, qsizetype len) noexcept;
|
||||
|
||||
#undef f16cextern
|
||||
QT_FUNCTION_TARGET(F16C)
|
||||
void qFloatFromFloat16_fast(float *out, const quint16 *in, qsizetype len) Q_DECL_NOEXCEPT
|
||||
{
|
||||
qsizetype i = 0;
|
||||
int epilog_i;
|
||||
for (; i < len - 7; i += 8)
|
||||
_mm256_storeu_ps(out + i, _mm256_cvtph_ps(_mm_loadu_si128((const __m128i *)(in + i))));
|
||||
if (i < len - 3) {
|
||||
_mm_storeu_ps(out + i, _mm_cvtph_ps(_mm_loadl_epi64((const __m128i *)(in + i))));
|
||||
i += 4;
|
||||
}
|
||||
// Inlining "qfloat16::operator float()":
|
||||
for (epilog_i = 0; i < len && epilog_i < 3; ++i, ++epilog_i)
|
||||
out[i] = _mm_cvtss_f32(_mm_cvtph_ps(_mm_cvtsi32_si128(in[i])));
|
||||
}
|
||||
|
||||
#elif defined(__ARM_FP16_FORMAT_IEEE) && defined(__ARM_NEON__) && (__ARM_FP & 2)
|
||||
@ -292,6 +311,3 @@ Q_CORE_EXPORT void qFloatFromFloat16(float *out, const qfloat16 *in, qsizetype l
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#include "qfloat16tables.cpp"
|
||||
#ifdef QFLOAT16_INCLUDE_FAST
|
||||
# include "qfloat16_f16c.c"
|
||||
#endif
|
||||
|
@ -1,88 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "private/qsimd_p.h"
|
||||
|
||||
// The x86 F16C instructions operate on AVX registers, so AVX support is
|
||||
// required.
|
||||
#if QT_COMPILER_SUPPORTS_HERE(AVX)
|
||||
|
||||
#ifdef __cplusplus
|
||||
QT_BEGIN_NAMESPACE
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
QT_FUNCTION_TARGET(F16C)
|
||||
void qFloatToFloat16_fast(quint16 *out, const float *in, qsizetype len) Q_DECL_NOEXCEPT
|
||||
{
|
||||
qsizetype i = 0;
|
||||
int epilog_i;
|
||||
for (; i < len - 7; i += 8)
|
||||
_mm_storeu_si128((__m128i *)(out + i), _mm256_cvtps_ph(_mm256_loadu_ps(in + i), 0));
|
||||
if (i < len - 3) {
|
||||
_mm_storel_epi64((__m128i *)(out + i), _mm_cvtps_ph(_mm_loadu_ps(in + i), 0));
|
||||
i += 4;
|
||||
}
|
||||
// Inlining "qfloat16::qfloat16(float f)":
|
||||
for (epilog_i = 0; i < len && epilog_i < 3; ++i, ++epilog_i)
|
||||
out[i] = _mm_extract_epi16(_mm_cvtps_ph(_mm_set_ss(in[i]), 0), 0);
|
||||
}
|
||||
|
||||
QT_FUNCTION_TARGET(F16C)
|
||||
void qFloatFromFloat16_fast(float *out, const quint16 *in, qsizetype len) Q_DECL_NOEXCEPT
|
||||
{
|
||||
qsizetype i = 0;
|
||||
int epilog_i;
|
||||
for (; i < len - 7; i += 8)
|
||||
_mm256_storeu_ps(out + i, _mm256_cvtph_ps(_mm_loadu_si128((const __m128i *)(in + i))));
|
||||
if (i < len - 3) {
|
||||
_mm_storeu_ps(out + i, _mm_cvtph_ps(_mm_loadl_epi64((const __m128i *)(in + i))));
|
||||
i += 4;
|
||||
}
|
||||
// Inlining "qfloat16::operator float()":
|
||||
for (epilog_i = 0; i < len && epilog_i < 3; ++i, ++epilog_i)
|
||||
out[i] = _mm_cvtss_f32(_mm_cvtph_ps(_mm_cvtsi32_si128(in[i])));
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
QT_END_NAMESPACE
|
||||
#endif
|
||||
|
||||
#endif // QT_COMPILER_SUPPORTS_HERE(AVX)
|
Loading…
Reference in New Issue
Block a user