glsl: Add "built-in" functions to do uint_to_fp64(uint)
authorElie Tournier <tournier.elie@gmail.com>
Wed, 9 Aug 2017 10:41:13 +0000 (11:41 +0100)
committerMatt Turner <mattst88@gmail.com>
Thu, 10 Jan 2019 00:42:40 +0000 (16:42 -0800)
Signed-off-by: Elie Tournier <elie.tournier@collabora.com>
src/compiler/glsl/float64.glsl

index f7952413fad663c1699f173383dbab7d7ed229dd..232bf18b4d3e383f7f64b494c43f42164248d1c2 100644 (file)
@@ -858,3 +858,25 @@ __fp64_to_uint(uint64_t a)
 
    return mix(z, expt, (aSign != 0u) && (z != 0u));
 }
+
+uint64_t
+__uint_to_fp64(uint a)
+{
+   if (a == 0u)
+      return 0ul;
+
+   int shiftDist = __countLeadingZeros32(a) + 21;
+
+   uint aHigh = 0u;
+   uint aLow = 0u;
+   int negCount = (- shiftDist) & 31;
+
+   aHigh = mix(0u, a<< shiftDist - 32, shiftDist < 64);
+   aLow = 0u;
+   aHigh = mix(aHigh, 0u, shiftDist == 0);
+   aLow = mix(aLow, a, shiftDist ==0);
+   aHigh = mix(aHigh, a >> negCount, shiftDist < 32);
+   aLow = mix(aLow, a << shiftDist, shiftDist < 32);
+
+   return __packFloat64(0u, 0x432 - shiftDist, aHigh, aLow);
+}