mirror of
https://github.com/red-prig/fpPS4.git
synced 2024-11-27 08:31:07 +00:00
63 lines
1.1 KiB
ObjectPascal
63 lines
1.1 KiB
ObjectPascal
unit Half16;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
type
|
|
PHalf16=^THalf16;
|
|
THalf16=bitpacked record
|
|
man:0..1023;
|
|
exp:0..31;
|
|
sgn:0..1;
|
|
end;
|
|
|
|
operator := (i:THalf16):Single;
|
|
operator := (i:Single):THalf16;
|
|
|
|
implementation
|
|
|
|
operator := (i:THalf16):Single;
|
|
var
|
|
t1,t2,t3:DWORD;
|
|
begin
|
|
t1:=Word(i) and $7fff; // Non-sign bits
|
|
t2:=Word(i) and $8000; // Sign bit
|
|
t3:=Word(i) and $7c00; // Exponent
|
|
|
|
t1:=t1 shl 13; // Align mantissa on MSB
|
|
t2:=t2 shl 16; // Shift sign bit into position
|
|
|
|
t1:=t1+$38000000; // Adjust bias
|
|
|
|
if (t3=0) then t1:=0; // Denormals-as-zero
|
|
|
|
t1:=t1 or t2; // Re-insert sign bit
|
|
|
|
PDWORD(@Result)^:=t1;
|
|
end;
|
|
|
|
operator := (i:Single):THalf16;
|
|
var
|
|
t1,t2,t3:DWORD;
|
|
begin
|
|
t1:=PDWORD(@i)^ and $7fffffff; // Non-sign bits
|
|
t2:=PDWORD(@i)^ and $80000000; // Sign bit
|
|
t3:=PDWORD(@i)^ and $7f800000; // Exponent
|
|
|
|
t1:=t1 shr 13; // Align mantissa on MSB
|
|
t2:=t2 shr 16; // Shift sign bit into position
|
|
|
|
t1:=t1-$1c000; // Adjust bias
|
|
|
|
if (t3<$38800000) then t1:=0; // Flush-to-zero
|
|
if (t3>$47000000) then t1:=$7bff; // Clamp-to-max
|
|
|
|
t1:=t1 or t2; // Re-insert sign bit
|
|
|
|
Word(Result):=Word(t1);
|
|
end;
|
|
|
|
end.
|
|
|