aboutsummaryrefslogtreecommitdiff
path: root/arm_compute/core/FixedPoint.inl
diff options
context:
space:
mode:
Diffstat (limited to 'arm_compute/core/FixedPoint.inl')
-rw-r--r--arm_compute/core/FixedPoint.inl46
1 files changed, 15 insertions, 31 deletions
diff --git a/arm_compute/core/FixedPoint.inl b/arm_compute/core/FixedPoint.inl
index 5ea0f6c825..9c7e35ab16 100644
--- a/arm_compute/core/FixedPoint.inl
+++ b/arm_compute/core/FixedPoint.inl
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017 ARM Limited.
+ * Copyright (c) 2017-2018 ARM Limited.
*
* SPDX-License-Identifier: MIT
*
@@ -22,27 +22,11 @@
* SOFTWARE.
*/
#include "arm_compute/core/Error.h"
+#include "arm_compute/core/utils/misc/utility.h"
#include <cmath>
#include <limits>
-namespace
-{
-template <typename TpIn, typename TpSat>
-inline TpSat saturate_convert(TpIn a)
-{
- if(a > std::numeric_limits<TpSat>::max())
- {
- a = std::numeric_limits<TpSat>::max();
- }
- if(a < std::numeric_limits<TpSat>::min())
- {
- a = std::numeric_limits<TpSat>::min();
- }
- return static_cast<TpSat>(a);
-}
-} // namespace
-
namespace arm_compute
{
inline qint8_t sqshl_qs8(qint8_t a, int shift)
@@ -50,7 +34,7 @@ inline qint8_t sqshl_qs8(qint8_t a, int shift)
qint16_t tmp = static_cast<qint16_t>(a) << shift;
// Saturate the result in case of overflow and cast to qint8_t
- return saturate_convert<qint16_t, qint8_t>(tmp);
+ return utility::saturate_cast<qint8_t>(tmp);
}
inline qint16_t sqshl_qs16(qint16_t a, int shift)
@@ -58,7 +42,7 @@ inline qint16_t sqshl_qs16(qint16_t a, int shift)
qint32_t tmp = static_cast<qint32_t>(a) << shift;
// Saturate the result in case of overflow and cast to qint16_t
- return saturate_convert<qint32_t, qint16_t>(tmp);
+ return utility::saturate_cast<qint16_t>(tmp);
}
inline qint8_t sshr_qs8(qint8_t a, int shift)
@@ -101,7 +85,7 @@ inline qint8_t sqadd_qs8(qint8_t a, qint8_t b)
qint16_t tmp = (static_cast<qint16_t>(a) + static_cast<qint16_t>(b));
// Saturate the result in case of overflow and cast to qint8_t
- return saturate_convert<qint16_t, qint8_t>(tmp);
+ return utility::saturate_cast<qint8_t>(tmp);
}
inline qint16_t sqadd_qs16(qint16_t a, qint16_t b)
@@ -110,7 +94,7 @@ inline qint16_t sqadd_qs16(qint16_t a, qint16_t b)
qint32_t tmp = (static_cast<qint32_t>(a) + static_cast<qint32_t>(b));
// Saturate the result in case of overflow and cast to qint16_t
- return saturate_convert<qint32_t, qint16_t>(tmp);
+ return utility::saturate_cast<qint16_t>(tmp);
}
inline qint32_t sqadd_qs32(qint32_t a, qint32_t b)
@@ -119,7 +103,7 @@ inline qint32_t sqadd_qs32(qint32_t a, qint32_t b)
qint64_t tmp = (static_cast<qint64_t>(a) + static_cast<qint64_t>(b));
// Saturate the result in case of overflow and cast to qint32_t
- return saturate_convert<qint64_t, qint32_t>(tmp);
+ return utility::saturate_cast<qint32_t>(tmp);
}
inline qint8_t ssub_qs8(qint8_t a, qint8_t b)
@@ -138,7 +122,7 @@ inline qint8_t sqsub_qs8(qint8_t a, qint8_t b)
qint16_t tmp = static_cast<qint16_t>(a) - static_cast<qint16_t>(b);
// Saturate the result in case of overflow and cast to qint8_t
- return saturate_convert<qint16_t, qint8_t>(tmp);
+ return utility::saturate_cast<qint8_t>(tmp);
}
inline qint16_t sqsub_qs16(qint16_t a, qint16_t b)
@@ -147,7 +131,7 @@ inline qint16_t sqsub_qs16(qint16_t a, qint16_t b)
qint32_t tmp = static_cast<qint32_t>(a) - static_cast<qint32_t>(b);
// Saturate the result in case of overflow and cast to qint16_t
- return saturate_convert<qint32_t, qint16_t>(tmp);
+ return utility::saturate_cast<qint16_t>(tmp);
}
inline qint8_t smul_qs8(qint8_t a, qint8_t b, int fixed_point_position)
@@ -183,7 +167,7 @@ inline qint8_t sqmul_qs8(qint8_t a, qint8_t b, int fixed_point_position)
// Rounding up
tmp += round_up_const;
- return saturate_convert<qint16_t, qint8_t>(tmp >> fixed_point_position);
+ return utility::saturate_cast<qint8_t>(tmp >> fixed_point_position);
}
inline qint16_t sqmul_qs16(qint16_t a, qint16_t b, int fixed_point_position)
@@ -195,7 +179,7 @@ inline qint16_t sqmul_qs16(qint16_t a, qint16_t b, int fixed_point_position)
// Rounding up
tmp += round_up_const;
- return saturate_convert<qint32_t, qint16_t>(tmp >> fixed_point_position);
+ return utility::saturate_cast<qint16_t>(tmp >> fixed_point_position);
}
inline qint16_t sqmull_qs8(qint8_t a, qint8_t b, int fixed_point_position)
@@ -394,7 +378,7 @@ inline float scvt_f32_qs8(qint8_t a, int fixed_point_position)
inline qint8_t sqcvt_qs8_f32(float a, int fixed_point_position)
{
// round_nearest_integer(a * 2^(fixed_point_position))
- return saturate_convert<float, qint8_t>(a * (1 << fixed_point_position) + ((a >= 0) ? 0.5 : -0.5));
+ return utility::saturate_cast<qint8_t>(a * (1 << fixed_point_position) + ((a >= 0) ? 0.5 : -0.5));
}
inline float scvt_f32_qs16(qint16_t a, int fixed_point_position)
@@ -405,18 +389,18 @@ inline float scvt_f32_qs16(qint16_t a, int fixed_point_position)
inline qint16_t sqcvt_qs16_f32(float a, int fixed_point_position)
{
// round_nearest_integer(a * 2^(fixed_point_position))
- return saturate_convert<float, qint16_t>(a * (1 << fixed_point_position) + ((a >= 0) ? 0.5 : -0.5));
+ return utility::saturate_cast<qint16_t>(a * (1 << fixed_point_position) + ((a >= 0) ? 0.5 : -0.5));
}
inline qint8_t sqmovn_qs16(qint16_t a)
{
// Saturate the result in case of overflow and cast to qint8_t
- return saturate_convert<qint16_t, qint8_t>(a);
+ return utility::saturate_cast<qint8_t>(a);
}
inline qint16_t sqmovn_qs32(qint32_t a)
{
// Saturate the result in case of overflow and cast to qint16_t
- return saturate_convert<qint32_t, qint16_t>(a);
+ return utility::saturate_cast<qint16_t>(a);
}
}