SSE/Complex.h
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_COMPLEX_SSE_H
11 #define EIGEN_COMPLEX_SSE_H
12 
13 #include "../../InternalHeaderCheck.h"
14 
15 namespace Eigen {
16 
17 namespace internal {
18 
19 //---------- float ----------
20 struct Packet2cf
21 {
22  EIGEN_STRONG_INLINE Packet2cf() {}
23  EIGEN_STRONG_INLINE explicit Packet2cf(const __m128& a) : v(a) {}
24  Packet4f v;
25 };
26 
27 // Use the packet_traits defined in AVX/PacketMath.h instead if we're going
28 // to leverage AVX instructions.
29 #ifndef EIGEN_VECTORIZE_AVX
30 template<> struct packet_traits<std::complex<float> > : default_packet_traits
31 {
32  typedef Packet2cf type;
33  typedef Packet2cf half;
34  enum {
35  Vectorizable = 1,
36  AlignedOnScalar = 1,
37  size = 2,
38 
39  HasAdd = 1,
40  HasSub = 1,
41  HasMul = 1,
42  HasDiv = 1,
43  HasNegate = 1,
44  HasSqrt = 1,
45  HasAbs = 0,
46  HasAbs2 = 0,
47  HasMin = 0,
48  HasMax = 0,
49  HasSetLinear = 0,
50  HasBlend = 1
51  };
52 };
53 #endif
54 
55 template<> struct unpacket_traits<Packet2cf> {
56  typedef std::complex<float> type;
57  typedef Packet2cf half;
58  typedef Packet4f as_real;
59  enum {
60  size=2,
61  alignment=Aligned16,
62  vectorizable=true,
63  masked_load_available=false,
64  masked_store_available=false
65  };
66 };
67 
68 template<> EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_add_ps(a.v,b.v)); }
69 template<> EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_sub_ps(a.v,b.v)); }
70 
71 template<> EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a)
72 {
73  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000,0x80000000,0x80000000,0x80000000));
74  return Packet2cf(_mm_xor_ps(a.v,mask));
75 }
76 template<> EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a)
77 {
78  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x00000000,0x80000000,0x00000000,0x80000000));
79  return Packet2cf(_mm_xor_ps(a.v,mask));
80 }
81 
82 template<> EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
83 {
84  #ifdef EIGEN_VECTORIZE_SSE3
85  return Packet2cf(_mm_addsub_ps(_mm_mul_ps(_mm_moveldup_ps(a.v), b.v),
86  _mm_mul_ps(_mm_movehdup_ps(a.v),
87  vec4f_swizzle1(b.v, 1, 0, 3, 2))));
88 // return Packet2cf(_mm_addsub_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v),
89 // _mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),
90 // vec4f_swizzle1(b.v, 1, 0, 3, 2))));
91  #else
92  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000,0x00000000,0x80000000,0x00000000));
93  return Packet2cf(_mm_add_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v),
94  _mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),
95  vec4f_swizzle1(b.v, 1, 0, 3, 2)), mask)));
96  #endif
97 }
98 
99 template<> EIGEN_STRONG_INLINE Packet2cf ptrue <Packet2cf>(const Packet2cf& a) { return Packet2cf(ptrue(Packet4f(a.v))); }
100 template<> EIGEN_STRONG_INLINE Packet2cf pand <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_and_ps(a.v,b.v)); }
101 template<> EIGEN_STRONG_INLINE Packet2cf por <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_or_ps(a.v,b.v)); }
102 template<> EIGEN_STRONG_INLINE Packet2cf pxor <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_xor_ps(a.v,b.v)); }
103 template<> EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_andnot_ps(b.v,a.v)); }
104 
105 template<> EIGEN_STRONG_INLINE Packet2cf pload <Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(pload<Packet4f>(&numext::real_ref(*from))); }
106 template<> EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cf(ploadu<Packet4f>(&numext::real_ref(*from))); }
107 
108 template<> EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>& from)
109 {
110  const float re = std::real(from);
111  const float im = std::imag(from);
112  return Packet2cf(_mm_set_ps(im, re, im, re));
113 }
114 
115 template<> EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>* from) { return pset1<Packet2cf>(*from); }
116 
117 template<> EIGEN_STRONG_INLINE void pstore <std::complex<float> >(std::complex<float> * to, const Packet2cf& from) { EIGEN_DEBUG_ALIGNED_STORE pstore(&numext::real_ref(*to), Packet4f(from.v)); }
118 template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float> * to, const Packet2cf& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu(&numext::real_ref(*to), Packet4f(from.v)); }
119 
120 
121 template<> EIGEN_DEVICE_FUNC inline Packet2cf pgather<std::complex<float>, Packet2cf>(const std::complex<float>* from, Index stride)
122 {
123  return Packet2cf(_mm_set_ps(std::imag(from[1*stride]), std::real(from[1*stride]),
124  std::imag(from[0*stride]), std::real(from[0*stride])));
125 }
126 
127 template<> EIGEN_DEVICE_FUNC inline void pscatter<std::complex<float>, Packet2cf>(std::complex<float>* to, const Packet2cf& from, Index stride)
128 {
129  to[stride*0] = std::complex<float>(_mm_cvtss_f32(_mm_shuffle_ps(from.v, from.v, 0)),
130  _mm_cvtss_f32(_mm_shuffle_ps(from.v, from.v, 1)));
131  to[stride*1] = std::complex<float>(_mm_cvtss_f32(_mm_shuffle_ps(from.v, from.v, 2)),
132  _mm_cvtss_f32(_mm_shuffle_ps(from.v, from.v, 3)));
133 }
134 
135 template<> EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float> * addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
136 
137 template<> EIGEN_STRONG_INLINE std::complex<float> pfirst<Packet2cf>(const Packet2cf& a)
138 {
139  alignas(alignof(__m64)) std::complex<float> res;
140  _mm_storel_pi((__m64*)&res, a.v);
141  return res;
142 }
143 
144 template<> EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a) { return Packet2cf(_mm_castpd_ps(preverse(Packet2d(_mm_castps_pd(a.v))))); }
145 
146 template<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a)
147 {
148  return pfirst(Packet2cf(_mm_add_ps(a.v, _mm_movehl_ps(a.v,a.v))));
149 }
150 
151 template<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a)
152 {
153  return pfirst(pmul(a, Packet2cf(_mm_movehl_ps(a.v,a.v))));
154 }
155 
156 EIGEN_STRONG_INLINE Packet2cf pcplxflip/* <Packet2cf> */(const Packet2cf& x)
157 {
158  return Packet2cf(vec4f_swizzle1(x.v, 1, 0, 3, 2));
159 }
160 
162 
163 template<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
164 {
165  return pdiv_complex(a, b);
166 }
167 
168 //---------- double ----------
169 struct Packet1cd
170 {
171  EIGEN_STRONG_INLINE Packet1cd() {}
172  EIGEN_STRONG_INLINE explicit Packet1cd(const __m128d& a) : v(a) {}
173  Packet2d v;
174 };
175 
176 // Use the packet_traits defined in AVX/PacketMath.h instead if we're going
177 // to leverage AVX instructions.
178 #ifndef EIGEN_VECTORIZE_AVX
179 template<> struct packet_traits<std::complex<double> > : default_packet_traits
180 {
181  typedef Packet1cd type;
182  typedef Packet1cd half;
183  enum {
184  Vectorizable = 1,
185  AlignedOnScalar = 0,
186  size = 1,
187 
188  HasAdd = 1,
189  HasSub = 1,
190  HasMul = 1,
191  HasDiv = 1,
192  HasNegate = 1,
193  HasSqrt = 1,
194  HasAbs = 0,
195  HasAbs2 = 0,
196  HasMin = 0,
197  HasMax = 0,
198  HasSetLinear = 0
199  };
200 };
201 #endif
202 
203 template<> struct unpacket_traits<Packet1cd> {
204  typedef std::complex<double> type;
205  typedef Packet1cd half;
206  typedef Packet2d as_real;
207  enum {
208  size=1,
209  alignment=Aligned16,
210  vectorizable=true,
211  masked_load_available=false,
212  masked_store_available=false
213  };
214 };
215 
216 template<> EIGEN_STRONG_INLINE Packet1cd padd<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_add_pd(a.v,b.v)); }
217 template<> EIGEN_STRONG_INLINE Packet1cd psub<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_sub_pd(a.v,b.v)); }
218 template<> EIGEN_STRONG_INLINE Packet1cd pnegate(const Packet1cd& a) { return Packet1cd(pnegate(Packet2d(a.v))); }
219 template<> EIGEN_STRONG_INLINE Packet1cd pconj(const Packet1cd& a)
220 {
221  const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x80000000,0x0,0x0,0x0));
222  return Packet1cd(_mm_xor_pd(a.v,mask));
223 }
224 
225 template<> EIGEN_STRONG_INLINE Packet1cd pmul<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
226 {
227  #ifdef EIGEN_VECTORIZE_SSE3
228  return Packet1cd(_mm_addsub_pd(_mm_mul_pd(_mm_movedup_pd(a.v), b.v),
229  _mm_mul_pd(vec2d_swizzle1(a.v, 1, 1),
230  vec2d_swizzle1(b.v, 1, 0))));
231  #else
232  const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x0,0x0,0x80000000,0x0));
233  return Packet1cd(_mm_add_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 0, 0), b.v),
234  _mm_xor_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 1, 1),
235  vec2d_swizzle1(b.v, 1, 0)), mask)));
236  #endif
237 }
238 
239 template<> EIGEN_STRONG_INLINE Packet1cd ptrue <Packet1cd>(const Packet1cd& a) { return Packet1cd(ptrue(Packet2d(a.v))); }
240 template<> EIGEN_STRONG_INLINE Packet1cd pand <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_and_pd(a.v,b.v)); }
241 template<> EIGEN_STRONG_INLINE Packet1cd por <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_or_pd(a.v,b.v)); }
242 template<> EIGEN_STRONG_INLINE Packet1cd pxor <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_xor_pd(a.v,b.v)); }
243 template<> EIGEN_STRONG_INLINE Packet1cd pandnot<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_andnot_pd(b.v,a.v)); }
244 
245 // FIXME force unaligned load, this is a temporary fix
246 template<> EIGEN_STRONG_INLINE Packet1cd pload <Packet1cd>(const std::complex<double>* from)
247 { EIGEN_DEBUG_ALIGNED_LOAD return Packet1cd(pload<Packet2d>((const double*)from)); }
248 template<> EIGEN_STRONG_INLINE Packet1cd ploadu<Packet1cd>(const std::complex<double>* from)
249 { EIGEN_DEBUG_UNALIGNED_LOAD return Packet1cd(ploadu<Packet2d>((const double*)from)); }
250 template<> EIGEN_STRONG_INLINE Packet1cd pset1<Packet1cd>(const std::complex<double>& from)
251 { /* here we really have to use unaligned loads :( */ return ploadu<Packet1cd>(&from); }
252 
253 template<> EIGEN_STRONG_INLINE Packet1cd ploaddup<Packet1cd>(const std::complex<double>* from) { return pset1<Packet1cd>(*from); }
254 
255 // FIXME force unaligned store, this is a temporary fix
256 template<> EIGEN_STRONG_INLINE void pstore <std::complex<double> >(std::complex<double> * to, const Packet1cd& from) { EIGEN_DEBUG_ALIGNED_STORE pstore((double*)to, Packet2d(from.v)); }
257 template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double> * to, const Packet1cd& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu((double*)to, Packet2d(from.v)); }
258 
259 template<> EIGEN_STRONG_INLINE void prefetch<std::complex<double> >(const std::complex<double> * addr) { _mm_prefetch((SsePrefetchPtrType)(addr), _MM_HINT_T0); }
260 
261 template<> EIGEN_STRONG_INLINE std::complex<double> pfirst<Packet1cd>(const Packet1cd& a)
262 {
263  EIGEN_ALIGN16 double res[2];
264  _mm_store_pd(res, a.v);
265  return std::complex<double>(res[0],res[1]);
266 }
267 
268 template<> EIGEN_STRONG_INLINE Packet1cd preverse(const Packet1cd& a) { return a; }
269 
270 template<> EIGEN_STRONG_INLINE std::complex<double> predux<Packet1cd>(const Packet1cd& a)
271 {
272  return pfirst(a);
273 }
274 
275 template<> EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet1cd>(const Packet1cd& a)
276 {
277  return pfirst(a);
278 }
279 
281 
282 template<> EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
283 {
284  return pdiv_complex(a, b);
285 }
286 
287 EIGEN_STRONG_INLINE Packet1cd pcplxflip/* <Packet1cd> */(const Packet1cd& x)
288 {
289  return Packet1cd(preverse(Packet2d(x.v)));
290 }
291 
292 EIGEN_DEVICE_FUNC inline void
293 ptranspose(PacketBlock<Packet2cf,2>& kernel) {
294  __m128d w1 = _mm_castps_pd(kernel.packet[0].v);
295  __m128d w2 = _mm_castps_pd(kernel.packet[1].v);
296 
297  __m128 tmp = _mm_castpd_ps(_mm_unpackhi_pd(w1, w2));
298  kernel.packet[0].v = _mm_castpd_ps(_mm_unpacklo_pd(w1, w2));
299  kernel.packet[1].v = tmp;
300 }
301 
302 template<> EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf& a, const Packet2cf& b)
303 {
304  __m128 eq = _mm_cmpeq_ps(a.v, b.v);
305  return Packet2cf(pand<Packet4f>(eq, vec4f_swizzle1(eq, 1, 0, 3, 2)));
306 }
307 
308 template<> EIGEN_STRONG_INLINE Packet1cd pcmp_eq(const Packet1cd& a, const Packet1cd& b)
309 {
310  __m128d eq = _mm_cmpeq_pd(a.v, b.v);
311  return Packet1cd(pand<Packet2d>(eq, vec2d_swizzle1(eq, 1, 0)));
312 }
313 
314 template<> EIGEN_STRONG_INLINE Packet2cf pblend(const Selector<2>& ifPacket, const Packet2cf& thenPacket, const Packet2cf& elsePacket) {
315  __m128d result = pblend<Packet2d>(ifPacket, _mm_castps_pd(thenPacket.v), _mm_castps_pd(elsePacket.v));
316  return Packet2cf(_mm_castpd_ps(result));
317 }
318 
319 template<> EIGEN_STRONG_INLINE Packet1cd psqrt<Packet1cd>(const Packet1cd& a) {
320  return psqrt_complex<Packet1cd>(a);
321 }
322 
323 template<> EIGEN_STRONG_INLINE Packet2cf psqrt<Packet2cf>(const Packet2cf& a) {
324  return psqrt_complex<Packet2cf>(a);
325 }
326 
327 } // end namespace internal
328 } // end namespace Eigen
329 
330 #endif // EIGEN_COMPLEX_SSE_H
Array< int, Dynamic, 1 > v
Array< int, 3, 1 > b
const ImagReturnType imag() const
RealReturnType real() const
#define EIGEN_ALIGN16
#define EIGEN_MAKE_CONJ_HELPER_CPLX_REAL(PACKET_CPLX, PACKET_REAL)
Definition: ConjHelper.h:14
#define EIGEN_DEBUG_ALIGNED_STORE
#define EIGEN_DEBUG_ALIGNED_LOAD
#define EIGEN_DEBUG_UNALIGNED_STORE
#define EIGEN_DEBUG_UNALIGNED_LOAD
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:883
cout<< "Here is the matrix m:"<< endl<< m<< endl;Matrix< ptrdiff_t, 3, 1 > res
#define vec2d_swizzle1(v, p, q)
@ Aligned16
Definition: Constants.h:237
Packet1cd pxor< Packet1cd >(const Packet1cd &a, const Packet1cd &b)
Definition: MSA/Complex.h:516
Packet2cf pandnot< Packet2cf >(const Packet2cf &a, const Packet2cf &b)
void pstore(Scalar *to, const Packet &from)
std::complex< float > predux< Packet2cf >(const Packet2cf &a)
Packet1cd pload< Packet1cd >(const std::complex< double > *from)
Definition: MSA/Complex.h:446
Packet2cf padd< Packet2cf >(const Packet2cf &a, const Packet2cf &b)
Packet8h ptrue(const Packet8h &a)
Packet2cf ploaddup< Packet2cf >(const std::complex< float > *from)
std::complex< float > pfirst< Packet2cf >(const Packet2cf &a)
Packet2cf pset1< Packet2cf >(const std::complex< float > &from)
Packet1cd pmul< Packet1cd >(const Packet1cd &a, const Packet1cd &b)
Definition: MSA/Complex.h:495
Packet1cd pdiv< Packet1cd >(const Packet1cd &a, const Packet1cd &b)
Definition: MSA/Complex.h:611
Packet1cd pandnot< Packet1cd >(const Packet1cd &a, const Packet1cd &b)
Definition: MSA/Complex.h:523
Packet2cf ploadu< Packet2cf >(const std::complex< float > *from)
Packet1cd padd< Packet1cd >(const Packet1cd &a, const Packet1cd &b)
Definition: MSA/Complex.h:467
Packet2cf pnegate(const Packet2cf &a)
Packet1cd ploadu< Packet1cd >(const std::complex< double > *from)
Definition: MSA/Complex.h:453
Packet4f pand< Packet4f >(const Packet4f &a, const Packet4f &b)
Packet2cf por< Packet2cf >(const Packet2cf &a, const Packet2cf &b)
Packet1cd pcplxflip(const Packet1cd &x)
Definition: MSA/Complex.h:617
Packet2d pand< Packet2d >(const Packet2d &a, const Packet2d &b)
std::complex< double > pfirst< Packet1cd >(const Packet1cd &a)
Definition: MSA/Complex.h:581
Packet2cf ptrue< Packet2cf >(const Packet2cf &a)
Definition: SSE/Complex.h:99
void pstoreu(Scalar *to, const Packet &from)
Packet2cf pcmp_eq(const Packet2cf &a, const Packet2cf &b)
bfloat16 pfirst(const Packet8bf &a)
Packet2cf pmul< Packet2cf >(const Packet2cf &a, const Packet2cf &b)
Definition: MSA/Complex.h:171
Packet pmul(const Packet &a, const Packet &b)
void ptranspose(PacketBlock< Packet2cf, 2 > &kernel)
Packet1cd ptrue< Packet1cd >(const Packet1cd &a)
Definition: SSE/Complex.h:239
EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pdiv_complex(const Packet &x, const Packet &y)
Packet1cd pand< Packet1cd >(const Packet1cd &a, const Packet1cd &b)
Definition: MSA/Complex.h:502
Packet2cf pxor< Packet2cf >(const Packet2cf &a, const Packet2cf &b)
Packet4f ploadu< Packet4f >(const float *from)
std::complex< double > predux_mul< Packet1cd >(const Packet1cd &a)
Definition: MSA/Complex.h:602
std::complex< double > predux< Packet1cd >(const Packet1cd &a)
Definition: MSA/Complex.h:595
Packet1cd por< Packet1cd >(const Packet1cd &a, const Packet1cd &b)
Definition: MSA/Complex.h:509
Packet2d ploadu< Packet2d >(const double *from)
const char * SsePrefetchPtrType
Packet2cf pload< Packet2cf >(const std::complex< float > *from)
Packet2cf pand< Packet2cf >(const Packet2cf &a, const Packet2cf &b)
Packet1cd ploaddup< Packet1cd >(const std::complex< double > *from)
Definition: MSA/Complex.h:530
Packet1cd psqrt< Packet1cd >(const Packet1cd &a)
Definition: SSE/Complex.h:319
Packet4i pblend(const Selector< 4 > &ifPacket, const Packet4i &thenPacket, const Packet4i &elsePacket)
Packet1cd pset1< Packet1cd >(const std::complex< double > &from)
Definition: MSA/Complex.h:460
Packet2cf pconj(const Packet2cf &a)
Packet2cf pdiv< Packet2cf >(const Packet2cf &a, const Packet2cf &b)
Packet2d pload< Packet2d >(const double *from)
Packet2cf preverse(const Packet2cf &a)
Packet4f pload< Packet4f >(const float *from)
__vector float Packet4f
Packet2cf psub< Packet2cf >(const Packet2cf &a, const Packet2cf &b)
Packet1cd psub< Packet1cd >(const Packet1cd &a, const Packet1cd &b)
Definition: MSA/Complex.h:474
Packet4f vec4f_swizzle1(const Packet4f &a, int p, int q, int r, int s)
Packet2cf psqrt< Packet2cf >(const Packet2cf &a)
std::complex< float > predux_mul< Packet2cf >(const Packet2cf &a)
internal::add_const_on_value_type_t< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) > real_ref(const Scalar &x)
: InteropHeaders
Definition: Core:139
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:82
Definition: BFloat16.h:222