44
55#ifdef ROOT_VECTORIZED_TMATH
66
7+ namespace {
8+
9+ template <class T , class V , class M >
10+ T blend_simd (M const &mask, V const &src1, V const &src2)
11+ {
12+ T v{};
13+ where (mask, v) = src1;
14+ where (!mask, v) = src2;
15+ return v;
16+ }
17+
18+ } // namespace
19+
720namespace TMath {
821// //////////////////////////////////////////////////////////////////////////////
922::ROOT::Double_v Log2 (::ROOT::Double_v &x)
@@ -32,7 +45,7 @@ ::ROOT::Double_v Gaus(::ROOT::Double_v &x, Double_t mean, Double_t sigma, Bool_t
3245
3346 // For those entries of |arg| > 39 result is zero in double precision
3447 ::ROOT::Double_v out =
35- vecCore::Blend <::ROOT::Double_v>(abs (arg) < ::ROOT::Double_v (39.0 ),
48+ blend_simd <::ROOT::Double_v>(abs (arg) < ::ROOT::Double_v (39.0 ),
3649 exp (::ROOT::Double_v (-0.5 ) * arg * arg), ::ROOT::Double_v (0.0 ));
3750 if (norm)
3851 out *= 0.3989422804014327 * inv_sigma; // 1/sqrt(2*Pi)=0.3989422804014327
@@ -65,7 +78,7 @@ ::ROOT::Double_v LaplaceDistI(::ROOT::Double_v &x, Double_t alpha, Double_t beta
6578{
6679 ::ROOT::Double_v alpha_v = ::ROOT::Double_v (alpha);
6780 ::ROOT::Double_v beta_v_inv = ::ROOT::Double_v (1.0 ) / ::ROOT::Double_v (beta);
68- return vecCore::Blend <::ROOT::Double_v>(
81+ return blend_simd <::ROOT::Double_v>(
6982 x <= alpha_v, 0.5 * exp (-abs ((x - alpha_v) * beta_v_inv)),
7083 1 - 0.5 * exp (-abs ((x - alpha_v) * beta_v_inv)));
7184}
@@ -98,9 +111,9 @@ ::ROOT::Double_v Freq(::ROOT::Double_v &x)
98111
99112 ::ROOT::Double_v result{};
100113
101- vecCore::Mask<::ROOT::Double_v> mask1 = v < ::ROOT::Double_v (0.5 );
102- vecCore::Mask<::ROOT::Double_v> mask2 = !mask1 && v < ::ROOT::Double_v (4.0 );
103- vecCore::Mask<::ROOT::Double_v> mask3 = !(mask1 || mask2);
114+ auto mask1 = v < ::ROOT::Double_v (0.5 );
115+ auto mask2 = !mask1 && v < ::ROOT::Double_v (4.0 );
116+ auto mask3 = !(mask1 || mask2);
104117
105118 ::ROOT::Double_v v2 = v * v;
106119 ::ROOT::Double_v v3 = v2 * v;
@@ -110,20 +123,16 @@ ::ROOT::Double_v Freq(::ROOT::Double_v &x)
110123 ::ROOT::Double_v v7 = v6 * v;
111124 ::ROOT::Double_v v8 = v7 * v;
112125
113- vecCore::MaskedAssign<::ROOT::Double_v>(
114- result, mask1, v * (p10 + p11 * v2 + p12 * v4 + p13 * v6) / (q10 + q11 * v2 + q12 * v4 + v6));
115- vecCore::MaskedAssign<::ROOT::Double_v>(
116- result, mask2,
117- ::ROOT::Double_v (1.0 ) -
126+ where (mask1, result) = v * (p10 + p11 * v2 + p12 * v4 + p13 * v6) / (q10 + q11 * v2 + q12 * v4 + v6);
127+ where (mask2, result) = ::ROOT::Double_v (1.0 ) -
118128 (p20 + p21 * v + p22 * v2 + p23 * v3 + p24 * v4 + p25 * v5 + p26 * v6 + p27 * v7) /
119- (exp(v2) * (q20 + q21 * v + q22 * v2 + q23 * v3 + q24 * v4 + q25 * v5 + q26 * v6 + v7)));
120- vecCore::MaskedAssign<::ROOT::Double_v>(result, mask3,
121- ::ROOT::Double_v (1.0 ) -
129+ (exp (v2) * (q20 + q21 * v + q22 * v2 + q23 * v3 + q24 * v4 + q25 * v5 + q26 * v6 + v7));
130+ where (mask3, result) = ::ROOT::Double_v (1.0 ) -
122131 (c1 + (p30 * v8 + p31 * v6 + p32 * v4 + p33 * v2 + p34) /
123132 ((q30 * v8 + q31 * v6 + q32 * v4 + q33 * v2 + q34) * v2)) /
124- (v * exp (v2))) ;
133+ (v * exp (v2));
125134
126- return vecCore::Blend <::ROOT::Double_v>(x > 0 , ::ROOT::Double_v(0.5 ) + ::ROOT::Double_v(0.5 ) * result,
135+ return blend_simd <::ROOT::Double_v>(x > 0 , ::ROOT::Double_v (0.5 ) + ::ROOT::Double_v (0.5 ) * result,
127136 ::ROOT::Double_v (0.5 ) * (::ROOT::Double_v(1 ) - result));
128137}
129138
@@ -153,7 +162,7 @@ ::ROOT::Double_v BesselI0(::ROOT::Double_v &x)
153162{
154163 ::ROOT::Double_v ax = abs (x);
155164
156- return vecCore::Blend <::ROOT::Double_v>(ax <= 3.75 , BesselI0_Split_Less (x), BesselI0_Split_More (ax));
165+ return blend_simd <::ROOT::Double_v>(ax <= 3.75 , BesselI0_Split_Less (x), BesselI0_Split_More (ax));
157166}
158167
159168// //////////////////////////////////////////////////////////////////////////////
@@ -168,7 +177,7 @@ ::ROOT::Double_v BesselI1_Split_More(::ROOT::Double_v &ax, ::ROOT::Double_v &x)
168177 y * (1.63801e-3 + y * (-1.031555e-2 +
169178 y * (2.282967e-2 + y * (-2.895312e-2 +
170179 y * (1.787654e-2 + y * -4.20059e-3 ))))))));
171- return vecCore::Blend <::ROOT::Double_v>(x < 0 , ::ROOT::Double_v (-1.0 ) * result, result);
180+ return blend_simd <::ROOT::Double_v>(x < 0 , ::ROOT::Double_v (-1.0 ) * result, result);
172181}
173182
174183::ROOT::Double_v BesselI1_Split_Less (::ROOT::Double_v &x)
@@ -183,7 +192,7 @@ ::ROOT::Double_v BesselI1(::ROOT::Double_v &x)
183192{
184193 ::ROOT::Double_v ax = abs (x);
185194
186- return vecCore::Blend <::ROOT::Double_v>(ax <= 3.75 , BesselI1_Split_Less (x), BesselI1_Split_More (ax, x));
195+ return blend_simd <::ROOT::Double_v>(ax <= 3.75 , BesselI1_Split_Less (x), BesselI1_Split_More (ax, x));
187196}
188197
189198// //////////////////////////////////////////////////////////////////////////////
@@ -212,7 +221,7 @@ ::ROOT::Double_v BesselJ0_Split1_Less(::ROOT::Double_v &x)
212221::ROOT::Double_v BesselJ0 (::ROOT::Double_v &x)
213222{
214223 ::ROOT::Double_v ax = abs (x);
215- return vecCore::Blend <::ROOT::Double_v>(ax < 8 , BesselJ0_Split1_Less (x), BesselJ0_Split1_More (ax));
224+ return blend_simd <::ROOT::Double_v>(ax < 8 , BesselJ0_Split1_Less (x), BesselJ0_Split1_More (ax));
216225}
217226
218227// //////////////////////////////////////////////////////////////////////////////
@@ -228,7 +237,7 @@ ::ROOT::Double_v BesselJ1_Split1_More(::ROOT::Double_v &ax, ::ROOT::Double_v &x)
228237 0.04687499995 + y * (-0.2002690873e-3 + y * (0.8449199096e-5 + y * (-0.88228987e-6 - y * 0.105787412e-6 )));
229238 ::ROOT::Double_v result =
230239 sqrt (0.636619772 / ax) * (cos (xx) * result1 - z * sin (xx) * result2);
231- vecCore::MaskedAssign<::ROOT::Double_v>(result, x < 0 , - result);
240+ where ( x < 0 , result) = -result ;
232241 return result;
233242}
234243
@@ -244,7 +253,7 @@ ::ROOT::Double_v BesselJ1_Split1_Less(::ROOT::Double_v &x)
244253::ROOT::Double_v BesselJ1 (::ROOT::Double_v &x)
245254{
246255 ::ROOT::Double_v ax = abs (x);
247- return vecCore::Blend <::ROOT::Double_v>(ax < 8 , BesselJ1_Split1_Less (x), BesselJ1_Split1_More (ax, x));
256+ return blend_simd <::ROOT::Double_v>(ax < 8 , BesselJ1_Split1_Less (x), BesselJ1_Split1_More (ax, x));
248257}
249258
250259} // namespace TMath
0 commit comments