| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | {    This file is part of the Free Pascal run time library.    Copyright (c) 1999-2000 by Florian Klaempfl    member of the Free Pascal development team    See the file COPYING.FPC, included in this distribution,    for details about the copyright.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. **********************************************************************}function GetRoundMode: TFPURoundingMode;  const    bits2rm: array[0..3] of TFPURoundingMode = (rmNearest,rmTruncate,rmUp,rmDown);  begin    result:=TFPURoundingMode(bits2rm[(GetNativeFPUControlWord shr 30) and 3])  end;function SetRoundMode(const RoundMode: TFPURoundingMode): TFPURoundingMode;  const    rm2bits: array[TFPURoundingMode] of byte = (0,3,2,1);  var    cw: TNativeFPUControlWord;  begin    cw:=GetNativeFPUControlWord;    softfloat_rounding_mode:=RoundMode;    result:=TFPURoundingMode(cw shr 30);    SetNativeFPUControlWord((cw and $3fffffff) or (rm2bits[RoundMode] shl 30));  end;function GetPrecisionMode: TFPUPrecisionMode;  begin    result:=pmDouble;  end;function SetPrecisionMode(const Precision: TFPUPrecisionMode): TFPUPrecisionMode;  begin    result:=pmDouble;  end;function FSR2ExceptionMask(fsr: TNativeFPUControlWord): TFPUExceptionMask;  begin    result:=[];    { invalid operation: bit 27 }    if (fsr and (1 shl 27))=0 then      include(result,exInvalidOp);    { zero divide: bit 24 }    if (fsr and (1 shl 24))=0 then      include(result,exZeroDivide);    { overflow: bit 26 }    if (fsr and (1 shl 26))=0 then      include(result,exOverflow);    { underflow: bit 25 }    if (fsr and (1 shl 25))=0 then      include(result,exUnderflow);    { Precision (inexact result): bit 23 }    if (fsr and (1 shl 23))=0 then      include(result,exPrecision);  end;function GetExceptionMask: TFPUExceptionMask;  begin    result:=FSR2ExceptionMask(GetNativeFPUControlWord);  end;function SetExceptionMask(const Mask: TFPUExceptionMask): TFPUExceptionMask;  var    fsr : TNativeFPUControlWord;  begin    fsr:=GetNativeFPUControlWord;    result:=FSR2ExceptionMask(fsr);    { invalid operation: bit 27 }    if (exInvalidOp in mask) then      fsr:=fsr and not(1 shl 27)    else      fsr:=fsr or (1 shl 27);    { zero divide: bit 24 }    if (exZeroDivide in mask) then      fsr:=fsr and not(1 shl 24)    else      fsr:=fsr or (1 shl 24);    { overflow: bit 26 }    if (exOverflow in mask) then      fsr:=fsr and not(1 shl 26)    else      fsr:=fsr or (1 shl 26);    { underflow: bit 25 }    if (exUnderflow in mask) then      fsr:=fsr and not(1 shl 25)    else      fsr:=fsr or (1 shl 25);    { Precision (inexact result): bit 23 }    if (exPrecision in mask) then      fsr:=fsr and not(1 shl 23)    else      fsr:=fsr or (1 shl 23);    { update control register contents }    SetNativeFPUControlWord(fsr);  end;procedure ClearExceptions(RaisePending: Boolean =true);  begin    SetNativeFPUControlWord(GetNativeFPUControlWord and $fffffc1f);  end;
 |