Просмотр исходного кода

Added conversions: S64 -> F64 and S64 -> F32.

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6449 8c9fc860-2736-0410-a75d-ab315db34111
eth.tmartiel 9 лет назад
Родитель
Сommit
540f798999
2 измененных файлов с 43 добавлено и 6 удалено
  1. 17 6
      source/ARM.ARMRuntime.Mod
  2. 26 0
      source/ARM.FPE64.Mod

+ 17 - 6
source/ARM.ARMRuntime.Mod

@@ -2,9 +2,9 @@ MODULE ARMRuntime;
 IMPORT SYSTEM, FPE64;
 
 CONST
-	B = 127; 
-	C = 800000H; 
-	E = 100H; 
+	B = 127;
+	C = 800000H;
+	E = 100H;
 	S = LONGINT(80000000H); (* used by VFP unit emulation *)
 	MAXREAL = LONGINT(7F7FFFFFH);
 
@@ -327,7 +327,7 @@ TYPE
 		BIC R0, R0, #S ; clear the sign bit
 	END AbsF32;
 
-	PROCEDURE AddF32*(x, y: FLOAT32): FLOAT32;		
+	PROCEDURE AddF32*(x, y: FLOAT32): FLOAT32;
 	VAR xe, ye, s: LONGINT;
 	BEGIN
 		IF SYSTEM.NULL(x) = TRUE THEN x := y
@@ -394,8 +394,8 @@ TYPE
 	BEGIN RETURN FPE64.Fix(SYSTEM.VAL(FPE64.Float64,x))
 	END ConvS32F64;
 
-	PROCEDURE ConvF32F64*(x: FLOAT64): REAL;
-	BEGIN RETURN FPE64.Single(SYSTEM.VAL(FPE64.Float64,x))
+	PROCEDURE ConvF32F64*(x: FLOAT64): FLOAT32;
+	BEGIN RETURN SYSTEM.VAL(FLOAT32, FPE64.Single(SYSTEM.VAL(FPE64.Float64,x)))
 	END ConvF32F64;
 
 	PROCEDURE ConvF64F32*(x: REAL): FLOAT64;
@@ -403,6 +403,12 @@ TYPE
 	BEGIN FPE64.Double(x,SYSTEM.VAL(FPE64.Float64,z)); RETURN z
 	END ConvF64F32;
 
+	PROCEDURE ConvF64S64*(x: HUGEINT): FLOAT64;
+	VAR flt: FLOAT64;
+	BEGIN
+		FPE64.FloatInt64(x, SYSTEM.VAL(FPE64.Float64, flt)); RETURN flt
+	END ConvF64S64;
+
 	PROCEDURE ConvF64S32*(x: LONGINT): FLOAT64;
 	VAR flt: FLOAT64;
 	BEGIN FPE64.Float(x, SYSTEM.VAL(FPE64.Float64,flt)); RETURN flt
@@ -542,6 +548,11 @@ TYPE
 		RETURN x
 	END ConvF32S32;
 
+	PROCEDURE ConvF32S64*(x: HUGEINT): FLOAT32;
+	BEGIN
+		RETURN ConvF32F64(ConvF64S64(x))
+	END ConvF32S64;
+
 	(* ---- STRING OPERATIONS ---- *)
 
 	(** compare two strings

+ 26 - 0
source/ARM.FPE64.Mod

@@ -389,6 +389,32 @@ MODULE FPE64;
 		END;
 	END Div;
 
+	PROCEDURE FloatInt64*(i: HUGEINT; VAR z: Float64);
+		VAR x0, x1, xe: HUGEINT;
+	BEGIN
+		x1 := i;
+		x0 := 0;
+		IF x1 # 0 THEN
+			IF x1 = HUGEINT(8000000000000000H) THEN
+				x1 := HUGEINT(4000000000000000H);
+				xe := 63+B;
+			ELSE
+				IF x1 < 0 THEN
+					x1 := -x1
+				END;
+				xe := 62+B;
+				WHILE x1 < HUGEINT(4000000000000000H) DO x1 := x1*2; DEC(xe) END;
+			END;
+			x1 := x1 DIV 100000000H;
+			z.low := LONGINT(x1)*400000H;
+			x1 := LSH(x1, -10);
+			z.high := LONGINT(xe*C) + (LONGINT(x1)-C) + SYSTEM.VAL(LONGINT, SYSTEM.VAL(SET, i DIV 100000000H) * {31});
+		ELSE
+			z.low := LONGINT(x0);
+			z.high := LONGINT(x1)
+		END
+	END FloatInt64;
+
 	PROCEDURE Float*(i: LONGINT; VAR z: Float64);
 		VAR x0, x1, xe: LONGINT;
 	BEGIN