* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131318
138bc75d-0d04-0410-961f-
82ee72b054a4
+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:
[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.
+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
/* { 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" } } */
/* { 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" } } */
--- /dev/null
+/* { 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);
+}