(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
s390/
vector/
perm-merge.c
       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  
      16  #define GEN_MERGE_2(VEC_TYPE, HILO, A)			\
      17    VEC_TYPE __attribute__((noinline))			\
      18    merge_##HILO##_##VEC_TYPE(VEC_TYPE a, VEC_TYPE b) {	\
      19      return (VEC_TYPE){ a[0+A], b[0+A] }; }
      20  
      21  #define GEN_MERGE_4(VEC_TYPE, HILO, A)				\
      22    VEC_TYPE __attribute__((noinline))				\
      23    merge_##HILO##_##VEC_TYPE(VEC_TYPE a, VEC_TYPE b) {		\
      24      return (VEC_TYPE){ a[0+A], b[0+A], a[1+A], b[1+A] }; }
      25  
      26  #define GEN_MERGE_8(VEC_TYPE, HILO, A)					\
      27    VEC_TYPE __attribute__((noinline))					\
      28    merge_##HILO##_##VEC_TYPE(VEC_TYPE a, VEC_TYPE b) {			\
      29      return (VEC_TYPE){ a[0+A], b[0+A], a[1+A], b[1+A], a[2+A], b[2+A], a[3+A], b[3+A] }; }
      30  
      31  #define GEN_MERGE_16(VEC_TYPE, HILO, A)					\
      32    VEC_TYPE __attribute__((noinline))					\
      33    merge_##HILO##_##VEC_TYPE(VEC_TYPE a, VEC_TYPE b) {			\
      34      return (VEC_TYPE){ a[0+A], b[0+A], a[1+A], b[1+A], a[2+A], b[2+A], a[3+A], b[3+A], \
      35        a[4+A], b[4+A], a[5+A], b[5+A], a[6+A], b[6+A], a[7+A], b[7+A]}; }
      36  
      37  
      38  GEN_MERGE_16(v16qi, l, 8)
      39  GEN_MERGE_16(v16qi, h, 0)
      40  GEN_MERGE_16(uv16qi, l, 8)
      41  GEN_MERGE_16(uv16qi, h, 0)
      42  
      43  GEN_MERGE_8(v8hi, l, 4)
      44  GEN_MERGE_8(v8hi, h, 0)
      45  GEN_MERGE_8(uv8hi, l, 4)
      46  GEN_MERGE_8(uv8hi, h, 0)
      47  
      48  GEN_MERGE_4(v4si, l, 2)
      49  GEN_MERGE_4(v4si, h, 0)
      50  GEN_MERGE_4(uv4si, l, 2)
      51  GEN_MERGE_4(uv4si, h, 0)
      52  
      53  GEN_MERGE_4(v4sf, l, 2)
      54  GEN_MERGE_4(v4sf, h, 0)
      55  
      56  GEN_MERGE_2(v2di, l, 1)
      57  GEN_MERGE_2(v2di, h, 0)
      58  GEN_MERGE_2(uv2di, l, 1)
      59  GEN_MERGE_2(uv2di, h, 0)
      60  
      61  GEN_MERGE_2(v2df, l, 1)
      62  GEN_MERGE_2(v2df, h, 0)
      63  
      64  
      65  #define CHECK_MERGE_LO(VEC_TYPE, SRC1, SRC2)		\
      66    {							\
      67      VEC_TYPE v = merge_l_##VEC_TYPE ((SRC1), (SRC2));	\
      68      int elts = sizeof(v) / sizeof(v[0]);		\
      69      for (int i = 0; i < elts; i++)			\
      70        if (v[i] != (i + elts) / 2 + (i % 2) * elts)	\
      71  	__builtin_abort();				\
      72    }
      73  
      74  #define CHECK_MERGE_HI(VEC_TYPE, SRC1, SRC2)		\
      75    {							\
      76      VEC_TYPE v = merge_h_##VEC_TYPE ((SRC1), (SRC2));	\
      77      int elts = sizeof(v) / sizeof(v[0]);		\
      78      for (int i = 0; i < elts; i++)			\
      79        if (v[i] != i / 2 + (i % 2) * elts)		\
      80  	__builtin_abort();				\
      81    }
      82  
      83  #define CHECK_MERGE(VEC_TYPE)						\
      84    {									\
      85      VEC_TYPE a = GEN_SEQ_VEC (VEC_TYPE, 0);				\
      86      VEC_TYPE b = GEN_SEQ_VEC (VEC_TYPE, sizeof(VEC_TYPE) / sizeof(a[0])); \
      87      CHECK_MERGE_LO (VEC_TYPE, a, b);					\
      88      CHECK_MERGE_HI (VEC_TYPE, a, b);					\
      89    }
      90  
      91  int
      92  main ()
      93  {
      94    CHECK_MERGE(v16qi);
      95    CHECK_MERGE(uv16qi);
      96    CHECK_MERGE(v8hi);
      97    CHECK_MERGE(uv8hi);
      98    CHECK_MERGE(v4si);
      99    CHECK_MERGE(uv4si);
     100    CHECK_MERGE(v4sf);
     101    CHECK_MERGE(v2di);
     102    CHECK_MERGE(uv2di);
     103    CHECK_MERGE(v2df);
     104  }