Kaynağa Gözat

For JVM, use float64xxx wrappers instead of unsupported lvalue casts.

Rika Ichinose 3 hafta önce
ebeveyn
işleme
5f69f5a7cf
1 değiştirilmiş dosya ile 11 ekleme ve 2 silme
  1. 11 2
      rtl/inc/genmath.inc

+ 11 - 2
rtl/inc/genmath.inc

@@ -357,23 +357,32 @@ end;
     E, ExtraE: int32;
   begin
     Mantissa := X;
-    E := TDoubleRec(X).Exp;
+    E := {$ifndef jvm} TDoubleRec(X).Exp {$else} float64high(X) shr 20 and (1 shl 11 - 1) {$endif};
     if (E > 0) and (E < 2 * TDoubleRec.Bias + 1) then
     begin
       // Normal.
+    {$ifndef jvm}
       TDoubleRec(Mantissa).Exp := TDoubleRec.Bias - 1;
+    {$else}
+      float64sethigh(Mantissa, float64high(Mantissa) and not ((1 shl 11 - 1) shl 20) + (TDoubleRec.Bias - 1) shl 20);
+    {$endif}
       Exponent := E - (TDoubleRec.Bias - 1);
       exit;
     end;
     if E = 0 then
     begin
-      M := TDoubleRec(X).Frac;
+      M := {$ifndef jvm} TDoubleRec(X).Frac {$else} uint64(uint32(float64high(X)) and (1 shl 20 - 1)) shl 32 or uint32(float64low(X)) {$endif};
       if M <> 0 then
       begin
         // Subnormal.
         ExtraE := 52 - BsrQWord(M);
+      {$ifndef jvm}
         TDoubleRec(Mantissa).Frac := M shl ExtraE; // "and (1 shl 52 - 1)" required to remove starting 1, but .SetFrac already does it.
         TDoubleRec(Mantissa).Exp  := TDoubleRec.Bias - 1;
+      {$else}
+        float64sethigh(Mantissa, uint32(float64high(Mantissa)) and (1 shl 31) + (TDoubleRec.Bias - 1 - 1 {extra -1 removes starting 1 from M}) shl 20 + uint32(uint64(M shl ExtraE) shr 32));
+        float64setlow(Mantissa, uint32(M shl ExtraE));
+      {$endif}
         Exponent := -TDoubleRec.Bias + 2 - ExtraE;
         exit;
       end;