(* Copyright (C) 1989, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* File: Floor.m3 *) (* Last Modified On Tue Mar 20 04:11:50 1990 By muller *) (* Modified On Fri Jul 14 17:04:03 1989 By kalsow *) MODULE Floor; IMPORT CallExpr, Expr, Type, Procedure, Ceiling, Int, Emit; IMPORT IntegerExpr, RealExpr, LongrealExpr, Temp; VAR Z: CallExpr.MethodList; PROCEDURE Bind (<*UNUSED*> proc: Expr.T; <*UNUSED*> args: Expr.List): Type.T = BEGIN RETURN Int.T; END Bind; PROCEDURE Check (<*UNUSED*> proc: Expr.T; VAR args: Expr.List) = BEGIN Ceiling.DoCheck ("FLOOR", args); END Check; PROCEDURE Compile (<*UNUSED*> proc: Expr.T; args: Expr.List): Temp.T = VAR t1, t2: Temp.T; BEGIN t1 := Expr.Compile (args[0]); t2 := Temp.AllocEmpty (Int.T); Emit.OpTT ("@ = FLOOR (@);\n", t2, t1); Temp.Free (t1); RETURN t2; END Compile; PROCEDURE Fold (<*UNUSED*> proc: Expr.T; args: Expr.List): Expr.T = VAR i: INTEGER; x: LONGREAL; e: Expr.T; BEGIN e := Expr.ConstValue (args[0]); IF (e = NIL) OR NOT (RealExpr.Split (e, x) OR LongrealExpr.Split (e, x)) THEN RETURN NIL; END; i := TRUNC (x); IF (x < 0.0d+0) AND (LONGFLOAT (i) # x) THEN DEC (i) END; RETURN IntegerExpr.New (i); END Fold; PROCEDURE Initialize () = BEGIN Z := CallExpr.NewMethodList (1, 1, TRUE, Bind, Check, Compile, Fold, CallExpr.IsNever, (* writable *) CallExpr.IsNever(* designator *)); Procedure.Define ("FLOOR", Z); END Initialize; BEGIN END Floor.