glsl: Add "built-in" functions to do fp32_to_uint64(fp32)
authorSagar Ghuge <sagar.ghuge@intel.com>
Tue, 11 Dec 2018 21:39:32 +0000 (13:39 -0800)
committerMatt Turner <mattst88@gmail.com>
Thu, 10 Jan 2019 00:42:40 +0000 (16:42 -0800)
Reviewed-by: Elie Tournier <tournier.elie@gmail.com>
Signed-off-by: Sagar Ghuge <sagar.ghuge@intel.com>
src/compiler/glsl/float64.glsl

index 63bcd65213c82ef703c4306652ea7d2a5febbdc1..35a49651381e24f5fee34bcb489120290f8d8983 100644 (file)
@@ -1029,6 +1029,35 @@ __fp64_to_int64(uint64_t a)
    return __roundAndPackInt64(aSign, aFracHi, aFracLo, zFrac2);
 }
 
+uint64_t
+__fp32_to_uint64(float f)
+{
+   uint a = floatBitsToUint(f);
+   uint aFrac = a & 0x007FFFFFu;
+   int aExp = int((a>>23) & 0xFFu);
+   uint aSign = a>>31;
+   uint zFrac0 = 0u;
+   uint zFrac1 = 0u;
+   uint zFrac2 = 0u;
+   uint64_t default_nan = 0xFFFFFFFFFFFFFFFFUL;
+   int shiftCount = 0xBE - aExp;
+
+   if (shiftCount <0) {
+      if (aExp == 0xFF)
+         return default_nan;
+   }
+
+   aFrac = mix(aFrac, aFrac | 0x00800000u, aExp != 0);
+   __shortShift64Left(aFrac, 0, 40, zFrac0, zFrac1);
+
+   if (shiftCount != 0) {
+      __shift64ExtraRightJamming(zFrac0, zFrac1, zFrac2, shiftCount,
+                                 zFrac0, zFrac1, zFrac2);
+   }
+
+   return __roundAndPackUInt64(aSign, zFrac0, zFrac1, zFrac2);
+}
+
 uint64_t
 __int64_to_fp64(int64_t a)
 {