Files
2025-10-25 03:02:53 +03:00

183 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[simd.expos.defn]
# 29 Numerics library [[numerics]](./#numerics)
## 29.10 Data-parallel types [[simd]](simd#expos.defn)
### 29.10.2 Exposition-only types, variables, and concepts [[simd.expos]](simd.expos#defn)
#### 29.10.2.1 Exposition-only helpers [simd.expos.defn]
[🔗](#itemdecl:1)
`using simd-size-type = see below;
`
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L16280)
*simd-size-type* is an alias for a signed integer type[.](#1.sentence-1)
[🔗](#itemdecl:2)
`template<size_t Bytes> using integer-from = see below;
`
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L16289)
*integer-from*<Bytes> is an alias for a signed integer typeT such that sizeof(T) equals Bytes[.](#2.sentence-1)
[🔗](#itemdecl:3)
`template<class T, class Abi>
constexpr simd-size-type simd-size-v = see below;
`
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L16300)
*simd-size-v*<T, Abi> denotes the width of basic_vec<T,
Abi> if the specialization basic_vec<T, Abi> is enabled, or 0 otherwise[.](#3.sentence-1)
[🔗](#itemdecl:4)
`template<class T> constexpr size_t mask-element-size = see below;
`
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L16311)
*mask-element-size*<basic_mask<Bytes, Abi>> has the valueBytes[.](#4.sentence-1)
[🔗](#itemdecl:5)
`template<class T> using deduced-vec-t = see below;
`
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L16321)
Let x denote an lvalue of type const T[.](#5.sentence-1)
[6](#6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L16324)
*deduced-vec-t*<T> is an alias for
- [(6.1)](#6.1)
decltype(x + x), if the type of x + x is an enabled
specialization of basic_vec; otherwise
- [(6.2)](#6.2)
void[.](#6.sentence-1)
[🔗](#itemdecl:6)
`template<class V, class T> using make-compatible-simd-t = see below;
`
[7](#7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L16340)
Let x denote an lvalue of type const T[.](#7.sentence-1)
[8](#8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L16343)
*make-compatible-simd-t*<V, T> is an alias for
- [(8.1)](#8.1)
*deduced-vec-t*<T>, if that type is not void,
otherwise
- [(8.2)](#8.2)
vec<decltype(x + x), V::size()>[.](#8.sentence-1)
[🔗](#itemdecl:7)
`template<class... Ts>
requires [math-floating-point](simd.expos#concept:math-floating-point "29.10.2Exposition-only types, variables, and concepts[simd.expos]")<Ts...>
using math-common-simd-t = see below;
`
[9](#9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L16361)
Let T0 denote Ts...[0][.](#9.sentence-1)
Let T1 denote Ts...[1][.](#9.sentence-2)
Let TRest denote a pack such that T0, T1, TRest... is equivalent
to Ts...[.](#9.sentence-3)
[10](#10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L16367)
Let *math-common-simd-t*<Ts...> be an alias for
- [(10.1)](#10.1)
*deduced-vec-t*<T0>, if sizeof...(Ts) equals 1;
otherwise
- [(10.2)](#10.2)
common_type_t<*deduced-vec-t*<T0>, *deduced-vec-t*<T1>>, if sizeof...(Ts) equals 2 and [*math-floating-point*](simd.expos#concept:math-floating-point "29.10.2Exposition-only types, variables, and concepts[simd.expos]")<T0> &&[*math-floating-point*](simd.expos#concept:math-floating-point "29.10.2Exposition-only types, variables, and concepts[simd.expos]")<T1> is true; otherwise
- [(10.3)](#10.3)
common_type_t<*deduced-vec-t*<T0>, T1>, if sizeof...(Ts) equals 2 and *math-floating-point*<T0> is true; otherwise
- [(10.4)](#10.4)
common_type_t<T0, *deduced-vec-t*<T1>>, if sizeof...(Ts) equals 2; otherwise
- [(10.5)](#10.5)
common_type_t<*math-common-simd-t*<T0, T1>, TRest...>, if *math-common-simd-t*<T0, T1> is valid and denotes a type;
otherwise
- [(10.6)](#10.6)
common_type_t<*math-common-simd-t*<TRest...>, T0, T1>[.](#10.sentence-1)
[🔗](#concept:reduction-binary-operation)
`template<class BinaryOperation, class T>
concept [reduction-binary-operation](#concept:reduction-binary-operation "29.10.2.1Exposition-only helpers[simd.expos.defn]") =
requires (const BinaryOperation binary_op, const vec<T, 1> v) {
{ binary_op(v, v) } -> [same_as](concept.same#concept:same_as "18.4.2Concept same_­as[concept.same]")<vec<T, 1>>;
};
`
[11](#11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L16404)
Types BinaryOperation and T model[*reduction-binary-operation*](#concept:reduction-binary-operation "29.10.2.1Exposition-only helpers[simd.expos.defn]")<BinaryOperation, T> only if:
- [(11.1)](#11.1)
BinaryOperation is a binary element-wise operation and the
operation is commutative[.](#11.1.sentence-1)
- [(11.2)](#11.2)
An object of type BinaryOperation can be invoked with two
arguments of type basic_vec<T, Abi>, with unspecified ABI tagAbi, returning a basic_vec<T, Abi>[.](#11.2.sentence-1)