! f1opt1 ! 07/12/86 - copy of ftn1opt3 ! - insert include files ! 05/07/86 - avoid setting use bit for CVT when also assignment (complex ops) ! 02/12/85 - taken from op147,new include files incorporated ! 07/11/85 - set DEF bit if mode of opd1 is char, at SWTR(IOSPEC) ! 3//6/85 - insert check for POSLEB at SKIP3 in TOPOLOGY ! 31/10/84 - set NEWBLFLAG=1 at SWTR(IOSPEC) ! 08/10/84 - remove call to GENBLOCK ! 19/07/84 - GENBLOCK corrected to insert a new label in 1st triad ! of new block if required ! - LPPTR now deals with LEBs for multiple loops ! 02/07/84 - at SWTR(ASMT) set USE bit for opd2 before DEF bit for opd1 ! set NEWBLFLAFG in IOSPEC switch ! 02/04/84 - new code in BLOCKS to deal with list-directed I/O ! 31/01/84 - UPDATE SETUSE FOR DCMPLX & INTRIN ! 31/01/84 - NEW TRIADS DCMPLX, INTRIN, (IFUN) ! 17/01/84 - REMAP ON TO A TABLE IF ITS FULL ROUTINE HAS BEEN CALLED ! 12/01/84 - MAKE BIT STRIP ADDRESSES RELATIVE IN A BLOCK ENTRY ! 31/10/83 COPIED FROM ERCS06.REL8002_OP1B15 !* %INCLUDE "ftn_ht" !* {%INCLUDE "ftn_fmts2"} !* 09/12/85 - add recordformat SUBFMT !* modified 14/03/85 !* !*********************************************************************** !* Formats for accessing dictionary records * !*********************************************************************** !* %recordformat PRECF(%byteinteger CLASS,TYPE,X0,X1, %integer LINK1, LINK2, (%shortinteger COORD,LINK3 %OR %integer LAST %C %OR %integer CONSTRES %OR %integer INF3), %integer ADDR4, %shortinteger DISP,LEN,IDEN,IIN, %integer LINE,XREF,CMNLENGTH,CMNREFAD) !* %recordformat SRECF(%integer INF0, LINK1, INF2, INF3, INF4) !* %recordformat RESF((%integer W %OR %shortinteger H0, (%shortinteger H1 %OR %byteinteger FORM,MODE))) !* %recordformat DORECF( %C %integer LABEL, LINK1, %record(RESF) LOOPAD, ENDREF, INDEXRD, INCRD, FINALRD, ICRD, %integer LABLIST,LINE) !* %recordformat BFMT(%integer L,U,M) !* %recordformat ARRAYDVF(%integer DIMS, ADDRDV,ADDRZERO, %C %integer ZEROTOFIRST, ADFIRST, NUMELS, ELLENGTH, %C %record(BFMT) %ARRAY B(1 : 7)) !* !* %recordformat LRECF(%integer NOTFLAG,LINK1, %record(RESF) ORLAB,ANDLAB, %integer RELOP) !* %recordformat IFRECF(%integer TYPE,LINK1, %record(RESF) ENDIFLAB,FALSELAB, %integer LABLIST,LINE) !* %recordformat LABRECF(%shortinteger BLKIND,%byteinteger X0,X1, %C %integer LINK1,LINK2,LINK3,ADDR4,LINK5,LAB,LINE, %C %shortinteger DOSTART,DOEND,IFSTART,IFEND) !* %recordformat PLABF(%shortinteger BLKIND,%byteinteger USE,X1, %integer INDEX,CODEAD,REF,REFCHAIN) !* %recordformat IMPDORECF(%integer VAL,LINK,IDEN) !* %recordformat CONSTRECF(%shortinteger MODE,LENGTH, (%integer VALUE %OR %integer LINK1), %integer DADDR,CADDR) !* %recordformat TMPF((%byteinteger CLASS,TYPE, %shortinteger LEN %OR %integer W0), %integer LINK1, %byteinteger REG,MODE,%shortinteger INDEX, %shortinteger COORD,USECNT, %integer ADDR) !* %recordformat CHARF(%integer ADESC,LINK,LEN) !* %recordformat FNRECF(%integer FPTR,LINK1,HEAD,PCT) !* %recordformat TERECF(%shortinteger MODE,LOOP, %integer CHAIN,DISP1,INDEX, %shortinteger COORD,FLAGS) !* %recordformat DTRECF(%shortinteger MODE,IDENT, %integer CHAIN,DISP2, %shortinteger FLAGS,INDEX, (%integer LOOP %OR %record(RESF) CONST)) !* !* !*********************************************************************** !* TRIAD record format * !*********************************************************************** !* %recordformat TRIADF( %C %byteinteger OP, (%byteinteger USE %OR %byteinteger VAL2), %shortinteger CHAIN, (%record(RESF) RES1 %OR %C (%shortinteger OPD1,%byteinteger QOPD1,MODE %OR %C (%integer SLN %OR %integer VAL1))), (%record(RESF) RES2 %OR %C %shortinteger OPD2,%byteinteger QOPD2,MODE2)) !* !*********************************************************************** !* COM record format * !*********************************************************************** !* %recordformat COMFMT(%integer CONTROL,OPT,OPTIONS1,OPTIONS2,PTRACE, ADICT,ANAMES,ADOUTPUT,ADBLKDTAID,DICLEN,DPTR, MAXTRIADS,NEXTPLAB,ALABH,ADLHEAD, SUBPROGTYPE,SFPTR,EXTERNALS,CBNPTR,SCPTR,CHECKLIST, RESCOM1,RESCOM2,F77PARM,FNO,FAULTY,LINEST,CMNIIN,SFMK, LISTL,LISTSTREAM,DIAGSTREAM,LISTMODE,XREF, PACKCMN,ITSMODE,PATHANAL,CHARACTER CODE,SPACE CHAR, HEADINGS,ARRAYCHECKS,JBRMODE,MESSLEN,NAMESLEN, NEXTCH,FUNRESDISP,WARNCOUNT,INP,MAXINP,MESSCOUNT, UNASSPATTERN,LISTCODE,PI21INT,DOPTR,SUBPROGPTR, FNLST,LAB,NAMESFREE,ALGOLREF,FIRSTSTATNUM,CEXPDICT, COMMONBASE,FASTPROLOGUE,STATEMENT,IFPTR, CNSTCA,COMMENTCNT,ADIDENT,ADERRIDEN, ADEXT,MAXDICT,MAXNAMES,MAXOUTPUT,MAXEXT, ACOMP,ASUBNAMES,MAXPSTACK, ATRIADS,TRFILEID,TRBLOCK,CMNCNT,SCANONLY,NOISY, MAXANAL,MAXGEN,SAVEANAL,SAVEGEN,OPTFLAGS,NEXTBIT, ACMNBITS,NEXTTEMP,ASSGOTOS,TMPPTR,DESTEMPS,OBJADDR, AREAADDR,PASTART,ADOPTDATA,TMINDEX,VRETURN,ENTRIES, EQUCHK,LABWARN,LINENO,MAXIBUFF, COMMENTS,DIAGLEVEL,WARNNOT77,WARNLENGTH,ALLOWUNIX,ALLOWVAX, ONETRIP,HOST,TARGET,MONERRS,CODECA, GLACA,DIAGCA,SSTCA,GSTCA,CONSTCA,SCALARCA,IOAREACA,ZGSTCA,STACKCA, W1,W2,W4,STATORDERMODE,CURSTATCLASS,LISTPOINT,STACKBASE, NEXTTRIAD,ASAVE,MAXSAVE,SUBTAB,LASTSUBTAB, INHIBOP4,ARGCNT,IDCNT,LABCNT,TMLIST,MAINPROG,PROCINDEX,CONSOLE) !* !*********************************************************************** !* record format for communicating with optimiser * !*********************************************************************** !* %recordformat OBJFMT(%string(35) MODULE,%integer MAINEP,I,J,K, ADATE,ATIME,OPTIONS2,EXTPROCS,ATRIADS,MAXTRIADS, ABLOCKS,MAXBLOCKS,ALOOP,MAXLOOP,ATABS,MAXTABS, SRFLAGS,INHIBMASK,OPT,OPTFLAGS,OPTDESC0,OPTDESC1, D1,D2,D3,D4) !* !*********************************************************************** !* !* %RECORDFORMAT SUBRECF(%INTEGER LINK,FLAGS,TRIADS,DICT,NAMES,PTRS,PROG, LABCNT,ARGCNT,IDCNT,TRCNT,REFSCNT,SUBSCNT, DPTR,NEXTTRIAD,NAMESFREE,NEXTBIT,SUBPROGTYPE,SUBPROGPTR, CBNPTR,SCPTR,CMNIIN,FUNRESDISP,CMNCNT,ASSGOTOS,VRETURN,ENTRIES, TMLIST,ALABS,ALHEADS,NEXTPLAB, %STRING(32) NAME,%INTEGERARRAY COORDS(0:15)) !* %CONSTINTEGER SUBSIZE=232 %CONSTINTEGER LABSIZE=128 %CONSTINTEGER LHEADSIZE=620 !* !* {%INCLUDE "ftn_optspecs1"} !* !*********************************************************************** !* External data items * !*********************************************************************** !* %EXTRINSICINTEGER ADICT ;! @ of dictionary area %EXTRINSICINTEGER MAXDICT ;! currect available length of dictionary %EXTRINSICINTEGER ANAMES ;! @ of name table %EXTRINSICINTEGER ABLOCKS ;! @ of block table %EXTRINSICINTEGER MAXBLOCKS ;! current available length of block table area %EXTRINSICINTEGER NEXTBLOCK ;! next available block index %EXTRINSICINTEGER FREEBLOCKS %EXTRINSICINTEGER CBNPTR ;! listhead of common block records %EXTRINSICINTEGER SCPTR ;! listhead of local identifiers %EXTRINSICINTEGER ATABS ;! @ of area for assorted optimiser tables %EXTRINSICINTEGER MAXTABS ;! curent available length of opt table area %EXTRINSICINTEGER FREETABS ;! next free location in opt table area %EXTRINSICINTEGER EXBPTR ;! exit block table %EXTRINSICINTEGER ENTBPTR ;! entry block table %EXTRINSICINTEGER ALOOPS ;! @ loop table area %EXTRINSICINTEGER MAXLOOPS ;! current available length of loop table area %EXTRINSICINTEGER FREELOOPS ;! next free location in loop table area %EXTRINSICINTEGER ATRIADS ;! @ of triad area %EXTRINSICINTEGER LASTTRIAD ;! last allocated triad index %EXTRINSICINTEGER MAXTRIADS ;! current available number of triads %EXTRINSICINTEGER FREETRIADS;! listhead of released triads %EXTRINSICINTEGER BLSIZE ;! length (in architecture units) of a block entry %EXTRINSICINTEGER BSBITS ;! length (in bits) of bit string %EXTRINSICINTEGER BSSIZE ;! length (in architecture units) of a bit strip %EXTRINSICINTEGER BSWORDS ;! length in 2900 words of a bit strip %EXTRINSICINTEGER OPT ;! optimisation level 0, 1 or 2 %EXTRINSICINTEGER OPTFLAGS ;! tracing level 1 Triads 2 Blocks 4 Loops %EXTRINSICINTEGER INHIBMASK ;! inhibits specific optimisations %EXTRINSICINTEGER SRFLAGS ;! strength reduction diagnostic flags %EXTRINSICINTEGER SRHEAD %EXTRINSICINTEGER SRCH %EXTRINSICINTEGER APROPTABS ;! @ bsbits * prop table entries %EXTRINSICINTEGER CLOOPHEAD ;! head of list of all blocks in current loop %EXTRINSICINTEGER PLOOPHEAD ;! subset of CLOOPHEAD list already processed %EXTRINSICINTEGER DLOOPHEAD ;! CLOOPHEAD list - PLOOPHEAD list %EXTRINSICINTEGER CLOOPTAIL %EXTRINSICINTEGER PLOOPTAIL %EXTRINSICINTEGER DLOOPTAIL %EXTRINSICINTEGER DLOOPPTR ;! current DLOOP record %EXTRINSICINTEGER LOOP ;! current pointer to looptab %EXTRINSICINTEGER BACKTARG ;! blocktab index of back target block %EXTRINSICINTEGER BTARGTRIAD;! index of triad within back target block to which new triads chained %EXTRINSICINTEGER OLDBTARGTRIAD %EXTRINSICINTEGER LOOPDEPTH ;! depth of current loop %EXTRINSICINTEGER LOOPENT ;! blocktab index of loop entry block %EXTRINSICINTEGER CURRBLK ;! blocktab index of current block %EXTRINSICINTEGER CURRTRIAD ;! triad index of triad currently being processed %EXTRINSICINTEGER PREVTRIAD ;! previous triad (for rechaining) %EXTRINSICINTEGER ACMNCOORDS;! @ CMNCOORDS %EXTRINSICINTEGER ACURRDEF ;! @ CURRDEF %EXTRINSICINTEGER ASTFNDEF %EXTRINSICINTEGER ARGRISK %EXTRINSICINTEGER VALTEMPHEAD %EXTRINSICINTEGER DESTEMPHEAD %EXTRINSICINTEGER DTINDEX %EXTRINSICINTEGER TEINDEX %EXTRINSICINTEGER TECH %EXTRINSICINTEGER DTCH !* %EXTRINSICINTEGERARRAY CMNCOORDS(0:15) ;! %EXTRINSICINTEGERARRAY CLOOPUSE(0:15) ;! %EXTRINSICINTEGERARRAY PLOOPUSE(0:15) ;! %EXTRINSICINTEGERARRAY DLOOPUSE(0:15) ;! %EXTRINSICINTEGERARRAY CLOOPDEF(0:15) ;! %EXTRINSICINTEGERARRAY PLOOPDEF(0:15) ;! %EXTRINSICINTEGERARRAY DLOOPDEF(0:15) ;! %EXTRINSICINTEGERARRAY CURRDEF(0:15) ;! %EXTRINSICINTEGERARRAY STFNDEF(0:15) !* !*********************************************************************** !* Service procedures * !*********************************************************************** !* %EXTERNALROUTINESPEC BLOCKSFULL ;! to be called when block table exhausted %EXTERNALROUTINESPEC TABSFULL ;! to be called when opt table exhausted %EXTERNALROUTINESPEC DICTFULL ;! to be called when dictionary is full %EXTERNALROUTINESPEC LOOPSFULL ;! to be called when loop table is full !* %EXTERNALINTEGERFNSPEC GETTRIAD %EXTERNALINTEGERFNSPEC ALLDEF(%INTEGER INDEX) %EXTERNALINTEGERFNSPEC NEXTTRIAD %EXTERNALINTEGERFNSPEC NEXTTR %EXTERNALROUTINESPEC UPDATE CURRDEF %EXTERNALROUTINESPEC DELUSE(%INTEGER INDEX) %EXTERNALROUTINESPEC DELUSEX(%INTEGER INDEX) %EXTERNALINTEGERFNSPEC LOOPCON1(%INTEGER INDEX) %EXTERNALINTEGERFNSPEC LOOPCON2(%INTEGER INDEX) %EXTERNALROUTINESPEC TREVERSE(%INTEGER INDEX) %EXTERNALINTEGERFNSPEC BUSYONX(%INTEGER FROMORTO,BLOCK,IDPTR) %EXTERNALROUTINESPEC SETCMNBITS(%INTEGER STRIPADDR) %EXTERNALROUTINESPEC SETARGBITS(%INTEGER BLIND) %EXTERNALROUTINESPEC SETBIT(%INTEGER STRIPADDR,INDEX) %EXTERNALROUTINESPEC PUTBIT(%INTEGER STRIPADDR,INDEX,VAL) %EXTERNALROUTINESPEC CLEARBIT(%INTEGER STRIPADDR,INDEX) %EXTERNALROUTINESPEC GETBIT(%INTEGER STRIPADDR,INDEX,%INTEGERNAME VAL) %EXTERNALINTEGERFNSPEC CONOUT(%RECORD(RESF) R) %EXTERNALINTEGERFNSPEC CONIN(%INTEGER VAL) %EXTERNALINTEGERFNSPEC CONOP(%RECORD(RESF) RL,%INTEGER OP, %RECORD(RESF) RR,%RECORD(RESF)%NAME R) %EXTERNALINTEGERFNSPEC CONVAL(%INTEGER CONST1,CONST2,OP,MODE) %EXTERNALINTEGERFNSPEC CREATETAB(%INTEGER A) %EXTERNALINTEGERFNSPEC CREATEDTAB(%INTEGER A) %EXTERNALROUTINESPEC PRBLOCK(%INTEGER BL) %EXTERNALROUTINESPEC PRBLTRIADS(%INTEGER BL) %EXTERNALROUTINESPEC PRINTBS(%INTEGERARRAYNAME B) %EXTERNALROUTINESPEC PUSHFREE(%INTEGER VAL,%INTEGERNAME LINK) !* !* {%INCLUDE "ftn_optfmts1"} !* !*********************************************************************** !* Optimiser record formats * !*********************************************************************** !* %RECORDFORMAT BLRECF(%BYTEINTEGER FLAGS,DEPTH,%SHORTINTEGER CHAIN, %INTEGER FCON, %INTEGER BCON,BDOM,BTARG,TEXT, %INTEGER CORRUPT,BUB1, %INTEGER USE,DEF,BOE) !* %RECORDFORMAT CONRECF((%INTEGER COUNT %OR %INTEGERARRAY BLOCK(0:1000))) !* %RECORDFORMAT LOOPRECF(%INTEGER BLOCK,DOWN,ACROSS,ST) !* %RECORDFORMAT CLOOPRECF(%INTEGER BLOCK,PDCHAIN,PDBACKCHAIN) !* %RECORDFORMAT PROPRECF(%SHORTINTEGER DEFCT,TEXT,DEFN, %BYTEINTEGER FLAGS,COORD2, %RECORD(RESF) REPL) !* %RECORDFORMAT SREDF(%SHORTINTEGER MODE,IDENT,LOOP,DUMP,INIT, %BYTEINTEGER FLAGS,SPARE1, %SHORTINTEGER USECT,SPARE2, %INTEGER WEIGHT, %INTEGER CHAIN, (%SHORTINTEGERARRAY INCR(1:3),TEST(1:3),USE(1:1000) %C %OR %SHORTINTEGERARRAY ALLREFS(1:1006))) !* !*********************************************************************** !* Constant definitions * !*********************************************************************** !* %CONSTINTEGER USE = 0 ;! variable usage %CONSTINTEGER DEF = 1 ;! !* %CONSTINTEGER TDUMP = 1 ;! dump triads before optimiastion %CONSTINTEGER BDUMP = 2 ;! dump block tables %CONSTINTEGER LDUMP = 4 ;! dump loop tables %CONSTINTEGER T1DUMP = 8 ;! dump triads after OP1 %CONSTINTEGER T2DUMP = 16 ;! dump triads after OP2 %CONSTINTEGER T3DUMP = X'200' ;! dump triads after OP3 %CONSTINTEGER SDUMP = 32 ;! give reconstructed source %CONSTINTEGER S1DUMP = X'800' ;! reconstructed source after OP1 %CONSTINTEGER S2DUMP = X'1000' ;! reconstructed source after OP2 %CONSTINTEGER EDUMP = 64 ;! dump elimination info %CONSTINTEGER CDUMP = X'80' ;! constant elimination %CONSTINTEGER PDUMP = X'100';! proptabs %CONSTINTEGER SEOBDUMP = X'400' ;! dump triads for block after SUBSEOB %CONSTINTEGER SSDUMP = X'2000' ;! trace path through SUBSUM !* %CONSTINTEGER INHIBSUBSUM = 1 %CONSTINTEGER INHIBOP2A = 2 %CONSTINTEGER INHIBEXPOPTS = 4 %CONSTINTEGER INHIBBMOVE = 8 %CONSTINTEGER INHIBEXPELIM = 16 %CONSTINTEGER INHIBSTR = 32 !* %CONSTINTEGER FUNCBIT = X'80' ;! block contains a function call %CONSTINTEGER RETBIT = X'20' ;! block is a procedure return block %CONSTINTEGER LEBIT = X'10' ;! block is a loop entry block %CONSTINTEGER ARTICBIT = X'08' ;! block is an articulation block !* %CONSTINTEGER EBBIT = X'08' ;! entry block marker in label table !* %CONSTINTEGER SOB = X'80' ;! start of block marker in STMT triad %CONSTINTEGER BMBIT = x'80' ;! in TR_OP indicates it has been backward moved %CONSTINTEGER BMBIT OFF = x'7F' ;! mask for deleting BMBIT %CONSTINTEGER BMBIT SHIFT = 7 !* %CONSTINTEGER TESTREPBIT = 2 %CONSTINTEGER REVTESTBIT = 1 %CONSTINTEGER BREGBIT = 4 %CONSTINTEGER SCANDBIT = 8 !* %CONSTINTEGER SRTEMPBIT = 1 %CONSTINTEGER ACTARGBIT = 2 %CONSTINTEGER INITLOADBIT = 4 !* %CONSTINTEGER FROM = 0 ;! param to BUSYONX %CONSTINTEGER TO = 1 ;! ditto %CONSTINTEGER BUSY = 1 %CONSTINTEGER NOT BUSY = 0 !* %CONSTBYTEINTEGERARRAY DEFTEST(0:116)= %C 0(7),1,0(4),1,0(38),5,0,1,0(11),3,4,0(3),6,0,2,0(44);! ASMT,ASGN,FUN,CALL,DARG !* !* %RECORDFORMAT OPTDFMT( %C %INTEGER ADICT ,{ @ of dictionary area} %INTEGER MAXDICT ,{ currect available length of dictionary} %INTEGER ANAMES ,{ @ of name table} %INTEGER ABLOCKS ,{ @ of block table} %INTEGER MAXBLOCKS ,{ current available length of block table area} %INTEGER NEXTBLOCK ,{ next available block index} %INTEGER FREEBLOCKS, %INTEGER CBNPTR ,{ listhead of common block records} %INTEGER SCPTR ,{ listhead of local identifiers} %INTEGER ATABS ,{ @ of area for assorted optimiser tables} %INTEGER MAXTABS ,{ curent available length of opt table area} %INTEGER FREETABS ,{ next free location in opt table area} %INTEGER EXBPTR ,{ exit block table} %INTEGER ENTBPTR ,{ entry block table} %INTEGER ALOOPS ,{ @ loop table area} %INTEGER MAXLOOPS ,{ current available length of loop table area} %INTEGER FREELOOPS ,{ next free location in loop table area} %INTEGER ATRIADS ,{ @ of triad area} %INTEGER LASTTRIAD ,{ last allocated triad index} %INTEGER MAXTRIADS ,{ current available number of triads} %INTEGER FREETRIADS,{ listhead of released triads} %INTEGER BLSIZE ,{ length (in architecture units) of a block entry} %INTEGER BSBITS ,{ length (in bits) of bit string} %INTEGER BSSIZE ,{ length (in architecture units) of a bit strip} %INTEGER BSWORDS ,{ length in 2900 words of a bit strip} %INTEGER OPT ,{ optimisation level 0, 1 or 2} %INTEGER OPTFLAGS ,{ tracing level 1 Triads 2 Blocks 4 Loops } %INTEGER INHIBMASK ,{ inhibits specific optimisations} %INTEGER SRFLAGS ,{ strength reduction diagnostic flags} %INTEGER SRHEAD, %INTEGER SRCH, %INTEGER APROPTABS ,{ @ bsbits * prop table entries} %INTEGER CLOOPHEAD ,{ head of list of all blocks in current loop } %INTEGER PLOOPHEAD ,{ subset of CLOOPHEAD list already processed} %INTEGER DLOOPHEAD ,{ CLOOPHEAD list - PLOOPHEAD list} %INTEGER CLOOPTAIL, %INTEGER PLOOPTAIL, %INTEGER DLOOPTAIL, %INTEGER DLOOPPTR ,{ current DLOOP record} %INTEGER LOOP ,{ current pointer to looptab} %INTEGER BACKTARG ,{ blocktab index of back target block} %INTEGER BTARGTRIAD,{ index of triad within back target block to which new triads chained} %INTEGER OLDBTARGTRIAD, %INTEGER LOOPDEPTH ,{ depth of current loop} %INTEGER LOOPENT ,{ blocktab index of loop entry block} %INTEGER CURRBLK ,{ blocktab index of current block} %INTEGER CURRTRIAD ,{ triad index of triad currently being processed} %INTEGER PREVTRIAD ,{ previous triad (for rechaining)} %INTEGER ACMNCOORDS,{ @ CMNCOORDS} %INTEGER ACURRDEF ,{ @ CURRDEF} %INTEGER ASTFNDEF, %INTEGER ARGRISK, %INTEGER VALTEMPHEAD, %INTEGER DESTEMPHEAD, %INTEGER DTINDEX, %INTEGER TEINDEX, %INTEGER TECH, %INTEGER DTCH) !* ! {%INCLUDE "ftn_consts1"} !* modified 23/09/86 !* !* %constinteger WSCALE = 2;! scale word address to byte address %constinteger BSCALE = 0;! scaling factor for words to architectural units %constinteger CSCALE = 0;! byte offset to architectural unit offset %constinteger DSCALE = 2;! dict pointer scaling in RES records !* %constinteger W1 = 4 ;! 1 word in architectural units %constinteger W2 = 8 ;! 2 words in architectural units %constinteger W3 = 12 ;! 3 words in architectural units %constinteger W4 = 16 ;! 4 words in architectural units !* %constinteger TRIADLENGTH = 12 ;! size of an individual triad %constinteger BLRECSIZE = 44 ;! size of a block table entry in architectural units %constinteger LOOPRECSIZE = 16 ;! size of a loop table entry %constinteger PROPRECSIZE = 12 ;! size of a propagation table entry %constinteger CLOOPSZ = 12 ;! size of cloop table entry %constinteger FRSIZE = 8 ;! size of freelist created by PUSHFREE %constinteger TESZ = 20 %constinteger DTSZ = 20 %constinteger ARTICSZ = 4 %constinteger CTSIZE = 2 ;! used in OP3 %constinteger EXTNSIZE = 4 ;! used in OP3 !* !* following used in strength reduction !* %constinteger RDSZ = 8 %constinteger RUSESZ = 12 %constinteger RTESTSZ = 4 %constinteger RDEFSZ = 16 %constinteger USESZ = 32 %constinteger SRUSESZ = 2 %constinteger SRSCALE = 4;! SR==RECORD(ABLOCKS + SRPTR<MAXBLOCKS %THEN BLOCKSFULL TMPBL==RECORD(ABLOCKS+BLLEN) TMPBL_FLAGS=0 TMPBL_CHAIN=0 TMPBL_FCON=0 TMPBL_BCON=0 TMPBL_BDOM=0 TMPBL_DEPTH=0 TMPBL_BTARG=0 TMPBL_TEXT=0 TMPBL_CORRUPT=0 TMPBL_BUB1=0 TMPBL_USE=BLLEN+BLRECSIZE TMPBL_DEF=BLLEN+BLRECSIZE+BSSIZE TMPBL_BOE=BLLEN+BLRECSIZE+BSSIZE+BSSIZE FILL(BSSIZE*3,ABLOCKS+TMPBL_USE,0,0); ! ZERO BIT STRIPS %END BDUMPTRACE %IF TRACE#0 %START PRINTSTRING("ENTERING BLOCKS"); NEWLINE PRINTSTRING("NO. OF TRIADS ="); WRITE(LASTTRIAD,4); NEWLINE %FINISH BLIND=-1 CURBLK=0 NEWBLFLAG=0 CONNECT=0 ENTBPTR=0 EXBPTR=0 LABCOUNT=0 NEWBLOCK; ! CREATE BLOCK 0 BLADDR=0 BL==RECORD(ABLOCKS) ; ! INTIALISE BLOCK 0 BL_TEXT=0 TLEN=BSBITS*PROPRECSIZE; ! CALCULATE LENTGH OF PROPTAB %IF TLEN>MAXTABS %THEN TABSFULL FILL(TLEN,ATABS,0,0); ! ZERO PROPTAB FREETABS=TLEN; ! SET NEXT FREE LOCATION IN ATABS CON==RECORD(ATABS+FREETABS); ! SET UP CONNECTION LIST FOR BLOCK 0(DUMMY) IND=1 %CYCLE TR==RECORD(ATRIADS+IND*TRIADLENGTH) %IF SETUSE(TR_OP)&1=1 %THENSTART %unless Tr_Op=CVT %and Tr_Qopd1#0 %then TR_USE=1; ! SET USE BIT IF APPROPRIATE %FINISH OLDIND=IND; ! SAVE IND FOR SETTING TEXT FIELD OF BL IND=TR_CHAIN; ! GET IND OF NEXT TRIAD ->SWTR(TR_OP) SWTR(STMT): %IF TR_VAL2<2 %START LAB==RECORD(TR_OPD2<STMT2 %REPEAT LABCOUNT=LABCOUNT+1 %IF FREETABS+LABCOUNT<MAXTABS %THEN TABSFULL CON_BLOCK(LABCOUNT)=CURBLK PUSHFREE(LASTBLK,BL_BCON);! BACKWARD CONNECTION FROM CURBLK TO LASTBLK %FINISHELSE CONNECT=1; ! SET CONNECT FLAG AS DEFAULT STMT2: CON_COUNT=LABCOUNT FREETABS=FREETABS+(LABCOUNT+1)<MAXTABS %THEN TABSFULL LABCOUNT=0 CON==RECORD(ATABS+FREETABS) %IF TRACE#0 %THEN %START PRBLHEAD(LASTBLK) PRBL==RECORD(ABLOCKS+LASTBLK*BLSIZE) PRINTSTRING("BLOCK FOLLOWING ");WRITE(PRBL_CHAIN,1);NEWLINE PRINTSTRING("IST TRIAD OF BLOCK ");WRITE(PRBL_TEXT,1);NEWLINE PRINTSTRING("ADDRESS OF BIT STRIP RELATIVE TO START OF BLOCK TABLE ") WRITE(PRBL_USE,1) NEWLINES(2) %FINISH %IF NEWBLFLAG=0 %AND LAB_X1&EBBIT=EBBIT %START PUSHFREE(0,BL_BCON) PUSHFREE(BLIND,ENTBPTR) %FINISH %ELSE NEWBLFLAG=0 %CONTINUE SWTR(JIT): SWTR(JIF): NEWBLFLAG=1 SWTR(JINN): SWTR(JINP): SWTR(JINZ): SWTR(JIN): SWTR(JIP): SWTR(JIZ): LAB==RECORD(TR_OPD2< J2 %REPEAT TMPBL==RECORD(ABLOCKS+LAB_BLKIND*BLSIZE) %FINISH LABCOUNT=LABCOUNT+1 %IF FREETABS+LABCOUNT<MAXTABS %THEN TABSFULL %AND %C CON==RECORD(ATABS+FREETABS) CON_BLOCK(LABCOUNT)=LAB_BLKIND PUSHFREE(CURBLK,TMPBL_BCON) J2: %IF TR_USE=1 %THEN NEWBLFLAG=1 %AND TR_USE=0 %CONTINUE SWTR(GOTO): CONNECT=0 %IF TR_QOPD1=LABID %OR TR_QOPD1=PLABID %START LAB==RECORD(TR_OPD1<JMP1 %FINISH NEXTLAB=GTOLABPTR GOTO1: %IF TR_QOPD1&IDMASK=IDMASK %THEN SETBITS(TR_RES1,BLADDR,USE,OLDIND) %WHILE NEXTLAB#0 %CYCLE GTOLABS==RECORD(NEXTLAB+ADICT) LAB==RECORD(ADICT+GTOLABS_INF0) %IF LAB_X0&8=0 %THENSTART;! not a format label %IF LAB_BLKIND=0 %START NEWBLOCK LAB_BLKIND=BLIND %FINISHELSESTART !CHECK IF ALREADY ON FCON LIST %CYCLE I=1,1,LABCOUNT %IF CON_BLOCK(I)=LAB_BLKIND %THEN ->GOTO2 %REPEAT TMPBL==RECORD(ABLOCKS+LAB_BLKIND*BLSIZE) %FINISH LABCOUNT=LABCOUNT+1 %IF FREETABS+LABCOUNT<MAXTABS %THEN TABSFULL %AND %C CON==RECORD(ATABS+FREETABS) CON_BLOCK(LABCOUNT)=LAB_BLKIND PUSHFREE(CURBLK,TMPBL_BCON) GOTO2: %FINISH NEXTLAB=GTOLABS_LINK1 %REPEAT NEWBLFLAG=1 %CONTINUE SWTR(CGT): NEXTLAB=TR_OPD2<GOTO1 SWTR(STOP): NEWBLFLAG=1 CONNECT=0 LABCOUNT=0 %CONTINUE SWTR(RET): BL_FLAGS=BL_FLAGS!RETBIT %IF TR_QOPD1&IDMASK=IDMASK %THEN SETBITS(TR_RES1,BLADDR,USE,OLDIND) LABCOUNT=1 %IF FREETABS+1<MAXTABS %THEN TABSFULL %AND %C CON==RECORD(ATABS+FREETABS) CON_BLOCK(1)=0 PUSHFREE(BLIND,EXBPTR) SETARGBITS(BLIND) CONNECT=0 NEWBLFLAG=1 %CONTINUE SWTR(ARGARR): %IF TR_QOPD1&IDMASK=IDMASK %THEN SETBITS(TR_RES1,BLADDR,USE,OLDIND) SWTR(ASMT): SWTR(DARR): ; ! SWTR(DEFARR): %IF TR_QOPD2&IDMASK=IDMASK %THEN SETBITS(TR_RES2,BLADDR,USE,OLDIND) %IF TR_QOPD1&IDMASK=IDMASK %THEN SETBITS(TR_RES1,BLADDR,DEF,OLDIND) %CONTINUE SWTR(CVT): %IF TR_QOPD2&IDMASK=IDMASK %THEN SETBITS(TR_RES2,BLADDR,USE,OLDIND) %CONTINUE SWTR(ASGN): SWTR(DCHAR): %IF TR_QOPD1&IDMASK=IDMASK %THEN SETBITS(TR_RES1,BLADDR,DEF,OLDIND) %CONTINUE SWTR(ARR): %IF TR_QOPD1&IDMASK=IDMASK %THEN SETBITS(TR_RES1,BLADDR,USE,OLDIND) %IF TR_QOPD2&IDMASK=IDMASK %THEN SETBITS(TR_RES2,BLADDR,USE,OLDIND) %CONTINUE SWTR(ADD): SWTR(MULT): SWTR(GT): SWTR(LT): SWTR(NE): SWTR(EQ): SWTR(GE): SWTR(LE): TREVERSE(OLDIND); ! PUT OPERANDS IN CORRECT ORDER SWTR(NINT): SWTR(ANINT): SWTR(TOCHAR): SWTR(DIM): SWTR(DMULT): SWTR(AINT): SWTR(ABS): SWTR(MOD): SWTR(SIGN): SWTR(MIN): SWTR(MAX): SWTR(REALL): SWTR(IMAG): SWTR(CMPLX): SWTR(DCMPLX): SWTR(CONJG): SWTR(LEN): SWTR(ICHAR): SWTR(CHIND): SWTR(SUB): SWTR(DIV): SWTR(EXP): SWTR(AND): SWTR(OR): SWTR(EQUIV):SWTR(NEQ): SWTR(SUBSTR): %IF TR_QOPD2&IDMASK=IDMASK %THEN SETBITS(TR_RES2,BLADDR,USE,OLDIND) SWTR(NEG): SWTR(NOT): SWTR(CHAR): SWTR( ARG): %IF TR_QOPD1&IDMASK=IDMASK %THEN SETBITS(TR_RES1,BLADDR,USE,OLDIND) %CONTINUE SWTR(DARG): %IF TR_QOPD1&IDMASK=IDMASK %THEN SETBITS(TR_RES1,BLADDR,USE,OLDIND) %IF TR_QOPD1&IDMASK=IDMASK %THEN SETBITS(TR_RES1,BLADDR,DEF,OLDIND) %CONTINUE SWTR(FUN): SWTR(SUBR): BL_FLAGS=BL_FLAGS!FUNCBIT SETCMNBITS(ABLOCKS+BL_USE) SETCMNBITS(ABLOCKS+BL_DEF) SETCMNBITS(ABLOCKS+BL_BOE) %CONTINUE SWTR(STRTIO): %IF TR_OPD1=3 %THEN LDIO=1 %ELSE LDIO=0 %CONTINUE SWTR(IOSPEC): %IF TR_QOPD2<4 %START %IF TR_QOPD1&IDMASK=IDMASK %THENSTART %IF TR_MODE=CHARMODE %THEN SETBITS(TR_RES1,BLADDR,DEF,OLDIND) SETBITS(TR_RES1,BLADDR,USE,OLDIND) %FINISH %CONTINUE %FINISH %IF TR_QOPD2>5 %START %IF TR_QOPD1&IDMASK=IDMASK %THEN ->SWTR(DARG);! to set use and def bits %CONTINUE %FINISH LAB==RECORD(TR_OPD1<MAXTABS %THEN TABSFULL %AND %C CON==RECORD(ATABS+FREETABS) CON_BLOCK(LABCOUNT)=LAB_BLKIND PUSHFREE(CURBLK,TMPBL_BCON) NEWBLFLAG=1 %CONTINUE SWTR(IOITEM): ;! WRITE %IF TR_QOPD1&IDMASK=IDMASK %THEN SETBITS(TR_RES1,BLADDR,USE,OLDIND) %CONTINUE SWTR(DIOITEM): ; ! READ %IF TR_QOPD1&IDMASK=IDMASK %THENSTART SETBITS(TR_RES1,BLADDR,DEF,OLDIND) %IF LDIO=1 %THEN SETBITS(TR_RES1,BLADDR,USE,OLDIND) %FINISH %CONTINUE SWTR(IO): %IF LABCOUNT>0 %THEN NEWBLFLAG=1 %CONTINUE SWTR(IODO): %CONTINUE SWTR(EOT): %EXIT SWTR(INTRIN): SWTR(IFUN): SWTR(*): %IF TRACE#0 %START PRINTSTRING("TRIAD WITH OPERAND, ") WRITE(TR_OP,4) PRINTSTRING(", NOT DEALT WITH") NEWLINE %FINISH %CONTINUE %REPEAT %UNTIL IND=0; ! END OF IST CYCLE TO SET UP BLOCKS ! ! FINISH SETTING FIELDS OF LAST BLOCK BL_FCON=FREETABS CON_COUNT=LABCOUNT FREETABS=FREETABS+(LABCOUNT+1)<MAXTABS %THEN TABSFULL %AND %C CON==RECORD(ATABS+FREETABS) BL_CHAIN=0 %IF TRACE#0 %THENSTART PRBLHEAD(CURBLK) PRBL==RECORD(ABLOCKS+CURBLK*BLSIZE) PRINTSTRING("BLOCK FOLLOWING ");WRITE(PRBL_CHAIN,1);NEWLINE PRINTSTRING("1ST TRIAD OF BLOCK ");WRITE(PRBL_TEXT,1);NEWLINE PRINTSTRING("ADDRESS OF BIT STRIP RELATVIE TO START OF BLOCK TABLE ") WRITE(PRBL_USE,1) NEWLINES(2) %FINISH ! BL==RECORD(ABLOCKS); ! GET NULL BLOCK BL_BCON=0; ! SET BCON OF NULL BLOCK BL_FCON=0; ! SET FCON OF NULL BLOCK ! ! SET UP ENTRY BLOCK TABLE ENTBTAB==ARRAY(ATABS+FREETABS,TABF) I=1 %WHILE ENTBPTR#0 %CYCLE BLKS==RECORD(ADICT+ENTBPTR) %IF FREETABS+I<MAXTABS %THEN TABSFULL %AND %C ENTBTAB==ARRAY(ATABS+FREETABS,TABF) ENTBTAB(I)=BLKS_INF0 I=I+1 ENTBPTR=BLKS_LINK1 %REPEAT ENTBPTR=FREETABS FREETABS=FREETABS+I<MAXTABS %THEN TABSFULL %AND %C ENTBTAB==ARRAY(ATABS+FREETABS,TABF) ENTBTAB(0)=I-1 ! ! SET UP EXIT BLOCK TABLE EXBTAB==ARRAY(ATABS+FREETABS,TABF) I=1 %WHILE EXBPTR#0 %CYCLE BLKS==RECORD(ADICT+EXBPTR) %IF FREETABS+I<MAXTABS %THEN TABSFULL %AND %C EXBTAB==ARRAY(ATABS+FREETABS,TABF) EXBTAB(I)=BLKS_INF0 I=I+1 EXBPTR=BLKS_LINK1 %REPEAT EXBPTR=FREETABS FREETABS=FREETABS+I<MAXTABS %THEN TABSFULL %AND %C EXBTAB==ARRAY(ATABS+FREETABS,TABF) EXBTAB(0)=I-1 ! ! CYCLE THRO' BLOCKS FROM ENTRY BLOCKS TO DETERMINE WHICH BLOCKS ! CONTROL CAN NEVER REACH %CYCLE I=1,1,ENTBTAB(0) SETENTBIT(ENTBTAB(I)) %REPEAT ! ! NOW CYCLE THRO' BLOCKS LOOKING FOR THOSE WHICH HAVE NEVER BEEN REACHED %CYCLE I=1,1,BLIND BL==RECORD(ABLOCKS+I*BLSIZE) %IF BL_FLAGS&ENTBIT=0 %THEN ELIMBCON(I) %ELSE %C BL_FLAGS=BL_FLAGS&ENTBITOFF %REPEAT ! ! CYCLE THRO' BLOCKS TO SET UP BACK CONNECTION LISTS %CYCLE I=1,1,BLIND CON==RECORD(ATABS+FREETABS) LABCOUNT=0 BL==RECORD(ABLOCKS+I*BLSIZE) NEXTLAB=BL_BCON %WHILE NEXTLAB#0 %CYCLE LABCOUNT=LABCOUNT+1 BLKS==RECORD(ADICT+NEXTLAB) NEXTLAB=BLKS_LINK1 CON_BLOCK(LABCOUNT)=BLKS_INF0 %REPEAT BL_BCON=FREETABS CON_COUNT=LABCOUNT %IF LABCOUNT>0 %THEN BL_BDOM=CON_BLOCK(1) FREETABS=FREETABS+(LABCOUNT+1)<MAXTABS %THEN TABSFULL %AND %C BCON==RECORD(ATABS+BL_BCON) NEWBCON==RECORD(ATABS+FREETABS) J=1 %FOR I=1,1,BCON_COUNT %CYCLE %FOR K=1,1,LPPTR(0) %CYCLE %IF BCON_BLOCK(I)=LPPTR(K) %THEN -> NOCOPY %REPEAT NEWBCON_BLOCK(J)=BCON_BLOCK(I) J=J+1 %UNLESS BCON_BLOCK(I)=0 {A PROGRAM ENTRY BLOCK} %START TMPBL==RECORD(ABLOCKS+BCON_BLOCK(I)*BLSIZE) ! search for label connecting to BLCUR thro' triads of TMPBL block TT==RECORD(ATRIADS+TMPBL_TEXT*TRIADLENGTH) %CYCLE %IF TT_OP=GOTO %THENSTART %IF TT_QOPD1&IDMASK#0 %THEN %RESULT=0; ! CAN'T INSERT NEW LABEL FOR ASSIGNED GOTO ->NEWLAB; ! OTHERWISE LABEL MUST ALWAYS MATCH THAT OF BLCUR %FINISH %IF TT_OPCGT %THEN ->NEXTOP %IF TT_OP=CGT %THENSTART LABS=TT_OPD2<NEXTOP %FINISH ->NEWLAB NEXTOP: TT==RECORD(ATRIADS+TT_CHAIN*TRIADLENGTH) %REPEAT %UNTIL TT_OP=STMT %AND TT_USE&SOB#0 ->NOMATCH NEWLAB: %IF LABEL_W=NULL %THENSTART LABEL_W=GETPLABDICT MTCHLAB==RECORD(ADICT+LABEL_H0<MAXBLOCKS %THEN BLOCKSFULL NEWBL==RECORD(BLADDR+ABLOCKS) %IF TRACE#0 %START PRINTSTRING("BLOCK"); WRITE(NEXTBLOCK,1) PRINTSTRING(" GENERATED FOR BACK TARGET OF LOOP"); NEWLINE %FINISH NEWBL_BCON=I %FOR I=1,1,NEWBCON_COUNT %CYCLE TMPBL==RECORD(ABLOCKS+NEWBCON_BLOCK(I)*BLSIZE) FCON==RECORD(ATABS+TMPBL_FCON) %FOR K=1,1,FCON_COUNT %CYCLE %IF FCON_BLOCK(K)=BLCUR %THEN %EXIT %REPEAT FCON_BLOCK(K)=NEXTBLOCK %IF TRACE#0 %START PRINTSTRING("NEW FORWARD CONNECTION TO BLOCK") WRITE(NEXTBLOCK,1) PRINTSTRING(" FROM BLOCK"); WRITE(NEWBCON_BLOCK(I),1) NEWLINE %FINISH %REPEAT %IF TRACE#0 %AND LABEL_W #NULL %THENSTART PRINTSTRING("NEW PRIVATE LABEL CREATED FOR GENERATED BLCOK") NEWLINE %FINISH BDOMBL==RECORD(ABLOCKS+BL_BDOM*BLSIZE) NEWBL_BDOM=BL_BDOM NEWBL_FLAGS=0 NEWBL_CHAIN=0 NEWBL_CORRUPT=0 NEWBL_BUB1=0 NEWBL_DEPTH=BDOMBL_DEPTH NEWBL_BTARG=BDOMBL_BTARG NEWBL_USE=BLADDR+BLRECSIZE NEWBL_DEF=BLADDR+BLRECSIZE+BSSIZE NEWBL_BOE=BLADDR+BLRECSIZE+BSSIZE+BSSIZE FILL(BSSIZE*3,ABLOCKS+NEWBL_USE,0,0); ! ZERO BIT STRIP BCON_COUNT=LPPTR(0)+1 BCON_BLOCK(I)=LPPTR(I) %FOR I=1,1,LPPTR(0) BCON_BLOCK(I+1)=NEXTBLOCK %IF FREETABS+2<MAXTABS %THEN TABSFULL NEWBL_FCON=FREETABS FCON==RECORD(ATABS+FREETABS) FCON_COUNT=1 FCON_BLOCK(1)=BLCUR FREETABS=FREETABS+2<SKIP1 %REPEAT RWEND=RWEND+1 RW(RWEND)=NEWBL ; ! ADD FORWARD CONNECTIONS TO RW TMPBL==RECORD(ABLOCKS+NEWBL*BLSIZE) TMPBL_BDOM=BLCUR; ! FIRST GUESS AT BDOM ! FCON ALWAYS DOMINATED BY BLCUR HERE SKIP1: ; ! JUMP TO HERE IF NEWBL ALREADY ON RW %REPEAT ! DETERMINE BACK DOM & TARG OF BLCUR AND COLLECT LOOP INFO POSLEB=0 CON==RECORD(ATABS+BL_BCON); ! BACK CONNECTIONS OF BLCUR %IF CON_COUNT>1 %START NEWBL=BLCUR RXEND=0 %WHILE NEWBL#0 %CYCLE ; ! FORM BACK DOM CHAIN ON RX TMPBL==RECORD(ABLOCKS+NEWBL*BLSIZE) NEWBL=TMPBL_BDOM RXEND=RXEND+1 RX(RXEND)=NEWBL %REPEAT %IF TRACE#0 %START PRINTSTRING("BACK DOMINATOR CHAIN FROM CURRENT BLOCK IS") PRINTRX %FINISH RXPTR=1 BDOM=1 ! CHECK BC PATHS FROM BLCUR TO DETERMINE BACK DOM ! & CHECK IF BLOCK IS POSS. LOOP ENTRY %IF TRACE#0 %START PRINTSTRING("CHECK BC PATHS") PRINTSTRING(" TO DETERMINE IF POSSIBLE LOOP ENTRY BLOCK") NEWLINE %FINISH RZEND=0 LPCNT=0; ! intialise loop count %FOR IND=1,1,CON_COUNT %CYCLE; ! PROCESS EACH BCON RZEND=RZEND+1 RZ(RZEND)=CON_BLOCK(IND) ; ! ADD BACK CON OF BLCUR TO RZ %IF TRACE#0 %START PRINTSTRING("CURRENT BCON IS BLOCK") WRITE(RZ(RZEND),1) NEWLINE %FINISH RZPTR=RZEND-1 TMPRZ=RZEND POSLEB=1 %CYCLE; ! PROCESS CURRENT RZ ENTRY TO FIND BACK DOM ! & CHECK FOR POSSIBLE LOOPS RZPTR=RZPTR+1 BCON=RZ(RZPTR) %IF BCON=0 %START BDOM=RXEND; ! POINT BDOM TO NULL RX ENTRY POSLEB=0 %EXIT %FINISH ! SEARCH RX TO DETERMINE IF BCON IS A MEMEBER OF BACK DOM CHAIN %FOR I=1,1,RXEND %CYCLE %IF BCON=RX(I) %THEN ->SKIP2 %REPEAT %IF BCON#BLCUR %START; ! I.E. IF NOT BACK AT START TMPBL==RECORD(ABLOCKS+BCON*BLSIZE) TMPCON==RECORD(ATABS+TMPBL_BCON) %FOR I=1,1,TMPCON_COUNT %CYCLE ! ADD BCS OF BCON TO RZ IF NOT ALREADY PRESENT %FOR J=1,1,RZEND %CYCLE %IF RZ(J)=TMPCON_BLOCK(I) %THEN ->SKIP3 %REPEAT RZEND=RZEND+1 RZ(RZEND)=TMPCON_BLOCK(I); ! ADD BACK CON OF BCON TO RZ %CONTINUE SKIP3: %IF J < TMPRZ %THEN POSLEB=0 %REPEAT %FINISH %CONTINUE SKIP2: ; !JUMP HERE IF BCON IS MEMBER OF BACK DOM CHAIN %IF I>BDOM %THEN BDOM=I POSLEB=0 %REPEAT %UNTIL RZPTR=RZEND; ! END OF PROCESSING CURRENT RZ ENTRY %IF TRACE#0 %START PRINTSTRING("BACK CONNECTION LISTS FROM CURRENT BLOCK:-") PRINTRZ PRINTSTRING("INDEX OF ENTRIES FOR CURRENT BCON IS") WRITE(TMPRZ,1) NEWLINE %FINISH %IF POSLEB=1 %START BL_FLAGS=BL_FLAGS!LEBIT LPCNT=LPCNT+1 LPPTR(LPCNT)=RZ(TMPRZ); ! REMEMBER BLOCK LEADING INTO LOOP FOR GENBLOCK %IF TRACE#0 %THENSTART PRINTSTRING("BLOCK IS A POSSIBLE LOOP ENTRY BLOCK FROM BLOCK") WRITE(RZ(TMPRZ),1) NEWLINE %FINISH %FINISH %REPEAT; ! END OF BC PATHS CHECK LPPTR(0)=LPCNT; ! save no. of loops BL_BDOM=RX(BDOM) %FINISH; ! END OF BACK DOM & TARG DETERMINATION & LOOP INFO COLLECTION %IF TRACE#0 %START PRINTSTRING("BACK DOMINATOR OF CURRENT BLOCK IS") WRITE(BL_BDOM,1) NEWLINE %FINISH %IF BL_FLAGS&LEBIT=LEBIT %START TMPBL==RECORD(ABLOCKS+BL_BDOM*BLSIZE); ! GET BDOM BLOCK ! ??? CAN A PROGRAM ENTRY BLOCK EVER BE A LOOP ENTRY BLOCK ??? %IF TMPBL_FCON#0 {NULL BLOCK} %START CON==RECORD(ATABS+TMPBL_FCON); ! FORWARD CONNECTIONS OF BL_BDOM %IF CON_COUNT>1 %THEN BL_FLAGS=BL_FLAGS&X'EF' %AND %C ->LLLL{ I=GENBLOCK}; ! generate back target block %FINISH %ELSE ->LLLL{I=GENBLOCK} ! %IF I=0 %THEN ->LLLL; ! new block hasn't been generated BTARG=BL_BDOM DEPTH=TMPBL_DEPTH+1 %IF TRACE#0 %START PRINTSTRING("CURRENT BLOCK IS A POSSIBLE LOOP ENTRY BLOCK") NEWLINE PRINTSTRING("BACK TARGET IS") WRITE(BTARG,1) NEWLINE PRINTSTRING("DEPTH IS") WRITE(DEPTH,1) NEWLINE %FINISH ! SET DEPTH & BTARG FOR ALL MEMBERS OF LOOP RX(1)=BTARG RX(2)=BLCUR RXPTR=2 RXEND=2 %IF TRACE#0 %START PRINTSTRING("SET DEPTH & BTARG FIELDS OF FOLLOWING BLOCKS TO") WRITE(DEPTH,1) WRITE(BTARG,1) PRINTSTRING(" RESPECTIVELY") NEWLINE %FINISH %WHILE RXPTR<=RXEND %CYCLE BLPTR=RX(RXPTR) %IF TRACE#0 %THEN WRITE(BLPTR,1) TMPBL==RECORD(ABLOCKS+BLPTR*BLSIZE) TMPBL_DEPTH=DEPTH TMPBL_BTARG=BTARG CON==RECORD(ATABS+TMPBL_BCON) %FOR IND=1,1,CON_COUNT %CYCLE %FOR I=1,1,RXEND %CYCLE %IF CON_BLOCK(IND)=RX(I) %THEN ->SKIP5 %REPEAT RXEND=RXEND+1 RX(RXEND)=CON_BLOCK(IND) SKIP5: %REPEAT RXPTR=RXPTR+1 %REPEAT; ! END OF SETTING DEPTH & BTARG %IF TRACE#0 %THEN NEWLINE ! SET UP LOOPTAB ENTRY FOR BLCURRENT %IF FREELOOPS+4<MAXLOOPS %THEN LOOPSFULL NEWLOOP=FREELOOPS LOOPENT==RECORD(ALOOPS+FREELOOPS) ; ! CREATE LOOPTAB ENTRY FREELOOPS=FREELOOPS+4<1 ! FIND NEAREST LOOP ENTRY BLOCK IN BDC WHICH IS AT NEXT LEVEL UP TMPBL==RECORD(ABLOCKS+BLCUR*BLSIZE) %CYCLE BLPTR=TMPBL_BDOM TMPBL==RECORD(ABLOCKS+BLPTR*BLSIZE) %IF TMPBL_FLAGS&LEBIT=LEBIT %AND TMPBL_DEPTH=DEPTH-1 %THEN %EXIT %REPEAT ! SEARCH LOOPTAB FOR ENTRY WHICH CORRESPONDS TO BLPTR %FOR IND=0,4<