Преглед на файлове

* the bits in the VFP fpscr don't mask exceptions, but enable them
(was used correctly in fpu init code in arm.inc, but inverted in
setexcetionmask logic)

git-svn-id: trunk@14328 -

Jonas Maebe преди 15 години
родител
ревизия
91fc26a530
променени са 1 файла, в които са добавени 25 реда и са изтрити 25 реда
  1. 25 25
      rtl/arm/mathu.inc

+ 25 - 25
rtl/arm/mathu.inc

@@ -180,18 +180,18 @@ end;
 {$elseif defined(darwin) or defined(FPUVFPV2) or defined(FPUVFPV3)}
 {$elseif defined(darwin) or defined(FPUVFPV2) or defined(FPUVFPV3)}
 
 
 const
 const
-  _VFP_MASK_IM  =  1 shl 8;         { invalid operation      }
-  _VFP_MASK_ZM  =  1 shl 9;         { divide by zero         }
-  _VFP_MASK_OM  =  1 shl 10;        { overflow               }
-  _VFP_MASK_UM  =  1 shl 11;        { underflow              }
-  _VFP_MASK_PM  =  1 shl 12;        { inexact                }
-  _VFP_MASK_DM  =  1 shl 15;        { denormalized operation }
-  _VFP_MASK_ALL =  _VFP_MASK_IM or
-                   _VFP_MASK_ZM or
-                   _VFP_MASK_OM or
-                   _VFP_MASK_UM or
-                   _VFP_MASK_PM or
-                   _VFP_MASK_DM;    { mask for all flags     }
+  _VFP_ENABLE_IM  =  1 shl 8;         { invalid operation      }
+  _VFP_ENABLE_ZM  =  1 shl 9;         { divide by zero         }
+  _VFP_ENABLE_OM  =  1 shl 10;        { overflow               }
+  _VFP_ENABLE_UM  =  1 shl 11;        { underflow              }
+  _VFP_ENABLE_PM  =  1 shl 12;        { inexact                }
+  _VFP_ENABLE_DM  =  1 shl 15;        { denormalized operation }
+  _VFP_ENABLE_ALL =  _VFP_ENABLE_IM or
+                   _VFP_ENABLE_ZM or
+                   _VFP_ENABLE_OM or
+                   _VFP_ENABLE_UM or
+                   _VFP_ENABLE_PM or
+                   _VFP_ENABLE_DM;    { mask for all flags     }
                    
                    
   _VFP_ROUNDINGMODE_MASK_SHIFT = 22;
   _VFP_ROUNDINGMODE_MASK_SHIFT = 22;
   _VFP_ROUNDINGMODE_MASK = 3 shl _VFP_ROUNDINGMODE_MASK_SHIFT;
   _VFP_ROUNDINGMODE_MASK = 3 shl _VFP_ROUNDINGMODE_MASK_SHIFT;
@@ -281,22 +281,22 @@ function GetExceptionMask: TFPUExceptionMask;
     Result:=[];
     Result:=[];
     cw:=VFP_GetCW;
     cw:=VFP_GetCW;
 
 
-    if (cw and _VFP_MASK_IM)=0 then
+    if (cw and _VFP_ENABLE_IM)<>0 then
       include(Result,exInvalidOp);
       include(Result,exInvalidOp);
 
 
-    if (cw and _VFP_MASK_DM)=0 then
+    if (cw and _VFP_ENABLE_DM)<>0 then
       include(Result,exDenormalized);
       include(Result,exDenormalized);
 
 
-    if (cw and _VFP_MASK_ZM)=0 then
+    if (cw and _VFP_ENABLE_ZM)<>0 then
       include(Result,exZeroDivide);
       include(Result,exZeroDivide);
 
 
-    if (cw and _VFP_MASK_OM)=0 then
+    if (cw and _VFP_ENABLE_OM)<>0 then
       include(Result,exOverflow);
       include(Result,exOverflow);
 
 
-    if (cw and _VFP_MASK_UM)=0 then
+    if (cw and _VFP_ENABLE_UM)<>0 then
       include(Result,exUnderflow);
       include(Result,exUnderflow);
 
 
-    if (cw and _VFP_MASK_PM)=0 then
+    if (cw and _VFP_ENABLE_PM)<>0 then
       include(Result,exPrecision);
       include(Result,exPrecision);
   end;
   end;
 
 
@@ -305,25 +305,25 @@ function SetExceptionMask(const Mask: TFPUExceptionMask): TFPUExceptionMask;
   var
   var
     cw : dword;
     cw : dword;
   begin
   begin
-    cw:=VFP_GetCW or _VFP_MASK_ALL;
+    cw:=VFP_GetCW and not(_VFP_ENABLE_ALL);
 
 
     if exInvalidOp in Mask then
     if exInvalidOp in Mask then
-      cw:=cw and not(_VFP_MASK_IM);
+      cw:=cw or _VFP_ENABLE_IM;
 
 
     if exDenormalized in Mask then
     if exDenormalized in Mask then
-      cw:=cw and not(_VFP_MASK_DM);
+      cw:=cw or _VFP_ENABLE_DM;
 
 
     if exZeroDivide in Mask then
     if exZeroDivide in Mask then
-      cw:=cw and not(_VFP_MASK_ZM);
+      cw:=cw or _VFP_ENABLE_ZM;
 
 
     if exOverflow in Mask then
     if exOverflow in Mask then
-      cw:=cw and not(_VFP_MASK_OM);
+      cw:=cw or _VFP_ENABLE_OM;
 
 
     if exUnderflow in Mask then
     if exUnderflow in Mask then
-      cw:=cw and not(_VFP_MASK_UM);
+      cw:=cw or _VFP_ENABLE_UM;
 
 
     if exPrecision in Mask then
     if exPrecision in Mask then
-      cw:=cw and not(_VFP_MASK_PM);
+      cw:=cw or _VFP_ENABLE_PM;
     VFP_SetCW(cw);
     VFP_SetCW(cw);
     result:=Mask;
     result:=Mask;