glsl: Add "built-in" functions to do int_to_fp64(int)
authorElie Tournier <tournier.elie@gmail.com>
Wed, 9 Aug 2017 16:39:23 +0000 (17:39 +0100)
committerMatt Turner <mattst88@gmail.com>
Thu, 10 Jan 2019 00:42:40 +0000 (16:42 -0800)
v2: use mix
Signed-off-by: Elie Tournier <elie.tournier@collabora.com>
src/compiler/glsl/float64.glsl

index 72fbefd2eff9382488c81320ca22b8caf4829816..ee87632afe3621e21b75ac5ee69822ab6dd23ff4 100644 (file)
@@ -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);
+}