1/* { dg-do run } */
2/* { dg-options "-O2 -mavx512f" } */
3/* { dg-require-effective-target avx512f } */
4
5#include "avx512f-check.h"
6
7static __m512d
8__attribute__ ((noinline))
9foo (double x, int i)
10{
11  switch (i)
12    {
13    case 7:
14      return _mm512_set_pd (x, 1, 1, 1, 1, 1, 1, 1);
15    case 6:
16      return _mm512_set_pd (1, x, 1, 1, 1, 1, 1, 1);
17    case 5:
18      return _mm512_set_pd (1, 1, x, 1, 1, 1, 1, 1);
19    case 4:
20      return _mm512_set_pd (1, 1, 1, x, 1, 1, 1, 1);
21    case 3:
22      return _mm512_set_pd (1, 1, 1, 1, x, 1, 1, 1);
23    case 2:
24      return _mm512_set_pd (1, 1, 1, 1, 1, x, 1, 1);
25    case 1:
26      return _mm512_set_pd (1, 1, 1, 1, 1, 1, x, 1);
27    case 0:
28      return _mm512_set_pd (1, 1, 1, 1, 1, 1, 1, x);
29    default:
30      abort ();
31    }
32}
33
34static __m512d
35__attribute__ ((noinline))
36foo_r (double x, int i)
37{
38  switch (i)
39    {
40    case 0:
41      return _mm512_setr_pd (x, 1, 1, 1, 1, 1, 1, 1);
42    case 1:
43      return _mm512_setr_pd (1, x, 1, 1, 1, 1, 1, 1);
44    case 2:
45      return _mm512_setr_pd (1, 1, x, 1, 1, 1, 1, 1);
46    case 3:
47      return _mm512_setr_pd (1, 1, 1, x, 1, 1, 1, 1);
48    case 4:
49      return _mm512_setr_pd (1, 1, 1, 1, x, 1, 1, 1);
50    case 5:
51      return _mm512_setr_pd (1, 1, 1, 1, 1, x, 1, 1);
52    case 6:
53      return _mm512_setr_pd (1, 1, 1, 1, 1, 1, x, 1);
54    case 7:
55      return _mm512_setr_pd (1, 1, 1, 1, 1, 1, 1, x);
56    default:
57      abort ();
58    }
59}
60
61static void
62avx512f_test (void)
63{
64  double e = -3.234;
65  double v[8];
66  union512d res;
67  int i, j;
68
69  for (i = 0; i < 8; i++)
70    {
71      for (j = 0; j < 8; j++)
72	v[j] = 1;
73      v[i] = e;
74
75      res.x = foo (e, i);
76
77      if (check_union512d (res, v))
78	abort ();
79
80      res.x = _mm512_setzero_pd ();
81
82      res.x = foo_r (e, i);
83
84      if (check_union512d (res, v))
85	abort ();
86    }
87}
88