" Generate code for a poor innocent PROG or REPEAT." " " ) START:TAG (STB .STK) (STK (0 !.STK)) (NTMPS ) (ELSE (0))>) (TMPS .TMPS) BTP (BASEF .BASEF) EXIT EXIT:OFF AGAIN (FRMS .FRMS) (OPRE .PRE) DEST (CD <>) (AC-HACK .AC-HACK) (K ) (SPEC-LIST .SPEC-LIST) TEM (ONS .NTSLOTS) (ORPNOD .RPNOD>) RPNOD SACS) #DECL ((NTSLOTS STB) (BASEF PNOD RPNOD) (PWHERE DEST) (SPECD PRE) (STK FRMS) (BTP NSTB) LIST (AC-HACK) > (TMPS) (START:TAG) (K) (SPEC-LIST) ) <>> ,BIND> ) (.ORPNOD )> .TOT-SPEC>> > FLUSHED) (ELSE )>> (TOT-SPEC) ) <0? >>>>> > .PNOD >) (ELSE FUZZ)> (
>) !.FRMS)> > > >)> > >)> >> )> > >> > !.NTSLOTS)>)> !.SPEC-LIST)> > <==? ,REPEAT>> ) (ELSE > >)> >> <==? ,REPEAT>> )> ,REPEAT> > ,REPEAT> <==? .DEST FLUSHED>> >>) (ELSE >> > ) (ELSE >)>)>)>) (ELSE >> >)>) (ELSE >> > ) (ELSE >)>)>)>)> > >> ,REPEAT> > ) (.OPRE !.NTSLOTS>) (ELSE )>) (<==? ,REPEAT> )> ,REPEAT> > )> ,REPEAT> >> ) >)> <==? ,REPEAT>> ) (ELSE )> ,REPEAT> >> )> > .CD AC>> .CD>)> ) (ELSE )>> > AC> .DEST .CD>> AC> .DEST .CD>>)> > .XX> " " " Generate code for a RETURN." ) DEST (NF 0) NOT-HANDLED-PROG (NT .NTSLOTS)) #DECL ((NOD N RPNOD) NODE (WHERE) (CD1) (SPECD) (NF) FIX) >> ) (>>>> ) (ELSE >)> ,REPEAT> ,PROG> >>>> > FLUSHED> > FLUSHED>>) (ELSE > >>> .CD1>)> > .N> )> >> > > >> > ) (ELSE >> .N> > >> AC> ,ACPROT T>)> AC> ,ACPROT T>)>)> > !.NT>) (ESLE >)> AC> ,ACPROT <>>)> AC> ,ACPROT <>>)>)> )) #DECL ((STB) ) >> >)> ,NO-DATUM>> > >> )>>>> " " " Generate code for an AGAIN." ) NOT-HANDLED-PROG) #DECL ((NOD N RPNOD) NODE (SPECD) ) > ) (>>>> ) (ELSE > >)> ,PROG> <==? ,REPEAT> <==? ,BIND>>>> )> > >> > >> .N> >>>) (ELSE )>>)> > ) (ELSE >)> )) #DECL ((STK) ) >> > ,NO-DATUM>> " Generate code for a GO in a PROG/REPEAT." >) (RT )) #DECL ((NOD N) NODE (WHERE) ) > >> <>>>) (ELSE >> >)> ,NO-DATUM> >> <>>)) #DECL ((NOD) NODE) > > >> > > > > > .WHERE>> " Generate code to flush stack for leaving a PROG etc." !.NTSLOTS>) (ELSE )>> " " "ROUTINES TO ALLOW KEEPING VARIABLES IN AC'S THRU LOOPS. THE OUTINES KEEP INFORMATION IN THE PROG NODE TELLING INFORMATION AT VARIOUS POINTS (I.E. AGAIN AND RETURN POINTS). VARIABLES KEPT IN ACS WILL CONTAIN POINTERS TO THE PROG NODES INVOLVED AND THE DECISION WILL BE MADE TO KEEP THEM IN AC'S WHEN THEY ARE FIRST REFERENCED. AGAINS AND RETURNS WILL EMIT NULL MACROS AND A FIXUP ROUTINE WILL BE USED AT THE END TO COERCE THE STATES CORRECTLY." "ROUTINE TO INITIALIZE STATE INFORMATION ON ENTERING LOOPS. IT TAKES A PROG/REPEAT NODE AND WILL UPDATE INFORMATION CONTAING SLOTS AS WELL AS PUTTING THE NODE INTO PROG-AC SLOTS OF APPROPRIATE SYMTABS. THE SLOTS MAY CONTAIN MULTIPLE PROG NODES BUT THE ONE CURRENTLY BEING HACKED WILL BE FIRST. IF FLUSHING A VAR THE ENTIRE SLOT WILL BE FLUSHED." > >> > > > > > >>)> )>)>> ,ALLACS> > )> > > ,NUM-SYM-SLOT <2 >>> >>> > > > > >) (ELSE )>)>> .ACRES> > .AC> > AC>> .AC> > AC>>>> > > >) (ELSE )>)>> > )> >>) (ELSE > <>)>> .ACRES>)>> ) "AUX" CSTATE) #DECL ((PNOD) NODE (RET) ) > .RET !)>> ) ,PROG> <==? ,BIND>> >>> > T !)>)>> " " "OK FOLKS HERE IT IS. THIS IS THE ROUTINE THAT MERGES ALL THE STATES IN LOOPS AND DOES THE RIGHT THING IN ALL CASES (MAYBE?). IT TAKES A PROG AND MAKES SURE THAT STATES ARE CONSISTENT AT AGAIN AND RETURN POINTS. FOR AGAIN POINTS IT MAKES SURE THAT ALL LOOP VARIABLES IN THE RIGHT ACS." ) (AGAIN-ST ) (RETURN-ST )) #DECL ((PNOD) NODE (RETURN-ST) ) > > LIST ]> (REST-CODE-PTR) LIST) )> >> > )) #DECL ((CP) (RCP) LIST) )>> > T !.RETURN-ST)>)> >>> (ACS) REP-STATE (RET) ) ) (FRMS ) (NTSLOTS ) (STK )) #DECL ((NTSLOTS BSTB FRMS STK SCODE:PTR) ) >> ) )> > > > > ATOM> <==? >>>) ( ATOM> ) ()>)> >>> ) (NOEXCH >> >>>)) #DECL ((DEST-INAC CURR-INAC) (ACS) REP-STATE (DEST-AC) AC) > >>> .ACS .CSYMT .RET .NOEXCH .LPV>> ) (DVAC ) (TDONTEXCH >> >>) (VDONTEXCH >> >>)) #DECL ((DEST-INAC CURR-INAC) DATUM) AC> .DTAC> ) (<==? .DTAC > >>> .ACS .CSYMT .RET .TDONTEXCH .LPV> >) (ELSE >>> .ACS .CSYMT .RET .VDONTEXCH .LPV>)>) (ELSE >>> .ACS .CSYMT .RET .TDONTEXCH .LPV> >) (ELSE >>> .ACS .CSYMT .RET .VDONTEXCH .LPV>)>)>) ( .DVAC>) (ELSE >>> .ACS .CSYMT .RET .VDONTEXCH .LPV>)> !>>)>> " " ) "AUX" (BST ()) PAC) #DECL ((VALUE) REP-STATE) >)> ) (SACR ())) >> LIST>> >> > 2> <2 >>)> > >>>> !.SACR)>)>> .ACR> .SACR> ,ALLACS>> ) "AUX" PNAC) #DECL ((SYMT) SYMTAB) > >>> !)> ) (>)> > >)> )) #DECL ((PTR) LIST) )> > > )> >>) (ELSE )>)>> " " ) (> .LPV>> >> AC> <==? .AC > AC>>>> > )> >>> .ACS ,ALLACS>> >)> .SYMT> >)> >>> .ACS>> "THIS ROUTINE SWAPS PORTIONS OF DATUMS. IT TAKES TWO ACS AND THE ACS LIST AND SWAPS THE INFORMATION IN THE ACS LIST. AC2 IS THE GOAL AC AND ENDS UP CONTAINING ONLY ONE DATUM." ) (NUM2 ) SWDAT1 SWDAT2 (ACL1 ) (ACL2 ) (PUTR ())) #DECL ((AC1 AC2) AC (NUM1 NUM2) FIX (ACS) REP-STATE (RET) (LPV) LIST) > )> > > )> >> <==? .SYMT > ) (LP .LPV) (DV <==? .AC1 >>)) #DECL ((LP) LIST) )> .S> > .AC2>>) (ELSE > .AC2>>)>)> >>>> )> >> )> >> )> >>)> )> 1 <2 .PUTR>> >> )> > >) > ) (ELSE )>> .ACL>> )> ,INACS <>> <> <>>> > AC> > !>>)> > !>>)> >>> " " )) #DECL ((N) NODE (B) ) )) #DECL ((S) SYMTAB) AC> .S>)> AC> .S>)>)> > > .B>> "ROUTINES TO HANDLE LOOP-RETURNS." > > <>>> .ACR>)> >> ,ALLACS> > > )> .LST > >>)>> "ROUTINE TO FIGURE OUT A MERGE BETWEEN DIFFERENT RETURN POINTS. IN THE END A LIST OF THINGS TO REMAIN IN AC'S ARE PRODUCED." LIST ]>) .CNT>>> > )) )> .CNT>>> )> >>)> > )> > 5> )>> .ACKEEP> "ROUTINE TO FIGURE OUT IF THINGS MERGE" .NEW-STATE>> > >> > > > > >>>>> >) (> >)>) (>)> )> .NEW-STATE>> <=? >> >) (> >)>) (ELSE ;"THIS ELSE USED TO B " >) (ELSE > > )>)> >> .CURR-STATE> ) ) (BSTB ) (NTSLOTS ) (STK )) #DECL ((FRMS BSTB NTSLOTS STK SCODE:PTR) ) )> > .MERGEDRETURN>> >> > AC>>>> > ) ( ) (ELSE > > >)> >>> .THISRETURN ,ALLACS>>> ,SEMIT ) > >>> )> >> > > )> >)> >> " " ) AC) > AC> )> > AC> )>> > AC> > )>>)> > AC> > )>>)>> )> > ,NUM-SYM > > > >>> LIST ]>) LIST ]>) )> )) #DECL ((STATE-ITEMS) REP-STATE (STATE-ITEM) ]> (PAC) (SYMT) SYMTAB) )> > T>> T> .KILL-LIST>> > >> >>> >)>)> >> >>>>> >) ()>> > )) )> > T>> T> .KILL-LIST>> > >> >>> >)>)> >> >>>>> >)> > >>)> > > >>>