]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/30634 (FAIL: gfortran.fortran-torture/execute/intrinsic_set_exponent...
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>
Sat, 10 Feb 2007 19:51:40 +0000 (19:51 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Sat, 10 Feb 2007 19:51:40 +0000 (19:51 +0000)
PR target/30634
* pa.md (movdf): For 64-bit target, fail if operand 1 is a non-zero
CONST_DOUBLE and operand 0 is a hard register.
(movdi): For 64-bit target, remove code to force CONST_DOUBLE to
memory.  Fail if operand 1 is a non-zero CONST_INT and operand 0
is a hard floating-point register.

From-SVN: r121802

gcc/ChangeLog
gcc/config/pa/pa.md

index 22d12f55f10d85ec80e0d1a4df15d518c6acc55a..9912fd8a0f6ab36d3a4556d5147c2608a9926588 100644 (file)
@@ -1,3 +1,12 @@
+2007-02-10  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       PR target/30634
+       * pa.md (movdf): For 64-bit target, fail if operand 1 is a non-zero
+       CONST_DOUBLE and operand 0 is a hard register.
+       (movdi): For 64-bit target, remove code to force CONST_DOUBLE to
+       memory.  Fail if operand 1 is a non-zero CONST_INT and operand 0
+       is a hard floating-point register.
+
 2007-02-10  Richard Henderson  <rth@redhat.com>, Jakub Jelinek  <jakub@redhat.com>, Alexandre Oliva  <aoliva@redhat.com>
 
        * Makefile.in (libgcc-support, libgcc.mvars): Add emutls.c.
index 0adfe3f78fe312d2d43e88ce64272ce299547b1e..61dbb46992e7f1aab09c847ecc042c041ca576ce 100644 (file)
   ""
   "
 {
-  if (GET_CODE (operands[1]) == CONST_DOUBLE && TARGET_64BIT)
-    operands[1] = force_const_mem (DFmode, operands[1]);
+  if (TARGET_64BIT
+      && GET_CODE (operands[1]) == CONST_DOUBLE
+      && operands[1] != CONST0_RTX (DFmode))
+    {
+      /* We rely on reload to legitimize the insn generated after
+        we force the CONST_DOUBLE to memory.  This doesn't happen
+        if OPERANDS[0] is a hard register.  */
+      if (REG_P (operands[0]) && HARD_REGISTER_P (operands[0]))
+       FAIL;
+
+      operands[1] = force_const_mem (DFmode, operands[1]);
+    }
 
   if (emit_move_sequence (operands, DFmode, 0))
     DONE;
   ""
   "
 {
-  if (GET_CODE (operands[1]) == CONST_DOUBLE && TARGET_64BIT)
-    operands[1] = force_const_mem (DImode, operands[1]);
+  /* Except for zero, we don't support loading a CONST_INT directly
+     to a hard floating-point register since a scratch register is
+     needed for the operation.  While the operation could be handled
+     before no_new_pseudos is true, the simplest solution is to fail.  */
+  if (TARGET_64BIT
+      && GET_CODE (operands[1]) == CONST_INT
+      && operands[1] != CONST0_RTX (DImode)
+      && REG_P (operands[0])
+      && HARD_REGISTER_P (operands[0])
+      && REGNO (operands[0]) >= 32)
+    FAIL;
 
   if (emit_move_sequence (operands, DImode, 0))
     DONE;