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