1  /* { dg-do compile } */
       2  /* { dg-options "-O3 -mzarch -march=z14 -mzvector --save-temps" } */
       3  /* { dg-do run { target { s390_z14_hw } } } */
       4  
       5  /* { dg-final { scan-assembler-times "\tvmrhb\t" 2 } } */
       6  /* { dg-final { scan-assembler-times "\tvmrlb\t" 2 } } */
       7  /* { dg-final { scan-assembler-times "\tvmrhh\t" 2 } } */
       8  /* { dg-final { scan-assembler-times "\tvmrlh\t" 2 } } */
       9  /* { dg-final { scan-assembler-times "\tvmrhf\t" 3 } } */
      10  /* { dg-final { scan-assembler-times "\tvmrlf\t" 3 } } */
      11  /* { dg-final { scan-assembler-times "\tvmrhg\t" 3 } } */
      12  /* { dg-final { scan-assembler-times "\tvmrlg\t" 3 } } */
      13  
      14  #include "vec-types.h"
      15  #include <vecintrin.h>
      16  
      17  #define GEN_MERGE(VEC_TYPE, HILO)					\
      18    VEC_TYPE __attribute__((noinline))					\
      19    merge_##HILO##_##VEC_TYPE(VEC_TYPE a, VEC_TYPE b) {			\
      20      return vec_merge##HILO (a, b); }
      21  
      22  GEN_MERGE(v16qi, l)
      23  GEN_MERGE(v16qi, h)
      24  GEN_MERGE(uv16qi, l)
      25  GEN_MERGE(uv16qi, h)
      26  
      27  GEN_MERGE(v8hi, l)
      28  GEN_MERGE(v8hi, h)
      29  GEN_MERGE(uv8hi, l)
      30  GEN_MERGE(uv8hi, h)
      31  
      32  GEN_MERGE(v4si, l)
      33  GEN_MERGE(v4si, h)
      34  GEN_MERGE(uv4si, l)
      35  GEN_MERGE(uv4si, h)
      36  
      37  GEN_MERGE(v4sf, l)
      38  GEN_MERGE(v4sf, h)
      39  
      40  GEN_MERGE(v2di, l)
      41  GEN_MERGE(v2di, h)
      42  GEN_MERGE(uv2di, l)
      43  GEN_MERGE(uv2di, h)
      44  
      45  GEN_MERGE(v2df, l)
      46  GEN_MERGE(v2df, h)
      47  
      48  
      49  #define CHECK_MERGE_LO(VEC_TYPE, SRC1, SRC2)				\
      50    {									\
      51      VEC_TYPE v = merge_l_##VEC_TYPE ((SRC1), (SRC2));			\
      52      int elts = sizeof(v) / sizeof(v[0]);				\
      53      for (int i = 0; i < elts; i++)					\
      54        if (v[i] != (i + elts) / 2 + (i % 2) * elts)			\
      55  	__builtin_abort();						\
      56    }
      57  
      58  #define CHECK_MERGE_HI(VEC_TYPE, SRC1, SRC2)				\
      59    {									\
      60      VEC_TYPE v = merge_h_##VEC_TYPE ((SRC1), (SRC2));			\
      61      int elts = sizeof(v) / sizeof(v[0]);				\
      62      for (int i = 0; i < elts; i++)					\
      63        if (v[i] != i / 2 + (i % 2) * elts)				\
      64  	__builtin_abort();						\
      65    }
      66  
      67  #define CHECK_MERGE(VEC_TYPE)						\
      68    {									\
      69      VEC_TYPE a = GEN_SEQ_VEC (VEC_TYPE, 0);				\
      70      VEC_TYPE b = GEN_SEQ_VEC (VEC_TYPE, sizeof(VEC_TYPE) / sizeof(a[0])); \
      71      CHECK_MERGE_LO (VEC_TYPE, a, b);					\
      72      CHECK_MERGE_HI (VEC_TYPE, a, b);					\
      73    }
      74  
      75  int
      76  main ()
      77  {
      78    CHECK_MERGE(v16qi);
      79    CHECK_MERGE(uv16qi);
      80    CHECK_MERGE(v8hi);
      81    CHECK_MERGE(uv8hi);
      82    CHECK_MERGE(v4si);
      83    CHECK_MERGE(uv4si);
      84    CHECK_MERGE(v4sf);
      85    CHECK_MERGE(v2di);
      86    CHECK_MERGE(uv2di);
      87    CHECK_MERGE(v2df);
      88  }