aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2011-03-11 08:12:24 +0000
committerAurelien Jarno <aurelien@aurel32.net>2011-04-03 17:19:38 +0200
commit79c18be7dfe660ab48f9f535e6cabd38c9f1d73b (patch)
tree945bc26f5ce9c2bcdccd0019435732d3b2af3093
parent0e3261098ff41c40ce3381b8ad7cff330458da3d (diff)
target-arm: Correct ABD's handling of negative zeroes
Implement ABD by taking the absolute value of the difference of the operands (as the ARM ARM specifies) rather than by flipping the order of the operands to the subtract based on the results of a comparison. The latter approch gives the wrong answers for some edge cases like negative zero. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
-rw-r--r--target-arm/neon_helper.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/target-arm/neon_helper.c b/target-arm/neon_helper.c
index 9d54a75ef3..bf324c62b6 100644
--- a/target-arm/neon_helper.c
+++ b/target-arm/neon_helper.c
@@ -1789,9 +1789,7 @@ uint32_t HELPER(neon_abd_f32)(uint32_t a, uint32_t b)
{
float32 f0 = make_float32(a);
float32 f1 = make_float32(b);
- return float32_val((float32_compare_quiet(f0, f1, NFS) == 1)
- ? float32_sub(f0, f1, NFS)
- : float32_sub(f1, f0, NFS));
+ return float32_val(float32_abs(float32_sub(f0, f1, NFS)));
}
uint32_t HELPER(neon_add_f32)(uint32_t a, uint32_t b)