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