X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Finternal%2Flibm.h;h=b5bd26b8407751e7042f6ad974a79af08226d0f0;hb=1ef37aa00ea830dfda76e04e3d941cafa74d8b76;hp=09fcfde39eac5b9a50ccc958753a8e80fbfde5ae;hpb=fe54544f055959bb7406758881d0fb85920b3f0e;p=musl diff --git a/src/internal/libm.h b/src/internal/libm.h index 09fcfde3..b5bd26b8 100644 --- a/src/internal/libm.h +++ b/src/internal/libm.h @@ -59,6 +59,43 @@ union ldshape { #error Unsupported long double representation #endif +/* Support non-nearest rounding mode. */ +#define WANT_ROUNDING 1 +/* Support signaling NaNs. */ +#define WANT_SNAN 0 + +#if WANT_SNAN +#error SNaN is unsupported +#else +#define issignalingf_inline(x) 0 +#define issignaling_inline(x) 0 +#endif + +#ifndef TOINT_INTRINSICS +#define TOINT_INTRINSICS 0 +#endif + +#if TOINT_INTRINSICS +/* Round x to nearest int in all rounding modes, ties have to be rounded + consistently with converttoint so the results match. If the result + would be outside of [-2^31, 2^31-1] then the semantics is unspecified. */ +static double_t roundtoint(double_t); + +/* Convert x to nearest int in all rounding modes, ties have to be rounded + consistently with roundtoint. If the result is not representible in an + int32_t then the semantics is unspecified. */ +static int32_t converttoint(double_t); +#endif + +/* Helps static branch prediction so hot path can be better optimized. */ +#ifdef __GNUC__ +#define predict_true(x) __builtin_expect(!!(x), 1) +#define predict_false(x) __builtin_expect(x, 0) +#else +#define predict_true(x) (x) +#define predict_false(x) (x) +#endif + /* Evaluate an expression as the specified type. With standard excess precision handling a type cast or assignment is enough (with -ffloat-store an assignment is required, in old compilers argument @@ -117,7 +154,8 @@ static inline long double fp_barrierl(long double x) #define fp_force_evalf fp_force_evalf static inline void fp_force_evalf(float x) { - volatile float y = x; + volatile float y; + y = x; } #endif @@ -125,7 +163,8 @@ static inline void fp_force_evalf(float x) #define fp_force_eval fp_force_eval static inline void fp_force_eval(double x) { - volatile double y = x; + volatile double y; + y = x; } #endif @@ -133,7 +172,8 @@ static inline void fp_force_eval(double x) #define fp_force_evall fp_force_evall static inline void fp_force_evall(long double x) { - volatile long double y = x; + volatile long double y; + y = x; } #endif @@ -216,4 +256,16 @@ extern int __signgam; hidden double __lgamma_r(double, int *); hidden float __lgammaf_r(float, int *); +/* error handling functions */ +hidden float __math_xflowf(uint32_t, float); +hidden float __math_uflowf(uint32_t); +hidden float __math_oflowf(uint32_t); +hidden float __math_divzerof(uint32_t); +hidden float __math_invalidf(float); +hidden double __math_xflow(uint32_t, double); +hidden double __math_uflow(uint32_t); +hidden double __math_oflow(uint32_t); +hidden double __math_divzero(uint32_t); +hidden double __math_invalid(double); + #endif