26template <
typename TYPE,
int SIZE>
35 constexpr static int size = 4;
56 Vector(
float x1,
float x2,
float x3,
float x4) {
57 v = _mm_setr_ps(x1, x2, x3, x4);
62 return Vector(_mm_setzero_ps());
67 return Vector(_mm_castsi128_ps(_mm_cmpeq_epi32(_mm_setzero_si128(), _mm_setzero_si128())));
79 return Vector(_mm_loadu_ps(x));
109 constexpr static int size = 4;
119 v = _mm_set1_epi32(x);
121 Vector(int32_t x1, int32_t x2, int32_t x3, int32_t x4) {
122 v = _mm_setr_epi32(x1, x2, x3, x4);
125 return Vector(_mm_setzero_si128());
128 return Vector(_mm_cmpeq_epi32(_mm_setzero_si128(), _mm_setzero_si128()));
133 return Vector(_mm_loadu_si128((
const __m128i*) x));
138 _mm_storeu_si128((__m128i*) x, v);
155 v = _mm_cvtepi32_ps(a.v);
159 v = _mm_cvttps_epi32(a.v);
163 return Vector(_mm_castsi128_ps(a.v));
167 return Vector(_mm_castps_si128(a.v));
175#define DECLARE_VECTOR_OPERATOR_INFIX(t, s, operator, func) \
176 inline Vector<t, s> operator(const Vector<t, s>& a, const Vector<t, s>& b) { \
177 return Vector<t, s>(func(a.v, b.v)); \
181#define DECLARE_VECTOR_OPERATOR_INCREMENT(t, s, operator, opfunc) \
182 inline Vector<t, s>& operator(Vector<t, s>& a, const Vector<t, s>& b) { \
183 return a = opfunc(a, b); \
249inline Vector<int32_t, 4>
operator<=(
const Vector<int32_t, 4>& a,
const Vector<int32_t, 4>& b) {
250 return Vector<int32_t, 4>(_mm_cmplt_epi32(a.v, b.v)) ^ Vector<int32_t, 4>::mask();
326inline Vector<int32_t, 4>
operator<<(
const Vector<int32_t, 4>& a,
const int& b) {
327 return Vector<int32_t, 4>(_mm_sll_epi32(a.v, _mm_cvtsi32_si128(b)));
#define DECLARE_VECTOR_OPERATOR_INFIX(t, s, operator,func)
a @ b
Definition Vector.hpp:175
#define DECLARE_VECTOR_OPERATOR_INCREMENT(t, s, operator,opfunc)
a @= b
Definition Vector.hpp:181
Vector< int32_t, 4 > operator<=(const Vector< int32_t, 4 > &a, const Vector< int32_t, 4 > &b)
Definition Vector.hpp:249
Vector< int32_t, 4 > operator>>(const Vector< int32_t, 4 > &a, const int &b)
a >> b
Definition Vector.hpp:331
Vector< int32_t, 4 > operator<<(const Vector< int32_t, 4 > &a, const int &b)
a << b
Definition Vector.hpp:326
Vector< float, 4 > operator-(const Vector< float, 4 > &a)
-a
Definition Vector.hpp:270
Vector< float, 4 > & operator++(Vector< float, 4 > &a)
++a
Definition Vector.hpp:278
Vector< float, 4 > & operator--(Vector< float, 4 > &a)
--a
Definition Vector.hpp:286
Vector< float, 4 > operator~(const Vector< float, 4 > &a)
~a
Definition Vector.hpp:318
Vector< float, 4 > operator+(const Vector< float, 4 > &a)
+a
Definition Vector.hpp:262
Root namespace for the Rack API.
Definition AudioDisplay.hpp:9
Wrapper for __m128 representing an aligned vector of 4 single-precision float values.
Definition Vector.hpp:33
static Vector mask()
Returns a vector with all 1 bits.
Definition Vector.hpp:66
void store(float *x)
Writes an array of 4 values.
Definition Vector.hpp:85
Vector(float x1, float x2, float x3, float x4)
Constructs a vector from four scalars.
Definition Vector.hpp:56
float & operator[](int i)
Accessing vector elements individually is slow and defeats the purpose of vectorizing.
Definition Vector.hpp:92
Vector(__m128 v)
Constructs a vector from a native __m128 type.
Definition Vector.hpp:48
Vector(float x)
Constructs a vector with all elements set to x.
Definition Vector.hpp:51
Vector()=default
Constructs an uninitialized vector.
static Vector load(const float *x)
Reads an array of 4 values.
Definition Vector.hpp:73
const float & operator[](int i) const
Definition Vector.hpp:95
float type
Definition Vector.hpp:34
static Vector zero()
Returns a vector with all 0 bits.
Definition Vector.hpp:61
__m128 v
Definition Vector.hpp:38
Definition Vector.hpp:107
Vector(int32_t x1, int32_t x2, int32_t x3, int32_t x4)
Definition Vector.hpp:121
static Vector zero()
Definition Vector.hpp:124
Vector(__m128i v)
Definition Vector.hpp:117
__m128i v
Definition Vector.hpp:112
Vector(int32_t x)
Definition Vector.hpp:118
const int32_t & operator[](int i) const
Definition Vector.hpp:143
int32_t type
Definition Vector.hpp:108
static Vector mask()
Definition Vector.hpp:127
static Vector load(const int32_t *x)
Definition Vector.hpp:130
int32_t & operator[](int i)
Definition Vector.hpp:140
void store(int32_t *x)
Definition Vector.hpp:135
Generic class for vector types.
Definition Vector.hpp:27