CbmRoot
PSEUDO_F32vec4.h
Go to the documentation of this file.
1 #ifndef L1Algo_PSEUDO_F32vec4_H
2 #define L1Algo_PSEUDO_F32vec4_H
3 
4 #include "vec_arithmetic.h"
5 #include <cmath>
6 #include <iostream>
7 
8 /**********************************
9  *
10  * Vector of four floats
11  *
12  **********************************/
13 
14 
15 float min(float x, float y);
16 float max(float x, float y);
17 float asgnb(float x, float y);
18 float rsqrt(float x);
19 float rcp(float x);
20 float sgn(float x);
21 
22 class F32vec4 {
23 
24 
25 public:
26  float v[4];
27 
28  float& operator[](int i) { return ((float*) &v)[i]; }
29  float operator[](int i) const { return ((float*) &v)[i]; }
30 
31  F32vec4() {}
32  F32vec4(const F32vec4& a) {
33  v[0] = a.v[0];
34  v[1] = a.v[1];
35  v[2] = a.v[2];
36  v[3] = a.v[3];
37  }
38  F32vec4(const float& a) {
39  v[0] = a;
40  v[1] = a;
41  v[2] = a;
42  v[3] = a;
43  }
44 
45  F32vec4(const float& f0, const float& f1, const float& f2, const float& f3) {
46  v[0] = f0;
47  v[1] = f1;
48  v[2] = f2;
49  v[3] = f3;
50  }
51 
52 
53 #define _f2(A, B, F) \
54  F32vec4 z; \
55  z.v[0] = F(A.v[0], B.v[0]); \
56  z.v[1] = F(A.v[1], B.v[1]); \
57  z.v[2] = F(A.v[2], B.v[2]); \
58  z.v[3] = F(A.v[3], B.v[3]); \
59  return z;
60 #define _f1(A, F) \
61  F32vec4 z; \
62  z.v[0] = F(A.v[0]); \
63  z.v[1] = F(A.v[1]); \
64  z.v[2] = F(A.v[2]); \
65  z.v[3] = F(A.v[3]); \
66  return z;
67 #define _op(A, B, O) \
68  F32vec4 z; \
69  z.v[0] = A.v[0] O B.v[0]; \
70  z.v[1] = A.v[1] O B.v[1]; \
71  z.v[2] = A.v[2] O B.v[2]; \
72  z.v[3] = A.v[3] O B.v[3]; \
73  return z;
74 
75  /* Arithmetic Operators */
76  friend F32vec4 operator+(const F32vec4& a, const F32vec4& b) { _op(a, b, +) }
77  friend F32vec4 operator-(const F32vec4& a, const F32vec4& b) { _op(a, b, -) }
78  friend F32vec4 operator*(const F32vec4& a, const F32vec4& b) { _op(a, b, *) }
79  friend F32vec4 operator/(const F32vec4& a, const F32vec4& b) { _op(a, b, /) }
80 
81  /* Comparison */
82  friend F32vec4 operator<(const F32vec4& a, const F32vec4& b) { _op(a, b, <) }
83  friend F32vec4 operator<=(const F32vec4& a, const F32vec4& b) {
84  _op(a, b, <=)
85  }
86  friend F32vec4 operator>(const F32vec4& a, const F32vec4& b) { _op(a, b, >) }
87  friend F32vec4 operator>=(const F32vec4& a, const F32vec4& b) {
88  _op(a, b, >=)
89  }
90 
91  /* Logic */
92  friend F32vec4 operator&(const F32vec4& a, const F32vec4& b) { _op(a, b, &&) }
93  friend F32vec4 operator|(const F32vec4& a, const F32vec4& b) { _op(a, b, ||) }
94  friend F32vec4 operator||(const F32vec4& a, const F32vec4& b) {
95  _op(a, b, ||)
96  }
97 
98  friend F32vec4 operator!(const F32vec4& a) {
100  z[0] = !a[0];
101  z[1] = !a[1];
102  z[2] = !a[2];
103  z[3] = !a[3];
104 
105  return z;
106  }
107 
108  friend F32vec4 if3(const F32vec4& a, const F32vec4& b, const F32vec4& c) {
110  z[0] = (a[0]) ? b[0] : c[0];
111  z[1] = (a[1]) ? b[1] : c[1];
112  z[2] = (a[2]) ? b[2] : c[2];
113  z[3] = (a[3]) ? b[3] : c[3];
114 
115  return z;
116  }
117 
118 #define NotEmpty(a) bool((a)[0]) | bool((a)[1]) | bool((a)[2]) | bool((a)[3])
119 #define Empty(a) !(bool((a)[0]) | bool((a)[1]) | bool((a)[2]) | bool((a)[3]))
120  // bool NotEmpty(const F32vec4 &a) { return a[0]||a[1]||a[2]||a[3]; }
121  // bool Empty(const F32vec4 &a) { return !(a[0]||a[1]||a[2]||a[3]); } // optimize
122  friend F32vec4 bool2int(const F32vec4& a) { // mask returned
123  return if3(a, 1, 0);
124  }
125 
126 
127  /* Functions */
128  friend float min(float x, float y) { return x < y ? x : y; }
129  friend float max(float x, float y) { return x < y ? y : x; }
130  friend float asgnb(float x, float y) { return y >= 0 ? fabs(x) : -fabs(x); }
131  friend float rsqrt(float x) { return 1. / sqrt(x); }
132  friend float rcp(float x) { return 1. / x; }
133  friend float sgn(float x) { return x >= 0 ? 1 : -1; }
134 
135  friend F32vec4 min(const F32vec4& a, const F32vec4& b) { _f2(a, b, min) }
136  friend F32vec4 max(const F32vec4& a, const F32vec4& b) { _f2(a, b, max) }
137  friend F32vec4 asgnb(const F32vec4& a, const F32vec4& b) { _f2(a, b, asgnb) }
138  friend F32vec4 sqrt(const F32vec4& a) { _f1(a, sqrt) }
139  friend F32vec4 rsqrt(const F32vec4& a) { _f1(a, rsqrt) }
140  friend F32vec4 rcp(const F32vec4& a) { _f1(a, rcp) }
141  friend F32vec4 fabs(const F32vec4& a) { _f1(a, fabs) }
142  friend F32vec4 sgn(const F32vec4& a) { _f1(a, sgn) }
143  friend F32vec4 exp(const F32vec4& a) { _f1(a, exp) }
144  friend F32vec4 log(const F32vec4& a) { _f1(a, log) }
145  friend F32vec4 sin(const F32vec4& a) { _f1(a, sin) }
146  friend F32vec4 cos(const F32vec4& a) { _f1(a, cos) }
147 #undef _f1
148 #undef _f2
149 #undef _op
150 
151  /* Define all operators for consistensy */
152 
154 
155  friend ostream& operator<<(ostream& strm, const F32vec4& a) {
156  strm << a[0] << " " << a[1] << " " << a[2] << " " << a[3];
157  return strm;
158  }
159 
160  friend istream& operator>>(istream& strm, F32vec4& a) {
161  float tmp;
162  strm >> tmp;
163  a = tmp;
164  return strm;
165  }
166 
167 } __attribute__((aligned(16)));
168 ;
169 
170 typedef F32vec4 fvec;
171 typedef float fscal;
172 const int fvecLen = 4;
173 //#define fvec_true _f32vec4_true
174 //#define fvec_false _f32vec4_false
175 #define _fvecalignment
176 
177 namespace nsL1 {
178  template<typename T>
179  struct vector {
180  typedef std::vector<T> TStd;
181  typedef std::vector<T> TSimd;
182  };
183 
185 }; // namespace nsL1
186 
187 template<typename T>
188 struct nsL1vector :
189  public nsL1::vector<T> // just for use std::vector simultaniosly
190 {};
191 
192 #endif
F32vec4::exp
friend F32vec4 exp(const F32vec4 &a)
Definition: PSEUDO_F32vec4.h:143
nsL1
Definition: L1/vectors/PSEUDO_F32vec1.h:144
F32vec4::max
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
Definition: PSEUDO_F32vec4.h:136
F32vec4::operator||
friend F32vec4 operator||(const F32vec4 &a, const F32vec4 &b)
Definition: PSEUDO_F32vec4.h:94
F32vec4::rsqrt
friend F32vec4 rsqrt(const F32vec4 &a)
Definition: PSEUDO_F32vec4.h:139
F32vec4::fabs
friend F32vec4 fabs(const F32vec4 &a)
Definition: L1/vectors/P4_F32vec4.h:108
F32vec4
Definition: L1/vectors/P4_F32vec4.h:47
vec_arithmetic.h
fscal
float fscal
Definition: PSEUDO_F32vec4.h:171
F32vec4::operator/
friend F32vec4 operator/(const F32vec4 &a, const F32vec4 &b)
Definition: PSEUDO_F32vec4.h:79
F32vec4::log
friend F32vec4 log(const F32vec4 &a)
Definition: PSEUDO_F32vec4.h:144
rsqrt
float rsqrt(float x)
Definition: PSEUDO_F32vec4.h:108
F32vec4::max
friend float max(float x, float y)
Definition: PSEUDO_F32vec4.h:129
i
int i
Definition: L1/vectors/P4_F32vec4.h:25
F32vec4::operator!
friend F32vec4 operator!(const F32vec4 &a)
Definition: PSEUDO_F32vec4.h:98
F32vec4::operator|
friend F32vec4 operator|(const F32vec4 &a, const F32vec4 &b)
Definition: PSEUDO_F32vec4.h:93
F32vec4::operator>=
friend F32vec4 operator>=(const F32vec4 &a, const F32vec4 &b)
Definition: PSEUDO_F32vec4.h:87
F32vec4::sqrt
friend F32vec4 sqrt(const F32vec4 &a)
Definition: L1/vectors/P4_F32vec4.h:89
F32vec4::v
__m128 v
Definition: L1/vectors/P4_F32vec4.h:49
_f2
#define _f2(A, B, F)
Definition: PSEUDO_F32vec4.h:30
F32vec4::operator[]
float operator[](int i) const
Definition: PSEUDO_F32vec4.h:29
F32vec4::rsqrt
friend float rsqrt(float x)
Definition: PSEUDO_F32vec4.h:131
F32vec4::operator<
friend F32vec4 operator<(const F32vec4 &a, const F32vec4 &b)
Definition: PSEUDO_F32vec4.h:82
F32vec4::cos
friend F32vec4 cos(const F32vec4 &a)
Definition: PSEUDO_F32vec4.h:146
max
float max(float x, float y)
Definition: PSEUDO_F32vec4.h:106
asgnb
float asgnb(float x, float y)
Definition: PSEUDO_F32vec4.h:107
min
float min(float x, float y)
Definition: PSEUDO_F32vec4.h:105
__attribute__
nsL1vector __attribute__
F32vec4::F32vec4
F32vec4(const F32vec4 &a)
Definition: PSEUDO_F32vec4.h:32
F32vec4::operator+
friend F32vec4 operator+(const F32vec4 &a, const F32vec4 &b)
Definition: PSEUDO_F32vec4.h:76
_f1
#define _f1(A, F)
Definition: PSEUDO_F32vec4.h:37
F32vec4::operator-
friend F32vec4 operator-(const F32vec4 &a, const F32vec4 &b)
Definition: PSEUDO_F32vec4.h:77
F32vec4::asgnb
friend F32vec4 asgnb(const F32vec4 &a, const F32vec4 &b)
Definition: L1/vectors/P4_F32vec4.h:116
F32vec4::operator>>
friend istream & operator>>(istream &strm, F32vec4 &a)
Definition: PSEUDO_F32vec4.h:160
F32vec4::operator[]
float & operator[](int i)
Definition: PSEUDO_F32vec4.h:28
F32vec4::sgn
friend float sgn(float x)
Definition: PSEUDO_F32vec4.h:133
_op
#define _op(A, B, O)
Definition: PSEUDO_F32vec4.h:44
fvecLen
const int fvecLen
Definition: PSEUDO_F32vec4.h:172
F32vec4::rcp
friend F32vec4 rcp(const F32vec4 &a)
Definition: L1/vectors/P4_F32vec4.h:100
F32vec4::operator<<
friend ostream & operator<<(ostream &strm, const F32vec4 &a)
Definition: PSEUDO_F32vec4.h:155
rcp
float rcp(float x)
Definition: PSEUDO_F32vec4.h:109
nsL1::vector_fvec
nsL1::vector< fvec >::TSimd vector_fvec
Definition: L1/vectors/PSEUDO_F32vec1.h:151
x
Double_t x
Definition: CbmMvdSensorDigiToHitTask.cxx:68
F32vec4::operator&
friend F32vec4 operator&(const F32vec4 &a, const F32vec4 &b)
Definition: PSEUDO_F32vec4.h:92
nsL1::vector::TSimd
std::vector< T > TSimd
Definition: PSEUDO_F32vec4.h:181
y
Double_t y
Definition: CbmMvdSensorDigiToHitTask.cxx:68
F32vec4::sgn
friend F32vec4 sgn(const F32vec4 &a)
Definition: PSEUDO_F32vec4.h:142
nsL1::vector::TStd
std::vector< T > TStd
Definition: PSEUDO_F32vec4.h:180
F32vec4::min
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
Definition: PSEUDO_F32vec4.h:135
F32vec4::min
friend float min(float x, float y)
Definition: PSEUDO_F32vec4.h:128
F32vec4::F32vec4
F32vec4()
Definition: L1/vectors/P4_F32vec4.h:56
F32vec4::bool2int
friend F32vec4 bool2int(const F32vec4 &a)
Definition: L1/vectors/P4_F32vec4.h:170
nsL1::vector
Definition: L1/vectors/PSEUDO_F32vec1.h:146
F32vec4::if3
friend F32vec4 if3(const F32vec4 &a, const F32vec4 &b, const F32vec4 &c)
Definition: PSEUDO_F32vec4.h:108
F32vec4::sin
friend F32vec4 sin(const F32vec4 &a)
Definition: PSEUDO_F32vec4.h:145
F32vec4::operator<=
friend F32vec4 operator<=(const F32vec4 &a, const F32vec4 &b)
Definition: PSEUDO_F32vec4.h:83
F32vec4::vec_arithmetic
vec_arithmetic(F32vec4, float)
nsL1vector
Definition: L1/vectors/PSEUDO_F32vec1.h:157
fvec
F32vec4 fvec
Definition: PSEUDO_F32vec4.h:168
F32vec4::operator>
friend F32vec4 operator>(const F32vec4 &a, const F32vec4 &b)
Definition: PSEUDO_F32vec4.h:86
F32vec4::operator*
friend F32vec4 operator*(const F32vec4 &a, const F32vec4 &b)
Definition: PSEUDO_F32vec4.h:78
sgn
float sgn(float x)
Definition: PSEUDO_F32vec4.h:110