28 #ifndef VC_COMMON_ALIASINGENTRYHELPER_H_
29 #define VC_COMMON_ALIASINGENTRYHELPER_H_
33 namespace Vc_VERSIONED_NAMESPACE
38 template<
class StorageType>
class AliasingEntryHelper
41 typedef typename StorageType::EntryType T;
43 StorageType *
const m_storage;
46 Vc_ALWAYS_INLINE AliasingEntryHelper(StorageType *d,
int index) : m_storage(d), m_index(index) {}
47 Vc_ALWAYS_INLINE AliasingEntryHelper(
const AliasingEntryHelper &) =
default;
48 Vc_ALWAYS_INLINE AliasingEntryHelper(AliasingEntryHelper &&) =
default;
49 Vc_ALWAYS_INLINE AliasingEntryHelper &operator=(
const AliasingEntryHelper &rhs) {
50 m_storage->assign(m_index, rhs);
54 Vc_ALWAYS_INLINE AliasingEntryHelper &operator =(T x) { m_storage->assign(m_index, x);
return *
this; }
55 Vc_ALWAYS_INLINE AliasingEntryHelper &operator +=(T x) { m_storage->assign(m_index, m_storage->m(m_index) + x);
return *
this; }
56 Vc_ALWAYS_INLINE AliasingEntryHelper &operator -=(T x) { m_storage->assign(m_index, m_storage->m(m_index) - x);
return *
this; }
57 Vc_ALWAYS_INLINE AliasingEntryHelper &operator /=(T x) { m_storage->assign(m_index, m_storage->m(m_index) / x);
return *
this; }
58 Vc_ALWAYS_INLINE AliasingEntryHelper &operator *=(T x) { m_storage->assign(m_index, m_storage->m(m_index) * x);
return *
this; }
59 Vc_ALWAYS_INLINE AliasingEntryHelper &operator |=(T x) { m_storage->assign(m_index, m_storage->m(m_index) | x);
return *
this; }
60 Vc_ALWAYS_INLINE AliasingEntryHelper &operator &=(T x) { m_storage->assign(m_index, m_storage->m(m_index) & x);
return *
this; }
61 Vc_ALWAYS_INLINE AliasingEntryHelper &operator ^=(T x) { m_storage->assign(m_index, m_storage->m(m_index) ^ x);
return *
this; }
62 Vc_ALWAYS_INLINE AliasingEntryHelper &operator %=(T x) { m_storage->assign(m_index, m_storage->m(m_index) % x);
return *
this; }
63 Vc_ALWAYS_INLINE AliasingEntryHelper &operator<<=(T x) { m_storage->assign(m_index, m_storage->m(m_index)<< x);
return *
this; }
64 Vc_ALWAYS_INLINE AliasingEntryHelper &operator>>=(T x) { m_storage->assign(m_index, m_storage->m(m_index)>> x);
return *
this; }
65 #define m_data m_storage->read(m_index)
67 typedef T A Vc_MAY_ALIAS;
71 Vc_ALWAYS_INLINE AliasingEntryHelper(T2 &d) : m_data(reinterpret_cast<A &>(d)) {}
73 Vc_ALWAYS_INLINE AliasingEntryHelper(A &d) : m_data(d) {}
74 Vc_ALWAYS_INLINE AliasingEntryHelper &operator=(
const AliasingEntryHelper &rhs) {
79 Vc_ALWAYS_INLINE AliasingEntryHelper &operator =(T x) { m_data = x;
return *
this; }
80 Vc_ALWAYS_INLINE AliasingEntryHelper &operator+=(T x) { m_data += x;
return *
this; }
81 Vc_ALWAYS_INLINE AliasingEntryHelper &operator-=(T x) { m_data -= x;
return *
this; }
82 Vc_ALWAYS_INLINE AliasingEntryHelper &operator/=(T x) { m_data /= x;
return *
this; }
83 Vc_ALWAYS_INLINE AliasingEntryHelper &operator*=(T x) { m_data *= x;
return *
this; }
84 Vc_ALWAYS_INLINE AliasingEntryHelper &operator|=(T x) { m_data |= x;
return *
this; }
85 Vc_ALWAYS_INLINE AliasingEntryHelper &operator&=(T x) { m_data &= x;
return *
this; }
86 Vc_ALWAYS_INLINE AliasingEntryHelper &operator^=(T x) { m_data ^= x;
return *
this; }
87 Vc_ALWAYS_INLINE AliasingEntryHelper &operator%=(T x) { m_data %= x;
return *
this; }
88 Vc_ALWAYS_INLINE AliasingEntryHelper &operator<<=(T x) { m_data <<= x;
return *
this; }
89 Vc_ALWAYS_INLINE AliasingEntryHelper &operator>>=(T x) { m_data >>= x;
return *
this; }
92 Vc_ALWAYS_INLINE Vc_PURE
operator const T()
const {
return m_data; }
94 Vc_ALWAYS_INLINE Vc_PURE
bool operator==(T x)
const {
return static_cast<T
>(m_data) == x; }
95 Vc_ALWAYS_INLINE Vc_PURE
bool operator!=(T x)
const {
return static_cast<T
>(m_data) != x; }
96 Vc_ALWAYS_INLINE Vc_PURE
bool operator<=(T x)
const {
return static_cast<T
>(m_data) <= x; }
97 Vc_ALWAYS_INLINE Vc_PURE
bool operator>=(T x)
const {
return static_cast<T
>(m_data) >= x; }
98 Vc_ALWAYS_INLINE Vc_PURE
bool operator< (T x)
const {
return static_cast<T
>(m_data) < x; }
99 Vc_ALWAYS_INLINE Vc_PURE
bool operator> (T x)
const {
return static_cast<T
>(m_data) > x; }
101 Vc_ALWAYS_INLINE Vc_PURE T
operator-()
const {
return -
static_cast<T
>(m_data); }
102 Vc_ALWAYS_INLINE Vc_PURE T operator~()
const {
return ~static_cast<T>(m_data); }
103 Vc_ALWAYS_INLINE Vc_PURE T
operator+(T x)
const {
return static_cast<T
>(m_data) + x; }
104 Vc_ALWAYS_INLINE Vc_PURE T
operator-(T x)
const {
return static_cast<T
>(m_data) - x; }
105 Vc_ALWAYS_INLINE Vc_PURE T
operator/(T x)
const {
return static_cast<T
>(m_data) / x; }
106 Vc_ALWAYS_INLINE Vc_PURE T
operator*(T x)
const {
return static_cast<T
>(m_data) * x; }
107 Vc_ALWAYS_INLINE Vc_PURE T
operator|(T x)
const {
return static_cast<T
>(m_data) | x; }
108 Vc_ALWAYS_INLINE Vc_PURE T
operator&(T x)
const {
return static_cast<T
>(m_data) & x; }
109 Vc_ALWAYS_INLINE Vc_PURE T
operator^(T x)
const {
return static_cast<T
>(m_data) ^ x; }
110 Vc_ALWAYS_INLINE Vc_PURE T
operator%(T x)
const {
return static_cast<T
>(m_data) % x; }
121 #endif // VC_COMMON_ALIASINGENTRYHELPER_H_
result_vector_type< L, R > operator|(L &&lhs, R &&rhs)
Applies | component-wise and concurrently.
result_vector_type< L, R > operator^(L &&lhs, R &&rhs)
Applies ^ component-wise and concurrently.
result_vector_type< L, R > operator/(L &&lhs, R &&rhs)
Applies / component-wise and concurrently.
result_vector_type< L, R > operator-(L &&lhs, R &&rhs)
Applies - component-wise and concurrently.
result_vector_type< L, R >::mask_type operator!=(L &&lhs, R &&rhs)
Applies != component-wise and concurrently.
result_vector_type< L, R > operator*(L &&lhs, R &&rhs)
Applies * component-wise and concurrently.
result_vector_type< L, R >::mask_type operator==(L &&lhs, R &&rhs)
Applies == component-wise and concurrently.
result_vector_type< L, R >::mask_type operator<(L &&lhs, R &&rhs)
Applies < component-wise and concurrently.
result_vector_type< L, R > operator+(L &&lhs, R &&rhs)
Applies + component-wise and concurrently.
result_vector_type< L, R > operator%(L &&lhs, R &&rhs)
Applies % component-wise and concurrently.
result_vector_type< L, R > operator&(L &&lhs, R &&rhs)
Applies & component-wise and concurrently.
result_vector_type< L, R >::mask_type operator<=(L &&lhs, R &&rhs)
Applies <= component-wise and concurrently.
result_vector_type< L, R >::mask_type operator>=(L &&lhs, R &&rhs)
Applies >= component-wise and concurrently.
result_vector_type< L, R >::mask_type operator>(L &&lhs, R &&rhs)
Applies > component-wise and concurrently.