blob: 6e6e4fe9e9a2ae65fb2823bcf21f9c3dcd63d444 [file] [log] [blame]
Tim Shen38cd7de2018-07-30 22:27:38 +00001//===----------------------------------------------------------------------===//
2//
Chandler Carruth57b08b02019-01-19 10:56:40 +00003// 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
Tim Shen38cd7de2018-07-30 22:27:38 +00006//
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
21namespace ex = std::experimental::parallelism_v2;
22
23template <typename SimdType>
24void 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;
Tim Shenf72252e2018-07-30 23:05:40 +0000163 (void)(a[0] + (c[0] >>= b[0]));
Tim Shen38cd7de2018-07-30 22:27:38 +0000164 }
165 {
166 auto c = a;
Eric Fiselier67e881d2018-09-22 20:09:02 +0000167 (void)(a[0] + (c[0] <<= b[0]));
Tim Shen38cd7de2018-07-30 22:27:38 +0000168 }
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
JF Bastien2df59c52019-02-04 20:31:13 +0000213int main(int, char**) {
Tim Shen38cd7de2018-07-30 22:27:38 +0000214 test_access<ex::native_simd<int>>();
215 test_access<ex::fixed_size_simd<int, 4>>();
JF Bastien2df59c52019-02-04 20:31:13 +0000216
217 return 0;
Tim Shen38cd7de2018-07-30 22:27:38 +0000218}