20#if defined(HIGHWAY_HWY_OPS_SHARED_TOGGLE) == \
21 defined(HWY_TARGET_TOGGLE)
22#ifdef HIGHWAY_HWY_OPS_SHARED_TOGGLE
23#undef HIGHWAY_HWY_OPS_SHARED_TOGGLE
25#define HIGHWAY_HWY_OPS_SHARED_TOGGLE
51template <
typename Lane,
size_t N,
int kPow2>
53 constexpr Simd() =
default;
55 static_assert((
N & (
N - 1)) == 0 &&
N != 0,
"N must be a power of two");
63 template <
typename NewT>
64 static constexpr size_t NewN() {
66 return (
N *
sizeof(
T) +
sizeof(NewT) - 1) /
sizeof(NewT);
70 template <
typename NewT>
71 static constexpr int Pow2Ratio() {
72 return (
sizeof(NewT) >
sizeof(
T))
73 ?
static_cast<int>(
CeilLog2(
sizeof(NewT) /
sizeof(
T)))
74 : -static_cast<int>(
CeilLog2(sizeof(
T) / sizeof(NewT)));
83 template <
typename NewT>
86 template <
typename NewT>
91 template <
typename NewT>
114template <
typename T,
size_t N,
int kPow2>
124#if HWY_TARGET == HWY_RVV
125 return pow2 >= 0 ? (
N << pow2) : (
N >> (-pow2));
127 return pow2 >= 0 ?
N : (
N >> (-pow2));
132template <
typename T,
int kPow2>
134 static_assert(-3 <= kPow2 && kPow2 <= 3,
"Fraction must be 1/8 to 8");
135#if HWY_TARGET == HWY_RVV
138#elif HWY_HAVE_SCALABLE
141#elif HWY_TARGET == HWY_SCALAR
149template <
typename T,
size_t kLimit>
151 static_assert(kLimit != 0,
"Does not make sense to have zero lanes");
158template <
typename T,
size_t kNumLanes>
160 static_assert(kNumLanes != 0,
"Does not make sense to have zero lanes");
161 static_assert(kNumLanes <=
HWY_LANES(T),
"Too many lanes");
172template <
typename T,
int kPow2 = 0>
183template <
typename T,
size_t kLimit>
199template <
typename T,
size_t kNumLanes>
206template <
class T,
class D>
217template <
class T,
class D>
246#define HWY_IF_UNSIGNED_D(D) HWY_IF_UNSIGNED(TFromD<D>)
247#define HWY_IF_SIGNED_D(D) HWY_IF_SIGNED(TFromD<D>)
248#define HWY_IF_FLOAT_D(D) HWY_IF_FLOAT(TFromD<D>)
249#define HWY_IF_NOT_FLOAT_D(D) HWY_IF_NOT_FLOAT(TFromD<D>)
250#define HWY_IF_LANE_SIZE_D(D, bytes) HWY_IF_LANE_SIZE(TFromD<D>, bytes)
251#define HWY_IF_NOT_LANE_SIZE_D(D, bytes) HWY_IF_NOT_LANE_SIZE(TFromD<D>, bytes)
252#define HWY_IF_LANE_SIZE_ONE_OF_D(D, bit_array) \
253 HWY_IF_LANE_SIZE_ONE_OF(TFromD<D>, bit_array)
256#define HWY_IF_LT128_D(D) \
257 hwy::EnableIf<D::kPrivateN * sizeof(TFromD<D>) < 16>* = nullptr
258#define HWY_IF_GE128_D(D) \
259 hwy::EnableIf<D::kPrivateN * sizeof(TFromD<D>) >= 16>* = nullptr
262#define HWY_IF_UNSIGNED_V(V) HWY_IF_UNSIGNED(TFromV<V>)
263#define HWY_IF_SIGNED_V(V) HWY_IF_SIGNED(TFromV<V>)
264#define HWY_IF_FLOAT_V(V) HWY_IF_FLOAT(TFromV<V>)
265#define HWY_IF_LANE_SIZE_V(V, bytes) HWY_IF_LANE_SIZE(TFromV<V>, bytes)
266#define HWY_IF_NOT_LANE_SIZE_V(V, bytes) HWY_IF_NOT_LANE_SIZE(TFromV<V>, bytes)
267#define HWY_IF_LANE_SIZE_ONE_OF_V(V, bit_array) \
268 HWY_IF_LANE_SIZE_ONE_OF(TFromV<V>, bit_array)
272 return D::kPrivatePow2;
276#define HWY_IF_POW2_GE(D, MIN) hwy::EnableIf<Pow2<D>(D()) >= (MIN)>* = nullptr
302template <
typename T,
size_t N,
int kPow2>
319#if HWY_COMPILER_GCC_ACTUAL && (HWY_OS_WIN || HWY_ARCH_ARM_A64)
#define HWY_MIN(a, b)
Definition base.h:134
#define HWY_INLINE
Definition base.h:70
#define HWY_MAYBE_UNUSED
Definition base.h:82
constexpr size_t ScaleByPower(size_t N, int pow2)
Definition ops/shared-inl.h:123
constexpr bool IsFull(Simd< T, N, kPow2 >)
Definition ops/shared-inl.h:115
typename D::template Rebind< T > Rebind
Definition ops/shared-inl.h:207
V VecArg
Definition ops/shared-inl.h:324
HWY_INLINE HWY_MAYBE_UNUSED constexpr size_t MaxLanes(D)
Definition ops/shared-inl.h:295
Repartition< MakeWide< TFromD< D > >, D > RepartitionToWide
Definition ops/shared-inl.h:221
typename D::T TFromD
Definition ops/shared-inl.h:203
HWY_API constexpr size_t Lanes(Simd< T, N, kPow2 >)
Definition arm_sve-inl.h:243
Rebind< MakeUnsigned< TFromD< D > >, D > RebindToUnsigned
Definition ops/shared-inl.h:212
typename detail::CappedTagChecker< T, kLimit >::type CappedTag
Definition ops/shared-inl.h:184
Repartition< MakeNarrow< TFromD< D > >, D > RepartitionToNarrow
Definition ops/shared-inl.h:223
Rebind< MakeSigned< TFromD< D > >, D > RebindToSigned
Definition ops/shared-inl.h:210
typename detail::ScalableTagChecker< T, kPow2 >::type ScalableTag
Definition ops/shared-inl.h:173
typename D::Half Half
Definition ops/shared-inl.h:227
HWY_INLINE HWY_MAYBE_UNUSED constexpr int Pow2(D)
Definition ops/shared-inl.h:271
typename detail::FixedTagChecker< T, kNumLanes >::type FixedTag
Definition ops/shared-inl.h:200
N
Definition rvv-inl.h:1998
Rebind< MakeFloat< TFromD< D > >, D > RebindToFloat
Definition ops/shared-inl.h:214
typename D::Twice Twice
Definition ops/shared-inl.h:231
typename D::template Repartition< T > Repartition
Definition ops/shared-inl.h:218
Definition aligned_allocator.h:27
constexpr size_t FloorLog2(TI x)
Definition base.h:892
constexpr size_t CeilLog2(TI x)
Definition base.h:899
#define HWY_LANES(T)
Definition set_macros-inl.h:85
#define HWY_NAMESPACE
Definition set_macros-inl.h:82
Definition ops/shared-inl.h:52
Simd< NewT, N, kPow2 > Rebind
Definition ops/shared-inl.h:87
static constexpr size_t NewN()
Definition ops/shared-inl.h:64
static constexpr int kPrivatePow2
Definition ops/shared-inl.h:61
static constexpr size_t kPrivateN
Definition ops/shared-inl.h:60
Lane T
Definition ops/shared-inl.h:54
Definition ops/shared-inl.h:150
static constexpr size_t kLimitPow2
Definition ops/shared-inl.h:154
Definition ops/shared-inl.h:159
Definition ops/shared-inl.h:133