libcxx

libcxx mirror with random patches
git clone https://git.neptards.moe/neptards/libcxx.git
Log | Files | Refs

default.pass.cpp (4810B)


      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 // scalar access [simd.subscr]
     15 // reference operator[](size_t);
     16 // value_type operator[](size_t) const;
     17 
     18 #include <experimental/simd>
     19 #include <cassert>
     20 #include <cstdint>
     21 
     22 namespace ex = std::experimental::parallelism_v2;
     23 
     24 template <typename SimdType>
     25 void test_access() {
     26   {
     27     SimdType a(42), b(4);
     28     static_assert(std::is_convertible<decltype(a[0]), int8_t>::value, "");
     29 
     30     assert(a[0] == 42);
     31     assert(!a[0] == !42);
     32     assert(~a[0] == ~42);
     33     assert(+a[0] == +42);
     34     assert(-a[0] == -42);
     35     assert(a[0] + b[0] == 42 + 4);
     36     assert(a[0] - b[0] == 42 - 4);
     37     assert(a[0] * b[0] == 42 * 4);
     38     assert(a[0] / b[0] == 42 / 4);
     39     assert(a[0] % b[0] == 42 % 4);
     40     assert(a[0] << b[0] == (42 << 4));
     41     assert(a[0] >> b[0] == (42 >> 4));
     42     assert(a[0] < b[0] == false);
     43     assert(a[0] <= b[0] == false);
     44     assert(a[0] > b[0] == true);
     45     assert(a[0] >= b[0] == true);
     46     assert(a[0] == b[0] == false);
     47     assert(a[0] != b[0] == true);
     48     assert((a[0] & b[0]) == (42 & 4));
     49     assert((a[0] | b[0]) == (42 | 4));
     50     assert((a[0] ^ b[0]) == (42 ^ 4));
     51     assert((a[0] && b[0]) == true);
     52     assert((a[0] || b[0]) == true);
     53 
     54     {
     55       auto c = a;
     56       ++c[0];
     57       assert(c[0] == 42 + 1);
     58       assert(c[1] == 42);
     59     }
     60     {
     61       auto c = a;
     62       auto ret = c[0]++;
     63       assert(ret == 42);
     64       assert(c[0] == 42 + 1);
     65       assert(c[1] == 42);
     66     }
     67     {
     68       auto c = a;
     69       --c[0];
     70       assert(c[0] == 42 - 1);
     71       assert(c[1] == 42);
     72     }
     73     {
     74       auto c = a;
     75       auto ret = c[0]--;
     76       assert(ret == 42);
     77       assert(c[0] == 42 - 1);
     78       assert(c[1] == 42);
     79     }
     80 
     81     {
     82       auto c = a;
     83       c[0] += b[0];
     84       assert(c[0] == 42 + 4);
     85       assert(c[1] == 42);
     86     }
     87     {
     88       auto c = a;
     89       c[0] -= b[0];
     90       assert(c[0] == 42 - 4);
     91       assert(c[1] == 42);
     92     }
     93     {
     94       auto c = a;
     95       c[0] *= b[0];
     96       assert(c[0] == 42 * 4);
     97       assert(c[1] == 42);
     98     }
     99     {
    100       auto c = a;
    101       c[0] /= b[0];
    102       assert(c[0] == 42 / 4);
    103       assert(c[1] == 42);
    104     }
    105     {
    106       auto c = a;
    107       c[0] %= b[0];
    108       assert(c[0] == 42 % 4);
    109       assert(c[1] == 42);
    110     }
    111     {
    112       auto c = a;
    113       c[0] >>= b[0];
    114       assert(c[0] == (42 >> 4));
    115       assert(c[1] == 42);
    116     }
    117     {
    118       auto c = a;
    119       c[0] <<= b[0];
    120       assert(c[0] == (42 << 4));
    121       assert(c[1] == 42);
    122     }
    123     {
    124       auto c = a;
    125       c[0] &= b[0];
    126       assert(c[0] == (42 & 4));
    127       assert(c[1] == 42);
    128     }
    129     {
    130       auto c = a;
    131       c[0] |= b[0];
    132       assert(c[0] == (42 | 4));
    133       assert(c[1] == 42);
    134     }
    135     {
    136       auto c = a;
    137       c[0] ^= b[0];
    138       assert(c[0] == (42 ^ 4));
    139       assert(c[1] == 42);
    140     }
    141 
    142     {
    143       auto c = a;
    144       (void)(a[0] + (c[0] += a[0]));
    145     }
    146     {
    147       auto c = a;
    148       (void)(a[0] + (c[0] -= a[0]));
    149     }
    150     {
    151       auto c = a;
    152       (void)(a[0] + (c[0] *= a[0]));
    153     }
    154     {
    155       auto c = a;
    156       (void)(a[0] + (c[0] /= a[0]));
    157     }
    158     {
    159       auto c = a;
    160       (void)(a[0] + (c[0] %= a[0]));
    161     }
    162     {
    163       auto c = a;
    164       (void)(a[0] + (c[0] >>= b[0]));
    165     }
    166     {
    167       auto c = a;
    168       (void)(a[0] + (c[0] <<= b[0]));
    169     }
    170     {
    171       auto c = a;
    172       (void)(a[0] + (c[0] &= a[0]));
    173     }
    174     {
    175       auto c = a;
    176       (void)(a[0] + (c[0] |= a[0]));
    177     }
    178     {
    179       auto c = a;
    180       (void)(a[0] + (c[0] ^= a[0]));
    181     }
    182   }
    183   {
    184     const SimdType a(42);
    185     const SimdType b(4);
    186     static_assert(std::is_same<decltype(a[0]), int>::value, "");
    187 
    188     assert(a[0] == 42);
    189     assert(!a[0] == !42);
    190     assert(~a[0] == ~42);
    191     assert(+a[0] == +42);
    192     assert(-a[0] == -42);
    193     assert(a[0] + b[0] == 42 + 4);
    194     assert(a[0] - b[0] == 42 - 4);
    195     assert(a[0] * b[0] == 42 * 4);
    196     assert(a[0] / b[0] == 42 / 4);
    197     assert(a[0] % b[0] == 42 % 4);
    198     assert(a[0] << b[0] == (42 << 4));
    199     assert(a[0] >> b[0] == (42 >> 4));
    200     assert(a[0] < b[0] == false);
    201     assert(a[0] <= b[0] == false);
    202     assert(a[0] > b[0] == true);
    203     assert(a[0] >= b[0] == true);
    204     assert(a[0] == b[0] == false);
    205     assert(a[0] != b[0] == true);
    206     assert((a[0] & b[0]) == (42 & 4));
    207     assert((a[0] | b[0]) == (42 | 4));
    208     assert((a[0] ^ b[0]) == (42 ^ 4));
    209     assert((a[0] && b[0]) == true);
    210     assert((a[0] || b[0]) == true);
    211   }
    212 }
    213 
    214 int main() {
    215   test_access<ex::native_simd<int>>();
    216   test_access<ex::fixed_size_simd<int, 4>>();
    217 }