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
CALC(unsigned long long * r,unsigned long long * s1,unsigned long long * s2,unsigned char imm)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
TEST(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 }
61