From: Ramana Radhakrishnan Date: Wed, 1 Jul 2015 08:01:57 +0000 (+0000) Subject: Fix PR target/63408 on the 4.9 branch. X-Git-Tag: releases/gcc-4.9.4~726 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2828ac4c91f238ebc417ad68746a67e7c9a4f8be;p=thirdparty%2Fgcc.git Fix PR target/63408 on the 4.9 branch. 2015-07-01 Ramana Radhakrishnan Backport from mainline 2015-06-24 Ramana Radhakrishnan PR target/63408 * config/arm/arm.c (vfp3_const_double_for_fract_bits): Disable for negative numbers. 2015-07-01 Ramana Radhakrishnan Backport from mainline 2015-06-24 Ramana Radhakrishnan PR target/63408 * gcc.target/arm/pr63408.c: New test. From-SVN: r225226 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2b921c5b1601..7d1bc628bb2d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2015-07-01 Ramana Radhakrishnan + + Backport from mainline + 2015-06-24 Ramana Radhakrishnan + + PR target/63408 + * config/arm/arm.c (vfp3_const_double_for_fract_bits): Disable + for negative numbers. + 2015-06-30 Eric Botcazou * config/sparc/leon.md (leon_load): Enable for all LEON variants if diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 4fea1a62f775..4a284eca5c63 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -29812,7 +29812,8 @@ vfp3_const_double_for_fract_bits (rtx operand) return 0; REAL_VALUE_FROM_CONST_DOUBLE (r0, operand); - if (exact_real_inverse (DFmode, &r0)) + if (exact_real_inverse (DFmode, &r0) + && !REAL_VALUE_NEGATIVE (r0)) { if (exact_real_truncate (DFmode, &r0)) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 641bd1f62058..2348e0c941b0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2015-07-01 Ramana Radhakrishnan + + Backport from mainline + 2015-06-24 Ramana Radhakrishnan + + PR target/63408 + * gcc.target/arm/pr63408.c: New test. + 2015-06-27 Uros Bizjak PR target/66412 diff --git a/gcc/testsuite/gcc.target/arm/pr63408.c b/gcc/testsuite/gcc.target/arm/pr63408.c new file mode 100644 index 000000000000..850596bd1803 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr63408.c @@ -0,0 +1,23 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ +void abort (void) __attribute__ ((noreturn)); +float __attribute__((noinline)) +f(float a, int b) +{ + return a - (((float)b / 0x7fffffff) * 100); +} + +int +main (void) +{ + float a[] = { 100.0, 0.0, 0.0}; + int b[] = { 0x7fffffff, 0x7fffffff/100.0f, -0x7fffffff / 100.0f}; + float c[] = { 0.0, -1.0, 1.0 }; + int i; + + for (i = 0; i < (sizeof(a) / sizeof (float)); i++) + if (f (a[i], b[i]) != c[i]) + abort (); + + return 0; +}