From f499942b31aece4e2eefcef7c5b94dea5601055b Mon Sep 17 00:00:00 2001 From: Elie Tournier Date: Wed, 9 Aug 2017 17:39:23 +0100 Subject: [PATCH] glsl: Add "built-in" functions to do int_to_fp64(int) v2: use mix Signed-off-by: Elie Tournier --- src/compiler/glsl/float64.glsl | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/compiler/glsl/float64.glsl b/src/compiler/glsl/float64.glsl index 72fbefd2eff..ee87632afe3 100644 --- a/src/compiler/glsl/float64.glsl +++ b/src/compiler/glsl/float64.glsl @@ -921,3 +921,26 @@ __fp64_to_int(uint64_t a) int nan = mix(0x7FFFFFFF, 0x80000000, bool(aSign)); return mix(z, nan, bool(aSign ^ uint(z < 0)) && bool(z)); } + +/* Returns the result of converting the 32-bit two's complement integer `a' + * to the double-precision floating-point format. The conversion is performed + * according to the IEEE Standard for Floating-Point Arithmetic. + */ +uint64_t +__int_to_fp64(int a) +{ + uint zFrac0 = 0u; + uint zFrac1 = 0u; + if (a==0) + return __packFloat64(0u, 0, 0u, 0u); + uint zSign = uint(a < 0); + uint absA = mix(uint(a), uint(-a), a < 0); + int shiftCount = __countLeadingZeros32(absA) - 11; + if (0 <= shiftCount) { + zFrac0 = absA << shiftCount; + zFrac1 = 0u; + } else { + __shift64Right(absA, 0u, -shiftCount, zFrac0, zFrac1); + } + return __packFloat64(zSign, 0x412 - shiftCount, zFrac0, zFrac1); +} -- 2.11.0