! 01/02/83 - EELIMV4 -LINE 960, DO DEFTEST CHECK BEFORE CALLING UPDATECURRDEF ! 31/07/83 - EELIMV3 - DELETE LINES 960-966 AND CALL UPDATE CURRDEF ! - INSERT AT LINE 610, REPL TRIAD POINTS TO ARREL WHERE NECESSARY {30/12/82 - allow for intrinsic triads} %INCLUDE "ERCS06.OPT_SPECS" %INCLUDE "ERCS06.PERQ_TRIADOPS" %OWNINTEGER ELFLAG,ELIMEND,RWFLAG,HVAL %OWNINTEGER COORD1,COORD2,MODE,MATCH ! ARRAY FOR TRIADS WHICH MAY BE ELIMINATION CANDIDATES %CONSTBYTEINTEGERARRAY TRELIM(0:114) = 0,0,1,1,1,1,1,0,1,1, 0,0,0,0,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,1,1,0,1,0,0,0,0, 0,0,0,0,0,0,0,1,0,0, 0,0,0,0,0,0,0,1,0,0, 0,1,0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0 %ROUTINE CREATETABLE(%INTEGER LEN,%INTEGERNAME TADDR) ! CREATE A TABLE ENTRY OF LEN BYTES AND RETURN ADDRESS IN TADDR TABSFULL %IF FREETABS+LEN>MAXTABS TADDR=FREETABS FREETABS=FREETABS+LEN %END; ! CREATETABLE ! %EXTERNALROUTINE SETBIT(%INTEGER BSADDR,COORD) ! SET BIT DETERMINED BY COORD IN ARRAY WITH ADDRESS BSADDR !%INTEGER WORD,BIT !%INTEGERARRAYNAME BS !WORD=(COORD*X'FFF0')>>4 !BIT=X'80000000'>>(COORD&X'F') !BS==ARRAY(BSADDR,TABF) !BS(WORD)=BS(WORD)!BIT !%END; ! SETBIT !%EXTERNALROUTINE GETBIT(%INTEGER BSADDR,COORD, %INTEGERNAME RES) ! IF BIT(DETERMINED BY COORD) SET IN ARRAY WITH ADDRESS BSADDR, ! SET RES TO 1 ELSE 0 !%INTEGER WORD,BIT !%INTEGERARRAYNAME BS !WORD=(COORD&X'FFF0')>>4 !BIT=X'80000000'>>(COORD&X'F') !BS==ARRAY(BSADDR,TABF) !%IF BS(WORD)&BIT=BIT %THEN RES=1 %ELSE RES=0 !%END; ! GETBIT %INTEGERFUNCTION HASH ! CALCULATE HASH VALUE OF CURRENT TRIAD(TR) %RECORD(TRIADF)%NAME TR %INTEGER RES TR==RECORD(ATRIADS+CURRTRIAD*TRIADLENGTH) RES=(TR_OPD1!!TR_OPD2!!TR_OP)&X'1F' %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("HASH VALUE FOR CURRENT TRIAD IS") WRITE(RES,4) NEWLINE %FINISH %RESULT=RES %END; ! HASH %ROUTINE SETCOORDS ! SETUP COORD1,COORD2 & MODE %RECORD(TRIADF)%NAME TR,MTR %RECORD(PRECF)%NAME DENT TR==RECORD(ATRIADS+CURRTRIAD*TRIADLENGTH) %IF TR_OP&BMBITOFF=CVT %THEN MODE=TR_MODE %ELSE MODE=-1 COORD2=-1 %IF TR_QOPD1&IDMASK=IDMASK %START ! CHECK FOR ARR & DEFARR TRIADS & GET COORD FOR THEIR BASE ARRAY %IF (TR_OP&BMBITOFF=ARR %OR TR_OP&BMBITOFF=DEFARR) %AND %C TR_QOPD1&TEXTMASK=TEXTMASK %START MTR==RECORD(ATRIADS+TR_OPD1*TRIADLENGTH) DENT==RECORD(MTR_OPD1<0 %START ; ! DEFS ARE POSSIBLE ! CHECK IF EITHER COORD DEFINED IN CURBL %IF CURBLDEF=1 %THEN %RETURN; ! DEF. OCCURS - ELIMINATION NOT POSSIBLE %FINISH %IF RWFLAG=0 %START; ! SET UP RW TO CONTAIN BDC OF CURBLK %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("SET UP RW TO CONTAIN BDC OF CURRBLK");NEWLINE %FINISH RWFLAG=1 DL==RECORD(ATABS+DLOOPPTR) CNT=1; ! INITIALISE COUNT FOR ELIMTAB INDEX BD=CBL_BDOM; ! GET BDOM OF CURBLK %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("BDOM IS");WRITE(BD,1);NEWLINE PRINTSTRING("BACKTARG IS"); WRITE(BACKTARG,1);NEWLINE %FINISH %WHILE BD#BACKTARG %CYCLE; ! CYCLE UNTIL BDOM IS OUTSIDE THE LOOP BDBL==RECORD(ABLOCKS+BD*BLSIZE); ! GET BDOM BLOCK %IF BDBL_DEPTH=LOOPDEPTH %START; ! BDOM IS A MEMBER OF THIS LOOP CREATETABLE(2<NEXT1; ! MATCH FOUND I=MTR_CHAIN MTR==RECORD(ATRIADS+I*TRIADLENGTH) %REPEAT %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("NO MATCH - CONTINUE SCAN");NEWLINE %FINISH ->NOMATCH; ! NO MATCH - SCAN NEXT RW ENTRY NEXT1: ! HERE IF TRIAD MATCH FOUND - CHECK FOR CVT TRIAD %IF MODE#-1 %START %IF TR_MODE2#MTR_MODE2 %START; ! NOT A MATCH I=MTR_CHAIN MTR==RECORD(ATRIADS+I*TRIADLENGTH) ->MATCH1; ! CONTINUE CYCLE TO LOOK FOR MATCH %FINISH %FINISH MATCH=I MBLK=RW_BL %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("MATCH FOUND WITH TRIAD"); WRITE(MATCH,4) PRINTSTRING(" IN BLOCK"); WRITE(MBLK,4);NEWLINE %FINISH ! MATCH FOUND - NOW CHECK IF DEFS. POSSIBLE %IF COORD1#-1 %START; ! DEFS. POSSIBLE %IF BLDEF(MBLK)=1 %START; ! DEF. OCCURS IN MATCHED BLOCK(MBLK) %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("DEFS. OCCUR IN MATCHED BLOCK"); NEWLINE %FINISH ! CHECK FOR DEFS. BETWEEN MATCH & EOB %CYCLE I=MTR_CHAIN MTR==RECORD(ATRIADS+I*TRIADLENGTH) %IF MTR_USE&SOB=SOB %THEN %EXIT; ! NO DEFS. FOUND IN MATCHED BLOCK %IF TRDEF(I)=0 %THEN %CONTINUE; ! NO DEFS - CHECK NEXT TRIAD LOOP1: %CYCLE; ! DEF. FOUND - LOOK FOR ANOTHER MATCH %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("DEF. FOUND - LOOF FOR ANOTHER MATCH");NEWLINE %FINISH I=MTR_CHAIN MTR==RECORD(ATRIADS+I*TRIADLENGTH) %IF MTR_USE&SOB=SOB %THEN ->NOMATCH; ! NO MATCH - SCAN NEXT RW ENTRY %IF MATCHTR(I)=1 %THEN %EXIT; ! MATCH FOUND - EXIT CYCLE %REPEAT %IF MODE#-1 %START; ! CVT TRIAD - CHECK MODES %IF MTR_MODE2#TR_MODE %THEN ->LOOP1; ! NOT A MATCH - CYCLE %FINISH MATCH=I; ! SET NEW MATCH %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("NEW MATCH WITH TRIAD");WRITE(MATCH,4);NEWLINE %FINISH %REPEAT; ! END OF CYCLE TO LOOK FOR DEFS. IN MATCHED BLOCK %FINISH ! HERE IF NO RELEVANT DEFS. FOUND IN MATCHED BLOCK ! CHECK FOR DEFS. BETWEEN MATCHED BLOCK& CURBLK(CBL) %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("CHECK FOR DEFS. BETWEEN MATCHED BLOCK & CURRBLK") NEWLINE PRINTSTRING("PUT BCS OF CURBLK ON RX") NEWLINE %FINISH BCON==RECORD(ATABS+CBL_BCON) RX==ARRAY(ATABS+FREETABS,TABF) RXEND=0 ! PUT BCS OF CURBLK ON RX %FOR I=1,1,BCON_COUNT %CYCLE %IF BCON_BLOCK(I)#MBLK %THEN RXEND=RXEND+1 %AND %C RX(RXEND)=BCON_BLOCK(I) %REPEAT RXPTR=1 %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("RX CONTAINS ") %FOR I=1,1,RXEND %CYCLE; WRITE(RX(I),1); %REPEAT NEWLINE %FINISH ! SCAN RX %WHILE RXPTR<=RXEND %CYCLE %IF BLDEF(RX(RXPTR))=1 %THEN ->NOELIM; ! DEF. FOUND - ELIM. NOT POSS. ! ADD BCS OF RX(RXPTR) TO RX UNLESS ALREADY PRESENT RXBL==RECORD(ABLOCKS+RX(RXPTR)*BLSIZE) BCON==RECORD(ATABS+RXBL_BCON) %FOR I=1,1,BCON_COUNT %CYCLE %IF BCON_BLOCK(I)=MBLK %THEN %CONTINUE %FOR J=1,1,RXEND %CYCLE %IF RX(J)=BCON_BLOCK(I) %THEN ->NEXT2 %REPEAT RXEND=RXEND+1 RX(RXEND)=BCON_BLOCK(I) NEXT2: %REPEAT RXPTR=RXPTR+1 %REPEAT %FINISH; ! END OF CHECKING FOR POSS. DEFS. !HERE IF NO DEFS. BETWEEN TRIADS ELIMINATE %RETURN; ! TERMINATE CHECKOUT NOELIM: ! HERE IF DEF. FOUND %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("DEF. FOUND - ELIMINATION NOT POSSIBLE");NEWLINE %FINISH %RETURN; ! TERMINATE CHECKOUT %FINISH; ! END OF LOOKING FOR POSS. MATCH NOMATCH: ! HERE IF NO MATCH FOUND - CONTINUE SCAN %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("NO MATCH - CONTINUE SCAN");NEWLINE %FINISH RWPTR=RWPTR+2<MATCH2; ! MATCH FOUND IND=MTR_CHAIN %REPEAT %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("NO MATCH - SCAN NEXT TRIAD"); NEWLINE %FINISH %CONTINUE; ! NO MATCH - SCAN NEXT TRIAD MATCH2: %IF MODE#-1 %START %IF TR_MODE2#MTR_MODE2 %THEN IND=MTR_CHAIN %AND ->MATCH1; ! NO MATCH %FINISH MATCH=IND %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("MATCH FOUND WITH TRIAD");WRITE(MATCH,1);NEWLINE %FINISH ! MATCH FOUND - CHECK IF DEFS. POSSIBLE FOR THIS TRIAD %IF COORD1=-1 %THEN ->ELIM; ! DEFS. NOT POSSIBLE - ELIMINATE %IF BLDEF(BACKTARG)=1 %START; ! DEF. OCCURS IN BACKTARG ! CHECK FOR DEFS. BETWEEN MATCH & CURRTRIAD %CYCLE IND=MTR_CHAIN %IF IND=CURRTRIAD %THEN ->ELIM; ! NO DEFS. FOUND MTR==RECORD(ATRIADS+IND*TRIADLENGTH) %IF TRDEF(IND)=0 %THEN %CONTINUE; ! NO DEF. - CHECK NEXT TRIAD MATCH3: %CYCLE %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("DEF. FOUND - LOOK FOR ANOTHER MATCH");NEWLINE %FINISH IND=MTR_CHAIN MTR==RECORD(ATRIADS+IND*TRIADLENGTH) %IF MATCHTR(IND)=1 %THEN %EXIT; ! MATCH FOUND %REPEAT %IF IND=CURRTRIAD %THEN %EXIT; ! MATCH WITH ITSELF %IF MODE#-1 %START; ! CVT TRIAD %IF MTR_MODE2#TR_MODE2 %THEN ->MATCH3; ! NOT A MATCH %FINISH ! HERE IF NEW MATCH MATCH=IND %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("NEW MATCH FOUND WITH TRIAD") WRITE(MATCH,1);NEWLINE PRINTSTRING("SCAN NEXT TRIAD");NEWLINE %FINISH %REPEAT; ! END OF CYCLE TO LOOK FOR MATCH WITH NO DEFS. %CONTINUE; ! SCAN NEXT TRIAD %FINISH; ! END OF CHECK FOR DEFS. ELIM:; ! HERE IF NO DEFS.FOUND ELIMINATE %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("SCAN NEXT TRIAD");NEWLINE %FINISH %CONTINUE; ! SCAN NEXT TRIAD %FINISH; ! END OF CURRTRIAD AS AN ELIMINATION CANDIDATE %REPEAT %UNTIL NEXTTRIAD=0 %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("END OF EXPRESSION ELIMINATION FOR BACKTARG");NEWLINE %FINISH %END; ! EXPELBTARG %EXTERNALROUTINE EXPELIM %INTEGERARRAYFORMAT ELIMF(0:31) %INTEGERARRAYNAME ELIMENT %RECORD(BLRECF)%NAME CBL %RECORD(TRIADF)%NAME TR,MTR %INTEGER ELIMPTR %INTEGER I ! CREATE ELIMTAB ENTRY FOR CURRENT BLOCK(CUBLK) CREATETABLE(32<0 %THEN UPDATE CURRDEF %IF TRELIM(TR_OP&BMBITOFF)=1 %START ! CURRTRIAD IS AN ELIM. CANDIDIATE %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("CURRTRIAD IS AN ELIMINATION CANDIDATE");NEWLINE %FINISH HVAL=HASH; ! GET HASH VALUE OF CURRTRIAD(TR) %IF TR_QOPD1&TEXTMASK=TEXTMASK %START MTR==RECORD(ATRIADS+TR_OPD1*TRIADLENGTH) %IF MTR_USE=1 %THEN ->SETELIM1; ! OPERAND IS A TEXT REF. WITH USE=1 %FINISH %IF TR_QOPD2&TEXTMASK=TEXTMASK %START MTR==RECORD(ATRIADS+TR_OPD2*TRIADLENGTH) %IF MTR_USE=1 %THEN ->SETELIM1 %FINISH ! SETUP COORD1,COORD2 & MODE SETCOORDS ! PERFORM ANY POSSIBLE ELIMINATIONS %IF ELIMENT(HVAL)#0 %START ! ELIMTAB ENTRY FOR THIS HASH VALUE IS SET %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("ELIMTAB ENTRY ALREADY SET FOR HASH VALUE") WRITE(HVAL,4);NEWLINE %FINISH I=ELIMENT(HVAL) MATCH1: ! SEARCH FOR TRIAD MATCH %WHILE I#CURRTRIAD %CYCLE MTR==RECORD(ATRIADS+I*TRIADLENGTH) %IF MATCHTR(I)=1 %THEN -> NEXT2; ! MATCH FOUND I=MTR_CHAIN %REPEAT %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("NO MATCH");NEWLINE %FINISH ->ELIM2; ! NO MATCH OCCURRED - ELIMINATE OUTSIDE BLOCK NEXT2: %IF MODE#-1 %START; ! CVT TRIAD - CHECK MODES %IF TR_MODE2#MTR_MODE2 %THEN I=MTR_CHAIN %AND ->MATCH1; ! NO MATCH %FINISH MATCH=I !MATCH FOUND, CHECK IF DEFS. POSS. FOR THIS TRIAD %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("MATCH FOUND WITH TRIAD"); WRITE(MATCH,1);NEWLINE %FINISH %IF COORD1=-1 %THEN ->ELIM1; ! DEFS. NOT POSS. - ELIMINATE %IF CURBLDEF=1 %START; ! DEF. OCCURS IN THIS BLOCK %CYCLE; ! ELIMINATE IF MATCHING TRIAD WITH NO DEFS. BEFORE CURRTRIAD I=MTR_CHAIN %IF I=CURRTRIAD %THEN ELIMINATE %AND %EXIT MTR==RECORD(ATRIADS+I*TRIADLENGTH) %IF TRDEF(I)=0 %THEN %CONTINUE; ! NO DEFS. - CHECK NEXT TRIAD LOOP1: %CYCLE; ! DEF. FOUND - LOOK FOR ANOTHER MATCH %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("DEF. FOUND - LOOK FOR ANOTHER MATCH");NEWLINE %FINISH I=MTR_CHAIN MTR==RECORD(ATRIADS+I*TRIADLENGTH) %IF MATCHTR(I)=1 %THEN %EXIT; ! MATCH FOUND - EXIT CYCLE %REPEAT %IF I=CURRTRIAD %THEN %EXIT; ! MATCH WITH ITSELF - EXIT %IF MODE#-1 %START; ! CVT TRIAD - CHECK MODES %IF MTR_MODE2#TR_MODE2 %THEN ->LOOP1; ! NOT A MATCH %FINISH ! HERE IF NEW MATCH FOUND MATCH=I %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("NEW MATCH FOUND WITH TRIAD"); WRITE(MATCH,1) NEWLINE %FINISH %REPEAT; ! END OF CYCLE TO LOOK FOR MATCHING TRIAD WITH NO DEFS. %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("SCAN NEXT TRIAD");NEWLINE %FINISH %CONTINUE; ! SCAN NEXT TRIAD %FINISH; ! END OF DEFS. OCCURING IN CURRENT BLOCK ELIM1: ! HERE IF NO DEFS. IN CURRBLK ELIMINATE %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("SCAN NEXT TRIAD");NEWLINE %FINISH %CONTINUE; ! SCAN NEXT TRIAD ELIM2: ! HERE FOR POSSIBLE ELIMS. OUTSIDE CURRBLK CHECKOUT %FINISH {ELIMTAB ENTRY SET} %ELSESTART %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("ELIMTAB ENTRY NOT SET FOR HVAL");NEWLINE %FINISH CHECKOUT %IF ELFLAG=0 %THEN ELIMENT(HVAL)=CURRTRIAD %FINISH %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("SCAN NEXT TRIAD");NEWLINE %FINISH %CONTINUE; ! SCAN NEXT TRIAD SETELIM1: ! HERE IF OPERANDS ARE TRIADS WITH USE=1 %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("CURRTRIAD'S OPERANDS ARE TRIADS WITH USE=1");NEWLINE %FINISH %IF ELIMENT(HVAL)=0 %THEN ELIMENT(HVAL)=CURRTRIAD %FINISH; ! END OF CURRTRIAD AS AN ELIM. CNADIDATE %REPEAT %UNTIL NEXTTRIAD=0 ! CLEAR RW FREETABS=ELIMEND %IF OPTFLAGS&EDUMP#0 %START PRINTSTRING("END OF EXPRESSION ELIMINATION FOR CURRBLK");NEWLINE %FINISH %END; ! EXPELIM %ENDOFFILE