X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=fp16.cpp;h=e8993f9eb153f508516dec4cbd6a2642965d9597;hp=3738f5c4360bd055cdd5a39ed32d9aecdb8a3158;hb=5b08f06cd4547102186932ce789788e07ea8fd8c;hpb=1f4a7aefd4a149e93a1dc41f85958e827670c98b diff --git a/fp16.cpp b/fp16.cpp index 3738f5c..e8993f9 100644 --- a/fp16.cpp +++ b/fp16.cpp @@ -13,9 +13,9 @@ template inline double fp_upconvert(FP16_INT_T x) { - int sign = x >> (FP16_MANTISSA_BITS + FP16_EXPONENT_BITS); - int exponent = (x & ((1ULL << (FP16_MANTISSA_BITS + FP16_EXPONENT_BITS)) - 1)) >> FP16_MANTISSA_BITS; - unsigned long long mantissa = x & ((1ULL << FP16_MANTISSA_BITS) - 1); + int sign = x.val >> (FP16_MANTISSA_BITS + FP16_EXPONENT_BITS); + int exponent = (x.val & ((1ULL << (FP16_MANTISSA_BITS + FP16_EXPONENT_BITS)) - 1)) >> FP16_MANTISSA_BITS; + unsigned long long mantissa = x.val & ((1ULL << FP16_MANTISSA_BITS) - 1); int sign64; int exponent64; @@ -187,9 +187,11 @@ inline FP16_INT_T fp_downconvert(double x) } } - return (sign16 << (FP16_MANTISSA_BITS + FP16_EXPONENT_BITS)) + FP16_INT_T ret; + ret.val = (sign16 << (FP16_MANTISSA_BITS + FP16_EXPONENT_BITS)) | (exponent16 << FP16_MANTISSA_BITS) | mantissa16; + return ret; } const int FP64_BIAS = 1023; @@ -209,6 +211,8 @@ const int FP16_MAX_EXPONENT = (1 << FP16_EXPONENT_BITS) - 1; } // namespace +#ifndef __F16C__ + double fp16_to_fp64(fp16_int_t x) { return fp_upconvert(x); } +#endif + double fp32_to_fp64(fp32_int_t x) { return fp_upconvert