diff options
author | Yvan Roux <yvan.roux@linaro.org> | 2013-07-17 11:39:14 +0000 |
---|---|---|
committer | Ramana Radhakrishnan <ramana@gcc.gnu.org> | 2013-07-17 11:39:14 +0000 |
commit | a1259a13026fb572411d29b13318264e2d087346 (patch) | |
tree | b53cfcb26122ca0dbeb5d2dae7864c4e1ddf55d9 | |
parent | 167f68ede42b2bb0bf287769951c5a6aca3e7281 (diff) | |
download | gcc-a1259a13026fb572411d29b13318264e2d087346.zip gcc-a1259a13026fb572411d29b13318264e2d087346.tar.gz gcc-a1259a13026fb572411d29b13318264e2d087346.tar.bz2 |
re PR target/57909 ([ARM] ICE with internal memcpy and -mno-unaligned-access)
Fix PR target/57909.
2013-07-17 Yvan Roux <yvan.roux@linaro.org>
PR target/57909
* config/arm/arm.c (gen_movmem_ldrd_strd): Fix unaligned load/store
usage in HI mode.
From-SVN: r201005
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 12 |
2 files changed, 16 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 60c176d..58d44ff 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-07-17 Yvan Roux <yvan.roux@linaro.org> + + PR target/57909 + * config/arm/arm.c (gen_movmem_ldrd_strd): Fix unaligned load/store + usage in HI mode. + 2013-07-17 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> * config/s390/s390.c: (s390_expand_builtin): Allow -mhtm to be diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index e6fd420..35096e8 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -12018,8 +12018,16 @@ gen_movmem_ldrd_strd (rtx *operands) dst = adjust_address (dst, HImode, 0); src = adjust_address (src, HImode, 0); reg0 = gen_reg_rtx (SImode); - emit_insn (gen_unaligned_loadhiu (reg0, src)); - emit_insn (gen_unaligned_storehi (dst, gen_lowpart (HImode, reg0))); + if (src_aligned) + emit_insn (gen_zero_extendhisi2 (reg0, src)); + else + emit_insn (gen_unaligned_loadhiu (reg0, src)); + + if (dst_aligned) + emit_insn (gen_movhi (dst, gen_lowpart(HImode, reg0))); + else + emit_insn (gen_unaligned_storehi (dst, gen_lowpart (HImode, reg0))); + src = next_consecutive_mem (src); dst = next_consecutive_mem (dst); if (len == 2) |