//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++03, c++11, c++14

// <experimental/simd>
//
// [simd.class]
// template <class U, class Flags> simd(const U* mem, Flags f);

#include <experimental/simd>
#include <cstdint>
#include <cassert>

#include "test_macros.h"

namespace ex = std::experimental::parallelism_v2;

template <class T, class... Args>
auto not_supported_native_simd_ctor(Args&&... args)
    -> decltype(ex::native_simd<T>(std::forward<Args>(args)...),
                void()) = delete;

template <class T>
void not_supported_native_simd_ctor(...) {}

template <class T, class... Args>
auto supported_native_simd_ctor(Args&&... args)
    -> decltype(ex::native_simd<T>(std::forward<Args>(args)...), void()) {}

template <class T>
void supported_native_simd_ctor(...) = delete;

void compile_load_ctor() {
  supported_native_simd_ctor<int>((int*)nullptr, ex::element_aligned_tag());
  supported_native_simd_ctor<std::uint32_t>((int*)nullptr,
                                       ex::element_aligned_tag());
  supported_native_simd_ctor<double>((float*)nullptr,
                                     ex::element_aligned_tag());
  supported_native_simd_ctor<std::uint16_t>((unsigned int*)nullptr,
                                       ex::element_aligned_tag());
  supported_native_simd_ctor<std::uint32_t>((float*)nullptr,
                                       ex::element_aligned_tag());

  not_supported_native_simd_ctor<int>((int*)nullptr, int());
}

template <typename SimdType>
void test_load_ctor() {
  alignas(32) std::int32_t buffer[] = {4, 3, 2, 1};
  {
    SimdType a(buffer, ex::element_aligned_tag());
    assert(a[0] == 4);
    assert(a[1] == 3);
    assert(a[2] == 2);
    assert(a[3] == 1);
  }
  {
    SimdType a(buffer, ex::vector_aligned_tag());
    assert(a[0] == 4);
    assert(a[1] == 3);
    assert(a[2] == 2);
    assert(a[3] == 1);
  }
  {
    SimdType a(buffer, ex::overaligned_tag<32>());
    assert(a[0] == 4);
    assert(a[1] == 3);
    assert(a[2] == 2);
    assert(a[3] == 1);
  }

  {
    SimdType a(buffer, ex::element_aligned);
    assert(a[0] == 4);
    assert(a[1] == 3);
    assert(a[2] == 2);
    assert(a[3] == 1);
  }
  {
    SimdType a(buffer, ex::vector_aligned);
    assert(a[0] == 4);
    assert(a[1] == 3);
    assert(a[2] == 2);
    assert(a[3] == 1);
  }
  {
    SimdType a(buffer, ex::overaligned<32>);
    assert(a[0] == 4);
    assert(a[1] == 3);
    assert(a[2] == 2);
    assert(a[3] == 1);
  }
}

template <typename SimdType>
void test_converting_load_ctor() {
  float buffer[] = {1., 2., 4., 8.};
  SimdType a(buffer, ex::element_aligned_tag());
  assert(a[0] == 1);
  assert(a[1] == 2);
  assert(a[2] == 4);
  assert(a[3] == 8);
}

int main(int, char**) {
  // TODO: adjust the tests when this assertion fails.
  assert(ex::native_simd<std::int32_t>::size() >= 4);
  test_load_ctor<ex::native_simd<std::int32_t>>();
  test_load_ctor<ex::fixed_size_simd<std::int32_t, 4>>();
  test_converting_load_ctor<ex::native_simd<std::int32_t>>();
  test_converting_load_ctor<ex::fixed_size_simd<std::int32_t, 4>>();

  return 0;
}
