aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>2009-04-04 12:25:06 +0000
committerRichard Earnshaw <rearnsha@arm.com>2009-04-04 12:25:06 +0000
commit5bd2d99ca31e0acfa325fb3e0d62321d1756a444 (patch)
tree217448799918e253f87fe5cbd6f905b3f62f61c7
parenta79c713915ac06f43f14bab42911be2cb4ec182f (diff)
PR target/39501
* arm.md (movsfcc): Disable if not TARGET_HARD_FLOAT. * testsuite/gcc.c-torture/execute/pr39501.c: New file. * testsuite/gcc.c-torture/execute/pr39501.x: New file. git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-4_4-branch@145537 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/arm/arm.md2
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr39501.c83
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr39501.x2
4 files changed, 93 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8a7d21cd96d..f46ad1e1198 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2009-04-04 Richard Earnshaw <rearnsha@arm.com>
+
+ PR target/39501
+ * arm.md (movsfcc): Disable if not TARGET_HARD_FLOAT.
+ * testsuite/gcc.c-torture/execute/pr39501.c: New file.
+ * testsuite/gcc.c-torture/execute/pr39501.x: New file.
+
2009-04-04 Jakub Jelinek <jakub@redhat.com>
* unwind-dw2.h (_Unwind_FrameState): Add REG_UNDEFINED enum value.
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 3128094f061..ff217e02c19 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -8260,7 +8260,7 @@
(if_then_else:SF (match_operand 1 "arm_comparison_operator" "")
(match_operand:SF 2 "s_register_operand" "")
(match_operand:SF 3 "nonmemory_operand" "")))]
- "TARGET_32BIT"
+ "TARGET_32BIT && TARGET_HARD_FLOAT"
"
{
enum rtx_code code = GET_CODE (operands[1]);
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr39501.c b/gcc/testsuite/gcc.c-torture/execute/pr39501.c
new file mode 100644
index 00000000000..3749d6e7889
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr39501.c
@@ -0,0 +1,83 @@
+/* { dg-options "-ffast-math" } */
+#define min1(a,b) ((a) < (b) ? (a) : (b))
+#define max1(a,b) ((a) > (b) ? (a) : (b))
+
+#define min2(a,b) ((a) <= (b) ? (a) : (b))
+#define max2(a,b) ((a) >= (b) ? (a) : (b))
+
+#define F(type,n) \
+ type __attribute__((noinline)) type##_##n(type a, type b) \
+ { \
+ return n(a, b); \
+ }
+
+F(float,min1)
+F(float,min2)
+F(float,max1)
+F(float,max2)
+
+F(double,min1)
+F(double,min2)
+F(double,max1)
+F(double,max2)
+
+int main()
+{
+ if (float_min1(0.f, -1.f) != -1.f) abort();
+ if (float_min1(-1.f, 0.f) != -1.f) abort();
+ if (float_min1(0.f, 1.f) != 0.f) abort();
+ if (float_min1(1.f, 0.f) != 0.f) abort();
+ if (float_min1(-1.f, 1.f) != -1.f) abort();
+ if (float_min1(1.f, -1.f) != -1.f) abort();
+
+ if (float_max1(0.f, -1.f) != 0.f) abort();
+ if (float_max1(-1.f, 0.f) != 0.f) abort();
+ if (float_max1(0.f, 1.f) != 1.f) abort();
+ if (float_max1(1.f, 0.f) != 1.f) abort();
+ if (float_max1(-1.f, 1.f) != 1.f) abort();
+ if (float_max1(1.f, -1.f) != 1.f) abort();
+
+ if (float_min2(0.f, -1.f) != -1.f) abort();
+ if (float_min2(-1.f, 0.f) != -1.f) abort();
+ if (float_min2(0.f, 1.f) != 0.f) abort();
+ if (float_min2(1.f, 0.f) != 0.f) abort();
+ if (float_min2(-1.f, 1.f) != -1.f) abort();
+ if (float_min2(1.f, -1.f) != -1.f) abort();
+
+ if (float_max2(0.f, -1.f) != 0.f) abort();
+ if (float_max2(-1.f, 0.f) != 0.f) abort();
+ if (float_max2(0.f, 1.f) != 1.f) abort();
+ if (float_max2(1.f, 0.f) != 1.f) abort();
+ if (float_max2(-1.f, 1.f) != 1.f) abort();
+ if (float_max2(1.f, -1.f) != 1.f) abort();
+
+ if (double_min1(0., -1.) != -1.) abort();
+ if (double_min1(-1., 0.) != -1.) abort();
+ if (double_min1(0., 1.) != 0.) abort();
+ if (double_min1(1., 0.) != 0.) abort();
+ if (double_min1(-1., 1.) != -1.) abort();
+ if (double_min1(1., -1.) != -1.) abort();
+
+ if (double_max1(0., -1.) != 0.) abort();
+ if (double_max1(-1., 0.) != 0.) abort();
+ if (double_max1(0., 1.) != 1.) abort();
+ if (double_max1(1., 0.) != 1.) abort();
+ if (double_max1(-1., 1.) != 1.) abort();
+ if (double_max1(1., -1.) != 1.) abort();
+
+ if (double_min2(0., -1.) != -1.) abort();
+ if (double_min2(-1., 0.) != -1.) abort();
+ if (double_min2(0., 1.) != 0.) abort();
+ if (double_min2(1., 0.) != 0.) abort();
+ if (double_min2(-1., 1.) != -1.) abort();
+ if (double_min2(1., -1.) != -1.) abort();
+
+ if (double_max2(0., -1.) != 0.) abort();
+ if (double_max2(-1., 0.) != 0.) abort();
+ if (double_max2(0., 1.) != 1.) abort();
+ if (double_max2(1., 0.) != 1.) abort();
+ if (double_max2(-1., 1.) != 1.) abort();
+ if (double_max2(1., -1.) != 1.) abort();
+
+ exit(0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr39501.x b/gcc/testsuite/gcc.c-torture/execute/pr39501.x
new file mode 100644
index 00000000000..72527d7b4e9
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr39501.x
@@ -0,0 +1,2 @@
+set additional_flags "-ffast-math"
+return 0