1 /* { dg-do run } */
2 /* { dg-options "-O2 -mavx512f" } */
3 /* { dg-require-effective-target avx512f } */
4 
5 #define AVX512F
6 
7 #include "avx512f-helper.h"
8 
9 #define SIZE (AVX512F_LEN / 32)
10 #include "avx512f-mask-type.h"
11 
12 static void
CALC(int * src1,int * src2,int * src3,int imm,int * r)13 CALC (int *src1, int *src2, int *src3, int imm, int *r)
14 {
15   int i, j, index, res, mask, one_mask = 1;
16   int src1_bit, src2_bit, src3_bit, imm_bit;
17 
18   for (i = 0; i < SIZE; i++)
19     {
20       res = 0;
21       for (j = 0; j < 32; j++)
22 	{
23 	  mask = one_mask << j;
24 	  src1_bit = ((src1[i] & mask) >> j) << 2;
25 	  src2_bit = ((src2[i] & mask) >> j) << 1;
26 	  src3_bit = ((src3[i] & mask) >> j);
27 	  index = src1_bit | src2_bit | src3_bit;
28 	  imm_bit = (imm & (one_mask << index)) >> index;
29 	  res = res | (imm_bit << j);
30 	}
31       r[i] = res;
32     }
33 }
34 
35 void
TEST(void)36 TEST (void)
37 {
38   UNION_TYPE (AVX512F_LEN, i_d) src2, src3, res1, res2, res3;
39   MASK_TYPE mask = MASK_VALUE;
40   int res_ref[SIZE];
41   int i, imm = 0x7D;
42 
43   for (i = 0; i < SIZE; i++)
44     {
45       res1.a[i] = DEFAULT_VALUE;
46       res2.a[i] = DEFAULT_VALUE;
47       res3.a[i] = DEFAULT_VALUE;
48       src2.a[i] = 145132 * i + 123123;
49       src3.a[i] = 1223 * i + 895;
50     }
51 
52   CALC (res1.a, src2.a, src3.a, imm, res_ref);
53 
54   res1.x = INTRINSIC (_ternarylogic_epi32) (res1.x, src2.x, src3.x,
55     imm);
56   res2.x = INTRINSIC (_mask_ternarylogic_epi32) (res2.x, mask, src2.x,
57     src3.x, imm);
58   res3.x = INTRINSIC (_maskz_ternarylogic_epi32) (mask, res3.x, src2.x,
59     src3.x, imm);
60 
61   if (UNION_CHECK (AVX512F_LEN, i_d) (res1, res_ref))
62     abort ();
63 
64   MASK_MERGE (i_d) (res_ref, mask, SIZE);
65   if (UNION_CHECK (AVX512F_LEN, i_d) (res2, res_ref))
66     abort ();
67 
68   MASK_ZERO (i_d) (res_ref, mask, SIZE);
69   if (UNION_CHECK (AVX512F_LEN, i_d) (res3, res_ref))
70     abort ();
71 }
72