39 template <
typename Lane,
size_t N,
int kPow2>
41 constexpr
Simd() =
default;
43 static_assert((
N & (
N - 1)) == 0 &&
N != 0,
"N must be a power of two");
51 template <
typename NewT>
52 static constexpr
size_t NewN() {
54 return (
N *
sizeof(
T) +
sizeof(NewT) - 1) /
sizeof(NewT);
58 template <
typename NewT>
59 static constexpr
int Pow2Ratio() {
60 return (
sizeof(NewT) >
sizeof(
T))
61 ?
static_cast<int>(
CeilLog2(
sizeof(NewT) /
sizeof(
T)))
62 : -
static_cast<int>(
CeilLog2(
sizeof(
T) /
sizeof(NewT)));
71 template <
typename NewT>
72 using Rebind = Simd<NewT, N, kPow2 + Pow2Ratio<NewT>()>;
74 template <
typename NewT>
79 template <
typename NewT>
102 #if HWY_HAVE_SCALABLE
104 template <
typename T,
size_t N,
int kPow2>
116 return pow2 >= 0 ? (
N << pow2) : (
N >> (-pow2));
120 template <
typename T,
int kPow2>
122 static_assert(-3 <= kPow2 && kPow2 <= 3,
"Fraction must be 1/8 to 8");
123 #if HWY_TARGET == HWY_RVV
126 #elif HWY_HAVE_SCALABLE
129 #elif HWY_TARGET == HWY_SCALAR
137 template <
typename T,
size_t kLimit>
139 static_assert(kLimit != 0,
"Does not make sense to have zero lanes");
143 template <
typename T,
size_t kNumLanes>
145 static_assert(kNumLanes != 0,
"Does not make sense to have zero lanes");
146 static_assert(kNumLanes *
sizeof(T) <=
HWY_MAX_BYTES,
"Too many lanes");
147 #if HWY_TARGET == HWY_SCALAR
149 static_assert(kNumLanes == 1,
"Scalar only supports one lane");
161 template <
typename T,
int kPow2 = 0>
172 template <
typename T,
size_t kLimit>
188 template <
typename T,
size_t kNumLanes>
195 template <
class T,
class D>
206 template <
class T,
class D>
223 #define HWY_IF_UNSIGNED_D(D) HWY_IF_UNSIGNED(TFromD<D>)
224 #define HWY_IF_SIGNED_D(D) HWY_IF_SIGNED(TFromD<D>)
225 #define HWY_IF_FLOAT_D(D) HWY_IF_FLOAT(TFromD<D>)
226 #define HWY_IF_NOT_FLOAT_D(D) HWY_IF_NOT_FLOAT(TFromD<D>)
227 #define HWY_IF_LANE_SIZE_D(D, bytes) HWY_IF_LANE_SIZE(TFromD<D>, bytes)
228 #define HWY_IF_NOT_LANE_SIZE_D(D, bytes) HWY_IF_NOT_LANE_SIZE(TFromD<D>, bytes)
231 #define HWY_IF_LT128_D(D) \
232 hwy::EnableIf<D::kPrivateN * sizeof(TFromD<D>) < 16>* = nullptr
233 #define HWY_IF_GE128_D(D) \
234 hwy::EnableIf<D::kPrivateN * sizeof(TFromD<D>) >= 16>* = nullptr
237 #define HWY_IF_UNSIGNED_V(V) HWY_IF_UNSIGNED(TFromV<V>)
238 #define HWY_IF_SIGNED_V(V) HWY_IF_SIGNED(TFromV<V>)
239 #define HWY_IF_FLOAT_V(V) HWY_IF_FLOAT(TFromV<V>)
240 #define HWY_IF_LANE_SIZE_V(V, bytes) HWY_IF_LANE_SIZE(TFromV<V>, bytes)
244 #define HWY_IF_LANES_ARE(T, V) EnableIf<IsSameT<T, TFromV<V>>::value>* = nullptr
248 return D::kPrivatePow2;
252 #define HWY_IF_POW2_GE(D, MIN) hwy::EnableIf<Pow2<D>(D()) >= (MIN)>* = nullptr
254 #if HWY_HAVE_SCALABLE
278 template <
typename T,
size_t N,
int kPow2>
295 #if HWY_COMPILER_GCC && !HWY_COMPILER_CLANG && \
296 ((defined(_WIN32) || defined(_WIN64)) || HWY_ARCH_ARM_A64)
#define HWY_MIN(a, b)
Definition: base.h:127
#define HWY_INLINE
Definition: base.h:64
#define HWY_MAYBE_UNUSED
Definition: base.h:75
constexpr size_t ScaleByPower(size_t N, int pow2)
Definition: ops/shared-inl.h:115
V VecArg
Definition: ops/shared-inl.h:301
Repartition< MakeWide< TFromD< D > >, D > RepartitionToWide
Definition: ops/shared-inl.h:210
Rebind< MakeUnsigned< TFromD< D > >, D > RebindToUnsigned
Definition: ops/shared-inl.h:201
HWY_INLINE constexpr HWY_MAYBE_UNUSED int Pow2(D)
Definition: ops/shared-inl.h:247
typename detail::CappedTagChecker< T, kLimit >::type CappedTag
Definition: ops/shared-inl.h:173
HWY_API size_t Lanes(Simd< T, N, kPow2 > d)
Definition: arm_sve-inl.h:218
Rebind< MakeFloat< TFromD< D > >, D > RebindToFloat
Definition: ops/shared-inl.h:203
typename D::Twice Twice
Definition: ops/shared-inl.h:220
Rebind< MakeSigned< TFromD< D > >, D > RebindToSigned
Definition: ops/shared-inl.h:199
Repartition< MakeNarrow< TFromD< D > >, D > RepartitionToNarrow
Definition: ops/shared-inl.h:212
typename detail::ScalableTagChecker< T, kPow2 >::type ScalableTag
Definition: ops/shared-inl.h:162
typename D::template Rebind< T > Rebind
Definition: ops/shared-inl.h:196
HWY_INLINE constexpr HWY_MAYBE_UNUSED size_t MaxLanes(D)
Definition: ops/shared-inl.h:271
typename detail::FixedTagChecker< T, kNumLanes >::type FixedTag
Definition: ops/shared-inl.h:189
typename D::Half Half
Definition: ops/shared-inl.h:216
typename D::template Repartition< T > Repartition
Definition: ops/shared-inl.h:207
N
Definition: rvv-inl.h:1656
typename D::T TFromD
Definition: ops/shared-inl.h:192
Definition: aligned_allocator.h:27
constexpr size_t CeilLog2(TI x)
Definition: base.h:700
#define HWY_MAX_BYTES
Definition: set_macros-inl.h:82
#define HWY_LANES(T)
Definition: set_macros-inl.h:83
#define HWY_NAMESPACE
Definition: set_macros-inl.h:80
Definition: ops/shared-inl.h:40
Simd< NewT, N, kPow2 > Rebind
Definition: ops/shared-inl.h:75
static constexpr size_t NewN()
Definition: ops/shared-inl.h:52
static constexpr int kPrivatePow2
Definition: ops/shared-inl.h:49
static constexpr size_t kPrivateN
Definition: ops/shared-inl.h:48
Lane T
Definition: ops/shared-inl.h:42
Definition: ops/shared-inl.h:138
Definition: ops/shared-inl.h:144
Definition: ops/shared-inl.h:121