-- file IeeeFloat.Mesa
-- Last modified by Satterthwaite, April 21, 1980  4:16 PM
-- Last modified by Bruce, July 7, 1980  5:37 PM
-- adaptation of Real.Mesa for compiler and Ieee.mesa for debugger use

DIRECTORY
  Inline USING [BITAND, LongNumber];

Real: DEFINITIONS IMPORTS Inline =
  BEGIN

 -- modes

  NumberType: TYPE = {normal, zero, infinity, nan};

  RoundingMode: TYPE = {rn, rz, rm, rp};
    -- rn: Round to nearest (unbiased)
    -- rz: Round to zero (truncate)
    -- rp: Round to plus infinity (round up)
    -- rm: Round to minus infinity (round down)

 -- Constants

  PlusZero: REAL = LOOPHOLE[LONG[00000000000B]];
  MinusZero: REAL = LOOPHOLE[20000000000B];
  PlusInfinity: REAL = LOOPHOLE[17740000000B];
  MinusInfinity: REAL = LOOPHOLE[37740000000B];
  NonTrappingNaN: LONG CARDINAL = 1;

 -- Exceptions

  Flag: TYPE = BOOLEAN ← FALSE;
  Exception: TYPE =
    {fixOverflow, inexactResult, invalidOperation, divisionByZero, overflow, underflow};
  ExceptionFlags: TYPE = PACKED ARRAY Exception OF Flag;

  NoExceptions: ExceptionFlags = ALL[FALSE];

 -- Operations

  FloatingPointException: SIGNAL [flags: ExceptionFlags];

  Abs: PROCEDURE [a: REAL] RETURNS [REAL];
  Negate: PROCEDURE [a: REAL] RETURNS [REAL];
  PairToReal: PROCEDURE [fr: LONG INTEGER, exp10: INTEGER] RETURNS [REAL];

 -- from Ieee.mesa for debugger output routines

  Details: TYPE = MACHINE DEPENDENT RECORD [
    sign: BOOLEAN,
    sticky: BOOLEAN,
    blank: [0..7777B],
    type: NumberType];

  Ext: TYPE = RECORD [
    det: Details,
    exp: INTEGER,
    frac: Inline.LongNumber];

  DenormalizedExponent: INTEGER = -127;
  ExponentBias: INTEGER = 127;
  ExponentMask: INTEGER = 077600B;
  ExponentShift: INTEGER = 7;
  ExpSingleMin: INTEGER = -126;
  HalfLC: LONG CARDINAL = LOOPHOLE[20000000000B];
  HiBit: CARDINAL = 100000B;
  HiddenBit: CARDINAL = 100000B;
  HiFractionMask: INTEGER = 177B;
  NaNExponent: INTEGER = 128;
  
  LN: PROCEDURE [r: LONG UNSPECIFIED] RETURNS [Inline.LongNumber] = INLINE {
    RETURN[LOOPHOLE[r, Inline.LongNumber]]};

  BitOn: PROCEDURE [a, b: UNSPECIFIED] RETURNS [BOOLEAN] = INLINE {      
    RETURN[Inline.BITAND[a, b]#0]};

  Normalized: PROCEDURE [g: INTEGER] RETURNS [BOOLEAN] = INLINE {
    RETURN [Inline.BITAND[g, HiddenBit]#0]};

  ADC3: PROCEDURE [a, b, c: CARDINAL] RETURNS [CARDINAL, CARDINAL] = INLINE {
    s: Inline.LongNumber;
    s.lc ← LONG[a]+LONG[b]+LONG[c];
    RETURN[s.highbits, s.lowbits]};

  END.