17#ifndef GPU_UTILS_VCSHIM_H
18#define GPU_UTILS_VCSHIM_H
34constexpr struct VectorSpecialInitializerZero {
36constexpr struct AlignedTag {
40typename T::vector_type& internal_data(T&
v)
46const typename T::vector_type& internal_data(
const T&
v)
54template <
typename V,
typename M>
62 using value_type =
typename V::value_type;
64 WriteMaskVector(V&
v,
const M&
m) : mMask(
m), mVec(
v) {}
66 WriteMaskVector& operator++(
int)
68 for (
size_t i = 0;
i < mVec.size();
i++)
69 mVec[
i] += value_type(mMask[
i]);
73 WriteMaskVector& operator=(
const value_type&
v)
75 for (
size_t i = 0;
i < mVec.size();
i++) {
83inline void prefetchMid(
const void*) {}
84inline void prefetchFar(
const void*) {}
85inline void prefetchForOneRead(
const void*) {}
89template <
typename T,
size_t N>
90class fixed_size_simd_mask
96 bool isNotEmpty()
const {
return mData.any(); }
98 std::bitset<N>::reference operator[](
size_t i) {
return mData[
i]; }
99 bool operator[](
size_t i)
const {
return mData[
i]; }
101 fixed_size_simd_mask operator!()
const
109template <
typename T,
size_t N>
113 std::array<T, N> mData;
116 using vector_type = std::array<T, N>;
117 using value_type =
T;
118 using mask_type = fixed_size_simd_mask<T, N>;
120 static constexpr size_t size() {
return N; }
122 fixed_size_simd() =
default;
123 explicit fixed_size_simd(VectorSpecialInitializerZero) { mData = {}; }
125 template <
typename U>
126 fixed_size_simd(
const fixed_size_simd<U, N>&
w)
128 std::copy_n(internal_data(
w).
begin(), N, mData.begin());
131 fixed_size_simd(
const T* d, AlignedTag) { std::copy_n(d, N, mData.begin()); }
133 T& operator[](
size_t i) {
return mData[
i]; }
134 const T& operator[](
size_t i)
const {
return mData[
i]; }
136 Common::WriteMaskVector<fixed_size_simd, mask_type> operator()(
const mask_type&
m) {
return {*
this,
m}; }
138 fixed_size_simd& operator=(
const T&
v)
140 for (
auto&
x : mData)
147 for (
auto&
x : mData)
152 fixed_size_simd& operator/=(
const T&
v)
154 for (
auto&
x : mData)
159 fixed_size_simd operator/(
const T&
v)
const
168 for (
size_t i = 0;
i < N;
i++)
169 m[
i] = mData[
i] ==
v;
173 mask_type
operator!=(
const T&
v)
const {
return !(*
this ==
v); }
175 friend vector_type& internal_data<>(fixed_size_simd&
x);
176 friend const vector_type& internal_data<>(
const fixed_size_simd&
x);
180V
max(
const V&
a,
const V&
b)
183 for (
size_t i = 0;
i <
a.size();
i++)
184 o[
i] = std::max(
a[
i],
b[
i]);
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
GLubyte GLubyte GLubyte GLubyte w
auto operator+=(std::string &lhs, StringRef rhs) -> std::string &
bool operator!=(const DsChannelId &a, const DsChannelId &b)
Enum< T >::Iterator begin(Enum< T >)