138cd7de5STim Shen //===----------------------------------------------------------------------===//
238cd7de5STim 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
638cd7de5STim Shen //
738cd7de5STim Shen //===----------------------------------------------------------------------===//
838cd7de5STim Shen
9*31cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
1038cd7de5STim Shen
1138cd7de5STim Shen // <experimental/simd>
1238cd7de5STim Shen //
1338cd7de5STim Shen // [simd.class]
1438cd7de5STim Shen // template <class U, class Flags> simd(const U* mem, Flags f);
1538cd7de5STim Shen
1638cd7de5STim Shen #include <experimental/simd>
17a0686015SDavid Zarzycki #include <cstdint>
18a0686015SDavid Zarzycki #include <cassert>
1938cd7de5STim Shen
2038cd7de5STim Shen #include "test_macros.h"
2138cd7de5STim Shen
2238cd7de5STim Shen namespace ex = std::experimental::parallelism_v2;
2338cd7de5STim Shen
2438cd7de5STim Shen template <class T, class... Args>
2538cd7de5STim Shen auto not_supported_native_simd_ctor(Args&&... args)
2638cd7de5STim Shen -> decltype(ex::native_simd<T>(std::forward<Args>(args)...),
2738cd7de5STim Shen void()) = delete;
2838cd7de5STim Shen
2938cd7de5STim Shen template <class T>
not_supported_native_simd_ctor(...)3038cd7de5STim Shen void not_supported_native_simd_ctor(...) {}
3138cd7de5STim Shen
3238cd7de5STim Shen template <class T, class... Args>
supported_native_simd_ctor(Args &&...args)3338cd7de5STim Shen auto supported_native_simd_ctor(Args&&... args)
3438cd7de5STim Shen -> decltype(ex::native_simd<T>(std::forward<Args>(args)...), void()) {}
3538cd7de5STim Shen
3638cd7de5STim Shen template <class T>
3738cd7de5STim Shen void supported_native_simd_ctor(...) = delete;
3838cd7de5STim Shen
compile_load_ctor()3938cd7de5STim Shen void compile_load_ctor() {
4038cd7de5STim Shen supported_native_simd_ctor<int>((int*)nullptr, ex::element_aligned_tag());
4138cd7de5STim Shen supported_native_simd_ctor<uint32_t>((int*)nullptr,
4238cd7de5STim Shen ex::element_aligned_tag());
4338cd7de5STim Shen supported_native_simd_ctor<double>((float*)nullptr,
4438cd7de5STim Shen ex::element_aligned_tag());
4538cd7de5STim Shen supported_native_simd_ctor<uint16_t>((unsigned int*)nullptr,
4638cd7de5STim Shen ex::element_aligned_tag());
4738cd7de5STim Shen supported_native_simd_ctor<uint32_t>((float*)nullptr,
4838cd7de5STim Shen ex::element_aligned_tag());
4938cd7de5STim Shen
5038cd7de5STim Shen not_supported_native_simd_ctor<int>((int*)nullptr, int());
5138cd7de5STim Shen }
5238cd7de5STim Shen
5338cd7de5STim Shen template <typename SimdType>
test_load_ctor()5438cd7de5STim Shen void test_load_ctor() {
5538cd7de5STim Shen alignas(32) int32_t buffer[] = {4, 3, 2, 1};
5638cd7de5STim Shen {
5738cd7de5STim Shen SimdType a(buffer, ex::element_aligned_tag());
5838cd7de5STim Shen assert(a[0] == 4);
5938cd7de5STim Shen assert(a[1] == 3);
6038cd7de5STim Shen assert(a[2] == 2);
6138cd7de5STim Shen assert(a[3] == 1);
6238cd7de5STim Shen }
6338cd7de5STim Shen {
6438cd7de5STim Shen SimdType a(buffer, ex::vector_aligned_tag());
6538cd7de5STim Shen assert(a[0] == 4);
6638cd7de5STim Shen assert(a[1] == 3);
6738cd7de5STim Shen assert(a[2] == 2);
6838cd7de5STim Shen assert(a[3] == 1);
6938cd7de5STim Shen }
7038cd7de5STim Shen {
7138cd7de5STim Shen SimdType a(buffer, ex::overaligned_tag<32>());
7238cd7de5STim Shen assert(a[0] == 4);
7338cd7de5STim Shen assert(a[1] == 3);
7438cd7de5STim Shen assert(a[2] == 2);
7538cd7de5STim Shen assert(a[3] == 1);
7638cd7de5STim Shen }
7738cd7de5STim Shen
7838cd7de5STim Shen {
7938cd7de5STim Shen SimdType a(buffer, ex::element_aligned);
8038cd7de5STim Shen assert(a[0] == 4);
8138cd7de5STim Shen assert(a[1] == 3);
8238cd7de5STim Shen assert(a[2] == 2);
8338cd7de5STim Shen assert(a[3] == 1);
8438cd7de5STim Shen }
8538cd7de5STim Shen {
8638cd7de5STim Shen SimdType a(buffer, ex::vector_aligned);
8738cd7de5STim Shen assert(a[0] == 4);
8838cd7de5STim Shen assert(a[1] == 3);
8938cd7de5STim Shen assert(a[2] == 2);
9038cd7de5STim Shen assert(a[3] == 1);
9138cd7de5STim Shen }
9238cd7de5STim Shen {
9338cd7de5STim Shen SimdType a(buffer, ex::overaligned<32>);
9438cd7de5STim Shen assert(a[0] == 4);
9538cd7de5STim Shen assert(a[1] == 3);
9638cd7de5STim Shen assert(a[2] == 2);
9738cd7de5STim Shen assert(a[3] == 1);
9838cd7de5STim Shen }
9938cd7de5STim Shen }
10038cd7de5STim Shen
10138cd7de5STim Shen template <typename SimdType>
test_converting_load_ctor()10238cd7de5STim Shen void test_converting_load_ctor() {
10338cd7de5STim Shen float buffer[] = {1., 2., 4., 8.};
10438cd7de5STim Shen SimdType a(buffer, ex::element_aligned_tag());
10538cd7de5STim Shen assert(a[0] == 1);
10638cd7de5STim Shen assert(a[1] == 2);
10738cd7de5STim Shen assert(a[2] == 4);
10838cd7de5STim Shen assert(a[3] == 8);
10938cd7de5STim Shen }
11038cd7de5STim Shen
main(int,char **)1112df59c50SJF Bastien int main(int, char**) {
11238cd7de5STim Shen // TODO: adjust the tests when this assertion fails.
11338cd7de5STim Shen assert(ex::native_simd<int32_t>::size() >= 4);
11438cd7de5STim Shen test_load_ctor<ex::native_simd<int32_t>>();
11538cd7de5STim Shen test_load_ctor<ex::fixed_size_simd<int32_t, 4>>();
11638cd7de5STim Shen test_converting_load_ctor<ex::native_simd<int32_t>>();
11738cd7de5STim Shen test_converting_load_ctor<ex::fixed_size_simd<int32_t, 4>>();
1182df59c50SJF Bastien
1192df59c50SJF Bastien return 0;
12038cd7de5STim Shen }
121