mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-16 08:59:26 +02:00
* softfpu cleanup: use Pascal boolean types where appropriate, use 64-bit overload of shift64RightJamming() to simplify things.
git-svn-id: trunk@28280 -
This commit is contained in:
parent
66aca1b104
commit
cf2b4a4dbd
@ -132,15 +132,6 @@ TYPE
|
||||
2: (dummy : double);
|
||||
end;
|
||||
|
||||
int64rec = record
|
||||
case byte of
|
||||
1: (low,high : bits32);
|
||||
// force the record to be aligned like a double
|
||||
// else *_to_double will fail for cpus like sparc
|
||||
// and avoid expensive unpacking/packing operations
|
||||
2: (dummy : int64);
|
||||
end;
|
||||
|
||||
floatx80 = record
|
||||
case byte of
|
||||
1: (low : qword;high : word);
|
||||
@ -167,15 +158,6 @@ TYPE
|
||||
2: (dummy : double);
|
||||
end;
|
||||
|
||||
int64rec = record
|
||||
case byte of
|
||||
1: (high,low : bits32);
|
||||
// force the record to be aligned like a double
|
||||
// else *_to_double will fail for cpus like sparc
|
||||
// and avoid expensive unpacking/packing operations
|
||||
2: (dummy : int64);
|
||||
end;
|
||||
|
||||
floatx80 = record
|
||||
case byte of
|
||||
1: (high : word;low : qword);
|
||||
@ -604,14 +586,14 @@ end;
|
||||
function roundAndPackInt32( zSign: flag; absZ : bits64): int32;
|
||||
var
|
||||
roundingMode: TFPURoundingMode;
|
||||
roundNearestEven: flag;
|
||||
roundNearestEven: boolean;
|
||||
roundIncrement, roundBits: int8;
|
||||
z: int32;
|
||||
begin
|
||||
roundingMode := softfloat_rounding_mode;
|
||||
roundNearestEven := ord( roundingMode = float_round_nearest_even );
|
||||
roundNearestEven := (roundingMode = float_round_nearest_even);
|
||||
roundIncrement := $40;
|
||||
if ( roundNearestEven=0 ) then
|
||||
if not roundNearestEven then
|
||||
begin
|
||||
if ( roundingMode = float_round_to_zero ) then
|
||||
begin
|
||||
@ -632,7 +614,7 @@ begin
|
||||
end;
|
||||
roundBits := absZ and $7F;
|
||||
absZ := ( absZ + roundIncrement ) shr 7;
|
||||
absZ := absZ and not( ord( ( roundBits xor $40 ) = 0 ) and roundNearestEven );
|
||||
absZ := absZ and not( ord( ( roundBits xor $40 ) = 0 ) and ord(roundNearestEven) );
|
||||
z := absZ;
|
||||
if ( zSign<>0 ) then
|
||||
z := - z;
|
||||
@ -2423,19 +2405,14 @@ Binary Floating-Point Arithmetic.
|
||||
Function roundAndPackFloat32( zSign : Flag; zExp : Int16; zSig : Bits32 ) : float32;
|
||||
Var
|
||||
roundingMode : TFPURoundingMode;
|
||||
roundNearestEven : Flag;
|
||||
roundNearestEven : boolean;
|
||||
roundIncrement, roundBits : BYTE;
|
||||
IsTiny : Flag;
|
||||
IsTiny : boolean;
|
||||
Begin
|
||||
roundingMode := softfloat_rounding_mode;
|
||||
if (roundingMode = float_round_nearest_even) then
|
||||
Begin
|
||||
roundNearestEven := Flag(TRUE);
|
||||
end
|
||||
else
|
||||
roundNearestEven := Flag(FALSE);
|
||||
roundNearestEven := (roundingMode = float_round_nearest_even);
|
||||
roundIncrement := $40;
|
||||
if ( Boolean(roundNearestEven) = FALSE) then
|
||||
if not roundNearestEven then
|
||||
Begin
|
||||
if ( roundingMode = float_round_to_zero ) Then
|
||||
Begin
|
||||
@ -2466,23 +2443,22 @@ Function roundAndPackFloat32( zSign : Flag; zExp : Int16; zSig : Bits32 ) : floa
|
||||
if ( zExp < 0 ) then
|
||||
Begin
|
||||
isTiny :=
|
||||
flag(( softfloat_detect_tininess = float_tininess_before_rounding )
|
||||
( softfloat_detect_tininess = float_tininess_before_rounding )
|
||||
OR ( zExp < -1 )
|
||||
OR ( (zSig + roundIncrement) < $80000000 ));
|
||||
OR ( (zSig + roundIncrement) < $80000000 );
|
||||
shift32RightJamming( zSig, - zExp, zSig );
|
||||
zExp := 0;
|
||||
roundBits := zSig AND $7F;
|
||||
if ( (isTiny = flag(TRUE)) and (roundBits<>0) ) then
|
||||
if ( isTiny and (roundBits<>0) ) then
|
||||
float_raise( float_flag_underflow );
|
||||
End;
|
||||
End;
|
||||
if ( roundBits )<> 0 then
|
||||
set_inexact_flag;
|
||||
zSig := ( zSig + roundIncrement ) shr 7;
|
||||
zSig := zSig AND not bits32( bits32( ( roundBits XOR $40 ) = 0 ) and roundNearestEven );
|
||||
zSig := zSig AND not bits32( bits32( ( roundBits XOR $40 ) = 0 ) and ord(roundNearestEven) );
|
||||
if ( zSig = 0 ) then zExp := 0;
|
||||
roundAndPackFloat32 := packFloat32( zSign, zExp, zSig );
|
||||
exit;
|
||||
End;
|
||||
|
||||
{*
|
||||
@ -5761,7 +5737,6 @@ var
|
||||
zSign : flag;
|
||||
absA : uint64;
|
||||
shiftCount: int8;
|
||||
intval : int64rec;
|
||||
Begin
|
||||
if ( a = 0 ) then
|
||||
begin
|
||||
@ -5785,14 +5760,7 @@ Begin
|
||||
begin
|
||||
shiftCount := shiftCount + 7;
|
||||
if ( shiftCount < 0 ) then
|
||||
begin
|
||||
intval.low := int64rec(AbsA).low;
|
||||
intval.high := int64rec(AbsA).high;
|
||||
shift64RightJamming( intval.high, intval.low, - shiftCount,
|
||||
intval.high, intval.low);
|
||||
int64rec(absA).low := intval.low;
|
||||
int64rec(absA).high := intval.high;
|
||||
end
|
||||
shift64RightJamming( absA, - shiftCount, absA )
|
||||
else
|
||||
absA := absA shl shiftCount;
|
||||
int64_to_float32.float32:=roundAndPackFloat32( zSign, $9C - shiftCount, absA );
|
||||
@ -5807,38 +5775,28 @@ End;
|
||||
*----------------------------------------------------------------------------*}
|
||||
function qword_to_float32( a: qword ): float32rec; compilerproc;
|
||||
var
|
||||
zSign : flag;
|
||||
absA : uint64;
|
||||
shiftCount: int8;
|
||||
intval : int64rec;
|
||||
Begin
|
||||
if ( a = 0 ) then
|
||||
begin
|
||||
qword_to_float32.float32 := 0;
|
||||
exit;
|
||||
end;
|
||||
zSign := flag(FALSE);
|
||||
absA := a;
|
||||
shiftCount := countLeadingZeros64( absA ) - 40;
|
||||
if ( 0 <= shiftCount ) then
|
||||
begin
|
||||
qword_to_float32.float32:= packFloat32( zSign, $95 - shiftCount, absA shl shiftCount );
|
||||
qword_to_float32.float32:= packFloat32( 0, $95 - shiftCount, absA shl shiftCount );
|
||||
end
|
||||
else
|
||||
begin
|
||||
shiftCount := shiftCount + 7;
|
||||
if ( shiftCount < 0 ) then
|
||||
begin
|
||||
intval.low := int64rec(AbsA).low;
|
||||
intval.high := int64rec(AbsA).high;
|
||||
shift64RightJamming( intval.high, intval.low, - shiftCount,
|
||||
intval.high, intval.low);
|
||||
int64rec(absA).low := intval.low;
|
||||
int64rec(absA).high := intval.high;
|
||||
end
|
||||
shift64RightJamming( absA, - shiftCount, absA )
|
||||
else
|
||||
absA := absA shl shiftCount;
|
||||
qword_to_float32.float32:=roundAndPackFloat32( zSign, $9C - shiftCount, absA );
|
||||
qword_to_float32.float32:=roundAndPackFloat32( 0, $9C - shiftCount, absA );
|
||||
end;
|
||||
End;
|
||||
|
||||
@ -5851,33 +5809,19 @@ End;
|
||||
function qword_to_float64( a: qword ): float64;
|
||||
{$ifdef fpc}[public,Alias:'QWORD_TO_FLOAT64'];compilerproc;{$endif}
|
||||
var
|
||||
zSign : flag;
|
||||
float_result : float64;
|
||||
AbsA : bits64;
|
||||
shiftcount : int8;
|
||||
zSig0, zSig1 : bits32;
|
||||
Begin
|
||||
if ( a = 0 ) then
|
||||
Begin
|
||||
packFloat64( 0, 0, 0, 0, result );
|
||||
exit;
|
||||
end;
|
||||
zSign := flag(FALSE);
|
||||
AbsA := a;
|
||||
shiftCount := countLeadingZeros64( absA ) - 11;
|
||||
shiftCount := countLeadingZeros64( a ) - 11;
|
||||
if ( 0 <= shiftCount ) then
|
||||
Begin
|
||||
absA := absA shl shiftcount;
|
||||
zSig0:=int64rec(absA).high;
|
||||
zSig1:=int64rec(absA).low;
|
||||
End
|
||||
a := a shl shiftcount
|
||||
else
|
||||
Begin
|
||||
shift64Right( int64rec(absA).high, int64rec(absA).low,
|
||||
- shiftCount, zSig0, zSig1 );
|
||||
End;
|
||||
packFloat64( zSign, $432 - shiftCount, zSig0, zSig1, float_result );
|
||||
qword_to_float64:= float_result;
|
||||
a := a shr (-shiftCount);
|
||||
result := packFloat64( 0, $432 - shiftCount, a );
|
||||
End;
|
||||
|
||||
|
||||
@ -5891,10 +5835,8 @@ function int64_to_float64( a: int64 ): float64;
|
||||
{$ifdef fpc}[public,Alias:'INT64_TO_FLOAT64'];compilerproc;{$endif}
|
||||
var
|
||||
zSign : flag;
|
||||
float_result : float64;
|
||||
AbsA : bits64;
|
||||
shiftcount : int8;
|
||||
zSig0, zSig1 : bits32;
|
||||
Begin
|
||||
if ( a = 0 ) then
|
||||
Begin
|
||||
@ -5908,18 +5850,10 @@ Begin
|
||||
AbsA := a;
|
||||
shiftCount := countLeadingZeros64( absA ) - 11;
|
||||
if ( 0 <= shiftCount ) then
|
||||
Begin
|
||||
absA := absA shl shiftcount;
|
||||
zSig0:=int64rec(absA).high;
|
||||
zSig1:=int64rec(absA).low;
|
||||
End
|
||||
absA := absA shl shiftcount
|
||||
else
|
||||
Begin
|
||||
shift64Right( int64rec(absA).high, int64rec(absA).low,
|
||||
- shiftCount, zSig0, zSig1 );
|
||||
End;
|
||||
packFloat64( zSign, $432 - shiftCount, zSig0, zSig1, float_result );
|
||||
int64_to_float64:= float_result;
|
||||
absA := absA shr (-shiftcount);
|
||||
result := packFloat64( zSign, $432 - shiftCount, absA );
|
||||
End;
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user