Simplify finite/NaN testing for qfloat16
Doing endian-dependent selection of bytes of the value was a clumsy surrogate for just accessing the intenal quint16 shifted suitably. Change-Id: Icfd9d1d18f69eb94b041b8d32275df606c14c2b4 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>bb10
parent
920622b803
commit
921fa344e1
|
|
@ -12,7 +12,6 @@ HEADERS += \
|
|||
global/qendian_p.h \
|
||||
global/qnumeric_p.h \
|
||||
global/qnumeric.h \
|
||||
global/qfloat16_p.h \
|
||||
global/qfloat16.h \
|
||||
global/qglobalstatic.h \
|
||||
global/qlibraryinfo.h \
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qfloat16_p.h"
|
||||
#include "qfloat16.h"
|
||||
#include "private/qsimd_p.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
|
@ -65,28 +65,31 @@ QT_BEGIN_NAMESPACE
|
|||
*/
|
||||
|
||||
/*!
|
||||
Returns true if the \c qfloat16 \a {f} is equivalent to infinity.
|
||||
\fn bool qIsInf(qfloat16 f)
|
||||
\relates <QFloat16>
|
||||
|
||||
Returns true if the \c qfloat16 \a {f} is equivalent to infinity.
|
||||
|
||||
\sa qIsInf
|
||||
*/
|
||||
Q_REQUIRED_RESULT bool qIsInf(qfloat16 f) Q_DECL_NOTHROW { return qt_is_inf(f); }
|
||||
|
||||
/*!
|
||||
Returns true if the \c qfloat16 \a {f} is not a number (NaN).
|
||||
\fn bool qIsNaN(qfloat16 f)
|
||||
\relates <QFloat16>
|
||||
|
||||
Returns true if the \c qfloat16 \a {f} is not a number (NaN).
|
||||
|
||||
\sa qIsNaN
|
||||
*/
|
||||
Q_REQUIRED_RESULT bool qIsNaN(qfloat16 f) Q_DECL_NOTHROW { return qt_is_nan(f); }
|
||||
|
||||
/*!
|
||||
Returns true if the \c qfloat16 \a {f} is a finite number.
|
||||
\fn bool qIsFinite(qfloat16 f)
|
||||
\relates <QFloat16>
|
||||
|
||||
Returns true if the \c qfloat16 \a {f} is a finite number.
|
||||
|
||||
\sa qIsFinite
|
||||
*/
|
||||
Q_REQUIRED_RESULT bool qIsFinite(qfloat16 f) Q_DECL_NOTHROW { return qt_is_finite(f); }
|
||||
|
||||
/*! \fn int qRound(qfloat16 value)
|
||||
\relates <QFloat16>
|
||||
|
|
|
|||
|
|
@ -67,10 +67,14 @@ QT_BEGIN_NAMESPACE
|
|||
class qfloat16
|
||||
{
|
||||
public:
|
||||
Q_DECL_CONSTEXPR inline qfloat16() Q_DECL_NOTHROW : b16(0) { }
|
||||
constexpr inline qfloat16() Q_DECL_NOTHROW : b16(0) {}
|
||||
inline qfloat16(float f) Q_DECL_NOTHROW;
|
||||
inline operator float() const Q_DECL_NOTHROW;
|
||||
|
||||
// Support for qIs{Inf,NaN,Finite}:
|
||||
bool isInf() const Q_DECL_NOTHROW { return ((b16 >> 8) & 0x7e) == 0x7c; }
|
||||
bool isNaN() const Q_DECL_NOTHROW { return ((b16 >> 8) & 0x7e) == 0x7e; }
|
||||
bool isFinite() const Q_DECL_NOTHROW { return ((b16 >> 8) & 0x7c) != 0x7c; }
|
||||
private:
|
||||
quint16 b16;
|
||||
|
||||
|
|
@ -89,9 +93,11 @@ Q_DECLARE_TYPEINFO(qfloat16, Q_PRIMITIVE_TYPE);
|
|||
Q_CORE_EXPORT void qFloatToFloat16(qfloat16 *, const float *, qsizetype length) Q_DECL_NOTHROW;
|
||||
Q_CORE_EXPORT void qFloatFromFloat16(float *, const qfloat16 *, qsizetype length) Q_DECL_NOTHROW;
|
||||
|
||||
Q_REQUIRED_RESULT Q_CORE_EXPORT bool qIsInf(qfloat16 f) Q_DECL_NOTHROW; // complements qnumeric.h
|
||||
Q_REQUIRED_RESULT Q_CORE_EXPORT bool qIsNaN(qfloat16 f) Q_DECL_NOTHROW; // complements qnumeric.h
|
||||
Q_REQUIRED_RESULT Q_CORE_EXPORT bool qIsFinite(qfloat16 f) Q_DECL_NOTHROW; // complements qnumeric.h
|
||||
// Complement qnumeric.h:
|
||||
Q_REQUIRED_RESULT inline bool qIsInf(qfloat16 f) Q_DECL_NOTHROW { return f.isInf(); }
|
||||
Q_REQUIRED_RESULT inline bool qIsNaN(qfloat16 f) Q_DECL_NOTHROW { return f.isNaN(); }
|
||||
Q_REQUIRED_RESULT inline bool qIsFinite(qfloat16 f) Q_DECL_NOTHROW { return f.isFinite(); }
|
||||
// Q_REQUIRED_RESULT quint32 qFloatDistance(qfloat16 a, qfloat16 b);
|
||||
|
||||
// The remainder of these utility functions complement qglobal.h
|
||||
Q_REQUIRED_RESULT inline int qRound(qfloat16 d) Q_DECL_NOTHROW
|
||||
|
|
|
|||
|
|
@ -1,95 +0,0 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 by Southwest Research Institute (R)
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** 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$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QFLOAT16_P_H
|
||||
#define QFLOAT16_P_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include <QtCore/qfloat16.h>
|
||||
#include <QtCore/qsysinfo.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
static inline bool qt_is_inf(qfloat16 d) Q_DECL_NOTHROW
|
||||
{
|
||||
bool is_inf;
|
||||
uchar *ch = (uchar *)&d;
|
||||
if (QSysInfo::ByteOrder == QSysInfo::BigEndian)
|
||||
is_inf = (ch[0] & 0x7c) == 0x7c && (ch[0] & 0x02) == 0;
|
||||
else
|
||||
is_inf = (ch[1] & 0x7c) == 0x7c && (ch[1] & 0x02) == 0;
|
||||
return is_inf;
|
||||
}
|
||||
|
||||
static inline bool qt_is_nan(qfloat16 d) Q_DECL_NOTHROW
|
||||
{
|
||||
bool is_nan;
|
||||
uchar *ch = (uchar *)&d;
|
||||
if (QSysInfo::ByteOrder == QSysInfo::BigEndian)
|
||||
is_nan = (ch[0] & 0x7c) == 0x7c && (ch[0] & 0x02) != 0;
|
||||
else
|
||||
is_nan = (ch[1] & 0x7c) == 0x7c && (ch[1] & 0x02) != 0;
|
||||
return is_nan;
|
||||
}
|
||||
|
||||
static inline bool qt_is_finite(qfloat16 d) Q_DECL_NOTHROW
|
||||
{
|
||||
bool is_finite;
|
||||
uchar *ch = (uchar *)&d;
|
||||
if (QSysInfo::ByteOrder == QSysInfo::BigEndian)
|
||||
is_finite = (ch[0] & 0x7c) != 0x7c;
|
||||
else
|
||||
is_finite = (ch[1] & 0x7c) != 0x7c;
|
||||
return is_finite;
|
||||
}
|
||||
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QFLOAT16_P_H
|
||||
Loading…
Reference in New Issue