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 >)