diff options
author | Sagar Ghuge <[email protected]> | 2018-12-11 11:25:19 -0800 |
---|---|---|
committer | Matt Turner <[email protected]> | 2019-01-09 16:42:40 -0800 |
commit | 876a4b85fea3f5aff7ac13c895ab76292ef7ffd5 (patch) | |
tree | f9284eb468161b59244c7bfa68162ae276424dd9 /src | |
parent | 21e9bb2b3f306f29e6fe14157502f10c2daa44df (diff) |
glsl: Add "built-in" functions to do fp64_to_int64(fp64)
Reviewed-by: Elie Tournier <[email protected]>
Signed-off-by: Sagar Ghuge <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/glsl/float64.glsl | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/compiler/glsl/float64.glsl b/src/compiler/glsl/float64.glsl index 71ebbb8d907..63bcd65213c 100644 --- a/src/compiler/glsl/float64.glsl +++ b/src/compiler/glsl/float64.glsl @@ -1000,6 +1000,35 @@ __fp64_to_uint64(uint64_t a) return __roundAndPackUInt64(aSign, aFracHi, aFracLo, zFrac2); } +int64_t +__fp64_to_int64(uint64_t a) +{ + uint zFrac2 = 0u; + uint aFracLo = __extractFloat64FracLo(a); + uint aFracHi = __extractFloat64FracHi(a); + int aExp = __extractFloat64Exp(a); + uint aSign = __extractFloat64Sign(a); + int64_t default_NegNaN = -0x7FFFFFFFFFFFFFFEL; + int64_t default_PosNaN = 0xFFFFFFFFFFFFFFFFL; + + aFracHi = mix(aFracHi, aFracHi | 0x00100000u, aExp != 0); + int shiftCount = 0x433 - aExp; + + if (shiftCount <= 0) { + if (shiftCount < -11 && aExp == 0x7FF) { + if ((aFracHi | aFracLo) != 0u) + return default_NegNaN; + return mix(default_NegNaN, default_PosNaN, aSign == 0u); + } + __shortShift64Left(aFracHi, aFracLo, -shiftCount, aFracHi, aFracLo); + } else { + __shift64ExtraRightJamming(aFracHi, aFracLo, zFrac2, shiftCount, + aFracHi, aFracLo, zFrac2); + } + + return __roundAndPackInt64(aSign, aFracHi, aFracLo, zFrac2); +} + uint64_t __int64_to_fp64(int64_t a) { |