Browse Source

* x86_64: Modified fpc_exp_real so it does not use 'sahf' assembler instruction, which may be not present on early 64-bit capable x86 processors. Mantis #29583.

git-svn-id: trunk@33205 -
sergei 9 years ago
parent
commit
cad30aaee9
1 changed files with 9 additions and 11 deletions
  1. 9 11
      rtl/x86_64/math.inc

+ 9 - 11
rtl/x86_64/math.inc

@@ -240,22 +240,17 @@ const
             fld         %st
             fld         %st
             fabs
             fabs
             fld1
             fld1
-            fcompp
-            fstsw       %ax
-            sahf
+            fcomip
+            fstp        %st
             jp          .L3               { NaN }
             jp          .L3               { NaN }
             jae         .L1               { |frac(z)| <= 1, good }
             jae         .L1               { |frac(z)| <= 1, good }
 
 
             fld         %st(1)
             fld         %st(1)
             fabs
             fabs
-            fcomps      large(%rip)
-            fstsw       %ax
-            sahf
-            jb          .L0               { int(z) < 24576 }
-   .L3:
-            fstp        %st               { pop frac(z) and load 0 }
-            fldz
-            jmp         .L1
+            flds        large(%rip)
+            fcomip
+            fstp        %st
+            jb          .L3               { int(z) >= 24576 }
    .L0:
    .L0:
             { Calculate 2**frac(z)-1 as N*(N+2), where N=2**(frac(z)/2)-1 }
             { Calculate 2**frac(z)-1 as N*(N+2), where N=2**(frac(z)/2)-1 }
             fmuls       half(%rip)
             fmuls       half(%rip)
@@ -264,6 +259,9 @@ const
             fadds       two(%rip)
             fadds       two(%rip)
             fmulp       %st,%st(1)
             fmulp       %st,%st(1)
             jmp         .L2
             jmp         .L2
+   .L3:
+            fstp        %st               { pop frac(z) and load 0 }
+            fldz
    .L1:
    .L1:
             f2xm1
             f2xm1
    .L2:
    .L2: