17#ifndef GPU_UTILS_VCSHIM_H
18#define GPU_UTILS_VCSHIM_H
35constexpr struct VectorSpecialInitializerZero {
37constexpr struct AlignedTag {
41typename T::vector_type& internal_data(T&
v)
47const typename T::vector_type& internal_data(
const T&
v)
55template <
typename V,
typename M>
63 using vector_type = V;
64 using value_type =
typename V::value_type;
66 WriteMaskVector(V&
v,
const M&
m) : mMask(
m), mVec(
v) {}
68 WriteMaskVector& operator++(
int)
70 for (
size_t i = 0;
i < mVec.size();
i++)
71 mVec[
i] += value_type(mMask[
i]);
75 WriteMaskVector& operator=(
const value_type&
v)
77 for (
size_t i = 0;
i < mVec.size();
i++) {
84 WriteMaskVector& operator=(
const vector_type&
v)
86 for (
size_t i = 0;
i < mVec.size();
i++) {
94inline void prefetchMid(
const void*) {}
95inline void prefetchFar(
const void*) {}
96inline void prefetchForOneRead(
const void*) {}
101class fixed_size_simd_mask
104 std::bitset<N> mData;
107 bool isNotEmpty()
const {
return mData.any(); }
109 typename std::bitset<N>::reference operator[](
size_t i) {
return mData[
i]; }
110 bool operator[](
size_t i)
const {
return mData[
i]; }
112 fixed_size_simd_mask operator!()
const
119 fixed_size_simd_mask operator&&(
const fixed_size_simd_mask& o)
const
127template <
typename T,
size_t N>
131 std::array<T, N> mData;
134 using vector_type = std::array<T, N>;
135 using value_type =
T;
136 using mask_type = fixed_size_simd_mask<N>;
138 static constexpr size_t size() {
return N; }
140 fixed_size_simd() =
default;
141 explicit fixed_size_simd(VectorSpecialInitializerZero) { mData = {}; }
143 template <
typename U>
144 fixed_size_simd(
const fixed_size_simd<U, N>&
w)
146 std::copy_n(internal_data(
w).
begin(), N, mData.begin());
149 fixed_size_simd(
const T* d, AlignedTag) { std::copy_n(d, N, mData.begin()); }
151 fixed_size_simd(
const T&
x) { mData.fill(
x); }
153 T& operator[](
size_t i) {
return mData[
i]; }
154 const T& operator[](
size_t i)
const {
return mData[
i]; }
156 Common::WriteMaskVector<fixed_size_simd, mask_type> operator()(
const mask_type&
m) {
return {*
this,
m}; }
158 fixed_size_simd& operator=(
const T&
v)
160 for (
auto&
x : mData)
167 for (
auto&
x : mData)
172 template <
typename U>
173 fixed_size_simd&
operator+=(
const fixed_size_simd<U, N>&
v)
175 for (
size_t i = 0;
i < N;
i++)
180 fixed_size_simd& operator-=(
const T&
v)
182 for (
auto&
x : mData)
187 template <
typename U>
188 fixed_size_simd& operator-=(
const fixed_size_simd<U, N>&
v)
190 for (
size_t i = 0;
i < N;
i++)
195 fixed_size_simd& operator*=(
const T&
v)
197 for (
auto&
x : mData)
202 template <
typename U>
203 fixed_size_simd& operator*=(
const fixed_size_simd<U, N>&
v)
205 for (
size_t i = 0;
i < N;
i++)
210 fixed_size_simd& operator/=(
const T&
v)
212 for (
auto&
x : mData)
217 template <
typename U>
218 fixed_size_simd& operator/=(
const fixed_size_simd<U, N>&
v)
220 for (
size_t i = 0;
i < N;
i++)
228 for (
size_t i = 0;
i < N;
i++)
229 m[
i] = mData[
i] ==
v;
233 mask_type
operator!=(
const T&
v)
const {
return !(*
this ==
v); }
238 for (
size_t i = 0;
i < N;
i++)
246 for (
size_t i = 0;
i < N;
i++)
247 m[
i] = mData[
i] >=
v;
254 for (
size_t i = 0;
i < N;
i++)
259 friend vector_type& internal_data<>(fixed_size_simd&
x);
260 friend const vector_type& internal_data<>(
const fixed_size_simd&
x);
264struct is_fixed_size_simd : std::false_type {
267template <
typename T,
size_t N>
268struct is_fixed_size_simd<fixed_size_simd<
T, N>> : std::true_type {
271template <
typename S,
typename T>
272using EnableIfScalar =
typename std::enable_if_t<
273 !is_fixed_size_simd<typename std::decay_t<S>>
::value && std::is_convertible_v<S, T>,
int>;
275template <
typename T,
typename U,
size_t N>
276fixed_size_simd<T, N>
operator+(fixed_size_simd<T, N>
a,
const fixed_size_simd<U, N>&
b)
281template <
typename T,
size_t N,
typename S, EnableIfScalar<S, T> = 0>
282fixed_size_simd<T, N>
operator+(fixed_size_simd<T, N>
a,
const S&
b)
284 return a +=
static_cast<T>(
b);
287template <
typename S,
typename T,
size_t N, EnableIfScalar<S, T> = 0>
288fixed_size_simd<T, N>
operator+(
const S&
a, fixed_size_simd<T, N>
b)
290 return b +=
static_cast<T>(
a);
293template <
typename T,
typename U,
size_t N>
294fixed_size_simd<T, N>
operator-(fixed_size_simd<T, N>
a,
const fixed_size_simd<U, N>&
b)
299template <
typename T,
size_t N,
typename S, EnableIfScalar<S, T> = 0>
300fixed_size_simd<T, N>
operator-(fixed_size_simd<T, N>
a,
const S&
b)
302 return a -=
static_cast<T>(
b);
305template <
typename S,
typename T,
size_t N, EnableIfScalar<S, T> = 0>
306fixed_size_simd<T, N>
operator-(
const S&
a,
const fixed_size_simd<T, N>&
b)
308 fixed_size_simd<T, N> o;
309 for (
size_t i = 0;
i < N;
i++)
310 o[
i] =
static_cast<T>(
a) -
b[
i];
314template <
typename T,
typename U,
size_t N>
315fixed_size_simd<T, N>
operator*(fixed_size_simd<T, N>
a,
const fixed_size_simd<U, N>&
b)
320template <
typename T,
size_t N,
typename S, EnableIfScalar<S, T> = 0>
321fixed_size_simd<T, N>
operator*(fixed_size_simd<T, N>
a,
const S&
b)
323 return a *=
static_cast<T>(
b);
326template <
typename S,
typename T,
size_t N, EnableIfScalar<S, T> = 0>
327fixed_size_simd<T, N>
operator*(
const S&
a, fixed_size_simd<T, N>
b)
329 return b *=
static_cast<T>(
a);
332template <
typename T,
typename U,
size_t N>
333fixed_size_simd<T, N> operator/(fixed_size_simd<T, N>
a,
const fixed_size_simd<U, N>&
b)
338template <
typename T,
size_t N,
typename S, EnableIfScalar<S, T> = 0>
339fixed_size_simd<T, N> operator/(fixed_size_simd<T, N>
a,
const S&
b)
341 return a /=
static_cast<T>(
b);
344template <
typename S,
typename T,
size_t N, EnableIfScalar<S, T> = 0>
345fixed_size_simd<T, N> operator/(
const S&
a,
const fixed_size_simd<T, N>&
b)
347 fixed_size_simd<T, N> o;
348 for (
size_t i = 0;
i < N;
i++)
349 o[
i] =
static_cast<T>(
a) /
b[
i];
354V
max(
const V&
a,
const V&
b)
357 for (
size_t i = 0;
i <
a.size();
i++)
358 o[
i] = std::max(
a[
i],
b[
i]);
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * value
GLboolean GLboolean GLboolean GLboolean a
GLubyte GLubyte GLubyte GLubyte w
auto operator+=(std::string &lhs, StringRef rhs) -> std::string &
bool operator<(EntryPM const &entryPM1, EntryPM const &entryPM2)
MultPolicyGPU< T, R1, R2 >::RepType operator*(const SMatrixGPU< T, D1, D, R1 > &lhs, const SMatrixGPU< T, D, D2, R2 > &rhs)
Vertex< T > operator-(const Vertex< T > &a, const Vertex< T > &b)
bool operator>=(const DsChannelId &a, const DsChannelId &b)
bool operator>(const DsChannelId &a, const DsChannelId &b)
bool operator!=(const DsChannelId &a, const DsChannelId &b)
Enum< T >::Iterator begin(Enum< T >)