1  /* { dg-do run } */
       2  /* { dg-options "-O2 -mavx512bw" } */
       3  /* { dg-require-effective-target avx512bw } */
       4  
       5  #define AVX512BW
       6  #include "avx512f-helper.h"
       7  
       8  #define SIZE (AVX512F_LEN / 16)
       9  #include "avx512f-mask-type.h"
      10  
      11  #include <string.h>
      12  
      13  #define N 0x5
      14  
      15  void
      16  CALC (short *s1, short *r)
      17  {
      18    int i;
      19  
      20    memset (r, 0, SIZE);
      21  
      22    if (N < 16)
      23      for (i = 0; i < SIZE; ++i)
      24        r[i] = s1[i] >> N;
      25  }
      26  
      27  void
      28  TEST (void)
      29  {
      30    UNION_TYPE (AVX512F_LEN, i_w) s1, res1, res2, res3;
      31    MASK_TYPE mask = MASK_VALUE;
      32    union128i_q s2;
      33    short res_ref[SIZE];
      34    int i, sign;
      35  
      36    for (i = 0; i < SIZE; i++)
      37      {
      38        s1.a[i] = i * sign;
      39        sign = -sign;
      40        res2.a[i] = DEFAULT_VALUE;
      41      }
      42  
      43    res1.x = INTRINSIC (_srai_epi16) (s1.x, N);
      44    res2.x = INTRINSIC (_mask_srai_epi16) (res2.x, mask, s1.x, N);
      45    res3.x = INTRINSIC (_maskz_srai_epi16) (mask, s1.x, N);
      46  
      47    CALC (s1.a, res_ref);
      48  
      49    if (UNION_CHECK (AVX512F_LEN, i_w) (res1, res_ref))
      50      abort ();
      51  
      52    MASK_MERGE (i_w) (res_ref, mask, SIZE);
      53    if (UNION_CHECK (AVX512F_LEN, i_w) (res2, res_ref))
      54      abort ();
      55  
      56    MASK_ZERO (i_w) (res_ref, mask, SIZE);
      57    if (UNION_CHECK (AVX512F_LEN, i_w) (res3, res_ref))
      58      abort ();
      59  }