diff options
-rw-r--r-- | gcc/ChangeLog.linaro | 9 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 12 |
2 files changed, 19 insertions, 2 deletions
diff --git a/gcc/ChangeLog.linaro b/gcc/ChangeLog.linaro index aea713c0794..5dcdbb7eb49 100644 --- a/gcc/ChangeLog.linaro +++ b/gcc/ChangeLog.linaro @@ -1,3 +1,12 @@ +2013-07-19 Matthew Gretton-Dann <matthew.gretton-dann@linaro.org> + + Backport from trunk r201005. + 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-05 Christophe Lyon <christophe.lyon@linaro.org> GCC Linaro 4.8-2013.07 released. diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 997e9154dab..4659e6f39a5 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -11965,8 +11965,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) |