CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SSEVec.h
Go to the documentation of this file.
1 #ifndef DataFormat_Math_SSEVec_H
2 #define DataFormat_Math_SSEVec_H
3 
4 #if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ > 4)
5 #include <x86intrin.h>
6 #define CMS_USE_SSE
7 
8 #else
9 
10 #ifdef __SSE2__
11 #define CMS_USE_SSE
12 
13 #include <mmintrin.h>
14 #include <emmintrin.h>
15 #endif
16 #ifdef __SSE3__
17 #include <pmmintrin.h>
18 #endif
19 #ifdef __SSE4_1__
20 #include <smmintrin.h>
21 #endif
22 
23 #endif
24 
25 #include<cmath>
26 
27 namespace mathSSE {
28  template<typename T> inline T sqrt(T t) { return std::sqrt(t);}
29 }
30 
31 namespace mathSSE {
32  //
33  template<typename T> inline bool samesign(T rh, T lh);
34 
35  template<>
36  inline bool
37  __attribute__((always_inline)) __attribute__ ((pure)) samesign<int>(int rh, int lh) {
38  int const mask= 0x80000000;
39  return ((rh^lh)&mask) == 0;
40  }
41 
42  template<>
43  inline bool
44  __attribute__((always_inline)) __attribute__ ((pure)) samesign<long long>(long long rh, long long lh) {
45  long long const mask= 0x8000000000000000LL;
46  return ((rh^lh)&mask) == 0;
47  }
48 
49  template<>
50  inline bool
51  __attribute__((always_inline)) __attribute__ ((pure)) samesign<float>(float rh, float lh) {
52  union { int i; float f; } a, b;
53  a.f=rh; b.f=lh;
54  return samesign<int>(a.i,b.i);
55  }
56 
57  template<>
58  inline bool
59  __attribute__((always_inline)) __attribute__ ((pure)) samesign<double>(double rh, double lh) {
60  union { long long i; double f; } a, b;
61  a.f=rh; b.f=lh;
62  return samesign<long long>(a.i,b.i);
63  }
64 }
65 
66 
67 namespace mathSSE {
68 #ifdef CMS_USE_SSE
69  //dot
70  inline __m128 _mm_dot_ps(__m128 v1, __m128 v2) {
71 #ifdef __SSE4_1__
72  return _mm_dp_ps(v1, v2, 0xff);
73 #else
74  __m128 mul = _mm_mul_ps(v1, v2);
75 #ifdef __SSE3__
76  mul = _mm_hadd_ps(mul,mul);
77  return _mm_hadd_ps(mul,mul);
78 #else
79  __m128 swp = _mm_shuffle_ps(mul, mul, _MM_SHUFFLE(1, 0, 3, 2));
80  mul = _mm_add_ps(mul, swp);
81  swp = _mm_shuffle_ps(mul, mul, _MM_SHUFFLE(2, 3, 0, 1));
82  return _mm_add_ps(mul, swp);
83 #endif
84 #endif
85  }
86 
87 
88  // cross (just 3x3)
89  inline __m128 _mm_cross_ps(__m128 v1, __m128 v2) {
90  __m128 v3 = _mm_shuffle_ps(v2, v1, _MM_SHUFFLE(3, 0, 2, 2));
91  __m128 v4 = _mm_shuffle_ps(v1, v2, _MM_SHUFFLE(3, 1, 0, 1));
92 
93  __m128 v5 = _mm_mul_ps(v3, v4);
94 
95  v3 = _mm_shuffle_ps(v1, v2, _MM_SHUFFLE(3, 0, 2, 2));
96  v4 = _mm_shuffle_ps(v2, v1, _MM_SHUFFLE(3, 1, 0, 1));
97 
98  v3 = _mm_mul_ps(v3, v4);
99  const __m128 neg = _mm_set_ps(0.0f,0.0f,-0.0f,0.0f);
100  return _mm_xor_ps(_mm_sub_ps(v5, v3), neg);
101  }
102 
103 
104 #endif // CMS_USE_SSE
105 
106 
107  template<typename T>
108  struct OldVec { T theX; T theY; T theZ; T theW;} __attribute__ ((aligned (16)));
109 
110 
111  template<typename T> union Vec2{
112  Vec2() {
113  arr[0] = 0; arr[1] = 0;
114  }
115  Vec2(T f1, T f2) {
116  arr[0] = f1; arr[1] = f2;
117  }
118  explicit Vec2(T f1) {
119  arr[0] = f1; arr[1] = f1;
120  }
121  void set(T f1, T f2) {
122  arr[0] = f1; arr[1] = f2;
123  }
124  Vec2 get1(unsigned int n) const {
125  return Vec2(arr[n],arr[n]);
126  }
127 
128  T & operator[](unsigned int n) {
129  return arr[n];
130  }
131 
132  T operator[](unsigned int n) const {
133  return arr[n];
134  }
135 
136 
137  T __attribute__ ((aligned(16))) arr[2];
138  };
139 
140 
141  template<typename T> union Vec4{
142  Vec4() {
143  arr[0] = 0; arr[1] = 0; arr[2] = 0; arr[3]=0;
144  }
145  Vec4(float f1, float f2, float f3, float f4=0) {
146  arr[0] = f1; arr[1] = f2; arr[2] = f3; arr[3]=f4;
147  }
148  explicit Vec4(float f1) {
149  set1(f1);
150  }
151  void set(float f1, float f2, float f3, float f4=0) {
152  arr[0] = f1; arr[1] = f2; arr[2] = f3; arr[3]=f4;
153  }
154  void set1(float f1) {
155  arr[0] = f1; arr[1] = f1; arr[2] = f1; arr[3]=f1;
156  }
157  Vec4 get1(unsigned int n) const {
158  return Vec4(arr[n],arr[n],arr[n],arr[n]);
159  }
160 
161  Vec2<T> xy() const { return Vec2<T>(arr[0],arr[1]);}
162  Vec2<T> zw() const { return Vec2<T>(arr[2],arr[3]);}
163 
164 
165 
166  T __attribute__ ((aligned(16))) arr[4];
167  OldVec<T> o;
168  };
169 
170 
171 #ifdef CMS_USE_SSE
172 
173  template<>
174  union Vec4<float> {
175  typedef __m128 nativeType;
176  __m128 vec;
177  float __attribute__ ((aligned(16))) arr[4];
179 
180  Vec4(__m128 ivec) : vec(ivec) {}
181 
182  Vec4(OldVec<float> const & ivec) : o(ivec) {}
183 
184  Vec4() {
185  vec = _mm_setzero_ps();
186  }
187 
188  explicit Vec4(float f1) {
189  set1(f1);
190  }
191 
192  Vec4(float f1, float f2, float f3, float f4=0) {
193  arr[0] = f1; arr[1] = f2; arr[2] = f3; arr[3]=f4;
194  }
195 
196  void set(float f1, float f2, float f3, float f4=0) {
197  vec = _mm_set_ps(f4, f3, f2, f1);
198  }
199  void set1(float f1) {
200  vec = _mm_set1_ps(f1);
201  }
202 
203  Vec4 get1(unsigned int n) const {
204  return _mm_shuffle_ps(vec, vec, _MM_SHUFFLE(n, n, n, n));
205  }
206 
207  float & operator[](unsigned int n) {
208  return arr[n];
209  }
210 
211  float operator[](unsigned int n) const {
212  return arr[n];
213  }
214 
215  Vec2<float> xy() const { return Vec2<float>(arr[0],arr[1]);}
216  Vec2<float> zw() const { return Vec2<float>(arr[2],arr[3]);}
217 
218  };
219 
220  template<>
221  union Vec2<double> {
222  typedef __m128d nativeType;
223  __m128d vec;
224  double __attribute__ ((aligned(16))) arr[2];
225 
226  Vec2(__m128d ivec) : vec(ivec) {}
227 
228  Vec2() {
229  vec = _mm_setzero_pd();
230  }
231 
232  Vec2(double f1, double f2) {
233  arr[0] = f1; arr[1] = f2;
234  }
235 
236  explicit Vec2(double f1) {
237  set1(f1);
238  }
239 
240  void set(double f1, double f2) {
241  arr[0] = f1; arr[1] = f2;
242  }
243 
244  void set1(double f1) {
245  vec = _mm_set1_pd(f1);
246  }
247 
248  Vec2 get1(unsigned int n) const {
249  return Vec2(arr[n],arr[n]);
250  }
251 
252  double operator[](unsigned int n) const {
253  return arr[n];
254  }
255  };
256 
257 
258  template<>
259  union Vec4<double> {
260  __m128d vec[2];
261  double __attribute__ ((aligned(16))) arr[4];
262  OldVec<double> o;
263 
264  Vec4(__m128d ivec[]) {
265  vec[0] = ivec[0];
266  vec[1] = ivec[1];
267  }
268 
269  Vec4(__m128d ivec0, __m128d ivec1) {
270  vec[0] = ivec0;
271  vec[1] = ivec1;
272  }
273 
274  Vec4() {
275  vec[0] = _mm_setzero_pd();
276  vec[1] = _mm_setzero_pd();
277  }
278 
279  explicit Vec4(double f1) {
280  set1(f1);
281  }
282 
283  Vec4(double f1, double f2, double f3, double f4=0) {
284  arr[0] = f1; arr[1] = f2; arr[2] = f3; arr[3]=f4;
285  }
286 
287  Vec4( Vec2<double> ivec0, Vec2<double> ivec1) {
288  vec[0] = ivec0.vec;
289  vec[1] = ivec1.vec;
290  }
291 
292  Vec4( Vec2<double> ivec0, double f3, double f4=0) {
293  vec[0] = ivec0.vec;
294  arr[2] = f3; arr[3] = f4;
295  }
296 
297  Vec4( Vec2<double> ivec0) {
298  vec[0] = ivec0.vec;
299  vec[1] = _mm_setzero_pd();
300  }
301 
302 
303  Vec4(OldVec<double> const & ivec) : o(ivec) {}
304 
305  void set(double f1, double f2, double f3, double f4=0) {
306  arr[0] = f1; arr[1] = f2; arr[2] = f3; arr[3]=f4;
307  }
308 
309  void set1(double f1) {
310  vec[0] = vec[1]= _mm_set1_pd(f1);
311  }
312 
313 
314  Vec4 get1(unsigned int n) const {
315  return Vec4(arr[n],arr[n],arr[n],arr[n]);
316  }
317 
318  double & operator[](unsigned int n) {
319  return arr[n];
320  }
321 
322  double operator[](unsigned int n) const {
323  return arr[n];
324  }
325 
326  Vec2<double> xy() const { return vec[0];}
327  Vec2<double> zw() const { return vec[1];}
328 
329  };
330 
331 #endif // CMS_USE_SSE
332 
338 
339  template<typename T>
340  struct As3D {
341  Vec4<T> const & v;
342  As3D(Vec4<T> const &iv ) : v(iv){}
343  };
344 
345  template<typename T>
346  inline As3D<T> as3D(Vec4<T> const &v ) { return v;}
347 
348 }
349 
350 #ifdef CMS_USE_SSE
351 
352 
353 //float op
354 
355 inline float dot(mathSSE::Vec4F a, mathSSE::Vec4F b) {
356  using mathSSE::_mm_dot_ps;
357  float s;
358  _mm_store_ss(&s,_mm_dot_ps(a.vec,b.vec));
359  return s;
360 }
361 
363  using mathSSE::_mm_cross_ps;
364  return _mm_cross_ps(a.vec,b.vec);
365 }
366 
367 
368 inline bool operator==(mathSSE::Vec4F a, mathSSE::Vec4F b) {
369  return _mm_movemask_ps(_mm_cmpeq_ps(a.vec,b.vec))==0xf;
370 }
371 
372 inline mathSSE::Vec4F cmpeq(mathSSE::Vec4F a, mathSSE::Vec4F b) {
373  return _mm_cmpeq_ps(a.vec,b.vec);
374 }
375 
376 inline mathSSE::Vec4F cmpgt(mathSSE::Vec4F a, mathSSE::Vec4F b) {
377  return _mm_cmpgt_ps(a.vec,b.vec);
378 }
379 
380 #ifdef __SSE3__
381 inline mathSSE::Vec4F hadd(mathSSE::Vec4F a, mathSSE::Vec4F b) {
382  return _mm_hadd_ps(a.vec,b.vec);
383 }
384 #endif
385 
386 
388  const __m128 neg = _mm_set_ps ( -0.0 , -0.0 , -0.0, -0.0);
389  return _mm_xor_ps(a.vec,neg);
390 }
391 
393  return _mm_and_ps(a.vec,b.vec);
394 }
396  return _mm_or_ps(a.vec,b.vec);
397 }
399  return _mm_xor_ps(a.vec,b.vec);
400 }
401 inline mathSSE::Vec4F andnot(mathSSE::Vec4F a, mathSSE::Vec4F b) {
402  return _mm_andnot_ps(a.vec,b.vec);
403 }
404 
405 
407  return _mm_add_ps(a.vec,b.vec);
408 }
409 
411  return _mm_sub_ps(a.vec,b.vec);
412 }
413 
415  return _mm_mul_ps(a.vec,b.vec);
416 }
417 
419  return _mm_div_ps(a.vec,b.vec);
420 }
421 
422 inline mathSSE::Vec4F operator*(float a, mathSSE::Vec4F b) {
423  return _mm_mul_ps(_mm_set1_ps(a),b.vec);
424 }
425 
426 inline mathSSE::Vec4F operator*(mathSSE::Vec4F b,float a) {
427  return _mm_mul_ps(_mm_set1_ps(a),b.vec);
428 }
429 
430 
431 // double op 2d
433  const __m128d neg = _mm_set_pd ( -0.0 , -0.0);
434  return _mm_xor_pd(a.vec,neg);
435 }
436 
437 
439  return _mm_and_pd(a.vec,b.vec);
440 }
442  return _mm_or_pd(a.vec,b.vec);
443 }
445  return _mm_xor_pd(a.vec,b.vec);
446 }
447 inline mathSSE::Vec2D andnot(mathSSE::Vec2D a, mathSSE::Vec2D b) {
448  return _mm_andnot_pd(a.vec,b.vec);
449 }
450 
451 
453  return _mm_add_pd(a.vec,b.vec);
454 }
455 
457  return _mm_sub_pd(a.vec,b.vec);
458 }
459 
461  return _mm_mul_pd(a.vec,b.vec);
462 }
463 
465  return _mm_div_pd(a.vec,b.vec);
466 }
467 
468 inline mathSSE::Vec2D operator*(double a, mathSSE::Vec2D b) {
469  return _mm_mul_pd(_mm_set1_pd(a),b.vec);
470 }
471 
472 inline mathSSE::Vec2D operator*(mathSSE::Vec2D b,double a) {
473  return _mm_mul_pd(_mm_set1_pd(a),b.vec);
474 }
475 
476 inline double dot(mathSSE::Vec2D a, mathSSE::Vec2D b) __attribute__((always_inline)) __attribute__ ((pure));
477 
478 inline double dot(mathSSE::Vec2D a, mathSSE::Vec2D b){
479  __m128d res = _mm_mul_pd ( a.vec, b.vec);
480  res = _mm_add_sd ( _mm_shuffle_pd ( res , res, 1 ), res );
481  double s;
482  _mm_store_sd(&s,res);
483  return s;
484 }
485 
486 inline double cross(mathSSE::Vec2D a, mathSSE::Vec2D b) __attribute__((always_inline)) __attribute__ ((pure));
487 
488 inline double cross(mathSSE::Vec2D a, mathSSE::Vec2D b) {
489  __m128d res = _mm_shuffle_pd ( b.vec, b.vec, 1);
490  res = _mm_mul_pd ( a.vec , res );
491  res = _mm_sub_sd (res, _mm_shuffle_pd ( res , res, 1 ));
492  double s;
493  _mm_store_sd(&s,res);
494  return s;
495 }
496 
497 
498 // double op 3d
499 
500 inline bool operator==(mathSSE::Vec4D a, mathSSE::Vec4D b) {
501  return
502  _mm_movemask_pd(_mm_cmpeq_pd(a.vec[0],b.vec[0]))==0x3 &&
503  _mm_movemask_pd(_mm_cmpeq_pd(a.vec[1],b.vec[1]))==0x3 ;
504 }
505 
507  const __m128d neg = _mm_set_pd ( -0.0 , -0.0);
508  return mathSSE::Vec4D(_mm_xor_pd(a.vec[0],neg),_mm_xor_pd(a.vec[1],neg));
509 }
510 
511 
513  return mathSSE::Vec4D(_mm_add_pd(a.vec[0],b.vec[0]),_mm_add_pd(a.vec[1],b.vec[1]));
514 }
516  return mathSSE::Vec4D(_mm_sub_pd(a.vec[0],b.vec[0]),_mm_sub_pd(a.vec[1],b.vec[1]));
517 }
519  return mathSSE::Vec4D(_mm_mul_pd(a.vec[0],b.vec[0]),_mm_mul_pd(a.vec[1],b.vec[1]));
520 }
522  return mathSSE::Vec4D(_mm_div_pd(a.vec[0],b.vec[0]),_mm_div_pd(a.vec[1],b.vec[1]));
523 }
524 
525 inline mathSSE::Vec4D operator*(double a, mathSSE::Vec4D b) {
526  __m128d res = _mm_set1_pd(a);
527  return mathSSE::Vec4D(_mm_mul_pd(res,b.vec[0]),_mm_mul_pd(res,b.vec[1]));
528 }
529 
530 inline mathSSE::Vec4D operator*(mathSSE::Vec4D b, double a) {
531  __m128d res = _mm_set1_pd(a);
532  return mathSSE::Vec4D(_mm_mul_pd(res,b.vec[0]),_mm_mul_pd(res,b.vec[1]));
533 }
534 
535 
536 
537 inline double dot(mathSSE::Vec4D a, mathSSE::Vec4D b) __attribute__((always_inline)) __attribute__ ((pure));
538 
539 inline double dot(mathSSE::Vec4D a, mathSSE::Vec4D b) {
540  __m128d res = _mm_add_sd ( _mm_mul_pd ( a.vec[0], b.vec[0]),
541  _mm_mul_sd ( a.vec[1], b.vec[1])
542  );
543  res = _mm_add_sd ( _mm_unpackhi_pd ( res , res ), res );
544  double s;
545  _mm_store_sd(&s,res);
546  return s;
547 }
548 
549 inline mathSSE::Vec4D cross(mathSSE::Vec4D a, mathSSE::Vec4D b) __attribute__((always_inline)) __attribute__ ((pure));
550 
551 inline mathSSE::Vec4D cross(mathSSE::Vec4D a, mathSSE::Vec4D b) {
552  const __m128d neg = _mm_set_pd ( 0.0 , -0.0 );
553  // lh .z * rh .x , lh .z * rh .y
554  __m128d l1 = _mm_mul_pd ( _mm_unpacklo_pd ( a.vec[1] , a.vec[1] ), b.vec[0] );
555  // rh .z * lh .x , rh .z * lh .y
556  __m128d l2 = _mm_mul_pd ( _mm_unpacklo_pd ( b.vec[1], b.vec[1] ), a.vec[0] );
557  __m128d m1 = _mm_sub_pd ( l1 , l2 ); // l1 - l2
558  m1 = _mm_shuffle_pd ( m1 , m1 , 1 ); // switch the elements
559  m1 = _mm_xor_pd ( m1 , neg ); // change the sign of the first element
560  // lh .x * rh .y , lh .y * rh .x
561  l1 = _mm_mul_pd ( a.vec[0] , _mm_shuffle_pd ( b.vec[0] , b.vec[0] , 1 ) );
562  // lh .x * rh .y - lh .y * rh .x
563  __m128d m2 = _mm_sub_sd ( l1 , _mm_unpackhi_pd ( l1 , l1 ) );
564 
565  return mathSSE::Vec4D( m1 , m2 );
566 }
567 
568 
569 
570 // sqrt
571 namespace mathSSE {
572  template<> inline Vec4F sqrt(Vec4F v) { return _mm_sqrt_ps(v.vec);}
573  template<> inline Vec2D sqrt(Vec2D v) { return _mm_sqrt_pd(v.vec);}
574  template<> inline Vec4D sqrt(Vec4D v) {
575  return Vec4D(_mm_sqrt_pd(v.vec[0]),_mm_sqrt_pd(v.vec[1]));
576  }
577 }
578 
579 // chephes func
581 namespace mathSSE {
582  inline Vec4F log(Vec4F v) { return log_ps(v.vec);}
583  inline Vec4F exp(Vec4F v) { return exp_ps(v.vec);}
584  inline Vec4F sin(Vec4F v) { return sin_ps(v.vec);}
585  inline Vec4F cos(Vec4F v) { return cos_ps(v.vec);}
586  inline void sincos(Vec4F v, Vec4F & s, Vec4F & c) { sincos_ps(v.vec,&s.vec, &c.vec);}
587 
588  inline float log(float f) { float s; _mm_store_ss(&s,log_ps(_mm_load_ss(&f))); return s;}
589  inline float exp(float f) { float s; _mm_store_ss(&s,exp_ps(_mm_load_ss(&f))); return s;}
590  inline float sin(float f) { float s; _mm_store_ss(&s,sin_ps(_mm_load_ss(&f))); return s;}
591  inline float cos(float f) { float s; _mm_store_ss(&s,log_ps(_mm_load_ss(&f))); return s;}
592  inline void sincos(float f, float & s, float & c) {
593  __m128 vs, vc;
594  sincos_ps(_mm_load_ss(&f),&vs, &vc);
595  _mm_store_ss(&s,vs);_mm_store_ss(&c,vc);
596  }
597 }
598 #endif // CMS_USE_SSE
599 
600 
601 #include <iosfwd>
602 std::ostream & operator<<(std::ostream & out, mathSSE::Vec2D const & v);
603 std::ostream & operator<<(std::ostream & out, mathSSE::Vec4F const & v);
604 std::ostream & operator<<(std::ostream & out, mathSSE::Vec4D const & v);
605 
606 std::ostream & operator<<(std::ostream & out, mathSSE::As3D<float> const & v);
607 std::ostream & operator<<(std::ostream & out, mathSSE::As3D<double> const & v);
608 
609 
610 #endif // DataFormat_Math_SSEVec_H
T & operator[](unsigned int n)
Definition: SSEVec.h:128
int i
Definition: DBlmapReader.cc:9
void set1(float f1)
Definition: SSEVec.h:154
Vec4< double > Vec4D
Definition: SSEVec.h:337
Vec4< float > Vec3F
Definition: SSEVec.h:334
Vec4< float > Vec4F
Definition: SSEVec.h:333
Vec2 get1(unsigned int n) const
Definition: SSEVec.h:124
MatrixMeschach operator+(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
MatrixMeschach operator-(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
Basic3DVector cross(const Basic3DVector &v) const
Vector product, or &quot;cross&quot; product, with a vector of same type.
void set(T f1, T f2)
Definition: SSEVec.h:121
strbitset operator|(const strbitset &l, const strbitset &r)
Definition: strbitset.cc:15
T dot(const Basic3DVector &v) const
Scalar product, or &quot;dot&quot; product, with a vector of same type.
bool operator==(const CaloTower &t1, const CaloTower &t2)
Definition: CaloTower.h:211
Exp< T >::type exp(const T &t)
Definition: Exp.h:22
bool int lh
Definition: SSEVec.h:37
std::ostream & operator<<(std::ostream &out, const ALILine &li)
Definition: ALILine.cc:187
T __attribute__((aligned(16))) arr[2]
Vec4 get1(unsigned int n) const
Definition: SSEVec.h:157
T operator[](unsigned int n) const
Definition: SSEVec.h:132
Vec4(float f1, float f2, float f3, float f4=0)
Definition: SSEVec.h:145
As3D< T > as3D(Vec4< T > const &v)
Definition: SSEVec.h:346
Vec2< T > zw() const
Definition: SSEVec.h:162
T sqrt(T t)
Definition: SSEVec.h:28
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Basic2DVector< T > operator/(const Basic2DVector< T > &v, const Scalar &s)
Vec4< double > Vec3D
Definition: SSEVec.h:336
struct mathSSE::Rot3 __attribute__
return samesign< long long >(a.i, b.i)
tuple out
Definition: dbtoconf.py:99
Vec4(float f1)
Definition: SSEVec.h:148
return samesign< int >(a.i, b.i)
Log< T >::type log(const T &t)
Definition: Log.h:22
double b
Definition: hdecay.h:120
As3D(Vec4< T > const &iv)
Definition: SSEVec.h:342
Vec2(T f1, T f2)
Definition: SSEVec.h:115
a f
Definition: SSEVec.h:53
bool samesign(T rh, T lh)
double a
Definition: hdecay.h:121
MatrixMeschach operator*(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
TwoHolder< T, U > operator&(const T &iT, const U &iU)
string s
Definition: asciidump.py:422
std::auto_ptr< ParameterDescriptionNode > operator^(ParameterDescriptionNode const &node_left, ParameterDescriptionNode const &node_right)
Vec4< T > const & v
Definition: SSEVec.h:341
mathSSE::Vec4< T > v
def template
Definition: svgfig.py:520
Vec2< double > Vec2D
Definition: SSEVec.h:335
void set(float f1, float f2, float f3, float f4=0)
Definition: SSEVec.h:151
Vec2< T > xy() const
Definition: SSEVec.h:161
Basic2DVector< T > xy() const
Vec2(T f1)
Definition: SSEVec.h:118