OSDN Git Service

glsl: Add "built-in" functions to do trunc(fp64)
authorElie Tournier <tournier.elie@gmail.com>
Fri, 11 Aug 2017 13:09:01 +0000 (14:09 +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 7bfaa9c..88209fc 100644 (file)
@@ -1355,3 +1355,25 @@ __fsqrt64(uint64_t a)
    __shift64ExtraRightJamming(zFrac0, zFrac1, 0u, 10, zFrac0, zFrac1, zFrac2);
    return __roundAndPackFloat64(0u, zExp, zFrac0, zFrac1, zFrac2);
 }
+
+uint64_t
+__ftrunc64(uint64_t __a)
+{
+   uvec2 a = unpackUint2x32(__a);
+   int aExp = __extractFloat64Exp(__a);
+   uint zLo;
+   uint zHi;
+
+   int unbiasedExp = aExp - 1023;
+   int fracBits = 52 - unbiasedExp;
+   uint maskLo = mix(~0u << fracBits, 0u, fracBits >= 32);
+   uint maskHi = mix(~0u << (fracBits - 32), ~0u, fracBits < 33);
+   zLo = maskLo & a.x;
+   zHi = maskHi & a.y;
+
+   zLo = mix(zLo, 0u, unbiasedExp < 0);
+   zHi = mix(zHi, 0u, unbiasedExp < 0);
+   zLo = mix(zLo, a.x, unbiasedExp > 52);
+   zHi = mix(zHi, a.y, unbiasedExp > 52);
+   return packUint2x32(uvec2(zLo, zHi));
+}