(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
avx2-i32gatherd-4.c
       1  /* { dg-do run } */
       2  /* { dg-require-effective-target avx2 } */
       3  /* { dg-options "-O2 -mavx2" } */
       4  
       5  #include <string.h>
       6  #include "avx2-check.h"
       7  
       8  static void
       9  compute_i32gatherd (int *src, int *s1, int *s2, int *mask, int scale, int *r)
      10  {
      11    int i;
      12  
      13    for (i = 0; i < 4; ++i)
      14      if ((mask[i] >> 31) & 1)
      15        r[i] = *(int *) (((unsigned char *) s1) + s2[i] * scale);
      16      else
      17        r[i] = src[i];
      18  }
      19  
      20  void static
      21  avx2_test (void)
      22  {
      23    int i;
      24    union128i_d idx;
      25    union128i_d res, src, mask;
      26    int s1[4], res_ref[4] = { 0 };
      27  
      28    for (i = 0; i < 4; ++i)
      29      {
      30        /* Set some stuff */
      31        s1[i] = 1973 * (i + 1) * (i + 2);
      32  
      33        /* Set src as something different from s1 */
      34        src.a[i] = -s1[i];
      35  
      36        /* Mask out evens */
      37        ((int *) mask.a)[i] = i % 2 ? 0 : -1;
      38  
      39        /* About to gather in reverse order,
      40           divide by 2 to demonstrate scale */
      41        idx.a[i] = (16 - (i + 1) * 4) >> 1;
      42      }
      43  
      44    res.x = _mm_mask_i32gather_epi32 (src.x, s1, idx.x, mask.x, 2);
      45  
      46    compute_i32gatherd (src.a, s1, idx.a, mask.a, 2, res_ref);
      47  
      48    if (check_union128i_d (res, res_ref) != 0)
      49      abort ();
      50  }