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
931cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
1038cd7de5STim Shen
1138cd7de5STim Shen // <experimental/simd>
1238cd7de5STim Shen //
1338cd7de5STim Shen // scalar access [simd.subscr]
1438cd7de5STim Shen // reference operator[](size_t);
1538cd7de5STim Shen // value_type operator[](size_t) const;
1638cd7de5STim Shen
1738cd7de5STim Shen #include <experimental/simd>
1838cd7de5STim Shen #include <cassert>
1938cd7de5STim Shen #include <cstdint>
2038cd7de5STim Shen
217fc6a556SMarshall Clow #include "test_macros.h"
227fc6a556SMarshall Clow
2338cd7de5STim Shen namespace ex = std::experimental::parallelism_v2;
2438cd7de5STim Shen
2538cd7de5STim Shen template <typename SimdType>
test_access()2638cd7de5STim Shen void test_access() {
2738cd7de5STim Shen {
2838cd7de5STim Shen SimdType a(42), b(4);
2938cd7de5STim Shen static_assert(std::is_convertible<decltype(a[0]), int8_t>::value, "");
3038cd7de5STim Shen
3138cd7de5STim Shen assert(a[0] == 42);
3238cd7de5STim Shen assert(!a[0] == !42);
3338cd7de5STim Shen assert(~a[0] == ~42);
3438cd7de5STim Shen assert(+a[0] == +42);
3538cd7de5STim Shen assert(-a[0] == -42);
3638cd7de5STim Shen assert(a[0] + b[0] == 42 + 4);
3738cd7de5STim Shen assert(a[0] - b[0] == 42 - 4);
3838cd7de5STim Shen assert(a[0] * b[0] == 42 * 4);
3938cd7de5STim Shen assert(a[0] / b[0] == 42 / 4);
4038cd7de5STim Shen assert(a[0] % b[0] == 42 % 4);
4138cd7de5STim Shen assert(a[0] << b[0] == (42 << 4));
4238cd7de5STim Shen assert(a[0] >> b[0] == (42 >> 4));
43*dde0fcd7SMarek Kurdej assert((a[0] < b[0]) == false);
44*dde0fcd7SMarek Kurdej assert((a[0] <= b[0]) == false);
45*dde0fcd7SMarek Kurdej assert((a[0] > b[0]) == true);
46*dde0fcd7SMarek Kurdej assert((a[0] >= b[0]) == true);
47*dde0fcd7SMarek Kurdej assert((a[0] == b[0]) == false);
48*dde0fcd7SMarek Kurdej assert((a[0] != b[0]) == true);
4938cd7de5STim Shen assert((a[0] & b[0]) == (42 & 4));
5038cd7de5STim Shen assert((a[0] | b[0]) == (42 | 4));
5138cd7de5STim Shen assert((a[0] ^ b[0]) == (42 ^ 4));
5238cd7de5STim Shen assert((a[0] && b[0]) == true);
5338cd7de5STim Shen assert((a[0] || b[0]) == true);
5438cd7de5STim Shen
5538cd7de5STim Shen {
5638cd7de5STim Shen auto c = a;
5738cd7de5STim Shen ++c[0];
5838cd7de5STim Shen assert(c[0] == 42 + 1);
5938cd7de5STim Shen assert(c[1] == 42);
6038cd7de5STim Shen }
6138cd7de5STim Shen {
6238cd7de5STim Shen auto c = a;
6338cd7de5STim Shen auto ret = c[0]++;
6438cd7de5STim Shen assert(ret == 42);
6538cd7de5STim Shen assert(c[0] == 42 + 1);
6638cd7de5STim Shen assert(c[1] == 42);
6738cd7de5STim Shen }
6838cd7de5STim Shen {
6938cd7de5STim Shen auto c = a;
7038cd7de5STim Shen --c[0];
7138cd7de5STim Shen assert(c[0] == 42 - 1);
7238cd7de5STim Shen assert(c[1] == 42);
7338cd7de5STim Shen }
7438cd7de5STim Shen {
7538cd7de5STim Shen auto c = a;
7638cd7de5STim Shen auto ret = c[0]--;
7738cd7de5STim Shen assert(ret == 42);
7838cd7de5STim Shen assert(c[0] == 42 - 1);
7938cd7de5STim Shen assert(c[1] == 42);
8038cd7de5STim Shen }
8138cd7de5STim Shen
8238cd7de5STim Shen {
8338cd7de5STim Shen auto c = a;
8438cd7de5STim Shen c[0] += b[0];
8538cd7de5STim Shen assert(c[0] == 42 + 4);
8638cd7de5STim Shen assert(c[1] == 42);
8738cd7de5STim Shen }
8838cd7de5STim Shen {
8938cd7de5STim Shen auto c = a;
9038cd7de5STim Shen c[0] -= b[0];
9138cd7de5STim Shen assert(c[0] == 42 - 4);
9238cd7de5STim Shen assert(c[1] == 42);
9338cd7de5STim Shen }
9438cd7de5STim Shen {
9538cd7de5STim Shen auto c = a;
9638cd7de5STim Shen c[0] *= b[0];
9738cd7de5STim Shen assert(c[0] == 42 * 4);
9838cd7de5STim Shen assert(c[1] == 42);
9938cd7de5STim Shen }
10038cd7de5STim Shen {
10138cd7de5STim Shen auto c = a;
10238cd7de5STim Shen c[0] /= b[0];
10338cd7de5STim Shen assert(c[0] == 42 / 4);
10438cd7de5STim Shen assert(c[1] == 42);
10538cd7de5STim Shen }
10638cd7de5STim Shen {
10738cd7de5STim Shen auto c = a;
10838cd7de5STim Shen c[0] %= b[0];
10938cd7de5STim Shen assert(c[0] == 42 % 4);
11038cd7de5STim Shen assert(c[1] == 42);
11138cd7de5STim Shen }
11238cd7de5STim Shen {
11338cd7de5STim Shen auto c = a;
11438cd7de5STim Shen c[0] >>= b[0];
11538cd7de5STim Shen assert(c[0] == (42 >> 4));
11638cd7de5STim Shen assert(c[1] == 42);
11738cd7de5STim Shen }
11838cd7de5STim Shen {
11938cd7de5STim Shen auto c = a;
12038cd7de5STim Shen c[0] <<= b[0];
12138cd7de5STim Shen assert(c[0] == (42 << 4));
12238cd7de5STim Shen assert(c[1] == 42);
12338cd7de5STim Shen }
12438cd7de5STim Shen {
12538cd7de5STim Shen auto c = a;
12638cd7de5STim Shen c[0] &= b[0];
12738cd7de5STim Shen assert(c[0] == (42 & 4));
12838cd7de5STim Shen assert(c[1] == 42);
12938cd7de5STim Shen }
13038cd7de5STim Shen {
13138cd7de5STim Shen auto c = a;
13238cd7de5STim Shen c[0] |= b[0];
13338cd7de5STim Shen assert(c[0] == (42 | 4));
13438cd7de5STim Shen assert(c[1] == 42);
13538cd7de5STim Shen }
13638cd7de5STim Shen {
13738cd7de5STim Shen auto c = a;
13838cd7de5STim Shen c[0] ^= b[0];
13938cd7de5STim Shen assert(c[0] == (42 ^ 4));
14038cd7de5STim Shen assert(c[1] == 42);
14138cd7de5STim Shen }
14238cd7de5STim Shen
14338cd7de5STim Shen {
14438cd7de5STim Shen auto c = a;
14538cd7de5STim Shen (void)(a[0] + (c[0] += a[0]));
14638cd7de5STim Shen }
14738cd7de5STim Shen {
14838cd7de5STim Shen auto c = a;
14938cd7de5STim Shen (void)(a[0] + (c[0] -= a[0]));
15038cd7de5STim Shen }
15138cd7de5STim Shen {
15238cd7de5STim Shen auto c = a;
15338cd7de5STim Shen (void)(a[0] + (c[0] *= a[0]));
15438cd7de5STim Shen }
15538cd7de5STim Shen {
15638cd7de5STim Shen auto c = a;
15738cd7de5STim Shen (void)(a[0] + (c[0] /= a[0]));
15838cd7de5STim Shen }
15938cd7de5STim Shen {
16038cd7de5STim Shen auto c = a;
16138cd7de5STim Shen (void)(a[0] + (c[0] %= a[0]));
16238cd7de5STim Shen }
16338cd7de5STim Shen {
16438cd7de5STim Shen auto c = a;
165f72252e6STim Shen (void)(a[0] + (c[0] >>= b[0]));
16638cd7de5STim Shen }
16738cd7de5STim Shen {
16838cd7de5STim Shen auto c = a;
16967e881d1SEric Fiselier (void)(a[0] + (c[0] <<= b[0]));
17038cd7de5STim Shen }
17138cd7de5STim Shen {
17238cd7de5STim Shen auto c = a;
17338cd7de5STim Shen (void)(a[0] + (c[0] &= a[0]));
17438cd7de5STim Shen }
17538cd7de5STim Shen {
17638cd7de5STim Shen auto c = a;
17738cd7de5STim Shen (void)(a[0] + (c[0] |= a[0]));
17838cd7de5STim Shen }
17938cd7de5STim Shen {
18038cd7de5STim Shen auto c = a;
18138cd7de5STim Shen (void)(a[0] + (c[0] ^= a[0]));
18238cd7de5STim Shen }
18338cd7de5STim Shen }
18438cd7de5STim Shen {
18538cd7de5STim Shen const SimdType a(42);
18638cd7de5STim Shen const SimdType b(4);
18738cd7de5STim Shen static_assert(std::is_same<decltype(a[0]), int>::value, "");
18838cd7de5STim Shen
18938cd7de5STim Shen assert(a[0] == 42);
19038cd7de5STim Shen assert(!a[0] == !42);
19138cd7de5STim Shen assert(~a[0] == ~42);
19238cd7de5STim Shen assert(+a[0] == +42);
19338cd7de5STim Shen assert(-a[0] == -42);
19438cd7de5STim Shen assert(a[0] + b[0] == 42 + 4);
19538cd7de5STim Shen assert(a[0] - b[0] == 42 - 4);
19638cd7de5STim Shen assert(a[0] * b[0] == 42 * 4);
19738cd7de5STim Shen assert(a[0] / b[0] == 42 / 4);
19838cd7de5STim Shen assert(a[0] % b[0] == 42 % 4);
19938cd7de5STim Shen assert(a[0] << b[0] == (42 << 4));
20038cd7de5STim Shen assert(a[0] >> b[0] == (42 >> 4));
201*dde0fcd7SMarek Kurdej assert((a[0] < b[0]) == false);
202*dde0fcd7SMarek Kurdej assert((a[0] <= b[0]) == false);
203*dde0fcd7SMarek Kurdej assert((a[0] > b[0]) == true);
204*dde0fcd7SMarek Kurdej assert((a[0] >= b[0]) == true);
205*dde0fcd7SMarek Kurdej assert((a[0] == b[0]) == false);
206*dde0fcd7SMarek Kurdej assert((a[0] != b[0]) == true);
20738cd7de5STim Shen assert((a[0] & b[0]) == (42 & 4));
20838cd7de5STim Shen assert((a[0] | b[0]) == (42 | 4));
20938cd7de5STim Shen assert((a[0] ^ b[0]) == (42 ^ 4));
21038cd7de5STim Shen assert((a[0] && b[0]) == true);
21138cd7de5STim Shen assert((a[0] || b[0]) == true);
21238cd7de5STim Shen }
21338cd7de5STim Shen }
21438cd7de5STim Shen
main(int,char **)2152df59c50SJF Bastien int main(int, char**) {
21638cd7de5STim Shen test_access<ex::native_simd<int>>();
21738cd7de5STim Shen test_access<ex::fixed_size_simd<int, 4>>();
2182df59c50SJF Bastien
2192df59c50SJF Bastien return 0;
22038cd7de5STim Shen }
221