<> <> DIRECTORY PrincOps USING [ zAND, zDCOMP, zDIV, zDUCOMP, zINC, zLDIV, zLIN1, zMUL, zOR, zPUSH, zSHIFT, zXOR]; Basics: CEDAR DEFINITIONS = BEGIN OPEN PrincOps; <> bytesPerWord, charsPerWord: NAT = 2; bitsPerByte, bitsPerChar: NAT = 8; bitsPerWord: NAT = bitsPerByte*bytesPerWord; logBitsPerByte, logBitsPerChar: NAT = --LogBase2[bitsPerByte]--3; logBytesPerWord, logCharsPerWord: NAT = --LogBase2[bytesPerWord]--1; logBitsPerWord: NAT = logBitsPerByte + logBytesPerWord; Byte, BYTE: TYPE = [0..377B]; Word: TYPE = WORD; LongNumber: TYPE = MACHINE DEPENDENT RECORD [ SELECT OVERLAID * FROM lc => [lc: LONG CARDINAL], li => [li: INT], num => [lowbits, highbits: CARDINAL], bytes => [lh, ll, hh, hl: BYTE], ENDCASE]; BytePair: TYPE = MACHINE DEPENDENT RECORD [high, low: BYTE]; Comparison: TYPE = MACHINE DEPENDENT {less(0), equal(1), greater(2)}; RefSeq: TYPE = RECORD [length: NAT, elements: SEQUENCE maxLength: NAT OF REF ANY]; RawMemory: TYPE = RECORD [SEQUENCE COMPUTED CARDINAL OF WORD]; UnsafeBlock: TYPE = RECORD [ base: LONG POINTER TO PACKED ARRAY [0..0) OF CHAR _ NIL, startIndex: INT _ 0, count: INT _ 0 ]; <> <> <<>> CompareLC, CompareCard: PROC [a, b: LONG CARDINAL] RETURNS [Comparison] = TRUSTED MACHINE CODE {zDUCOMP; zINC}; CompareINT: PROC [a, b: INT] RETURNS [Comparison] = TRUSTED MACHINE CODE {zDCOMP; zINC}; DIVMOD: PROC [num, den: CARDINAL] RETURNS [quotient, remainder: CARDINAL] = TRUSTED MACHINE CODE {zDIV; zPUSH}; LDIVMOD: PROC [numlow: WORD, numhigh: CARDINAL, den: CARDINAL] RETURNS [quotient, remainder: CARDINAL] = TRUSTED MACHINE CODE {zLDIV; zPUSH}; LongMult: PROC [CARDINAL, CARDINAL] RETURNS [product: LONG CARDINAL] = TRUSTED MACHINE CODE {zMUL; zPUSH}; LongDiv: PROC [num: LONG CARDINAL, den: CARDINAL] RETURNS [CARDINAL] = TRUSTED MACHINE CODE {zLDIV}; LongDivMod: PROC [num: LONG CARDINAL, den: CARDINAL] RETURNS [quotient, remainder: CARDINAL] = TRUSTED MACHINE CODE {zLDIV; zPUSH}; <> <<>> BitOp: TYPE = SAFE PROC [CARDINAL, CARDINAL] RETURNS [CARDINAL]; BITAND: BitOp = TRUSTED MACHINE CODE {zAND}; BITOR: BitOp = TRUSTED MACHINE CODE {zOR}; BITXOR: BitOp = TRUSTED MACHINE CODE {zXOR}; BITNOT: SAFE PROC [CARDINAL] RETURNS [CARDINAL] = TRUSTED MACHINE CODE {zLIN1; zXOR}; BITSHIFT: SAFE PROC [value: CARDINAL, count: INTEGER] RETURNS [CARDINAL] = TRUSTED MACHINE CODE {zSHIFT}; <> LowHalf: PROC [n: LONG CARDINAL] RETURNS [CARDINAL] = TRUSTED INLINE {RETURN[LOOPHOLE[n, LongNumber].lowbits]}; HighHalf: PROC [n: LONG CARDINAL] RETURNS [CARDINAL] = TRUSTED INLINE {RETURN[LOOPHOLE[n, LongNumber].highbits]}; LowByte: PROC [n: CARDINAL] RETURNS [CARDINAL] = TRUSTED INLINE {RETURN[LOOPHOLE[n, BytePair].low]}; HighByte: PROC [n: CARDINAL] RETURNS [CARDINAL] = TRUSTED INLINE {RETURN[LOOPHOLE[n, BytePair].high]}; END.