rs6000.c (rs6000_expand_vector_init): Fix endianness when selecting field to splat.
authorBill Schmidt <wschmidt@vnet.linux.ibm.com>
Mon, 22 Jul 2013 23:08:44 +0000 (23:08 +0000)
committerWilliam Schmidt <wschmidt@gcc.gnu.org>
Mon, 22 Jul 2013 23:08:44 +0000 (23:08 +0000)
2013-07-22  Bill Schmidt  <wschmidt@vnet.linux.ibm.com>
    Anton Blanchard <anton@au1.ibm.com>

* config/rs6000/rs6000.c (rs6000_expand_vector_init): Fix
endianness when selecting field to splat.

Co-Authored-By: Anton Blanchard <anton@au1.ibm.com>
From-SVN: r201149

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 8613ff5d0252a662143a73a7f8555662f2ddaf95..d63ff2759de326cbe37c7105301b18084e6f4b21 100644 (file)
@@ -1,3 +1,9 @@
+2013-07-22  Bill Schmidt  <wschmidt@vnet.linux.ibm.com>
+           Anton Blanchard <anton@au1.ibm.com>
+
+       * config/rs6000/rs6000.c (rs6000_expand_vector_init): Fix
+       endianness when selecting field to splat.
+
 2013-07-22  Eric Christopher  <echristo@gmail.com>
 
        * dwarf2out.c (die_odr_checksum): New function to use
index 04c759485f65480c5e52326fe4fbfb3359093a39..646eedcc79d0568ef955047a941ca12ae49c97b7 100644 (file)
@@ -5177,6 +5177,7 @@ rs6000_expand_vector_init (rtx target, rtx vals)
      of 64-bit items is not supported on Altivec.  */
   if (all_same && GET_MODE_SIZE (inner_mode) <= 4)
     {
+      rtx field;
       mem = assign_stack_temp (mode, GET_MODE_SIZE (inner_mode));
       emit_move_insn (adjust_address_nv (mem, inner_mode, 0),
                      XVECEXP (vals, 0, 0));
@@ -5187,9 +5188,11 @@ rs6000_expand_vector_init (rtx target, rtx vals)
                                              gen_rtx_SET (VOIDmode,
                                                           target, mem),
                                              x)));
+      field = (BYTES_BIG_ENDIAN ? const0_rtx
+              : GEN_INT (GET_MODE_NUNITS (mode) - 1));
       x = gen_rtx_VEC_SELECT (inner_mode, target,
                              gen_rtx_PARALLEL (VOIDmode,
-                                               gen_rtvec (1, const0_rtx)));
+                                               gen_rtvec (1, field)));
       emit_insn (gen_rtx_SET (VOIDmode, target,
                              gen_rtx_VEC_DUPLICATE (mode, x)));
       return;