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