(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
avx512f-vpclmulqdq-2.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O2 -mavx512f -mvpclmulqdq" } */
       3  /* { dg-require-effective-target avx512f } */
       4  /* { dg-require-effective-target vpclmulqdq } */
       5  
       6  #define AVX512F
       7  
       8  #define VPCLMULQDQ
       9  #include "avx512f-helper.h"
      10  
      11  #define SIZE (AVX512F_LEN / 64)
      12  
      13  #include "avx512f-mask-type.h"
      14  
      15  static void
      16  CALC (unsigned long long *r, unsigned long long *s1, unsigned long long *s2, unsigned char imm)
      17  {
      18    for (int len = 0; len < SIZE/2; len++)
      19    {
      20      unsigned long long src1, src2;
      21      src1 = (imm & 1) ? s1[len*2 + 1] : s1[len*2];
      22      src2 = ((imm >> 4) & 1) ? s2[len*2 + 1] : s2[len*2];
      23      for (int i = 0; i < 64; i++)
      24        {
      25          if ((src1 >> i) & 1)
      26            {
      27              if (i)
      28                r[len*2 + 1] ^= src2 >> (64 - i);
      29              r[len*2] ^= src2 << i;
      30            }
      31        }
      32    }
      33  }
      34  
      35  void
      36  TEST (void)
      37  {
      38    int i;
      39    UNION_TYPE (AVX512F_LEN, i_q) res, src1, src2;
      40    unsigned long long res_ref[SIZE];
      41    unsigned char imm = 1;  
      42  
      43    for (i = 0; i < SIZE; i++)
      44      {
      45        src1.a[i] = 0xFFFFFFFFF + i;
      46        src2.a[i] = 0xFFFFFFFFF + i*i;
      47      }
      48  
      49    for (i = 0; i < SIZE; i++)
      50      {
      51        res.a[i] = 0;
      52        res_ref[i] = 0;
      53      }
      54  
      55    CALC (res_ref, src1.a, src2.a, imm);
      56    res.x = INTRINSIC (_clmulepi64_epi128) (src1.x, src2.x, imm);
      57  
      58    if (UNION_CHECK (AVX512F_LEN, i_q) (res, res_ref))
      59      abort ();
      60  }