111
|
1 // PR middle-end/70887
|
|
2 // { dg-do compile { target { { i?86-*-* x86_64-*-* } && c++11 } } }
|
|
3 // { dg-options "-O2 -msse2" }
|
|
4
|
|
5 #include <x86intrin.h>
|
|
6
|
|
7 enum R { S };
|
|
8 template <R> struct C { static constexpr int value = 10; };
|
|
9 template <typename R, template <R> class T, R... r>
|
|
10 struct A {
|
|
11 template <int, R...> struct B;
|
|
12 template <int N, R M, R... O>
|
|
13 struct B<N, M, O...> {
|
|
14 static constexpr int d = T<M>::value;
|
|
15 static __m128i generate()
|
|
16 {
|
|
17 __attribute__((__vector_size__(16))) long long
|
|
18 a = generate(),
|
|
19 b = _mm_bslli_si128 (a, 1),
|
|
20 c = _mm_bsrli_si128 (_mm_set1_epi32(d), 12);
|
|
21 return _mm_or_si128 (b, c);
|
|
22 }
|
|
23 };
|
|
24 A () { B<0, r...>::generate(); }
|
|
25 };
|
|
26
|
|
27 int
|
|
28 main () {
|
|
29 using RI = A<R, C, S>;
|
|
30 RI ri;
|
|
31 }
|