JaMMathImpl.mesa
Last edited by:
Original version by John Warnock, February 27, 1979
Bill Paxton, December 19, 1980 9:35 AM
McGregor, September 10, 1982 11:17 am
Doug Wyatt, November 21, 1983 1:26 pm
DIRECTORY
Basics USING [BITAND, BITNOT, BITOR, BITSHIFT, BITXOR, LongNumber],
JaM USING [Eq, Error, Pop, PopBool, PopInt, PopReal, PushBool, PushInt, PushReal, State],
JaMPrimitives USING [],
RealFns USING [ArcTanDeg, CosDeg, Log, Power, SinDeg, SqRt];
JaMMathImpl: CEDAR PROGRAM
IMPORTS Basics, JaM, RealFns
EXPORTS JaMPrimitives
= BEGIN OPEN JaM;
ApplyAdd:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushReal[self, a+b];
};
ApplySub:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushReal[self, a-b];
};
ApplyMul:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushReal[self, a*b];
};
ApplyDiv:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushReal[self, a/b];
};
ApplyIDiv:
PUBLIC
PROC[self: State] = {
b: INT = PopInt[self];
a: INT = PopInt[self];
PushInt[self, a/b];
};
ApplyNeg:
PUBLIC
PROC[self: State] = {
a: REAL = PopReal[self];
PushReal[self, -a];
};
ApplySin:
PUBLIC
PROC[self: State] = {
a: REAL = PopReal[self];
PushReal[self, RealFns.SinDeg[a]];
};
ApplyCos:
PUBLIC
PROC[self: State] = {
a: REAL = PopReal[self];
PushReal[self, RealFns.CosDeg[a]];
};
ApplyATan:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushReal[self, RealFns.ArcTanDeg[a, b ! ANY => GOTO Fail]];
EXITS Fail => ERROR Error[NumericOverflow];
};
ApplyExp:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushReal[self, RealFns.Power[a, b ! ANY => GOTO Fail]];
EXITS Fail => ERROR Error[NumericOverflow];
};
ApplyLog:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushReal[self, RealFns.Log[a, b ! ANY => GOTO Fail]]
EXITS Fail => ERROR Error[NumericOverflow];
};
ApplySqRt:
PUBLIC
PROC[self: State] = {
a: REAL = PopReal[self];
PushReal[self, RealFns.SqRt[a ! ANY => GOTO Fail]]
EXITS Fail => ERROR Error[NumericOverflow];
};
ApplyEq:
PUBLIC
PROC[self: State] = {
b: REF = Pop[self];
a: REF = Pop[self];
PushBool[self, Eq[a,b]];
};
ApplyLt:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushBool[self, a<b];
};
ApplyGt:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushBool[self, a>b];
};
ApplyNot:
PUBLIC
PROC[self: State] = {
a: BOOL = PopBool[self];
PushBool[self, NOT a];
};
ApplyAnd:
PUBLIC
PROC[self: State] = {
b: BOOL = PopBool[self];
a: BOOL = PopBool[self];
PushBool[self, a AND b];
};
ApplyOr:
PUBLIC
PROC[self: State] = {
b: BOOL = PopBool[self];
a: BOOL = PopBool[self];
PushBool[self, a OR b];
};
ApplyXor:
PUBLIC
PROC[self: State] = {
b: BOOL = PopBool[self];
a: BOOL = PopBool[self];
PushBool[self, a # b];
};
Long: TYPE = Basics.LongNumber;
LongBITNOT:
PROC[a: Long]
RETURNS[Long] = {
RETURN[[num[highbits: Basics.BITNOT[a.highbits], lowbits: Basics.BITNOT[a.lowbits]]]];
};
LongBITOR:
PROC[a, b: Long]
RETURNS[Long] = {
RETURN[[num[highbits: Basics.BITOR[a.highbits, b.highbits], lowbits: Basics.BITOR[a.lowbits, b.lowbits]]]];
};
LongBITAND:
PROC[a, b: Long]
RETURNS[Long] = {
RETURN[[num[highbits: Basics.BITAND[a.highbits, b.highbits], lowbits: Basics.BITAND[a.lowbits, b.lowbits]]]];
};
LongBITXOR:
PROC[a, b: Long]
RETURNS[Long] = {
RETURN[[num[highbits: Basics.BITXOR[a.highbits, b.highbits], lowbits: Basics.BITXOR[a.lowbits, b.lowbits]]]];
};
LongBITSHIFT:
PROC[a: Long, b:
INT]
RETURNS[Long] = {
SELECT b
FROM
<-31 => RETURN[[num[highbits: 0, lowbits: 0]]];
<-15 =>
RETURN[[num[
highbits: 0,
lowbits: Basics.BITSHIFT[a.highbits, b+16]]]];
<0 =>
RETURN[[num[
highbits: Basics.BITSHIFT[a.highbits, b],
lowbits: Basics.BITOR[Basics.BITSHIFT[a.lowbits, b], Basics.BITSHIFT[a.highbits, b+16]]]]];
<16 =>
RETURN[[num[
highbits: Basics.BITOR[Basics.BITSHIFT[a.highbits, b], Basics.BITSHIFT[a.lowbits, b-16]],
lowbits: Basics.BITSHIFT[a.lowbits, b]]]];
<32 =>
RETURN[[num[
highbits: Basics.BITSHIFT[a.lowbits, b-16],
lowbits: 0]]];
ENDCASE => RETURN[[num[highbits: 0, lowbits: 0]]];
};
ApplyBitNot:
PUBLIC
PROC[self: State] = {
a: INT = PopInt[self];
PushInt[self, LongBITNOT[[li[a]]].li];
};
ApplyBitAnd:
PUBLIC
PROC[self: State] = {
b: INT = PopInt[self];
a: INT = PopInt[self];
PushInt[self, LongBITAND[[li[a]], [li[b]]].li];
};
ApplyBitOr:
PUBLIC
PROC[self: State] = {
b: INT = PopInt[self];
a: INT = PopInt[self];
PushInt[self, LongBITOR[[li[a]], [li[b]]].li];
};
ApplyBitXor:
PUBLIC
PROC[self: State] = {
b: INT = PopInt[self];
a: INT = PopInt[self];
PushInt[self, LongBITXOR[[li[a]], [li[b]]].li];
};
ApplyBitShift:
PUBLIC
PROC[self: State] = {
b: INT = PopInt[self];
a: INT = PopInt[self];
PushInt[self, LongBITSHIFT[[li[a]], b].li];
};
END.