re PR target/57909 ([ARM] ICE with internal memcpy and -mno-unaligned-access)
authorYvan Roux <yvan.roux@linaro.org>
Wed, 17 Jul 2013 11:39:14 +0000 (11:39 +0000)
committerRamana Radhakrishnan <ramana@gcc.gnu.org>
Wed, 17 Jul 2013 11:39:14 +0000 (11:39 +0000)
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

gcc/ChangeLog
gcc/config/arm/arm.c

index 60c176da0a9f5f9f443a466aab5105c9064dd21c..58d44ff2ff3257e1ba1c98842717f8921911de71 100644 (file)
@@ -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
index e6fd42079cbe42c32d8c4712276865c8e08be8ee..35096e83b201cb76de12219929bc325994f11469 100644 (file)
@@ -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)