mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 14:09:17 +02:00
parent
00a5d30300
commit
8b3544192e
@ -104,15 +104,15 @@ function fpc_get_ppc_fpscr: TNativeFPUControlWord;
|
|||||||
begin
|
begin
|
||||||
result.rndmode:=fp_read_rnd;
|
result.rndmode:=fp_read_rnd;
|
||||||
result.exceptionmask:=0;
|
result.exceptionmask:=0;
|
||||||
if not fp_is_enabled(InvalidOperationMask) then
|
if fp_is_enabled(InvalidOperationMask) then
|
||||||
result.exceptionmask:=result.exceptionmask or InvalidOperationMask;
|
result.exceptionmask:=result.exceptionmask or InvalidOperationMask;
|
||||||
if not fp_is_enabled(OverflowMask) then
|
if fp_is_enabled(OverflowMask) then
|
||||||
result.exceptionmask:=result.exceptionmask or OverflowMask;
|
result.exceptionmask:=result.exceptionmask or OverflowMask;
|
||||||
if not fp_is_enabled(UnderflowMask) then
|
if fp_is_enabled(UnderflowMask) then
|
||||||
result.exceptionmask:=result.exceptionmask or UnderflowMask;
|
result.exceptionmask:=result.exceptionmask or UnderflowMask;
|
||||||
if not fp_is_enabled(InvalidOperationMask) then
|
if fp_is_enabled(InvalidOperationMask) then
|
||||||
result.exceptionmask:=result.exceptionmask or ZeroDivideMask;
|
result.exceptionmask:=result.exceptionmask or ZeroDivideMask;
|
||||||
if not fp_is_enabled(InexactMask) then
|
if fp_is_enabled(InexactMask) then
|
||||||
result.exceptionmask:=result.exceptionmask or InexactMask;
|
result.exceptionmask:=result.exceptionmask or InexactMask;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -124,26 +124,31 @@ begin
|
|||||||
fp_swap_rnd(cw.rndmode);
|
fp_swap_rnd(cw.rndmode);
|
||||||
enablemask:=0;
|
enablemask:=0;
|
||||||
disablemask:=0;
|
disablemask:=0;
|
||||||
|
{ this inverts the "mask" functionality, but that's because it's how the
|
||||||
|
native PPC FPU control register works: the bits that are 1 enable the
|
||||||
|
exceptions, 0 disable them. This makes sure that we can use
|
||||||
|
SetNativeFPUControlWord in the same way regardless of what the underlying
|
||||||
|
implementation is }
|
||||||
if (cw.exceptionmask and InvalidOperationMask)<>0 then
|
if (cw.exceptionmask and InvalidOperationMask)<>0 then
|
||||||
disablemask:=disablemask or InvalidOperationMask
|
enablemask:=enablemask or InvalidOperationMask
|
||||||
else
|
else
|
||||||
enablemask:=enablemask or InvalidOperationMask;
|
disablemask:=disablemask or InvalidOperationMask;
|
||||||
if (cw.exceptionmask and OverflowMask)<>0 then
|
if (cw.exceptionmask and OverflowMask)<>0 then
|
||||||
disablemask:=disablemask or OverflowMask
|
enablemask:=enablemask or OverflowMask
|
||||||
else
|
else
|
||||||
enablemask:=enablemask or OverflowMask;
|
disablemask:=disablemask or OverflowMask;
|
||||||
if (cw.exceptionmask and UnderflowMask)<>0 then
|
if (cw.exceptionmask and UnderflowMask)<>0 then
|
||||||
disablemask:=disablemask or UnderflowMask
|
enablemask:=enablemask or UnderflowMask
|
||||||
else
|
else
|
||||||
enablemask:=enablemask or UnderflowMask;
|
disablemask:=disablemask or UnderflowMask;
|
||||||
if (cw.exceptionmask and ZeroDivideMask)<>0 then
|
if (cw.exceptionmask and ZeroDivideMask)<>0 then
|
||||||
disablemask:=disablemask or ZeroDivideMask
|
enablemask:=enablemask or ZeroDivideMask
|
||||||
else
|
else
|
||||||
enablemask:=enablemask or ZeroDivideMask;
|
disablemask:=disablemask or ZeroDivideMask;
|
||||||
if (cw.exceptionmask and InexactMask)<>0 then
|
if (cw.exceptionmask and InexactMask)<>0 then
|
||||||
disablemask:=disablemask or InexactMask
|
enablemask:=enablemask or InexactMask
|
||||||
else
|
else
|
||||||
enablemask:=enablemask or InexactMask;
|
disablemask:=disablemask or InexactMask;
|
||||||
fp_enable(enablemask);
|
fp_enable(enablemask);
|
||||||
fp_disable(disablemask);
|
fp_disable(disablemask);
|
||||||
DefaultFPUControlWord:=cw;
|
DefaultFPUControlWord:=cw;
|
||||||
|
@ -159,7 +159,7 @@ begin
|
|||||||
softfloat_exception_flags := [];
|
softfloat_exception_flags := [];
|
||||||
currentcw:=GetNativeFPUControlWord;
|
currentcw:=GetNativeFPUControlWord;
|
||||||
{$ifdef aix}
|
{$ifdef aix}
|
||||||
currentcw.exceptionmask:=mode;
|
currentcw.exceptionmask:=ExceptionMask and not mode;
|
||||||
{$else}
|
{$else}
|
||||||
currentcw:=(currentcw or ExceptionMask) and not mode and not ExceptionsPendingMask;
|
currentcw:=(currentcw or ExceptionMask) and not mode and not ExceptionsPendingMask;
|
||||||
{$endif}
|
{$endif}
|
||||||
|
Loading…
Reference in New Issue
Block a user