Browse Source

Fixed LONGREAL -> HUGEINT conversion.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6493 8c9fc860-2736-0410-a75d-ab315db34111
eth.tmartiel 9 years ago
parent
commit
6e7cc226d8
2 changed files with 44 additions and 2 deletions
  1. 2 2
      source/ARM.ARMRuntime.Mod
  2. 42 0
      source/ARM.FPE64.Mod

+ 2 - 2
source/ARM.ARMRuntime.Mod

@@ -401,8 +401,8 @@ TYPE
 	BEGIN RETURN FPE64.Fix(SYSTEM.VAL(FPE64.Float64,x))
 	END ConvS32F64;
 
-	PROCEDURE ConvS64F64*(x: FLOAT64): LONGINT;
-	BEGIN RETURN FPE64.Fix(SYSTEM.VAL(FPE64.Float64,x))
+	PROCEDURE ConvS64F64*(x: FLOAT64): HUGEINT;
+	BEGIN RETURN FPE64.FixInt64(SYSTEM.VAL(FPE64.Float64,x))
 	END ConvS64F64;
 
 	PROCEDURE ConvF32F64*(x: FLOAT64): FLOAT32;

+ 42 - 0
source/ARM.FPE64.Mod

@@ -440,6 +440,48 @@ MODULE FPE64;
 		END
 	END Float;
 
+	PROCEDURE FixInt64*(CONST a: Float64): HUGEINT;
+	(*VAR x0, x1, xe: LONGINT;
+		x: LONGINT;
+	BEGIN
+		x0 := a.low;
+		x1 := a.high;
+		IF (x0 # 0) OR (x1 # 0) THEN
+			xe := x1 DIV C MOD E - B;
+			IF x1 > 0 THEN
+				x := (x1 MOD C + C)*K;
+				x := LSH(x0, -22) + x
+			ELSE
+				x := -(x1 MOD C + C)*K;
+				x := x - LSH(x0, -22)
+			END;
+			IF xe < 0 THEN x := ASH(x, -31)
+			ELSIF xe <= 30 THEN x := ASH(x, xe - 30)
+			ELSIF x > 0 THEN x := HUGEINT(7FFFFFFFFFFFFFFFH)
+			ELSE x := HUGEINT(8000000000000000H)
+			END
+		END;
+		RETURN x1*)
+	VAR
+		x: HUGEINT;
+		xe: LONGINT;
+	BEGIN
+		x := SYSTEM.GET64(ADDRESSOF(a));
+		IF x # 0 THEN
+			xe := LONGINT(LSH(x, -32)) DIV C MOD E - B;
+			x := LSH(LSH(x, 12), -12) + 10000000000000H;
+			IF a.high < 0 THEN
+				x := -x
+			END;
+			IF xe < 0 THEN x := ASH(x, -53)
+			ELSIF xe <= 52 THEN x := ASH(x, xe -52)
+			ELSIF x > 0 THEN x := HUGEINT(7FFFFFFFFFFFFFFFH)
+			ELSE x := HUGEINT(8000000000000000H)
+			END
+		END;
+		RETURN x
+	END FixInt64;
+
 	PROCEDURE Fix*(CONST a: Float64): LONGINT;
 		VAR x0, x1, xe: LONGINT;
 	BEGIN