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