1 //===----------------------------------------------------------------------===// 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 22 namespace ex = std::experimental::parallelism_v2; 23 24 template <typename SimdType> test_access()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; 164 (void)(a[0] + (c[0] >>= b[0])); 165 } 166 { 167 auto c = a; 168 (void)(a[0] + (c[0] <<= b[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 main()214int main() { 215 test_access<ex::native_simd<int>>(); 216 test_access<ex::fixed_size_simd<int, 4>>(); 217 } 218