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