(* Copyright (C) 1991, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* Last edited on 2000-12-03 23:13:45 by stolfi *) (* Last modified on Tue Oct 31 14:00:00 BRZ 1995 by stolfi *) (* modified on Fri Jan 27 11:53:11 PST 1995 by kalsow *) (* modified on Thu May 13 09:11:04 PDT 1993 by mcjones *) (* modified on Fri May 7 14:30:09 PDT 1993 by muller *) MODULE FloatMode_Patched; IMPORT RTMisc, FPU_Patched; FROM FPU_Patched IMPORT FP_RN, FP_RZ, FP_RP, FP_RM; CONST M3RoundingToLINUXLIBC6Rounding = ARRAY RoundingMode OF FPU_Patched.fp_rnd_t{ FP_RN, (* NearestElseEven *) FP_RM, (* TowardMinusInfinity *) FP_RP, (* TowardPlusInfinity *) FP_RZ, (* TowardZero *) -1, (* NearestElseAwayFromZero *) -1, (* IBM370 *) -1 (* Other *) }; CONST LINUXLIBC6RoundingToM3Rounding = ARRAY [FP_RN .. FP_RZ] OF RoundingMode { RoundingMode.NearestElseEven, (* FP_RN = 0 *) RoundingMode.TowardMinusInfinity, (* FP_RM = 1 *) RoundingMode.TowardPlusInfinity, (* FP_RP = 2 *) RoundingMode.TowardZero (* FP_RZ = 3 *) }; PROCEDURE SetRounding(md: RoundingMode) = BEGIN WITH fr = M3RoundingToLINUXLIBC6Rounding[md] DO IF fr < 0 THEN Die("FloatMode_Patched.SetRounding: invalid mode") END; EVAL FPU_Patched.fesetround(fr); END END SetRounding; PROCEDURE GetRounding(): RoundingMode = BEGIN WITH fr = FPU_Patched.fegetround() DO <* ASSERT fr >= FPU_Patched.FP_RN AND fr <= FPU_Patched.FP_RM *> RETURN LINUXLIBC6RoundingToM3Rounding[fr] END END GetRounding; PROCEDURE GetFlags(): SET OF Flag = BEGIN Die ("FloatMode.GetFlags not implemented"); <*ASSERT FALSE*> END GetFlags; PROCEDURE SetFlags(<*UNUSED*> s: SET OF Flag): SET OF Flag = BEGIN Die ("FloatMode.SetFlags not implemented"); <*ASSERT FALSE*> END SetFlags; PROCEDURE ClearFlag(<*UNUSED*> f: Flag) = BEGIN Die ("FloatMode.ClearFlag not implemented"); END ClearFlag; PROCEDURE SetBehavior(<*UNUSED*> f: Flag; <*UNUSED*> b: Behavior) = BEGIN Die ("FloatMode.SetBehavior not implemented"); END SetBehavior; PROCEDURE GetBehavior(<*UNUSED*> f: Flag): Behavior = BEGIN Die ("FloatMode.GetBehavior not implemented"); <*ASSERT FALSE*> END GetBehavior; (*------------------------------------------------- thread initialization ---*) PROCEDURE InitThread (<*UNUSED*> VAR state: ThreadState) = BEGIN END InitThread; (*----------------------------------------- floating-point fault handling ---*) PROCEDURE Die (msg: TEXT) = BEGIN RTMisc.FatalError (NIL, 0, msg); <*ASSERT FALSE*> END Die; BEGIN END FloatMode_Patched.