Index: simplify-rtx.c
===================================================================
--- simplify-rtx.c	(revision 193127)
+++ simplify-rtx.c	(working copy)
@@ -5884,20 +5884,35 @@ simplify_subreg (enum machine_mode outer
   if (SCALAR_INT_MODE_P (outermode)
       && SCALAR_INT_MODE_P (innermode)
       && GET_MODE_PRECISION (outermode) < GET_MODE_PRECISION (innermode)
       && byte == subreg_lowpart_offset (outermode, innermode))
     {
       rtx tem = simplify_truncation (outermode, op, innermode);
       if (tem)
 	return tem;
     }
 
+  if (VECTOR_MODE_P (innermode)
+      && GET_MODE_INNER (innermode) == (VECTOR_MODE_P (outermode)
+					? GET_MODE_INNER (outermode)
+					: outermode))
+    {
+      unsigned elem_size = GET_MODE_SIZE (GET_MODE_INNER (innermode));
+      unsigned n = GET_MODE_SIZE (outermode) / elem_size;
+      unsigned start = byte / elem_size;
+      rtvec vec = rtvec_alloc (n);
+      for (unsigned i = 0; i < n; i++)
+	RTVEC_ELT (vec, i) = GEN_INT (start + i);
+      return simplify_gen_binary (VEC_SELECT, outermode, op,
+				  gen_rtx_PARALLEL (VOIDmode, vec));
+    }
+
   return NULL_RTX;
 }
 
 /* Make a SUBREG operation or equivalent if it folds.  */
 
 rtx
 simplify_gen_subreg (enum machine_mode outermode, rtx op,
 		     enum machine_mode innermode, unsigned int byte)
 {
   rtx newx;
