1  /* Check vector shift patterns.  */
       2  
       3  /* { dg-options "-march=z13 -O1 -m64" } */
       4  
       5  /* { dg-final { scan-assembler "veslb\t%v.+,%v.+,2.%r2" } } */
       6  /* { dg-final { scan-assembler "veslh\t%v.+,%v.+,3.%r2" } } */
       7  /* { dg-final { scan-assembler "veslf\t%v.+,%v.+,4.%r2" } } */
       8  /* { dg-final { scan-assembler "veslg\t%v.+,%v.+,5.%r2" } } */
       9  /* { dg-final { scan-assembler "vesrab\t%v.+,%v.+,2.%r2" } } */
      10  /* { dg-final { scan-assembler "vesrah\t%v.+,%v.+,3.%r2" } } */
      11  /* { dg-final { scan-assembler "vesraf\t%v.+,%v.+,4.%r2" } } */
      12  /* { dg-final { scan-assembler "vesrag\t%v.+,%v.+,5.%r2" } } */
      13  /* { dg-final { scan-assembler "vesrlb\t%v.+,%v.+,2.%r2" } } */
      14  /* { dg-final { scan-assembler "vesrlh\t%v.+,%v.+,3.%r2" } } */
      15  /* { dg-final { scan-assembler "vesrlf\t%v.+,%v.+,4.%r2" } } */
      16  /* { dg-final { scan-assembler "vesrlg\t%v.+,%v.+,5.%r2" } } */
      17  /* { dg-final { scan-assembler-not "ahi" } } */
      18  /* { dg-final { scan-assembler-not "nilf" } } */
      19  /* { dg-final { scan-assembler-not "risbg" } } */
      20  
      21  typedef __attribute__((vector_size(16))) signed char v16qi;
      22  
      23  v16qi vshiftlqi (v16qi in, unsigned int sh)
      24  {
      25    sh = (sh + 2) % 8;
      26    return (in << sh);
      27  }
      28  
      29  typedef __attribute__((vector_size(16))) signed short v8hi;
      30  
      31  v8hi vshiftlhi (v8hi in, unsigned int sh)
      32  {
      33    sh = (sh + 3) % 16;
      34    return (in << sh);
      35  }
      36  
      37  typedef __attribute__((vector_size(16))) signed int v4si;
      38  
      39  v4si vshiftlsi (v4si in, unsigned int sh)
      40  {
      41    sh = (sh + 4) % 32;
      42    return (in << sh);
      43  }
      44  
      45  typedef __attribute__((vector_size(16))) signed long v2di;
      46  
      47  v2di vshiftldi (v2di in, unsigned int sh)
      48  {
      49    sh = (sh + 5) % 64;
      50    return (in << sh);
      51  }
      52  
      53  typedef __attribute__((vector_size(16))) unsigned char uv16qi;
      54  
      55  uv16qi vshiftrqiu (uv16qi in, unsigned int sh)
      56  {
      57    sh = (sh + 2) % 8;
      58    return (in >> sh);
      59  }
      60  
      61  typedef __attribute__((vector_size(16))) unsigned short uv8hi;
      62  
      63  uv8hi vshiftrhiu (uv8hi in, unsigned int sh)
      64  {
      65    sh = (sh + 3) % 16;
      66    return (in >> sh);
      67  }
      68  
      69  typedef __attribute__((vector_size(16))) unsigned int uv4si;
      70  
      71  uv4si vshiftrsiu (uv4si in, unsigned int sh)
      72  {
      73    sh = (sh + 4) % 32;
      74    return (in >> sh);
      75  }
      76  
      77  typedef __attribute__((vector_size(16))) unsigned long uv2di;
      78  
      79  uv2di vshiftrdiu (uv2di in, unsigned int sh)
      80  {
      81    sh = (sh + 5) % 64;
      82    return (in >> sh);
      83  }
      84  
      85  v16qi vshiftrqi (v16qi in, unsigned int sh)
      86  {
      87    sh = (sh + 2) % 8;
      88    return (in >> sh);
      89  }
      90  
      91  v8hi vshiftrhi (v8hi in, unsigned int sh)
      92  {
      93    sh = (sh + 3) % 16;
      94    return (in >> sh);
      95  }
      96  
      97  v4si vshiftrsi (v4si in, unsigned int sh)
      98  {
      99    sh = (sh + 4) % 32;
     100    return (in >> sh);
     101  }
     102  
     103  v2di vshiftrdi (v2di in, unsigned int sh)
     104  {
     105    sh = (sh + 5) % 64;
     106    return (in >> sh);
     107  }