15 #include <xmmintrin.h> 19 static const __m128
SIGNMASK = _mm_castsi128_ps(_mm_set_epi32(0, 0x80000000, 0, 0x80000000));
28 inline Complex8x2Simd(
const float& r1,
const float& i1,
const float& r2,
const float& i2)
30 _val2 = _mm_set_ps(i1, r1, i2, r2);
35 _val2 = _mm_add_ps(_val2, other.
_val2);
41 _val2 = _mm_sub_ps(_val2, other.
_val2);
46 return _mm_add_ps(_mm_mul_ps(_mm_shuffle_ps(_val2, _val2, 177),
47 _mm_xor_ps(SIGNMASK, _mm_shuffle_ps(other.
_val2, other.
_val2, 245))),
48 _mm_mul_ps(_val2, _mm_shuffle_ps(other.
_val2, other.
_val2, 160)));
52 _val2 = _mm_add_ps(_mm_mul_ps(_mm_shuffle_ps(_val2, _val2, 177),
53 _mm_xor_ps(SIGNMASK, _mm_shuffle_ps(other.
_val2, other.
_val2, 245))),
54 _mm_mul_ps(_val2, _mm_shuffle_ps(other.
_val2, other.
_val2, 160)));
61 _val2 = _mm_mul_ps(_val2, _mm_set1_ps(other));
79 return _mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle_ps(mtrxCol1.
_val2, mtrxCol1.
_val2, 177),
80 _mm_xor_ps(SIGNMASK, _mm_shuffle_ps(dupeLo, dupeLo, 245))),
81 _mm_mul_ps(mtrxCol1.
_val2, _mm_shuffle_ps(dupeLo, dupeLo, 160))),
82 _mm_add_ps(_mm_mul_ps(_mm_shuffle_ps(mtrxCol2.
_val2, mtrxCol2.
_val2, 177),
83 _mm_xor_ps(SIGNMASK, _mm_shuffle_ps(dupeHi, dupeHi, 245))),
84 _mm_mul_ps(mtrxCol2.
_val2, _mm_shuffle_ps(dupeHi, dupeHi, 160))));
91 return _mm_mul_ps(_mm_set1_ps(nrm),
92 _mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle_ps(mtrxCol1.
_val2, mtrxCol1.
_val2, 177),
93 _mm_xor_ps(SIGNMASK, _mm_shuffle_ps(dupeLo, dupeLo, 245))),
94 _mm_mul_ps(mtrxCol1.
_val2, _mm_shuffle_ps(dupeLo, dupeLo, 160))),
95 _mm_add_ps(_mm_mul_ps(_mm_shuffle_ps(mtrxCol2.
_val2, mtrxCol2.
_val2, 177),
96 _mm_xor_ps(SIGNMASK, _mm_shuffle_ps(dupeHi, dupeHi, 245))),
97 _mm_mul_ps(mtrxCol2.
_val2, _mm_shuffle_ps(dupeHi, dupeHi, 160)))));
101 return _mm_mul_ps(_mm_set1_ps(lhs), rhs.
_val2);
Complex8x2Simd operator*=(const float &other)
Definition: complex8x2simd.hpp:59
Complex8x2Simd operator*(const float rhs) const
Definition: complex8x2simd.hpp:57
Complex16x2Simd dupeHi(const Complex16x2Simd &cmplx2)
Definition: complex16x2simd.hpp:69
Complex16x2Simd dupeLo(const Complex16x2Simd &cmplx2)
Definition: complex16x2simd.hpp:65
Complex8x2Simd()
Definition: complex8x2simd.hpp:26
Complex8x2Simd operator+(const Complex8x2Simd &other) const
Definition: complex8x2simd.hpp:32
Definition: complex8x2simd.hpp:66
Complex8x2Simd operator-(const Complex8x2Simd &other) const
Definition: complex8x2simd.hpp:38
Complex8x2Simd(const __m128 &v2)
Definition: complex8x2simd.hpp:27
static const __m128 SIGNMASK
Definition: complex8x2simd.hpp:19
Complex8x2Simd operator*=(const Complex8x2Simd &other)
Definition: complex8x2simd.hpp:50
_cmplx_union(const Complex8x2Simd &c2)
Definition: complex8x2simd.hpp:69
Complex8x2Simd operator+=(const Complex8x2Simd &other)
Definition: complex8x2simd.hpp:33
Complex8x2Simd(const float &r1, const float &i1, const float &r2, const float &i2)
Definition: complex8x2simd.hpp:28
SIMD implementation of the float precision complex vector type of 2 complex numbers, only for COMPLEX_X_2 Apply2x2.
Definition: complex8x2simd.hpp:23
Complex8x2Simd operator*(const Complex8x2Simd &other) const
Definition: complex8x2simd.hpp:44
Complex16x2Simd matrixMul(const Complex16x2Simd &mtrxCol1, const Complex16x2Simd &mtrxCol2, const Complex16x2Simd &qubit)
Definition: complex16x2simd.hpp:73
__m128 _val2
Definition: complex8x2simd.hpp:24
double norm(const Complex16Simd &cmplx)
Definition: complex16simd.hpp:130
float comp[4]
Definition: complex8x2simd.hpp:67
Complex8x2Simd cmplx2
Definition: complex8x2simd.hpp:68
Complex8x2Simd operator-=(const Complex8x2Simd &other)
Definition: complex8x2simd.hpp:39
Definition: complex16simd.hpp:21
Complex8x2Simd operator-() const
Definition: complex8x2simd.hpp:58