C2CTargetImpl.mesa
Copyright Ó 1987, 1988, 1989, 1990, 1991 by Xerox Corporation. All rights reserved.
Created by Christian Jacobi, 1987
Christian Jacobi, October 7, 1992 3:01 pm PDT
DIRECTORY
C2CBasics, C2CNames, C2CTarget, Rope;
C2CTargetImpl: CEDAR MONITOR
IMPORTS C2CBasics, C2CNames
EXPORTS C2CTarget =
BEGIN OPEN C2CTarget;
ROPE: TYPE = Rope.ROPE;
runtimePrefix: PUBLIC ROPE ¬ "XR←";
bitsPerWord: PUBLIC NAT ← 32;
word: PUBLIC ROPE ¬ "word";
wordCast: PUBLIC ROPE ¬ " (word) ";
signedWord: PUBLIC ROPE ¬ "int";
unsignedWord: PUBLIC ROPE ¬ "unsigned";
signedWordCast: PUBLIC ROPE ¬ " (int) ";
unsignedWordCast: PUBLIC ROPE ¬ " (unsigned) ";
wordPtr: PUBLIC ROPE ¬ "ptr";
wordPtrCast: PUBLIC ROPE ¬ " (ptr) ";
hasBytes: PUBLIC BOOLTRUE;
byte: PUBLIC ROPE ¬ "byte";
byteCast: PUBLIC ROPE ¬ " (byte) ";
bytePtr: PUBLIC ROPE ¬ "bPt";
bytePtrCast: PUBLIC ROPE ¬ " (bPt) ";
unsignedByteCast: PUBLIC ROPE ¬ " (byte) ";
signedByte: PUBLIC ROPE ¬ " char ";
signedByteCast: PUBLIC ROPE ¬ " (char) ";
hasHalfWords: PUBLIC BOOLTRUE;
bitsPerHalfWord: PUBLIC NAT ← 16;
halfWord: PUBLIC ROPE ¬ "half";
halfWordCast: PUBLIC ROPE ¬ " (half) ";
halfWordPtr: PUBLIC ROPE ¬ "hPt";
halfWordPtrCast: PUBLIC ROPE ¬ " (hPt) ";
unsignedHalfCast: PUBLIC ROPE ¬ " (half) ";
signedHalf: PUBLIC ROPE ¬ " short ";
signedHalfCast: PUBLIC ROPE ¬ " (short) ";
bitsPerDoubleWord: PUBLIC NAT ← 64;
addressUnitsPerWord: PUBLIC NAT ← 4;
bitsPerAddressUnit: PUBLIC NAT ← 8;
charsPerWordInString: PUBLIC NAT ← 4;
bestAlignment: PUBLIC NAT ← 32; --Sparc: no doubles generated
idMaxLength: PUBLIC NAT ¬ 127; --I believe our C compiler goes to 255
maxBitsForReturns: PUBLIC INT ¬ 32;
maxBitsForSimpleStructs: PUBLIC INT ¬ 32*8;
maxBitsForValueParams: PUBLIC INT ¬ LAST[INT];
maxWordsForInlineFillWords: PUBLIC INT ¬ 3;
firstOfINT: PUBLIC CARD ¬ LOOPHOLE[FIRST[INT32]];
maxBitsForFastLiterals: PUBLIC INT ¬ 18;
maxBitsForFastAnd: PUBLIC INT ¬ 13; --SPARC
BitsToWords: PUBLIC PROC [b: INT] RETURNS [w: INT] = {
w ¬ (b+32-1)/32
};
RoundUpToWordBoundary: PUBLIC PROC [b: INT] RETURNS [bits: INT] = {
mod: NAT = b MOD 32;
IF mod # 0 THEN b ¬ b + (32-mod);
RETURN [b];
};
RoundUpToBestAlignment: PUBLIC PROC [b: INT] RETURNS [bits: INT] = {
mod: NAT = b MOD 32; --Sparc: no doubles generated
IF mod # 0 THEN b ¬ b + (32-mod);
RETURN [b];
};
RoundUpCharsToWords: PUBLIC PROC [cn: INT] RETURNS [chars: INT] = {
mod: NAT = cn MOD 4;
IF mod # 0 THEN cn ¬ cn + (4-mod);
RETURN [cn];
};
PointeeBits: PUBLIC PROC [usedBits: INT] RETURNS [INT] = {
--pointee: the guy sombody is pointing at
IF usedBits<=0 THEN C2CBasics.CantHappen;
IF usedBits<=8 AND hasBytes THEN RETURN [8];
IF usedBits<=bitsPerHalfWord AND hasHalfWords THEN RETURN [bitsPerHalfWord];
IF usedBits<=bitsPerWord THEN RETURN [bitsPerWord];
IF usedBits<=bestAlignment THEN RETURN [bestAlignment];
RETURN [RoundUpToBestAlignment[usedBits]];
};
TemporaryBits: PUBLIC PROC [usedBits: INT] RETURNS [INT] = {
IF usedBits<=bitsPerWord THEN RETURN [bitsPerWord];
IF usedBits<=bestAlignment THEN RETURN [bestAlignment];
RETURN [RoundUpToBestAlignment[usedBits]];
};
rightShiftSignedIsOk: PUBLIC BOOL ¬ TRUE;
takingAddressIsExpensive: PUBLIC BOOL ¬ TRUE;
consecutiveStringsAllocedAdj: PUBLIC BOOL ¬ TRUE;
machineIsSunC: PUBLIC BOOL ← TRUE;
definitions: PUBLIC ROPE ¬ "typedef unsigned word, *ptr;\ntypedef unsigned char byte, *bPt;\ntypedef unsigned short half, *hPt;\n";
[] ¬ C2CNames.Reserve["word"];
[] ¬ C2CNames.Reserve["ptr"];
[] ¬ C2CNames.Reserve["byte"];
[] ¬ C2CNames.Reserve["bPt"];
[] ¬ C2CNames.Reserve["half"];
[] ¬ C2CNames.Reserve["hPt"];
END.