diff options
Diffstat (limited to 'floattypes.h')
-rw-r--r-- | floattypes.h | 316 |
1 files changed, 149 insertions, 167 deletions
diff --git a/floattypes.h b/floattypes.h index 5107af6..e037b95 100644 --- a/floattypes.h +++ b/floattypes.h @@ -3,20 +3,14 @@ #ifndef FLOATTYPES_H #define FLOATTYPES_H - - #include <cassert> #include <cstdlib> - - -#if ! (defined __clang__ || defined __gcc__) -# define __builtin_unreachable() (assert(0)) -# define __builtin_expect(expr, val) (expr) +#if !(defined __clang__ || defined __gcc__) +#define __builtin_unreachable() (assert(0)) +#define __builtin_expect(expr, val) (expr) #endif - - // We expect either 199711L or 201103L #if __cplusplus >= 201103L // C++11 is supported, use it @@ -25,11 +19,9 @@ #include <cstdint> namespace vml_std { - using namespace std; +using namespace std; } - - #else // C++11 is not supported, work around the missing pieces @@ -40,38 +32,35 @@ namespace vml_std { #include <stdint.h> #ifndef static_assert -# define VML_CONCAT2(x, y) x##y -# define VML_CONCAT(x, y) VML_CONCAT2(x, y) -# define static_assert(cond, msg) \ - typedef int VML_CONCAT(vml_static_assert_, __LINE__)[(cond) ? 1 : -1] \ - __attribute__((__unused__)) +#define VML_CONCAT2(x, y) x##y +#define VML_CONCAT(x, y) VML_CONCAT2(x, y) +#define static_assert(cond, msg) typedef int VML_CONCAT( \ + vml_static_assert_, __LINE__)[(cond) ? 1 : -1] __attribute__((__unused__)) #endif - - // Capture libc macros, then undefine them #ifndef isfinite -# error "isfinite is not a macro" +#error "isfinite is not a macro" #endif #ifndef isinf -# error "isinf is not a macro" +#error "isinf is not a macro" #endif #ifndef isnan -# error "isnan is not a macro" +#error "isnan is not a macro" #endif #ifndef isnormal -# error "isnormal is not a macro" +#error "isnormal is not a macro" #endif #ifndef signbit -# error "signbit is not a macro" +#error "signbit is not a macro" #endif namespace { - template<typename T> inline int libc_isfinite(T x) { return isfinite(x); } - template<typename T> inline int libc_isinf(T x) { return isinf(x); } - template<typename T> inline int libc_isnan(T x) { return isnan(x); } - template<typename T> inline int libc_isnormal(T x) { return isnormal(x); } - template<typename T> inline int libc_signbit(T x) { return signbit(x); } +template <typename T> inline int libc_isfinite(T x) { return isfinite(x); } +template <typename T> inline int libc_isinf(T x) { return isinf(x); } +template <typename T> inline int libc_isnan(T x) { return isnan(x); } +template <typename T> inline int libc_isnormal(T x) { return isnormal(x); } +template <typename T> inline int libc_signbit(T x) { return signbit(x); } } // Include this before undefining the macros below @@ -83,153 +72,146 @@ namespace { #undef isnormal #undef signbit - - namespace vml_std { - - // Make some type definitions from stdint.h available in std - typedef ::uint8_t uint8_t; - typedef ::int8_t int8_t; - typedef ::uint16_t uint16_t; - typedef ::int16_t int16_t; - typedef ::uint32_t uint32_t; - typedef ::int32_t int32_t; + +// Make some type definitions from stdint.h available in std +typedef ::uint8_t uint8_t; +typedef ::int8_t int8_t; +typedef ::uint16_t uint16_t; +typedef ::int16_t int16_t; +typedef ::uint32_t uint32_t; +typedef ::int32_t int32_t; #if __SIZEOF_LONG__ == 8 - // Even if both "long" and "long long" have the same size, they are - // still different types. In many cases, it is then preferable to - // use "long" instead of "long long". - typedef unsigned long uint64_t; - typedef long int64_t; +// Even if both "long" and "long long" have the same size, they are +// still different types. In many cases, it is then preferable to +// use "long" instead of "long long". +typedef unsigned long uint64_t; +typedef long int64_t; #else - typedef ::uint64_t uint64_t; - typedef ::int64_t int64_t; +typedef ::uint64_t uint64_t; +typedef ::int64_t int64_t; #endif - - - - // Make math functions from math.h available in vml_std - // (We could instead take some of them -- but not all -- from std.) - - inline float acos(float x) { return ::acosf(x); } - inline float acosh(float x) { return ::acoshf(x); } - inline float asin(float x) { return ::asinf(x); } - inline float asinh(float x) { return ::asinhf(x); } - inline float atan(float x) { return ::atanf(x); } - inline float atan2(float x, float y) { return ::atan2f(x, y); } - inline float atanh(float x) { return ::atanhf(x); } - inline float cbrt(float x) { return ::cbrtf(x); } - inline float ceil(float x) { return ::ceilf(x); } - inline float cos(float x) { return ::cosf(x); } - inline float cosh(float x) { return ::coshf(x); } - inline float copysign(float x, float y) { return ::copysignf(x, y); } - inline float exp(float x) { return ::expf(x); } - inline float exp2(float x) { return ::exp2f(x); } - inline float expm1(float x) { return ::expm1f(x); } - inline float fabs(float x) { return ::fabsf(x); } - inline float fdim(float x, float y) { return ::fdimf(x, y); } - inline float floor(float x) { return ::floorf(x); } - inline float fma(float x, float y, float z) { return ::fmaf(x, y, z); } - inline float fmax(float x, float y) { return ::fmaxf(x, y); } - inline float fmin(float x, float y) { return ::fminf(x, y); } - inline float fmod(float x, float y) { return ::fmodf(x, y); } - inline float frexp(float x, int* r) { return ::frexpf(x, r); } - inline float hypot(float x, float y) { return ::hypotf(x, y); } - inline int ilogb(float x) { return ::ilogbf(x); } - inline bool isfinite(float x) { return libc_isfinite(x); } - inline bool isinf(float x) { return libc_isinf(x); } - inline bool isnan(float x) { return libc_isnan(x); } - inline bool isnormal(float x) { return libc_isnormal(x); } - inline float ldexp(float x, int n) { return ::ldexpf(x, n); } - inline long long llrint(float x) { return ::llrintf(x); } - inline float log(float x) { return ::logf(x); } - inline float log10(float x) { return ::log10f(x); } - inline float log1p(float x) { return ::log1pf(x); } - inline float log2(float x) { return ::log2f(x); } - inline long lrint(float x) { return ::lrintf(x); } - inline float nextafter(float x, float y) { return ::nextafterf(x, y); } - inline float pow(float x, float y) { return ::powf(x, y); } - inline float remainder(float x, float y) { return ::remainderf(x, y); } - inline float rint(float x) { return ::rintf(x); } - inline float round(float x) { return ::roundf(x); } - inline bool signbit(float x) { return libc_signbit(x); } - inline float sin(float x) { return ::sinf(x); } - inline float sinh(float x) { return ::sinhf(x); } - inline float sqrt(float x) { return ::sqrtf(x); } - inline float tan(float x) { return ::tanf(x); } - inline float tanh(float x) { return ::tanhf(x); } - inline float trunc(float x) { return ::truncf(x); } - - inline double acos(double x) { return ::acos(x); } - inline double acosh(double x) { return ::acosh(x); } - inline double asin(double x) { return ::asin(x); } - inline double asinh(double x) { return ::asinh(x); } - inline double atan(double x) { return ::atan(x); } - inline double atan2(double x, double y) { return ::atan2(x, y); } - inline double atanh(double x) { return ::atanh(x); } - inline double cbrt(double x) { return ::cbrt(x); } - inline double ceil(double x) { return ::ceil(x); } - inline double cos(double x) { return ::cos(x); } - inline double cosh(double x) { return ::cosh(x); } - inline double copysign(double x, double y) { return ::copysign(x, y); } - inline double exp(double x) { return ::exp(x); } - inline double exp2(double x) { return ::exp2(x); } - inline double expm1(double x) { return ::expm1(x); } - inline double fabs(double x) { return ::fabs(x); } - inline double fdim(double x, double y) { return ::fdim(x, y); } - inline double floor(double x) { return ::floor(x); } - inline double fma(double x, double y, double z) { return ::fma(x, y, z); } - inline double fmax(double x, double y) { return ::fmax(x, y); } - inline double fmin(double x, double y) { return ::fmin(x, y); } - inline double fmod(double x, double y) { return ::fmod(x, y); } - inline double frexp(double x, int* r) { return ::frexp(x, r); } - inline double hypot(double x, double y) { return ::hypot(x, y); } - inline int ilogb(double x) { return ::ilogb(x); } - inline bool isfinite(double x) { return libc_isfinite(x); } - inline bool isinf(double x) { return libc_isinf(x); } - inline bool isnan(double x) { return libc_isnan(x); } - inline bool isnormal(double x) { return libc_isnormal(x); } - inline double ldexp(double x, int n) { return ::ldexp(x, n); } - inline long long llrint(double x) { return ::llrint(x); } - inline double log(double x) { return ::log(x); } - inline double log10(double x) { return ::log10(x); } - inline double log1p(double x) { return ::log1p(x); } - inline double log2(double x) { return ::log2(x); } - inline long lrint(double x) { return ::lrint(x); } - inline double nextafter(double x, double y) { return ::nextafter(x, y); } - inline double pow(double x, double y) { return ::pow(x, y); } - inline double remainder(double x, double y) { return ::remainder(x, y); } - inline double rint(double x) { return ::rint(x); } - inline double round(double x) { return ::round(x); } - inline bool signbit(double x) { return libc_signbit(x); } - inline double sin(double x) { return ::sin(x); } - inline double sinh(double x) { return ::sinh(x); } - inline double sqrt(double x) { return ::sqrt(x); } - inline double tan(double x) { return ::tan(x); } - inline double tanh(double x) { return ::tanh(x); } - inline double trunc(double x) { return ::trunc(x); } - + +// Make math functions from math.h available in vml_std +// (We could instead take some of them -- but not all -- from std.) + +inline float acos(float x) { return ::acosf(x); } +inline float acosh(float x) { return ::acoshf(x); } +inline float asin(float x) { return ::asinf(x); } +inline float asinh(float x) { return ::asinhf(x); } +inline float atan(float x) { return ::atanf(x); } +inline float atan2(float x, float y) { return ::atan2f(x, y); } +inline float atanh(float x) { return ::atanhf(x); } +inline float cbrt(float x) { return ::cbrtf(x); } +inline float ceil(float x) { return ::ceilf(x); } +inline float cos(float x) { return ::cosf(x); } +inline float cosh(float x) { return ::coshf(x); } +inline float copysign(float x, float y) { return ::copysignf(x, y); } +inline float exp(float x) { return ::expf(x); } +inline float exp2(float x) { return ::exp2f(x); } +inline float expm1(float x) { return ::expm1f(x); } +inline float fabs(float x) { return ::fabsf(x); } +inline float fdim(float x, float y) { return ::fdimf(x, y); } +inline float floor(float x) { return ::floorf(x); } +inline float fma(float x, float y, float z) { return ::fmaf(x, y, z); } +inline float fmax(float x, float y) { return ::fmaxf(x, y); } +inline float fmin(float x, float y) { return ::fminf(x, y); } +inline float fmod(float x, float y) { return ::fmodf(x, y); } +inline float frexp(float x, int *r) { return ::frexpf(x, r); } +inline float hypot(float x, float y) { return ::hypotf(x, y); } +inline int ilogb(float x) { return ::ilogbf(x); } +inline bool isfinite(float x) { return libc_isfinite(x); } +inline bool isinf(float x) { return libc_isinf(x); } +inline bool isnan(float x) { return libc_isnan(x); } +inline bool isnormal(float x) { return libc_isnormal(x); } +inline float ldexp(float x, int n) { return ::ldexpf(x, n); } +inline long long llrint(float x) { return ::llrintf(x); } +inline float log(float x) { return ::logf(x); } +inline float log10(float x) { return ::log10f(x); } +inline float log1p(float x) { return ::log1pf(x); } +inline float log2(float x) { return ::log2f(x); } +inline long lrint(float x) { return ::lrintf(x); } +inline float nextafter(float x, float y) { return ::nextafterf(x, y); } +inline float pow(float x, float y) { return ::powf(x, y); } +inline float remainder(float x, float y) { return ::remainderf(x, y); } +inline float rint(float x) { return ::rintf(x); } +inline float round(float x) { return ::roundf(x); } +inline bool signbit(float x) { return libc_signbit(x); } +inline float sin(float x) { return ::sinf(x); } +inline float sinh(float x) { return ::sinhf(x); } +inline float sqrt(float x) { return ::sqrtf(x); } +inline float tan(float x) { return ::tanf(x); } +inline float tanh(float x) { return ::tanhf(x); } +inline float trunc(float x) { return ::truncf(x); } + +inline double acos(double x) { return ::acos(x); } +inline double acosh(double x) { return ::acosh(x); } +inline double asin(double x) { return ::asin(x); } +inline double asinh(double x) { return ::asinh(x); } +inline double atan(double x) { return ::atan(x); } +inline double atan2(double x, double y) { return ::atan2(x, y); } +inline double atanh(double x) { return ::atanh(x); } +inline double cbrt(double x) { return ::cbrt(x); } +inline double ceil(double x) { return ::ceil(x); } +inline double cos(double x) { return ::cos(x); } +inline double cosh(double x) { return ::cosh(x); } +inline double copysign(double x, double y) { return ::copysign(x, y); } +inline double exp(double x) { return ::exp(x); } +inline double exp2(double x) { return ::exp2(x); } +inline double expm1(double x) { return ::expm1(x); } +inline double fabs(double x) { return ::fabs(x); } +inline double fdim(double x, double y) { return ::fdim(x, y); } +inline double floor(double x) { return ::floor(x); } +inline double fma(double x, double y, double z) { return ::fma(x, y, z); } +inline double fmax(double x, double y) { return ::fmax(x, y); } +inline double fmin(double x, double y) { return ::fmin(x, y); } +inline double fmod(double x, double y) { return ::fmod(x, y); } +inline double frexp(double x, int *r) { return ::frexp(x, r); } +inline double hypot(double x, double y) { return ::hypot(x, y); } +inline int ilogb(double x) { return ::ilogb(x); } +inline bool isfinite(double x) { return libc_isfinite(x); } +inline bool isinf(double x) { return libc_isinf(x); } +inline bool isnan(double x) { return libc_isnan(x); } +inline bool isnormal(double x) { return libc_isnormal(x); } +inline double ldexp(double x, int n) { return ::ldexp(x, n); } +inline long long llrint(double x) { return ::llrint(x); } +inline double log(double x) { return ::log(x); } +inline double log10(double x) { return ::log10(x); } +inline double log1p(double x) { return ::log1p(x); } +inline double log2(double x) { return ::log2(x); } +inline long lrint(double x) { return ::lrint(x); } +inline double nextafter(double x, double y) { return ::nextafter(x, y); } +inline double pow(double x, double y) { return ::pow(x, y); } +inline double remainder(double x, double y) { return ::remainder(x, y); } +inline double rint(double x) { return ::rint(x); } +inline double round(double x) { return ::round(x); } +inline bool signbit(double x) { return libc_signbit(x); } +inline double sin(double x) { return ::sin(x); } +inline double sinh(double x) { return ::sinh(x); } +inline double sqrt(double x) { return ::sqrt(x); } +inline double tan(double x) { return ::tan(x); } +inline double tanh(double x) { return ::tanh(x); } +inline double trunc(double x) { return ::trunc(x); } } #endif +namespace vecmathlib { + +struct fp8 { + // 1 bit sign, 4 bits exponent, 3 bits mantissa, exponent offset 7 (?) + vml_std::uint8_t val; + fp8() {} + fp8(double x) { __builtin_unreachable(); } +}; +struct fp16 { + // 1 bit sign, 5 bits exponent, 10 bits mantissa, exponent offset 15 (?) + vml_std::uint16_t val; + fp16() {} + fp16(double x) { __builtin_unreachable(); } +}; -namespace vecmathlib { - - struct fp8 { - // 1 bit sign, 4 bits exponent, 3 bits mantissa, exponent offset 7 (?) - vml_std::uint8_t val; - fp8() {} - fp8(double x) { __builtin_unreachable(); } - }; - - struct fp16 { - // 1 bit sign, 5 bits exponent, 10 bits mantissa, exponent offset 15 (?) - vml_std::uint16_t val; - fp16() {} - fp16(double x) { __builtin_unreachable(); } - }; - } // namespace vecmathlib -#endif // #ifndef FLOATTYPES_H +#endif // #ifndef FLOATTYPES_H |