aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYvan Roux <yvan.roux@linaro.org>2013-07-17 11:39:14 +0000
committerRamana Radhakrishnan <ramana@gcc.gnu.org>2013-07-17 11:39:14 +0000
commita1259a13026fb572411d29b13318264e2d087346 (patch)
treeb53cfcb26122ca0dbeb5d2dae7864c4e1ddf55d9
parent167f68ede42b2bb0bf287769951c5a6aca3e7281 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/config/arm/arm.c12
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)