15 #include <emmintrin.h> 16 #include <immintrin.h> 17 #include <smmintrin.h> 27 inline Complex16x2Simd(
const double& r1,
const double& i1,
const double& r2,
const double& i2)
29 _val2 = _mm256_set_pd(i1, r1, i2, r2);
34 _val2 = _mm256_add_pd(_val2, other.
_val2);
40 _val2 = _mm256_sub_pd(_val2, other.
_val2);
46 _mm256_mul_pd(_mm256_shuffle_pd(_val2, _val2, 5), _mm256_shuffle_pd((-other.
_val2), other.
_val2, 15)),
47 _mm256_mul_pd(_val2, _mm256_shuffle_pd(other.
_val2, other.
_val2, 0)));
51 _val2 = _mm256_add_pd(
52 _mm256_mul_pd(_mm256_shuffle_pd(_val2, _val2, 5), _mm256_shuffle_pd((-other.
_val2), other.
_val2, 15)),
53 _mm256_mul_pd(_val2, _mm256_shuffle_pd(other.
_val2, other.
_val2, 0)));
60 _val2 = _mm256_mul_pd(_val2, _mm256_set1_pd(other));
67 return _mm256_permute2f128_pd(cmplx2.
_val2, cmplx2.
_val2, 0);
71 return _mm256_permute2f128_pd(cmplx2.
_val2, cmplx2.
_val2, 17);
78 return _mm256_add_pd(_mm256_add_pd(_mm256_mul_pd(_mm256_shuffle_pd(mtrxCol1.
_val2, mtrxCol1.
_val2, 5),
79 _mm256_shuffle_pd(-dupeLo, dupeLo, 15)),
80 _mm256_mul_pd(mtrxCol1.
_val2, _mm256_shuffle_pd(dupeLo, dupeLo, 0))),
82 _mm256_mul_pd(_mm256_shuffle_pd(mtrxCol2.
_val2, mtrxCol2.
_val2, 5), _mm256_shuffle_pd(-dupeHi, dupeHi, 15)),
83 _mm256_mul_pd(mtrxCol2.
_val2, _mm256_shuffle_pd(dupeHi, dupeHi, 0))));
90 return _mm256_mul_pd(_mm256_set1_pd(nrm),
91 _mm256_add_pd(_mm256_add_pd(_mm256_mul_pd(_mm256_shuffle_pd(mtrxCol1.
_val2, mtrxCol1.
_val2, 5),
92 _mm256_shuffle_pd(-dupeLo, dupeLo, 15)),
93 _mm256_mul_pd(mtrxCol1.
_val2, _mm256_shuffle_pd(dupeLo, dupeLo, 0))),
94 _mm256_add_pd(_mm256_mul_pd(_mm256_shuffle_pd(mtrxCol2.
_val2, mtrxCol2.
_val2, 5),
95 _mm256_shuffle_pd(-dupeHi, dupeHi, 15)),
96 _mm256_mul_pd(mtrxCol2.
_val2, _mm256_shuffle_pd(dupeHi, dupeHi, 0)))));
100 return _mm256_mul_pd(_mm256_set1_pd(lhs), rhs.
_val2);
Complex16x2Simd operator+(const Complex16x2Simd &other) const
Definition: complex16x2simd.hpp:31
Complex16x2Simd operator*=(const Complex16x2Simd &other)
Definition: complex16x2simd.hpp:49
Complex16x2Simd dupeHi(const Complex16x2Simd &cmplx2)
Definition: complex16x2simd.hpp:69
Complex16x2Simd dupeLo(const Complex16x2Simd &cmplx2)
Definition: complex16x2simd.hpp:65
__m256d _val2
Definition: complex16x2simd.hpp:23
Complex16x2Simd operator*(const Complex16x2Simd &other) const
Definition: complex16x2simd.hpp:43
Complex16x2Simd(const double &r1, const double &i1, const double &r2, const double &i2)
Definition: complex16x2simd.hpp:27
Complex16x2Simd()
Definition: complex16x2simd.hpp:25
Complex16x2Simd operator-=(const Complex16x2Simd &other)
Definition: complex16x2simd.hpp:38
Complex16x2Simd operator*(const double rhs) const
Definition: complex16x2simd.hpp:56
Complex16x2Simd operator-(const Complex16x2Simd &other) const
Definition: complex16x2simd.hpp:37
SIMD implementation of the double precision complex vector type of 2 complex numbers, only for AVX Apply2x2.
Definition: complex16x2simd.hpp:22
Complex16x2Simd(const __m256d &v2)
Definition: complex16x2simd.hpp:26
Complex16x2Simd matrixMul(const Complex16x2Simd &mtrxCol1, const Complex16x2Simd &mtrxCol2, const Complex16x2Simd &qubit)
Definition: complex16x2simd.hpp:73
Complex16x2Simd operator*=(const double &other)
Definition: complex16x2simd.hpp:58
Complex16x2Simd operator+=(const Complex16x2Simd &other)
Definition: complex16x2simd.hpp:32
Definition: complex16simd.hpp:21
Complex16x2Simd operator-() const
Definition: complex16x2simd.hpp:57