xref: /freebsd-src/contrib/arm-optimized-routines/math/test/mathbench_wrappers.h (revision f3087bef11543b42e0d69b708f367097a4118d24)
1072a4ba8SAndrew Turner /*
2072a4ba8SAndrew Turner  * Function wrappers for mathbench.
3072a4ba8SAndrew Turner  *
4*f3087befSAndrew Turner  * Copyright (c) 2022-2024, Arm Limited.
5072a4ba8SAndrew Turner  * SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception
6072a4ba8SAndrew Turner  */
7072a4ba8SAndrew Turner 
8*f3087befSAndrew Turner #if WANT_EXPERIMENTAL_MATH
9*f3087befSAndrew Turner static double
10*f3087befSAndrew Turner atan2_wrap (double x)
11*f3087befSAndrew Turner {
12*f3087befSAndrew Turner   return atan2 (5.0, x);
13*f3087befSAndrew Turner }
14072a4ba8SAndrew Turner 
15*f3087befSAndrew Turner static float
16*f3087befSAndrew Turner atan2f_wrap (float x)
17*f3087befSAndrew Turner {
18*f3087befSAndrew Turner   return atan2f (5.0f, x);
19*f3087befSAndrew Turner }
20*f3087befSAndrew Turner 
21*f3087befSAndrew Turner static double
22*f3087befSAndrew Turner powi_wrap (double x)
23*f3087befSAndrew Turner {
24*f3087befSAndrew Turner   return __builtin_powi (x, (int) round (x));
25*f3087befSAndrew Turner }
26*f3087befSAndrew Turner #endif /* WANT_EXPERIMENTAL_MATH.  */
27*f3087befSAndrew Turner 
28*f3087befSAndrew Turner #if __aarch64__ && __linux__
29*f3087befSAndrew Turner 
30*f3087befSAndrew Turner __vpcs static float32x4_t
31*f3087befSAndrew Turner _Z_sincospif_wrap (float32x4_t x)
32*f3087befSAndrew Turner {
33*f3087befSAndrew Turner   float s[4], c[4];
34*f3087befSAndrew Turner   _ZGVnN4vl4l4_sincospif (x, s, c);
35*f3087befSAndrew Turner   return vld1q_f32 (s) + vld1q_f32 (c);
36*f3087befSAndrew Turner }
37*f3087befSAndrew Turner 
38*f3087befSAndrew Turner __vpcs static float64x2_t
39*f3087befSAndrew Turner _Z_sincospi_wrap (float64x2_t x)
40*f3087befSAndrew Turner {
41*f3087befSAndrew Turner   double s[2], c[2];
42*f3087befSAndrew Turner   _ZGVnN2vl8l8_sincospi (x, s, c);
43*f3087befSAndrew Turner   return vld1q_f64 (s) + vld1q_f64 (c);
44*f3087befSAndrew Turner }
45*f3087befSAndrew Turner 
46*f3087befSAndrew Turner __vpcs static float64x2_t
47*f3087befSAndrew Turner _Z_atan2_wrap (float64x2_t x)
48*f3087befSAndrew Turner {
49*f3087befSAndrew Turner   return _ZGVnN2vv_atan2 (vdupq_n_f64 (5.0), x);
50*f3087befSAndrew Turner }
51*f3087befSAndrew Turner 
52*f3087befSAndrew Turner __vpcs static float32x4_t
53*f3087befSAndrew Turner _Z_atan2f_wrap (float32x4_t x)
54*f3087befSAndrew Turner {
55*f3087befSAndrew Turner   return _ZGVnN4vv_atan2f (vdupq_n_f32 (5.0f), x);
56*f3087befSAndrew Turner }
57*f3087befSAndrew Turner 
58*f3087befSAndrew Turner __vpcs static float32x4_t
59*f3087befSAndrew Turner _Z_hypotf_wrap (float32x4_t x)
60*f3087befSAndrew Turner {
61*f3087befSAndrew Turner   return _ZGVnN4vv_hypotf (vdupq_n_f32 (5.0f), x);
62*f3087befSAndrew Turner }
63*f3087befSAndrew Turner 
64*f3087befSAndrew Turner __vpcs static float64x2_t
65*f3087befSAndrew Turner _Z_hypot_wrap (float64x2_t x)
66*f3087befSAndrew Turner {
67*f3087befSAndrew Turner   return _ZGVnN2vv_hypot (vdupq_n_f64 (5.0), x);
68*f3087befSAndrew Turner }
69*f3087befSAndrew Turner 
70*f3087befSAndrew Turner __vpcs static float32x4_t
71*f3087befSAndrew Turner xy_Z_powf (float32x4_t x)
72072a4ba8SAndrew Turner {
73072a4ba8SAndrew Turner   return _ZGVnN4vv_powf (x, x);
74072a4ba8SAndrew Turner }
75072a4ba8SAndrew Turner 
76*f3087befSAndrew Turner __vpcs static float32x4_t
77*f3087befSAndrew Turner x_Z_powf (float32x4_t x)
78*f3087befSAndrew Turner {
79*f3087befSAndrew Turner   return _ZGVnN4vv_powf (x, vdupq_n_f32 (23.4));
80*f3087befSAndrew Turner }
81*f3087befSAndrew Turner 
82*f3087befSAndrew Turner __vpcs static float32x4_t
83*f3087befSAndrew Turner y_Z_powf (float32x4_t x)
84*f3087befSAndrew Turner {
85*f3087befSAndrew Turner   return _ZGVnN4vv_powf (vdupq_n_f32 (2.34), x);
86*f3087befSAndrew Turner }
87*f3087befSAndrew Turner 
88*f3087befSAndrew Turner __vpcs static float64x2_t
89*f3087befSAndrew Turner xy_Z_pow (float64x2_t x)
90072a4ba8SAndrew Turner {
91072a4ba8SAndrew Turner   return _ZGVnN2vv_pow (x, x);
92072a4ba8SAndrew Turner }
93072a4ba8SAndrew Turner 
94*f3087befSAndrew Turner __vpcs static float64x2_t
95*f3087befSAndrew Turner x_Z_pow (float64x2_t x)
96*f3087befSAndrew Turner {
97*f3087befSAndrew Turner   return _ZGVnN2vv_pow (x, vdupq_n_f64 (23.4));
98*f3087befSAndrew Turner }
99*f3087befSAndrew Turner 
100*f3087befSAndrew Turner __vpcs static float64x2_t
101*f3087befSAndrew Turner y_Z_pow (float64x2_t x)
102*f3087befSAndrew Turner {
103*f3087befSAndrew Turner   return _ZGVnN2vv_pow (vdupq_n_f64 (2.34), x);
104*f3087befSAndrew Turner }
105*f3087befSAndrew Turner 
106*f3087befSAndrew Turner __vpcs static float32x4_t
107*f3087befSAndrew Turner _Z_modff_wrap (float32x4_t x)
108*f3087befSAndrew Turner {
109*f3087befSAndrew Turner   float y[4];
110*f3087befSAndrew Turner   float32x4_t ret = _ZGVnN4vl4_modff (x, y);
111*f3087befSAndrew Turner   return ret + vld1q_f32 (y);
112*f3087befSAndrew Turner }
113*f3087befSAndrew Turner 
114*f3087befSAndrew Turner __vpcs static float64x2_t
115*f3087befSAndrew Turner _Z_modf_wrap (float64x2_t x)
116*f3087befSAndrew Turner {
117*f3087befSAndrew Turner   double y[2];
118*f3087befSAndrew Turner   float64x2_t ret = _ZGVnN2vl8_modf (x, y);
119*f3087befSAndrew Turner   return ret + vld1q_f64 (y);
120*f3087befSAndrew Turner }
121*f3087befSAndrew Turner 
122*f3087befSAndrew Turner __vpcs static float32x4_t
123*f3087befSAndrew Turner _Z_sincosf_wrap (float32x4_t x)
124*f3087befSAndrew Turner {
125*f3087befSAndrew Turner   float s[4], c[4];
126*f3087befSAndrew Turner   _ZGVnN4vl4l4_sincosf (x, s, c);
127*f3087befSAndrew Turner   return vld1q_f32 (s) + vld1q_f32 (c);
128*f3087befSAndrew Turner }
129*f3087befSAndrew Turner 
130*f3087befSAndrew Turner __vpcs static float32x4_t
131*f3087befSAndrew Turner _Z_cexpif_wrap (float32x4_t x)
132*f3087befSAndrew Turner {
133*f3087befSAndrew Turner   float32x4x2_t sc = _ZGVnN4v_cexpif (x);
134*f3087befSAndrew Turner   return sc.val[0] + sc.val[1];
135*f3087befSAndrew Turner }
136*f3087befSAndrew Turner 
137*f3087befSAndrew Turner __vpcs static float64x2_t
138*f3087befSAndrew Turner _Z_sincos_wrap (float64x2_t x)
139*f3087befSAndrew Turner {
140*f3087befSAndrew Turner   double s[2], c[2];
141*f3087befSAndrew Turner   _ZGVnN2vl8l8_sincos (x, s, c);
142*f3087befSAndrew Turner   return vld1q_f64 (s) + vld1q_f64 (c);
143*f3087befSAndrew Turner }
144*f3087befSAndrew Turner 
145*f3087befSAndrew Turner __vpcs static float64x2_t
146*f3087befSAndrew Turner _Z_cexpi_wrap (float64x2_t x)
147*f3087befSAndrew Turner {
148*f3087befSAndrew Turner   float64x2x2_t sc = _ZGVnN2v_cexpi (x);
149*f3087befSAndrew Turner   return sc.val[0] + sc.val[1];
150*f3087befSAndrew Turner }
151*f3087befSAndrew Turner 
152*f3087befSAndrew Turner #endif
153*f3087befSAndrew Turner 
154*f3087befSAndrew Turner #if WANT_SVE_TESTS
155*f3087befSAndrew Turner 
156*f3087befSAndrew Turner static svfloat32_t
157*f3087befSAndrew Turner _Z_sv_atan2f_wrap (svfloat32_t x, svbool_t pg)
158*f3087befSAndrew Turner {
159*f3087befSAndrew Turner   return _ZGVsMxvv_atan2f (x, svdup_f32 (5.0f), pg);
160*f3087befSAndrew Turner }
161*f3087befSAndrew Turner 
162*f3087befSAndrew Turner static svfloat64_t
163*f3087befSAndrew Turner _Z_sv_atan2_wrap (svfloat64_t x, svbool_t pg)
164*f3087befSAndrew Turner {
165*f3087befSAndrew Turner   return _ZGVsMxvv_atan2 (x, svdup_f64 (5.0), pg);
166*f3087befSAndrew Turner }
167*f3087befSAndrew Turner 
168*f3087befSAndrew Turner static svfloat32_t
169*f3087befSAndrew Turner _Z_sv_hypotf_wrap (svfloat32_t x, svbool_t pg)
170*f3087befSAndrew Turner {
171*f3087befSAndrew Turner   return _ZGVsMxvv_hypotf (x, svdup_f32 (5.0), pg);
172*f3087befSAndrew Turner }
173*f3087befSAndrew Turner 
174*f3087befSAndrew Turner static svfloat64_t
175*f3087befSAndrew Turner _Z_sv_hypot_wrap (svfloat64_t x, svbool_t pg)
176*f3087befSAndrew Turner {
177*f3087befSAndrew Turner   return _ZGVsMxvv_hypot (x, svdup_f64 (5.0), pg);
178*f3087befSAndrew Turner }
179*f3087befSAndrew Turner 
180*f3087befSAndrew Turner static svfloat32_t
181*f3087befSAndrew Turner xy_Z_sv_powf (svfloat32_t x, svbool_t pg)
182*f3087befSAndrew Turner {
183*f3087befSAndrew Turner   return _ZGVsMxvv_powf (x, x, pg);
184*f3087befSAndrew Turner }
185*f3087befSAndrew Turner 
186*f3087befSAndrew Turner static svfloat32_t
187*f3087befSAndrew Turner x_Z_sv_powf (svfloat32_t x, svbool_t pg)
188*f3087befSAndrew Turner {
189*f3087befSAndrew Turner   return _ZGVsMxvv_powf (x, svdup_f32 (23.4f), pg);
190*f3087befSAndrew Turner }
191*f3087befSAndrew Turner 
192*f3087befSAndrew Turner static svfloat32_t
193*f3087befSAndrew Turner y_Z_sv_powf (svfloat32_t x, svbool_t pg)
194*f3087befSAndrew Turner {
195*f3087befSAndrew Turner   return _ZGVsMxvv_powf (svdup_f32 (2.34f), x, pg);
196*f3087befSAndrew Turner }
197*f3087befSAndrew Turner 
198*f3087befSAndrew Turner static svfloat64_t
199*f3087befSAndrew Turner xy_Z_sv_pow (svfloat64_t x, svbool_t pg)
200*f3087befSAndrew Turner {
201*f3087befSAndrew Turner   return _ZGVsMxvv_pow (x, x, pg);
202*f3087befSAndrew Turner }
203*f3087befSAndrew Turner 
204*f3087befSAndrew Turner static svfloat64_t
205*f3087befSAndrew Turner x_Z_sv_pow (svfloat64_t x, svbool_t pg)
206*f3087befSAndrew Turner {
207*f3087befSAndrew Turner   return _ZGVsMxvv_pow (x, svdup_f64 (23.4), pg);
208*f3087befSAndrew Turner }
209*f3087befSAndrew Turner 
210*f3087befSAndrew Turner static svfloat64_t
211*f3087befSAndrew Turner y_Z_sv_pow (svfloat64_t x, svbool_t pg)
212*f3087befSAndrew Turner {
213*f3087befSAndrew Turner   return _ZGVsMxvv_pow (svdup_f64 (2.34), x, pg);
214*f3087befSAndrew Turner }
215*f3087befSAndrew Turner 
216*f3087befSAndrew Turner static svfloat32_t
217*f3087befSAndrew Turner _Z_sv_sincospif_wrap (svfloat32_t x, svbool_t pg)
218*f3087befSAndrew Turner {
219*f3087befSAndrew Turner   float s[svcntw ()], c[svcntw ()];
220*f3087befSAndrew Turner   _ZGVsMxvl4l4_sincospif (x, s, c, pg);
221*f3087befSAndrew Turner   return svadd_x (pg, svld1 (pg, s), svld1 (pg, c));
222*f3087befSAndrew Turner }
223*f3087befSAndrew Turner 
224*f3087befSAndrew Turner static svfloat64_t
225*f3087befSAndrew Turner _Z_sv_sincospi_wrap (svfloat64_t x, svbool_t pg)
226*f3087befSAndrew Turner {
227*f3087befSAndrew Turner   double s[svcntd ()], c[svcntd ()];
228*f3087befSAndrew Turner   _ZGVsMxvl8l8_sincospi (x, s, c, pg);
229*f3087befSAndrew Turner   return svadd_x (pg, svld1 (pg, s), svld1 (pg, c));
230*f3087befSAndrew Turner }
231*f3087befSAndrew Turner 
232*f3087befSAndrew Turner static svfloat32_t
233*f3087befSAndrew Turner _Z_sv_modff_wrap (svfloat32_t x, svbool_t pg)
234*f3087befSAndrew Turner {
235*f3087befSAndrew Turner   float i[svcntw ()];
236*f3087befSAndrew Turner   svfloat32_t r = _ZGVsMxvl4_modff (x, i, pg);
237*f3087befSAndrew Turner   return svadd_x (pg, r, svld1 (pg, i));
238*f3087befSAndrew Turner }
239*f3087befSAndrew Turner 
240*f3087befSAndrew Turner static svfloat64_t
241*f3087befSAndrew Turner _Z_sv_modf_wrap (svfloat64_t x, svbool_t pg)
242*f3087befSAndrew Turner {
243*f3087befSAndrew Turner   double i[svcntd ()];
244*f3087befSAndrew Turner   svfloat64_t r = _ZGVsMxvl8_modf (x, i, pg);
245*f3087befSAndrew Turner   return svadd_x (pg, r, svld1 (pg, i));
246*f3087befSAndrew Turner }
247*f3087befSAndrew Turner 
248*f3087befSAndrew Turner static svfloat32_t
249*f3087befSAndrew Turner _Z_sv_sincosf_wrap (svfloat32_t x, svbool_t pg)
250*f3087befSAndrew Turner {
251*f3087befSAndrew Turner   float s[svcntw ()], c[svcntw ()];
252*f3087befSAndrew Turner   _ZGVsMxvl4l4_sincosf (x, s, c, pg);
253*f3087befSAndrew Turner   return svadd_x (pg, svld1 (pg, s), svld1 (pg, s));
254*f3087befSAndrew Turner }
255*f3087befSAndrew Turner 
256*f3087befSAndrew Turner static svfloat32_t
257*f3087befSAndrew Turner _Z_sv_cexpif_wrap (svfloat32_t x, svbool_t pg)
258*f3087befSAndrew Turner {
259*f3087befSAndrew Turner   svfloat32x2_t sc = _ZGVsMxv_cexpif (x, pg);
260*f3087befSAndrew Turner   return svadd_x (pg, svget2 (sc, 0), svget2 (sc, 1));
261*f3087befSAndrew Turner }
262*f3087befSAndrew Turner 
263*f3087befSAndrew Turner static svfloat64_t
264*f3087befSAndrew Turner _Z_sv_sincos_wrap (svfloat64_t x, svbool_t pg)
265*f3087befSAndrew Turner {
266*f3087befSAndrew Turner   double s[svcntd ()], c[svcntd ()];
267*f3087befSAndrew Turner   _ZGVsMxvl8l8_sincos (x, s, c, pg);
268*f3087befSAndrew Turner   return svadd_x (pg, svld1 (pg, s), svld1 (pg, s));
269*f3087befSAndrew Turner }
270*f3087befSAndrew Turner 
271*f3087befSAndrew Turner static svfloat64_t
272*f3087befSAndrew Turner _Z_sv_cexpi_wrap (svfloat64_t x, svbool_t pg)
273*f3087befSAndrew Turner {
274*f3087befSAndrew Turner   svfloat64x2_t sc = _ZGVsMxv_cexpi (x, pg);
275*f3087befSAndrew Turner   return svadd_x (pg, svget2 (sc, 0), svget2 (sc, 1));
276*f3087befSAndrew Turner }
277*f3087befSAndrew Turner 
278*f3087befSAndrew Turner # if WANT_EXPERIMENTAL_MATH
279*f3087befSAndrew Turner 
280*f3087befSAndrew Turner static svfloat32_t
281*f3087befSAndrew Turner _Z_sv_powi_wrap (svfloat32_t x, svbool_t pg)
282*f3087befSAndrew Turner {
283*f3087befSAndrew Turner   return _ZGVsMxvv_powi (x, svcvt_s32_f32_x (pg, x), pg);
284*f3087befSAndrew Turner }
285*f3087befSAndrew Turner 
286*f3087befSAndrew Turner static svfloat64_t
287*f3087befSAndrew Turner _Z_sv_powk_wrap (svfloat64_t x, svbool_t pg)
288*f3087befSAndrew Turner {
289*f3087befSAndrew Turner   return _ZGVsMxvv_powk (x, svcvt_s64_f64_x (pg, x), pg);
290*f3087befSAndrew Turner }
291*f3087befSAndrew Turner 
292*f3087befSAndrew Turner # endif
293*f3087befSAndrew Turner 
294*f3087befSAndrew Turner #endif
295*f3087befSAndrew Turner 
296*f3087befSAndrew Turner #if __aarch64__
297*f3087befSAndrew Turner static float
298*f3087befSAndrew Turner sincospif_wrap (float x)
299*f3087befSAndrew Turner {
300*f3087befSAndrew Turner   float s, c;
301*f3087befSAndrew Turner   arm_math_sincospif (x, &s, &c);
302*f3087befSAndrew Turner   return s + c;
303*f3087befSAndrew Turner }
304*f3087befSAndrew Turner 
305*f3087befSAndrew Turner static double
306*f3087befSAndrew Turner sincospi_wrap (double x)
307*f3087befSAndrew Turner {
308*f3087befSAndrew Turner   double s, c;
309*f3087befSAndrew Turner   arm_math_sincospi (x, &s, &c);
310*f3087befSAndrew Turner   return s + c;
311*f3087befSAndrew Turner }
3125a02ffc3SAndrew Turner #endif
313072a4ba8SAndrew Turner 
314072a4ba8SAndrew Turner static double
315072a4ba8SAndrew Turner xypow (double x)
316072a4ba8SAndrew Turner {
317072a4ba8SAndrew Turner   return pow (x, x);
318072a4ba8SAndrew Turner }
319072a4ba8SAndrew Turner 
320072a4ba8SAndrew Turner static float
321072a4ba8SAndrew Turner xypowf (float x)
322072a4ba8SAndrew Turner {
323072a4ba8SAndrew Turner   return powf (x, x);
324072a4ba8SAndrew Turner }
325072a4ba8SAndrew Turner 
326072a4ba8SAndrew Turner static double
327072a4ba8SAndrew Turner xpow (double x)
328072a4ba8SAndrew Turner {
329072a4ba8SAndrew Turner   return pow (x, 23.4);
330072a4ba8SAndrew Turner }
331072a4ba8SAndrew Turner 
332072a4ba8SAndrew Turner static float
333072a4ba8SAndrew Turner xpowf (float x)
334072a4ba8SAndrew Turner {
335072a4ba8SAndrew Turner   return powf (x, 23.4f);
336072a4ba8SAndrew Turner }
337072a4ba8SAndrew Turner 
338072a4ba8SAndrew Turner static double
339072a4ba8SAndrew Turner ypow (double x)
340072a4ba8SAndrew Turner {
341072a4ba8SAndrew Turner   return pow (2.34, x);
342072a4ba8SAndrew Turner }
343072a4ba8SAndrew Turner 
344072a4ba8SAndrew Turner static float
345072a4ba8SAndrew Turner ypowf (float x)
346072a4ba8SAndrew Turner {
347072a4ba8SAndrew Turner   return powf (2.34f, x);
348072a4ba8SAndrew Turner }
349072a4ba8SAndrew Turner 
350072a4ba8SAndrew Turner static float
351072a4ba8SAndrew Turner sincosf_wrap (float x)
352072a4ba8SAndrew Turner {
353072a4ba8SAndrew Turner   float s, c;
354072a4ba8SAndrew Turner   sincosf (x, &s, &c);
355072a4ba8SAndrew Turner   return s + c;
356072a4ba8SAndrew Turner }
357