summaryrefslogtreecommitdiff
path: root/test/builtins/Unit
diff options
context:
space:
mode:
authorPirama Arumuga Nainar <pirama@google.com>2015-06-23 20:24:53 +0000
committerPirama Arumuga Nainar <pirama@google.com>2015-06-23 20:24:53 +0000
commit704d41254ed70ee30a22e4e757e5a1d420e76cfc (patch)
tree2c217eeb40739f17d2e9a7ceb6b60ab12a3e1d58 /test/builtins/Unit
parenta5665a07e4194bb5468896ab533150d5e6664a16 (diff)
Fix incorrect truncation at the overflow boundary
Summary: This patch fixes incorrect truncation when the input wider value is exactly 2^dstBits. For that value, the overflow to infinity is not correctly handled. The fix is to replace a strict '>' with '>='. Currently, __truncdfsf2(340282366900000000000000000000000000000.0) returns infinity __truncdfsf2(340282366920938463463374607431768211456.0) returns 0 __truncdfsf2(400000000000000000000000000000000000000.0) returns infinity Likewise, __truncdfhf2 and __truncsfhf2 (and consequently gnu_f2h_ieee) are discontinuous at 65536.0. This patch adds tests for all three cases, along with adding a missing header include to fp_test.h. Reviewers: joerg, ab, srhines Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D10594 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@240450 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/builtins/Unit')
-rw-r--r--test/builtins/Unit/fp_test.h1
-rw-r--r--test/builtins/Unit/truncdfhf2_test.c3
-rw-r--r--test/builtins/Unit/truncdfsf2_test.c38
-rw-r--r--test/builtins/Unit/truncsfhf2_test.c3
4 files changed, 45 insertions, 0 deletions
diff --git a/test/builtins/Unit/fp_test.h b/test/builtins/Unit/fp_test.h
index 79d652f17..1f0e7be6d 100644
--- a/test/builtins/Unit/fp_test.h
+++ b/test/builtins/Unit/fp_test.h
@@ -14,6 +14,7 @@
#include <stdlib.h>
#include <limits.h>
#include <string.h>
+#include <stdint.h>
enum EXPECTED_RESULT {
LESS_0, LESS_EQUAL_0, EQUAL_0, GREATER_0, GREATER_EQUAL_0, NEQUAL_0
diff --git a/test/builtins/Unit/truncdfhf2_test.c b/test/builtins/Unit/truncdfhf2_test.c
index 98c5c9dac..6627a001e 100644
--- a/test/builtins/Unit/truncdfhf2_test.c
+++ b/test/builtins/Unit/truncdfhf2_test.c
@@ -107,5 +107,8 @@ int main()
if (test__truncdfhf2(-65520.0,
UINT16_C(0xfc00)))
return 1;
+ if (test__truncdfhf2(65536.0,
+ UINT16_C(0x7c00)))
+ return 1;
return 0;
}
diff --git a/test/builtins/Unit/truncdfsf2_test.c b/test/builtins/Unit/truncdfsf2_test.c
new file mode 100644
index 000000000..a208a3a56
--- /dev/null
+++ b/test/builtins/Unit/truncdfsf2_test.c
@@ -0,0 +1,38 @@
+//===--------------- truncdfsf2_test.c - Test __truncdfsf2 ----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file tests __truncdfsf2 for the compiler_rt library.
+//
+//===----------------------------------------------------------------------===//
+
+#include <stdio.h>
+
+#include "fp_test.h"
+
+float __truncdfsf2(double a);
+
+int test__truncdfsf2(double a)
+{
+ float actual = __truncdfsf2(a);
+ float expected = a;
+
+ if (actual != expected) {
+ printf("error in test__truncdfsf2(%lf) = %f, "
+ "expected %f\n", a, actual, expected);
+ return 1;
+ }
+ return 0;
+}
+
+int main()
+{
+ if (test__truncdfsf2(340282366920938463463374607431768211456.0))
+ return 1;
+ return 0;
+}
diff --git a/test/builtins/Unit/truncsfhf2_test.c b/test/builtins/Unit/truncsfhf2_test.c
index 2024605d0..5bc3c8e22 100644
--- a/test/builtins/Unit/truncsfhf2_test.c
+++ b/test/builtins/Unit/truncsfhf2_test.c
@@ -104,6 +104,9 @@ int main()
if (test__truncsfhf2(65520.0f,
UINT16_C(0x7c00)))
return 1;
+ if (test__truncsfhf2(65536.0f,
+ UINT16_C(0x7c00)))
+ return 1;
if (test__truncsfhf2(-65520.0f,
UINT16_C(0xfc00)))
return 1;