1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // UNSUPPORTED: c++98, c++03, c++11, c++14
12 // <experimental/simd>
14 // scalar access [simd.subscr]
15 // reference operator[](size_t);
16 // value_type operator[](size_t) const;
18 #include <experimental/simd>
22 namespace ex = std::experimental::parallelism_v2;
24 template <typename SimdType>
28 static_assert(std::is_convertible<decltype(a[0]), int8_t>::value, "");
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);
57 assert(c[0] == 42 + 1);
64 assert(c[0] == 42 + 1);
70 assert(c[0] == 42 - 1);
77 assert(c[0] == 42 - 1);
84 assert(c[0] == 42 + 4);
90 assert(c[0] == 42 - 4);
96 assert(c[0] == 42 * 4);
102 assert(c[0] == 42 / 4);
108 assert(c[0] == 42 % 4);
114 assert(c[0] == (42 >> 4));
120 assert(c[0] == (42 << 4));
126 assert(c[0] == (42 & 4));
132 assert(c[0] == (42 | 4));
138 assert(c[0] == (42 ^ 4));
144 (void)(a[0] + (c[0] += a[0]));
148 (void)(a[0] + (c[0] -= a[0]));
152 (void)(a[0] + (c[0] *= a[0]));
156 (void)(a[0] + (c[0] /= a[0]));
160 (void)(a[0] + (c[0] %= a[0]));
164 (void)(a[0] + (c[0] >>= b[0]));
168 (void)(a[0] + (c[0] <<= a[0]));
172 (void)(a[0] + (c[0] &= a[0]));
176 (void)(a[0] + (c[0] |= a[0]));
180 (void)(a[0] + (c[0] ^= a[0]));
184 const SimdType a(42);
186 static_assert(std::is_same<decltype(a[0]), int>::value, "");
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);
215 test_access<ex::native_simd<int>>();
216 test_access<ex::fixed_size_simd<int, 4>>();