Home | History | Annotate | Download | only in simd.mem
      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 // <experimental/simd>
     13 //
     14 // loads [simd.load]
     15 // template <class U, class Flags> void copy_from(const U* mem, Flags f);
     16 
     17 #include <experimental/simd>
     18 #include <cstdint>
     19 
     20 #include "test_macros.h"
     21 
     22 namespace ex = std::experimental::parallelism_v2;
     23 
     24 template <class T, class... Args>
     25 auto not_supported_load(Args&&... args) -> decltype(
     26     std::declval<ex::native_simd<T>>().copy_from(std::forward<Args>(args)...),
     27     void()) = delete;
     28 
     29 template <class T>
     30 void not_supported_load(...) {}
     31 
     32 template <class T, class... Args>
     33 auto supported_load(Args&&... args) -> decltype(
     34     std::declval<ex::native_simd<T>>().copy_from(std::forward<Args>(args)...),
     35     void()) {}
     36 
     37 template <class T>
     38 void supported_load(...) = delete;
     39 
     40 void compile_load() {
     41   supported_load<int>((int*)nullptr, ex::element_aligned_tag());
     42   supported_load<uint32_t>((int*)nullptr, ex::element_aligned_tag());
     43   supported_load<double>((float*)nullptr, ex::element_aligned_tag());
     44   supported_load<uint16_t>((unsigned int*)nullptr, ex::element_aligned_tag());
     45   supported_load<uint32_t>((float*)nullptr, ex::element_aligned_tag());
     46 
     47   not_supported_load<int>((int*)nullptr, int());
     48 }
     49 
     50 template <typename SimdType>
     51 void test_load() {
     52   alignas(32) int32_t buffer[] = {4, 3, 2, 1};
     53   {
     54     SimdType a;
     55     a.copy_from(buffer, ex::element_aligned_tag());
     56     assert(a[0] == 4);
     57     assert(a[1] == 3);
     58     assert(a[2] == 2);
     59     assert(a[3] == 1);
     60   }
     61   {
     62     SimdType a;
     63     a.copy_from(buffer, ex::vector_aligned_tag());
     64     assert(a[0] == 4);
     65     assert(a[1] == 3);
     66     assert(a[2] == 2);
     67     assert(a[3] == 1);
     68   }
     69   {
     70     SimdType a;
     71     a.copy_from(buffer, ex::overaligned_tag<32>());
     72     assert(a[0] == 4);
     73     assert(a[1] == 3);
     74     assert(a[2] == 2);
     75     assert(a[3] == 1);
     76   }
     77 
     78   {
     79     SimdType a;
     80     a.copy_from(buffer, ex::element_aligned);
     81     assert(a[0] == 4);
     82     assert(a[1] == 3);
     83     assert(a[2] == 2);
     84     assert(a[3] == 1);
     85   }
     86   {
     87     SimdType a;
     88     a.copy_from(buffer, ex::vector_aligned);
     89     assert(a[0] == 4);
     90     assert(a[1] == 3);
     91     assert(a[2] == 2);
     92     assert(a[3] == 1);
     93   }
     94   {
     95     SimdType a;
     96     a.copy_from(buffer, ex::overaligned<32>);
     97     assert(a[0] == 4);
     98     assert(a[1] == 3);
     99     assert(a[2] == 2);
    100     assert(a[3] == 1);
    101   }
    102 }
    103 
    104 template <typename SimdType>
    105 void test_converting_load() {
    106   float buffer[] = {1., 2., 4., 8.};
    107   SimdType a;
    108   a.copy_from(buffer, ex::element_aligned_tag());
    109   assert(a[0] == 1);
    110   assert(a[1] == 2);
    111   assert(a[2] == 4);
    112   assert(a[3] == 8);
    113 }
    114 
    115 int main() {
    116   // TODO: adjust the tests when this assertion fails.
    117   assert(ex::native_simd<int32_t>::size() >= 4);
    118   test_load<ex::native_simd<int32_t>>();
    119   test_load<ex::fixed_size_simd<int32_t, 4>>();
    120   test_converting_load<ex::native_simd<int32_t>>();
    121   test_converting_load<ex::fixed_size_simd<int32_t, 4>>();
    122 }
    123