Basics16.mesa
For Sun-3 and Sun-4
Copyright Ó 1985, 1988, 1991 by Xerox Corporation. All rights reserved.
Carl Hauser, July 11, 1988 3:30:21 pm PDT
Last tweaked by Mike Spreitzer on June 24, 1988 11:21:44 am PDT
Willie-s, August 5, 1991 5:04 pm PDT
Michael Plass, August 21, 1991 10:24 am PDT
Doug Wyatt, August 27, 1991 1:34 pm PDT
Commonly-used types and values
bitsPerWord: NAT ~ BITS[WORD16]; -- = 16, of course
bytesPerWord: NAT ~ BYTES[WORD16];
charsPerWord:
NAT ~ bytesPerWord;
logBitsPerWord: NAT ~ BITS[[0..bitsPerWord)];
logBytesPerWord: NAT ~ BITS[[0..bytesPerWord)];
logCharsPerWord:
NAT ~ logBytesPerWord;
RawWords:
TYPE ~
RECORD [
PACKED
SEQUENCE
COMPUTED
CARD
OF
WORD16];
Arithmetic utilities
Comparison:
TYPE ~ Basics.Comparison;
CompareCard:
PROC [a, b:
CARD16]
RETURNS [Comparison]
~ INLINE { RETURN[IF a=b THEN equal ELSE IF a>b THEN greater ELSE less] };
CompareInt:
PROC [a, b:
INT16]
RETURNS [Comparison]
~ INLINE { RETURN[IF a=b THEN equal ELSE IF a>b THEN greater ELSE less] };
OddCard:
PROC [n:
CARD16]
RETURNS [
BOOL]
~ INLINE { RETURN [VAL[n MOD 2]] };
... cheaply tests whether n is odd; equivalent to (but faster than) (n MOD 2)#0.
OddInt:
PROC [n:
INT16]
RETURNS [
BOOL]
~ INLINE { RETURN [OddCard[LOOPHOLE[n]]] };
LongMult:
PROC [a, b:
CARD16]
RETURNS [
CARD32]
~ INLINE { RETURN[CARD32[a]*CARD32[b]] };
LongDiv:
PROC [a:
CARD32, b:
CARD16]
RETURNS [
CARD16]
~ INLINE { RETURN[a/b] };
LongDivMod:
PROC [num:
CARD32, den:
CARD16]
RETURNS [quotient, remainder:
CARD16]
~ INLINE { RETURN[num / den, num MOD den] };
Logic utilities
BITAND:
PROC [w1:
WORD16, w2:
WORD16]
RETURNS [
WORD16]
~ INLINE { RETURN[LOOPHOLE[Basics.BITAND[w1, w2]]] };
BITOR:
PROC [w1:
WORD16, w2:
WORD16]
RETURNS [
WORD16]
~ INLINE { RETURN[LOOPHOLE[Basics.BITOR[w1, w2]]] };
BITXOR:
PROC [w1:
WORD16, w2:
WORD16]
RETURNS [
WORD16]
~ INLINE { RETURN[LOOPHOLE[Basics.BITXOR[w1, w2]]] };
BITNOT:
PROC [w:
WORD16]
RETURNS [
WORD16]
~ INLINE { RETURN[CARD16.LAST - w] };
BITLSHIFT:
PROC [value:
WORD16, count: [0..bitsPerWord)]
RETURNS [
WORD16]
~ INLINE { RETURN[Basics.LowHalf[Basics.BITLSHIFT[value, count]]] };
... left-shifts the value by the count.
BITRSHIFT:
PROC [value:
WORD16, count: [0..bitsPerWord)]
RETURNS [
WORD16]
~ INLINE { RETURN[LOOPHOLE[Basics.BITRSHIFT[value, count]]] };
... right-shifts the value by the count.
BITSHIFT:
PROC [value:
WORD16, count:
INT]
RETURNS [
WORD16]
~ INLINE { RETURN[Basics.LowHalf[Basics.BITSHIFT[value, count]]] };
... shifts the value by the count. If count is positive, the shift is to the left. If count is negative, the shift is to the right.
END.
Carl Hauser, October 13, 1986 11:23:32 am PDT
Working on conversion for Dragon .
changes to:
LongNumber reordered contained words, bytes and bits; renamed the tags and subfields
ShortNumber retyped the subfields; renamed the tags and subfields
UnsafeBlock retyped the base field.
Carl Hauser, June 11, 1987 4:10:57 pm PDT
added the Endian types and operations.
Carl Hauser, March 24, 1988 11:07:21 am PST
Removed VM parameters. Get them from the VM interface.
Last tweaked by Mike Spreitzer on June 24, 1988 11:15:37 am PDT
Cloned PBasics to make PBasics16.
Willie Sue Orr, July 25, 1991 2:40:27 pm PDT
Changed name from PBasics16 to Basics16 and use Basics32 instead of PBasics.
Michael Plass, August 21, 1991 10:21:12 am PDT
Changed to depend on Basics rather than Basics32; eliminated some unnecessary masking operations.