mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-06 19:00:27 +01:00
glsl: Add "built-in" functions to do int_to_fp64(int)
v2: use mix Signed-off-by: Elie Tournier <elie.tournier@collabora.com>
This commit is contained in:
parent
773190f281
commit
f499942b31
1 changed files with 23 additions and 0 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue