aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2003-07-03 21:38:55 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2003-07-03 21:38:55 +0000
commit0a9530a9d7cf389493916027f9980fcbf028b602 (patch)
tree6f8671ee7d010f3f877a3ed92690c0d270f47544 /gcc/testsuite
parent7516d73631a96bcc28178f057bee4e713022b7d5 (diff)
downloadgcc-0a9530a9d7cf389493916027f9980fcbf028b602.zip
gcc-0a9530a9d7cf389493916027f9980fcbf028b602.tar.gz
gcc-0a9530a9d7cf389493916027f9980fcbf028b602.tar.bz2
real.c (real_trunc, [...]): New functions to implement trunc, floor and ceil respectively.
* real.c (real_trunc, real_floor, real_ceil): New functions to implement trunc, floor and ceil respectively. * real.h (real_trunc, real_floor, real_ceil): Prototype here. * builtins.c (integer_valued_real_p): New function to test if a floating point expression has an integer valued result. (fold_trunc_transparent_mathfn): Optimize foo(foo(x)) as foo(x) where foo is an integer rounding function. Similarly, optimize foo(bar(x)) as bar(x), and foo((double)(int)x) as (double)(int)x when both foo and bar are integer rounding functions and we don't need to honor errno. (fold_builtin_trunc, fold_builtin_floor, fold_builtin_ceil): New functions to fold trunc, floor and ceil. (fold_builtin): Use fold_builtin_trunc to fold BUILT_IN_TRUNC*, fold_builtin_floor to fold BUILT_IN_FLOOR* and fold_builtin_ceil to fold BUILT_IN_CEIL*. * fold-const.c (tree_expr_nonnegative_p): Handle FLOAT_EXPR and the remaining integer rounding functions. * gcc.dg/builtins-25.c: New testcase. * gcc.dg/builtins-26.c: New testcase. From-SVN: r68903
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/builtins-25.c188
-rw-r--r--gcc/testsuite/gcc.dg/builtins-26.c105
3 files changed, 298 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7e4c0e6..b2db902 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2003-07-03 Roger Sayle <roger@eyesopen.com>
+
+ * gcc.dg/builtins-25.c: New testcase.
+ * gcc.dg/builtins-26.c: New testcase.
+
2003-07-03 Janis Johnson <janis187@us.ibm.com>
* gcc.dg/compat/vector-defs.h: New file.
diff --git a/gcc/testsuite/gcc.dg/builtins-25.c b/gcc/testsuite/gcc.dg/builtins-25.c
new file mode 100644
index 0000000..4950566
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/builtins-25.c
@@ -0,0 +1,188 @@
+/* Copyright (C) 2003 Free Software Foundation.
+
+ Check that constant folding of built-in math functions doesn't
+ break anything and produces the expected results.
+
+ Written by Roger Sayle, 28th June 2003. */
+
+/* { dg-do link } */
+/* { dg-options "-O2" } */
+
+extern void link_error(void);
+
+extern double trunc(double);
+extern double floor(double);
+extern double ceil(double);
+
+extern float truncf(float);
+extern float floorf(float);
+extern float ceilf(float);
+
+extern long double truncl(long double);
+extern long double floorl(long double);
+extern long double ceill(long double);
+
+void test()
+{
+ if (trunc (0.0) != 0.0)
+ link_error ();
+ if (floor (0.0) != 0.0)
+ link_error ();
+ if (ceil (0.0) != 0.0)
+ link_error ();
+
+ if (trunc (6.0) != 6.0)
+ link_error ();
+ if (floor (6.0) != 6.0)
+ link_error ();
+ if (ceil (6.0) != 6.0)
+ link_error ();
+
+ if (trunc (-8.0) != -8.0)
+ link_error ();
+ if (floor (-8.0) != -8.0)
+ link_error ();
+ if (ceil (-8.0) != -8.0)
+ link_error ();
+
+ if (trunc (3.2) != 3.0)
+ link_error ();
+ if (floor (3.2) != 3.0)
+ link_error ();
+ if (ceil (3.2) != 4.0)
+ link_error ();
+
+ if (trunc (-2.8) != -2.0)
+ link_error ();
+ if (floor (-2.8) != -3.0)
+ link_error ();
+ if (ceil (-2.8) != -2.0)
+ link_error ();
+
+ if (trunc (0.01) != 0.0)
+ link_error ();
+ if (floor (0.01) != 0.0)
+ link_error ();
+ if (ceil (0.01) != 1.0)
+ link_error ();
+
+ if (trunc (-0.7) != 0.0)
+ link_error ();
+ if (floor (-0.7) != -1.0)
+ link_error ();
+ if (ceil (-0.7) != 0.0)
+ link_error ();
+}
+
+void testf()
+{
+ if (truncf (0.0f) != 0.0f)
+ link_error ();
+ if (floorf (0.0f) != 0.0f)
+ link_error ();
+ if (ceilf (0.0f) != 0.0f)
+ link_error ();
+
+ if (truncf (6.0f) != 6.0f)
+ link_error ();
+ if (floorf (6.0f) != 6.0f)
+ link_error ();
+ if (ceilf (6.0f) != 6.0f)
+ link_error ();
+
+ if (truncf (-8.0f) != -8.0f)
+ link_error ();
+ if (floorf (-8.0f) != -8.0f)
+ link_error ();
+ if (ceilf (-8.0f) != -8.0f)
+ link_error ();
+
+ if (truncf (3.2f) != 3.0f)
+ link_error ();
+ if (floorf (3.2f) != 3.0f)
+ link_error ();
+ if (ceilf (3.2f) != 4.0f)
+ link_error ();
+
+ if (truncf (-2.8f) != -2.0f)
+ link_error ();
+ if (floorf (-2.8f) != -3.0f)
+ link_error ();
+ if (ceilf (-2.8f) != -2.0f)
+ link_error ();
+
+ if (truncf (0.01f) != 0.0f)
+ link_error ();
+ if (floorf (0.01f) != 0.0f)
+ link_error ();
+ if (ceilf (0.01f) != 1.0f)
+ link_error ();
+
+ if (truncf (-0.7f) != 0.0f)
+ link_error ();
+ if (floorf (-0.7f) != -1.0f)
+ link_error ();
+ if (ceilf (-0.7f) != 0.0f)
+ link_error ();
+}
+
+void testl()
+{
+ if (truncl (0.0l) != 0.0l)
+ link_error ();
+ if (floorl (0.0l) != 0.0l)
+ link_error ();
+ if (ceill (0.0l) != 0.0l)
+ link_error ();
+
+ if (truncl (6.0l) != 6.0l)
+ link_error ();
+ if (floorl (6.0l) != 6.0l)
+ link_error ();
+ if (ceill (6.0l) != 6.0l)
+ link_error ();
+
+ if (truncl (-8.0l) != -8.0l)
+ link_error ();
+ if (floorl (-8.0l) != -8.0l)
+ link_error ();
+ if (ceill (-8.0l) != -8.0l)
+ link_error ();
+
+ if (truncl (3.2l) != 3.0l)
+ link_error ();
+ if (floorl (3.2l) != 3.0l)
+ link_error ();
+ if (ceill (3.2l) != 4.0l)
+ link_error ();
+
+ if (truncl (-2.8l) != -2.0l)
+ link_error ();
+ if (floorl (-2.8l) != -3.0l)
+ link_error ();
+ if (ceill (-2.8l) != -2.0l)
+ link_error ();
+
+ if (truncl (0.01l) != 0.0l)
+ link_error ();
+ if (floorl (0.01l) != 0.0l)
+ link_error ();
+ if (ceill (0.01l) != 1.0l)
+ link_error ();
+
+ if (truncl (-0.7l) != 0.0l)
+ link_error ();
+ if (floorl (-0.7l) != -1.0l)
+ link_error ();
+ if (ceill (-0.7l) != 0.0l)
+ link_error ();
+}
+
+int main()
+{
+ test ();
+ testf ();
+ testl ();
+ return 0;
+}
+
diff --git a/gcc/testsuite/gcc.dg/builtins-26.c b/gcc/testsuite/gcc.dg/builtins-26.c
new file mode 100644
index 0000000..c4d03cd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/builtins-26.c
@@ -0,0 +1,105 @@
+/* Copyright (C) 2003 Free Software Foundation.
+
+ Check that constant folding of built-in math functions doesn't
+ break anything and produces the expected results.
+
+ Written by Roger Sayle, 28th June 2003. */
+
+/* { dg-do link } */
+/* { dg-options "-O2 -ffast-math" } */
+
+extern void link_error(void);
+
+extern double trunc(double);
+extern double floor(double);
+extern double ceil(double);
+
+extern float truncf(float);
+extern float floorf(float);
+extern float ceilf(float);
+
+extern long double truncl(long double);
+extern long double floorl(long double);
+extern long double ceill(long double);
+
+void test(double x)
+{
+ if (trunc (trunc (x)) != trunc (x))
+ link_error ();
+ if (trunc (floor (x)) != floor (x))
+ link_error ();
+ if (trunc (ceil (x)) != ceil (x))
+ link_error ();
+
+ if (floor (trunc (x)) != trunc (x))
+ link_error ();
+ if (floor (floor (x)) != floor (x))
+ link_error ();
+ if (floor (ceil (x)) != ceil (x))
+ link_error ();
+
+ if (ceil (trunc (x)) != trunc (x))
+ link_error ();
+ if (ceil (floor (x)) != floor (x))
+ link_error ();
+ if (ceil (ceil (x)) != ceil (x))
+ link_error ();
+}
+
+void testf(float x)
+{
+ if (truncf (truncf (x)) != truncf (x))
+ link_error ();
+ if (truncf (floorf (x)) != floorf (x))
+ link_error ();
+ if (truncf (ceilf (x)) != ceilf (x))
+ link_error ();
+
+ if (floorf (truncf (x)) != truncf (x))
+ link_error ();
+ if (floorf (floorf (x)) != floorf (x))
+ link_error ();
+ if (floorf (ceilf (x)) != ceilf (x))
+ link_error ();
+
+ if (ceilf (truncf (x)) != truncf (x))
+ link_error ();
+ if (ceilf (floorf (x)) != floorf (x))
+ link_error ();
+ if (ceilf (ceilf (x)) != ceilf (x))
+ link_error ();
+}
+
+void testl(long double x)
+{
+ if (truncl (truncl (x)) != truncl (x))
+ link_error ();
+ if (truncl (floorl (x)) != floorl (x))
+ link_error ();
+ if (truncl (ceill (x)) != ceill (x))
+ link_error ();
+
+ if (floorl (truncl (x)) != truncl (x))
+ link_error ();
+ if (floorl (floorl (x)) != floorl (x))
+ link_error ();
+ if (floorl (ceill (x)) != ceill (x))
+ link_error ();
+
+ if (ceill (truncl (x)) != truncl (x))
+ link_error ();
+ if (ceill (floorl (x)) != floorl (x))
+ link_error ();
+ if (ceill (ceill (x)) != ceill (x))
+ link_error ();
+}
+
+
+int main()
+{
+ test (3.2);
+ testf (3.2f);
+ testl (3.2l);
+ return 0;
+}
+