aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>1999-03-02 16:42:59 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>1999-03-02 16:42:59 +0000
commit0aa692fc03e59a5794e4386d7a9e87ec085704a1 (patch)
tree0e4d660fb4bb3bfff571922c818be5d2aa55cf32
parent4ed9f2126ddc0f9095b464d3f5b27401da11b5fb (diff)
downloadgcc-0aa692fc03e59a5794e4386d7a9e87ec085704a1.zip
gcc-0aa692fc03e59a5794e4386d7a9e87ec085704a1.tar.gz
gcc-0aa692fc03e59a5794e4386d7a9e87ec085704a1.tar.bz2
sh.c (force_into): New function.
* sh.c (force_into): New function. (expand_block_move): Use it. From-SVN: r25540
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/sh/sh.c28
2 files changed, 25 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c50fc72..03315c6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+Wed Mar 3 00:00:37 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * sh.c (force_into): New function.
+ (expand_block_move): Use it.
+
Tue Mar 2 10:39:43 1999 Nick Clifton <nickc@cygnus.com>
* cccp.c (struct default_include): Add 'included' field.
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 6ddf439..180cce2 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -305,6 +305,18 @@ print_operand (stream, x, code)
}
}
+static void force_into PROTO ((rtx, rtx));
+
+/* Like force_operand, but guarantees that VALUE ends up in TARGET. */
+static void
+force_into (value, target)
+ rtx value, target;
+{
+ value = force_operand (value, target);
+ if (! rtx_equal_p (value, target))
+ emit_insn (gen_move_insn (target, value));
+}
+
/* Emit code to perform a block move. Choose the best method.
OPERANDS[0] is the destination.
@@ -342,8 +354,8 @@ expand_block_move (operands)
= copy_to_mode_reg (Pmode,
gen_rtx_SYMBOL_REF (Pmode,
IDENTIFIER_POINTER (entry_name)));
- emit_insn (gen_move_insn (r4, XEXP (operands[0], 0)));
- emit_insn (gen_move_insn (r5, XEXP (operands[1], 0)));
+ force_into (XEXP (operands[0], 0), r4);
+ force_into (XEXP (operands[1], 0), r5);
emit_insn (gen_block_move_real_i4 (func_addr_rtx));
return 1;
}
@@ -363,8 +375,8 @@ expand_block_move (operands)
= copy_to_mode_reg (Pmode,
gen_rtx_SYMBOL_REF (Pmode,
IDENTIFIER_POINTER (entry_name)));
- emit_insn (gen_move_insn (r4, XEXP (operands[0], 0)));
- emit_insn (gen_move_insn (r5, XEXP (operands[1], 0)));
+ force_into (XEXP (operands[0], 0), r4);
+ force_into (XEXP (operands[1], 0), r5);
dwords = bytes >> 3;
emit_insn (gen_move_insn (r6, GEN_INT (dwords - 1)));
@@ -389,8 +401,8 @@ expand_block_move (operands)
= copy_to_mode_reg (Pmode,
gen_rtx (SYMBOL_REF, Pmode,
IDENTIFIER_POINTER (entry_name)));
- emit_insn (gen_move_insn (r4, XEXP (operands[0], 0)));
- emit_insn (gen_move_insn (r5, XEXP (operands[1], 0)));
+ force_into (XEXP (operands[0], 0), r4);
+ force_into (XEXP (operands[1], 0), r5);
emit_insn (gen_block_move_real (func_addr_rtx));
return 1;
}
@@ -411,8 +423,8 @@ expand_block_move (operands)
= copy_to_mode_reg (Pmode,
gen_rtx (SYMBOL_REF, Pmode,
IDENTIFIER_POINTER (entry_name)));
- emit_insn (gen_move_insn (r4, XEXP (operands[0], 0)));
- emit_insn (gen_move_insn (r5, XEXP (operands[1], 0)));
+ force_into (XEXP (operands[0], 0), r4);
+ force_into (XEXP (operands[1], 0), r5);
/* r6 controls the size of the move. 16 is decremented from it
for each 64 bytes moved. Then the negative bit left over is used