34 template <
typename Lane,
size_t N>
36 constexpr
Simd() =
default;
38 static_assert((N & (N - 1)) == 0 && N != 0,
"N must be a power of two");
44 template <
typename NewLane>
49 template <
typename NewLane>
51 Simd<NewLane, (N *
sizeof(Lane) +
sizeof(NewLane) - 1) /
sizeof(NewLane)>;
68 #if HWY_TARGET == HWY_RVV
70 return pow2 >= 0 ? (N << pow2) :
HWY_MAX(1, (N >> (-pow2)));
78 template <
typename T,
int kPow2>
80 static_assert(-3 <= kPow2 && kPow2 <= 3,
"Fraction must be 1/8 to 8");
84 template <
typename T,
size_t kLimit>
86 static_assert(kLimit != 0,
"Does not make sense to have zero lanes");
90 template <
typename T,
size_t kNumLanes>
92 static_assert(kNumLanes != 0,
"Does not make sense to have zero lanes");
93 static_assert(kNumLanes *
sizeof(T) <=
HWY_MAX_BYTES,
"Too many lanes");
94 #if HWY_TARGET == HWY_SCALAR
96 static_assert(kNumLanes == 1,
"Scalar only supports one lane");
108 template <
typename T,
int kPow2 = 0>
119 template <
typename T,
size_t kLimit>
136 template <
typename T,
size_t kNumLanes>
143 template <
class T,
class D>
154 template <
class T,
class D>
171 #define HWY_IF_UNSIGNED_D(D) HWY_IF_UNSIGNED(TFromD<D>)
172 #define HWY_IF_SIGNED_D(D) HWY_IF_SIGNED(TFromD<D>)
173 #define HWY_IF_FLOAT_D(D) HWY_IF_FLOAT(TFromD<D>)
174 #define HWY_IF_NOT_FLOAT_D(D) HWY_IF_NOT_FLOAT(TFromD<D>)
175 #define HWY_IF_LANE_SIZE_D(D, bytes) HWY_IF_LANE_SIZE(TFromD<D>, bytes)
176 #define HWY_IF_NOT_LANE_SIZE_D(D, bytes) HWY_IF_NOT_LANE_SIZE(TFromD<D>, bytes)
179 #define HWY_IF_UNSIGNED_V(V) HWY_IF_UNSIGNED(TFromV<V>)
180 #define HWY_IF_SIGNED_V(V) HWY_IF_SIGNED(TFromV<V>)
181 #define HWY_IF_FLOAT_V(V) HWY_IF_FLOAT(TFromV<V>)
182 #define HWY_IF_LANE_SIZE_V(V, bytes) HWY_IF_LANE_SIZE(TFromV<V>, bytes)
186 #define HWY_IF_LANES_ARE(T, V) \
187 EnableIf<IsSameT<T, TFromD<DFromV<V>>>::value>* = nullptr
193 template <
typename T,
size_t N>
199 #if HWY_TARGET != HWY_RVV && HWY_TARGET != HWY_SVE2 && HWY_TARGET != HWY_SVE
203 template <
typename T,
size_t N>
220 #if HWY_COMPILER_GCC && !HWY_COMPILER_CLANG && \
221 (defined(_WIN32) || defined(_WIN64))
#define HWY_MAX(a, b)
Definition: base.h:123
#define HWY_MIN(a, b)
Definition: base.h:122
#define HWY_INLINE
Definition: base.h:59
#define HWY_MAYBE_UNUSED
Definition: base.h:70
constexpr size_t ScaleByPower(size_t N, int pow2)
Definition: shared-inl.h:67
V VecArg
Definition: shared-inl.h:226
Repartition< MakeWide< TFromD< D > >, D > RepartitionToWide
Definition: shared-inl.h:158
Rebind< MakeUnsigned< TFromD< D > >, D > RebindToUnsigned
Definition: shared-inl.h:149
constexpr HWY_API size_t Lanes(Simd< T, N >)
Definition: arm_sve-inl.h:226
typename detail::CappedTagChecker< T, kLimit >::type CappedTag
Definition: shared-inl.h:120
Rebind< MakeFloat< TFromD< D > >, D > RebindToFloat
Definition: shared-inl.h:151
typename D::Twice Twice
Definition: shared-inl.h:168
Rebind< MakeSigned< TFromD< D > >, D > RebindToSigned
Definition: shared-inl.h:147
Repartition< MakeNarrow< TFromD< D > >, D > RepartitionToNarrow
Definition: shared-inl.h:160
typename detail::ScalableTagChecker< T, kPow2 >::type ScalableTag
Definition: shared-inl.h:109
typename D::template Rebind< T > Rebind
Definition: shared-inl.h:144
HWY_INLINE constexpr HWY_MAYBE_UNUSED size_t MaxLanes(Simd< T, N >)
Definition: shared-inl.h:194
typename detail::FixedTagChecker< T, kNumLanes >::type FixedTag
Definition: shared-inl.h:137
typename D::Half Half
Definition: shared-inl.h:164
typename D::template Repartition< T > Repartition
Definition: shared-inl.h:155
typename D::T TFromD
Definition: shared-inl.h:140
Definition: aligned_allocator.h:23
#define HWY_MAX_BYTES
Definition: set_macros-inl.h:79
#define HWY_LANES(T)
Definition: set_macros-inl.h:80
#define HWY_NAMESPACE
Definition: set_macros-inl.h:77
Definition: shared-inl.h:35
Lane T
Definition: shared-inl.h:37
Definition: shared-inl.h:85
Definition: shared-inl.h:91
Definition: shared-inl.h:79