blob: 6ce32cab8673674c10d0433f463fe38efd2533d1 [file] [log] [blame]
Tim Shen38cd7de2018-07-30 22:27:38 +00001//===----------------------------------------------------------------------===//
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
22namespace ex = std::experimental::parallelism_v2;
23
24template <typename SimdType>
25void 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;
Tim Shenf72252e2018-07-30 23:05:40 +0000164 (void)(a[0] + (c[0] >>= b[0]));
Tim Shen38cd7de2018-07-30 22:27:38 +0000165 }
166 {
167 auto c = a;
168 (void)(a[0] + (c[0] <<= a[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
214int main() {
215 test_access<ex::native_simd<int>>();
216 test_access<ex::fixed_size_simd<int, 4>>();
217}