CbmRoot
P4_F64vec2.h
Go to the documentation of this file.
1 #ifndef L1Algo_F64vec2P4_H
2 #define L1Algo_F64vec2P4_H
3 
4 #include "vec_arithmetic.h"
5 #include <cmath>
6 #include <emmintrin.h>
7 #include <iostream>
8 
9 /**********************************
10  *
11  * Vector of four single doubles
12  *
13  **********************************/
14 
15 //#pragma pack(push,16)/* Must ensure class & union 16-B aligned */
16 
17 //typedef __m128d Vectordouble __attribute__ ((aligned(16)));
18 
19 const union {
20  double d;
21  long long i;
22 } __d_one = {(double) 1.};
23 
24 const union {
25  long long i[2];
26  __m128d m;
27 } __f64vec2_abs_mask_cheat = {{0x7fffffffffffffffll, 0x7fffffffffffffffll}},
28  __f64vec2_sgn_mask_cheat = {{0x8000000000000000ull, 0x8000000000000000ull}},
31  __f64vec2_true_cheat = {{0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}},
32  __f64vec2_false_cheat = {{0x0000000000000000, 0x0000000000000000}};
33 
34 #define _f64vec2_abs_mask (static_cast<F64vec2>(__f64vec2_abs_mask_cheat.m))
35 #define _f64vec2_sgn_mask (static_cast<F64vec2>(__f64vec2_sgn_mask_cheat.m))
36 #define _f64vec2_zero (static_cast<F64vec2>(__f64vec2_zero_cheat.m))
37 #define _f64vec2_one (static_cast<F64vec2>(__f64vec2_one_cheat.m))
38 #define _f64vec2_true (static_cast<F64vec2>(__f64vec2_true_cheat.m))
39 #define _f64vec2_false (static_cast<F64vec2>(__f64vec2_false_cheat.m))
40 
41 class F64vec2 {
42 public:
43  __m128d v;
44 
45  double& operator[](int i) { return (reinterpret_cast<double*>(&v))[i]; }
46  double operator[](int i) const {
47  return (reinterpret_cast<const double*>(&v))[i];
48  }
49 
50  F64vec2() : v(_mm_set_pd1(0)) {}
51  F64vec2(const __m128d& a) : v(a) {}
52  F64vec2(const double& a) : v(_mm_set_pd1(a)) {}
53 
54  F64vec2(const double& f0, const double& f1) : v(_mm_set_pd(f1, f0)) {}
55 
56  /* Conversion function */
57  operator __m128d() const { return v; } /* Convert to __m128d */
58 
59  /* Arithmetic Operators */
60  friend F64vec2 operator+(const F64vec2& a, const F64vec2& b) {
61  return _mm_add_pd(a, b);
62  }
63  friend F64vec2 operator-(const F64vec2& a, const F64vec2& b) {
64  return _mm_sub_pd(a, b);
65  }
66  friend F64vec2 operator*(const F64vec2& a, const F64vec2& b) {
67  return _mm_mul_pd(a, b);
68  }
69  friend F64vec2 operator/(const F64vec2& a, const F64vec2& b) {
70  return _mm_div_pd(a, b);
71  }
72 
73  /* Functions */
74  friend F64vec2 min(const F64vec2& a, const F64vec2& b) {
75  return _mm_min_pd(a, b);
76  }
77  friend F64vec2 max(const F64vec2& a, const F64vec2& b) {
78  return _mm_max_pd(a, b);
79  }
80 
81  /* Square Root */
82  friend F64vec2 sqrt(const F64vec2& a) { return _mm_sqrt_pd(a); }
83 
84  /* Reciprocal( inverse) Square Root */
85  friend F64vec2 rsqrt(const F64vec2& a) { return 1. / sqrt(a); }
86 
87  /* Reciprocal (inversion) */
88  // friend F64vec2 rcp ( const F64vec2 &a ){ return _mm_rcp_pd (a); }
89  /* Reciprocal (inversion) */
90  //friend F64vec2 rcp ( const F64vec2 &a ){ return 1. / a; }
91  /* NewtonRaphson Reciprocal
92  [2 * rcppd(x) - (x * rcppd(x) * rcppd(x))] */
93  friend F64vec2 rcp(const F64vec2& a) { return 1. / a; }
94 
95 
96  /* Absolute value */
97  friend F64vec2 fabs(const F64vec2& a) {
98  return _mm_and_pd(a, _f64vec2_abs_mask);
99  }
100 
101  /* Sign */
102  friend F64vec2 sgn(const F64vec2& a) {
103  return _mm_or_pd(_mm_and_pd(a, _f64vec2_sgn_mask), _f64vec2_one);
104  }
105  friend F64vec2 asgnb(const F64vec2& a, const F64vec2& b) {
106  return _mm_or_pd(_mm_and_pd(b, _f64vec2_sgn_mask), a);
107  }
108 
109  /* Logical */
110 
111  friend F64vec2 operator&(const F64vec2& a,
112  const F64vec2& b) { // mask returned
113  return _mm_and_pd(a, b);
114  }
115  friend F64vec2 operator|(const F64vec2& a,
116  const F64vec2& b) { // mask returned
117  return _mm_or_pd(a, b);
118  }
119  friend F64vec2 operator^(const F64vec2& a,
120  const F64vec2& b) { // mask returned
121  return _mm_xor_pd(a, b);
122  }
123  friend F64vec2 operator!(const F64vec2& a) { // mask returned
124  return _mm_xor_pd(a, _f64vec2_true);
125  }
126  // friend F64vec2 operator||( const F64vec2 &a, const F64vec2 &b ){ // mask returned
127  // return _mm_or_pd(a, b);
128  // }
129 
130  /* Comparison */
131 
132  friend F64vec2 operator<(const F64vec2& a,
133  const F64vec2& b) { // mask returned
134  return _mm_cmplt_pd(a, b);
135  }
136  friend F64vec2 operator<=(const F64vec2& a,
137  const F64vec2& b) { // mask returned
138  return _mm_cmple_pd(a, b);
139  }
140  friend F64vec2 operator>(const F64vec2& a,
141  const F64vec2& b) { // mask returned
142  return _mm_cmpgt_pd(a, b);
143  }
144  friend F64vec2 operator>=(const F64vec2& a,
145  const F64vec2& b) { // mask returned
146  return _mm_cmpge_pd(a, b);
147  }
148  friend F64vec2 operator==(const F64vec2& a,
149  const F64vec2& b) { // mask returned
150  return _mm_cmpeq_pd(a, b);
151  }
152 
153 #define if3(a, b, c) ((a) & (b)) | ((!(a)) & (c)) // analog (a) ? b : c
154 
155 #define NotEmpty(a) bool((a)[0]) | bool((a)[1]) | bool((a)[2]) | bool((a)[3])
156 #define Empty(a) !(bool((a)[0]) | bool((a)[1]) | bool((a)[2]) | bool((a)[3]))
157  // bool NotEmpty(const F64vec2 &a) { return a[0]||a[1]||a[2]||a[3]; }
158  // bool Empty(const F64vec2 &a) { return !(a[0]||a[1]||a[2]||a[3]); } // optimize
159  friend F64vec2 bool2int(const F64vec2& a) { // mask returned
160  return if3(a, 1, 0);
161  }
162 
163  /* Define all operators for consistensy */
164 
166 
167  /* Non intrinsic functions */
168 
169 #define _f1(A, F) F64vec2(F(A[0]), F(A[1]))
170 
171  friend F64vec2 exp(const F64vec2& a) { return _f1(a, exp); }
172  friend F64vec2 log(const F64vec2& a) { return _f1(a, log); }
173  friend F64vec2 sin(const F64vec2& a) { return _f1(a, sin); }
174  friend F64vec2 cos(const F64vec2& a) { return _f1(a, cos); }
175  friend F64vec2 acos(const F64vec2& a) { return _f1(a, acos); }
176 
177 #undef _f1
178 
179  friend F64vec2 atan2(const F64vec2& y, const F64vec2& x) {
180  const F64vec2 pi(3.1415926535897932);
181  const F64vec2 pi_2 = pi / 2;
182  const F64vec2 zero(0);
183 
184  const F64vec2& xZero = F64vec2(x == zero);
185  const F64vec2& yZero = F64vec2(y == zero);
186  const F64vec2& xNeg = F64vec2(x < zero);
187  const F64vec2& yNeg = F64vec2(y < zero);
188 
189  const F64vec2& absX = fabs(x);
190  const F64vec2& absY = fabs(y);
191 
192  F64vec2 a = absY / absX;
193  const F64vec2 pi_4 = pi / 4;
194  const F64vec2& gt_tan_3pi_8 = F64vec2(a > F64vec2(2.414213562373095));
195  const F64vec2& gt_tan_pi_8 =
196  F64vec2(a > F64vec2(0.4142135623730950)) & F64vec2(!gt_tan_3pi_8);
197  const F64vec2 minusOne(-1);
198  F64vec2 b(zero);
199  b = (pi_2 & gt_tan_3pi_8) + (F64vec2(!gt_tan_3pi_8) & b);
200  b = (pi_4 & gt_tan_pi_8) + (F64vec2(!gt_tan_pi_8) & b);
201  a = (gt_tan_3pi_8 & (minusOne / a)) + (F64vec2(!gt_tan_3pi_8) & a);
202  a = (gt_tan_pi_8 & ((absY - absX) / (absY + absX)))
203  + (F64vec2(!gt_tan_pi_8) & a);
204  const F64vec2& a2 = a * a;
205  b +=
206  (((8.05374449538e-2 * a2 - 1.38776856032E-1) * a2 + 1.99777106478E-1) * a2
207  - 3.33329491539E-1)
208  * a2 * a
209  + a;
210  F64vec2 xyNeg = F64vec2(xNeg ^ yNeg);
211  b = (xyNeg & (-b)) + (F64vec2(!xyNeg) & b);
212  xyNeg = F64vec2(xNeg & !yNeg);
213  b = (xyNeg & (b + pi)) + (F64vec2(!xyNeg) & b);
214  xyNeg = F64vec2(xNeg & yNeg);
215  b = (xyNeg & (b - pi)) + (F64vec2(!xyNeg) & b);
216  xyNeg = F64vec2(xZero & yZero);
217  b = (xyNeg & zero) + (F64vec2(!xyNeg) & b);
218  xyNeg = F64vec2(xZero & yNeg);
219  b = (xyNeg & (-pi_2)) + (F64vec2(!xyNeg) & b);
220  return b;
221  }
222 
223  friend std::ostream& operator<<(std::ostream& strm, const F64vec2& a) {
224  strm << "[" << a[0] << " " << a[1] << " " << a[2] << " " << a[3] << "]";
225  return strm;
226  }
227 
228  friend std::istream& operator>>(std::istream& strm, F64vec2& a) {
229  double tmp;
230  strm >> tmp;
231  a = tmp;
232  return strm;
233  }
234 
235 } __attribute__((aligned(16)));
236 
237 
238 typedef F64vec2 fvec;
239 typedef double fscal;
240 const int fvecLen = 2;
241 //#define fvec_true _f64vec2_true
242 //#define fvec_false _f64vec2_false
243 #define _fvecalignment __attribute__((aligned(16)))
244 
245 
246 #include "std_alloc.h"
247 
248 
249 #endif
F64vec2::exp
friend F64vec2 exp(const F64vec2 &a)
Definition: P4_F64vec2.h:171
if3
#define if3(a, b, c)
Definition: P4_F64vec2.h:111
F64vec2::operator+
friend F64vec2 operator+(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:60
__attribute__
class F64vec2 __attribute__((aligned(16)))
F64vec2::atan2
friend F64vec2 atan2(const F64vec2 &y, const F64vec2 &x)
Definition: P4_F64vec2.h:179
vec_arithmetic.h
F64vec2::operator[]
double operator[](int i) const
Definition: P4_F64vec2.h:46
F64vec2::operator|
friend F64vec2 operator|(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:115
_f64vec2_sgn_mask
#define _f64vec2_sgn_mask
Definition: P4_F64vec2.h:35
F64vec2::sqrt
friend F64vec2 sqrt(const F64vec2 &a)
Definition: P4_F64vec2.h:82
F64vec2::asgnb
friend F64vec2 asgnb(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:105
__f64vec2_abs_mask_cheat
const union @14 __f64vec2_abs_mask_cheat
F64vec2::operator>
friend F64vec2 operator>(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:140
F64vec2::operator/
friend F64vec2 operator/(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:69
fvec
F64vec2 fvec
Definition: P4_F64vec2.h:238
_f64vec2_true
#define _f64vec2_true
Definition: P4_F64vec2.h:38
F64vec2::F64vec2
F64vec2(const double &a)
Definition: P4_F64vec2.h:52
std_alloc.h
F64vec2::operator<<
friend std::ostream & operator<<(std::ostream &strm, const F64vec2 &a)
Definition: P4_F64vec2.h:223
F64vec2::operator^
friend F64vec2 operator^(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:119
__f64vec2_sgn_mask_cheat
const union @14 __f64vec2_sgn_mask_cheat
F64vec2::F64vec2
F64vec2()
Definition: P4_F64vec2.h:50
fscal
double fscal
Definition: P4_F64vec2.h:239
F64vec2::operator==
friend F64vec2 operator==(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:148
F64vec2::operator<
friend F64vec2 operator<(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:132
F64vec2::F64vec2
F64vec2(const double &f0, const double &f1)
Definition: P4_F64vec2.h:54
F64vec2::fabs
friend F64vec2 fabs(const F64vec2 &a)
Definition: P4_F64vec2.h:97
F64vec2::rsqrt
friend F64vec2 rsqrt(const F64vec2 &a)
Definition: P4_F64vec2.h:85
d
double d
Definition: P4_F64vec2.h:24
m
__m128d m
Definition: P4_F64vec2.h:26
_f1
#define _f1(A, F)
Definition: P4_F64vec2.h:127
F64vec2::log
friend F64vec2 log(const F64vec2 &a)
Definition: P4_F64vec2.h:172
__f64vec2_zero_cheat
const union @14 __f64vec2_zero_cheat
__f64vec2_true_cheat
const union @14 __f64vec2_true_cheat
_f64vec2_abs_mask
#define _f64vec2_abs_mask
Definition: P4_F64vec2.h:34
__d_one
const union @13 __d_one
F64vec2::operator!
friend F64vec2 operator!(const F64vec2 &a)
Definition: P4_F64vec2.h:123
F64vec2::operator>>
friend std::istream & operator>>(std::istream &strm, F64vec2 &a)
Definition: P4_F64vec2.h:228
F64vec2::rcp
friend F64vec2 rcp(const F64vec2 &a)
Definition: P4_F64vec2.h:93
F64vec2::operator&
friend F64vec2 operator&(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:111
F64vec2::v
__m128d v
Definition: P4_F64vec2.h:43
F64vec2::acos
friend F64vec2 acos(const F64vec2 &a)
Definition: P4_F64vec2.h:175
__f64vec2_one_cheat
const union @14 __f64vec2_one_cheat
F64vec2::cos
friend F64vec2 cos(const F64vec2 &a)
Definition: P4_F64vec2.h:174
F64vec2::sgn
friend F64vec2 sgn(const F64vec2 &a)
Definition: P4_F64vec2.h:102
x
Double_t x
Definition: CbmMvdSensorDigiToHitTask.cxx:68
y
Double_t y
Definition: CbmMvdSensorDigiToHitTask.cxx:68
F64vec2::operator>=
friend F64vec2 operator>=(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:144
F64vec2::sin
friend F64vec2 sin(const F64vec2 &a)
Definition: P4_F64vec2.h:173
__f64vec2_false_cheat
const union @14 __f64vec2_false_cheat
F64vec2::operator<=
friend F64vec2 operator<=(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:136
F64vec2
Definition: P4_F64vec2.h:41
fvecLen
const int fvecLen
Definition: P4_F64vec2.h:240
F64vec2::operator[]
double & operator[](int i)
Definition: P4_F64vec2.h:45
F64vec2::max
friend F64vec2 max(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:77
F64vec2::operator-
friend F64vec2 operator-(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:63
F64vec2::min
friend F64vec2 min(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:74
F64vec2::bool2int
friend F64vec2 bool2int(const F64vec2 &a)
Definition: P4_F64vec2.h:159
i
long long i
Definition: P4_F64vec2.h:25
F64vec2::vec_arithmetic
vec_arithmetic(F64vec2, double)
F64vec2::operator*
friend F64vec2 operator*(const F64vec2 &a, const F64vec2 &b)
Definition: P4_F64vec2.h:66
_f64vec2_one
#define _f64vec2_one
Definition: P4_F64vec2.h:37