!THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ! OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ! !COPYRIGHT (C) 1972,1973,1974,1977,1978 DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. 01754 !FILENAME: LOADDR.BLI !DATE: 1 MAR 73 MGM %3.2% GLOBAL BIND LOADV=1; !MODULE VERSION NUMBER %3.1% GLOBAL ROUTINE TVMP(X)= ! (TEMPORARY VALUE IN MEMORY PREDICATE) ! X MUST BE A LEXEME. TVMP IS A PREDICATE WITH VALUE 1 ! (OTHERWISE 0) IF THE LEXEME IS OF THE FORM @R (POSSIBLY ! WITH A UNARY - OR NOT) WHERE R IS A HAS-BEEN TEMPORARY ! REGISTER NOW DUMPED INTO CORE TO LOOK LIKE A LOCAL ! VARIABLE. THE IDEA OF TVMP IS TO DECIDE WHETHER THAT ! CORE LOCATION CAN PROFITABLY BE USED TO FURTHER EVALUATE ! AN EXPRESSION. FOR INSTANCE @R+@D, WHERE D IS A DECLARED ! REGISTER, COULD BE CODED AS ADDM D,R. BEGIN REGISTER E; IF ((E_.X AND (NOT NGNTM AND NOT RTEM);.E) EQL ZERO OR .E EQL 0) AND .X THEN .RT[.RT] AND (.RT[.RT] EQL 1) END; %3.1% GLOBAL ROUTINE LITV(X)= ! (LITERAL VALUE) ! X MUST BE THE LEXEME FOR A LITERAL. LITV RETURNS ! THE 36 BIT VALUE OF THAT LITERAL. IF .X THEN GETLITVAL(.X) ELSE .X; %3.1% GLOBAL ROUTINE LITA(X)= ! (LITERAL ADDRESS) ! X MUST BE THE LEXEME FOR A LITERAL. LITA RETURNS ! A VALUE WITH TWO FIELDS COMPATIBLE WITH CODE-3 FORMAT. ! THE RIGHT HALF HOLDS THE ENTRY OF THAT LITERAL IN THE ! LT. THIS WILL CAUSE A SMALL LITERAL TO BE ENTERED IF ! IT IS NOT ALREADY IN THE TABLE - NECESSARY SINCE THE ! PDP-10 DOES NOT HAVE IMMEDIATE INSTRUCTIONS FOR ALL ! OPERATIONS, E.G. PUSH. THE RELOCF HOLDS LTRELOC. BEGIN X_IF .X THEN .X ELSE LTINSERT(.X); X_7; .X END; %3.1% GLOBAL ROUTINE RAGLAR(X)= ! (REGISTER ADDRESS - GENERATE LOAD ARBITRARY REGISTER) ! X MUST BE A LEXEME. RAGLAR GENERATES CODE TO FORCE ! THE EXPRESSION INTO AN ARBITRARY REGISTER WHOSE ADDRESS ! IT RETURNS IN CODE-3 FORMAT. BEGIN LOCAL D; D_X_GLAR(.X); X_.RT[.X]; RMA(IF .D THEN .X,0,.X) END; %3.1% GLOBAL ROUTINE RMA(R,M,Y)= ! (RELEASE - MODIFY - ADDRESS) ! Y MUST BE AN ADDRESS, POSSIBLY WITH THE RELOCF SET. ! R AND M MUST BE ACTUAL REGISTER ADDRESSES. RMA PUTS ! R AND M IN THE RELRF AND INDXF OF Y AND RETURNS THE ! RESULT (CODE-3 FORMAT). MEANTIME IT SANCTIFIES M. BEGIN IF .ART[.R] THEN Y_.R; Y_.M; IF (M_.ART[.M]) NEQ 0 THEN RT[.M]_1; .Y END; %3.1% GLOBAL ROUTINE LEXRA(X)= ! RETURNS LEXEME OF A REGISTER WHOSE ADDRESS IS X. IF X DOES NOT HAVE ! A NAME, LEXRA GETS ONE IF .ART[.X] EQL 0 THEN IF (1^.X AND .MODREGM) EQL 0 THEN BEGIN RMFRLST(.X); LEXRN(GETRN(.X,0,0)) END ELSE LEXRN(GETRN(.X,1,0)) ELSE LEXRN(.ART[.X]); %3.1% GLOBAL ROUTINE REGAR(X)= ! (REGISTER ADDRESS - RELEASE) ! X SHOULD BE A LEXEME OF THE FORM @R. REGAR PROVIDES ! THE ACTUAL REGISTER ADDRESS OF R AS WITH REGAK, BUT ! WITH THE RELRF ALSO SET TO THIS ADDRESS (TO SIGNAL TO ! CODEN TO RELEASE THE REGISTER) UNLESS R IS DECLARED. BEGIN LOCAL A,T; T_TVMP(.X); A_REGAK(.X); IF .X AND NOT .T THEN RMA(.A,0,.A) ELSE .A END; %3.1% GLOBAL ROUTINE REGAK(X)= ! (REGISTER ADDRESS - KEEP) ! X SHOULD BE A LEXEME OF THE FORM @R. REGAK PROVIDES ! THE ACTUAL REGISTER ADDRESS OF R SETTING HOLINESS TO ! PREVENT SWAPPING. THE VALUE IS COMPATIBLE WITH CODE-2 ! AND CODE-3 FORMATS. BEGIN LOCAL T; (T_RT[.X])_1; IF NOT(.(.T) AND .X) THEN .(.T) ELSE GMA(.X) END; %3.1% GLOBAL ROUTINE TVRP(X)= ! (TEMPORARY VALUE IN REGISTER PREDICATE) %1 IF THE LEXEME X REPRESENTS AN EXPRESSION PROVIDING AN UNIQUE TEMPORARY REGISTER(UNLESS THE EXPRESSION IS READY) WHICH MAY BE USED WITHOUT POSSIBLE LOSS IN THE A FIELD OF A MEMORY TO REGISTER INSTRUCTION. 0 OTHERWISE% BEGIN REGISTER N; IF (IF REGP(.X) THEN ITRP(.X) OR (.RT[N_.X] EQL .OPTTOREGADDR) ELSE 0) THEN RT[.N]_1 ELSE 0 END; %3.1% GLOBAL ROUTINE ITRP(X)= ! (INVOLVES TEMPORARY REGISTER PREDICATE) ! X MUST BE A LEXEME. ITRP IS A PREDICATE WITH VALUE 1 ! (OTHERWISE 0) IF THE LEXEME INCLUDES @R WHERE R IS AN ! UNDUMPED TEMPORARY REGISTER. BEGIN REGISTER N; IF (N_.X) GEQ 16 THEN NOT .RT[.N] AND .RT[.N] EQL 1 ELSE 0 END; %3.1% GLOBAL ROUTINE DCRP(X)= ! (DECLARED REGISTER PREDICATE) %1 IF THE LEXEME REPRESENTS AN EXPRESSION OF THE FORM @D, WHERE D IS EITHER A DECLARED REGISTER OR A NON-UNIQUE TEMPORARY REGISTER. NON-UNIQUENESS RESULTS FROM A SUCCESSFUL MATCH IN THE TRCT BEFORE THE REGISTER HAS BEEN RELEASED. E.G. IN (T_EXPR)+.T AND IN THIS CASE HOLINESS IS SET TO PREVENT SWAPPING. IN EITHER CASE THE REGISTER CONTENTS MAY NOT BE CHANGED. 0 OTHERWISE% BEGIN REGISTER E; IF REGP(.X) THEN E_.X ELSE RETURN(0); IF .E LSS 16 THEN RETURN 1; IF NOT .RT[.E] THEN IF .RT[.E] GTR 1 THEN RETURN RT[.E]_1; 0 END; GLOBAL ROUTINE REGP(X)= ! PREDICATE: X IS A LEXEME REPRESENTING A REGISTER BEGIN IF .X EQL 0 THEN RETURN 0; (.X AND NOT RTEM) EQL 0 END; GLOBAL ROUTINE SMPOSLITVP(X)= ! (SMALL-POSITIVE-LITERAL-VALUE-PREDICATE) X IS AN 18-BIT LITERAL VALUE BEGIN IF .X LSS 0 THEN RETURN 0; .X LEQ RIGHTM END; GLOBAL ROUTINE SMNEGLITVP(X)= ! (SMALL-NEGATIVE-LITERAL-VALUE-PREDICATE) -X IS AN 18-BIT LITERAL VALUE BEGIN IF .X GEQ 0 THEN RETURN 0; .X GEQ -RIGHTM END; !END OF LOADDR.BLI