summaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorkkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>2006-10-23 00:14:39 +0000
committerkkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4>2006-10-23 00:14:39 +0000
commit23b81129b3f5bffc2d8ee4849cc7cde15939a15d (patch)
treec618fdc7bea64f3e2e7057e7f1864d919624b92e /gcc/config
parentfecf3b391a1fe03fa6295de0afe5ace3e995763c (diff)
downloadgcc-23b81129b3f5bffc2d8ee4849cc7cde15939a15d.tar.gz
PR target/28232
* config/sh/sh.c (expand_block_move): Use a BLKmode rather than SImode memory reference for the source of a movua. * config/sh/sh.md (UNSPEC_MOVUA): New macro. (movua): Use an unspec instead of sign_extract. Expect the source to have mode BLKmode. (extv, insv): Use a BLKmode rather than SImode memory reference for the source of a movua. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@117961 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/sh/sh.c4
-rw-r--r--gcc/config/sh/sh.md15
2 files changed, 12 insertions, 7 deletions
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 15eae4c7cd7..65b2daa129e 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -1074,8 +1074,10 @@ expand_block_move (rtx *operands)
while (copied + 4 <= bytes)
{
rtx to = adjust_address (dest, SImode, copied);
- rtx from = adjust_automodify_address (src, SImode, src_addr, copied);
+ rtx from = adjust_automodify_address (src, BLKmode,
+ src_addr, copied);
+ set_mem_size (from, GEN_INT (4));
emit_insn (gen_movua (temp, from));
emit_move_insn (src_addr, plus_constant (src_addr, 4));
emit_move_insn (to, temp);
diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md
index 9522af7c862..ca112ef8dd0 100644
--- a/gcc/config/sh/sh.md
+++ b/gcc/config/sh/sh.md
@@ -153,6 +153,7 @@
(UNSPEC_THUNK 36)
(UNSPEC_SP_SET 40)
(UNSPEC_SP_TEST 41)
+ (UNSPEC_MOVUA 42)
;; These are used with unspec_volatile.
(UNSPECV_BLOCKAGE 0)
@@ -11147,8 +11148,8 @@ mov.l\\t1f,r0\\n\\
(define_insn "movua"
[(set (match_operand:SI 0 "register_operand" "=z")
- (sign_extract:SI (match_operand:SI 1 "unaligned_load_operand" "Sua>")
- (const_int 32) (const_int 0)))]
+ (unspec:SI [(match_operand:BLK 1 "unaligned_load_operand" "Sua>")]
+ UNSPEC_MOVUA))]
"TARGET_SH4A_ARCH"
"movua.l %1,%0"
[(set_attr "type" "movua")])
@@ -11181,8 +11182,9 @@ mov.l\\t1f,r0\\n\\
&& INTVAL (operands[3]) == -24 * (BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN)
&& GET_CODE (operands[1]) == MEM && MEM_ALIGN (operands[1]) < 32)
{
- emit_insn (gen_movua (operands[0],
- adjust_address (operands[1], SImode, 0)));
+ rtx src = adjust_address (operands[1], BLKmode, 0);
+ set_mem_size (src, GEN_INT (4));
+ emit_insn (gen_movua (operands[0], src));
DONE;
}
@@ -11201,8 +11203,9 @@ mov.l\\t1f,r0\\n\\
&& INTVAL (operands[3]) == -24 * (BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN)
&& GET_CODE (operands[1]) == MEM && MEM_ALIGN (operands[1]) < 32)
{
- emit_insn (gen_movua (operands[0],
- adjust_address (operands[1], SImode, 0)));
+ rtx src = adjust_address (operands[1], BLKmode, 0);
+ set_mem_size (src, GEN_INT (4));
+ emit_insn (gen_movua (operands[0], src));
DONE;
}