Google
 

Trailing-Edge - PDP-10 Archives - FORTRAN-10_V7wLink_Feb83 - 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) DIGITAL EQUIPMENT CORPORATION 1972, 1983
!AUTHOR: S MURPHY/EGM/TFV

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 = 7^24 + 0^18 + 53;		! Version Date: 7-Jan-82

%(

***** 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.

***** Begin Version 7 *****

51	1245	TFV	3-Aug-81	------
	Add code to MRP3R to generate HISEG character descriptors for
	character constants, scalars, and arrays

52	1406	TFV	27-Oct-81	------
	Call HSDDESC to output .Dnnnn variable compile-time-constant
	character descriptors to the HISEG.

53	1454	RVM	7-Jan-82
	Format allocation changed to work with the optimizer.  Change
	it here too.

***** 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 DOWDP;		!USED IN SUBSTITUTING REGCONTENTS NODES FOR REFS
				! TO A DO INDEX
	EXTERNAL ALLOCATE;

	EXTERNAL SEGINCORE,PHAZCONTROL;
%1245%	EXTERNAL ALCAVARS,ALCQVARS,ALCCON;
%1454%	EXTERNAL RELINIT,HISEGBLK,FORMPTR,DUMPFORMAT;
	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

%1245%	EXTERNAL CHDECL;	! Flag for character declaration seen
%1245%	EXTERNAL HILOC;		! Current high seg break
%1245%	EXTERNAL LOWLOC;	! Current low seg break
%1245%	EXTERNAL HSLITD;	! Routine to generate high seg descriptors for
				! character constants
%1245%	EXTERNAL HSCHD;		! Routine to generate high seg descriptors for
				! character scalars and arrays
%1406%	EXTERNAL HSDDESC;	! Routine to generate high seg descriptors for
				! .Dnnnn compile-time-constant character
				! descriptors
%1245%	EXTERNAL HDRFLG;	! Flag for heading has been output
%1245%	EXTERNAL TCNT;		! Count of temporaries on a line

	%(***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];



	%(***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

%1245%	HDRFLG _ 0;	! Heading not output yet
%1245%	TCNT = 0;
%1245%	ALCAVARS();


	%(***NOW PERFORM STORAGE ALLOCATION FOR ALL TEMPORARIES AND CONSTANTS***)%
%1245%	ALCQVARS();

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

%1245%	ALCCON();

	! Dump the format statements into the .REL file if there are some

%1454%	IF .FORMPTR NEQ 0 THEN DUMPFORMAT();


	HISEGBLK();	! Output the hiseg block in .REL file
			! to tell loader size of lowseg

%1245%	! Output high seg descriptors for character constants

%1245%	HDRFLG _ 0;	! Heading not output yet
%1245%	HSLITD();

%1245%	! Output high seg descriptors for character scalars and arrays
%1245%	! If we had character declarations in FORTB

%1245%	IF .CHDECL EQL -1 THEN HSCHD();

%1406%	! Output high seg descriptors for .Dnnnn compile-time-constant
%1406%	! character descriptors

%1406%	HSDDESC();

END;	! of MRP3R

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