• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // UNSUPPORTED: c++98, c++03, c++11, c++14
11 
12 // See GCC PR63723.
13 // UNSUPPORTED: gcc-4.9
14 
15 // <experimental/simd>
16 //
17 // [simd.class]
18 // template <class U> simd(U&& value);
19 
20 #include <cstdint>
21 #include <experimental/simd>
22 
23 namespace ex = std::experimental::parallelism_v2;
24 
25 template <class T, class... Args>
26 auto not_supported_native_simd_ctor(Args&&... args)
27     -> decltype(ex::native_simd<T>(std::forward<Args>(args)...),
28                 void()) = delete;
29 
30 template <class T>
not_supported_native_simd_ctor(...)31 void not_supported_native_simd_ctor(...) {}
32 
33 template <class T, class... Args>
supported_native_simd_ctor(Args &&...args)34 auto supported_native_simd_ctor(Args&&... args)
35     -> decltype(ex::native_simd<T>(std::forward<Args>(args)...), void()) {}
36 
37 template <class T>
38 void supported_native_simd_ctor(...) = delete;
39 
compile_narrowing_conversion()40 void compile_narrowing_conversion() {
41   supported_native_simd_ctor<int8_t>(3);
42   supported_native_simd_ctor<int16_t>(3);
43   supported_native_simd_ctor<int32_t>(3);
44   supported_native_simd_ctor<int64_t>(3);
45   supported_native_simd_ctor<uint8_t>(3);
46   supported_native_simd_ctor<uint16_t>(3);
47   supported_native_simd_ctor<uint32_t>(3);
48   supported_native_simd_ctor<uint64_t>(3);
49   supported_native_simd_ctor<float>(3.f);
50   supported_native_simd_ctor<double>(3.);
51   supported_native_simd_ctor<long double>(3.);
52 
53   not_supported_native_simd_ctor<float>(3.);
54   not_supported_native_simd_ctor<int8_t>(long(3));
55   not_supported_native_simd_ctor<float>(long(3));
56   not_supported_native_simd_ctor<int>(3.);
57 }
58 
compile_convertible()59 void compile_convertible() {
60   struct ConvertibleToInt {
61     operator int64_t() const;
62   };
63   supported_native_simd_ctor<int64_t>(ConvertibleToInt());
64 
65   struct NotConvertibleToInt {};
66   not_supported_native_simd_ctor<int64_t>(NotConvertibleToInt());
67 }
68 
compile_unsigned()69 void compile_unsigned() {
70   not_supported_native_simd_ctor<int>(3u);
71   supported_native_simd_ctor<uint16_t>(3u);
72 }
73 
74 template <typename SimdType>
test_broadcast()75 void test_broadcast() {
76   SimdType a(3);
77   for (size_t i = 0; i < a.size(); i++) {
78     assert(a[i] == 3);
79   }
80 }
81 
main()82 int main() {
83   test_broadcast<ex::native_simd<int>>();
84   test_broadcast<ex::fixed_size_simd<int, 4>>();
85   test_broadcast<ex::fixed_size_simd<int, 15>>();
86 }
87