(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
s390/
vector/
perm-vpdi.c
       1  /* { dg-do run { target { s390*-*-* } } } */
       2  /* { dg-options "-O3 -mzarch -march=z14 -mzvector --save-temps" } */
       3  
       4  /* { dg-final { scan-assembler-times "\tvmrhg\t" 3 } } */
       5  /* { dg-final { scan-assembler-times "\tvmrlg\t" 3 } } */
       6  /* { dg-final { scan-assembler-times "\tvpdi\t" 6 } } */
       7  
       8  #include "vec-types.h"
       9  #include <vecintrin.h>
      10  
      11  #define GEN_PERMI_BITS(VEC_TYPE, BITS)				\
      12    VEC_TYPE __attribute__((noinline))				\
      13    permi_##BITS##_##VEC_TYPE(VEC_TYPE a, VEC_TYPE b) {		\
      14      return (VEC_TYPE){a[((BITS) & 2) >> 1], b[(BITS) & 1] }; }
      15  
      16  #define GEN_PERMI(VEC_TYPE)			\
      17    GEN_PERMI_BITS(VEC_TYPE, 0);			\
      18    GEN_PERMI_BITS(VEC_TYPE, 1);			\
      19    GEN_PERMI_BITS(VEC_TYPE, 2);			\
      20    GEN_PERMI_BITS(VEC_TYPE, 3);			\
      21  
      22  GEN_PERMI(v2di)
      23  GEN_PERMI(uv2di)
      24  GEN_PERMI(v2df)
      25  
      26  
      27  #define CHECK_PERMI_BITS(VEC_TYPE, BITS)		\
      28    VEC_TYPE r##BITS = permi_##BITS##_##VEC_TYPE (a, b);	\
      29    if (r##BITS[0] != ((BITS) & 2) >> 1			\
      30        || r##BITS[1] != ((BITS) & 1) + 2)		\
      31      __builtin_abort();
      32  
      33  #define CHECK_PERMI(VEC_TYPE)			\
      34    {						\
      35      VEC_TYPE a = GEN_SEQ_VEC (VEC_TYPE, 0);	\
      36      VEC_TYPE b = GEN_SEQ_VEC (VEC_TYPE, 2);	\
      37      CHECK_PERMI_BITS (VEC_TYPE, 0);		\
      38      CHECK_PERMI_BITS (VEC_TYPE, 1);		\
      39      CHECK_PERMI_BITS (VEC_TYPE, 2);		\
      40      CHECK_PERMI_BITS (VEC_TYPE, 3);		\
      41    }
      42  
      43  int
      44  main ()
      45  {
      46    CHECK_PERMI (v2di);
      47    CHECK_PERMI (uv2di);
      48    CHECK_PERMI (v2df);
      49  }