mips.md (sqrt_condition): Tweak comment.
authorRichard Sandiford <rsandifo@nildram.co.uk>
Fri, 4 Jan 2008 10:26:41 +0000 (10:26 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 4 Jan 2008 10:26:41 +0000 (10:26 +0000)
gcc/
* config/mips/mips.md (sqrt_condition): Tweak comment.
(recip_condition): Likewise.  Require TARGET_FLOAT64 for DFmode.

gcc/testsuite/
* gcc.target/mips/rsqrt-1.c: Require -mgp64.
* gcc.target/mips/rsqrt-2.c: Likewise.
* gcc.target/mips/rsqrt-4.c: New test.

From-SVN: r131318

gcc/ChangeLog
gcc/config/mips/mips.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/mips/rsqrt-1.c
gcc/testsuite/gcc.target/mips/rsqrt-2.c
gcc/testsuite/gcc.target/mips/rsqrt-4.c [new file with mode: 0644]

index 8a7ae19..6dd3f15 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-04  Richard Sandiford  <rsandifo@nildram.co.uk>
+
+       * config/mips/mips.md (sqrt_condition): Tweak comment.
+       (recip_condition): Likewise.  Require TARGET_FLOAT64 for DFmode.
+
 2008-01-03  Tom Tromey  <tromey@redhat.com>
 
        PR c/34457:
index b32ed33..864013a 100644 (file)
   [DF (SF "!TARGET_FIX_SB1 || flag_unsafe_math_optimizations")
    (V2SF "TARGET_SB1 && (!TARGET_FIX_SB1 || flag_unsafe_math_optimizations)")])
 
-; This attribute gives the condition for which sqrt instructions exist.
+;; This attribute gives the conditions under which SQRT.fmt instructions
+;; can be used.
 (define_mode_attr sqrt_condition
   [(SF "!ISA_MIPS1") (DF "!ISA_MIPS1") (V2SF "TARGET_SB1")])
 
-; This attribute gives the condition for which recip and rsqrt instructions
-; exist.
+;; This attribute gives the conditions under which RECIP.fmt and RSQRT.fmt
+;; instructions can be used.  The MIPS32 and MIPS64 ISAs say that RECIP.D
+;; and RSQRT.D are unpredictable when doubles are stored in pairs of FPRs,
+;; so for safety's sake, we apply this restriction to all targets.
 (define_mode_attr recip_condition
-  [(SF "ISA_HAS_FP4") (DF "ISA_HAS_FP4") (V2SF "TARGET_SB1")])
+  [(SF "ISA_HAS_FP4")
+   (DF "ISA_HAS_FP4 && TARGET_FLOAT64")
+   (V2SF "TARGET_SB1")])
 
 ;; This code iterator allows all branch instructions to be generated from
 ;; a single define_expand template.
index dd64236..c027dba 100644 (file)
@@ -1,3 +1,9 @@
+2008-01-04  Richard Sandiford  <rsandifo@nildram.co.uk>
+
+       * gcc.target/mips/rsqrt-1.c: Require -mgp64.
+       * gcc.target/mips/rsqrt-2.c: Likewise.
+       * gcc.target/mips/rsqrt-4.c: New test.
+
 2008-01-04  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/34557
index 885deef..4cc6212 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-mips-options "-O2 -ffast-math -mips4 -mhard-float" } */
+/* { dg-mips-options "-O2 -ffast-math -mips4 -mhard-float -mgp64" } */
 /* { dg-final { scan-assembler "rsqrt.d" } } */
 /* { dg-final { scan-assembler "rsqrt.s" } } */
 
index d3e7aa3..03a0013 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-mips-options "-O2 -ffast-math -mips4 -mhard-float" } */
+/* { dg-mips-options "-O2 -ffast-math -mips4 -mhard-float -mgp64" } */
 /* { dg-final { scan-assembler "rsqrt.d" } } */
 /* { dg-final { scan-assembler "rsqrt.s" } } */
 
diff --git a/gcc/testsuite/gcc.target/mips/rsqrt-4.c b/gcc/testsuite/gcc.target/mips/rsqrt-4.c
new file mode 100644 (file)
index 0000000..7f7da64
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-mips-options "-O2 -ffast-math -mips64 -mhard-float -mgp32" } */
+/* { dg-final { scan-assembler-not "\trsqrt.d\t" } } */
+/* { dg-final { scan-assembler-times "\trsqrt.s\t" 2 } } */
+
+extern double sqrt(double);
+extern float sqrtf(float);
+
+NOMIPS16 double f1 (double x)
+{
+  return 1.0 / sqrt (x);
+}
+
+NOMIPS16 double f2 (double x)
+{
+  return sqrt (1.0 / x);
+}
+
+NOMIPS16 float f3 (float x)
+{
+  return 1.0f / sqrtf (x);
+}
+
+NOMIPS16 float f4 (float x)
+{
+  return sqrtf (1.0f / x);
+}