target-arm: Correct ABD's handling of negative zeroes
authorPeter Maydell <peter.maydell@linaro.org>
Fri, 11 Mar 2011 08:12:24 +0000 (08:12 +0000)
committerAurelien Jarno <aurelien@aurel32.net>
Sun, 3 Apr 2011 15:19:38 +0000 (17:19 +0200)
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>
target-arm/neon_helper.c

index 9d54a75ef3b92f77187ca8b8eeec5c84c63880f4..bf324c62b6d966bf37e3f69076d7ae14b90cdf03 100644 (file)
@@ -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)