entry_pt.c
1 /* 2 * Copyright (C) 2008-2020 Advanced Micro Devices, Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without modification, 5 * are permitted provided that the following conditions are met: 6 * 1. Redistributions of source code must retain the above copyright notice, 7 * this list of conditions and the following disclaimer. 8 * 2. Redistributions in binary form must reproduce the above copyright notice, 9 * this list of conditions and the following disclaimer in the documentation 10 * and/or other materials provided with the distribution. 11 * 3. Neither the name of the copyright holder nor the names of its contributors 12 * may be used to endorse or promote products derived from this software without 13 * specific prior written permission. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 19 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 20 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 21 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 22 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 24 * POSSIBILITY OF SUCH DAMAGE. 25 * 26 */ 27 28 #include <libm_macros.h> 29 #include <libm/amd_funcs_internal.h> 30 #include <libm/compiler.h> 31 #include <libm/cpu_features.h> 32 #include <libm/iface.h> 33 #include <libm/entry_pt.h> 34 35 #ifdef __cplusplus 36 extern "C" 37 { 38 #endif 39 40 double G_ENTRY_PT(acos)(double x); 41 double G_ENTRY_PT(acosh)(double x); 42 double G_ENTRY_PT(asin)(double x); 43 double G_ENTRY_PT(asinh)(double x); 44 double G_ENTRY_PT(atan2)(double x, double y); 45 double G_ENTRY_PT(atan)(double x); 46 double G_ENTRY_PT(atanh)(double x); 47 double G_ENTRY_PT(cbrt)(double x); 48 double G_ENTRY_PT(ceil)(double x); 49 double G_ENTRY_PT(copysign)(double x, double y); 50 double G_ENTRY_PT(cos)(double x); 51 double G_ENTRY_PT(cosh)(double x); 52 double G_ENTRY_PT(cospi)(double x); 53 double G_ENTRY_PT(exp10)(double x); 54 double G_ENTRY_PT(exp2)(double x); 55 double G_ENTRY_PT(exp)(double x); 56 double G_ENTRY_PT(expm1)(double x); 57 double G_ENTRY_PT(fabs)(double x); 58 double G_ENTRY_PT(fastpow)(double x, double y); 59 double G_ENTRY_PT(fdim)(double x, double y); 60 double G_ENTRY_PT(floor)(double x); 61 double G_ENTRY_PT(fma)(double x, double y, double z); 62 double G_ENTRY_PT(fmax)(double x, double y); 63 double G_ENTRY_PT(fmin)(double x, double y); 64 double G_ENTRY_PT(fmod)(double x, double y); 65 double G_ENTRY_PT(frexp)(double value, int *exp); 66 double G_ENTRY_PT(hypot)(double x, double y); 67 double G_ENTRY_PT(ldexp)(double x, int exp); 68 double G_ENTRY_PT(log10)(double x); 69 double G_ENTRY_PT(log1p)(double x); 70 double G_ENTRY_PT(log2)(double x); 71 double G_ENTRY_PT(logb)(double x); 72 double G_ENTRY_PT(log)(double x); 73 double G_ENTRY_PT(modf)(double x, double *iptr); 74 double G_ENTRY_PT(nan)(const char *tagp); 75 double G_ENTRY_PT(nearbyint)(double x); 76 double G_ENTRY_PT(nextafter)(double x, double y); 77 double G_ENTRY_PT(nexttoward)(double x, long double y); 78 double G_ENTRY_PT(pow)(double x, double y); 79 double G_ENTRY_PT(remainder)(double x, double y); 80 double G_ENTRY_PT(remquo) (double x, double y, int *quo); 81 double G_ENTRY_PT(rint)(double x); 82 double G_ENTRY_PT(round)(double f); 83 double G_ENTRY_PT(scalbln)(double x, long int n); 84 double G_ENTRY_PT(scalbn)(double x, int n); 85 double G_ENTRY_PT(sin)(double x); 86 double G_ENTRY_PT(sinh)(double x); 87 double G_ENTRY_PT(sinpi)(double x); 88 double G_ENTRY_PT(sqrt)(double x); 89 double G_ENTRY_PT(tan)(double x); 90 double G_ENTRY_PT(tanh)(double x); 91 double G_ENTRY_PT(tanpi)(double x); 92 double G_ENTRY_PT(trunc)(double x); 93 94 /* 95 * required by NAG tests 96 */ 97 double G_ENTRY_PT(remainder_piby2)(double x, double y); 98 double G_ENTRY_PT(remainder_piby2d2f)(double x, double y); 99 100 /* 101 * Single Precision functions 102 */ 103 float G_ENTRY_PT(acosf)(float x); 104 float G_ENTRY_PT(acoshf)(float x); 105 float G_ENTRY_PT(asinf)(float x); 106 float G_ENTRY_PT(asinhf)(float x); 107 float G_ENTRY_PT(atan2f)(float x, float y); 108 float G_ENTRY_PT(atanf)(float x); 109 float G_ENTRY_PT(atanhf)(float x); 110 float G_ENTRY_PT(cbrtf)(float x); 111 float G_ENTRY_PT(ceilf)(float x); 112 float G_ENTRY_PT(copysignf)(float x, float y); 113 float G_ENTRY_PT(cosf)(float x); 114 float G_ENTRY_PT(coshf)(float fx); 115 float G_ENTRY_PT(cospif)(float x); 116 float G_ENTRY_PT(exp10f)(float x); 117 float G_ENTRY_PT(exp2f)(float x); 118 float G_ENTRY_PT(expf)(float x); 119 float G_ENTRY_PT(expm1f)(float x); 120 float G_ENTRY_PT(fabsf)(float x); 121 float G_ENTRY_PT(fdimf)(float x, float y); 122 float G_ENTRY_PT(floorf)(float x); 123 float G_ENTRY_PT(fmaf)(float x, float y, float z); 124 float G_ENTRY_PT(fmaxf)(float x, float y); 125 float G_ENTRY_PT(fminf)(float x, float y); 126 float G_ENTRY_PT(fmodf)(float x, float y); 127 float G_ENTRY_PT(frexpf)(float value, int *exp); 128 float G_ENTRY_PT(hypotf)(float x, float y); 129 float G_ENTRY_PT(ldexpf)(float x, int exp); 130 float G_ENTRY_PT(log10f)(float x); 131 float G_ENTRY_PT(log1pf)(float x); 132 float G_ENTRY_PT(log2f)(float x); 133 float G_ENTRY_PT(logbf)(float x); 134 float G_ENTRY_PT(logf)(float x); 135 float G_ENTRY_PT(modff)(float x, float *iptr); 136 float G_ENTRY_PT(nanf)(const char *tagp); 137 float G_ENTRY_PT(nearbyintf)(float x); 138 float G_ENTRY_PT(nextafterf)(float x, float y); 139 float G_ENTRY_PT(nexttowardf)(float x, long double y); 140 float G_ENTRY_PT(powf)(float x, float y); 141 float G_ENTRY_PT(remainderf)(float x, float y); 142 float G_ENTRY_PT(remquof) (float x, float y, int *quo); 143 float G_ENTRY_PT(rintf)(float x); 144 float G_ENTRY_PT(roundf)(float f); 145 float G_ENTRY_PT(scalblnf)(float x, long int n); 146 float G_ENTRY_PT(scalbnf)(float x, int n); 147 float G_ENTRY_PT(sinf)(float x); 148 float G_ENTRY_PT(sinhf)(float x); 149 float G_ENTRY_PT(sinpif)(float x); 150 float G_ENTRY_PT(sqrtf)(float x); 151 float G_ENTRY_PT(tanf)(float x); 152 float G_ENTRY_PT(tanhf)(float x); 153 float G_ENTRY_PT(tanpif)(float x); 154 float G_ENTRY_PT(truncf)(float x); 155 156 /* 157 * Integer variants 158 */ 159 int G_ENTRY_PT(finite)(double x); 160 int G_ENTRY_PT(finitef)(float x); 161 int G_ENTRY_PT(ilogb)(double x); 162 int G_ENTRY_PT(ilogbf)(float x); 163 long int G_ENTRY_PT(lrint)(double x); 164 long int G_ENTRY_PT(lrintf)(float x); 165 long int G_ENTRY_PT(lround)(double d); 166 long int G_ENTRY_PT(lroundf)(float f); 167 long long int G_ENTRY_PT(llrint)(double x); 168 long long int G_ENTRY_PT(llrintf)(float x); 169 long long int G_ENTRY_PT(llround)(double d); 170 long long int G_ENTRY_PT(llroundf)(float f); 171 172 void G_ENTRY_PT(vrda_cbrt)(int, double*, double*); 173 void G_ENTRY_PT(vrda_cos)(int, double*, double*); 174 void G_ENTRY_PT(vrda_exp)(int, double*, double*); 175 void G_ENTRY_PT(vrda_exp2)(int, double*, double*); 176 void G_ENTRY_PT(vrda_exp10)(int, double*, double*); 177 void G_ENTRY_PT(vrda_expm1)(int, double*, double*); 178 void G_ENTRY_PT(vrda_log)(int, double*, double*); 179 void G_ENTRY_PT(vrda_log10)(int, double*, double*); 180 void G_ENTRY_PT(vrda_log1p)(int, double*, double*); 181 void G_ENTRY_PT(vrda_log2)(int, double*, double*); 182 void G_ENTRY_PT(vrda_pow)(int, double*, double*); 183 void G_ENTRY_PT(vrda_sin)(int, double*, double*); 184 185 186 void G_ENTRY_PT(vrsa_cosf)(int, float*, float*); 187 void G_ENTRY_PT(vrsa_expf)(int, float*, float*); 188 void G_ENTRY_PT(vrsa_exp2f)(int, float*, float*); 189 void G_ENTRY_PT(vrsa_exp10f)(int, float*, float*); 190 void G_ENTRY_PT(vrsa_expm1f)(int, float*, float*); 191 void G_ENTRY_PT(vrsa_log1pf)(int, float*, float*); 192 void G_ENTRY_PT(vrsa_sinf)(int, float*, float*); 193 void G_ENTRY_PT(vrsa_log2f)(int, float*, float*); 194 void G_ENTRY_PT(vrsa_cbrtf)(int, float*, float*); 195 void G_ENTRY_PT(vrsa_log10f)(int, float*, float*); 196 void G_ENTRY_PT(vrsa_logf)(int, float*, float*); 197 198 #ifndef _MSC_VER 199 void G_ENTRY_PT(sincos)(double,double *,double *); 200 void G_ENTRY_PT(sincosf)(float,float *,float *); 201 #endif 202 203 __m128 G_ENTRY_PT(vrs4_cosf)(__m128); 204 __m128 G_ENTRY_PT(vrs4_cbrtf)(__m128); 205 __m128 G_ENTRY_PT(vrs4_expf)(__m128); 206 __m128 G_ENTRY_PT(vrs4_exp2f)(__m128); 207 __m128 G_ENTRY_PT(vrs4_exp10f)(__m128); 208 __m128 G_ENTRY_PT(vrs4_expm1f)(__m128); 209 __m128 G_ENTRY_PT(vrs4_logf)(__m128); 210 __m128 G_ENTRY_PT(vrs4_log2f)(__m128); 211 __m128 G_ENTRY_PT(vrs4_log10f)(__m128); 212 __m128 G_ENTRY_PT(vrs4_log1pf)(__m128); 213 __m128 G_ENTRY_PT(vrs4_sinf)(__m128); 214 __m128 G_ENTRY_PT(vrs4_tanf)(__m128); 215 __m128 G_ENTRY_PT(vrs4_powf)(__m128, __m128); 216 217 __m256 G_ENTRY_PT(vrs8_logf)(__m256); 218 __m256 G_ENTRY_PT(vrs8_expf)(__m256); 219 __m256 G_ENTRY_PT(vrs8_sinf)(__m256); 220 __m256 G_ENTRY_PT(vrs8_tanf)(__m256); 221 __m256 G_ENTRY_PT(vrs8_cosf)(__m256); 222 __m256 G_ENTRY_PT(vrs8_powf)(__m256, __m256); 223 224 __m128d G_ENTRY_PT(vrd2_cbrt)(__m128d); 225 __m128d G_ENTRY_PT(vrd2_cos)(__m128d); 226 __m128d G_ENTRY_PT(vrd2_cosh)(__m128d); 227 __m128d G_ENTRY_PT(vrd2_exp)(__m128d); 228 __m128d G_ENTRY_PT(vrd2_exp2)(__m128d); 229 __m128d G_ENTRY_PT(vrd2_exp10)(__m128d); 230 __m128d G_ENTRY_PT(vrd2_expm1)(__m128d); 231 __m128d G_ENTRY_PT(vrd2_log)(__m128d); 232 __m128d G_ENTRY_PT(vrd2_log2)(__m128d); 233 __m128d G_ENTRY_PT(vrd2_log10)(__m128d); 234 __m128d G_ENTRY_PT(vrd2_log1p)(__m128d); 235 __m128d G_ENTRY_PT(vrd2_pow)(__m128d, __m128d); 236 __m128d G_ENTRY_PT(vrd2_sin)(__m128d); 237 __m128d G_ENTRY_PT(vrd2_tan)(__m128d); 238 239 __m256d G_ENTRY_PT(vrd4_cbrt)(__m256d); 240 __m256d G_ENTRY_PT(vrd4_cos)(__m256d); 241 __m256d G_ENTRY_PT(vrd4_exp)(__m256d); 242 __m256d G_ENTRY_PT(vrd4_exp2)(__m256d); 243 __m256d G_ENTRY_PT(vrd4_exp10)(__m256d); 244 __m256d G_ENTRY_PT(vrd4_expm1)(__m256d); 245 __m256d G_ENTRY_PT(vrd4_log)(__m256d); 246 __m256d G_ENTRY_PT(vrd4_log2)(__m256d); 247 __m256d G_ENTRY_PT(vrd4_log10)(__m256d); 248 __m256d G_ENTRY_PT(vrd4_log1p)(__m256d); 249 __m256d G_ENTRY_PT(vrd4_pow)(__m256d, __m256d); 250 __m256d G_ENTRY_PT(vrd4_sin)(__m256d); 251 __m256d G_ENTRY_PT(vrd4_tan)(__m256d); 252 253 254 #ifdef __cplusplus 255 } 256 #endif 257 258 static void CONSTRUCTOR 259 init_map_entry_points(void) 260 { 261 /* First call __init_cpu_featues() via libm_cpu_get_features */ 262 263 /* Call interfaces to initialize functions */ 264 265 if (libm_cpu_feature_is_avx2_usable()) { 266 267 g_amd_libm_ep_cbrt = FN_PROTOTYPE_FMA3(cbrt); 268 g_amd_libm_ep_cbrtf = FN_PROTOTYPE_FMA3(cbrtf); 269 g_amd_libm_ep_sin = FN_PROTOTYPE_FMA3(sin); 270 #ifndef _MSC_VER 271 g_amd_libm_ep_sincos = FN_PROTOTYPE_FMA3(sincos); 272 g_amd_libm_ep_sincosf = FN_PROTOTYPE_FMA3(sincosf); 273 #endif 274 g_amd_libm_ep_sinf = FN_PROTOTYPE_FMA3(sinf); 275 g_amd_libm_ep_cos = FN_PROTOTYPE_FMA3(cos) ; 276 g_amd_libm_ep_cosf = FN_PROTOTYPE_FMA3(cosf); 277 g_amd_libm_ep_tan = FN_PROTOTYPE_FMA3(tan); 278 g_amd_libm_ep_tanf = FN_PROTOTYPE_FMA3(tanf); 279 g_amd_libm_ep_vrd2_cbrt = FN_PROTOTYPE_FMA3(vrd2_cbrt); 280 g_amd_libm_ep_vrs4_cbrtf = FN_PROTOTYPE_FMA3(vrs4_cbrtf); 281 g_amd_libm_ep_vrd2_cos = FN_PROTOTYPE_FMA3(vrd2_cos); 282 g_amd_libm_ep_vrs4_cosf = FN_PROTOTYPE_FMA3(vrs4_cosf); 283 g_amd_libm_ep_vrd2_sin = FN_PROTOTYPE_FMA3(vrd2_sin); 284 g_amd_libm_ep_vrs4_sinf = FN_PROTOTYPE_FMA3(vrs4_sinf); 285 g_amd_libm_ep_vrd2_tan = FN_PROTOTYPE_FMA3(vrd2_tan); 286 g_amd_libm_ep_vrs4_tanf = FN_PROTOTYPE_FMA3(vrs4_tanf); 287 g_amd_libm_ep_vrd2_log = FN_PROTOTYPE_FMA3(vrd2_log); 288 g_amd_libm_ep_vrd2_log2 = FN_PROTOTYPE_FMA3(vrd2_log2); 289 g_amd_libm_ep_vrd2_log10 = FN_PROTOTYPE_FMA3(vrd2_log10); 290 g_amd_libm_ep_vrd2_log1p = FN_PROTOTYPE_FMA3(vrd2_log1p); 291 g_amd_libm_ep_vrs4_logf = FN_PROTOTYPE_FMA3(vrs4_logf); 292 g_amd_libm_ep_vrs4_powf = FN_PROTOTYPE_BAS64(vrs4_powf); 293 g_amd_libm_ep_vrs4_log2f = FN_PROTOTYPE_FMA3(vrs4_log2f); 294 g_amd_libm_ep_vrs4_log10f= FN_PROTOTYPE_FMA3(vrs4_log10f); 295 g_amd_libm_ep_vrs4_log1pf= FN_PROTOTYPE_FMA3(vrs4_log1pf); 296 g_amd_libm_ep_logf = FN_PROTOTYPE_FMA3(logf); 297 g_amd_libm_ep_log2f = FN_PROTOTYPE_FMA3(log2f); 298 g_amd_libm_ep_log10f = FN_PROTOTYPE_FMA3(log10f); 299 g_amd_libm_ep_log1pf = FN_PROTOTYPE_FMA3(log1pf); 300 g_amd_libm_ep_log = FN_PROTOTYPE_FMA3(log); 301 g_amd_libm_ep_log2 = FN_PROTOTYPE_FMA3(log2); 302 g_amd_libm_ep_log10 = FN_PROTOTYPE_FMA3(log10); 303 g_amd_libm_ep_log1p = FN_PROTOTYPE_FMA3(log1p); 304 g_amd_libm_ep_exp = FN_PROTOTYPE_FMA3(exp); 305 g_amd_libm_ep_exp2 = FN_PROTOTYPE_FMA3(exp2); 306 g_amd_libm_ep_exp10 = FN_PROTOTYPE_FMA3(exp10); 307 g_amd_libm_ep_expm1 = FN_PROTOTYPE_FMA3(expm1); 308 g_amd_libm_ep_expf = FN_PROTOTYPE_FMA3(expf); 309 g_amd_libm_ep_exp2f = FN_PROTOTYPE_FMA3(exp2f); 310 g_amd_libm_ep_exp10f = FN_PROTOTYPE_FMA3(exp10f); 311 g_amd_libm_ep_expm1f = FN_PROTOTYPE_FMA3(expm1f); 312 g_amd_libm_ep_vrs4_expf = FN_PROTOTYPE_FMA3(vrs4_expf); 313 g_amd_libm_ep_vrs4_exp2f = FN_PROTOTYPE_FMA3(vrs4_exp2f); 314 g_amd_libm_ep_vrs4_exp10f= FN_PROTOTYPE_FMA3(vrs4_exp10f); 315 g_amd_libm_ep_vrs4_expm1f= FN_PROTOTYPE_FMA3(vrs4_expm1f); 316 g_amd_libm_ep_vrd2_exp = FN_PROTOTYPE_FMA3(vrd2_exp); 317 g_amd_libm_ep_vrd2_exp2 = FN_PROTOTYPE_FMA3(vrd2_exp2); 318 g_amd_libm_ep_vrd2_exp10 = FN_PROTOTYPE_FMA3(vrd2_exp10); 319 g_amd_libm_ep_vrd2_expm1 = FN_PROTOTYPE_FMA3(vrd2_expm1); 320 g_amd_libm_ep_vrda_cbrt = FN_PROTOTYPE_FMA3(vrda_cbrt); 321 g_amd_libm_ep_vrda_log = FN_PROTOTYPE_FMA3(vrda_log); 322 g_amd_libm_ep_vrda_log10 = FN_PROTOTYPE_FMA3(vrda_log10); 323 g_amd_libm_ep_vrda_log1p = FN_PROTOTYPE_FMA3(vrda_log1p); 324 g_amd_libm_ep_vrda_log2 = FN_PROTOTYPE_FMA3(vrda_log2); 325 g_amd_libm_ep_vrda_sin = FN_PROTOTYPE_FMA3(vrda_sin); 326 g_amd_libm_ep_vrda_cos = FN_PROTOTYPE_FMA3(vrda_cos); 327 328 329 g_amd_libm_ep_vrsa_cbrtf = FN_PROTOTYPE_FMA3(vrsa_cbrtf); 330 g_amd_libm_ep_vrsa_logf = FN_PROTOTYPE_FMA3(vrsa_logf); 331 g_amd_libm_ep_vrsa_log10f= FN_PROTOTYPE_FMA3(vrsa_log10f); 332 g_amd_libm_ep_vrsa_log1pf= FN_PROTOTYPE_FMA3(vrsa_log1pf); 333 g_amd_libm_ep_vrsa_log2f = FN_PROTOTYPE_FMA3(vrsa_log2f); 334 g_amd_libm_ep_vrsa_sinf = FN_PROTOTYPE_FMA3(vrsa_sinf); 335 g_amd_libm_ep_vrsa_cosf = FN_PROTOTYPE_FMA3(vrsa_cosf); 336 337 g_amd_libm_ep_vrda_exp = FN_PROTOTYPE_FMA3(vrda_exp); 338 g_amd_libm_ep_vrda_exp2 = FN_PROTOTYPE_FMA3(vrda_exp2); 339 g_amd_libm_ep_vrda_exp10 = FN_PROTOTYPE_FMA3(vrda_exp10); 340 g_amd_libm_ep_vrda_expm1 = FN_PROTOTYPE_FMA3(vrda_expm1); 341 g_amd_libm_ep_vrsa_expf = FN_PROTOTYPE_FMA3(vrsa_expf); 342 g_amd_libm_ep_vrsa_exp2f = FN_PROTOTYPE_FMA3(vrsa_exp2f); 343 g_amd_libm_ep_vrsa_exp10f= FN_PROTOTYPE_FMA3(vrsa_exp10f); 344 g_amd_libm_ep_vrsa_expm1f= FN_PROTOTYPE_FMA3(vrsa_expm1f); 345 g_amd_libm_ep_fmaf = FN_PROTOTYPE_FMA3(fmaf); 346 g_amd_libm_ep_fma = FN_PROTOTYPE_FMA3(fma); 347 g_amd_libm_ep_pow = FN_PROTOTYPE_FMA3(pow); 348 g_amd_libm_ep_fastpow = FN_PROTOTYPE_FMA3(fastpow); 349 g_amd_libm_ep_powf = FN_PROTOTYPE_FMA3(powf); 350 } 351 352 libm_iface_init(); 353 }