(* Copyright (C) 1989, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* File: LongFloat.m3 *) (* Last Modified On Tue Mar 20 03:14:20 1990 By muller *) (* Modified On Fri Jul 14 17:04:29 1989 By kalsow *) MODULE LongFloat; IMPORT CallExpr, Expr, Type, Procedure, Floatt, Longreal, Int, Emit, Reel; IMPORT IntegerExpr, RealExpr, LongrealExpr, Temp; VAR Z: CallExpr.MethodList; PROCEDURE Bind (<*UNUSED*> proc: Expr.T; <*UNUSED*>args: Expr.List): Type.T = BEGIN RETURN Longreal.T; END Bind; PROCEDURE Check (<*UNUSED*> proc: Expr.T; VAR args: Expr.List) = BEGIN Floatt.DoCheck ("LONGFLOAT", args); END Check; PROCEDURE Compile (<*UNUSED*> proc: Expr.T; args: Expr.List): Temp.T = VAR t: Type.T; e: Expr.T; t1, t2: Temp.T; BEGIN e := args[0]; t := Type.Base (Expr.TypeOf (e)); t1 := Expr.Compile (e); t2 := Temp.AllocEmpty (Longreal.T); IF (t = Int.T) THEN Emit.OpTT ("@ = CVTIL (@);\n", t2, t1); ELSIF (t = Reel.T) THEN Emit.OpTT ("@ = CVTFL (@);\n", t2, t1); ELSE (*t = Longreal.T *) Emit.OpTT ("@ = @;\n", t2, t1); END; Temp.Free (t1); RETURN t2; END Compile; PROCEDURE Fold (<*UNUSED*> proc: Expr.T; args: Expr.List): Expr.T = VAR e: Expr.T; i: INTEGER; r: LONGREAL; BEGIN e := Expr.ConstValue (args[0]); IF (e = NIL) THEN RETURN NIL; ELSIF IntegerExpr.Split (e, i) THEN RETURN LongrealExpr.New (LONGFLOAT (i)); ELSIF RealExpr.Split (e, r) THEN RETURN LongrealExpr.New (r); ELSIF LongrealExpr.Split (e, r) THEN RETURN e; ELSE RETURN NIL; END; END Fold; PROCEDURE Initialize () = BEGIN Z := CallExpr.NewMethodList (1, 1, TRUE, Bind, Check, Compile, Fold, CallExpr.IsNever, (* writable *) CallExpr.IsNever(* designator *)); Procedure.Define ("LONGFLOAT", Z); END Initialize; BEGIN END LongFloat.