aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJeff Law <law@gcc.gnu.org>1997-02-19 18:14:34 -0700
committerJeff Law <law@gcc.gnu.org>1997-02-19 18:14:34 -0700
commitd66dec28ec8f045774cc765f1c3bcf8a469db1b2 (patch)
treeed1dd591e35d700502476317ccdb2c28e6557610 /gcc
parentdd56b31fe93cd6e0ad09621b6eef91c7d8925671 (diff)
downloadgcc-d66dec28ec8f045774cc765f1c3bcf8a469db1b2.zip
gcc-d66dec28ec8f045774cc765f1c3bcf8a469db1b2.tar.gz
gcc-d66dec28ec8f045774cc765f1c3bcf8a469db1b2.tar.bz2
pa.c (emit_move_sequence): Don't copy 0.0 (double precision) directly to memory...
* pa/pa.c (emit_move_sequence): Don't copy 0.0 (double precision) directly to memory, go through a reg if reload hasn't started. * pa/pa.md (main movdf pattern): Don't allow 0.0 (double precision) to be copied directly to memory. From-SVN: r13669
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/pa/pa.c9
-rw-r--r--gcc/config/pa/pa.md2
2 files changed, 11 insertions, 0 deletions
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index 3ed113b..221166f 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -1192,6 +1192,15 @@ emit_move_sequence (operands, mode, scratch_reg)
}
else if (GET_CODE (operand0) == MEM)
{
+ if (mode == DFmode && operand1 == CONST0_RTX (mode)
+ && !(reload_in_progress || reload_completed))
+ {
+ rtx temp = gen_reg_rtx (DFmode);
+
+ emit_insn (gen_rtx (SET, VOIDmode, temp, operand1));
+ emit_insn (gen_rtx (SET, VOIDmode, operand0, temp));
+ return 1;
+ }
if (register_operand (operand1, mode) || operand1 == CONST0_RTX (mode))
{
/* Run this case quickly. */
diff --git a/gcc/config/pa/pa.md b/gcc/config/pa/pa.md
index 774e33e..6748d53 100644
--- a/gcc/config/pa/pa.md
+++ b/gcc/config/pa/pa.md
@@ -2237,6 +2237,8 @@
"fG,*rG,f,*r,*r,RQ,o,Q"))]
"(register_operand (operands[0], DFmode)
|| reg_or_0_operand (operands[1], DFmode))
+ && ! (GET_CODE (operands[1]) == CONST_DOUBLE
+ && GET_CODE (operands[0]) == MEM)
&& ! TARGET_SOFT_FLOAT"
"*
{