Move the definition of a native float from qfloat16.h to qtypes.h

... and put it into QtPrivate namespace as NativeFloat16Type.

Keep the qfloat16::NativeFloat definition for SC.

This is in preparation of Qt::compareThreeWay() for NativeFloat16Type
(where available and mis-classified as non-is_floating_point).

Amends 99c7f0419e66692260be56c0385badeacb3f6760.

Pick-to: 6.5
Task-number: QTBUG-104113
Change-Id: Ie12c42c86f8dc9e233fe39776b0f0e28088de9e2
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
(cherry picked from commit 43d3d037605bac4e13a1282c4eb363cdee98eb74)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Ivan Solovev 2023-09-26 17:11:03 +02:00 committed by Qt Cherry-pick Bot
parent 4f979ec945
commit 9eb1eb10c1
2 changed files with 29 additions and 23 deletions

View File

@ -9,15 +9,11 @@
#include <QtCore/qhashfunctions.h>
#include <QtCore/qmath.h>
#include <QtCore/qnamespace.h>
#include <QtCore/qtypes.h>
#include <limits>
#include <string.h>
#if defined(__STDCPP_FLOAT16_T__) && __has_include(<stdfloat>)
// P1467 implementation - https://wg21.link/p1467
# include <stdfloat>
#endif
#if defined(QT_COMPILER_SUPPORTS_F16C) && defined(__AVX2__) && !defined(__F16C__)
// All processors that support AVX2 do support F16C too, so we could enable the
// feature unconditionally if __AVX2__ is defined. However, all currently
@ -55,24 +51,8 @@ class qfloat16
};
public:
#if defined(__STDCPP_FLOAT16_T__)
# define QFLOAT16_IS_NATIVE 1
using NativeType = std::float16_t;
#elif defined(Q_CC_CLANG) && defined(__FLT16_MAX__) && 0
// disabled due to https://github.com/llvm/llvm-project/issues/56963
# define QFLOAT16_IS_NATIVE 1
using NativeType = decltype(__FLT16_MAX__);
#elif defined(Q_CC_GNU_ONLY) && defined(__FLT16_MAX__)
# define QFLOAT16_IS_NATIVE 1
# ifdef __ARM_FP16_FORMAT_IEEE
using NativeType = __fp16;
# else
using NativeType = _Float16;
# endif
#else
# define QFLOAT16_IS_NATIVE 0
using NativeType = void;
#endif
using NativeType = QtPrivate::NativeFloat16Type;
static constexpr bool IsNative = QFLOAT16_IS_NATIVE;
using NearestFloat = std::conditional_t<IsNative, NativeType, float>;

View File

@ -12,6 +12,10 @@
#ifdef __cplusplus
# include <cstddef>
# include <cstdint>
# if defined(__STDCPP_FLOAT16_T__) && __has_include(<stdfloat>)
// P1467 implementation - https://wg21.link/p1467
# include <stdfloat>
# endif // defined(__STDCPP_FLOAT16_T__) && __has_include(<stdfloat>)
#else
# include <assert.h>
#endif
@ -250,6 +254,28 @@ using qsizetype = QIntegerForSizeof<std::size_t>::Signed;
#error Unsupported platform (unknown value for SIZE_MAX)
#endif
// Define a native float16 type
namespace QtPrivate {
#if defined(__STDCPP_FLOAT16_T__)
# define QFLOAT16_IS_NATIVE 1
using NativeFloat16Type = std::float16_t;
#elif defined(Q_CC_CLANG) && defined(__FLT16_MAX__) && 0
// disabled due to https://github.com/llvm/llvm-project/issues/56963
# define QFLOAT16_IS_NATIVE 1
using NativeFloat16Type = decltype(__FLT16_MAX__);
#elif defined(Q_CC_GNU_ONLY) && defined(__FLT16_MAX__)
# define QFLOAT16_IS_NATIVE 1
# ifdef __ARM_FP16_FORMAT_IEEE
using NativeFloat16Type = __fp16;
# else
using NativeFloat16Type = _Float16;
# endif
#else
# define QFLOAT16_IS_NATIVE 0
using NativeFloat16Type = void;
#endif
} // QtPrivate
#endif // __cplusplus
QT_END_NAMESPACE