Browse Source

* some floating point routines improved

florian 20 years ago
parent
commit
f94047b703
1 changed files with 78 additions and 85 deletions
  1. 78 85
      rtl/i386/math.inc

+ 78 - 85
rtl/i386/math.inc

@@ -121,36 +121,38 @@
   {$else}
     function exp(d : ValReal) : ValReal;assembler;[internconst:fpc_in_const_exp];
   {$endif}
-       asm
-            // comes from DJ GPP
-            fldt        d
-            fldl2e
-            fmulp       %st,%st(1)
-            fstcw      .LCW1
-            fstcw      .LCW2
-            andw        $0xf3ff,.LCW2
-            orw         $0x0400,.LCW2
-            fldcw      .LCW2
-            fld         %st(0)
-            frndint
-            fldcw      .LCW1
-            fxch        %st(1)
-            fsub        %st(1),%st
-            f2xm1
-            fld1
-            faddp       %st,%st(1)
-            fscale
-            fstp        %st(1)
-            jmp         .LCW3
-            // store some help data in the data segment
-        .data
-        .LCW1:
-            .word       0
-        .LCW2:
-            .word       0
-        .text
-        .LCW3:
-      end;
+      asm
+        // comes from DJ GPP
+        fldt        d
+        fldl2e
+        fmulp       %st,%st(1)
+        fstcw      .LCW1
+        fstcw      .LCW2
+        fwait
+        andw        $0xf3ff,.LCW2
+        orw         $0x0400,.LCW2
+        fldcw      .LCW2
+        fld         %st(0)
+        frndint
+        fldcw      .LCW1
+        fxch        %st(1)
+        fsub        %st(1),%st
+        f2xm1
+        fld1
+        faddp       %st,%st(1)
+        fscale
+        fstp        %st(1)
+        fclex
+        jmp         .LCW3
+        // store some help data in the data segment
+    .data
+    .LCW1:
+        .word       0
+    .LCW2:
+        .word       0
+    .text
+    .LCW3:
+     end;
 
 
     {$define FPC_SYSTEM_HAS_FRAC}
@@ -160,21 +162,19 @@
     function frac(d : ValReal) : ValReal;assembler;[internconst:fpc_in_const_frac];
   {$endif}
       asm
-            subl $16,%esp
-            fnstcw -4(%ebp)
-            fwait
-            movw -4(%ebp),%cx
-            orw $0x0c3f,%cx
-            movw %cx,-8(%ebp)
-            fldcw -8(%ebp)
-            fwait
-            fldt d
-            frndint
-            fldt d
-            fsub %st(1),%st
-            fstp %st(1)
-            fclex
-            fldcw -4(%ebp)
+        subl $16,%esp
+        fnstcw -4(%ebp)
+        fwait
+        movw -4(%ebp),%cx
+        orw $0x0f00,%cx
+        movw %cx,-8(%ebp)
+        fldcw -8(%ebp)
+        fldt d
+        frndint
+        fldt d
+        fsub %st(1),%st
+        fstp %st(1)
+        fldcw -4(%ebp)
       end;
 
 
@@ -185,18 +185,18 @@
     function int(d : ValReal) : ValReal;assembler;[internconst:fpc_in_const_int];
   {$endif}
       asm
-            subl $16,%esp
-            fnstcw -4(%ebp)
-            fwait
-            movw -4(%ebp),%cx
-            orw $0x0c3f,%cx
-            movw %cx,-8(%ebp)
-            fldcw -8(%ebp)
-            fwait
-            fldt d
-            frndint
-            fclex
-            fldcw -4(%ebp)
+        subl $16,%esp
+        fnstcw -4(%ebp)
+        fwait
+        movw -4(%ebp),%cx
+        orw $0x0f00,%cx
+        movw %cx,-8(%ebp)
+        fldcw -8(%ebp)
+        fwait
+        fldt d
+        frndint
+        fwait
+        fldcw -4(%ebp)
       end;
 
 
@@ -212,19 +212,18 @@
         newcw : word;
         res   : int64;
       asm
-            fnstcw oldcw
-            fwait
-            movw oldcw,%cx
-            orw $0x0c3f,%cx
-            movw %cx,newcw
-            fldcw newcw
-            fwait
-            fldt d
-            fistpq res
-            movl res,%eax
-            movl res+4,%edx
-            fclex
-            fldcw oldcw
+        fnstcw oldcw
+        fwait
+        movw oldcw,%cx
+        orw $0x0f00,%cx
+        movw %cx,newcw
+        fldcw newcw
+        fldt d
+        fistpq res
+        fwait
+        movl res,%eax
+        movl res+4,%edx
+        fldcw oldcw
       end;
 
 
@@ -240,22 +239,13 @@
     {$endif hascompilerproc}
   {$endif}
       var
-        oldcw,
-        newcw : word;
         res   : int64;
       asm
-            fnstcw oldcw
-            fwait
-            movw $0x1372,newcw
-            fclex
-            fldcw newcw
-            fwait
-            fldt d
-            fistpq res
-            movl res,%eax
-            movl res+4,%edx
-            fclex
-            fldcw oldcw
+        fldt d
+        fistpq res
+        fwait
+        movl res,%eax
+        movl res+4,%edx
       end;
 
 
@@ -288,7 +278,10 @@
 
 {
   $Log$
-  Revision 1.23  2005-03-09 20:50:11  florian
+  Revision 1.24  2005-03-13 17:14:46  florian
+    * some floating point routines improved
+
+  Revision 1.23  2005/03/09 20:50:11  florian
     * C. Western: utf-8 reading from resource files
 
   Revision 1.22  2005/02/14 17:13:22  peter