aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/pa
diff options
context:
space:
mode:
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>2007-02-10 19:51:40 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2007-02-10 19:51:40 +0000
commit51823d478c136900b5877fed42e8c62811f0a415 (patch)
tree46daa20a7c7abb9d49eeb1a699fa8aea75de6be2 /gcc/config/pa
parent2ccef0dd3a0e2242f05d3726169f2d368187842f (diff)
downloadgcc-51823d478c136900b5877fed42e8c62811f0a415.zip
gcc-51823d478c136900b5877fed42e8c62811f0a415.tar.gz
gcc-51823d478c136900b5877fed42e8c62811f0a415.tar.bz2
re PR target/30634 (FAIL: gfortran.fortran-torture/execute/intrinsic_set_exponent.f90)
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
Diffstat (limited to 'gcc/config/pa')
-rw-r--r--gcc/config/pa/pa.md27
1 files changed, 23 insertions, 4 deletions
diff --git a/gcc/config/pa/pa.md b/gcc/config/pa/pa.md
index 0adfe3f..61dbb46 100644
--- a/gcc/config/pa/pa.md
+++ b/gcc/config/pa/pa.md
@@ -4098,8 +4098,18 @@
""
"
{
- 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;
@@ -4358,8 +4368,17 @@
""
"
{
- 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;