Copyright (C) 1994, Digital Equipment Corp.
MODULE------------------------------------------------- thread initialization ---(* FOR VAX *); IMPORT ThreadF; PROCEDURE FloatMode SetRounding (md: RoundingMode) RAISES {Failure} = BEGIN IF (md # RoundDefault) THEN RAISE Failure END; END SetRounding; PROCEDUREGetRounding (): RoundingMode = BEGIN RETURN RoundDefault; END GetRounding; PROCEDUREGetFlags (): SET OF Flag = VAR state := ThreadF.MyFPState (); BEGIN RETURN state.sticky; END GetFlags; PROCEDURESetFlags (s: SET OF Flag): SET OF Flag = VAR state := ThreadF.MyFPState (); VAR old := state.sticky; BEGIN state.sticky := s; RETURN old; END SetFlags; PROCEDUREClearFlag (f: Flag) = VAR state := ThreadF.MyFPState (); BEGIN state.sticky := state.sticky - SET OF Flag {f}; END ClearFlag; TYPE BHMap = ARRAY Behavior OF BOOLEAN; CONST AllowedBehavior = ARRAY Flag OF BHMap { (* --- flag --- Trap SetFlag Ignore *) (* Invalid *) BHMap { FALSE, FALSE, TRUE }, (* Inexact *) BHMap { FALSE, FALSE, TRUE }, (* Overflow *) BHMap { FALSE, FALSE, TRUE }, (* Underflow *) BHMap { FALSE, FALSE, TRUE }, (* DivByZero *) BHMap { FALSE, FALSE, TRUE }, (* IntOverflow *) BHMap { FALSE, FALSE, TRUE }, (* IntDivByZero *) BHMap { FALSE, FALSE, TRUE } }; PROCEDURESetBehavior (f: Flag; b: Behavior) RAISES {Failure} = VAR state := ThreadF.MyFPState (); BEGIN IF (state.behavior [f] = b) THEN RETURN END; IF NOT AllowedBehavior [f, b] THEN RAISE Failure END; state.behavior [f] := b; END SetBehavior; PROCEDUREGetBehavior (f: Flag): Behavior = BEGIN RETURN ThreadF.MyFPState().behavior [f]; END GetBehavior;
CONST DefaultState = ThreadState { ARRAY Flag OF Behavior { Behavior.Ignore, .. }, NoFlags }; PROCEDUREInitThread (VAR state: ThreadState) = BEGIN state := DefaultState; END InitThread; BEGIN END FloatMode.