8 #define HC_IMPLICIT_FLOAT_CONV double    10 #ifdef __KALMAR_ACCELERATOR__    12 #define HC_MATH_WRAPPER_1(function, arg1) \    13 template<typename T> \    14 inline T function(T arg1) __attribute__((hc,cpu)) { \    15   return hc::precise_math::function(arg1); \    18 #define KALMAR_MATH_WRAPPER_1(function, arg1) HC_MATH_WRAPPER_1(function, arg1)    20 #define HC_MATH_WRAPPER_FP_OVERLOAD_1(function, arg1) \    21 template<typename T> \    23 typename std::enable_if<std::is_integral<T>::value,HC_IMPLICIT_FLOAT_CONV>::type \    24  function(T arg1) __attribute__((hc,cpu)) { \    25   return hc::precise_math::function(static_cast<HC_IMPLICIT_FLOAT_CONV>(arg1)); \    27 template<typename T> \    29 typename std::enable_if<std::is_floating_point <T>::value,T>::type \    30  function(T arg1) __attribute__((hc,cpu)) { \    31   return hc::precise_math::function(arg1); \    34 #define KALMAR_MATH_WRAPPER_FP_OVERLOAD_1(function, arg1) HC_MATH_WRAPPER_FP_OVERLOAD_1(function, arg1)    36 #define HC_MATH_WRAPPER_2(function, arg1, arg2) \    37 template<typename T> \    38 inline T function(T arg1, T arg2) __attribute__((hc,cpu)) { \    39   return hc::precise_math::function(arg1, arg2); \    42 #define HC_MATH_ALIAS_2(alias, function, arg1, arg2) \    43 template<typename T> \    44 inline T alias(T arg1, T arg2) __attribute__((hc,cpu)) { \    45   return hc::precise_math::function(arg1, arg2); \    48 #define HC_MATH_WRAPPER_3(function, arg1, arg2, arg3) \    49 template<typename T> \    50 inline T function(T arg1, T arg2, T arg3) __attribute__((hc,cpu)) { \    51   return hc::precise_math::function(arg1, arg2, arg3); \    54 #define HC_MATH_WRAPPER_TQ(function, arg1) \    55 template<typename T, typename Q> \    56 inline T function(Q arg1) __attribute__((hc,cpu)) { \    57   return hc::precise_math::function(arg1); \    60 #define HC_MATH_WRAPPER_FP_OVERLOAD_TQ(function, T, arg1) \    61 template<typename Q> \    63 typename std::enable_if<std::is_integral<Q>::value,T>::type \    64 function(Q arg1) __attribute__((hc,cpu)) { \    65   return hc::precise_math::function(static_cast<HC_IMPLICIT_FLOAT_CONV>(arg1)); \    67 template<typename Q> \    69 typename std::enable_if<std::is_floating_point<Q>::value,T>::type \    70 function(Q arg1) __attribute__((hc,cpu)) { \    71   return hc::precise_math::function(arg1); \    74 #define HC_MATH_WRAPPER_FP_OVERLOAD_TQ_STD(function, T, arg1)  HC_MATH_WRAPPER_FP_OVERLOAD_TQ(function, T, arg1)    76 #define HC_MATH_WRAPPER_TTQ(function, arg1, arg2) \    77 template<typename T, typename Q> \    78 inline T function(T arg1, Q arg2) __attribute__((hc,cpu)) { \    79   return hc::precise_math::function(arg1, arg2); \    82 #define HC_MATH_WRAPPER_FP_OVERLOAD_TTQ(function, arg1, arg2) \    83 template<typename T, typename Q> \    85 typename std::enable_if<std::is_integral<T>::value||std::is_integral<Q>::value,HC_IMPLICIT_FLOAT_CONV>::type \    86 function(T arg1, Q arg2) __attribute__((hc,cpu)) { \    87   return hc::precise_math::function(static_cast<HC_IMPLICIT_FLOAT_CONV>(arg1),static_cast<HC_IMPLICIT_FLOAT_CONV>(arg2)); \    89 template<typename T, typename Q> \    91 typename std::enable_if<std::is_floating_point<T>::value&&std::is_floating_point<Q>::value,T>::type \    92 function(T arg1, Q arg2) __attribute__((hc,cpu)) { \    93   return hc::precise_math::function(arg1,arg2); \    96 #define HC_MATH_WRAPPER_TTTQ(function, arg1, arg2, arg3) \    97 template<typename T, typename Q> \    98 inline T function(T arg1, T arg2, Q arg3) __attribute__((hc,cpu)) { \    99   return hc::precise_math::function(arg1, arg2, arg3); \   102 #define HC_MATH_WRAPPER_VTQQ(function, arg1, arg2, arg3) \   103 template<typename T, typename Q> \   104 inline void function(T arg1, Q arg2, Q arg3) __attribute__((hc,cpu)) { \   105   hc::precise_math::function(arg1, arg2, arg3); \   110 #define HC_MATH_WRAPPER_1(function, arg1) \   111 template<typename T> \   112 inline T function(T arg1) __attribute__((hc,cpu)) { \   113   return ::function(arg1); \   116 #define KALMAR_MATH_WRAPPER_1(function, arg1) \   117 template<typename T> \   118 inline T function(T arg1) __attribute__((hc,cpu)) { \   119   return hc::precise_math::function(arg1); \   122 #define HC_MATH_WRAPPER_FP_OVERLOAD_1(function, arg1) \   123 template<typename T> \   125 typename std::enable_if<std::is_integral<T>::value,HC_IMPLICIT_FLOAT_CONV>::type \   126  function(T arg1) __attribute__((hc,cpu)) { \   127   return ::function(static_cast<HC_IMPLICIT_FLOAT_CONV>(arg1)); \   129 template<typename T> \   131 typename std::enable_if<std::is_floating_point<T>::value,T>::type \   132  function(T arg1) __attribute__((hc,cpu)) { \   133   return ::function(arg1); \   136 #define KALMAR_MATH_WRAPPER_FP_OVERLOAD_1(function, arg1) \   137 template<typename T> \   139 typename std::enable_if<std::is_integral<T>::value,HC_IMPLICIT_FLOAT_CONV>::type \   140  function(T arg1) __attribute__((hc)) { \   141   return hc::precise_math::function(static_cast<HC_IMPLICIT_FLOAT_CONV>(arg1)); \   143 template<typename T> \   145 typename std::enable_if<std::is_floating_point <T>::value,T>::type \   146  function(T arg1) __attribute__((hc)) { \   147   return hc::precise_math::function(arg1); \   150 #define HC_MATH_WRAPPER_2(function, arg1, arg2) \   151 template<typename T> \   152 inline T function(T arg1, T arg2) __attribute__((hc,cpu)) { \   153   return ::function(arg1, arg2); \   156 #define HC_MATH_ALIAS_2(alias, function, arg1, arg2) \   157 template<typename T> \   158 inline T alias(T arg1, T arg2) __attribute__((hc,cpu)) { \   159   return ::function(arg1, arg2); \   162 #define HC_MATH_WRAPPER_3(function, arg1, arg2, arg3) \   163 template<typename T> \   164 inline T function(T arg1, T arg2, T arg3) __attribute__((hc,cpu)) { \   165   return ::function(arg1, arg2, arg3); \   168 #define HC_MATH_WRAPPER_TQ(function, arg1) \   169 template<typename T, typename Q> \   170 inline T function(Q arg1) __attribute__((hc,cpu)) { \   171   return ::function(arg1); \   174 #define HC_MATH_WRAPPER_FP_OVERLOAD_TQ(function, T, arg1) \   175 template<typename Q> \   177 typename std::enable_if<std::is_integral<Q>::value,T>::type \   178 function(Q arg1) __attribute__((hc)) { \   179   return ::function(static_cast<HC_IMPLICIT_FLOAT_CONV>(arg1)); \   181 template<typename Q> \   183 typename std::enable_if<std::is_floating_point<Q>::value,T>::type \   184 function(Q arg1) __attribute__((hc)) { \   185   return ::function(arg1); \   188 #define HC_MATH_WRAPPER_FP_OVERLOAD_TQ_STD(function, T, arg1) \   189 template<typename Q> \   191 typename std::enable_if<std::is_integral<Q>::value,T>::type \   192 function(Q arg1) __attribute__((hc)) { \   193   return std::function(static_cast<HC_IMPLICIT_FLOAT_CONV>(arg1)); \   195 template<typename Q> \   197 typename std::enable_if<std::is_floating_point<Q>::value,T>::type \   198 function(Q arg1) __attribute__((hc)) { \   199   return std::function(arg1); \   202 #define HC_MATH_WRAPPER_TTQ(function, arg1, arg2) \   203 template<typename T, typename Q> \   204 inline T function(T arg1, Q arg2) __attribute__((hc,cpu)) { \   205   return ::function(arg1, arg2); \   208 #define HC_MATH_WRAPPER_FP_OVERLOAD_TTQ(function, arg1, arg2) \   209 template<typename T, typename Q> \   211 typename std::enable_if<std::is_integral<T>::value||std::is_integral<Q>::value,HC_IMPLICIT_FLOAT_CONV>::type \   212 function(T arg1, Q arg2) __attribute__((hc,cpu)) { \   213   return ::function(static_cast<HC_IMPLICIT_FLOAT_CONV>(arg1),static_cast<HC_IMPLICIT_FLOAT_CONV>(arg2)); \   215 template<typename T, typename Q> \   217 typename std::enable_if<std::is_floating_point<T>::value&&std::is_floating_point<Q>::value,T>::type \   218 function(T arg1, Q arg2) __attribute__((hc,cpu)) { \   219   return ::function(arg1,arg2); \   222 #define HC_MATH_WRAPPER_TTTQ(function, arg1, arg2, arg3) \   223 template<typename T, typename Q> \   224 inline T function(T arg1, T arg2, Q arg3) __attribute__((hc,cpu)) { \   225   return ::function(arg1, arg2, arg3); \   228 #define HC_MATH_WRAPPER_VTQQ(function, arg1, arg2, arg3) \   229 template<typename T, typename Q> \   230 inline void function(T arg1, Q arg2, Q arg3) __attribute__((hc,cpu)) { \   231   ::function(arg1, arg2, arg3); \   247 HC_MATH_WRAPPER_TQ(ilogbf, x)
   248 HC_MATH_WRAPPER_FP_OVERLOAD_TQ(ilogb, 
int, x)
   249 HC_MATH_WRAPPER_FP_OVERLOAD_TQ_STD(isfinite, 
bool, x)
   250 HC_MATH_WRAPPER_FP_OVERLOAD_TQ_STD(isinf, 
bool, x)
   251 HC_MATH_WRAPPER_FP_OVERLOAD_TQ_STD(isnan, 
bool, x)
   252 HC_MATH_WRAPPER_FP_OVERLOAD_TQ_STD(isnormal, 
bool, x)
   253 HC_MATH_WRAPPER_TQ(nanf, tagp)
   254 HC_MATH_WRAPPER_TQ(nan, tagp)
   255 HC_MATH_WRAPPER_TQ(signbitf, x)
   256 HC_MATH_WRAPPER_TQ(signbit, x)
   257 HC_MATH_WRAPPER_TTQ(frexpf, x, exp)
   258 HC_MATH_WRAPPER_TTQ(frexp, x, exp)
   259 HC_MATH_WRAPPER_TTQ(ldexpf, x, exp)
   260 HC_MATH_WRAPPER_TTQ(ldexp, x, exp)
   261 HC_MATH_WRAPPER_TTQ(modff, x, exp)
   262 HC_MATH_WRAPPER_TTQ(modf, x, exp)
   263 HC_MATH_WRAPPER_TTQ(scalbnf, x, exp)
   264 HC_MATH_WRAPPER_TTQ(scalbn, x, exp)
   265 HC_MATH_WRAPPER_TTTQ(remquof, x, y, quo)
   266 HC_MATH_WRAPPER_TTTQ(remquo, x, y, quo)
   267 HC_MATH_WRAPPER_VTQQ(sincosf, x, s, c)
   268 HC_MATH_WRAPPER_VTQQ(sincos, x, s, c)
   270 HC_MATH_WRAPPER_1(acosf, x)
   271 HC_MATH_WRAPPER_FP_OVERLOAD_1(acos, x)
   272 HC_MATH_WRAPPER_1(acoshf, x)
   273 HC_MATH_WRAPPER_FP_OVERLOAD_1(acosh, x)
   274 HC_MATH_WRAPPER_1(asinf, x)
   275 HC_MATH_WRAPPER_FP_OVERLOAD_1(asin, x)
   276 HC_MATH_WRAPPER_1(asinhf, x)
   277 HC_MATH_WRAPPER_FP_OVERLOAD_1(asinh, x)
   278 HC_MATH_WRAPPER_1(atanf, x)
   279 HC_MATH_WRAPPER_FP_OVERLOAD_1(atan, x)
   280 HC_MATH_WRAPPER_1(atanhf, x)
   281 HC_MATH_WRAPPER_FP_OVERLOAD_1(atanh, x)
   282 HC_MATH_WRAPPER_2(atan2f, y, x)
   283 HC_MATH_WRAPPER_2(atan2, y, x)
   284 HC_MATH_WRAPPER_1(cbrtf, x)
   285 HC_MATH_WRAPPER_FP_OVERLOAD_1(cbrt, x)
   286 HC_MATH_WRAPPER_1(ceilf, x)
   287 HC_MATH_WRAPPER_FP_OVERLOAD_1(ceil, x)
   288 HC_MATH_WRAPPER_2(copysignf, x, y)
   289 HC_MATH_WRAPPER_2(copysign, x, y)
   290 HC_MATH_WRAPPER_1(cosf, x)
   291 HC_MATH_WRAPPER_FP_OVERLOAD_1(cos, x)
   292 HC_MATH_WRAPPER_1(coshf, x)
   293 HC_MATH_WRAPPER_FP_OVERLOAD_1(cosh, x)
   294 KALMAR_MATH_WRAPPER_1(cospif, x)
   295 KALMAR_MATH_WRAPPER_FP_OVERLOAD_1(cospi, x)
   296 HC_MATH_WRAPPER_1(erff, x)
   297 HC_MATH_WRAPPER_FP_OVERLOAD_1(erf, x)
   298 HC_MATH_WRAPPER_1(erfcf, x)
   299 HC_MATH_WRAPPER_FP_OVERLOAD_1(erfc, x)
   300 KALMAR_MATH_WRAPPER_1(erfcinvf, x)
   301 KALMAR_MATH_WRAPPER_1(erfcinv, x)
   302 KALMAR_MATH_WRAPPER_1(erfinvf, x)
   303 KALMAR_MATH_WRAPPER_1(erfinv, x)
   304 HC_MATH_WRAPPER_1(expf, x)
   305 HC_MATH_WRAPPER_FP_OVERLOAD_1(exp, x)
   306 HC_MATH_WRAPPER_1(exp2f, x)
   307 HC_MATH_WRAPPER_FP_OVERLOAD_1(exp2, x)
   308 HC_MATH_WRAPPER_1(exp10f, x)
   309 HC_MATH_WRAPPER_FP_OVERLOAD_1(exp10, x)
   310 HC_MATH_WRAPPER_1(expm1f, x)
   311 HC_MATH_WRAPPER_FP_OVERLOAD_1(expm1, x)
   312 HC_MATH_WRAPPER_1(fabsf, x)
   313 HC_MATH_WRAPPER_FP_OVERLOAD_1(fabs, x)
   314 HC_MATH_WRAPPER_2(fdimf, x, y)
   315 HC_MATH_WRAPPER_2(fdim, x, y)
   316 HC_MATH_WRAPPER_1(floorf, x)
   317 HC_MATH_WRAPPER_FP_OVERLOAD_1(floor, x)
   318 HC_MATH_WRAPPER_3(fmaf, x, y, z)
   319 HC_MATH_WRAPPER_3(fma, x, y, z)
   320 HC_MATH_WRAPPER_2(fmaxf, x, y)
   321 HC_MATH_WRAPPER_2(fmax, x, y)
   322 HC_MATH_WRAPPER_2(fminf, x, y)
   323 HC_MATH_WRAPPER_2(fmin, x, y)
   324 HC_MATH_WRAPPER_2(fmodf, x, y)
   325 HC_MATH_WRAPPER_2(fmod, x, y)
   326 HC_MATH_WRAPPER_2(hypotf, x, y)
   327 HC_MATH_WRAPPER_2(hypot, x, y)
   328 HC_MATH_WRAPPER_1(lgammaf, x)
   329 HC_MATH_WRAPPER_FP_OVERLOAD_1(lgamma, x)
   330 HC_MATH_WRAPPER_1(logf, x)
   331 HC_MATH_WRAPPER_FP_OVERLOAD_1(log, x)
   332 HC_MATH_WRAPPER_1(log10f, x)
   333 HC_MATH_WRAPPER_FP_OVERLOAD_1(log10, x)
   334 HC_MATH_WRAPPER_1(log2f, x)
   335 HC_MATH_WRAPPER_FP_OVERLOAD_1(log2, x)
   336 HC_MATH_WRAPPER_1(log1pf, x)
   337 HC_MATH_WRAPPER_FP_OVERLOAD_1(log1p, x)
   338 HC_MATH_WRAPPER_1(logbf, x)
   339 HC_MATH_WRAPPER_FP_OVERLOAD_1(logb, x)
   340 HC_MATH_WRAPPER_1(nearbyintf, x)
   341 HC_MATH_WRAPPER_FP_OVERLOAD_1(nearbyint, x)
   342 HC_MATH_WRAPPER_2(nextafterf, x, y)
   343 HC_MATH_WRAPPER_2(nextafter, x, y)
   344 HC_MATH_WRAPPER_2(powf, x, y)
   345 HC_MATH_WRAPPER_FP_OVERLOAD_TTQ(pow,x,y)
   346 KALMAR_MATH_WRAPPER_1(rcbrtf, x)
   347 KALMAR_MATH_WRAPPER_FP_OVERLOAD_1(rcbrt, x)
   348 HC_MATH_WRAPPER_2(remainderf, x, y)
   349 HC_MATH_WRAPPER_2(remainder, x, y)
   350 HC_MATH_WRAPPER_1(roundf, x)
   351 HC_MATH_WRAPPER_FP_OVERLOAD_1(round, x)
   352 KALMAR_MATH_WRAPPER_1(rsqrtf, x)
   353 KALMAR_MATH_WRAPPER_FP_OVERLOAD_1(rsqrt, x)
   354 HC_MATH_WRAPPER_2(scalbf, x, exp)
   355 HC_MATH_WRAPPER_2(scalb, x, exp)
   356 HC_MATH_WRAPPER_1(sinf, x)
   357 HC_MATH_WRAPPER_FP_OVERLOAD_1(sin, x)
   358 HC_MATH_WRAPPER_1(sinhf, x)
   359 HC_MATH_WRAPPER_FP_OVERLOAD_1(sinh, x)
   360 KALMAR_MATH_WRAPPER_1(sinpif, x)
   361 KALMAR_MATH_WRAPPER_FP_OVERLOAD_1(sinpi, x)
   362 HC_MATH_WRAPPER_1(sqrtf, x)
   363 HC_MATH_WRAPPER_FP_OVERLOAD_1(sqrt, x)
   364 HC_MATH_WRAPPER_1(tgammaf, x)
   365 HC_MATH_WRAPPER_FP_OVERLOAD_1(tgamma, x)
   366 HC_MATH_WRAPPER_1(tanf, x)
   367 HC_MATH_WRAPPER_FP_OVERLOAD_1(tan, x)
   368 HC_MATH_WRAPPER_1(tanhf, x)
   369 HC_MATH_WRAPPER_FP_OVERLOAD_1(tanh, x)
   370 KALMAR_MATH_WRAPPER_1(tanpif, x)
   371 KALMAR_MATH_WRAPPER_FP_OVERLOAD_1(tanpi, x)
   372 HC_MATH_WRAPPER_1(truncf, x)
   373 HC_MATH_WRAPPER_FP_OVERLOAD_1(trunc, x)
 Heterogeneous C++ (HC) API.