"CODE IS STORED IN A LIST OF UVECTORS. EACH INSTRUCTION IS A FIX. THE INSTRUCTION CONTAINS THE INSTRUCTION BYTE (8 BITS) + INFORMATION TO FIX UP THE INSTRUCTION. WHEN AN INSTRUCTION DOES NOT FIT INTO A SINGLE FIX IT IS FOLLOWED BY ADDITIONAL FIXES. EVERY INSTRUCTION TAKES UP AN INTEGER NUMBER OF FIXES EVEN THOUGH THE OUTPUT VERSION MAY BE DIFFERENT. THERE IS A TEMPORARY FIXUP TABLE WHICH IS USED TO DETERMINE THE LOCATION OF THE TEMPORARIES AND ALSO A LABEL FIXUP TABLE TO KEEP TRACK OF THE LABELS. THE SYSTEM ATTEMPTS TO FIX UP LABELS IN PARTICULAR INTERVALS SO THAT IT DOESN'T HAVE TO KEEP TRACK OF TOO MANY LABELS. ANY NON-LOOPING LABELS WILL BE FLUSHED AS SOON AS THEY ARE FIXED UP. THERE IS ALSO A CONSTANT TABLE WHICH KEEPS TRACK OF THE LOCATION OF ALL FULL-WORD CONSTANTS. THESE ARE FIXED UP LIKE LABELS. IN GENERAL THE FIRST OCCURANCE OF A 32 BIT CONSTANT WILL BE OUTPUT AS AN IMMEDIATE INSTRUCTION. ALL OTHER OCCURANCES WILL BE OUTPUT AS A REFERENCE TO THAT CONSTANT IN PC-RELATIVE MODE (THIS WILL BE AN OPTION. WE MAY EVENTUALLY GENERATE ALL CONSTANTS IMMEDIATE IF THAT PROVES TO GENERATE FASTER RUNNING CODE" > > > > > ) .PTR>>)> >> )> >>> ) .PTR .VAL> )> >> )> >>> ,CODEVEC-LENGTH> 1>>> > > ) (ELSE >)>)> > >> .OUTCHAN>> )> .OUTCHAN>> )> > > >> > > ) "AUX" STR (NUM > 0) (,CURRENT-SLABEL)>)) > > )> >> >) ()>> ()> PTN-SAVE>> )> > > .INST> > >> >> .KIND T ()> PTN-SAVE>> ,PTNS-COUNT> FIX>> > )) > >> >> > > .OUTCHAN> .OUTCHAN>> )> "UPDATE THE LABEL TABLES FOR A BRANCH" (CODEPTR) FIX (FORCEL?) BOOLEAN) > > ) "AUX" NLR) #DECL ((LABEL) ) .LABEL> >)> )>> ,OUTST-LABEL-TABLE> > .NLR> ) <> () () <>] LABEL-REF>> > > >> > ) (ELSE > )>> "FINDS AND REMOVES A LABEL FROM THE OUTSTANDING LABEL TABLE. THE LABEL WILL NOT BE REMOVED IF IT IS A LOOP LABEL" (OUTST) (VALUE) ) )) >)> > .LABEL> > ) (<==? .PTR 1> > ) (ELSE > > )>)> >>> "UPDATE LABEL TABLES WHEN ENCOUNTERING AN ACTUAL LABEL" 1>)) #DECL ((LABEL) (CODEPTR) FIX (LOOP?) ) > > ) (>)> ) ( 1>> (.LREF)>)> .TABPTR> .LREF> (TABPTR) FIX) ) INST) .TABPTR> FIX>> > .XREFS>> <> <> 0 .STATUS? .LILEN ,CODE-COUNT <> () .FORCEL?> XREF-INFO>> )> .XREF> ) (FORCEL? <>) (XT <>) "AUX" XREF (CNT 1) LREF) #DECL ((INST) FIX (LABEL) (XREF) XREF-INFO (FORCEL?) BOOLEAN) FIX>> > > >> )> >> ,LABEL-TABLE> FIX>>)> > FIX>>)> .XREF> (LOOP?) ) > "THE CONSTANT TABLE CONSISTS OF CONSTANT ADDRESS PAIRS. THE ADDRESS MAY HAVE 3 STATES. IF IT IS NON-ZERO. THEN IT IS THE ADDRESS OF THE MOST RECENT EMITTED VERSION OF A CONSTANT. IF IT IS ZERO THEN IT INDICATES THAT A VERSION OF THE CONSTANT WILL BE EMITTED BY SOME INSTRUCTION IN THE CURRENT SUBROUTINE -1 IS USED BY THE SCAN PASS TO INDICATE THAT THE CONSTANT WILL HAVE BEEN BEEN EMITTED BY A PREVIOUS INSTRUCTION" >> > "WARNING: THIS ADDS AN ENTRY TO THE CONSTANT TABLE IF IT IS NOT ALREADY THERE. THE INITIAL VERSION OF THIS ALGORITHM USES LINEAR SEARCH. THIS MAY SLOW DOWN THE WORLD" > ,CONSTANT-TABLE-INCREMENT> 0>> >> .TAB .NTAB> )> 0> > ) (<==? .NUM > )> >>> > PATCH>> .NUM> FIX>> > .NUM> <- .NUM 1>>>> > > > FIX>>) (ELSE >)>> ) (NUM-OPS <- ,INIT-SHIFT>> FIX>) (SHFT 16) (FNUM 1)) #DECL ((FNUM INST NUM-OPS SHFT) FIX (WHERE) (INST-INFO) (FIELDS) TUPLE) FIX>> )> )> > )> FIX>> -24> FIX>>) (ELSE FIX>> ; "??? May be loser" FIX>>)> FIX>> FIX>> > > FIX>> FIX>> >)> <==? .REG-OR-LIT ,NAC-PC>> ) ( <==? .SIZC ,SZ-F>>>> <==? .REG-OR-LIT ,NAC-PC>> <==? .EAC ,AM-LD> <==? .EAC ,AM-LDD>> ) ( <==? .EAC ,AM-WDD> <==? .SIZC ,SZ-W> <==? .REG-OR-LIT ,NAC-PC>>> ) ( <==? .EAC ,AM-BDD> <==? .SIZC ,SZ-B> <==? .REG-OR-LIT ,NAC-PC>>> ) ( <==? .REG-OR-LIT ,NAC-PC>> <==? .SIZC ,SZ-D>> ) (<==? .SIZC ,SZ-O> ) (ELSE )>) (ELSE )>) (ELSE )> > FIX>> > 0> >) (ELSE >)> )> > 0> )> <- .SHFT 24>>> FIX>> FIX>> > 0> >) (ELSE >)> )>>> .FIELDS> )> >) (ELSE >)>)>> >> > >> )> >> ,LABEL-TABLE> FIX>>)> .XREF> ) (<==? .MSIZE LONG> ) (<==? .MSIZE WORD> ) (<==? .MSIZE BYTE> ) (<==? .MSIZE DOUBLE> )> .EXTRA> FIX> ) (T )>) (T )>> )) #DECL ((EA1 EA2) EFF-ADDR (MSIZE) ATOM (PTR) FIX) > ) (<==? .MSIZE WORD> ) (<==? .MSIZE BYTE> ) (<==? .MSIZE DOUBLE> )> > "MAKE SURE CONSTANT IS CORRECT IF IMMEDIATE. IF LONG WORD OPERATION SHOULD USE CONSTANT TABLE" > EFF-ADDR>) (<==? .FLD ,ADDRESS-IMM> >> > EFF-ADDR>) (.EA)>) (<==? .FLD ,ADDRESS-IMM-LONG> ) (.EA)>> )> > )> > > >>> ) ,CODEVEC-LENGTH> <- .PTR 1>>> )> >> )> >> >) (ELSE > >)> .RES> ) "AUX" TMP (ISZ .SZ) ABS TB INST) <==? <1 .EA1> > <==? 2> > ; "Get constant back" > FIX>> >> -1>>)>)> > > ) ( > ) (T )>) ( > *77*> > ) (T ; "can't do anything here" )> ,INST-CLRB) (<==? .SZ WORD> ,INST-CLRW) (<==? .SZ LONG> ,INST-CLRL) (<==? .SZ DOUBLE> ,INST-CLRQ)>> ) ( > > ) (T ,INST-MNEGB) (<==? .SZ WORD> ,INST-MNEGW) (<==? .SZ LONG> ,INST-MNEGL)>> )>) (<==? .SZ .ISZ> ) (T ) (<==? .ISZ WORD> )> >) (T >)> <1 .TB>) (T <2 .TB>)> ) (<==? .ISZ WORD> ) (<==? .ISZ LONG> )> .EA2>)>> (SZ) ATOM (TB) VECTOR) .SZ>> (SZ) ATOM) .EADDR .SZ>) (ELSE .SZ>)>> ,INST-CLRL) (<==? .LENGTH WIRD> ,INST-CLRW) (<==? .LENGTH BYTE> ,INST-CLRB) (<==? .LENGTH DOUBLE> ,INST-CLRQ) (ELSE ,INST-CLRO)> >> .NAME> )>> ,CALL-ENTRY-TABLE>> > )>> )) #DECL ((CE) CALL-ENTRY (NARGS) FIX) )) .NARGS> >> -1> >> .FINAL> ) ( 2> >> >) ( )> >>> > > ) .LABEL> INT-ENTRY>> )>> ,OUTST-LABEL-TABLE>> ) (LABEL )) >> ,INTERNAL-ENTRY-TABLE>> CALL-ENTRY>> .CE> >> >> ,CALL-TABLE>> UNRESOLVED-CALL>> > >)> > .CNT> FIX>> T> .INCR>>> >> .TAB .NEWVEC> .NEWVEC> >> > ) > > >)> > .CNT> FIX>> T> >> > ) > > >)> > -8> .CNT> FIX>> T>