glsl: Add "built-in" functions to do fp32_to_fp64(fp32)
Signed-off-by: Elie Tournier <elie.tournier@collabora.com>
This commit is contained in:

committed by
Matt Turner

parent
407bd1bbf9
commit
cad58fc5e7
@@ -1045,3 +1045,41 @@ __fp64_to_fp32(uint64_t __a)
|
|||||||
zFrac = mix(zFrac, zFrac | 0x40000000u, aExp != 0);
|
zFrac = mix(zFrac, zFrac | 0x40000000u, aExp != 0);
|
||||||
return __roundAndPackFloat32(aSign, aExp - 0x381, zFrac);
|
return __roundAndPackFloat32(aSign, aExp - 0x381, zFrac);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns the result of converting the single-precision floating-point value
|
||||||
|
* `a' to the double-precision floating-point format.
|
||||||
|
*/
|
||||||
|
uint64_t
|
||||||
|
__fp32_to_fp64(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;
|
||||||
|
|
||||||
|
if (aExp == 0xFF) {
|
||||||
|
if (aFrac != 0u) {
|
||||||
|
uint nanLo = 0u;
|
||||||
|
uint nanHi = a<<9;
|
||||||
|
__shift64Right(nanHi, nanLo, 12, nanHi, nanLo);
|
||||||
|
nanHi |= ((aSign<<31) | 0x7FF80000u);
|
||||||
|
return packUint2x32(uvec2(nanLo, nanHi));
|
||||||
|
}
|
||||||
|
return __packFloat64(aSign, 0x7FF, 0u, 0u);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aExp == 0) {
|
||||||
|
if (aFrac == 0u)
|
||||||
|
return __packFloat64(aSign, 0, 0u, 0u);
|
||||||
|
/* Normalize subnormal */
|
||||||
|
int shiftCount = __countLeadingZeros32(aFrac) - 8;
|
||||||
|
aFrac <<= shiftCount;
|
||||||
|
aExp = 1 - shiftCount;
|
||||||
|
--aExp;
|
||||||
|
}
|
||||||
|
|
||||||
|
__shift64Right(aFrac, 0u, 3, zFrac0, zFrac1);
|
||||||
|
return __packFloat64(aSign, aExp + 0x380, zFrac0, zFrac1);
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user