33 if constexpr (std::is_same_v<vec_type, __m128d>)
34 _mm_store_pd(data, v);
35 if constexpr (std::is_same_v<vec_type, __m256d>)
36 _mm256_store_pd(data, v);
37 if constexpr (std::is_same_v<vec_type, __m512d>)
38 _mm512_store_pd(data, v);
79 __m128d vlow = _mm256_castpd256_pd128(v);
80 vlow = _mm_add_pd(vlow, _mm256_extractf128_pd(v, 1));
81 return _mm_cvtsd_f64(_mm_add_sd(vlow, _mm_unpackhi_pd(vlow, vlow)));
92 if constexpr (std::is_same_v<vec_type, __m128d>)
93 vec = _mm_set_pd(val[1], val[0]);
94 if constexpr (std::is_same_v<vec_type, __m256d>)
95 vec = _mm256_set_pd(val[3], val[2], val[1], val[0]);
96 if constexpr (std::is_same_v<vec_type, __m512d>)
97 vec = _mm512_set_pd(val[7], val[6], val[5], val[4], val[3], val[2], val[1], val[0]);
103 if constexpr (std::is_same_v<vec_type, __m128d>)
104 vec = _mm_set_pd(val, val);
105 if constexpr (std::is_same_v<vec_type, __m256d>)
106 vec = _mm256_set_pd(val, val, val, val);
107 if constexpr (std::is_same_v<vec_type, __m512d>)
108 vec = _mm512_set_pd(val, val, val, val, val, val, val, val);
111 inline void avx_inv_dr(
const __m512d& oneVec,
const __m512d& epsVec,
112 const __m512d& x_target,
const __m512d& y_target,
const __m512d& z_target,
113 __m512d& temp1, __m512d& temp2, __m512d& temp3,
114 __m512d& dx, __m512d& dy, __m512d& dz, __m512d& invdr, __m512d& invdr2)
116 dx = _mm512_sub_pd(x_target, temp1);
117 dy = _mm512_sub_pd(y_target, temp2);
118 dz = _mm512_sub_pd(z_target, temp3);
119 temp1 = _mm512_mul_pd(dx, dx);
120 temp2 = _mm512_mul_pd(dy, dy);
121 temp3 = _mm512_mul_pd(dz, dz);
122 invdr = _mm512_add_pd(temp1, temp2);
123 invdr = _mm512_add_pd(invdr, temp3);
124 invdr = _mm512_max_pd(invdr, epsVec);
125 invdr2 = _mm512_div_pd(oneVec, invdr);
126 invdr = _mm512_sqrt_pd(invdr2);
129 inline void avx_inv_dr(
const __m256d& oneVec,
const __m256d& epsVec,
130 const __m256d& x_target,
const __m256d& y_target,
const __m256d& z_target,
131 __m256d& temp1, __m256d& temp2, __m256d& temp3,
132 __m256d& dx, __m256d& dy, __m256d& dz, __m256d& invdr, __m256d& invdr2)
134 dx = _mm256_sub_pd(x_target, temp1);
135 dy = _mm256_sub_pd(y_target, temp2);
136 dz = _mm256_sub_pd(z_target, temp3);
137 temp1 = _mm256_mul_pd(dx, dx);
138 temp2 = _mm256_mul_pd(dy, dy);
139 temp3 = _mm256_mul_pd(dz, dz);
141 invdr = _mm256_add_pd(temp1, temp2);
142 invdr = _mm256_add_pd(invdr, temp3);
144 invdr = _mm256_max_pd(invdr, epsVec);
145 invdr2 = _mm256_div_pd(oneVec, invdr);
146 invdr = _mm256_sqrt_pd(invdr2);
149 inline void avx_inv_dr(
const __m128d& oneVec,
const __m128d& epsVec,
150 const __m128d& x_target,
const __m128d& y_target,
const __m128d& z_target,
151 __m128d& temp1, __m128d& temp2, __m128d& temp3,
152 __m128d& dx, __m128d& dy, __m128d& dz, __m128d& invdr, __m128d& invdr2)
154 dx = _mm_sub_pd(x_target, temp1);
155 dy = _mm_sub_pd(y_target, temp2);
156 dz = _mm_sub_pd(z_target, temp3);
157 temp1 = _mm_mul_pd(dx, dx);
158 temp2 = _mm_mul_pd(dy, dy);
159 temp3 = _mm_mul_pd(dz, dz);
161 invdr = _mm_add_pd(temp1, temp2);
162 invdr = _mm_add_pd(invdr, temp3);
163 invdr = _mm_max_pd(invdr, epsVec);
164 invdr2 = _mm_div_pd(oneVec, invdr);
165 invdr = _mm_sqrt_pd(invdr2);