Lines Matching refs:simd
2 //===------------------------------- simd ---------------------------------===//
13 experimental/simd synopsis
36 // traits [simd.traits]
60 // class template simd [simd.class]
61 template <class T, class Abi = simd_abi::compatible<T>> class simd;
62 template <class T> using native_simd = simd<T, simd_abi::native<T>>;
63 template <class T, int N> using fixed_size_simd = simd<T, simd_abi::fixed_size<N>>;
65 // class template simd_mask [simd.mask.class]
70 // casts [simd.casts]
71 template <class T, class U, class Abi> see below simd_cast(const simd<U, Abi>&);
72 template <class T, class U, class Abi> see below static_simd_cast(const simd<U, Abi>&);
75 fixed_size_simd<T, simd_size_v<T, Abi>> to_fixed_size(const simd<T, Abi>&) noexcept;
81 template <class T, size_t N> simd<T> to_compatible(const fixed_size_simd<T, N>&) noexcept;
85 tuple<simd<T, abi_for_size_t<Sizes>>...> split(const simd<T, Abi>&);
90 const simd<typename V::value_type, Abi>&);
96 simd<T, abi_for_size_t<T, (simd_size_v<T, Abis> + ...)>> concat(const simd<T, Abis>&...);
100 // reductions [simd.mask.reductions]
117 // masked assignment [simd.whereexpr]
121 // masked assignment [simd.mask.where]
127 where_expression<simd_mask<T, Abi>, simd<T, Abi>>
128 where(const typename simd<T, Abi>::mask_type&, simd<T, Abi>&) noexcept;
131 const_where_expression<simd_mask<T, Abi>, const simd<T, Abi>>
132 where(const typename simd<T, Abi>::mask_type&, const simd<T, Abi>&) noexcept;
147 // reductions [simd.reductions]
149 T reduce(const simd<T, Abi>&, BinaryOperation = BinaryOperation());
170 template <class T, class Abi> T hmin(const simd<T, Abi>&);
172 template <class T, class Abi> T hmax(const simd<T, Abi>&);
175 // algorithms [simd.alg]
176 template <class T, class Abi> simd<T, Abi> min(const simd<T, Abi>&, const simd<T, Abi>&) noexcept;
178 template <class T, class Abi> simd<T, Abi> max(const simd<T, Abi>&, const simd<T, Abi>&) noexcept;
181 std::pair<simd<T, Abi>, simd<T, Abi>> minmax(const simd<T, Abi>&, const simd<T, Abi>&) noexcept;
184 simd<T, Abi> clamp(const simd<T, Abi>& v, const simd<T, Abi>& lo, const simd<T, Abi>& hi);
186 // [simd.whereexpr]
221 // [simd.class]
222 template <class T, class Abi> class simd {
230 simd() = default;
233 template <class U> simd(const simd<U, simd_abi::fixed_size<size()>>&);
236 template <class U> simd(U&& value);
239 template <class G> explicit simd(G&& gen);
242 template <class U, class Flags> simd(const U* mem, Flags f);
244 // loads [simd.load]
247 // stores [simd.store]
250 // scalar access [simd.subscr]
254 // unary operators [simd.unary]
255 simd& operator++();
256 simd operator++(int);
257 simd& operator--();
258 simd operator--(int);
260 simd operator~() const; // see below
261 simd operator+() const;
262 simd operator-() const;
264 // binary operators [simd.binary]
265 friend simd operator+ (const simd&, const simd&);
266 friend simd operator- (const simd&, const simd&);
267 friend simd operator* (const simd&, const simd&);
268 friend simd operator/ (const simd&, const simd&);
269 friend simd operator% (const simd&, const simd&);
270 friend simd operator& (const simd&, const simd&);
271 friend simd operator| (const simd&, const simd&);
272 friend simd operator^ (const simd&, const simd&);
273 friend simd operator<<(const simd&, const simd&);
274 friend simd operator>>(const simd&, const simd&);
275 friend simd operator<<(const simd&, int);
276 friend simd operator>>(const simd&, int);
278 // compound assignment [simd.cassign]
279 friend simd& operator+= (simd&, const simd&);
280 friend simd& operator-= (simd&, const simd&);
281 friend simd& operator*= (simd&, const simd&);
282 friend simd& operator/= (simd&, const simd&);
283 friend simd& operator%= (simd&, const simd&);
285 friend simd& operator&= (simd&, const simd&);
286 friend simd& operator|= (simd&, const simd&);
287 friend simd& operator^= (simd&, const simd&);
288 friend simd& operator<<=(simd&, const simd&);
289 friend simd& operator>>=(simd&, const simd&);
290 friend simd& operator<<=(simd&, int);
291 friend simd& operator>>=(simd&, int);
293 // compares [simd.comparison]
294 friend mask_type operator==(const simd&, const simd&);
295 friend mask_type operator!=(const simd&, const simd&);
296 friend mask_type operator>=(const simd&, const simd&);
297 friend mask_type operator<=(const simd&, const simd&);
298 friend mask_type operator> (const simd&, const simd&);
299 friend mask_type operator< (const simd&, const simd&);
302 // [simd.math]
303 template <class Abi> using scharv = simd<signed char, Abi>; // exposition only
304 template <class Abi> using shortv = simd<short, Abi>; // exposition only
305 template <class Abi> using intv = simd<int, Abi>; // exposition only
306 template <class Abi> using longv = simd<long int, Abi>; // exposition only
307 template <class Abi> using llongv = simd<long long int, Abi>; // exposition only
308 template <class Abi> using floatv = simd<float, Abi>; // exposition only
309 template <class Abi> using doublev = simd<double, Abi>; // exposition only
310 template <class Abi> using ldoublev = simd<long double, Abi>; // exposition only
599 // [simd.mask.class]
605 using simd_type = simd<T, Abi>;
619 // loads [simd.mask.copy]
623 // scalar access [simd.mask.subscr]
627 // unary operators [simd.mask.unary]
630 // simd_mask binary operators [simd.mask.binary]
637 // simd_mask compound assignment [simd.mask.cassign]
642 // simd_mask compares [simd.mask.comparison]
686 friend struct simd;
703 friend struct simd;
805 friend struct simd;
824 friend struct simd;
985 class simd;
998 // traits [simd.traits]
1010 struct is_simd<simd<_Tp, _Abi>> : std::integral_constant<bool, true> {};
1073 // class template simd [simd.class]
1075 using native_simd = simd<_Tp, simd_abi::native<_Tp>>;
1077 using fixed_size_simd = simd<_Tp, simd_abi::fixed_size<_Np>>;
1079 // class template simd_mask [simd.mask.class]
1086 // casts [simd.casts]
1090 static simd<_Tp, _Abi> __apply(const simd<_Up, _Abi>& __v);
1094 struct __static_simd_cast_traits<simd<_Tp, _NewAbi>> {
1096 static typename std::enable_if<simd<_Up, _Abi>::size() ==
1097 simd<_Tp, _NewAbi>::size(),
1098 simd<_Tp, _NewAbi>>::type
1099 __apply(const simd<_Up, _Abi>& __v);
1107 simd<_Tp, _Abi>>::type
1108 __apply(const simd<_Up, _Abi>& __v);
1112 struct __simd_cast_traits<simd<_Tp, _NewAbi>> {
1116 simd<_Up, _Abi>::size() == simd<_Tp, _NewAbi>::size(),
1117 simd<_Tp, _NewAbi>>::type
1118 __apply(const simd<_Up, _Abi>& __v);
1122 auto simd_cast(const simd<_Up, _Abi>& __v)
1128 auto static_simd_cast(const simd<_Up, _Abi>& __v)
1135 to_fixed_size(const simd<_Tp, _Abi>&) noexcept;
1148 simd<_Tp> to_compatible(const fixed_size_simd<_Tp, _Np>&) noexcept;
1154 tuple<simd<_Tp, abi_for_size_t<_Tp, __sizes>>...> split(const simd<_Tp, _Abi>&);
1163 split(const simd<typename _SimdType::value_type, _Abi>&);
1171 simd<_Tp, abi_for_size_t<_Tp, __variadic_sum(simd_size<_Tp, _Abis>::value...)>>
1172 concat(const simd<_Tp, _Abis>&...);
1179 // reductions [simd.mask.reductions]
1202 // masked assignment [simd.whereexpr]
1208 // masked assignment [simd.mask.where]
1210 where_expression<simd_mask<_Tp, _Abi>, simd<_Tp, _Abi>>
1211 where(const typename simd<_Tp, _Abi>::mask_type&, simd<_Tp, _Abi>&) noexcept;
1214 const_where_expression<simd_mask<_Tp, _Abi>, const simd<_Tp, _Abi>>
1215 where(const typename simd<_Tp, _Abi>::mask_type&,
1216 const simd<_Tp, _Abi>&) noexcept;
1234 // reductions [simd.reductions]
1236 _Tp reduce(const simd<_Tp, _Abi>&, _BinaryOp = _BinaryOp());
1269 _Tp hmin(const simd<_Tp, _Abi>&);
1274 _Tp hmax(const simd<_Tp, _Abi>&);
1279 // algorithms [simd.alg]
1281 simd<_Tp, _Abi> min(const simd<_Tp, _Abi>&, const simd<_Tp, _Abi>&) noexcept;
1284 simd<_Tp, _Abi> max(const simd<_Tp, _Abi>&, const simd<_Tp, _Abi>&) noexcept;
1287 std::pair<simd<_Tp, _Abi>, simd<_Tp, _Abi>>
1288 minmax(const simd<_Tp, _Abi>&, const simd<_Tp, _Abi>&) noexcept;
1291 simd<_Tp, _Abi> clamp(const simd<_Tp, _Abi>&, const simd<_Tp, _Abi>&,
1292 const simd<_Tp, _Abi>&);
1294 // [simd.whereexpr]
1341 // [simd.class]
1342 // TODO: implement simd
1344 class simd {
1351 simd() = default;
1352 simd(const simd&) = default;
1353 simd& operator=(const simd&) = default;
1404 simd(const simd<_Up, simd_abi::fixed_size<size()>>& __v) {
1413 simd(_Up&& __rv) {
1425 explicit simd(_Generator&& __g) {
1435 simd(const _Up* __buffer, _Flags) {
1442 // loads [simd.load]
1447 *this = simd(__buffer, _Flags());
1450 // stores [simd.store]
1461 // scalar access [simd.subscr]
1466 // unary operators [simd.unary]
1467 simd& operator++();
1468 simd operator++(int);
1469 simd& operator--();
1470 simd operator--(int);
1472 simd operator~() const;
1473 simd operator+() const;
1474 simd operator-() const;
1476 // binary operators [simd.binary]
1477 friend simd operator+(const simd&, const simd&);
1478 friend simd operator-(const simd&, const simd&);
1479 friend simd operator*(const simd&, const simd&);
1480 friend simd operator/(const simd&, const simd&);
1481 friend simd operator%(const simd&, const simd&);
1482 friend simd operator&(const simd&, const simd&);
1483 friend simd operator|(const simd&, const simd&);
1484 friend simd operator^(const simd&, const simd&);
1485 friend simd operator<<(const simd&, const simd&);
1486 friend simd operator>>(const simd&, const simd&);
1487 friend simd operator<<(const simd&, int);
1488 friend simd operator>>(const simd&, int);
1490 // compound assignment [simd.cassign]
1491 friend simd& operator+=(simd&, const simd&);
1492 friend simd& operator-=(simd&, const simd&);
1493 friend simd& operator*=(simd&, const simd&);
1494 friend simd& operator/=(simd&, const simd&);
1495 friend simd& operator%=(simd&, const simd&);
1497 friend simd& operator&=(simd&, const simd&);
1498 friend simd& operator|=(simd&, const simd&);
1499 friend simd& operator^=(simd&, const simd&);
1500 friend simd& operator<<=(simd&, const simd&);
1501 friend simd& operator>>=(simd&, const simd&);
1502 friend simd& operator<<=(simd&, int);
1503 friend simd& operator>>=(simd&, int);
1505 // compares [simd.comparison]
1506 friend mask_type operator==(const simd&, const simd&);
1507 friend mask_type operator!=(const simd&, const simd&);
1508 friend mask_type operator>=(const simd&, const simd&);
1509 friend mask_type operator<=(const simd&, const simd&);
1510 friend mask_type operator>(const simd&, const simd&);
1511 friend mask_type operator<(const simd&, const simd&);
1514 // [simd.mask.class]
1522 using simd_type = simd<_Tp, _Abi>;
1538 // loads [simd.mask.copy]
1544 // scalar access [simd.mask.subscr]
1548 // unary operators [simd.mask.unary]
1551 // simd_mask binary operators [simd.mask.binary]
1558 // simd_mask compound assignment [simd.mask.cassign]
1563 // simd_mask compares [simd.mask.comparison]