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 template <
typename T,
size_t N,
int kPow2>
112 #if HWY_TARGET == HWY_RVV
113 return pow2 >= 0 ? (
N << pow2) : (
N >> (-pow2));
115 return pow2 >= 0 ?
N : (
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");
146 template <
typename T,
size_t kNumLanes>
148 static_assert(kNumLanes != 0,
"Does not make sense to have zero lanes");
149 static_assert(kNumLanes <=
HWY_LANES(T),
"Too many lanes");
160 template <
typename T,
int kPow2 = 0>
171 template <
typename T,
size_t kLimit>
187 template <
typename T,
size_t kNumLanes>
194 template <
class T,
class D>
205 template <
class T,
class D>
221 template <
typename T>
224 template <
typename T>
227 template <
typename T>
231 #define HWY_IF_UNSIGNED_D(D) HWY_IF_UNSIGNED(TFromD<D>)
232 #define HWY_IF_SIGNED_D(D) HWY_IF_SIGNED(TFromD<D>)
233 #define HWY_IF_FLOAT_D(D) HWY_IF_FLOAT(TFromD<D>)
234 #define HWY_IF_NOT_FLOAT_D(D) HWY_IF_NOT_FLOAT(TFromD<D>)
235 #define HWY_IF_LANE_SIZE_D(D, bytes) HWY_IF_LANE_SIZE(TFromD<D>, bytes)
236 #define HWY_IF_NOT_LANE_SIZE_D(D, bytes) HWY_IF_NOT_LANE_SIZE(TFromD<D>, bytes)
239 #define HWY_IF_LT128_D(D) \
240 hwy::EnableIf<D::kPrivateN * sizeof(TFromD<D>) < 16>* = nullptr
241 #define HWY_IF_GE128_D(D) \
242 hwy::EnableIf<D::kPrivateN * sizeof(TFromD<D>) >= 16>* = nullptr
245 #define HWY_IF_UNSIGNED_V(V) HWY_IF_UNSIGNED(TFromV<V>)
246 #define HWY_IF_SIGNED_V(V) HWY_IF_SIGNED(TFromV<V>)
247 #define HWY_IF_FLOAT_V(V) HWY_IF_FLOAT(TFromV<V>)
248 #define HWY_IF_LANE_SIZE_V(V, bytes) HWY_IF_LANE_SIZE(TFromV<V>, bytes)
249 #define HWY_IF_NOT_LANE_SIZE_V(V, bytes) HWY_IF_NOT_LANE_SIZE(TFromV<V>, bytes)
253 return D::kPrivatePow2;
257 #define HWY_IF_POW2_GE(D, MIN) hwy::EnableIf<Pow2<D>(D()) >= (MIN)>* = nullptr
259 #if HWY_HAVE_SCALABLE
283 template <
typename T,
size_t N,
int kPow2>
300 #if HWY_COMPILER_GCC && !HWY_COMPILER_CLANG && \
301 ((defined(_WIN32) || defined(_WIN64)) || HWY_ARCH_ARM_A64)
#define HWY_MIN(a, b)
Definition: base.h:125
#define HWY_INLINE
Definition: base.h:62
#define HWY_MAYBE_UNUSED
Definition: base.h:73
constexpr size_t ScaleByPower(size_t N, int pow2)
Definition: ops/shared-inl.h:111
constexpr bool IsFull(Simd< T, N, kPow2 >)
Definition: ops/shared-inl.h:103
V VecArg
Definition: ops/shared-inl.h:306
constexpr HWY_API size_t Lanes(Simd< T, N, kPow2 >)
Definition: arm_sve-inl.h:236
Repartition< MakeWide< TFromD< D > >, D > RepartitionToWide
Definition: ops/shared-inl.h:209
Rebind< MakeUnsigned< TFromD< D > >, D > RebindToUnsigned
Definition: ops/shared-inl.h:200
HWY_INLINE constexpr HWY_MAYBE_UNUSED int Pow2(D)
Definition: ops/shared-inl.h:252
typename detail::CappedTagChecker< T, kLimit >::type CappedTag
Definition: ops/shared-inl.h:172
Rebind< MakeFloat< TFromD< D > >, D > RebindToFloat
Definition: ops/shared-inl.h:202
typename D::Twice Twice
Definition: ops/shared-inl.h:219
Rebind< MakeSigned< TFromD< D > >, D > RebindToSigned
Definition: ops/shared-inl.h:198
Repartition< MakeNarrow< TFromD< D > >, D > RepartitionToNarrow
Definition: ops/shared-inl.h:211
typename detail::ScalableTagChecker< T, kPow2 >::type ScalableTag
Definition: ops/shared-inl.h:161
typename D::template Rebind< T > Rebind
Definition: ops/shared-inl.h:195
HWY_INLINE constexpr HWY_MAYBE_UNUSED size_t MaxLanes(D)
Definition: ops/shared-inl.h:276
typename detail::FixedTagChecker< T, kNumLanes >::type FixedTag
Definition: ops/shared-inl.h:188
typename D::Half Half
Definition: ops/shared-inl.h:215
typename D::template Repartition< T > Repartition
Definition: ops/shared-inl.h:206
N
Definition: rvv-inl.h:1742
typename D::T TFromD
Definition: ops/shared-inl.h:191
Definition: aligned_allocator.h:27
constexpr size_t FloorLog2(TI x)
Definition: base.h:770
constexpr size_t CeilLog2(TI x)
Definition: base.h:777
#define HWY_LANES(T)
Definition: set_macros-inl.h:85
#define HWY_NAMESPACE
Definition: set_macros-inl.h:82
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
static constexpr size_t kLimitPow2
Definition: ops/shared-inl.h:142
Definition: ops/shared-inl.h:147
Definition: ops/shared-inl.h:121