Google
 

Trailing-Edge - PDP-10 Archives - BB-4157E-BM - fortran-compiler/p3r.bli
There are 12 other files named p3r.bli in the archive. Click here to see a list.
!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,1981 BY DIGITAL EQUIPMENT CORPORATION
!AUTHOR: S MURPHY/EGM

MODULE P3R(SREG=#17,VREG=#15,FREG=#16,DREGS=4,RESERVE(0,1,2,3),START) =
BEGIN

SWITCHES NOLIST;
REQUIRE FIRST.BLI;
REQUIRE TABLES.BLI;
SWITCHES LIST;

GLOBAL BIND P3RV = 6^24 + 0^18 + 50;		! Version Date: 20-Jul-81

%(

***** Begin Revision History *****

49	-----	-----	CALL "DATPROC" EVEN IF NO REL FILE IS TO BE PRODUCED
			FOR PURPOSES OF ERROR DETECTION

***** Begin version 6 *****

50	1047	EGM	22-Jan-81	Q10-05325
	Add support for TOPS-10 execute only.

***** End Revision History ***** 

)%
%[1047]% PORTAL ROUTINE MRP3R =
BEGIN
%(***OVERLAY TO GO THRU THE WHOLE PROGRAM TWICE. ON THE FIRST PASS, PERFORM
	COMPLEXITY ANALYSIS, ON THE 2ND PASS, PERFORM REGISTER ALLOCATION
****)%
	EXTERNAL GBSYREGS,GBSYCT;	!GLOBALS INDICATING WHICH REGS ARE
	EXTERNAL RETNCT;	!CT OF "RETURN" STMNTS IN PROGRAM - MADE
				! IN COMPLEXITY
	EXTERNAL ASVCT;		!CT OF ASSIGNMENT STMNTS THAT DIRECTLY PRECEDE RETURN STMNTS
				! AND ASSIGN THE VAL OF THE (MADE IN COMPLEXITY)
					! AVAILABLE AFTER THE GLOBAL ALLOCATOR HAS
					! TAKEN THOSE THAT IT WILL USE
	EXTERNAL CSTMNT;
	EXTERNAL DATPROC;
	MAP BASE CSTMNT;

	EXTERNAL LSTLNK,FRSTLNK;
	EXTERNAL DOWDP;		!USED IN SUBSTITUTING REGCONTENTS NODES FOR REFS
				! TO A DO INDEX
	EXTERNAL ALLOCATE;

	EXTERNAL SEGINCORE,PHAZCONTROL;
	EXTERNAL ALCTEMP,ALCTMPS,ALCCON;
	EXTERNAL RELINIT,HISEGBLK,FORMPTR,DMPFORMAT;
	EXTERNAL FNTMP;			!FOR STATEMENT FN ARG NAMES

	EXTERNAL INITREGCANDIDATES;	!ROUTINE TO INIT TABLE FOR 1ST PASS OF
					! BASIC BLOCK REG ALLOCATOR
	EXTERNAL CMPBLO;		!ROUTINE TO PERFORM 1ST PASS OF BASIC BLOCK REG
					! ALLOCATOR FOR A GIVEN BASIC BLOCK. CALLED WITH
					! "CSTMNT" POINTING TO THE 1ST STMNT OF
					! THE BLOCK, RETURNS WITH "CSTMNT" POINTING TO THE
					! 1ST STMNT OF THE NEXT BLOCK
	EXTERNAL INIRGSTATE;		!ROUTINE TO INIT TABLE FOR 2ND PASS OF
					! BASIC BLOCK ALLOCATOR
	EXTERNAL ALCBLO;		!ROUTINE TO PERFORM 2ND PASS OF BASIC BLOCK
					! ALLOCATOR FOR A GIVEN BLOCK. CALLED WITH "CSTMNT"
					! POINTING TO THE 1ST STMNT OF THE BLOCK. RETURNS
					! WITH CSTMNT POINTING TO THE 1ST STMNT OF THE NEXT BLOCK
	EXTERNAL NOBBREGSLOAD;	!FLAG WHICH IS SET WHILE PROCESSING NODES FOR
				! WHICH THE CODE WILL NOT ALWAYS BE EXECUTED WHEN
				! THE BLOCK CONTAINING THE NODE IS EXECUTED

				! (IE OF THE FN RETURN REG). THIS NODE WILL BE SUBSTITUTED
				! ON THE LHS OF ALL STMNT FNS

	%(***INIT REL FILE (IF ONE IS TO BE GENERATED)***)%
	IF .FLGREG<OBJECT> THEN RELINIT();


	%(***PERFORM STORAGE ALLOCATION FOR ALL VARIABLES AND ARRAYS***)%
	ALLOCATE();


	GBSYREGS_#177760000000;			!12 REGS (2-15) ARE AVAILABLE
	GBSYCT_12;

	CSTMNT_.SORCPTR<LEFT>;			!PTR TO 1ST STMNT OF PROGRAM

	%(***SKIP 1ST STMNT OF PROGRAM - WHICH IS A DUMMY CONTINUE***)%
	IF .CSTMNT NEQ 0
	THEN
	CSTMNT_.CSTMNT[SRCLINK];

	LSTLNK_0;	!THIS GLOBAL IS USED BY THE ROUTINE THAT 
			! GENERATES TEMPORARIES; IT POINTS TO THE LAST TEMPORARY
			! ON THE LINKED LIST OF TEMPS AND IS 0 IF THERE ARE NONE
	FRSTLNK_0;	!THIS GLOBAL POINTS TO THE FIRST TEMPORARY ON THE LINKED LIST
			! OF TEMPORARIES AND IS 0 IF THERE ARE NONE
	FNTMP_0;			!INIT FOR STATEMENT-FN ARG NAMES


	%(***INIT GLOBAL USED BY THE ROUTINE THAT SUBSTITUTES REGCONTENTS NODES
		FOR REFS TO A DO INDEX THAT LIVES IN A REGISTER***)%
	DOWDP_0;

	%(***INIT FLAG FOR "THIS PROGRAM INCLUDES ARITH EXPRS
		THAT MUST BE EVALUATED BYMEANS OF LIBRARY ROUTINES***)%
	LIBARITHFLG_FALSE;


	%(***INIT COUNTS THAT ARE KEPT OF THE NUMBER OF RETURN STMNTS IN THE PROGRAM AND OF
		THE NUMBER OF PLACES THAT THE FN VAL IS ASSIGNED DIRECTLY BEFORE A "RETURN"**)%
	RETNCT_0;
	ASVCT_0;


	%(***PERFORM 1ST PASS OF BASIC BLOCK REG ALLOCATOR (AND "COMPLEXITY" PASS OF
		LOCAL REG ALLOCATOR) ***)%
	INITREGCANDIDATES();	!INIT TABLE USED BY 1ST PASS OF BB ALLOCATOR
	WHILE .CSTMNT NEQ 0	!UNTIL REACH END OF PROGRAM
	DO
	CMPBLO();		!WALK THRU EACH BASIC BLOCK


	%(***PERFORM 2ND PASS OF BASIC BLOCK REG ALLOCATOR***)%
	CSTMNT_.SORCPTR<LEFT>;	!PTR TO 1ST STMNT OF PROGRAM
	IF .CSTMNT NEQ 0	!SKIP THE DUMMY CONTINUE AT START OF PROGRAM
	THEN CSTMNT_.CSTMNT[SRCLINK];

	NOBBREGSLOAD_FALSE;	!INITIALIZE FLAG THAT WILL BE SET TO TRUE WHILE
				! PROCESSING NODES WHICH WILL NOT ALWAYS BE EVALUATED
				! WHEN THE BLOCK CONTAINING THEM IS EVALUATED (EG NODES
				! UNDER THE STMNT UNDER A LOGICAL IF, UNDER A CONTROL BOOLEAN,..)
	INIRGSTATE();	!INIT THE TABLE THAT REPRESENTS THE CONTENTS OF THE REGISTERS

	WHILE .CSTMNT NEQ 0	!WALK THRU ALL  BLOCKS UNTIL REACH THE END OF PROGRAM
	DO
	ALCBLO();	!PERFORM 2ND BASIC-BLOCK ALLOCATOR PASS FOR THIS BLOCK




	!ALLOCATE SYMBOL TABLE ENTRIES FOR THE TEMPS
	!NECESSARY FOR SAVE-RESTORE. THIS DEPENDS ON
	!CLOBBREGS SO CANNOT BE DONE TIL NOW

	ALCTEMP();


	%(***NOW PERFORM STORAGE ALLOCATION FOR ALL TEMPORARIES AND CONSTANTS***)%
	IF .FLGREG<OBJECT>
	THEN
	ALCTMPS();

	%(***OUTPUT LOADER BLOCKS FOR DATA STATEMENTS. MUST
		DO THIS HERE BEFORE CONSTANTS ARE ROUNDED BACK TO SINGLE
		PREC OR TO KA10 FORMAT***)%
	DATPROC();

	IF .FLGREG<OBJECT>
	THEN
	BEGIN

		ALCCON();
		HISEGBLK();	!OUTPUT THE HISEG BLOCK IN REL FILE
				!TO TELL LOADER SIZE OF LOWSEG

		IF .FORMPTR NEQ 0 THEN DMPFORMAT();	!DUMP OUT THE FORMAT STRING DEFINITIONS  (IF ANY)
	END;


END;			!END OF MRP3R
MACHOP POPJ=#263;
MRP3R();
POPJ(#17,0)
END ELUDOM