From 3155f77d23eb332974a6b9cb5d37a1329b8493a6 Mon Sep 17 00:00:00 2001 From: morgolock Date: Mon, 11 May 2020 16:00:04 +0100 Subject: COMPMID-3457: vexp failure in QASYMM8_SIGNED overflowing Change-Id: Ied11a4a3e9d04615a1a1f0bfa552f3dd8293a170 Signed-off-by: morgolock Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/3178 Tested-by: Arm Jenkins Reviewed-by: Michele Di Giorgio Reviewed-by: Georgios Pinitas Comments-Addressed: Arm Jenkins --- arm_compute/core/NEON/NEMath.h | 1 + arm_compute/core/NEON/NEMath.inl | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/arm_compute/core/NEON/NEMath.h b/arm_compute/core/NEON/NEMath.h index 3905f67e29..8827bbf459 100644 --- a/arm_compute/core/NEON/NEMath.h +++ b/arm_compute/core/NEON/NEMath.h @@ -25,6 +25,7 @@ #define ARM_COMPUTE_NEMATH_H #include +#include namespace arm_compute { diff --git a/arm_compute/core/NEON/NEMath.inl b/arm_compute/core/NEON/NEMath.inl index 49870d06a8..032bfde238 100644 --- a/arm_compute/core/NEON/NEMath.inl +++ b/arm_compute/core/NEON/NEMath.inl @@ -22,6 +22,7 @@ * SOFTWARE. */ #include +#include #ifndef M_PI #define M_PI (3.14159265358979323846) @@ -147,6 +148,8 @@ inline float32x4_t vexpq_f32(float32x4_t x) { static const float32x4_t CONST_LN2 = vdupq_n_f32(0.6931471805f); // ln(2) static const float32x4_t CONST_INV_LN2 = vdupq_n_f32(1.4426950408f); // 1/ln(2) + static const float32x4_t CONST_INF = vdupq_n_f32(std::numeric_limits::infinity()); + static const float32x4_t CONST_MAX_INPUT = vdupq_n_f32(88.7f); static const float32x4_t CONST_0 = vdupq_n_f32(0.f); static const int32x4_t CONST_NEGATIVE_126 = vdupq_n_s32(-126); @@ -159,7 +162,8 @@ inline float32x4_t vexpq_f32(float32x4_t x) // Reconstruct poly = vreinterpretq_f32_s32(vqaddq_s32(vreinterpretq_s32_f32(poly), vqshlq_n_s32(m, 23))); - poly = vbslq_f32(vcltq_s32(m, CONST_NEGATIVE_126), CONST_0, poly); + poly = vbslq_f32(vcltq_s32(m, CONST_NEGATIVE_126), CONST_0, poly); // Handle underflow + poly = vbslq_f32(vcgtq_f32(x, CONST_MAX_INPUT), CONST_INF, poly); // Handle overflow return poly; } -- cgit v1.2.1