1403c667bSTim Shen //===----------------------------------------------------------------------===//
2403c667bSTim Shen //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6403c667bSTim Shen //
7403c667bSTim Shen //===----------------------------------------------------------------------===//
8403c667bSTim Shen 
9*31cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
10403c667bSTim Shen 
11403c667bSTim Shen // <experimental/simd>
12403c667bSTim Shen //
13403c667bSTim Shen // [simd.traits]
1438cd7de5STim Shen // template <class T> struct ex::is_simd;
1538cd7de5STim Shen // template <class T> inline constexpr bool ex::is_simd_v =
1638cd7de5STim Shen // ex::is_simd<T>::value;
17403c667bSTim Shen 
18403c667bSTim Shen #include <cstdint>
19403c667bSTim Shen #include <experimental/simd>
20403c667bSTim Shen #include "test_macros.h"
21403c667bSTim Shen 
2238cd7de5STim Shen namespace ex = std::experimental::parallelism_v2;
23403c667bSTim Shen 
24403c667bSTim Shen struct UserType {};
25403c667bSTim Shen 
2638cd7de5STim Shen static_assert(ex::is_simd<ex::native_simd<int8_t>>::value, "");
2738cd7de5STim Shen static_assert(ex::is_simd<ex::native_simd<int16_t>>::value, "");
2838cd7de5STim Shen static_assert(ex::is_simd<ex::native_simd<int32_t>>::value, "");
2938cd7de5STim Shen static_assert(ex::is_simd<ex::native_simd<int64_t>>::value, "");
3038cd7de5STim Shen static_assert(ex::is_simd<ex::native_simd<uint8_t>>::value, "");
3138cd7de5STim Shen static_assert(ex::is_simd<ex::native_simd<uint16_t>>::value, "");
3238cd7de5STim Shen static_assert(ex::is_simd<ex::native_simd<uint32_t>>::value, "");
3338cd7de5STim Shen static_assert(ex::is_simd<ex::native_simd<uint64_t>>::value, "");
3438cd7de5STim Shen static_assert(ex::is_simd<ex::native_simd<float>>::value, "");
3538cd7de5STim Shen static_assert(ex::is_simd<ex::native_simd<double>>::value, "");
36403c667bSTim Shen 
3738cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<int8_t, 1>>::value, "");
3838cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<int16_t, 1>>::value, "");
3938cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<int32_t, 1>>::value, "");
4038cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<int64_t, 1>>::value, "");
4138cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<uint8_t, 1>>::value, "");
4238cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<uint16_t, 1>>::value, "");
4338cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<uint32_t, 1>>::value, "");
4438cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<uint64_t, 1>>::value, "");
4538cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<float, 1>>::value, "");
4638cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<double, 1>>::value, "");
47403c667bSTim Shen 
4838cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<int8_t, 3>>::value, "");
4938cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<int16_t, 3>>::value, "");
5038cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<int32_t, 3>>::value, "");
5138cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<int64_t, 3>>::value, "");
5238cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<uint8_t, 3>>::value, "");
5338cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<uint16_t, 3>>::value, "");
5438cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<uint32_t, 3>>::value, "");
5538cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<uint64_t, 3>>::value, "");
5638cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<float, 3>>::value, "");
5738cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<double, 3>>::value, "");
58403c667bSTim Shen 
5938cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<int8_t, 32>>::value, "");
6038cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<int16_t, 32>>::value, "");
6138cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<int32_t, 32>>::value, "");
6238cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<int64_t, 32>>::value, "");
6338cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<uint8_t, 32>>::value, "");
6438cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<uint16_t, 32>>::value, "");
6538cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<uint32_t, 32>>::value, "");
6638cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<uint64_t, 32>>::value, "");
6738cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<float, 32>>::value, "");
6838cd7de5STim Shen static_assert(ex::is_simd<ex::fixed_size_simd<double, 32>>::value, "");
69403c667bSTim Shen 
7038cd7de5STim Shen static_assert(!ex::is_simd<void>::value, "");
7138cd7de5STim Shen static_assert(!ex::is_simd<int>::value, "");
7238cd7de5STim Shen static_assert(!ex::is_simd<float>::value, "");
7338cd7de5STim Shen static_assert(!ex::is_simd<ex::simd_mask<int>>::value, "");
7438cd7de5STim Shen static_assert(!ex::is_simd<ex::simd_mask<float>>::value, "");
7538cd7de5STim Shen static_assert(!ex::is_simd<UserType>::value, "");
76403c667bSTim Shen 
7738cd7de5STim Shen static_assert(ex::is_simd_v<ex::native_simd<int8_t>>, "");
7838cd7de5STim Shen static_assert(ex::is_simd_v<ex::native_simd<int16_t>>, "");
7938cd7de5STim Shen static_assert(ex::is_simd_v<ex::native_simd<int32_t>>, "");
8038cd7de5STim Shen static_assert(ex::is_simd_v<ex::native_simd<int64_t>>, "");
8138cd7de5STim Shen static_assert(ex::is_simd_v<ex::native_simd<uint8_t>>, "");
8238cd7de5STim Shen static_assert(ex::is_simd_v<ex::native_simd<uint16_t>>, "");
8338cd7de5STim Shen static_assert(ex::is_simd_v<ex::native_simd<uint32_t>>, "");
8438cd7de5STim Shen static_assert(ex::is_simd_v<ex::native_simd<uint64_t>>, "");
8538cd7de5STim Shen static_assert(ex::is_simd_v<ex::native_simd<float>>, "");
8638cd7de5STim Shen static_assert(ex::is_simd_v<ex::native_simd<double>>, "");
87403c667bSTim Shen 
8838cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<int8_t, 1>>, "");
8938cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<int16_t, 1>>, "");
9038cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<int32_t, 1>>, "");
9138cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<int64_t, 1>>, "");
9238cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<uint8_t, 1>>, "");
9338cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<uint16_t, 1>>, "");
9438cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<uint32_t, 1>>, "");
9538cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<uint64_t, 1>>, "");
9638cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<float, 1>>, "");
9738cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<double, 1>>, "");
98403c667bSTim Shen 
9938cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<int8_t, 3>>, "");
10038cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<int16_t, 3>>, "");
10138cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<int32_t, 3>>, "");
10238cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<int64_t, 3>>, "");
10338cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<uint8_t, 3>>, "");
10438cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<uint16_t, 3>>, "");
10538cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<uint32_t, 3>>, "");
10638cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<uint64_t, 3>>, "");
10738cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<float, 3>>, "");
10838cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<double, 3>>, "");
109403c667bSTim Shen 
11038cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<int8_t, 32>>, "");
11138cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<int16_t, 32>>, "");
11238cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<int32_t, 32>>, "");
11338cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<int64_t, 32>>, "");
11438cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<uint8_t, 32>>, "");
11538cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<uint16_t, 32>>, "");
11638cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<uint32_t, 32>>, "");
11738cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<uint64_t, 32>>, "");
11838cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<float, 32>>, "");
11938cd7de5STim Shen static_assert(ex::is_simd_v<ex::fixed_size_simd<double, 32>>, "");
120403c667bSTim Shen 
12138cd7de5STim Shen static_assert(!ex::is_simd_v<void>, "");
12238cd7de5STim Shen static_assert(!ex::is_simd_v<int>, "");
12338cd7de5STim Shen static_assert(!ex::is_simd_v<float>, "");
12438cd7de5STim Shen static_assert(!ex::is_simd_v<ex::simd_mask<int>>, "");
12538cd7de5STim Shen static_assert(!ex::is_simd_v<ex::simd_mask<float>>, "");
12638cd7de5STim Shen static_assert(!ex::is_simd_v<UserType>, "");
127403c667bSTim Shen 
main(int,char **)1282df59c50SJF Bastien int main(int, char**) {
1292df59c50SJF Bastien   return 0;
1302df59c50SJF Bastien }
131