From 3395a5e4ef72d59cdb6832af7808dc9c2cf2a413 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Sun, 13 May 2018 20:27:48 +0200 Subject: [PATCH] Files from TOPS-20 . --- /ac.bug.1 | 46 + /advmes.mud.9 | 40 + /allr.mud.14 | 79 + /atosq.mud.1 | 24 + /backan.mud.3 | 196 ++ /bitana.mud.5 | 84 + /bits.mud.1 | 383 ++++ /bitsge.mud.2 | 314 +++ /bitsgen.mud.1 | 314 +++ /bittst.mud.9 | 59 + /bophac.mud.3 | 27 + /build-dir.mud.4 | 2278 +++++++++++++++++++ /buildl.mud.19 | 260 +++ /cacs.mud.28 | 859 +++++++ /carana.mud.337 | 393 ++++ /cargen.mud.31 | 1332 +++++++++++ /case.mud.59 | 380 ++++ /caseld.mud.1 | 37 + /cback.mud.18 | 145 ++ /cdrive.mud.12 | 270 +++ /chkdcl.mud.44 | 1343 +++++++++++ /cleanac.mud.2 | 45 + /codgen.mud.8 | 2192 ++++++++++++++++++ /combat.tailor.6 | Bin 0 -> 1228 bytes /comcod.mud.45 | 936 ++++++++ /comfil.mud.3 | 650 ++++++ /comp106.save.1 | Bin 0 -> 593881 bytes /compde.mud.32 | 1205 ++++++++++ /compdec.mud.1 | 1204 ++++++++++ /comsub.mud.10 | 451 ++++ /comtem.mud.2 | 361 +++ /confor.mud.1 | 88 + /cprint.mud.1 | 145 ++ /cup.mud.57 | 598 +++++ /etmp.mud.1 | 30 + /eupdat.mud.1 | 122 + /help.compil.7 | 42 + /infcmp.mud.21 | 257 +++ /istruc.mud.102 | 484 ++++ /lnqgen.mud.9 | 230 ++ /mapana.mud.231 | 398 ++++ /mapgen.mud.71 | 1565 +++++++++++++ /mapps1.mud.207 | 126 ++ /mmqgen.mud.27 | 271 +++ /mobyg.mud.8 | 196 ++ /mudhak.mud.2 | 17 + /mudref.mud.1 | 135 ++ /ncomfi.mud.2 | 65 + /newcmp.mud.1 | 43 + /newop.mud.1 | 48 + /newrep.mud.60 | 998 +++++++++ /nhelp.mud.4 | 36 + /nn.mud.1 | 332 +++ /nnupda.mud.1 | 110 + /notana.mud.116 | 132 ++ /notgen.mud.119 | 330 +++ /nprint.mud.21 | 207 ++ /pass1.mud.45 | 1145 ++++++++++ /pcomp.load.13 | 176 ++ /pcomp.pure.3 | 13 + /pdmp.part.2 | 29 + /pdmp.save.6 | Bin 0 -> 184300 bytes /pdmp.xxfile.2 | 279 +++ /peeph.mud.92 | 807 +++++++ /peeph.record.92 | 276 +++ /ppcomp.save.5 | Bin 0 -> 670668 bytes /prntyp.mud.5 | 59 + /rest.gen.1 | 177 ++ /rhack.mud.1 | 56 + /sbrnam.mud.1 | 20 + /spcgen.mud.2 | Bin 0 -> 2829 bytes /strana.mud.362 | 537 +++++ /strgen.mud.33 | 1867 ++++++++++++++++ /subrty.mud.61 | 252 +++ /symana.mud.70 | 1835 +++++++++++++++ /syntax.macro.1 | 54 + /temp.getord.1 | Bin 0 -> 1111 bytes /terst.gen.1 | 129 ++ /test.gen.3 | 230 ++ /undassm.crud.2 | 4329 ++++++++++++++++++++++++++++++++++++ /varana.mud.43 | 603 +++++ README.md | 2 + 82 files changed, 35787 insertions(+) create mode 100644 /ac.bug.1 create mode 100644 /advmes.mud.9 create mode 100644 /allr.mud.14 create mode 100644 /atosq.mud.1 create mode 100644 /backan.mud.3 create mode 100644 /bitana.mud.5 create mode 100644 /bits.mud.1 create mode 100644 /bitsge.mud.2 create mode 100644 /bitsgen.mud.1 create mode 100644 /bittst.mud.9 create mode 100644 /bophac.mud.3 create mode 100644 /build-dir.mud.4 create mode 100644 /buildl.mud.19 create mode 100644 /cacs.mud.28 create mode 100644 /carana.mud.337 create mode 100644 /cargen.mud.31 create mode 100644 /case.mud.59 create mode 100644 /caseld.mud.1 create mode 100644 /cback.mud.18 create mode 100644 /cdrive.mud.12 create mode 100644 /chkdcl.mud.44 create mode 100644 /cleanac.mud.2 create mode 100644 /codgen.mud.8 create mode 100644 /combat.tailor.6 create mode 100644 /comcod.mud.45 create mode 100644 /comfil.mud.3 create mode 100644 /comp106.save.1 create mode 100644 /compde.mud.32 create mode 100644 /compdec.mud.1 create mode 100644 /comsub.mud.10 create mode 100644 /comtem.mud.2 create mode 100644 /confor.mud.1 create mode 100644 /cprint.mud.1 create mode 100644 /cup.mud.57 create mode 100644 /etmp.mud.1 create mode 100644 /eupdat.mud.1 create mode 100644 /help.compil.7 create mode 100644 /infcmp.mud.21 create mode 100644 /istruc.mud.102 create mode 100644 /lnqgen.mud.9 create mode 100644 /mapana.mud.231 create mode 100644 /mapgen.mud.71 create mode 100644 /mapps1.mud.207 create mode 100644 /mmqgen.mud.27 create mode 100644 /mobyg.mud.8 create mode 100644 /mudhak.mud.2 create mode 100644 /mudref.mud.1 create mode 100644 /ncomfi.mud.2 create mode 100644 /newcmp.mud.1 create mode 100644 /newop.mud.1 create mode 100644 /newrep.mud.60 create mode 100644 /nhelp.mud.4 create mode 100644 /nn.mud.1 create mode 100644 /nnupda.mud.1 create mode 100644 /notana.mud.116 create mode 100644 /notgen.mud.119 create mode 100644 /nprint.mud.21 create mode 100644 /pass1.mud.45 create mode 100644 /pcomp.load.13 create mode 100644 /pcomp.pure.3 create mode 100644 /pdmp.part.2 create mode 100644 /pdmp.save.6 create mode 100644 /pdmp.xxfile.2 create mode 100644 /peeph.mud.92 create mode 100644 /peeph.record.92 create mode 100644 /ppcomp.save.5 create mode 100644 /prntyp.mud.5 create mode 100644 /rest.gen.1 create mode 100644 /rhack.mud.1 create mode 100644 /sbrnam.mud.1 create mode 100644 /spcgen.mud.2 create mode 100644 /strana.mud.362 create mode 100644 /strgen.mud.33 create mode 100644 /subrty.mud.61 create mode 100644 /symana.mud.70 create mode 100644 /syntax.macro.1 create mode 100644 /temp.getord.1 create mode 100644 /terst.gen.1 create mode 100644 /test.gen.3 create mode 100644 /undassm.crud.2 create mode 100644 /varana.mud.43 diff --git a//ac.bug.1 b//ac.bug.1 new file mode 100644 index 0000000..09efe9b --- /dev/null +++ b//ac.bug.1 @@ -0,0 +1,46 @@ +;"need to fload init.mud in order to compile this" + +) + ;"no. of nodes" + TEMP) + #DECL ((TR) transaction_type_desc (PS) + (TEMP) FALSE> (NN) FIX) + .NN> .PS) + ( + > + >) + (ELSE )>> + .X> ,rcn_c>>> + > )>> + .PS>) + ( + .X> ,pn_c>)) + #DECL ((X) FIX (Y) ) + >> + >)>> + .PS>) + (ELSE ;"look for unrestricted children nodes" + + + > + >)>> + .X> ,ucn_c>>> + )>> + >>)>> + diff --git a//advmes.mud.9 b//advmes.mud.9 new file mode 100644 index 0000000..ef08602 --- /dev/null +++ b//advmes.mud.9 @@ -0,0 +1,40 @@ + + + + + + + + + ) (ELSE )>> + .MSG> + > + +) + )) + #DECL ((LL) ) + )> + + + ) + ( ) + (ELSE )>> + <2 .LL>> + + > + >>> + +) + > + > <- -1>> .L>) + (ELSE + 2>>)>> + + + \ No newline at end of file diff --git a//allr.mud.14 b//allr.mud.14 new file mode 100644 index 0000000..d8a618c --- /dev/null +++ b//allr.mud.14 @@ -0,0 +1,79 @@ + + + + + + + ,REST>) SAC NAC TEM STR NUM + (K ) (SS ) T1 T2 CAC) + #DECL ((N) NODE (K) (SAC CAC NAC) AC (STR NUM) DATUM + (SS) ) + + ) (ELSE )>>> + AC>> + |COMPERR>>)> + >> >>> + >)> + + > + > + + > 1) (ELSE 0)>> + .NUM> + + > ,ACPROT T> + + > + >)> + >)> + >) (ELSE ,ACO)>> + >> + ()>> + >>> + >> + >)> + + .T1>>) + (ELSE )> + + + > + >> >>> + + 1>>)> + > + )> + ) + (ELSE + > + > + >) (ELSE .TEM)> + .TEM> + .W>)>> + +) + + ) + (TY + >> + > + >>>>)) + #DECL ((S) SYMTAB) + <==? .D .D1>> + >>>)> + > + >> + )>> + .L> + )> + > + + \ No newline at end of file diff --git a//atosq.mud.1 b//atosq.mud.1 new file mode 100644 index 0000000..a2c043e --- /dev/null +++ b//atosq.mud.1 @@ -0,0 +1,24 @@ + + + + + <DECLARE ("VALUE" ANY <PRIMTYPE WORD>)> + <DPUSH TP* (AB)> + <PUSHJ P* IATOSQ> + <JRST FINIS> + + <INTERNAL-ENTRY IATOSQ 1> + <SUBM M* (P)> + <MOVE E* (TP)> + <PUSHJ P* ATOSQ> + <JRST FALS> + <MOVE B* E> + <MOVSI A* <TYPE-CODE FIX>> +FOO <SUB TP* [<(2) 2>]> + <JRST MPOPJ> + + +FALS <MOVEI B* 0> + <MOVSI A* <TYPE-CODE FALSE>> + <JRST FOO> +  \ No newline at end of file diff --git a/<mdl.comp>/backan.mud.3 b/<mdl.comp>/backan.mud.3 new file mode 100644 index 0000000..528f74c --- /dev/null +++ b/<mdl.comp>/backan.mud.3 @@ -0,0 +1,196 @@ +<PACKAGE "BACKAN"> + +<ENTRY BACK-ANA TOP-ANA SUBSTRUC-ANA> + +<USE "CHKDCL" "COMPDEC" "SYMANA"> + +<DEFINE BACK-ANA (NOD RTYP "AUX" TF TS (K <KIDS .NOD>) (LN <LENGTH .K>) TPS) + #DECL ((NOD) NODE (K) <LIST [REST NODE]> (LN) FIX) + <COND + (<SEGFLUSH .NOD .RTYP>) + (ELSE + <COND (<1? .LN> + <PUT .NOD + ,KIDS + <SET K (<1 .K> <NODE1 ,QUOTE-CODE .NOD FIX 1 ()>)>>) + (ELSE <ARGCHK .LN 2 BACK>)> + <SET TS <EANA <1 .K> STRUCTURED BACK>> + <SET TF <EANA <2 .K> FIX BACK>> + <COND (<NOT <OR <NOT <SET TPS <STRUCTYP .TS>>> + <==? .TPS TUPLE> + <==? .TPS VECTOR> + <==? .TPS STRING> + <==? .TPS TEMPLATE> + <==? .TPS UVECTOR>>> + <MESSAGE ERROR "BAD 1ST ARG TO BACK" .NOD>)> + <TYPE-OK? + <COND (<OR <NOT .TPS> <==? .TPS STRING> <==? .TPS TEMPLATE>> + <PUT .NOD ,NODE-TYPE ,ISUBR-CODE> + .TPS) + (ELSE + <PUT .NOD ,NODE-TYPE ,BACK-CODE> + <COND (<==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> + <TYPE-AND <REST-DECL .TS <NODE-NAME <2 .K>>> .TPS>) + (ELSE .TPS)>)> + .RTYP>)>> + +<PUT ,BACK ANALYSIS ,BACK-ANA> + +<DEFINE TOP-ANA (N R "AUX" (K <KIDS .N>) TS TPS) #DECL ((N) NODE (K) <LIST [REST NODE]>) + <COND (<SEGFLUSH .N .R>) + (ELSE + <ARGCHK <LENGTH .K> 1 TOP> + <SET TS <EANA <1 .K> STRUCTURED TOP>> + <COND (<AND <SET TPS <STRUCTYP .TS>> + <MEMQ .TPS '![VECTOR UVECTOR TUPLE]>> + <PUT .N ,NODE-TYPE ,TOP-CODE> + <TYPE-OK? .R .TPS>) + (<==? .TPS LIST> + <MESSAGE ERROR " BAD ARG TO TOP ">) + (ELSE + <PUT .N ,NODE-TYPE ,ISUBR-CODE> + <TYPE-OK? .R <COND (.TPS)(ELSE STRUCTURED)>>)>)>> + +<PUT ,TOP ANALYSIS ,TOP-ANA> + +"ROUTINE TO ANALYZE SUBSTRUCS" + +<DEFINE SUBSTRUC-ANA (NOD RTYP + "AUX" RNODE K FRST-ARG TS TF TYP LN FD TPS NUM NN SN + (ALRDY <==? <NODE-TYPE .NOD> ,SUBSTRUC-CODE>) TEM) + #DECL ((FRST-ARG RNODE NOD) NODE (K) <LIST [REST NODE]> + (FLG) <OR ATOM FALSE> (NUM) FIX) + <COND + (<SEGFLUSH .NOD .RTYP>) + (ELSE + <SET K <KIDS .NOD>> + <COND (<0? <SET LN <LENGTH .K>>> + <MESSAGE ERROR "TOO FEW ARGS TO SUBSTRUC">)> + <SET FD <EANA <SET FRST-ARG <1 .K>> STRUCTURED SUBSTRUC>> + <COND (<AND .ALRDY <G? .LN 1> <==? <NODE-TYPE <1 .K>> ,REST-CODE>> + <SET SN <1 <KIDS <1 .K>>>> + <SET NN <2 <KIDS <1 .K>>>> + <PUT .NN ,PARENT .NOD> + <PUT .SN ,PARENT .NOD> + <SET LN <+ .LN 1>> + <PUT .NOD ,KIDS <SET K (.SN .NN !<REST .K>)>>)> + <AND <G? .LN 1> <EANA <2 .K> FIX SUBSTRUC>> + <AND <G? .LN 2> <EANA <3 .K> FIX SUBSTRUC>> + <AND <G? .LN 3> <EANA <4 .K> STRUCTURED SUBSTRUC>> + <COND + (<OR <==? <SET TPS <STRUCTYP .FD>> VECTOR> + <==? .TPS UVECTOR> + <==? .TPS TUPLE>> + <SET TF + <COND + (<1? .LN> <PUT .NOD ,NODE-TYPE ,SUBSTRUC-CODE> <GET-ELE-TYPE .FD 0 T>) + (<G? .LN 4> <MESSAGE ERROR "TOO MANY ARGS TO SUBSTRUC">) + (<OR <L? .LN 4> + <COND (<OR <SUB-CASE-1 .FRST-ARG <4 .K>> + <SUB-CASE-2 .FRST-ARG <4 .K>>>)>> + <PUT .NOD ,NODE-TYPE ,SUBSTRUC-CODE> + <SET RNODE <BUILD-REST-NODE <1 .K> <2 .K> .NOD>> + <SPLICE-IN-SUB .K .RNODE> + <SET TF <EANA .RNODE .TPS SUBSTRUC>> + <COND (<==? .LN 4> <SET TS <RESULT-TYPE <3 .K>>>) (<SET TS .TF>)> + <SET TF + <COND (<AND <N=? .LN 2> <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE>> + <SET NUM <NODE-NAME <2 .K>>> + <TYPE-OK? .TF <FORM STRUCTURED [.NUM ANY]>>) + (ELSE .TS)>> + <COND + (<N==? .LN 2> + <COND + (<==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> + <SET TF + <CHTYPE + (.TPS + !<MAPF ,LIST + <FUNCTION ("AUX" X) + <COND (<0? .NUM> <MAPSTOP>) + (ELSE + <SET X <GET-ELE-TYPE .TF .NUM>> + <SET NUM <- .NUM 1>> + .X)>>>) + SEGMENT>>) + (ELSE <SET TF .TPS>)>)>) + (ELSE <PUT .NOD ,NODE-TYPE ,ISUBR-CODE> .TPS)>> + <COND + (<L? .LN 4> + <AND <==? .TPS TUPLE> <SET TPS VECTOR>> + <SET TF + <COND + (<AND <TYPE? .TF FORM SEGMENT> <ISTYPE? .TF>> + <COND + (<==? <1 .TF> OR> + <CHTYPE + (OR + !<MAPF ,LIST + <FUNCTION (D) + <COND (<TYPE? .D FORM> + <CHTYPE (.TPS !<REST .D>) FORM>) + (<TYPE? .D SEGMENT> + <CHTYPE (.TPS !<REST .D>) SEGMENT>) + (ELSE .TPS)>> + <REST .TF>>) + FORM>) + (<TYPE? .TF FORM> <CHTYPE (.TPS !<REST .TF>) FORM>) + (ELSE <CHTYPE (.TPS !<REST .TF>) SEGMENT>)>) + (ELSE .TPS)>>)> + <TYPE-OK? .TF .RTYP>) + (ELSE <PUT .NOD ,NODE-TYPE ,ISUBR-CODE> <TYPE-OK? STRUCTURED .RTYP>)>)>> + +<PUT ,SUBSTRUC ANALYSIS ,SUBSTRUC-ANA> + +"BUILD A REST NODE" + +<DEFINE BUILD-REST-NODE (NODE NUM PAR) + <NODEFM ,SUBR-CODE .PAR ANY REST (.NODE .NUM) ,REST>> + +"SPICE IN A REST NODE" + +<DEFINE SPLICE-IN-SUB (K NNODE) + #DECL ((K) <LIST [REST NODE]> (NNODE) NODE) + <PUT .K 1 .NNODE> + <PUTREST .K <REST .K 2>>> + + +"SUB-CASE-1 LOOKS FOR <SUBSTRUC <REST .X> .N1 .N2 .X> AND SIMILAR CASES WHERE + BLTS ARE ALWAYS POSSIBLE. + STRNOD== NODE OF STRUCTURE + CPYNOD== NODE OF STRUCTURE TO COPY INTO" + +<DEFINE SUB-CASE-1 (STRNOD CPYNOD + "AUX" (DATA <GET-SUB-DATA .STRNOD>) + (DATAC <GET-SUB-DATA .CPYNOD>)) + #DECL ((STRNOD CPYNOD) NODE (DATAC DATA) <OR FALSE LIST>) + <AND .DATA + .DATAC + <==? <1 .DATA> <1 .DATAC>> + <TYPE? <2 .DATAC> FIX> + <OR <0? <2 .DATAC>> + <AND <TYPE? <2 .DATA> FIX> <G=? <2 .DATA> <2 .DATAC>>>>>> + +<DEFINE SUB-CASE-2 (STRNOD CPYNOD + "AUX" (DATA <GET-SUB-DATA .STRNOD>) + (DATAC <GET-SUB-DATA .CPYNOD>)) + #DECL ((STRNOD CPYNOD) NODE (DATAC DATA) <OR FALSE LIST>) + <AND .DATA + .DATAC + <==? <1 .DATA> <1 .DATAC>> + <TYPE? <2 .DATA> FIX> + <OR <0? <2 .DATA>> + <AND <TYPE? <2 .DATAC> FIX> <L? <2 .DATA> <2 .DATAC>>>>>> + + +<DEFINE GET-SUB-DATA (NOD "AUX" SYM TNOD (NTYP <NODE-TYPE .NOD>)) + #DECL ((NOD TNOD) NODE (SYM) SYMTAB (NTYP) FIX) + <COND (<OR <==? .NTYP ,LVAL-CODE> <==? .NTYP ,SET-CODE>> + (<NODE-NAME .NOD> 0)) + (<AND <==? .NTYP ,REST-CODE> + <COND (<OR <==? <SET NTYP <NODE-TYPE <SET TNOD <1 <KIDS .NOD>>>>> + ,LVAL-CODE> + <==? .NTYP ,SET-CODE>> + <SET SYM <NODE-NAME .TNOD>>)>> + (.SYM <NODE-NAME <2 <KIDS .NOD>>>))>><ENDPACKAGE> + \ No newline at end of file diff --git a/<mdl.comp>/bitana.mud.5 b/<mdl.comp>/bitana.mud.5 new file mode 100644 index 0000000..e349c4e --- /dev/null +++ b/<mdl.comp>/bitana.mud.5 @@ -0,0 +1,84 @@ + +<PACKAGE "BITANA"> + +<ENTRY BIT-ANA GETBITS-ANA PUTBITS-ANA BITLOG> + +<USE "SYMANA" "CHKDCL" "COMPDEC"> + +"MUDDLE BITS,GETBITS,PUTBITS,ANDB,XORB,EQVB AND ORB COMPILER ROUTINES." + +<DEFINE BIT-ANA (NOD RTYP "AUX" (K <KIDS .NOD>) (POSN 0) POS WIDTH) + #DECL ((WIDTH POS NOD) NODE (K) <LIST [REST NODE]>) + <COND (<SEGFLUSH .NOD .RTYP>) + (ELSE + <ARGCHK <LENGTH .K> '(1 2) BITS> + <EANA <SET WIDTH <1 .K>> FIX BITS> + <COND (<NOT <EMPTY? <REST .K>>> + <EANA <SET POS <2 .K>> FIX BITS> + <SET POSN <NODE-NAME .POS>> ;"May be position field.")> + <COND (<AND <==? <NODE-TYPE .WIDTH> ,QUOTE-CODE> + <OR <NOT <ASSIGNED? POS>> ;"Only one arg." + <==? <NODE-TYPE .POS> ,QUOTE-CODE>>> + <PUT .NOD ,NODE-TYPE ,QUOTE-CODE> + <PUT .NOD ,NODE-NAME <BITS <NODE-NAME .WIDTH> .POSN>> + <PUT .NOD ,KIDS ()>) + (ELSE <PUT .NOD ,NODE-TYPE ,BITS-CODE>)>)> + <TYPE-OK? BITS .RTYP>> + +<PUT ,BITS ANALYSIS ,BIT-ANA> + +<DEFINE GETBITS-ANA (N R) #DECL ((N) NODE) <PGBITS .N .R 2 ,GETBITS-CODE>> + +<PUT ,GETBITS ANALYSIS ,GETBITS-ANA> + +<DEFINE PUTBITS-ANA (N R) <PGBITS .N .R '(2 3) ,PUTBITS-CODE>> + +<PUT ,PUTBITS ANALYSIS ,PUTBITS-ANA> + +<DEFINE PGBITS (NOD RTYP NARG COD "AUX" (K <KIDS .NOD>) (NAM <NODE-NAME .NOD>)) + #DECL ((NOD) NODE (COD) FIX (K) <LIST [REST NODE]>) + <COND (<SEGFLUSH .NOD .RTYP>) + (ELSE + <ARGCHK <LENGTH .K> .NARG .NAM> + <PUT .NOD ,NODE-TYPE .COD> + <EANA <1 .K> + <COND (<==? .COD ,GETBITS-CODE> + '<OR <PRIMTYPE WORD> + <PRIMTYPE STORAGE>>) + (ELSE '<PRIMTYPE WORD>)> + .NAM> + <EANA <2 .K> BITS .NAM> + <AND <==? <LENGTH .K> 3> + <EANA <3 .K> '<PRIMTYPE WORD> .NAM>>)> + <TYPE-OK? <COND (<==? .COD ,GETBITS-CODE> WORD) + (<ISTYPE? <RESULT-TYPE <1 .K>>>) + (ELSE '<PRIMTYPE WORD>)> + .RTYP>> + +<DEFINE BITLOG (NOD RTYP "AUX" (K <KIDS .NOD>) (LN <LENGTH .K>)) + #DECL ((NOD) NODE (K) <LIST [REST NODE]> (LN) FIX) + <COND (<SEGFLUSH .NOD .RTYP>) + (<0? .LN> + <PUT .NOD ,NODE-TYPE ,QUOTE-CODE> + <PUT .NOD ,KIDS ()> + <PUT .NOD ,NODE-NAME <APPLY <NODE-SUBR .NOD>>>) + (<1? .LN> <PUT .NOD ,NODE-TYPE ,ID-CODE>) + (ELSE + <PUT .NOD ,NODE-TYPE ,BITL-CODE> + <MAPF <> + <FUNCTION (K1) + #DECL ((K1) NODE) + <EANA .K1 '<PRIMTYPE WORD> <NODE-NAME .NOD>>> + .K>)> + <TYPE-OK? WORD .RTYP>> + +<PUT ,ANDB ANALYSIS ,BITLOG> + +<PUT ,ORB ANALYSIS ,BITLOG> + +<PUT ,XORB ANALYSIS ,BITLOG> + +<PUT ,EQVB ANALYSIS ,BITLOG> + +<ENDPACKAGE> + diff --git a/<mdl.comp>/bits.mud.1 b/<mdl.comp>/bits.mud.1 new file mode 100644 index 0000000..26c2b9e --- /dev/null +++ b/<mdl.comp>/bits.mud.1 @@ -0,0 +1,383 @@ + +"MUDDLE BITS,GETBITS,PUTBITS,ANDB,XORB,EQVB AND ORB COMPILER ROUTINES." + +<DEFINE BIT-ANA (NOD RTYP "AUX" (K <KIDS .NOD>) (POSN 0) POS WIDTH) + #DECL ((WIDTH POS NOD) NODE (K) <LIST [REST NODE]>) + <COND (<SEGFLUSH .NOD .RTYP>) + (ELSE + <ARGCHK <LENGTH .K> '(1 2) BITS> + <EANA <SET WIDTH <1 .K>> FIX BITS> + <COND (<NOT <EMPTY? <REST .K>>> + <EANA <SET POS <2 .K>> FIX BITS> + <SET POSN <NODE-NAME .POS>> ;"May be position field.")> + <COND (<AND <==? <NODE-TYPE .WIDTH> ,QUOTE-CODE> + <OR <NOT <ASSIGNED? POS>> ;"Only one arg." + <==? <NODE-TYPE .POS> ,QUOTE-CODE>>> + <PUT .NOD ,NODE-TYPE ,QUOTE-CODE> + <PUT .NOD ,NODE-NAME <BITS <NODE-NAME .WIDTH> .POSN>> + <PUT .NOD ,KIDS ()>) + (ELSE <PUT .NOD ,NODE-TYPE ,BITS-CODE>)>)> + <TYPE-OK? BITS .RTYP>> + +<PUT ,BITS ANALYSIS ,BIT-ANA> + +<DEFINE GETBITS-ANA (N R) #DECL ((N) NODE) <PGBITS .N .R 2 ,GETBITS-CODE>> + +<PUT ,GETBITS ANALYSIS ,GETBITS-ANA> + +<DEFINE PUTBITS-ANA (N R) <PGBITS .N .R '(2 3) ,PUTBITS-CODE>> + +<PUT ,PUTBITS ANALYSIS ,PUTBITS-ANA> + +<DEFINE PGBITS (NOD RTYP NARG COD "AUX" (K <KIDS .NOD>) (NAM <NODE-NAME .NOD>)) + #DECL ((NOD) NODE (COD) FIX (K) <LIST [REST NODE]>) + <COND (<SEGFLUSH .NOD .RTYP>) + (ELSE + <ARGCHK <LENGTH .K> .NARG .NAM> + <PUT .NOD ,NODE-TYPE .COD> + <EANA <1 .K> + <COND (<==? .COD ,GETBITS-CODE> + '<OR <PRIMTYPE WORD> + <PRIMTYPE STORAGE>>) + (ELSE '<PRIMTYPE WORD>)> + .NAM> + <EANA <2 .K> BITS .NAM> + <IF <==? <LENGTH .K> 3> + <EANA <3 .K> '<PRIMTYPE WORD> .NAM>>)> + <TYPE-OK? <COND (<==? .COD ,GETBITS-CODE> WORD) + (<ISTYPE? <RESULT-TYPE <1 .K>>>) + (ELSE '<PRIMTYPE WORD>)> + .RTYP>> + +<DEFINE BITLOG (NOD RTYP "AUX" (K <KIDS .NOD>) (LN <LENGTH .K>)) + #DECL ((NOD) NODE (K) <LIST [REST NODE]> (LN) FIX) + <COND (<SEGFLUSH .NOD .RTYP>) + (<0? .LN> + <PUT .NOD ,NODE-TYPE ,QUOTE-CODE> + <PUT .NOD ,KIDS ()> + <PUT .NOD ,NODE-NAME <APPLY <NODE-SUBR .NOD>>>) + (<1? .LN> <PUT .NOD ,NODE-TYPE ,ID-CODE>) + (ELSE + <PUT .NOD ,NODE-TYPE ,BITL-CODE> + <MAPF <> + <FUNCTION (K1) + #DECL ((K1) NODE) + <EANA .K1 '<PRIMTYPE WORD> <NODE-NAME .NOD>>> + .K>)> + <TYPE-OK? WORD .RTYP>> + +<PUT ,ANDB ANALYSIS ,BITLOG> + +<PUT ,ORB ANALYSIS ,BITLOG> + +<PUT ,XORB ANALYSIS ,BITLOG> + +<PUT ,EQVB ANALYSIS ,BITLOG> + +<DEFINE BITLOG-GEN (N W + "AUX" (K <KIDS .N>) (REG <UPDATE-WHERE .N .W>) (FST <1 .K>) + (INS <LGINS <NODE-SUBR .N>>)) + #DECL ((FST N) NODE (K) <LIST [REST NODE]> (REG) DATUM) + <COND (<==? <NODE-TYPE .FST> ,QUOTE-CODE> + <PUT .K 1 <2 .K>> + <PUT .K 2 .FST>)> + <SET REG <GEN <1 .K> .REG>> + <RET-TMP-AC <DATTYP .REG> .REG> + <PUT .REG + ,DATTYP + <COND (<ISTYPE? <RESULT-TYPE .N>>) (ELSE WORD)>> + <MAPF <> + <FUNCTION (NN "AUX" (NXT <GEN .NN DONT-CARE>) TT) + #DECL ((NN) NODE (NXT) DATUM) + <COND (<TYPE? <DATVAL .REG> AC>) + (<TYPE? <SET TT <DATVAL .NXT>> AC> + <PUT .NXT ,DATVAL <DATVAL .REG>> + <PUT .REG ,DATVAL .TT> + <FIX-ACLINK .TT .REG .NXT>) + (ELSE <TOACV .REG>)> + <PUT <SET TT <DATVAL .REG>> ,ACPROT T> + <MUNG-AC .TT .REG> + <IMCHK .INS <ACSYM .TT> <DATVAL .NXT> T> + <PUT .TT ,ACPROT <>> + <RET-TMP-AC .NXT>> + <REST .K>> + <MOVE:ARG .REG .W>> + +<DEFINE LGINS (SUBR) + <NTH '![(`AND `ANDI `ANDCMI ) + (`IOR `IORI `ORCMI ) + (`XOR `XORI ) + (`EQV `EQVI )!] + <LENGTH <MEMQ .SUBR ,LSUBRS>>>> + +<SETG LSUBRS ![,EQVB ,XORB ,ORB ,ANDB!]> + +<DEFINE GETBITS-GEN (N W + "AUX" (WRDN <1 <KIDS .N>>) (BP <2 <KIDS .N>>) REG POS WDTH + BAC AC BPW WRD BPD TEM) + #DECL ((WRDN N BP) NODE (POS WDTH) FIX (WRD REG BPD) DATUM (AC BAC) AC + (BPW) <PRIMTYPE WORD>) + <COND + (<==? <NODE-TYPE .BP> ,QUOTE-CODE> + <SET WRD <GEN .WRDN DONT-CARE>> + <SET BPW <NODE-NAME .BP>> + <SET POS <CHTYPE <GETBITS .BPW #BITS *360600000000*> FIX>> + <SET WDTH <CHTYPE <GETBITS .BPW #BITS *300600000000*> FIX>> + <COND + (<AND <==? <+ .POS .WDTH> 36> + <N==? .WDTH 18> + <TYPE? <DATVAL .WRD> AC> + <NOT <ACRESIDUE <SET AC <DATVAL .WRD>>>> + <OR <==? .W DONT-CARE> + <AND <TYPE? .W DATUM> <==? .AC <DATVAL .WRD>>>>> + <MUNG-AC .AC <SET REG .WRD>> + <EMIT <INSTRUCTION `LSH <ACSYM .AC> <- .POS>>>) + (ELSE + <PUT <SGETREG <SET AC <DATVAL <SET REG <REG? WORD .W T>>>> .REG> + ,ACPROT + T> + <COND (<AND <==? .WDTH 18> ;"Could be half word hack." + <COND (<0? .POS> + <EMIT <INSTRUCTION `HRRZ + <ACSYM .AC> + !<ADDR:VALUE .WRD>>> + T) + (<==? .POS 18> + <EMIT <INSTRUCTION `HLRZ + <ACSYM .AC> + !<ADDR:VALUE .WRD>>> + T)>>) + (ELSE + <EMIT <INSTRUCTION `LDB + <ACSYM .AC> + [<FORM <CHTYPE .BPW OPCODE!-OP!-PACKAGE> + !<ADDR:VALUE .WRD>>]>>)> + <PUT .AC ,ACPROT <>> + <RET-TMP-AC .WRD>)>) + (<==? <NODE-TYPE .BP> ,BITS-CODE> + <SET WRD + <GEN .WRDN + <COND (<SIDE-EFFECTS .BP> <DATUM WORD ANY-AC>) + (ELSE DONT-CARE)>>> + <SET BPD + <1 <SET TEM <RBITS-GEN .BP <DATUM BITS ANY-AC> .WRD>>>> + <PUT <SGETREG <SET AC <DATVAL <SET REG <REG? WORD .W T>>>> .REG> + ,ACPROT + T> + <TOACV .BPD> + <PUT <SET BAC <DATVAL .BPD>> ,ACPROT T> + <SET TEM <2 .TEM>> + <PUT .TEM 1 <1 <ADDR:VALUE .WRD>>> + <PUTREST .TEM <REST <ADDR:VALUE .WRD>>> + <EMIT <INSTRUCTION `LDB <ACSYM .AC> <ADDRSYM .BAC>>> + <PUT .BAC ,ACPROT <>> + <PUT .AC ,ACPROT <>> + <RET-TMP-AC .WRD> + <RET-TMP-AC .BPD>) + (ELSE ;"Non constant byte pointer." + <SET WRD + <GEN .WRDN + <COND (<SIDE-EFFECTS .BP> <DATUM WORD ANY-AC>) + (ELSE DONT-CARE)>>> + <SET BPD <GEN .BP DONT-CARE>> + <PUT <SGETREG <SET AC <DATVAL <SET REG <REG? WORD .W T>>>> .REG> + ,ACPROT + T> + <SET BPD <MOVE:ARG .BPD <DATUM BITS ANY-AC>>> + <PUT <SET BAC <DATVAL .BPD>> ,ACPROT T> + <MUNG-AC .BAC .BPD> + <EMIT <INSTRUCTION `HRRI <ACSYM .BAC> !<ADDR:VALUE .WRD>>> + <EMIT <INSTRUCTION `LDB <ACSYM .AC> <ADDRSYM .BAC>>> + <PUT .BAC ,ACPROT <>> + <PUT .AC ,ACPROT <>> + <RET-TMP-AC .WRD> + <RET-TMP-AC .BPD>)> + <MOVE:ARG .REG .W>> + +<DEFINE PUTBITS-GEN (N W + "AUX" (K <KIDS .N>) (SWRD <1 .K>) (BP <2 .K>) BAC POS WDTH + FLD BPW BPD SWRDD (FLG T) TEM NUM) + #DECL ((N SWRD BP) NODE (FLD BPD REG SWRDD) DATUM (AC BAC PAC) AC + (POS WDTH) FIX (BPW) <PRIMTYPE WORD> (NUM) <OR FALSE FIX>) + <COND + (<==? <NODE-TYPE .BP> ,QUOTE-CODE> + <SET POS + <CHTYPE <GETBITS <SET BPW <NODE-NAME .BP>> #BITS *360600000000*> FIX>> + <SET WDTH <CHTYPE <GETBITS .BPW #BITS *300600000000*> FIX>> + <COND + (<AND <==? <NODE-TYPE .SWRD> ,QUOTE-CODE> + <0? <CHTYPE <NODE-NAME .SWRD> FIX>>> + <SET SWRDD <GEN <3 .K> <REG? <RESULT-TYPE .SWRD> .W>>> + <MUNG-AC <DATVAL .SWRDD> .SWRDD> + <COND (<L? <+ .POS .WDTH> 36> + <IMCHK '(`AND `ANDI ) + <ACSYM <DATVAL .SWRDD>> + <REFERENCE:ADR <GETBITS -1 <BITS .WDTH>>>>)> + <EMIT <INSTRUCTION `LSH <ACSYM <DATVAL .SWRDD>> .POS>>) + (ELSE + <SET SWRDD + <GEN .SWRD + <REG? <COND (<ISTYPE? <RESULT-TYPE .SWRD>>) (ELSE TUPLE)> .W>>> + <MUNG-AC <DATVAL .SWRDD> .SWRDD> + <COND + (<AND + <==? .WDTH 18> + <COND + (<0? .POS> + <COND (<AND <SET NUM <ZERQ .K>> <OR <L=? .NUM 0> <G=? .NUM 262143>>> + <EMIT <INSTRUCTION <COND (<0? .NUM> `HLLZS ) (ELSE `HLLOS )> + <ADDRSYM <DATVAL .SWRDD>>>>) + (ELSE <PCLOB .SWRDD '(`HRR `HRRI ) <3 .K>>)>) + (<==? .POS 18> + <COND (<AND <SET NUM <ZERQ .K>> <OR <L=? .NUM 0> <G=? .NUM 262143>>> + <EMIT <INSTRUCTION <COND (<0? .NUM> `HRRZS ) (ELSE `HRROS )> + <ADDRSYM <DATVAL .SWRDD>>>>) + (ELSE <PCLOB .SWRDD '(`HRL `HRLI ) <3 .K>>)> + T)>>) + (<AND <OR <AND <L? .POS 18> <L=? <+ .POS .WDTH> 18>> <G? .POS 18>> + <SET NUM <ZERQ .K>> + <OR <0? .NUM> <L? .WDTH <POPWR2 <+ .NUM 1>>>>> + <EMIT <INSTRUCTION <COND (<0? .NUM> + <COND (<L? .POS 18> `ANDCMI ) (ELSE `TLZ )>) + (ELSE + <COND (<L? .POS 18> `IORI ) (ELSE `TLO )>)> + <ACSYM <DATVAL .SWRDD>> + <LSH <LSH -1 <- .WDTH 36>> + <COND (<L? .POS 18> .POS) + (ELSE <- .POS 18>)>>>>) + (ELSE + <SET FLD <GEN <3 .K> <DATUM WORD ANY-AC>>> + <PUT <DATVAL .FLD> ,ACPROT T> + <TOACV .SWRDD> + <PUT <DATVAL .SWRDD> ,ACPROT T> + <EMIT <INSTRUCTION `DPB + <ACSYM <DATVAL .FLD>> + [<FORM <CHTYPE .BPW OPCODE!-OP!-PACKAGE> + <ADDRSYM <DATVAL .SWRDD>>>]>> + <PUT <DATVAL .FLD> ,ACPROT <>> + <PUT <DATVAL .SWRDD> ,ACPROT <>> + <RET-TMP-AC .FLD>)>)>) + (ELSE + <COND (<NOT <AND <NOT <SIDE-EFFECTS .N>> <MEMQ <NODE-TYPE .SWRD> ,SNODES>>> + <SET SWRDD + <GEN .SWRD + <REG? <COND (<ISTYPE? <RESULT-TYPE .SWRD>>) (ELSE TUPLE)> + .W>>>)> + <PREFER-DATUM .W> + <SET BPD + <COND (<==? <NODE-TYPE .BP> ,BITS-CODE> + <SET FLG <>> + <1 <SET TEM + <RBITS-GEN .BP + <DATUM BITS ANY-AC> + <COND (<ASSIGNED? SWRDD> .SWRDD) + (ELSE ,NO-DATUM)>>>>) + (ELSE <GEN .BP DONT-CARE>)>> + <PREFER-DATUM .W> + <COND (<SET NUM <ZERQ .K>> + <SET FLD <MOVE:ARG <REFERENCE .NUM> <DATUM WORD ANY-AC>>>) + (ELSE <SET FLD <GEN <3 .K> <DATUM WORD ANY-AC>>>)> + <DATTYP-FLUSH .FLD> + <PUT .FLD ,DATTYP WORD> + <COND (<NOT <ASSIGNED? SWRDD>> + <SET SWRDD + <GEN .SWRD + <REG? <COND (<ISTYPE? <RESULT-TYPE .SWRD>>) (ELSE TUPLE)> + .W>>>)> + <COND (<NOT <TYPE? <DATVAL .SWRDD> AC>> + <SET SWRDD + <MOVE:ARG + .SWRDD + <REG? <COND (<ISTYPE? <RESULT-TYPE .SWRD>>) (ELSE TUPLE)> + .W>>>)> + <PUT <DATVAL .SWRDD> ,ACPROT T> + <TOACV .FLD> + <PUT <DATVAL .FLD> ,ACPROT T> + <TOACV .BPD> + <PUT <SET BAC <DATVAL .BPD>> ,ACPROT T> + <COND (<NOT .FLG> + <PUT <2 .TEM> 1 <ADDRSYM <DATVAL .SWRDD>>> + <PUTREST <2 .TEM> ()>)> + <MUNG-AC <DATVAL .SWRDD> .SWRDD> + <COND (.FLG + <MUNG-AC .BAC .BPD> + <EMIT <INSTRUCTION `HRRI <ACSYM .BAC> <ADDRSYM <DATVAL .SWRDD>>>>)> + <EMIT <INSTRUCTION `DPB <ACSYM <DATVAL .FLD>> <ADDRSYM .BAC>>> + <PUT .BAC ,ACPROT <>> + <PUT <DATVAL .SWRDD> ,ACPROT <>> + <PUT <DATVAL .FLD> ,ACPROT <>> + <RET-TMP-AC .BPD> + <RET-TMP-AC .FLD>)> + <MOVE:ARG .SWRDD .W>> + +<DEFINE ZERQ (L "AUX" NUM) + #DECL ((L) <LIST [REST NODE]>) + <COND (<==? <LENGTH .L> 2> 0) + (<AND <==? <NODE-TYPE <SET NUM <3 .L>>> ,QUOTE-CODE> + <==? <PRIMTYPE <SET NUM <NODE-NAME .NUM>>> WORD> + <OR <AND <0? <SET NUM <CHTYPE .NUM FIX>>> 0> + <AND <POPWR2 <+ .NUM 1>> .NUM>>>)>> + +<DEFINE PCLOB (DEST INS SRC "AUX" SRCD) + #DECL ((DEST SRCD) DATUM (SRC) NODE) + <SET SRCD <GEN .SRC DONT-CARE>> + <TOACV .DEST> + <PUT <DATVAL .DEST> ,ACPROT T> + <IMCHK .INS <ACSYM <DATVAL .DEST>> <DATVAL .SRCD>> + <PUT <DATVAL .DEST> ,ACPROT <>> + <RET-TMP-AC .SRCD>> + +<DEFINE BITS-GEN (N W) <1 <RBITS-GEN .N .W DONT-CARE>>> + +<DEFINE RBITS-GEN (N W ADDR + "AUX" (K <KIDS .N>) (WDTHN <1 .K>) WDTH POS TEM + (REG <REG? WORD .W>) POSD (FLG T)) + #DECL ((POS N WDTHN) NODE (REG WDTH POSD) DATUM (K) <LIST [REST NODE]>) + <COND (<==? <LENGTH .K> 2> <SET POS <2 .K>>)> + <COND + (<==? <NODE-TYPE .WDTHN> ,QUOTE-CODE> + <SET TEM <MAKE-PTR .ADDR T <NODE-NAME .WDTHN>>>) + (<OR <NOT <ASSIGNED? POS>> + <==? <NODE-TYPE .POS> ,QUOTE-CODE>> + <SET TEM + <MAKE-PTR .ADDR + <> + <COND (<ASSIGNED? POS> <NODE-NAME .POS>) (ELSE 0)>>> + <SET POS .WDTHN> + <SET FLG <>>) + (ELSE + <SET WDTH <GEN .WDTHN .REG>> + <MUNG-AC <DATVAL .REG> .REG> + <EMIT <INSTRUCTION `LSH <ACSYM <DATVAL .REG>> 24>> + <COND (<TYPE? .ADDR DATUM> + <EMIT <SET TEM <INSTRUCTION `HRRI <ACSYM <DATVAL .REG>> 0>>> + <SET TEM <REST .TEM 2>>) + (ELSE <SET TEM '(0)>)>)> + <SET POSD <GEN .POS <DATUM WORD ANY-AC>>> + <PUT <DATVAL .POSD> ,ACPROT T> + <COND (<NOT <ASSIGNED? WDTH>> + <SET WDTH <DATUM WORD ANY-AC>> + <PUT .WDTH ,DATVAL <GETREG .WDTH>> + <EMIT <INSTRUCTION `MOVE <ACSYM <DATVAL .WDTH>> .TEM>> + <SET TEM <REST <1 .TEM>>>) + (ELSE <TOACV .WDTH>)> + <PUT <DATVAL .WDTH> ,ACPROT T> + <EMIT <INSTRUCTION `DPB + <ACSYM <DATVAL .POSD>> + [<FORM (<COND (.FLG 123264) (ELSE 98688)>) + <ADDRSYM <DATVAL .WDTH>>>]>> + <PUT <DATVAL .WDTH> ,ACPROT <>> + <PUT <DATVAL .POSD> ,ACPROT <>> + <RET-TMP-AC .POSD> + <COND (<TYPE? <DATTYP .WDTH> AC> + <RET-TMP-AC <DATTYP .WDTH> .WDTH>)> + <PUT .WDTH ,DATTYP BITS> + [<MOVE:ARG .WDTH .W> .TEM]> + +<DEFINE MAKE-PTR (AD W-P CNST "AUX" (BP <BITS 6 <COND (.W-P 24) (ELSE 30)>>)) + #DECL ((CNST) FIX) + <COND (<TYPE? .AD DATUM> + [<FORM (<GETBITS <PUTBITS 0 .BP .CNST> <BITS 18 18>>) HERE>]) + (ELSE + [<FORM (<GETBITS <PUTBITS 0 .BP .CNST> <BITS 18 18>>) 0>])>> + \ No newline at end of file diff --git a/<mdl.comp>/bitsge.mud.2 b/<mdl.comp>/bitsge.mud.2 new file mode 100644 index 0000000..ee4543f --- /dev/null +++ b/<mdl.comp>/bitsge.mud.2 @@ -0,0 +1,314 @@ +<PACKAGE "BITSGEN"> + +<ENTRY BITLOG-GEN GETBITS-GEN PUTBITS-GEN BITS-GEN> + +<USE "CACS" "CODGEN" "COMCOD" "COMPDEC" "CHKDCL"> + +<DEFINE BITLOG-GEN (N W + "AUX" (K <KIDS .N>) (REG <UPDATE-WHERE .N .W>) (FST <1 .K>) + (INS <LGINS <NODE-SUBR .N>>)) + #DECL ((FST N) NODE (K) <LIST [REST NODE]> (REG) DATUM) + <COND (<==? <NODE-TYPE .FST> ,QUOTE-CODE> + <PUT .K 1 <2 .K>> + <PUT .K 2 .FST>)> + <SET REG <GEN <1 .K> .REG>> + <RET-TMP-AC <DATTYP .REG> .REG> + <PUT .REG + ,DATTYP + <COND (<ISTYPE? <RESULT-TYPE .N>>) (ELSE WORD)>> + <MAPF <> + <FUNCTION (NN "AUX" (NXT <GEN .NN DONT-CARE>) TT) + #DECL ((NN) NODE (NXT) DATUM) + <COND (<TYPE? <DATVAL .REG> AC>) + (<TYPE? <SET TT <DATVAL .NXT>> AC> + <PUT .NXT ,DATVAL <DATVAL .REG>> + <PUT .REG ,DATVAL .TT> + <FIX-ACLINK .TT .REG .NXT>) + (ELSE <TOACV .REG>)> + <PUT <SET TT <DATVAL .REG>> ,ACPROT T> + <MUNG-AC .TT .REG> + <IMCHK .INS <ACSYM .TT> <DATVAL .NXT> T> + <PUT .TT ,ACPROT <>> + <RET-TMP-AC .NXT>> + <REST .K>> + <MOVE:ARG .REG .W>> + +<DEFINE LGINS (SUBR) + <NTH '![(`AND `ANDI `ANDCMI ) + (`IOR `IORI `ORCMI ) + (`XOR `XORI ) + (`EQV `EQVI )!] + <LENGTH <MEMQ .SUBR ,LSUBRS>>>> + +<SETG LSUBRS ![,EQVB ,XORB ,ORB ,ANDB!]> + +<DEFINE GETBITS-GEN (N W + "AUX" (WRDN <1 <KIDS .N>>) (BP <2 <KIDS .N>>) REG POS WDTH + BAC AC BPW WRD BPD TEM) + #DECL ((WRDN N BP) NODE (POS WDTH) FIX (WRD REG BPD) DATUM (AC BAC) AC + (BPW) <PRIMTYPE WORD>) + <COND + (<==? <NODE-TYPE .BP> ,QUOTE-CODE> + <SET WRD <GEN .WRDN DONT-CARE>> + <SET BPW <NODE-NAME .BP>> + <SET POS <CHTYPE <GETBITS .BPW #BITS *360600000000*> FIX>> + <SET WDTH <CHTYPE <GETBITS .BPW #BITS *300600000000*> FIX>> + <COND + (<AND <==? <+ .POS .WDTH> 36> + <N==? .WDTH 18> + <TYPE? <DATVAL .WRD> AC> + <NOT <ACRESIDUE <SET AC <DATVAL .WRD>>>> + <OR <==? .W DONT-CARE> + <AND <TYPE? .W DATUM> <==? .AC <DATVAL .WRD>>>>> + <MUNG-AC .AC <SET REG .WRD>> + <EMIT <INSTRUCTION `LSH <ACSYM .AC> <- .POS>>>) + (ELSE + <PUT <SGETREG <SET AC <DATVAL <SET REG <REG? WORD .W T>>>> .REG> + ,ACPROT + T> + <COND (<AND <==? .WDTH 18> ;"Could be half word hack." + <COND (<0? .POS> + <EMIT <INSTRUCTION `HRRZ + <ACSYM .AC> + !<ADDR:VALUE .WRD>>> + T) + (<==? .POS 18> + <EMIT <INSTRUCTION `HLRZ + <ACSYM .AC> + !<ADDR:VALUE .WRD>>> + T)>>) + (ELSE + <EMIT <INSTRUCTION `LDB + <ACSYM .AC> + [<FORM <CHTYPE .BPW OPCODE!-OP!-PACKAGE> + !<ADDR:VALUE .WRD>>]>>)> + <PUT .AC ,ACPROT <>> + <RET-TMP-AC .WRD>)>) + (<==? <NODE-TYPE .BP> ,BITS-CODE> + <SET WRD + <GEN .WRDN + <COND (<SIDE-EFFECTS .BP> <DATUM WORD ANY-AC>) + (ELSE DONT-CARE)>>> + <SET BPD + <1 <SET TEM <RBITS-GEN .BP <DATUM BITS ANY-AC> .WRD>>>> + <PUT <SGETREG <SET AC <DATVAL <SET REG <REG? WORD .W T>>>> .REG> + ,ACPROT + T> + <TOACV .BPD> + <PUT <SET BAC <DATVAL .BPD>> ,ACPROT T> + <SET TEM <2 .TEM>> + <PUT .TEM 1 <1 <ADDR:VALUE .WRD>>> + <PUTREST .TEM <REST <ADDR:VALUE .WRD>>> + <EMIT <INSTRUCTION `LDB <ACSYM .AC> <ADDRSYM .BAC>>> + <PUT .BAC ,ACPROT <>> + <PUT .AC ,ACPROT <>> + <RET-TMP-AC .WRD> + <RET-TMP-AC .BPD>) + (ELSE ;"Non constant byte pointer." + <SET WRD + <GEN .WRDN + <COND (<SIDE-EFFECTS .BP> <DATUM WORD ANY-AC>) + (ELSE DONT-CARE)>>> + <SET BPD <GEN .BP DONT-CARE>> + <PUT <SGETREG <SET AC <DATVAL <SET REG <REG? WORD .W T>>>> .REG> + ,ACPROT + T> + <SET BPD <MOVE:ARG .BPD <DATUM BITS ANY-AC>>> + <PUT <SET BAC <DATVAL .BPD>> ,ACPROT T> + <MUNG-AC .BAC .BPD> + <EMIT <INSTRUCTION `HRRI <ACSYM .BAC> !<ADDR:VALUE .WRD>>> + <EMIT <INSTRUCTION `LDB <ACSYM .AC> <ADDRSYM .BAC>>> + <PUT .BAC ,ACPROT <>> + <PUT .AC ,ACPROT <>> + <RET-TMP-AC .WRD> + <RET-TMP-AC .BPD>)> + <MOVE:ARG .REG .W>> + +<DEFINE PUTBITS-GEN (N W + "AUX" (K <KIDS .N>) (SWRD <1 .K>) (BP <2 .K>) BAC POS WDTH + FLD BPW BPD SWRDD (FLG T) TEM NUM) + #DECL ((N SWRD BP) NODE (FLD BPD REG SWRDD) DATUM (AC BAC PAC) AC + (POS WDTH) FIX (BPW) <PRIMTYPE WORD> (NUM) <OR FALSE FIX>) + <COND + (<==? <NODE-TYPE .BP> ,QUOTE-CODE> + <SET POS + <CHTYPE <GETBITS <SET BPW <NODE-NAME .BP>> #BITS *360600000000*> FIX>> + <SET WDTH <CHTYPE <GETBITS .BPW #BITS *300600000000*> FIX>> + <COND + (<AND <==? <NODE-TYPE .SWRD> ,QUOTE-CODE> + <0? <CHTYPE <NODE-NAME .SWRD> FIX>>> + <SET SWRDD <GEN <3 .K> <REG? <RESULT-TYPE .SWRD> .W>>> + <MUNG-AC <DATVAL .SWRDD> .SWRDD> + <COND (<L? <+ .POS .WDTH> 36> + <IMCHK '(`AND `ANDI ) + <ACSYM <DATVAL .SWRDD>> + <REFERENCE:ADR <GETBITS -1 <BITS .WDTH>>>>)> + <EMIT <INSTRUCTION `LSH <ACSYM <DATVAL .SWRDD>> .POS>>) + (ELSE + <SET SWRDD + <GEN .SWRD + <REG? <COND (<ISTYPE? <RESULT-TYPE .SWRD>>) (ELSE TUPLE)> .W>>> + <MUNG-AC <DATVAL .SWRDD> .SWRDD> + <COND + (<AND + <==? .WDTH 18> + <COND + (<0? .POS> + <COND (<AND <SET NUM <ZERQ .K>> <OR <L=? .NUM 0> <G=? .NUM 262143>>> + <EMIT <INSTRUCTION <COND (<0? .NUM> `HLLZS ) (ELSE `HLLOS )> + <ADDRSYM <DATVAL .SWRDD>>>>) + (ELSE <PCLOB .SWRDD '(`HRR `HRRI ) <3 .K>>)>) + (<==? .POS 18> + <COND (<AND <SET NUM <ZERQ .K>> <OR <L=? .NUM 0> <G=? .NUM 262143>>> + <EMIT <INSTRUCTION <COND (<0? .NUM> `HRRZS ) (ELSE `HRROS )> + <ADDRSYM <DATVAL .SWRDD>>>>) + (ELSE <PCLOB .SWRDD '(`HRL `HRLI ) <3 .K>>)> + T)>>) + (<AND <OR <AND <L? .POS 18> <L=? <+ .POS .WDTH> 18>> <G? .POS 18>> + <SET NUM <ZERQ .K>> + <OR <0? .NUM> <L? .WDTH <POPWR2 <+ .NUM 1>>>>> + <EMIT <INSTRUCTION <COND (<0? .NUM> + <COND (<L? .POS 18> `ANDCMI ) (ELSE `TLZ )>) + (ELSE + <COND (<L? .POS 18> `IORI ) (ELSE `TLO )>)> + <ACSYM <DATVAL .SWRDD>> + <LSH <LSH -1 <- .WDTH 36>> + <COND (<L? .POS 18> .POS) + (ELSE <- .POS 18>)>>>>) + (ELSE + <SET FLD <GEN <3 .K> <DATUM WORD ANY-AC>>> + <PUT <DATVAL .FLD> ,ACPROT T> + <TOACV .SWRDD> + <PUT <DATVAL .SWRDD> ,ACPROT T> + <EMIT <INSTRUCTION `DPB + <ACSYM <DATVAL .FLD>> + [<FORM <CHTYPE .BPW OPCODE!-OP!-PACKAGE> + <ADDRSYM <DATVAL .SWRDD>>>]>> + <PUT <DATVAL .FLD> ,ACPROT <>> + <PUT <DATVAL .SWRDD> ,ACPROT <>> + <RET-TMP-AC .FLD>)>)>) + (ELSE + <COND (<NOT <AND <NOT <SIDE-EFFECTS .N>> <MEMQ <NODE-TYPE .SWRD> ,SNODES>>> + <SET SWRDD + <GEN .SWRD + <REG? <COND (<ISTYPE? <RESULT-TYPE .SWRD>>) (ELSE TUPLE)> + .W>>>)> + <PREFER-DATUM .W> + <SET BPD + <COND (<==? <NODE-TYPE .BP> ,BITS-CODE> + <SET FLG <>> + <1 <SET TEM + <RBITS-GEN .BP + <DATUM BITS ANY-AC> + <COND (<ASSIGNED? SWRDD> .SWRDD) + (ELSE ,NO-DATUM)>>>>) + (ELSE <GEN .BP DONT-CARE>)>> + <PREFER-DATUM .W> + <COND (<SET NUM <ZERQ .K>> + <SET FLD <MOVE:ARG <REFERENCE .NUM> <DATUM WORD ANY-AC>>>) + (ELSE <SET FLD <GEN <3 .K> <DATUM WORD ANY-AC>>>)> + <DATTYP-FLUSH .FLD> + <PUT .FLD ,DATTYP WORD> + <COND (<NOT <ASSIGNED? SWRDD>> + <SET SWRDD + <GEN .SWRD + <REG? <COND (<ISTYPE? <RESULT-TYPE .SWRD>>) (ELSE TUPLE)> + .W>>>)> + <COND (<NOT <TYPE? <DATVAL .SWRDD> AC>> + <SET SWRDD + <MOVE:ARG + .SWRDD + <REG? <COND (<ISTYPE? <RESULT-TYPE .SWRD>>) (ELSE TUPLE)> + .W>>>)> + <PUT <DATVAL .SWRDD> ,ACPROT T> + <TOACV .FLD> + <PUT <DATVAL .FLD> ,ACPROT T> + <TOACV .BPD> + <PUT <SET BAC <DATVAL .BPD>> ,ACPROT T> + <COND (<NOT .FLG> + <PUT <2 .TEM> 1 <ADDRSYM <DATVAL .SWRDD>>> + <PUTREST <2 .TEM> ()>)> + <MUNG-AC <DATVAL .SWRDD> .SWRDD> + <COND (.FLG + <MUNG-AC .BAC .BPD> + <EMIT <INSTRUCTION `HRRI <ACSYM .BAC> <ADDRSYM <DATVAL .SWRDD>>>>)> + <EMIT <INSTRUCTION `DPB <ACSYM <DATVAL .FLD>> <ADDRSYM .BAC>>> + <PUT .BAC ,ACPROT <>> + <PUT <DATVAL .SWRDD> ,ACPROT <>> + <PUT <DATVAL .FLD> ,ACPROT <>> + <RET-TMP-AC .BPD> + <RET-TMP-AC .FLD>)> + <MOVE:ARG .SWRDD .W>> + +<DEFINE ZERQ (L "AUX" NUM) + #DECL ((L) <LIST [REST NODE]>) + <COND (<==? <LENGTH .L> 2>) + (<AND <==? <NODE-TYPE <SET NUM <3 .L>>> ,QUOTE-CODE> + <==? <PRIMTYPE <SET NUM <NODE-NAME .NUM>>> WORD> + <OR <AND <0? <SET NUM <CHTYPE .NUM FIX>>> 0> + <AND <POPWR2 <+ .NUM 1>> .NUM>>>)>> + +<DEFINE PCLOB (DEST INS SRC "AUX" SRCD) + #DECL ((DEST SRCD) DATUM (SRC) NODE) + <SET SRCD <GEN .SRC DONT-CARE>> + <TOACV .DEST> + <PUT <DATVAL .DEST> ,ACPROT T> + <IMCHK .INS <ACSYM <DATVAL .DEST>> <DATVAL .SRCD>> + <PUT <DATVAL .DEST> ,ACPROT <>> + <RET-TMP-AC .SRCD>> + +<DEFINE BITS-GEN (N W) <1 <RBITS-GEN .N .W DONT-CARE>>> + +<DEFINE RBITS-GEN (N W ADDR + "AUX" (K <KIDS .N>) (WDTHN <1 .K>) WDTH POS TEM + (REG <REG? WORD .W>) POSD (FLG T)) + #DECL ((POS N WDTHN) NODE (REG WDTH POSD) DATUM (K) <LIST [REST NODE]>) + <COND (<==? <LENGTH .K> 2> <SET POS <2 .K>>)> + <COND + (<==? <NODE-TYPE .WDTHN> ,QUOTE-CODE> + <SET TEM <MAKE-PTR .ADDR T <NODE-NAME .WDTHN>>>) + (<OR <NOT <ASSIGNED? POS>> + <==? <NODE-TYPE .POS> ,QUOTE-CODE>> + <SET TEM + <MAKE-PTR .ADDR + <> + <COND (<ASSIGNED? POS> <NODE-NAME .POS>) (ELSE 0)>>> + <SET POS .WDTHN> + <SET FLG <>>) + (ELSE + <SET WDTH <GEN .WDTHN .REG>> + <MUNG-AC <DATVAL .REG> .REG> + <EMIT <INSTRUCTION `LSH <ACSYM <DATVAL .REG>> 24>> + <COND (<TYPE? .ADDR DATUM> + <EMIT <SET TEM <INSTRUCTION `HRRI <ACSYM <DATVAL .REG>> 0>>> + <SET TEM <REST .TEM 2>>) + (ELSE <SET TEM '(0)>)>)> + <SET POSD <GEN .POS <DATUM WORD ANY-AC>>> + <PUT <DATVAL .POSD> ,ACPROT T> + <COND (<NOT <ASSIGNED? WDTH>> + <SET WDTH <DATUM WORD ANY-AC>> + <PUT .WDTH ,DATVAL <GETREG .WDTH>> + <EMIT <INSTRUCTION `MOVE <ACSYM <DATVAL .WDTH>> .TEM>> + <SET TEM <REST <1 .TEM>>>) + (ELSE <TOACV .WDTH>)> + <PUT <DATVAL .WDTH> ,ACPROT T> + <EMIT <INSTRUCTION `DPB + <ACSYM <DATVAL .POSD>> + [<FORM (<COND (.FLG 123264) (ELSE 98688)>) + <ADDRSYM <DATVAL .WDTH>>>]>> + <PUT <DATVAL .WDTH> ,ACPROT <>> + <PUT <DATVAL .POSD> ,ACPROT <>> + <RET-TMP-AC .POSD> + <COND (<TYPE? <DATTYP .WDTH> AC> + <RET-TMP-AC <DATTYP .WDTH> .WDTH>)> + <PUT .WDTH ,DATTYP BITS> + [<MOVE:ARG .WDTH .W> .TEM]> + +<DEFINE MAKE-PTR (AD W-P CNST "AUX" (BP <BITS 6 <COND (.W-P 24) (ELSE 30)>>)) + #DECL ((CNST) FIX) + <COND (<TYPE? .AD DATUM> + [<FORM (<GETBITS <PUTBITS 0 .BP .CNST> <BITS 18 18>>) HERE>]) + (ELSE + [<FORM (<GETBITS <PUTBITS 0 .BP .CNST> <BITS 18 18>>) 0>])>> + +<ENDPACKAGE> diff --git a/<mdl.comp>/bitsgen.mud.1 b/<mdl.comp>/bitsgen.mud.1 new file mode 100644 index 0000000..ee4543f --- /dev/null +++ b/<mdl.comp>/bitsgen.mud.1 @@ -0,0 +1,314 @@ +<PACKAGE "BITSGEN"> + +<ENTRY BITLOG-GEN GETBITS-GEN PUTBITS-GEN BITS-GEN> + +<USE "CACS" "CODGEN" "COMCOD" "COMPDEC" "CHKDCL"> + +<DEFINE BITLOG-GEN (N W + "AUX" (K <KIDS .N>) (REG <UPDATE-WHERE .N .W>) (FST <1 .K>) + (INS <LGINS <NODE-SUBR .N>>)) + #DECL ((FST N) NODE (K) <LIST [REST NODE]> (REG) DATUM) + <COND (<==? <NODE-TYPE .FST> ,QUOTE-CODE> + <PUT .K 1 <2 .K>> + <PUT .K 2 .FST>)> + <SET REG <GEN <1 .K> .REG>> + <RET-TMP-AC <DATTYP .REG> .REG> + <PUT .REG + ,DATTYP + <COND (<ISTYPE? <RESULT-TYPE .N>>) (ELSE WORD)>> + <MAPF <> + <FUNCTION (NN "AUX" (NXT <GEN .NN DONT-CARE>) TT) + #DECL ((NN) NODE (NXT) DATUM) + <COND (<TYPE? <DATVAL .REG> AC>) + (<TYPE? <SET TT <DATVAL .NXT>> AC> + <PUT .NXT ,DATVAL <DATVAL .REG>> + <PUT .REG ,DATVAL .TT> + <FIX-ACLINK .TT .REG .NXT>) + (ELSE <TOACV .REG>)> + <PUT <SET TT <DATVAL .REG>> ,ACPROT T> + <MUNG-AC .TT .REG> + <IMCHK .INS <ACSYM .TT> <DATVAL .NXT> T> + <PUT .TT ,ACPROT <>> + <RET-TMP-AC .NXT>> + <REST .K>> + <MOVE:ARG .REG .W>> + +<DEFINE LGINS (SUBR) + <NTH '![(`AND `ANDI `ANDCMI ) + (`IOR `IORI `ORCMI ) + (`XOR `XORI ) + (`EQV `EQVI )!] + <LENGTH <MEMQ .SUBR ,LSUBRS>>>> + +<SETG LSUBRS ![,EQVB ,XORB ,ORB ,ANDB!]> + +<DEFINE GETBITS-GEN (N W + "AUX" (WRDN <1 <KIDS .N>>) (BP <2 <KIDS .N>>) REG POS WDTH + BAC AC BPW WRD BPD TEM) + #DECL ((WRDN N BP) NODE (POS WDTH) FIX (WRD REG BPD) DATUM (AC BAC) AC + (BPW) <PRIMTYPE WORD>) + <COND + (<==? <NODE-TYPE .BP> ,QUOTE-CODE> + <SET WRD <GEN .WRDN DONT-CARE>> + <SET BPW <NODE-NAME .BP>> + <SET POS <CHTYPE <GETBITS .BPW #BITS *360600000000*> FIX>> + <SET WDTH <CHTYPE <GETBITS .BPW #BITS *300600000000*> FIX>> + <COND + (<AND <==? <+ .POS .WDTH> 36> + <N==? .WDTH 18> + <TYPE? <DATVAL .WRD> AC> + <NOT <ACRESIDUE <SET AC <DATVAL .WRD>>>> + <OR <==? .W DONT-CARE> + <AND <TYPE? .W DATUM> <==? .AC <DATVAL .WRD>>>>> + <MUNG-AC .AC <SET REG .WRD>> + <EMIT <INSTRUCTION `LSH <ACSYM .AC> <- .POS>>>) + (ELSE + <PUT <SGETREG <SET AC <DATVAL <SET REG <REG? WORD .W T>>>> .REG> + ,ACPROT + T> + <COND (<AND <==? .WDTH 18> ;"Could be half word hack." + <COND (<0? .POS> + <EMIT <INSTRUCTION `HRRZ + <ACSYM .AC> + !<ADDR:VALUE .WRD>>> + T) + (<==? .POS 18> + <EMIT <INSTRUCTION `HLRZ + <ACSYM .AC> + !<ADDR:VALUE .WRD>>> + T)>>) + (ELSE + <EMIT <INSTRUCTION `LDB + <ACSYM .AC> + [<FORM <CHTYPE .BPW OPCODE!-OP!-PACKAGE> + !<ADDR:VALUE .WRD>>]>>)> + <PUT .AC ,ACPROT <>> + <RET-TMP-AC .WRD>)>) + (<==? <NODE-TYPE .BP> ,BITS-CODE> + <SET WRD + <GEN .WRDN + <COND (<SIDE-EFFECTS .BP> <DATUM WORD ANY-AC>) + (ELSE DONT-CARE)>>> + <SET BPD + <1 <SET TEM <RBITS-GEN .BP <DATUM BITS ANY-AC> .WRD>>>> + <PUT <SGETREG <SET AC <DATVAL <SET REG <REG? WORD .W T>>>> .REG> + ,ACPROT + T> + <TOACV .BPD> + <PUT <SET BAC <DATVAL .BPD>> ,ACPROT T> + <SET TEM <2 .TEM>> + <PUT .TEM 1 <1 <ADDR:VALUE .WRD>>> + <PUTREST .TEM <REST <ADDR:VALUE .WRD>>> + <EMIT <INSTRUCTION `LDB <ACSYM .AC> <ADDRSYM .BAC>>> + <PUT .BAC ,ACPROT <>> + <PUT .AC ,ACPROT <>> + <RET-TMP-AC .WRD> + <RET-TMP-AC .BPD>) + (ELSE ;"Non constant byte pointer." + <SET WRD + <GEN .WRDN + <COND (<SIDE-EFFECTS .BP> <DATUM WORD ANY-AC>) + (ELSE DONT-CARE)>>> + <SET BPD <GEN .BP DONT-CARE>> + <PUT <SGETREG <SET AC <DATVAL <SET REG <REG? WORD .W T>>>> .REG> + ,ACPROT + T> + <SET BPD <MOVE:ARG .BPD <DATUM BITS ANY-AC>>> + <PUT <SET BAC <DATVAL .BPD>> ,ACPROT T> + <MUNG-AC .BAC .BPD> + <EMIT <INSTRUCTION `HRRI <ACSYM .BAC> !<ADDR:VALUE .WRD>>> + <EMIT <INSTRUCTION `LDB <ACSYM .AC> <ADDRSYM .BAC>>> + <PUT .BAC ,ACPROT <>> + <PUT .AC ,ACPROT <>> + <RET-TMP-AC .WRD> + <RET-TMP-AC .BPD>)> + <MOVE:ARG .REG .W>> + +<DEFINE PUTBITS-GEN (N W + "AUX" (K <KIDS .N>) (SWRD <1 .K>) (BP <2 .K>) BAC POS WDTH + FLD BPW BPD SWRDD (FLG T) TEM NUM) + #DECL ((N SWRD BP) NODE (FLD BPD REG SWRDD) DATUM (AC BAC PAC) AC + (POS WDTH) FIX (BPW) <PRIMTYPE WORD> (NUM) <OR FALSE FIX>) + <COND + (<==? <NODE-TYPE .BP> ,QUOTE-CODE> + <SET POS + <CHTYPE <GETBITS <SET BPW <NODE-NAME .BP>> #BITS *360600000000*> FIX>> + <SET WDTH <CHTYPE <GETBITS .BPW #BITS *300600000000*> FIX>> + <COND + (<AND <==? <NODE-TYPE .SWRD> ,QUOTE-CODE> + <0? <CHTYPE <NODE-NAME .SWRD> FIX>>> + <SET SWRDD <GEN <3 .K> <REG? <RESULT-TYPE .SWRD> .W>>> + <MUNG-AC <DATVAL .SWRDD> .SWRDD> + <COND (<L? <+ .POS .WDTH> 36> + <IMCHK '(`AND `ANDI ) + <ACSYM <DATVAL .SWRDD>> + <REFERENCE:ADR <GETBITS -1 <BITS .WDTH>>>>)> + <EMIT <INSTRUCTION `LSH <ACSYM <DATVAL .SWRDD>> .POS>>) + (ELSE + <SET SWRDD + <GEN .SWRD + <REG? <COND (<ISTYPE? <RESULT-TYPE .SWRD>>) (ELSE TUPLE)> .W>>> + <MUNG-AC <DATVAL .SWRDD> .SWRDD> + <COND + (<AND + <==? .WDTH 18> + <COND + (<0? .POS> + <COND (<AND <SET NUM <ZERQ .K>> <OR <L=? .NUM 0> <G=? .NUM 262143>>> + <EMIT <INSTRUCTION <COND (<0? .NUM> `HLLZS ) (ELSE `HLLOS )> + <ADDRSYM <DATVAL .SWRDD>>>>) + (ELSE <PCLOB .SWRDD '(`HRR `HRRI ) <3 .K>>)>) + (<==? .POS 18> + <COND (<AND <SET NUM <ZERQ .K>> <OR <L=? .NUM 0> <G=? .NUM 262143>>> + <EMIT <INSTRUCTION <COND (<0? .NUM> `HRRZS ) (ELSE `HRROS )> + <ADDRSYM <DATVAL .SWRDD>>>>) + (ELSE <PCLOB .SWRDD '(`HRL `HRLI ) <3 .K>>)> + T)>>) + (<AND <OR <AND <L? .POS 18> <L=? <+ .POS .WDTH> 18>> <G? .POS 18>> + <SET NUM <ZERQ .K>> + <OR <0? .NUM> <L? .WDTH <POPWR2 <+ .NUM 1>>>>> + <EMIT <INSTRUCTION <COND (<0? .NUM> + <COND (<L? .POS 18> `ANDCMI ) (ELSE `TLZ )>) + (ELSE + <COND (<L? .POS 18> `IORI ) (ELSE `TLO )>)> + <ACSYM <DATVAL .SWRDD>> + <LSH <LSH -1 <- .WDTH 36>> + <COND (<L? .POS 18> .POS) + (ELSE <- .POS 18>)>>>>) + (ELSE + <SET FLD <GEN <3 .K> <DATUM WORD ANY-AC>>> + <PUT <DATVAL .FLD> ,ACPROT T> + <TOACV .SWRDD> + <PUT <DATVAL .SWRDD> ,ACPROT T> + <EMIT <INSTRUCTION `DPB + <ACSYM <DATVAL .FLD>> + [<FORM <CHTYPE .BPW OPCODE!-OP!-PACKAGE> + <ADDRSYM <DATVAL .SWRDD>>>]>> + <PUT <DATVAL .FLD> ,ACPROT <>> + <PUT <DATVAL .SWRDD> ,ACPROT <>> + <RET-TMP-AC .FLD>)>)>) + (ELSE + <COND (<NOT <AND <NOT <SIDE-EFFECTS .N>> <MEMQ <NODE-TYPE .SWRD> ,SNODES>>> + <SET SWRDD + <GEN .SWRD + <REG? <COND (<ISTYPE? <RESULT-TYPE .SWRD>>) (ELSE TUPLE)> + .W>>>)> + <PREFER-DATUM .W> + <SET BPD + <COND (<==? <NODE-TYPE .BP> ,BITS-CODE> + <SET FLG <>> + <1 <SET TEM + <RBITS-GEN .BP + <DATUM BITS ANY-AC> + <COND (<ASSIGNED? SWRDD> .SWRDD) + (ELSE ,NO-DATUM)>>>>) + (ELSE <GEN .BP DONT-CARE>)>> + <PREFER-DATUM .W> + <COND (<SET NUM <ZERQ .K>> + <SET FLD <MOVE:ARG <REFERENCE .NUM> <DATUM WORD ANY-AC>>>) + (ELSE <SET FLD <GEN <3 .K> <DATUM WORD ANY-AC>>>)> + <DATTYP-FLUSH .FLD> + <PUT .FLD ,DATTYP WORD> + <COND (<NOT <ASSIGNED? SWRDD>> + <SET SWRDD + <GEN .SWRD + <REG? <COND (<ISTYPE? <RESULT-TYPE .SWRD>>) (ELSE TUPLE)> + .W>>>)> + <COND (<NOT <TYPE? <DATVAL .SWRDD> AC>> + <SET SWRDD + <MOVE:ARG + .SWRDD + <REG? <COND (<ISTYPE? <RESULT-TYPE .SWRD>>) (ELSE TUPLE)> + .W>>>)> + <PUT <DATVAL .SWRDD> ,ACPROT T> + <TOACV .FLD> + <PUT <DATVAL .FLD> ,ACPROT T> + <TOACV .BPD> + <PUT <SET BAC <DATVAL .BPD>> ,ACPROT T> + <COND (<NOT .FLG> + <PUT <2 .TEM> 1 <ADDRSYM <DATVAL .SWRDD>>> + <PUTREST <2 .TEM> ()>)> + <MUNG-AC <DATVAL .SWRDD> .SWRDD> + <COND (.FLG + <MUNG-AC .BAC .BPD> + <EMIT <INSTRUCTION `HRRI <ACSYM .BAC> <ADDRSYM <DATVAL .SWRDD>>>>)> + <EMIT <INSTRUCTION `DPB <ACSYM <DATVAL .FLD>> <ADDRSYM .BAC>>> + <PUT .BAC ,ACPROT <>> + <PUT <DATVAL .SWRDD> ,ACPROT <>> + <PUT <DATVAL .FLD> ,ACPROT <>> + <RET-TMP-AC .BPD> + <RET-TMP-AC .FLD>)> + <MOVE:ARG .SWRDD .W>> + +<DEFINE ZERQ (L "AUX" NUM) + #DECL ((L) <LIST [REST NODE]>) + <COND (<==? <LENGTH .L> 2>) + (<AND <==? <NODE-TYPE <SET NUM <3 .L>>> ,QUOTE-CODE> + <==? <PRIMTYPE <SET NUM <NODE-NAME .NUM>>> WORD> + <OR <AND <0? <SET NUM <CHTYPE .NUM FIX>>> 0> + <AND <POPWR2 <+ .NUM 1>> .NUM>>>)>> + +<DEFINE PCLOB (DEST INS SRC "AUX" SRCD) + #DECL ((DEST SRCD) DATUM (SRC) NODE) + <SET SRCD <GEN .SRC DONT-CARE>> + <TOACV .DEST> + <PUT <DATVAL .DEST> ,ACPROT T> + <IMCHK .INS <ACSYM <DATVAL .DEST>> <DATVAL .SRCD>> + <PUT <DATVAL .DEST> ,ACPROT <>> + <RET-TMP-AC .SRCD>> + +<DEFINE BITS-GEN (N W) <1 <RBITS-GEN .N .W DONT-CARE>>> + +<DEFINE RBITS-GEN (N W ADDR + "AUX" (K <KIDS .N>) (WDTHN <1 .K>) WDTH POS TEM + (REG <REG? WORD .W>) POSD (FLG T)) + #DECL ((POS N WDTHN) NODE (REG WDTH POSD) DATUM (K) <LIST [REST NODE]>) + <COND (<==? <LENGTH .K> 2> <SET POS <2 .K>>)> + <COND + (<==? <NODE-TYPE .WDTHN> ,QUOTE-CODE> + <SET TEM <MAKE-PTR .ADDR T <NODE-NAME .WDTHN>>>) + (<OR <NOT <ASSIGNED? POS>> + <==? <NODE-TYPE .POS> ,QUOTE-CODE>> + <SET TEM + <MAKE-PTR .ADDR + <> + <COND (<ASSIGNED? POS> <NODE-NAME .POS>) (ELSE 0)>>> + <SET POS .WDTHN> + <SET FLG <>>) + (ELSE + <SET WDTH <GEN .WDTHN .REG>> + <MUNG-AC <DATVAL .REG> .REG> + <EMIT <INSTRUCTION `LSH <ACSYM <DATVAL .REG>> 24>> + <COND (<TYPE? .ADDR DATUM> + <EMIT <SET TEM <INSTRUCTION `HRRI <ACSYM <DATVAL .REG>> 0>>> + <SET TEM <REST .TEM 2>>) + (ELSE <SET TEM '(0)>)>)> + <SET POSD <GEN .POS <DATUM WORD ANY-AC>>> + <PUT <DATVAL .POSD> ,ACPROT T> + <COND (<NOT <ASSIGNED? WDTH>> + <SET WDTH <DATUM WORD ANY-AC>> + <PUT .WDTH ,DATVAL <GETREG .WDTH>> + <EMIT <INSTRUCTION `MOVE <ACSYM <DATVAL .WDTH>> .TEM>> + <SET TEM <REST <1 .TEM>>>) + (ELSE <TOACV .WDTH>)> + <PUT <DATVAL .WDTH> ,ACPROT T> + <EMIT <INSTRUCTION `DPB + <ACSYM <DATVAL .POSD>> + [<FORM (<COND (.FLG 123264) (ELSE 98688)>) + <ADDRSYM <DATVAL .WDTH>>>]>> + <PUT <DATVAL .WDTH> ,ACPROT <>> + <PUT <DATVAL .POSD> ,ACPROT <>> + <RET-TMP-AC .POSD> + <COND (<TYPE? <DATTYP .WDTH> AC> + <RET-TMP-AC <DATTYP .WDTH> .WDTH>)> + <PUT .WDTH ,DATTYP BITS> + [<MOVE:ARG .WDTH .W> .TEM]> + +<DEFINE MAKE-PTR (AD W-P CNST "AUX" (BP <BITS 6 <COND (.W-P 24) (ELSE 30)>>)) + #DECL ((CNST) FIX) + <COND (<TYPE? .AD DATUM> + [<FORM (<GETBITS <PUTBITS 0 .BP .CNST> <BITS 18 18>>) HERE>]) + (ELSE + [<FORM (<GETBITS <PUTBITS 0 .BP .CNST> <BITS 18 18>>) 0>])>> + +<ENDPACKAGE> diff --git a/<mdl.comp>/bittst.mud.9 b/<mdl.comp>/bittst.mud.9 new file mode 100644 index 0000000..8518dbe --- /dev/null +++ b/<mdl.comp>/bittst.mud.9 @@ -0,0 +1,59 @@ +<PACKAGE "BITTST"> + +<ENTRY BIT-TEST-GEN> + +<USE "CACS" "CODGEN" "COMCOD" "CHKDCL" "COMPDEC"> + +<DEFINE BIT-TEST-GEN (N W + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" (NN <1 <KIDS .N>>) (SDIR .DIR) (B2 <MAKE:TAG>) + (FLS <==? .W FLUSHED>) N2 (IMMEDIATE T) + (TY <ISTYPE-GOOD? <RESULT-TYPE .NN>>) REG REG2 + (CONST <NODE-SUBR .N>)) + #DECL ((N NN N2) NODE (REG) DATUM) + <COND (<==? <LENGTH <KIDS .N>> 2> <SET N2 <2 <KIDS .N>>>)> + <SET REG + <GEN .NN + <DATUM <COND (.TY .TY) + (<MEMQ <NODE-TYPE .NN> ,SNODES> DONT-CARE) + (ELSE ANY-AC)> + ANY-AC>>> + <COND (<ASSIGNED? N2> + <SET REG2 <GEN .N2 DONT-CARE>> + <COND (<TYPE? <DATTYP .REG2> AC> + <RET-TMP-AC <DATTYP .REG2> .REG2> + <PUT .REG2 ,DATTYP WORD>)>)> + <RET-TMP-AC <DATTYP .REG> .REG> + <PUT .REG ,DATTYP WORD> + <AND .NOTF <SET DIR <NOT .DIR>>> + <SET DIR <COND (<AND .BRANCH <NOT .FLS>> <NOT .DIR>) (ELSE .DIR)>> + <EMIT + <INSTRUCTION + <COND (<OR <ASSIGNED? N2> + <AND <NOT <0? <CHTYPE <ANDB .CONST 262143> FIX>>> + <NOT <0? <CHTYPE <GETBITS .CONST <BITS 18 18>> FIX>>>>> + <SET IMMEDIATE <>> + <COND (.DIR `TDNN ) (ELSE `TDNE )>) + (<0? <CHTYPE <ANDB .CONST 262143> FIX>> + <COND (.DIR `TLNN ) (ELSE `TLNE )>) + (.DIR `TRNN ) + (ELSE `TRNE )> + <ACSYM <DATVAL .REG>> + !<COND (<ASSIGNED? N2> <ADDR:VALUE .REG2>) + (<NOT .IMMEDIATE> ([.CONST])) + (<0? <CHTYPE <ANDB .CONST 262143> FIX>> + (<CHTYPE <GETBITS .CONST <BITS 18 18>> FIX>)) + (ELSE (.CONST))>>> + <RET-TMP-AC .REG> + <COND (<AND .BRANCH .FLS> <BRANCH:TAG .BRANCH> FLUSHED) + (.BRANCH + <BRANCH:TAG .B2> + <SET W <MOVE:ARG <REFERENCE .SDIR> .W>> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2> + .W) + (ELSE + <BRANCH:TAG <SET BRANCH <MAKE:TAG>>> + <TRUE-FALSE .N .BRANCH .W>)>> + +<ENDPACKAGE> \ No newline at end of file diff --git a/<mdl.comp>/bophac.mud.3 b/<mdl.comp>/bophac.mud.3 new file mode 100644 index 0000000..1475eb1 --- /dev/null +++ b/<mdl.comp>/bophac.mud.3 @@ -0,0 +1,27 @@ + +<FLOAD "PS:<COMPIL>NT.NBIN"> + +<SETG OPLEN 836> + +<DEFINE BEGIN-HACK (SNM + "AUX" (CH1 <OPEN "READB" "PS:<COMPIL>OPS.VEC">) + (CH2 <OPEN "READB" "PS:<COMPIL>OPS.OVEC">)) + #DECL ((SNM) <SPECIAL STRING>) + <READB <SETG OPT <IUVECTOR ,OPLEN>> .CH1> + <READB <SETG OOPT <IUVECTOR ,OPLEN>> .CH2> + <SET READ-TABLE <SETG READ-TABLE <IVECTOR 128 0>>> + <PUT .READ-TABLE <+ <ASCII !"`> 1> ,OPCS> + <PRINTTYPE OPCODE!-OP ,OUTPUT-OPCODE> + <CLOSE .CH1> + <CLOSE .CH2> + T> + +<DEFINE END-HACK () + <GUNASSIGN OPT> + <GUNASSIGN READ-TABLE> + <UNASSIGN READ-TABLE> + <GUNASSIGN OOPT> + <PRINTTYPE OPCODE!-OP ,PRINT> + T> + + \ No newline at end of file diff --git a/<mdl.comp>/build-dir.mud.4 b/<mdl.comp>/build-dir.mud.4 new file mode 100644 index 0000000..729e002 --- /dev/null +++ b/<mdl.comp>/build-dir.mud.4 @@ -0,0 +1,2278 @@ +;"Build GDM Schema Directory + + Contains directory related parser action routines and + the routines that create the schema directory. Directory + data structure definitions are contained in GDM-DIR.MUD +" + +<PACKAGE "BUILD-DIR"> + +<ENTRY + DIR-AC + DIR-ACCESS-ENT + DIR-ACCESS-FCN + DIR-ACCESS-PATH + DIR-ACCESS-UNIQUE + DIR-AP-OPTIONS + DIR-AYREA + DIR-BIT + DIR-CHR-BITS + DIR-CHR-REP + DIR-CONTEXT + DIR-CONTEXT-DBA + DIR-COTYPE + DIR-DATABASE-ID + DIR-DB-DEF + DIR-DB-MAPPING + DIR-DBMS-DEF + DIR-DBMS-OPTIONS + DIR-DBMS-TABLE + DIR-DELETE-DB + DIR-DELETE-DBMS + DIR-DELETE-DIR + DIR-DEMO-CMD + DIR-DEMO-OFF + DIR-DEMO-ON + DIR-DIR-CMD + DIR-ENTITY-EXTENT + DIR-ENTITY-FUNC-EXTENT + DIR-ENTITY-PRED-OPTN + DIR-ENTITY-TYPE + DIR-ENTITY-TYPE-EMPTY + DIR-FCN-DEF + DIR-FLUSH-DIR + DIR-FOP-CALC + DIR-FOP-CUR + DIR-FOP-KEY + DIR-FOP-OWN + DIR-FOP-POS + DIR-FOP-USE-CUR + DIR-FOP-USE-NCUR + DIR-FUNC-AOPS + DIR-FUNC-EXTENT + DIR-FUNC-ROPS + DIR-INT-BITS + DIR-INT-REP + DIR-INT-STR + DIR-KEY + DIR-LOCAL-LDI + DIR-MAX-ONLY + DIR-MAX-PRED + DIR-MAX-QPRED + DIR-MAX-QREL + DIR-MIN-MAX + DIR-NO-AOPS + DIR-NO-QUANT + DIR-NO-ROPS + DIR-OPTIONAL + DIR-OWNER + DIR-PRED-ITER + DIR-PRED-OPTN + DIR-PRED-QUANT + DIR-PRINT-CH + DIR-PRINT-DB + DIR-PRINT-DBMS + DIR-PRINT-DIR + DIR-PRINT-ET + DIR-QPRED-OPTN + DIR-RANGE-ENTITY + DIR-RANGE-INTEGER + DIR-RANGE-STR + DIR-READ-DIR + DIR-READ-DIR-FILE + DIR-REMOTE-LDI + DIR-REPEAT-GRP + DIR-SET + DIR-SET-OF + DIR-SPELLED + DIR-SPELLED-2 + DIR-SUPERTYPE + DIR-SUPPORTED-AOPS + DIR-SUPPORTED-COPS + DIR-SUPPORTED-DOPS + DIR-SUPPORTED-EOPS + DIR-SUPPORTED-FOPS + DIR-SUPPORTED-GOPS + DIR-SUPPORTED-LOPS + DIR-SUPPORTED-QOPS + DIR-SUPPORTED-QNTS + DIR-SUPPORTED-ROPS + DIR-SYS-EP + DIR-SYS-EP-ACCESS + DIR-SYS-EP-KEYS + DIR-SYS-EP-OPTN + DIR-SYS-EP-SET + DIR-VIEW-DEF + DIR-VISIBLE + DIR-VISIBLE-CONSTRAINTS + DIR-WRITE-DIR + DIR-WRITE-DIR-FILE + PP-DIR + +;"The following atoms are tokens that are referenced in here. They + must be included here so ==? comparisons will work. They were moved from gdm-parser" + AC +;" ACCESS" + ALL +;" ASCII" + BCD + BIT + CHR-BIT + CHR-REP + CONSTANT + CREATE + DEMO-OFF + DEMO-ON + EQUALITY + EXPRESSION + FIELD + FOUND + INEQUALITY + INT-BIT + INT-REP + INT-STR + MULTIPLE + NESTED + NON_QUANTIFIED + ONES + OWNED + PARALLEL + PRINTING + PROPAGATE + QUANTIFIED + RANGE + REFERENCE + REPEATING + RESTRICTED +;" SET" + SPELLED + STRICT + SYS-EP + TWOS + UNIQUE +> + +<USE "GDM-DIR" "GDM-UTIL" "PARSE-DEFINITIONS" "DEMO"> +<USE "EM" "BUILD-VIEW" "BUILD-CONSTRAINTS"> + + +;" " +;"CREATE-DB performs context analysis of a data base schema definition + command. If no errors are detected, the new entity types defined + in the schema are added to the ENTITY-TYPE-TABLE." + +<DEFINE CREATE-DB (DB "AUX" (VID <+ 1 <LENGTH ,VIEW-TAB>>) + (EV <IVECTOR <LENGTH <3 .DB>><>>) + (EID-BASE <LENGTH ,ET-TABLE>) + I + DBMS-ID + FV + "ACT" ACT) + #DECL ((DB EV FV) VECTOR + (I VID EID-BASE DBMS-ID) FIX) + +;"Check that database name matches name on END statement" + + <COND (<2 .DB> + <COND (<NOT <==? <1 .DB> <2 .DB>>> + <ERR "Name on END statement does not match database name"> + <RETURN <> .ACT>)>)> + +;"Check that database name is unique" + + <MAPF <> + <FUNCTION (V) + #DECL ((V) VIEW) + <COND (<==? <1 .DB> <V-NAME .V>> + <ERR <STRING "Database name " + <SPNAME <1 .DB>> + " is already defined.">> + <RETURN <> .ACT>)>> + ,VIEW-TAB> + +;"Check that database name matches an existing DBMS name and save its + DBMS id." + + <SET I 0> + <COND (<NOT <MAPF <> + <FUNCTION (D) + #DECL ((D) DBMS) + <SET I <+ .I 1>> + <COND (<==? <DB-SCHEMA-NAME .D> <1 .DB>> + <SET DBMS-ID .I> + <MAPLEAVE>)>> + ,DBMS-TAB>> + <ERR <STRING "No local DBMS defined for " + <SPNAME <1 .DB>> ".">> + <RETURN <> .ACT>)> + +;"Build entity type table for database" + + <SET I 0> + <MAPF <> + <FUNCTION (E) + #DECL ((E) LIST) + <COND (<FIND-ETID .EV <1 .E>> + <ERR <STRING "Entity type " + <SPNAME <1 .E>> + " is defined more than once.">> + <RETURN <> .ACT>)> + <SET I <+ .I 1>> + <PUT .EV .I <CHTYPE [<1 .E> + <+ .I .EID-BASE> + .VID + <CHTYPE () ETID-LIST> + <CHTYPE () ETID-LIST> + <CHTYPE () ETID-LIST> + <CREATE-FUNCTIONS <1 .E> + <2 .E> .DBMS-ID .ACT> + <CREATE-DEFAULT-EREP .DBMS-ID> + ET-LOCAL-SCHEMA] ENTITY-TYPE>>> + <3 .DB>> + +;"Make a pass through all functions of type F-ENTITY and replace + entity type name with ETID. Also set '# chars to print' default + for all functions of type F-STRING." + + <MAPF <> + <FUNCTION (E "AUX" (FL <ET-FUNCTIONS .E>)) + #DECL ((E) ENTITY-TYPE (FL) VECTOR) + <PUT <ET-MAP-INFO .E> ,E-SPELLING <SPNAME <ET-NAME .E>>> + <MAPF <> + <FUNCTION (F "AUX" X) + #DECL ((F) ENTITY-FUNC (X) <OR FIX FALSE>) + <PUT <F-MAP-INFO .F> ,F-SPELLING <SPNAME <F-NAME .F>>> + <COND (<==? <F-TYPE .F> F-ENTITY> + <SET X <FIND-ETID .EV <F-ETID .F>>> + <COND (.X + <PUT .F ,F-ETID .X>) + (ELSE + <ERR <STRING "Entity type " + <SPNAME <F-ETID .F>> + " is undefined.">>)>)> + <COND (<==? <F-TYPE .F> F-STRING> + <PUT <F-MAP-INFO .F> ,F-MIN-CHR <F-MIN .F>> + <PUT <F-MAP-INFO .F> ,F-MAX-CHR <F-MAX .F>> + <PUT <F-MAP-INFO .F> ,F-CONV-CHARS <F-MAX .F>>)>> + .FL>> + .EV> + +;"Process mapping information" + + <MAPF <> + <FUNCTION (E "AUX" ETID EMAP) + #DECL ((E) LIST (ETID) <OR FIX FALSE> (EMAP) E-PHY-REP) + <COND (<NOT <SET ETID <FIND-ETID .EV <1 .E>>>> + <ERR <STRING "Entity name " <SPNAME <1 .E>> + " is undefined.">> + <RETURN <> .ACT>)> + <SET ETID <- .ETID .EID-BASE>> ;"Setup index into EV" + <SET EMAP <ET-MAP-INFO <.ETID .EV>>> + <SET FV <ET-FUNCTIONS <.ETID .EV>>> + <COND ( <NOT <FIND KEY <2 .E> 1>> + <ERR "Entity " <SPNAME <ET-NAME <.ETID .EV>>> " does not have any keys."> + <RETURN <> .ACT>)> + <MAPF <> + <FUNCTION (M) + #DECL ((M) LIST) + <COND (<==? <1 .M> FOUND> + <PUT .EMAP ,E-CONTEXT <2 .M>>)> + <COND (<==? <1 .M> SYS-EP> + <MAPF <> + <FUNCTION (OPTN) + #DECL ((OPTN) LIST) + <COND ( <==? <1 .OPTN> SETNAME> + <PUT .EMAP ,E-SYS-SET <2 .OPTN>>) + ( <==? <1 .OPTN> ACCESS> + <PUT .EMAP ,E-SYS-EP-AP-ONLY T>) + ( <==? <1 .OPTN> KEYS> + <PUT .EMAP ,E-SYS-EP-KEYS <2 .OPTN>>)> + > + <2 .M> + > + <PUT .EMAP ,E-SYS-EP T>)> + <COND (<==? <1 .M> SPELLED> + <PUT .EMAP ,E-SPELLING <2 .M>>)> + <COND (<==? <1 .M> AREA> + <PUT .EMAP ,E-AREAS <2 .M>>)> + <COND (<==? <1 .M> OWNED> + <MAPF <> + <FUNCTION (OWNER "AUX" X) + #DECL ((OWNER) IDENTIFIER (X) <OR FALSE FIX>) + <COND (<SET X <FIND-ETID .EV <ID-NAME .OWNER>>> + <PUT .EMAP ,E-OWNERS <CHTYPE (.X !<E-OWNERS .EMAP>) ETID-LIST>>) + (ELSE + <ERR <STRING "Entity type " + <SPNAME <ID-NAME .OWNER>> + " is undefined.">> + <RETURN <> .ACT>)>> + <2 .M>>)> + <COND (<==? <1 .M> PRED-OPTN> + <MAPF <> + <FUNCTION (M) + #DECL ((M) LIST) + <COND (<==? <1 .M> ITER-DOMAIN> + <PUT .EMAP ,E-ITER-PRED <2 .M>>)> + <COND (<==? <1 .M> QUANT-DOMAIN> + <PUT .EMAP ,E-QUANT-PRED <2 .M>>)> + <COND (<==? <1 .M> NO-QUANT> + <PUT .EMAP ,E-NO-QUANT T>)> + > + <2 .M>>)> + <COND ( <==? <1 .M> KEY> + <MAPR <> + <FUNCTION (ID "AUX" X) + #DECL((ID) LIST (X) <OR FIX FALSE>) + <COND (<SET X <FIND-FID .FV <ID-NAME <1 .ID>>>> + <PUT .ID 1 .X>) + (ELSE + <ERR "Function " + <SPNAME <ID-NAME <1 .ID>>> + " is not defined in entity type " + <SPNAME <ET-NAME <.ETID .EV>>>> + <RETURN <> .ACT>)>> + <2 .M>> + <PUT .EMAP ,E-KEY <CHTYPE <2 .M> FCNID-LIST>>)> + > + <2 .E>> + <MAPF <> + <FUNCTION (F "AUX" FID FMAP) + #DECL ((F) LIST (FID) <OR FIX FALSE> (FMAP) F-PHY-REP) + <COND (<NOT <SET FID <FIND-FID .FV <1 .F>>>> + <ERR <STRING "Function " <SPNAME <1 .F>> + " is not defined in entity type " + <SPNAME <ET-NAME <.ETID .EV>>>>> + <RETURN <> .ACT>)> + <SET FMAP <F-MAP-INFO <.FID .FV>>> + +;"If this is really an integer string then setup correct defaults." + + <MAPF <> + <FUNCTION (FM) + #DECL ((FM) LIST) + <COND (<==? <1 .FM> INT-STR> + <PUT .FMAP ,F-REP + <DB-DEF-STR-REP <DB-OPTIONS <.DBMS-ID ,DBMS-TAB>>>> + <PUT .FMAP ,F-BITS + <DB-DEF-STR-BITS <DB-OPTIONS <.DBMS-ID ,DBMS-TAB>>>> + <PUT .FMAP ,F-CONV-CHARS + <3 .FM>>)>> + <2 .F>> + + <MAPF <> + <FUNCTION (FM) + #DECL ((FM) LIST) + <COND (<==? <1 .FM> ACCESS> + <PUT .FMAP ,F-AP-SPELLING <F-SPELLING .FMAP>> + <MAPF <> + <FUNCTION (OPTN "AUX" X) + #DECL ((OPTN) LIST (X) <OR FIX FALSE>) + <COND (<==? <1 .OPTN> UNIQUE> + <PUT .FMAP ,F-AP-UNIQUE T>) + (<==? <1 .OPTN> SPELLED> + <PUT .FMAP ,F-AP-SPELLING <2 .OPTN>>) + (<==? <1 .OPTN> SELECTS> + <COND (<SET X <FIND-ETID .EV <ID-NAME <2 .OPTN>>>> + <PUT .FMAP ,F-AP-SELECTS .X>) + (ELSE + <ERR "Entity type " + <SPNAME <ID-NAME <2 .OPTN>>> + " is undefined."> + <RETURN <> .ACT>)>) + (<==? <1 .OPTN> WITH> + <MAPR <> + <FUNCTION (ID "AUX" X) + #DECL((ID) LIST (X) <OR FIX FALSE>) + <COND (<SET X <FIND-FID .FV <ID-NAME <1 .ID>>>> + <PUT .ID 1 .X>) + (ELSE + <ERR "Function " + <SPNAME <ID-NAME <1 .ID>>> + " is not defined in entity type " + <SPNAME <ET-NAME <.ETID .EV>>>> + <RETURN <> .ACT>)>> + <2 .OPTN>> + <PUT .FMAP ,F-AP-CO-FCNS <CHTYPE <2 .OPTN> FCNID-LIST>>)> + > + <3 .FM>> + <COND (<==? <2 .FM> EQUALITY> + <PUT .EMAP ,E-AP-EQ-COUNT + <+ <E-AP-EQ-COUNT .EMAP> 1>> + <PUT .FMAP ,F-AP-EQ T>)> + <COND (<==? <2 .FM> INEQUALITY> + <PUT .FMAP ,F-AP-NQ T>)> + <COND (<==? <2 .FM> RANGE> + <PUT .FMAP ,F-AP-RANGE T>)>)> + <COND (<==? <1 .FM> SPELLED> + <PUT .FMAP ,F-SPELLING <2 .FM>>)> + <COND (<==? <1 .FM> SET> + <PUT .FMAP ,F-SET T>)> + <COND (<==? <1 .FM> REPEAT> + <PUT .FMAP ,F-REPEAT-GRP T>)> + <COND (<==? <1 .FM> INT-STR> + <PUT .FMAP ,F-INT-STR T> + <PUT .FMAP ,F-MIN-CHR <2 .FM>> + <PUT .FMAP ,F-MAX-CHR <3 .FM>>)> + <COND (<==? <1 .FM> PRINTING> + <PUT .FMAP ,F-CONV-CHARS <2 .FM>>)> + <COND (<==? <1 .FM> BIT> + <PUT .FMAP ,F-BITS <2 .FM>> + <COND (<==? <3 .FM> ASCII> + <PUT .FMAP ,F-REP DB-ASCII>)> + <COND (<==? <3 .FM> BCD> + <PUT .FMAP ,F-REP DB-BCD>)> + <COND (<==? <3 .FM> ONES> + <PUT .FMAP ,F-REP DB-ONES-COMP>)> + <COND (<==? <3 .FM> TWOS> + <PUT .FMAP ,F-REP DB-TWOS-COMP>)>)> + <COND (<==? <1 .FM> AOPS> + <PUT .FMAP ,F-ARITH-OPS <2 .FM>>)> + <COND (<==? <1 .FM> ROPS> + <PUT .FMAP ,F-REL-OPS <2 .FM>>)> + > + <2 .F>>> + <3 .E>>> + <4 .DB>> + +;"Add entity type constraints" + + <COND ( <NOT <BUILD-CONSTRAINTS .EV <5 .DB>>> + <RETURN <> .ACT>)> + +;"Now add structures to schema directory" + + <PUT ,SCHEMA-DIR ,VIEW-TABLE + [!<VIEW-TABLE ,SCHEMA-DIR> <CHTYPE [<1 .DB>] VIEW>]> + <SETG VIEW-TAB <VIEW-TABLE ,SCHEMA-DIR>> + <PUT ,SCHEMA-DIR ,ENTITY-TYPE-TABLE + [!<ENTITY-TYPE-TABLE ,SCHEMA-DIR> !.EV]> + <SETG ET-TABLE <ENTITY-TYPE-TABLE ,SCHEMA-DIR>> + <SETG LEN-ET-TABLE <LENGTH ,ET-TABLE>> + <MSG <STRING "Database " <SPNAME <1 .DB>> " added to global schema.">> + +> ;"CREATE-DB" +" " +;"CREATE-DBMS performs context analysis of the local DBMS specification + command. If no errors are found a new entry will be created in the + DBMS-TABLE." + +<DEFINE CREATE-DBMS (DBMS-ENTRY) + #DECL ((DBMS-ENTRY) DBMS) + <COND (<NOT <MAPF <> ;"Make one pass to insure unique DBMS name" + <FUNCTION (E) + <COND (.E + <COND (<==? <DB-SCHEMA-NAME .DBMS-ENTRY> + <DB-SCHEMA-NAME .E>> + <ERR <STRING "Local DBMS " <SPNAME <DB-SCHEMA-NAME .E>> " is already defined.">> + <MAPLEAVE>)>)>> + <DBMS-TABLE ,SCHEMA-DIR>>> + <PUT ,SCHEMA-DIR ,DBMS-TABLE [!<DBMS-TABLE ,SCHEMA-DIR> + .DBMS-ENTRY]> + <SETG DBMS-TAB <DBMS-TABLE ,SCHEMA-DIR>> + <MSG <STRING "DBMS " <SPNAME <DB-SCHEMA-NAME .DBMS-ENTRY>> + " added to global schema.">>)>> +;" " +;"CREATE-DEFAULT-EREP creates a default physical entity type + representation. DBMS-ID is the index into the DBMS-TABLE." + +<DEFINE CREATE-DEFAULT-EREP (DBMS-ID) + #DECL ((DBMS-ID) FIX) + <CHTYPE [.DBMS-ID <> <> <CHTYPE () ETID-LIST> <> 0 <> <> + <> <> <> <> <> <> <>] E-PHY-REP>> + + + + + +;"CREATE-DEFAULT-FREP creates a default physical function + representation. FUNC-TYPE is the function type (string, integer...) + and DBMS-ID is the index into the DBMS-TABLE" + +<DEFINE CREATE-DEFAULT-FREP (FUNC-TYPE DBMS-ID + "AUX" (O <DB-OPTIONS <.DBMS-ID ,DBMS-TAB>>)) + #DECL ((FUNC-TYPE) ATOM (DBMS-ID) FIX (O) DBMS-OPTIONS) + <COND (<==? .FUNC-TYPE F-STRING> + <CHTYPE [<> <> <> <DB-DEF-STR-BITS .O> + <DB-DEF-STR-REP .O> + <> <> <> + ,SYS-DEF-INT-BITS + 0 0 0 <> <> <> <> <> + <DB-REL-OPS .O> + <DB-ARITH-OPS .O>] F-PHY-REP>) + (ELSE + <CHTYPE [<> <> <> <DB-DEF-INT-BITS .O> + <DB-DEF-INT-REP .O> + <> <> <> + ,SYS-DEF-INT-BITS + ,SYS-DEF-PRINT-INT + 0 0 <> <> <> <> <> + <DB-REL-OPS .O> + <DB-ARITH-OPS .O>] F-PHY-REP>)>> +;" " +;"CREATE-FUNCTIONS creates a vector of entity function specifications." + +<DEFINE CREATE-FUNCTIONS (ENAME FL DBMS-ID ERROR-EXIT "AUX" (V [])) + #DECL ((FL) LIST (DBMS-ID) FIX (V) VECTOR + (ENAME) ATOM + (ERROR-EXIT) ACTIVATION) + <MAPF <> + <FUNCTION (F) + #DECL ((F) ENTITY-FUNC) + <MAPF <> + <FUNCTION (VF) + #DECL ((VF) ENTITY-FUNC) + <COND (<==? <F-NAME .VF> <F-NAME .F>> + <ERR <STRING "Function name " + <SPNAME <F-NAME .F>> + " in entity type " + <SPNAME .ENAME> + " defined more than once.">> + <RETURN <> .ERROR-EXIT>)>> + .V> + <PUT .F ,F-MAP-TYPE F-LOCAL-SCHEMA> + <PUT .F ,F-MAP-INFO <CREATE-DEFAULT-FREP <F-TYPE .F> .DBMS-ID>> + <SET V [!.V .F]>> + .FL>> +;" " + +;"DEMO-COMMAND processes various demo commands." + +<DEFINE DEMO-COMMAND (CMD) + #DECL ((CMD) ATOM) + <COND (<==? .CMD DEMO-ON> + <SETG DEMO T> + <DEMO-INIT > + <CALL-ALL-LDIS-SIMPLE "DEMO-CMD" ON>) + (<==? .CMD DEMO-OFF> + <SETG DEMO <>> + <CALL-ALL-LDIS-SIMPLE "DEMO-CMD" <>>) + (ELSE + <ERR "Unknown demo command.">)> + <RESERVE-SPACE> ;"tries to make sure there is enough garbage collection room" + <>> +;" " +;"All routines beginning with DIR- are DBA command action routines." + +;"DIR-AC returns the keyword AC + Production: ALPHA_COLLATING " + +<DEFINE DIR-AC (X) + AC> + + +;"DIR-ACCESS-ENT returns a list which indicates the entity + selected by an access path. + Production: SELECTS entity-name ; " + +<DEFINE DIR-ACCESS-ENT (X ENTITY Y) + #DECL ( (ENTITY) IDENTIFIER) + (SELECTS .ENTITY)> + + + +;"DIR-ACCESS-FCN returns a list which indicates other functions + which must be present to make a complete access path. + Production: WITH functin_list ; " + +<DEFINE DIR-ACCESS-FCN (X FCN-LIST Y) + #DECL ( (FCN-LIST) LIST) + (WITH .FCN-LIST)> + + + +;"DIR-ACCESS-PATH returns a list containing the keyword ACCESS and + the type of comparison that can be done. + Production: ACCESS PATH VIA compare_type ; " + +<DEFINE DIR-ACCESS-PATH (W X Y CTYPE Z) + #DECL ((CTYPE) ATOM) + (ACCESS .CTYPE ())> + + + + +;"DIR-ACCESS-UNIQUE returns a list indicating that the access path is unique. + Production: UNIQUE ; " + +<DEFINE DIR-ACCESS-UNIQUE (X Y) + (UNIQUE)> + + +;"DIR-AP-OPTIONS returns a list containing the keyword ACCESS and the + list of options specified for the access path. + Production: ACCESS PATH VIA compare_type access_paht_list " + +<DEFINE DIR-AP-OPTIONS (V W X CTYPE OPTN) + #DECL ((CTYPE) ATOM (OPTN) LIST) + (ACCESS .CTYPE .OPTN)> + + + + +;"DIR-AYREA creates a list containing the keyword AREA and a list + area names. + Production: AREAS area_list " + +<DEFINE DIR-AYREA (X AREA-LIST Y) + #DECL ((AREA-LIST) LIST) + (AREA <CHTYPE .AREA-LIST AREAS>)> +;" " +;"DIR-BIT returns a list containing the keyword BIT and the bit size + of the function value and its representation. + Production: number BIT representation " + +<DEFINE DIR-BIT (NUM X VREP) + #DECL ((NUM) FIX (VREP) ATOM) + (BIT .NUM .VREP)> + + + + + +;"DIR-CHR-BITS returns a list containing the keyword CHR-BIT and + the character size in bits. + Production: DEFAULT CHAR BIT SIZE IS number " + +<DEFINE DIR-CHR-BITS (V W X Y Z BIT-SIZE) + #DECL ((BIT-SIZE) FIX) + (CHR-BIT .BIT-SIZE)> + + + + +;"DIR-CHR-REP returns a list containing the keyword CHR-REP and + the character representation. + Production: DEFAULT CHAR REP IS representation " + +<DEFINE DIR-CHR-REP (W X Y Z VREP) + #DECL ((VREP) ATOM) + (CHR-REP .VREP)> + + + + +;" " +;"DIR-CONTEXT returns a list containing the keyword FOUND and a string + representing the context in which the entity type is found. + Production: FOUND UNDER character_string ; " + +<DEFINE DIR-CONTEXT (X Y CONTEXT Z) + #DECL ((CONTEXT) STRING) + (FOUND .CONTEXT)> + + + + + +;"DIR-CONTEXT-DBA is the main entry point for context analysis. Determines + the DBA command type and invokes the appropriate routine." + +<DEFINE DIR-CONTEXT-DBA (COMMAND "ACT" ACT) + #DECL ((COMMAND) <OR DBMS-DEF DB-DEF VIEW-DEF DIR-CMD DEMO-CMD> + (ACT) ACTIVATION) + <COND (<TYPE? .COMMAND DBMS-DEF> + <CREATE-DBMS <1 .COMMAND>>) + (<TYPE? .COMMAND DIR-CMD> + <RETURN <> .ACT>) + (<TYPE? .COMMAND DB-DEF> + <CREATE-DB <1 .COMMAND>>) + (<TYPE? .COMMAND VIEW-DEF> + <CREATE-VIEW .COMMAND>) + (<TYPE? .COMMAND DEMO-CMD> + <DEMO-COMMAND <1 .COMMAND>>)>> +;" " + + ;"Production: SHARE entity_name WITH entity_list ; " + +<DEFINE DIR-COTYPE (X ID Y EL Z) + #DECL ((EL) LIST (ID) IDENTIFIER) + <ERR "Share statement not implemented"> + <CHTYPE [.ID .EL] SHARE> +> + + + + + +;"DIR-DATABASE-ID is called when a database definition containing a + database name on its END statement is recognized. The name is saved + and later checked against the database name for consistency. + Production: basic_database database_name ; " + +<DEFINE DIR-DATABASE-ID (BASIC-DB DB-NAME X) + #DECL ((BASIC-DB) VECTOR (DB-NAME) IDENTIFIER) + <PUT .BASIC-DB 2 <ID-NAME .DB-NAME>>> + + + + + +;"DIR-DB-DEF changes the structure built while parsing a data base + definition command to be a vector of type DB-DEF. + Production: database_definition " + +<DEFINE DIR-DB-DEF (STRUCT) + #DECL ((STRUCT) VECTOR) + <CHTYPE [.STRUCT] DB-DEF>> + + + + + +;"DIR-DB-MAPPING inserts the list containing entity mapping information + into the vector describing the database. + Production: DATABASE db_visible_part db_map_part END " + +<DEFINE DIR-DB-MAPPING (X VP MP Y) + #DECL ((VP) VECTOR (MP) LIST) + <PUT .VP 4 .MP>> + + + + + +;"DIR-DBMS-DEF changes the structure built while parsing a local + DBMS specification command to be a vector of type DBMS-DEF. + Production: dbms_definition " + +<DEFINE DIR-DBMS-DEF (STRUCT) + #DECL ((STRUCT) DBMS) + <CHTYPE [.STRUCT] DBMS-DEF>> +;" " +;"DIR-DBMS-OPTIONS builds a complete DBMS-TABLE entry by formating + a DBMS options list and adding it to the fixed portion of a + DBMS-TABLE entry. The DBMS options list contains information + describing which operations are supported on a local DBMS. + Production: basic_dbms_definition dbms_option_list ; " + +<DEFINE DIR-DBMS-OPTIONS (DBMS-ENTRY OPTION-LIST X + "AUX" (OPT <CHTYPE <VECTOR ,SYS-DEF-INT-BITS + ,SYS-DEF-INT-REP + ,SYS-DEF-STR-BITS + ,SYS-DEF-STR-REP + <> <> <> + ,SYS-INFINITY + ,SYS-INFINITY + ,SYS-INFINITY + ,SYS-INFINITY + <> <> <> <> <> <> <> <> + <> <> <> <> <> <> <> <> + <> <> <> <> + > DBMS-OPTIONS>)) + #DECL ((DBMS-ENTRY) DBMS (OPTION-LIST) LIST (OPT) DBMS-OPTIONS) + <MAPF <> + <FUNCTION (O) + <COND (<TYPE? .O GLOBAL-OPS> + <PUT .OPT ,DB-GLOBAL-OPS .O>) + (<TYPE? .O DISPLAY-OPS> + <PUT .OPT ,DB-DISPLAY-OPS .O>) + (<TYPE? .O FIND-OPS> + <PUT .OPT ,DB-FIND-OPS .O>) + (<TYPE? .O QUANTIFIERS-OPS> + <PUT .OPT ,DB-QUANTIFIERS .O>) + (<TYPE? .O LIST> + <COND (<==? <1 .O> INT-BIT> + <PUT .OPT ,DB-DEF-INT-BITS <2 .O>>) + (<==? <1 .O> INT-REP> + <COND (<==? <2 .O> ONES> + <PUT .OPT ,DB-DEF-INT-REP DB-ONES-COMP>) + (<==? <2 .O> TWOS> + <PUT .OPT ,DB-DEF-INT-REP DB-TWOS-COMP>)>) + (<==? <1 .O> CHR-BIT> + <PUT .OPT ,DB-DEF-STR-BITS <2 .O>>) + (<==? <1 .O> CHR-REP> + <COND (<==? <2 .O> ASCII> + <PUT .OPT ,DB-DEF-STR-REP DB-ASCII>) + (<==? <2 .O> BCD> + <PUT .OPT ,DB-DEF-STR-REP DB-BCD>)>) + (<==? <1 .O> MAX-PRED> + <PUT .OPT ,DB-MAX-NON-QUANT-ITER <2 .O>>) + (<==? <1 .O> MAX-QPRED> + <PUT .OPT ,DB-MAX-QUANT-ITER <2 .O>>) + (<==? <1 .O> MAX-QREL> + <PUT .OPT ,DB-MAX-QUANT-REL <2 .O>>) + (<==? <1 .O> PRED-OPTN> + <MAPF <> + <FUNCTION (O) + <COND(<TYPE? .O ARITHMETIC-OPS> + <PUT .OPT ,DB-ARITH-OPS .O>) + (<TYPE? .O COMPARE-OPS> + <PUT .OPT ,DB-COMPARE-OPS .O>) + (<TYPE? .O LOGICAL-OPS> + <PUT .OPT ,DB-LOG-OPS .O>) + (<TYPE? .O QUANTIFIED-OPS> + <PUT .OPT ,DB-QUANT-REL .O>) + (<TYPE? .O RELATIONAL-OPS> + <PUT .OPT ,DB-REL-OPS .O>) + (<AND <TYPE? .O LIST> + <==? <1 .O> EXIST-OPS>> + <PUT .OPT ,DB-EXIST-OPS <2 .O>>) + (<==? .O ACCESS> + <PUT .OPT ,DB-AP-REQUIRED T>) + (<==? .O RESTRICTED> + <PUT .OPT ,DB-AP-ONLY T>) + (<FATAL-ERROR "DIR-DBMS-OPTIONS: Unknown option" .O>)>> + <2 .O>>) + (<==? <1 .O> QPRED-OPTN> + <MAPF <> + <FUNCTION (O) + <COND(<TYPE? .O ARITHMETIC-OPS> + <PUT .OPT ,DB-QP-ARITH-OPS .O>) + (<TYPE? .O COMPARE-OPS> + <PUT .OPT ,DB-QP-COMPARE-OPS .O>) + (<TYPE? .O LOGICAL-OPS> + <PUT .OPT ,DB-QP-LOG-OPS .O>) + (<TYPE? .O QUANTIFIED-OPS> + <PUT .OPT ,DB-QP-QUANT-REL .O>) + (<TYPE? .O RELATIONAL-OPS> + <PUT .OPT ,DB-QP-REL-OPS .O>) + (<AND <TYPE? .O LIST> + <==? <1 .O> EXIST-OPS>> + <PUT .OPT ,DB-QP-EXIST-OPS <2 .O>>) + (<==? .O ACCESS> + <PUT .OPT ,DB-QP-AP-REQUIRED T>) + (<==? .O RESTRICTED> + <PUT .OPT ,DB-QP-AP-ONLY T>) + (<FATAL-ERROR "DIR-DBMS-OPTIONS: Unknown option" .O>)>> + <2 .O>>) + (<FATAL-ERROR "DIR-DBMS-OPTIONS: Unknown option" .O>)>) + (<==? .O MULTIPLE> + <PUT .OPT ,DB-MULTIPLE-ITER T>) + (<==? .O PROPAGATE> + <PUT .OPT ,DB-RESTRICT-PROP T>) + (<==? .O STRICT> + <PUT .OPT ,DB-STRICT-NESTING-ONLY T>) + (<FATAL-ERROR "DIR-DBMS-OPTIONS: Unknown option" .O>)>> + .OPTION-LIST> + <PUT .DBMS-ENTRY ,DB-OPTIONS .OPT>> +;" " +;"DIR-DBMS-TABLE builds the fixed portion of a DBMS-TABLE entry. + Production: LOCAL NODE IS + LOCAL SCHEMA IS identifier + DBMS IS identifier + HOST IS identifier + LDI IS procedure_name ldi_choice " + +<DEFINE DIR-DBMS-TABLE (A B C D E F SCHEMA-NAME H I SYS-NAME K L M SYS-TYPE + O P HOST R S PROC-NAME LDI) + #DECL ((SCHEMA-NAME SYS-NAME HOST) IDENTIFIER (SYS-TYPE) ATOM + (PROC-NAME) STRING (LDI) LDI-DATA) + <PUT .LDI ,LDI-PROC-NAME .PROC-NAME> + <CHTYPE [ <ID-NAME .SCHEMA-NAME> + <ID-NAME .SYS-NAME> + .SYS-TYPE + <ID-NAME .HOST> + .LDI + <> ] DBMS>> + + + + +;"DIR-DELETE-DB deletes a database specification from the schema directory. + Production: DELETE DATABASE identifier ; " + +<DEFINE DIR-DELETE-DB (X Y ID Z) + #DECL ((ID) IDENTIFIER) + <ERR "Not implemented yet"> + <>> + + + + +;"DIR-DELETE-DBMS deletes a DBMS specification from the schema directory. + Production: DELETE DBMS identifier ; " + +<DEFINE DIR-DELETE-DBMS (X Y ID Z) + #DECL ((ID) IDENTIFIER) + <ERR "Not implemented yet"> + <>> +;" " +;"DIR-DELETE-DIR deletes the schema directory. + Production: DELETE DIRECTORY ; " + +<DEFINE DIR-DELETE-DIR (X Y Z) + <SETG SCHEMA-DIR <CHTYPE <IVECTOR 3 '<VECTOR>> DIRECTORY>> ;"poof" + <RENAME ,DIRECTORY-FILE-NAME> ;"Delete the disk file, too" + <WRITE-DIRECTORY> + <INITIALIZE-DIRECTORY>> ;"Read it back in and init various ptrs" + + + + + +;"DIR-DEMO-CMD is called when a demo command is recognized + Production: demo_command " + +<DEFINE DIR-DEMO-CMD (STRUCT) + #DECL ((STRUCT) ATOM) + <CHTYPE [.STRUCT] DEMO-CMD>> + + + + +;"DIR-DEMO-OFF returns the keyword DEMO-OFF + Production: DEMO OFF ; " + +<DEFINE DIR-DEMO-OFF (X Y Z) + DEMO-OFF> + + + + +;"DIR-DEMO-ON returns the keyword DEMO-ON + Production: DEMO ON ; " + +<DEFINE DIR-DEMO-ON (X Y Z) + DEMO-ON> + + + + +;"DIR-DIR-CMD changes the structure built while parsing a directory + command to be a vector of type DIR-CMD. + Production: directory_command " + +<DEFINE DIR-DIR-CMD (STRUCT) + #DECL ((STRUCT) ANY) + <CHTYPE [.STRUCT] DIR-CMD>> + + + + + +;"DIR-ENTITY-EXTENT creates a list containing an entity name and its + associated mapping information plus and empty list since no function + mapping was supplied. + Production: EXTENT identifier IS db_entity_map db_extent_end " + +<DEFINE DIR-ENTITY-EXTENT (X ENAME Y EMAP Z) + #DECL ((ENAME) IDENTIFIER (EMAP) LIST) + (<ID-NAME .ENAME> .EMAP ())> + + + + +;" " +;"DIR-ENTITY-FUNC-EXTENT creates a list containing an entity name its + associated mapping info and its function mapping info. + Production: EXTENT identifier IS db_entity_map db_func_map db_extent_end " + +<DEFINE DIR-ENTITY-FUNC-EXTENT (X ENAME Y EMAP FMAP Z) + #DECL ((ENAME) IDENTIFIER (EMAP FMAP) LIST) + (<ID-NAME .ENAME> .EMAP .FMAP)> + + + + + +;"DIR-ENTITY-PRED-OPTN returns the predicate options of the entity + Production: RESTRICTED predicate_option_list " + +<DEFINE DIR-ENTITY-PRED-OPTN (X OPTN) + #DECL ( (OPTN) LIST) + (PRED-OPTN .OPTN)> + + + + +;"DIR-ENTITY-TYPE creates a two element list containing the entity + name and a list describing its functions. + Production: TYPE entity_name IS ENTITY entity_body entity_end ; " + +<DEFINE DIR-ENTITY-TYPE (W ENAME X Y EBODY Z V) + #DECL ((ENAME) IDENTIFIER (EBODY) LIST) + (<ID-NAME .ENAME> .EBODY)> + + +;"Production: TYPE entity_name IS ENTITY entity_end ; " +<DEFINE DIR-ENTITY-TYPE-EMPTY(W ENAME X Y Z V) + #DECL((ENAME) IDENTIFIER) + (<ID-NAME .ENAME> () ) +> + + +;"DIR-FCN-DEF adds the function name to an ENTITY-FUNC vector + Production: function_name : value_format ; " + +<DEFINE DIR-FCN-DEF (ID X F Y) + #DECL ((ID) IDENTIFIER (F) ENTITY-FUNC) + <PUT .F ,F-NAME <ID-NAME .ID>>> + + + + +;"DIR-FLUSH-DIR deletes the schema directory in memory only. + Production: FLUSH DIRECTORY ; or + FLUSH ; " + +<DEFINE DIR-FLUSH-DIR (X Y "OPT" Z "AUX" FOO) + #DECL ((FOO) <OR ATOM FALSE>) + <SET FOO ,DONT-RELOAD-DIR> + <SETG DONT-RELOAD-DIR T> + <SETG SCHEMA-DIR <CHTYPE <IVECTOR 3 '<VECTOR>> DIRECTORY>> ;"poof" + <INITIALIZE-DIRECTORY> + <SETG DONT-RELOAD-DIR .FOO> +> + + + + +;"DIR-FOP-CALC returns the keyword FIND-CALC. + Production: CALC " + +<DEFINE DIR-FOP-CALC (X) + FIND-CALC> + +;"DIR-FOP-CUR returns the keyword FIND-CUR. + Production: CURRENT " + +<DEFINE DIR-FOP-CUR (X) + FIND-CUR> + +;"DIR-FOP-KEY returns the keyword FIND-KEY. + Production: DATABASE_KEY " + +<DEFINE DIR-FOP-KEY (X) + FIND-KEY> + +;"DIR-FOP-OWN returns the keyword FIND-OWN. + Production: OWNER " + +<DEFINE DIR-FOP-OWN (X) + FIND-OWN> + +;"DIR-FOP-POS returns the keyword FIND-POS. + Production: POSITIONAL " + +<DEFINE DIR-FOP-POS (X) + FIND-POS> + +;"DIR-FOP-USE-CUR returns the keyword FIND-USE-CUR. + Production: USING_CURRENT " + +<DEFINE DIR-FOP-USE-CUR (X) + FIND-USE-CUR> + +;"DIR-FOP-USE-NCUR returns the keyword FIND-USE-NCUR. + Production: USING_NON_CURRENT " + +<DEFINE DIR-FOP-USE-NCUR (X) + FIND-USE-NCUR> + + +;"DIR-FUNC-AOPS returns a list containing the arithmetic operators + supported for the specific function. + Production: RESTRICTED TO ARITHMETIC OPERATIONS supported_arith_list ; " + +<DEFINE DIR-FUNC-AOPS (V W X Y OPS Z) + #DECL ((OPS) LIST) + (AOPS <DIR-SUPPORTED-AOPS X Y Z .OPS>)> + + + + +;"DIR-FUNC-EXTENT creates a list containing the function name and its + associated mapping information. + Production: identifier IS db_func_map " + +<DEFINE DIR-FUNC-EXTENT (FNAME X MAPPING) + #DECL ((FNAME) IDENTIFIER (MAPPING) LIST) + (<ID-NAME .FNAME> .MAPPING)> + + + + +;"DIR-FUNC-ROPS returns a list containing the relational operators + supported for the specific function. + Production: RESTRICTED TO RELATIONAL OPERATIONS supported_rel_list ; " + +<DEFINE DIR-FUNC-ROPS (V W X Y OPS Z) + #DECL ((OPS) LIST) + (ROPS <DIR-SUPPORTED-ROPS X Y Z .OPS>)> +;" " + + + + +;"DIR-INT-BITS returns a list containing the keyword INT-BIT and + the default bit size for integers. + Production: DEFAULT INTEGER BIT SIZE IS number " + +<DEFINE DIR-INT-BITS (V W X Y Z BIT-SIZE) + #DECL ((BIT-SIZE) FIX) + (INT-BIT .BIT-SIZE)> + + + + + +;"DIR-INT-REP returns a list containing the keyword INT-REP and + the default representation for integers. + Production: DEFAULT INTEGER REP IS representation " + +<DEFINE DIR-INT-REP (W X Y Z VREP) + #DECL ((VREP) ATOM) + (INT-REP .VREP)> + + + + +;"DIR-INT-STR creates a list containing the keyword INT-STR and + the min/max number of characters in the integer string. + Production: STORED AS STRING ( number_characters ) " + +<DEFINE DIR-INT-STR (X Y Z V MIN-MAX W) + #DECL ((MIN-MAX) LIST) + (INT-STR <1 .MIN-MAX> <2 .MIN-MAX>)> + + + + +;"DIR-KEY returns the key specification for the entity. + Production: KEY key_spec ; " + +<DEFINE DIR-KEY (Y KEY-SPEC Z) + #DECL ( (KEY-SPEC) <OR ATOM LIST>) + <COND (<TYPE? .KEY-SPEC ATOM> + (KEY ()) ) ;"DATABASE_KEY" + (ELSE + (KEY .KEY-SPEC) )>> + + + +;"DIR-LOCAL-LDI builds an LDI-DATA vector containing information + about a local LDI. + Production: LOCAL " + +<DEFINE DIR-LOCAL-LDI (X) + <CHTYPE <VECTOR T + <> + <> + <>> LDI-DATA>> + + + + +;"DIR-MAX-ONLY creates a list containing the range of a STRING. + Production: number " + +<DEFINE DIR-MAX-ONLY (VMAX) + #DECL ((VMAX) FIX) + (.VMAX .VMAX)> + + + +;"DIR-MAX-PRED returns the non-quantified iteration predicate limit. + Production: MAXIMUM OF number NON_QUANTIFIED ITERATION PREDICATES " + +<DEFINE DIR-MAX-PRED (V W NUM X Y Z) + #DECL ( (NUM) FIX) + (MAX-PRED .NUM)> + + + + +;"DIR-MAX-QPRED returns the quantified iteration predicate limit. + Production: MAXIMUM OF number QUANTIFIED ITERATION PREDICATES " + +<DEFINE DIR-MAX-QPRED (V W NUM X Y Z) + #DECL ( (NUM) FIX) + (MAX-QPRED .NUM)> + + + + +;"DIR-MAX-QREL returns the quantified relation within a predicate limit. + Production: MAXIMUM OF number QUANTIFIED RELATIONS PER ITERATION " + +<DEFINE DIR-MAX-QREL (V W NUM X Y Z U) + #DECL ( (NUM) FIX) + (MAX-QREL .NUM)> + + + + +;"DIR-MIN-MAX creates a list containing the range of a STRING. + Production: number .. number " + +<DEFINE DIR-MIN-MAX (VMIN X VMAX) + #DECL ((VMIN VMAX) FIX) + (.VMIN .VMAX)> + + + + +;"DIR-NO-AOPS is called to process a declaration of no arithmetic ops. + Production: RESTRICTED TO NO ARITHMETIC OPERATINS ; " + +<DEFINE DIR-NO-AOPS (U V W X Y Z) + (AOPS <DIR-SUPPORTED-AOPS X Y Z '()>) > + + + + +;"DIR-NO-QUANT is called for an entity which cannot be the domain + of a quantification. + Production: TO NO QUANTIFICATION ; " + +<DEFINE DIR-NO-QUANT (W X Y Z) + (NO-QUANT)> + + + + +;"DIR-NO-ROPS is called to process a declaration of no relational ops. + Production: RESTRICTED TO NO RELATIONAL OPERATINS ; " + +<DEFINE DIR-NO-ROPS (U V W X Y Z) + (ROPS <DIR-SUPPORTED-ROPS X Y Z '()>) > + + + + +;"DIR-OPTIONAL is called when a partial function is recognized. + Production: range_type PARTIAL " + +<DEFINE DIR-OPTIONAL (F) + #DECL ((F) ENTITY-FUNC) + .F> ;"No-op for now" + + + + + +;"DIR-OWNER creates a list containing the keyword OWNED and a list + of entity types that are owners. + Production: OWNED BY entity_list ; " + +<DEFINE DIR-OWNER (X Y EL Z) + #DECL ((EL) LIST) + (OWNED .EL)> + + + + +;" " +;"DIR-PRED-ITER returns information on the type of predicates + permitted when an entity is the domain of an iteration. + Production: WHEN DOMAIN OF ITERATION TO type PREDICATES ; " + +<DEFINE DIR-PRED-ITER (S U V W X TYP Y Z) + #DECL ( (TYP) LIST) + (ITER-DOMAIN <DIR-SUPPORTED-PRED-TYPES .TYP>)> + + + + +;"DIR-PRED-OPTN returns the predicate options of the dbms + Production: WITHIN NON_QUANTIFIED PREDICATES predicate_option_list " + +<DEFINE DIR-PRED-OPTN (X Y Z OPTN) + #DECL ( (OPTN) LIST) + (PRED-OPTN .OPTN)> + + + + +;"DIR-PRED-QUANT returns information on the type of predicates + permitted when an entity is the domain of a quantification. + Production: WHEN DOMAIN OF QUANTIFICATION TO type PREDICATES ; " + +<DEFINE DIR-PRED-QUANT (S U V W X TYP Y Z) + #DECL ( (TYP) LIST) + (QUANT-DOMAIN <DIR-SUPPORTED-PRED-TYPES .TYP>)> + + + + +;"DIR-PRINT-CH creates a list containing the keyword PRINTING and + the max number of characters required to print a function value. + Production: number PRINTING CHARS " + +<DEFINE DIR-PRINT-CH (NUM X Y) + #DECL ((NUM) FIX) + (PRINTING .NUM)> + + + + + +;"DIR-PRINT-DB pretty prints a database or view. + Production: PRINT DATABASE identifier ; " + +<DEFINE DIR-PRINT-DB (X Y DNAME Z "AUX" (I 0)) + #DECL ((DNAME) IDENTIFIER (I) FIX) + <COND (<MAPF <> + <FUNCTION (V) + #DECL ((V) VIEW) + <SET I <+ .I 1>> + <COND (<==? <V-NAME .V> <ID-NAME .DNAME>> + <PP-DATABASE .I> + <MAPLEAVE>)>> + ,VIEW-TAB>) + (<ERR <STRING "Database or view " <SPNAME <ID-NAME .DNAME>> + " is undefined.">>)>> + + + + + +;"DIR-PRINT-DBMS pretty prints a DBMS table entry. + Production: PRINT DBMS identifier ; " + +<DEFINE DIR-PRINT-DBMS (X Y SYS-NAME Z) + #DECL ((SYS-NAME) IDENTIFIER) + <COND (<MAPF <> + <FUNCTION (D) + #DECL ((D) DBMS) + <COND (<==? <DB-SCHEMA-NAME .D> <ID-NAME .SYS-NAME>> + <PP-DBMS .D> + <MAPLEAVE>)>> + ,DBMS-TAB>) + (<ERR <STRING "DBMS " <SPNAME <ID-NAME .SYS-NAME>> + " is undefined.">>)>> + + + + +;" " +;"DIR-PRINT-DIR pretty prints the schema directory. + Production: PRINT DIRECTORY ; " + +<DEFINE DIR-PRINT-DIR (X Y Z) + <PP-DIR> + <>> ;"Return false to skip context analysis" + + + + + +;"DIR-PRINT-ET prints an entity type table entry. Note that only + the current view context is searched. + Production: PRINT ENTITY TYPE identifier ; " + +<DEFINE DIR-PRINT-ET (W X Y ENAME Z) + #DECL ((ENAME) IDENTIFIER) + <COND (<FIND-ENTITY-TYPE .ENAME> + <PP-ENTITY-TYPE <<ID-ETID .ENAME> ,ET-TABLE>>)>> + + + + +;" " +;"DIR-QPRED-OPTN returns the quantified predicate optins. + Production: WITHIN QUANTIFIED PREDICATES predicate_option_list " + +<DEFINE DIR-QPRED-OPTN (X Y Z OPTN) + #DECL ( (OPTN) LIST) + (QPRED-OPTN .OPTN)> +;" " +;"DIR-RANGE-ENTITY creates a default ENTITY-FUNC vector for a + function whose range is entity. Elements in the vector may + be changed as more is learned about the function. + Production: entity_name " + +<DEFINE DIR-RANGE-ENTITY (E) + #DECL ((E) IDENTIFIER) + <CHTYPE [<> F-ENTITY F-SV <ID-NAME .E> <> <> <>] ENTITY-FUNC>> + + + + +;"DIR-RANGE-INTEGER creates a default ENTITY-FUNC vector for a + function whose range is integer. Elements in the vector may + be changed as more is learned about the function. + Production: INTEGER " + +<DEFINE DIR-RANGE-INTEGER (X) + <CHTYPE <VECTOR <> F-INTEGER F-SV -34359738366 34359738367 <> <>> + ENTITY-FUNC>> + + + +;"DIR-RANGE-STR creates a default ENTITY-FUNC vector for a + function whose range is string. Elements in the vector may + be changed as more is learned about the function. + Production: STRING ( number_characters ) " + +<DEFINE DIR-RANGE-STR (X Y MIN-MAX Z) + #DECL ((MIN-MAX) LIST) + <CHTYPE [<> F-STRING F-SV <1 .MIN-MAX> <2 .MIN-MAX> <> <>] + ENTITY-FUNC>> + + + + +;"DIR-READ-DIR reads the schema directory from disk. + (24-jun-81) Note that reading the directory with READ-DIRECTORY + is, in fact, useless because the atoms ET-TABLE, etc. which all + of Multibase uses are not rebound. The directory must be read + using INITIALIZE-DIRECTORY, which not only reads the directory, + but also rebinds these atoms. + Production: READ DIRECTORY ; " + +<DEFINE DIR-READ-DIR (X Y Z) <INITIALIZE-DIRECTORY>> +<DEFINE DIR-READ-DIR-FILE (X Y FILE Z "AUX" ANS) + #DECL ((FILE) STRING (ANS) <OR ATOM FALSE>) + <COND (<SET ANS <FILE-EXISTS? .FILE>> + <SETG DIRECTORY-FILE-NAME .FILE> + <INITIALIZE-DIRECTORY>) + (ELSE + <ERR "File does not exist: " <1 .ANS>> + <>)> +> + + + + +;"DIR-REMOTE-LDI builds an LDI-DATA vector containing information + about a remote LDI. + Production: REMOTE host socket " + +<DEFINE DIR-REMOTE-LDI (X HOST SOCKET) + #DECL ((HOST) IDENTIFIER (SOCKET) FIX) + <CHTYPE [ <> + <> + <ID-NAME .HOST> + .SOCKET ] LDI-DATA>> + + + + +;"DIR-REPEAT-GRP creates a list containing the keyword REPEAT. + Production: REPEATING GROUP " + +<DEFINE DIR-REPEAT-GRP (X Y) + '(REPEAT)> + + + +;" " + + +;"DIR-SET creates a list containing the keyword SET. + Production: SET " + +<DEFINE DIR-SET (X) + '(SET)> + + + + +;"DIR-SET-OF changes the range of a function to be multi-valued. + Production: SET OF range_type " + +<DEFINE DIR-SET-OF (X Y F) + #DECL ((F) ENTITY-FUNC) + <PUT .F ,F-RANGE F-MV>> + + + +;"DIR-SPELLED creates a list with the keyword SPELLED and a + string. + Production: SPELLED character_string ; " + +<DEFINE DIR-SPELLED (X STR "OPT" (Z <>)) + #DECL ((STR) STRING) + (SPELLED .STR)> + + +;"Production: WHEN SPELLED string ; " + +<DEFINE DIR-SPELLED-2 (X Y STR "OPT" (Z <>)) + #DECL ((STR) STRING) + (SPELLED .STR)> + + + + + + ;"Production: CONTAIN entity_name IN entity-list ; " + +<DEFINE DIR-SUPERTYPE (X ID Y EL Z) + #DECL ((EL) LIST (ID) IDENTIFIER) + <CHTYPE [.ID .EL] CONTAIN> +> + + + +;" " +;"DIR-SUPPORTED-AOPS creates a vector describing the arithmetic operations + supported by a dbms. + Production: SUPPORTED ARITHMETIC OPERATIONS supported_arith_list ; " + +<DEFINE DIR-SUPPORTED-AOPS (X Y Z AOP-LIST "OPT" S) + #DECL ( (AOP-LIST) LIST) + <CHTYPE [ <IN-LIST? '(ALL) .AOP-LIST> + <IN-LIST? '(+) .AOP-LIST> + <IN-LIST? '(-) .AOP-LIST> + <IN-LIST? '(*) .AOP-LIST> + <IN-LIST? '(/) .AOP-LIST> + <IN-LIST? '(&) .AOP-LIST> + ] ARITHMETIC-OPS> +> + + +;"DIR-SUPPORTED-COPS creates a vector describing compare operations + supported by a DBMS. + Production: SUPPORTED COMPARE OPERATIONS supported_comp_list ; " + +<DEFINE DIR-SUPPORTED-COPS (X Y Z COP-LIST) + #DECL ((COP-LIST) LIST) + <CHTYPE [ <IN-LIST? '(ALL) .COP-LIST> + <IN-LIST? '(CONSTANT) .COP-LIST> + <IN-LIST? '(FIELD) .COP-LIST> + <IN-LIST? '(EXPRESSION) .COP-LIST> ] COMPARE-OPS>> + + + + +;"DIR-SUPPORTED-DOPS creates a vector describing display operations + supported by a DBMS. + Production: SUPPORTED DISPLAY OPERATIONS supported_comp_list ; " + +<DEFINE DIR-SUPPORTED-DOPS (X Y Z COP-LIST) + #DECL ((COP-LIST) LIST) + <CHTYPE [ <IN-LIST? '(ALL) .COP-LIST> + <IN-LIST? '(CONSTANT) .COP-LIST> + <IN-LIST? '(FIELD) .COP-LIST> + <IN-LIST? '(EXPRESSION) .COP-LIST> ] DISPLAY-OPS>> + + + + +;"DIR-SUPPORTED-EOPS creates a description of the existential logical + operations supported by a dbms. + Production: SUPPORTED EXISTENTIAL OPERATIONS supported_log_list " + +<DEFINE DIR-SUPPORTED-EOPS (X Y Z LOP-LIST) + #DECL ( (LOP-LIST) LIST) + (EXIST-OPS <DIR-SUPPORTED-LOPS X Y Z .LOP-LIST>)> + + + + +;"DIR-SUPPORTED-FOPS creates a vector describing FIND verbs supported + by a CODASYL DBMS. + Production: SUPPORTED FIND VERBS supported_find_list " + +<DEFINE DIR-SUPPORTED-FOPS (X Y Z FOP-LIST) + #DECL ((FOP-LIST) LIST) + <CHTYPE [ <IN-LIST? '(FIND-KEY) .FOP-LIST> + <IN-LIST? '(FIND-CUR) .FOP-LIST> + <IN-LIST? '(FIND-POS) .FOP-LIST> + <IN-LIST? '(FIND-OWN) .FOP-LIST> + <IN-LIST? '(FIND-CALC) .FOP-LIST> + <IN-LIST? '(FIND-USE-CUR) .FOP-LIST> + <IN-LIST? '(FIND-USE-NCUR) .FOP-LIST> + ] FIND-OPS>> + + + + +;"DIR-SUPPORTED-GOPS creates a vector describing global + optimizations supported by a DBMS. + Production: SUPPORTED GLOBAL OPTIMIZATIONS global_optimization_list " + +<DEFINE DIR-SUPPORTED-GOPS (X Y Z GOP-LIST) + #DECL ((GOP-LIST) LIST) + <CHTYPE [ <IN-LIST? '(ALL) .GOP-LIST> + <IN-LIST? '(CREATE) .GOP-LIST> + <IN-LIST? '(REFERENCE) .GOP-LIST> ] GLOBAL-OPS>> + + + + +;"DIR-SUPPORTED-LOPS creates a vector describing logical + operations supported by a DBMS. + Production: SUPPORTED LOGICAL OPERATIONS supported_log_list " + +<DEFINE DIR-SUPPORTED-LOPS (X Y Z LOP-LIST) + #DECL ((LOP-LIST) LIST) + <CHTYPE [ <IN-LIST? '(ALL) .LOP-LIST> + <IN-LIST? '(AND) .LOP-LIST> + <IN-LIST? '(NOT) .LOP-LIST> + <IN-LIST? '(OR) .LOP-LIST> + ] LOGICAL-OPS>> + + + + +;"DIR-SUPPORTED-PRED-TYPES is an internal entry to decode allowable + predicate types." + +<DEFINE DIR-SUPPORTED-PRED-TYPES (TYP) + #DECL ((TYP) LIST) + <CHTYPE [ <IN-LIST? '(ALL) .TYP> + <IN-LIST? '(NO) .TYP> + <IN-LIST? '(QUANTIFIED) .TYP> + <IN-LIST? '(NON_QUANTIFIED) .TYP> + ] PREDICATE-TYPES>> + + + + +;"DIR-SUPPORTED-QOPS creates a vector describing the quantificatin operations + supported by the dbms. + Productin: SUPPORTED QUANTIFIED RELATIONS supported_quant_list " + +<DEFINE DIR-SUPPORTED-QOPS (X Y Z QOP-LIST) + #DECL ( (QOP-LIST) LIST) + <CHTYPE [ <IN-LIST? '(ALL) .QOP-LIST> + <IN-LIST? '(NESTED) .QOP-LIST> + <IN-LIST? '(PARALLEL) .QOP-LIST> + ] QUANTIFIED-OPS> +> + + + + +;"DIR-SUPPORTED-QNTS creates a vector describing the quantificatin operations + supported by the dbms. + Productin: SUPPORTED QUANTIFIERS supported_qnt_list " + +<DEFINE DIR-SUPPORTED-QNTS (X Y QOP-LIST) + #DECL ( (QOP-LIST) LIST) + <CHTYPE [ <IN-LIST? '(ALL) .QOP-LIST> + <IN-LIST? '(SOME) .QOP-LIST> + <IN-LIST? '(EVERY) .QOP-LIST> + <IN-LIST? '(NO) .QOP-LIST> + ] QUANTIFIERS-OPS> +> + + + + +;"DIR-SUPPORTED-ROPS creates a vector describing relational + operations supported by a DBMS. + Production: SUPPORTED RELATIONAL OPERATIONS supported_rel_list " + +<DEFINE DIR-SUPPORTED-ROPS (X Y Z ROP-LIST "OPT" S) + #DECL ((ROP-LIST) LIST) + <CHTYPE [ <IN-LIST? '(ALL) .ROP-LIST> + <IN-LIST? '(\>) .ROP-LIST> + <IN-LIST? '(\<) .ROP-LIST> + <IN-LIST? '(\<=) .ROP-LIST> + <IN-LIST? '(\>=) .ROP-LIST> + <IN-LIST? '(/=) .ROP-LIST> + <IN-LIST? '(=) .ROP-LIST> + <IN-LIST? '(AC) .ROP-LIST> + <IN-LIST? '(ISIN) .ROP-LIST> + ] RELATIONAL-OPS>> + + + + +;" " +;"DIR-SYS-EP creates a list containing the keyword SYS-EP. + Production: SYSTEM ENTRY POINT ; " + +<DEFINE DIR-SYS-EP (W X Y Z) + (SYS-EP ())> + + + + +;"DIR-SYS-EP-ACCESS creates a list containing the keyword ACCESS. + Productin: BY ACCESS PATH ONLY ; " + +<DEFINE DIR-SYS-EP-ACCESS (V W X Y Z) + (ACCESS)> + + + +;"DIR-SYS-EP-KEYS returns a list of key values to be used in + iterating over a system-entry point. + Productin: ITERATE USING KEYS key_list ; " + +<DEFINE DIR-SYS-EP-KEYS (W X Y KEYLIST Z) + #DECL ( (KEYLIST) LIST) + (KEYS <CHTYPE .KEYLIST KEY-LIST>)> + + + + +;"DIR-SYS-EP-OPTN creates a list containing the keyword SYS-EP and + a list of options describing the system entry point. + Production: SYSTEM ENTRY POINT sys_ep_clause " + +<DEFINE DIR-SYS-EP-OPTN (W X Y OPTN) + #DECL ((OPTN) LIST) + (SYS-EP .OPTN)> + + + + +;"DIR-SYS-EP-SET passes the system set name for a system entry point + Productin: VIA character_string ; " + +<DEFINE DIR-SYS-EP-SET (Y SET-NAME Z) + #DECL ( (SET-NAME) STRING) + (SETNAME .SET-NAME)> + + + + +;" " +;"DIR-VIEW-DEF changes the structure created by parsing a view + definition command into a vector of type VIEW-DEF. + Production: view_definition " + +<DEFINE DIR-VIEW-DEF (STRUCT) + #DECL ((STRUCT) VECTOR) + <CHTYPE [.STRUCT] VIEW-DEF>> + + + + + +;"DIR-VISIBLE processes the visible part of a view or database definition. + A vector is created containing the view/db name, a slot that will be + filled in later with the name specified on the END statement, the + list of entity definitions, no constraints and a slot that may be + filled in later with mapping info. + Production: identifier IS group_of_entities " + +<DEFINE DIR-VISIBLE (DB-NAME X EL) + #DECL ((DB-NAME) IDENTIFIER (EL) LIST) + [<ID-NAME .DB-NAME> <> .EL <> <>]> + + + +;"DIR-VISIBLE-CONSTRAINTS is just like DIR-VISIBLE except that a + list of constraints is added to the vector. + Production: identifier IS group_of_entities constraint_list " + +<DEFINE DIR-VISIBLE-CONSTRAINTS (DB-NAME X EL CL) + #DECL ((DB-NAME) IDENTIFIER (EL CL) LIST) + [<ID-NAME .DB-NAME> <> .EL <> .CL]> + + + + + +;"DIR-WRITE-DIR copies the schema directory to disk. + Production: WRITE DIRECTORY ; " + +<DEFINE DIR-WRITE-DIR (X Y Z) <WRITE-DIRECTORY>> + + +<DEFINE DIR-WRITE-DIR-FILE (X Y FILE Z) + #DECL ((FILE) STRING) + <SETG DIRECTORY-FILE-NAME .FILE> + <WRITE-DIRECTORY>> +" " +;"FIND-ETID is used to lookup a given entity type name in a vector + of ENTITY-TYPEs. Returns the entity types ETID or false." + +<DEFINE FIND-ETID (EV ENAME) + #DECL ((EV) VECTOR (ENAME) ATOM) + <MAPF <> + <FUNCTION (E) + #DECL ((E) <OR FALSE ENTITY-TYPE>) + <COND (.E + <COND (<==? <ET-NAME .E> .ENAME> + <MAPLEAVE <ET-ETID .E>>)>)>> + .EV>> + + + + +;"FIND-FID is used to lookup a given function name in a vector + of ENTITY-FUNCs. Returns the function's FID or false." + +<DEFINE FIND-FID (FV FNAME "AUX" (I 0)) + #DECL ((FV) VECTOR (FNAME) ATOM (I) FIX) + <MAPF <> + <FUNCTION (F) + #DECL ((F) ENTITY-FUNC) + <SET I <+ .I 1>> + <COND (<==? <F-NAME .F> .FNAME> + <MAPLEAVE .I>)>> + .FV>> +" " +;"Pretty print routines for directory data structures" + +;"PP-DATABASE pretty prints all entity types in a database or view." + +<DEFINE PP-DATABASE (VID) + #DECL ((VID) FIX) + <MAPF <> + <FUNCTION (E) + #DECL ((E) ENTITY-TYPE) + <COND (<==? <ET-VID .E> .VID> + <PP-ENTITY-TYPE .E>)>> + ,ET-TABLE>> +;" " +;"PP-DBMS prints one entry in the DBMS-TABLE." + +<DEFINE PP-DBMS (D "AUX" GOP DOP FOP (L <DB-LDI-DATA .D>) + (O <DB-OPTIONS .D>)) + #DECL ((D) DBMS (L) LDI-DATA (O) <OR DBMS-OPTIONS FALSE> + (GOP) <OR GLOBAL-OPS FALSE> + (DOP) <OR DISPLAY-OPS FALSE> + (FOP) <OR FIND-OPS FALSE>) + <TPRINC "Schema name: "> <PRINC <DB-SCHEMA-NAME .D>> <CRLF> + <TPRINC "DB system name: "> <PRINC <DB-SYS-NAME .D>> <CRLF> + <TPRINC "DB type: "> <PRINC <DB-SYS-TYPE .D>> <CRLF> + <TPRINC "Host: "> <PRINC <DB-HOST .D>> <CRLF> + <TPRINC "LDI procedure name: "> + <PRIN1 <LDI-PROC-NAME .L>> + <CRLF> + <COND (<LDI-LOCAL .L> + <TTPRINC "LDI is local"> + <CRLF>) + (ELSE + <TTPRINC "LDI is remote host/socket: "> + <PRINC <LDI-HOST-NAME .L>> + <PRINC " "> + <PRINC <LDI-SOCKET .L>> + <CRLF>)> + <COND (.O + <SET GOP <DB-GLOBAL-OPS .O>> + <SET FOP <DB-FIND-OPS .O>> + <SET DOP <DB-DISPLAY-OPS .O>> + <COND (.DOP + <TPRINC "Supported display operations: "> + <COND (<DOP-ALL .DOP> + <PRINC "ALL ">)> + <COND (<DOP-CONSTANT .DOP> + <PRINC "CONSTANT ">)> + <COND (<DOP-FIELD .DOP> + <PRINC "FIELD ">)> + <COND (<DOP-EXP .DOP> + <PRINC "EXP">)> + <CRLF>)> + <COND (.GOP + <TPRINC "Supported global optimizations: "> + <COND (<GOP-ALL .GOP> + <PRINC "ALL ">)> + <COND (<GOP-TEMP-FILE .GOP> + <PRINC "TEMPORARY-FILES ">)> + <COND (<GOP-EXTERN-FILE .GOP> + <PRINC "EXTERNAL-FILES ">)> + <CRLF>)> + <COND (.FOP + <TPRINC "Supported find verbs: "> + <COND (<FOP-KEY .FOP> + <PRINC "DB_KEY ">)> + <COND (<FOP-CURRENT .FOP> + <PRINC "CURRENT ">)> + <COND (<FOP-POSITIONAL .FOP> + <PRINC "POSITIONAL ">)> + <COND (<FOP-OWNER .FOP> + <PRINC "OWNER ">)> + <COND (<FOP-CALC .FOP> + <PRINC "CALC ">)> + <COND (<FOP-USE-CUR .FOP> + <PRINC "USING_CURRENT ">)> + <COND (<FOP-USE-NON-CUR .FOP> + <PRINC "USING_NON_CURRENT ">)> + <CRLF>)> + <TPRINC "Max quantified predicates: "> + <PRINC <DB-MAX-QUANT-ITER .O>> <CRLF> + <TPRINC "Max non-quantified predicates: "> + <PRINC <DB-MAX-NON-QUANT-ITER .O>> <CRLF> + <TPRINC "Max quantified relations: "> + <PRINC <DB-MAX-QUANT-REL .O>> <CRLF> + <COND (<DB-STRICT-NESTING-ONLY .O> + <TPRINC "Strict nesting of entities required"> + <CRLF>)> + <COND (<DB-MULTIPLE-ITER .O> + <TPRINC "Multiple iterations over entity supported"> + <CRLF>)> + <COND (<DB-RESTRICT-PROP .O> + <TPRINC "Restrictions propagate to all occurrences"> + <CRLF>)> + <TPRINC "In non-quantified predicates --"> <CRLF> + <PP-DBMS-PRED + <DB-ARITH-OPS .O> <DB-COMPARE-OPS .O> + <DB-EXIST-OPS .O> <DB-LOG-OPS .O> + <DB-QUANT-REL .O> <DB-REL-OPS .O> + <DB-AP-REQUIRED .O> <DB-AP-ONLY .O> + > + <CRLF> + <TPRINC "In quantified predicates --"> <CRLF> + <PP-DBMS-PRED + <DB-QP-ARITH-OPS .O> <DB-QP-COMPARE-OPS .O> + <DB-QP-EXIST-OPS .O> <DB-QP-LOG-OPS .O> + <DB-QP-QUANT-REL .O> <DB-QP-REL-OPS .O> + <DB-QP-AP-REQUIRED .O> <DB-QP-AP-ONLY .O> + > + <CRLF> + <TPRINC "Default integer bit size: "> + <PRINC <DB-DEF-INT-BITS .O>> <CRLF> + <TPRINC "Default integer representation: "> + <PRINC <DB-DEF-INT-REP .O>> <CRLF> + <TPRINC "Default character bit size: "> + <PRINC <DB-DEF-STR-BITS .O>> <CRLF> + <TPRINC "Default character representation: "> + <PRINC <DB-DEF-STR-REP .O>> <CRLF>)>> +;" " +<DEFINE PP-DBMS-PRED (AOP COP EOP LOP QUAN ROP AP-R AP-O) + #DECL ( (AOP) <OR ARITHMETIC-OPS FALSE> + (COP) <OR COMPARE-OPS FALSE> + (EOP LOP) <OR LOGICAL-OPS FALSE> + (QUAN) <OR QUANTIFIED-OPS FALSE> + (REL) <OR RELATIONAL-OPS FALSE> + (AP-R AP-O) <OR ATOM FALSE> + ) + <COND (.AP-R + <TPRINC "Access path usage required"> <CRLF>)> + <COND (.AP-O + <TPRINC "Use access paths only"> <CRLF>)> + <COND (.AOP + <TPRINC "Supported arithmetic operations: "> + <COND (<AOP-ALL .AOP> + <PRINC "ALL ">)> + <COND (<AOP-PLUS .AOP> + <PRINC "PLUS ">)> + <COND (<AOP-MINUS .AOP> + <PRINC "MINUS ">)> + <COND (<AOP-MULTIPLY .AOP> + <PRINC "MULTIPLY ">)> + <COND (<AOP-DIVIDE .AOP> + <PRINC "DIVIDE ">)> + <COND (<AOP-CONCAT .AOP> + <PRINC "CONCATENATE ">)> + <CRLF>)> + <COND (.ROP + <TPRINC "Supported relational operations: "> + <COND (<ROP-ALL .ROP> + <PRINC "ALL ">)> + <COND (<ROP-GT .ROP> + <PRINC "GT ">)> + <COND (<ROP-LT .ROP> + <PRINC "LT ">)> + <COND (<ROP-LE .ROP> + <PRINC "LE ">)> + <COND (<ROP-GE .ROP> + <PRINC "GE ">)> + <COND (<ROP-NE .ROP> + <PRINC "NE ">)> + <COND (<ROP-EQ .ROP> + <PRINC "EQ ">)> + <COND (<ROP-AC .ROP> + <PRINC "ALPHA-COLLATE ">)> + <COND (<ROP-ISIN .ROP> + <PRINC "ISIN ">)> + <CRLF>)> + <COND (.LOP + <TPRINC "Supported logical operations: "> + <COND (<LOP-ALL .LOP> + <PRINC "ALL ">)> + <COND (<LOP-AND .LOP> + <PRINC "AND ">)> + <COND (<LOP-NOT .LOP> + <PRINC "NOT ">)> + <COND (<LOP-OR .LOP> + <PRINC "OR ">)> + <CRLF>)> + <COND (.EOP + <TPRINC "Supported existential logical operations: "> + <COND (<LOP-ALL .EOP> + <PRINC "ALL ">)> + <COND (<LOP-AND .EOP> + <PRINC "AND ">)> + <COND (<LOP-NOT .EOP> + <PRINC "NOT ">)> + <COND (<LOP-OR .EOP> + <PRINC "OR ">)> + <CRLF>)> + <COND (.COP + <TPRINC "Supported compare operations: "> + <COND (<COP-ALL .COP> + <PRINC "ALL ">)> + <COND (<COP-CONSTANT .COP> + <PRINC "CONSTANT ">)> + <COND (<COP-FIELD .COP> + <PRINC "FIELD ">)> + <COND (<COP-EXP .COP> + <PRINC "EXP">)> + <CRLF>)> + <COND (.QUAN + <TPRINC "Supported quantified relations: "> + <COND (<QOP-ALL .QUAN> + <PRINC "ALL ">)> + <COND (<QOP-NESTED .QUAN> + <PRINC "NESTED ">)> + <COND (<QOP-PARALLEL .QUAN> + <PRINC "PARALLEL ">)> + <CRLF>)> +> +;" " +;"PP-DBMS-TABLE pretty prints the DBMS-TABLE." + +<DEFINE PP-DBMS-TABLE (DT "AUX" (I 0)) + #DECL ((DT) VECTOR (I) FIX) + <CRLF> <PRINC "DBMS Table: "> <CRLF> + <MAPF <> + <FUNCTION (D) + <SET I <+ .I 1>> + <COND (.D + <PRINC " ("> + <PRINC .I> + <PRINC ")"> + <PP-DBMS .D> + <CRLF>)>> + .DT>> +;" " +;"PP-DIR pretty prints the entire schema directory." + +<DEFINE PP-DIR ("AUX" V E D) + #DECL ((V E D) <OR VECTOR FALSE>) + <COND (<NOT <GASSIGNED? SCHEMA-DIR>> + <INITIALIZE-DIRECTORY>)> + <SET V <VIEW-TABLE ,SCHEMA-DIR>> + <SET E <ENTITY-TYPE-TABLE ,SCHEMA-DIR>> + <SET D <DBMS-TABLE ,SCHEMA-DIR>> + <CRLF> <PRINC " *** Schema Directory ***"> <CRLF> + <COND (<AND .V + <NOT <EMPTY? .V>>> + <PP-VIEW-TABLE .V> <CRLF>) + (ELSE + <PRINC "View table is empty"> <CRLF>)> + <COND (<AND .E + <NOT <EMPTY? .E>>> + <PP-ENTITY-TYPE-TABLE .E> <CRLF>) + (ELSE + <PRINC "Entity Type table is empty"> <CRLF>)> + <COND (<AND .D + <NOT <EMPTY? .D>>> + <PP-DBMS-TABLE .D> <CRLF>) + (ELSE + <PRINC "DBMS table is empty"> <CRLF>)>> +;" " +<DEFINE PP-ENTITY-PRED (TYP) + #DECL ( (TYP) PREDICATE-TYPES) + <COND (<PT-ALL .TYP> + <PRINC "ALL ">)> + <COND (<PT-NO .TYP> + <PRINC "NO ">)> + <COND (<PT-QUANT .TYP> + <PRINC "QUANTIFIED ">)> + <COND (<PT-NON-QUANT .TYP> + <PRINC "NON-QUANTIFIED ">)> +> +;" " +;"PP-ENTITY-TYPE pretty prints an entry in the ENTITY-TYPE-TABLE." + +<DEFINE PP-ENTITY-TYPE (E "AUX" (F <ET-FUNCTIONS .E>) M) + #DECL ((E) ENTITY-TYPE (F) VECTOR (M) <OR E-PHY-REP FALSE>) + <TPRINC "Entity type name: "> <PRINC <ET-NAME .E>> <CRLF> + <TPRINC "ETID: "> <PRINC <ET-ETID .E>> <CRLF> + <TPRINC "VID: "> <PRINC <ET-VID .E>> <CRLF> + <TPRINC "Supertypes: "> + <PLIST <CHTYPE <ET-SUPERTYPES .E> LIST>> + <CRLF> + <TPRINC "Subtypes: "> + <PLIST <CHTYPE <ET-SUBTYPES .E> LIST>> + <CRLF> + <TPRINC "Cotypes: "> + <PLIST <CHTYPE <ET-COTYPES .E> LIST>> + <CRLF> + <TPRINC "Map type: "> <PRINC <ET-MAP-TYPE .E>> <CRLF> + <TPRINC "Map info: "> <CRLF> + <SET M <ET-MAP-INFO .E>> + <COND (<TYPE? .M E-PHY-REP> + <TTPRINC "Spelled: "> <PRIN1 <E-SPELLING .M>> <CRLF> + <TTPRINC "DBMS id: "> <PRINC <E-DBMS-ID .M>> <CRLF> + <TTPRINC "System entry point: "> <PRINC <E-SYS-EP .M>> <CRLF> + <COND (<E-SYS-EP-AP-ONLY .M> + <TTPRINC "System entry point by access path only"> + <CRLF>)> + <TTPRINC "Context: "> <PRIN1 <E-CONTEXT .M>> <CRLF> + <TTPRINC "Owners: "> <PLIST <CHTYPE <E-OWNERS .M> LIST>> <CRLF> + <TTPRINC "# Fast access paths via equality: "> + <PRINC <E-AP-EQ-COUNT .M>> <CRLF> + <COND (<E-AREAS .M> + <TTPRINC "Areas: "> <PLIST <CHTYPE <E-AREAS .M> LIST>> + <CRLF>)> + <COND (<E-SYS-SET .M> + <TTPRINC "System owned set: "> <PRIN1 <E-SYS-SET .M>> + <CRLF>)> + <COND (<E-SYS-EP-KEYS .M> + <TTPRINC "Iterate using keys: "> + <PLIST <CHTYPE <E-SYS-EP-KEYS .M> LIST>> + <CRLF>)> + <COND (<E-ITER-PRED .M> + <TTPRINC "When domain of iteration, may use "> + <PP-ENTITY-PRED <E-ITER-PRED .M>> + <PRINC "predicates"> + <CRLF>)> + <COND (<E-QUANT-PRED .M> + <TTPRINC "When domain of quantification, may use "> + <PP-ENTITY-PRED <E-QUANT-PRED .M>> + <PRINC "predicates"> + <CRLF>)> + <COND (<E-NO-QUANT .M> + <TTPRINC "May not be domain of quantified expression"> + <CRLF>)> + <COND (<E-KEY .M> + <COND (<EMPTY? <E-KEY .M>> + <TTPRINC "Entity key is database_key.">) + (ELSE + <TTPRINC "Entity key uses functions: "> + <PLIST <CHTYPE <E-KEY .M> LIST>>)>) + (ELSE + <TTPRINC "Entity key is undefined.">)> + <CRLF> + )> + <TPRINC "Functions:"> <CRLF> <PP-FUNC-TABLE .F>> +;" " +;"PP-ENTITY-TYPE-TABLE pretty prints the ENTITY-TYPE-TABLE." + +<DEFINE PP-ENTITY-TYPE-TABLE (ET "AUX" (I 0)) + #DECL ((ET) VECTOR (I) FIX) + <PRINC "Entity Type Table:"> <CRLF> + <MAPF <> + <FUNCTION (E) + <SET I <+ .I 1>> + <COND (.E + <PRINC " ("> + <PRINC .I> + <PRINC ")"> + <PP-ENTITY-TYPE .E>)>> + .ET>> +;" " +;"PP-FUNC-TABLE pretty prints an entity type's functions." + +<DEFINE PP-FUNC-TABLE (FT "AUX" (I 0) M) + #DECL ((FT) VECTOR (I) FIX (M) <OR F-PHY-REP FALSE>) + <MAPF <> + <FUNCTION (F) + <SET I <+ .I 1>> + <COND (.F + <TPRINC "("> + <PRINC .I> + <PRINC ")"> + <TPRINC "Name: "> <PRINC <F-NAME .F>> <CRLF> + <TTPRINC "Type: "> <PRINC <F-TYPE .F>> <CRLF> + <TTPRINC "Range: "> <PRINC <F-RANGE .F>> <CRLF> + <TTPRINC "Min or ETID: "> + <PRINC <F-MIN .F>> <CRLF> + <TTPRINC "Max: "> <PRINC <F-MAX .F>> <CRLF> + <TTPRINC "Map type: "> <PRINC <F-MAP-TYPE .F>> + <CRLF> + <TTPRINC "Map info:"> <CRLF> + <SET M <F-MAP-INFO .F>> + <COND (<TYPE? .M F-PHY-REP> + <TTTPRINC "Spelled: "> + <PRIN1 <F-SPELLING .M>> <CRLF> + <COND (<OR <F-AP-EQ .M> + <F-AP-NQ .M> + <F-AP-RANGE .M>> + <TTTPRINC "Access path: "> + <COND (<F-AP-EQ .M> + <PRINC "EQ ">)> + <COND (<F-AP-NQ .M> + <PRINC "NQ ">)> + <COND (<F-AP-RANGE .M> + <PRINC "RANGE ">)> + <PRINC " when spelled "> + <PRIN1 <F-AP-SPELLING .M>> + <CRLF> + )> + <COND (<F-AP-UNIQUE .M> + <TTTPRINC "CALC keys are unique"> + <CRLF>)> + <COND (<F-AP-CO-FCNS .M> + <TTTPRINC "Access path co-functions: "> + <PLIST <CHTYPE <F-AP-CO-FCNS .M> LIST>> + <CRLF>)> + <COND (<F-AP-SELECTS .M> + <TTTPRINC "Access path selects entity: "> + <PRINC <F-AP-SELECTS .M>> + <CRLF>)> + <COND (<OR <==? <F-TYPE .F> F-INTEGER> + <==? <F-TYPE .F> F-STRING>> + <COND (<F-INT-STR .M> + <TTTPRINC "Stored as character string"> <CRLF>)> + <TTTPRINC "Characters to print: "> + <PRINC <F-CONV-CHARS .M>> <CRLF>)> + <COND (<OR <==? <F-TYPE .F> F-STRING> + <F-INT-STR .M>> + <TTTPRINC "Min chars: "> + <PRINC <F-MIN-CHR .M>> <CRLF> + <TTTPRINC "Max chars: "> + <PRINC <F-MAX-CHR .M>> <CRLF>)> + <COND (<OR <==? <F-TYPE .F> F-INTEGER> + <F-INT-STR .M>> + <TTTPRINC "Size in bits at GDM: "> + <PRINC <F-CONV-BITS .M>> <CRLF>)> + <COND (<OR <F-SET .M> + <F-REPEAT-GRP .M>> + <COND (<F-SET .M> + <TTTPRINC "Implemented as: SET"> + <CRLF>)> + <COND (<F-REPEAT-GRP .M> + <TTTPRINC "Implemented as: REPEATING GROUP"> + <CRLF>)>) + (ELSE + <COND (<NOT <==? <F-TYPE .F> + F-ENTITY>> + <TTTPRINC "Size in bits at DBMS: "> + <PRINC <F-BITS .M>> <CRLF> + <TTTPRINC "Representation: "> + <PRINC <F-REP .M>> <CRLF>)>)> + <COND (<SET AOP <F-ARITH-OPS .M>> + <TTTPRINC "Restricted to arithmetic operations: "> + <COND (<AOP-ALL .AOP> + <PRINC "ALL ">)> + <COND (<AOP-PLUS .AOP> + <PRINC "PLUS ">)> + <COND (<AOP-MINUS .AOP> + <PRINC "MINUS ">)> + <COND (<AOP-MULTIPLY .AOP> + <PRINC "MULTIPLY ">)> + <COND (<AOP-DIVIDE .AOP> + <PRINC "DIVIDE ">)> + <COND (<AOP-CONCAT .AOP> + <PRINC "CONCATENATE ">)> + <CRLF>)> + <COND (<SET ROP <F-REL-OPS .M>> + <TTTPRINC "Restricted to relational operations: "> + <COND (<ROP-ALL .ROP> + <PRINC "ALL ">)> + <COND (<ROP-GT .ROP> + <PRINC "GT ">)> + <COND (<ROP-LT .ROP> + <PRINC "LT ">)> + <COND (<ROP-LE .ROP> + <PRINC "LE ">)> + <COND (<ROP-GE .ROP> + <PRINC "GE ">)> + <COND (<ROP-NE .ROP> + <PRINC "NE ">)> + <COND (<ROP-EQ .ROP> + <PRINC "EQ ">)> + <COND (<ROP-AC .ROP> + <PRINC "ALPHA-COLLATE ">)> + <COND (<ROP-ISIN .ROP> + <PRINC "ISIN ">)> + <CRLF>)> + )>)>> + .FT>> +;" " +;"PP-VIEW-TABLE pretty prints the VIEW-TABLE." + +<DEFINE PP-VIEW-TABLE (VT "AUX" (I 0)) + #DECL ((VT) VECTOR (I) FIX) + <CRLF> <PRINC "View Table:"> <CRLF> + <MAPF <> + <FUNCTION (V) + <SET I <+ .I 1>> + <COND (.V + <PRINC " ("> + <PRINC .I> + <PRINC ")"> + <TPRINC "View name: "> + <PRINC <V-NAME .V>> + <CRLF>)>> + .VT>> + + +<ENDPACKAGE> ;"BUILD-DIR" + + +� \ No newline at end of file diff --git a/<mdl.comp>/buildl.mud.19 b/<mdl.comp>/buildl.mud.19 new file mode 100644 index 0000000..5118798 --- /dev/null +++ b/<mdl.comp>/buildl.mud.19 @@ -0,0 +1,260 @@ +<PACKAGE "BUILDL"> + +<ENTRY LIST-BUILD> + +<USE "CACS" "CODGEN" "COMCOD" "COMPDEC" "CHKDCL"> + +<DEFINE LIST-BUILD (NOD W + "AUX" (K <KIDS .NOD>) (KK ()) N TEM TT T1 D1 D2 D3 + (OOPSF <>)) + #DECL ((K KK) <LIST [REST NODE]> (N NOD) NODE) + <COND + (<MAPF <> + <FUNCTION (N) + #DECL ((N) NODE) + <COND (<AND <G=? <LENGTH .N> <CHTYPE <INDEX ,SIDE-EFFECTS> + FIX>> + <SIDE-EFFECTS .N>> + <MAPLEAVE <>>) + (ELSE <SET KK (.N !.KK)> T)>> + .K> + <COND (<AND <==? <NODE-TYPE <SET N <1 .KK>>> ,SEG-CODE> + <==? <STRUCTYP <RESULT-TYPE <SET N <1 <KIDS .N>>>>> LIST>> + <SET TEM + <GEN .N + <COND (<EMPTY? <REST .KK>> .W) + (ELSE <DATUM LIST ,AC-E>)>>> + <SET KK <REST .KK>>) + (ELSE <SET TEM <REFERENCE ()>>)> + <MAPF <> + <FUNCTION (N "AUX" (COD <DEFERN <RESULT-TYPE .N>>)) + #DECL ((N) NODE (COD) FIX) + <COND (<==? <NODE-TYPE .N> ,SEG-CODE> + <SET TEM + <SEG-BUILD-LIST <1 <KIDS .N>> .TEM <> <> <>>>) + (ELSE + <SET T1 <GEN .N <DATUM ,AC-C ,AC-D>>> + <SET TEM <MOVE:ARG .TEM <DATUM LIST ,AC-E>>> + <RET-TMP-AC .TEM> + <RET-TMP-AC .T1> + <REGSTO T> + <EMIT <INSTRUCTION `PUSHJ + `P* + <COND (<0? .COD> |C1CONS ) + (ELSE |CICONS )>>> + <SET TEM <FUNCTION:VALUE T>>)>> + .KK> + <MOVE:ARG .TEM .W>) + (ELSE + <COND (<==? <NODE-TYPE <SET N <1 .K>>> ,SEG-CODE> + <SET TEM <SEG-BUILD-LIST <1 <KIDS .N>> <REFERENCE ()> T T <>>> + <SET D3 <2 .TEM>> + <SET D2 <1 .TEM>> + <SET OOPSF <3 .TEM>>) + (ELSE + <SET D1 <GEN .N <DATUM ,AC-C ,AC-D>>> + <SGETREG ,AC-E <>> + <MUNG-AC ,AC-E> + <EMIT <INSTRUCTION `MOVEI `E* 0>> + <RET-TMP-AC .D1> + <REGSTO T> + <EMIT <INSTRUCTION + `PUSHJ + `P* + <COND (<0? <DEFERN <RESULT-TYPE .N>>> |C1CONS ) + (ELSE |CICONS )>>> + <SET D2 <DATUM LIST ,AC-B>> + <SET D3 <DATUM LIST ,AC-B>> + <PUT ,AC-B ,ACLINK (.D2)> + <REGSTO T> + <PUT ,AC-B ,ACLINK (.D3)>)> + <MAPR <> + <FUNCTION (L "AUX" (N <1 .L>)) + #DECL ((N) NODE) + <COND + (<==? <NODE-TYPE .N> ,SEG-CODE> + <COND + (<AND <==? <STRUCTYP <RESULT-TYPE <SET N <1 <KIDS .N>>>>> LIST> + <EMPTY? <REST .L>>> + <SET D1 <GEN .N <DATUM LIST ANY-AC>>> + <COND (.OOPSF + <TOACV .D1> + <PUT <DATVAL .D1> ,ACPROT T> + <EMIT <INSTRUCTION `SKIPE + <ACSYM <SET TEM <GETREG <>>>> + !<ADDR:VALUE .D3>>> + <PUT <DATVAL .D1> ,ACPROT <>>)> + <EMIT <INSTRUCTION `HRRM + <ACSYM <DATVAL .D1>> + `@ + !<ADDR:VALUE .D3>>> + <COND (.OOPSF + <EMIT <INSTRUCTION `SKIPN <ADDRSYM .TEM>>> + <COND (<TYPE? <DATVAL .D2> AC> + <EMIT <INSTRUCTION + `MOVE + <ACSYM <DATVAL .D2>> + !<ADDR:VALUE .D1>>>) + (ELSE + <EMIT <INSTRUCTION + `MOVEM + <ACSYM <DATVAL .D1>> + !<ADDR:VALUE .D2>>>)>)> + <RET-TMP-AC .D1>) + (ELSE <SET D3 <SEG-BUILD-LIST .N .D3 T <> <COND (.OOPSF .D2)>>>)>) + (ELSE + <SET D1 <GEN .N <DATUM ,AC-C ,AC-D>>> + <SGETREG ,AC-E <>> + <SET D1 <MOVE:ARG .D1 <DATUM ,AC-C ,AC-D>>> + <EMIT '<`MOVEI `E* >> + <RET-TMP-AC .D1> + <REGSTO T> + <EMIT <INSTRUCTION + `PUSHJ + `P* + <COND (<0? <DEFERN <RESULT-TYPE .N>>> |C1CONS ) + (ELSE |CICONS )>>> + <COND (.OOPSF <EMIT <INSTRUCTION `SKIPE `C* !<ADDR:VALUE .D3>>>)> + <EMIT <INSTRUCTION `HRRM `B* `@ !<ADDR:VALUE .D3>>> + <EMIT <INSTRUCTION `MOVEM `B* !<ADDR:VALUE .D3>>> + <COND (.OOPSF + <EMIT '<`SKIPN `C >> + <EMIT <INSTRUCTION `MOVEM `B* !<ADDR:VALUE .D2>>>)>)>> + <REST .K>> + <RET-TMP-AC .D3> + <MOVE:ARG .D2 .W>)>> + +<DEFINE SEG-BUILD-LIST (NOD DAT FLG FST SMQ + "AUX" (TYP <RESULT-TYPE .NOD>) (TG2 <MAKE:TAG>) + (ITYP <ISTYPE? .TYP>) (TPS <STRUCTYP .TYP>) + (ET <GET-ELE-TYPE .TYP ALL>) (DF <DEFERN .ET>) + (ML <MINL .TYP>) (TG1 <MAKE:TAG>) TEM D1 D3 FDAT + D4) + #DECL ((NOD) NODE (DAT D1 D2 FDAT) DATUM (SMQ) <OR DATUM FALSE>) + <SET ET <ISTYPE-GOOD? .ET>> + <SET D1 + <GEN .NOD + <DATUM <COND (<ISTYPE-GOOD? .ITYP> .ITYP) + (<ISTYPE-GOOD? .TPS> .TPS) + (ELSE ANY-AC)> + ANY-AC>>> + <COND (<ISTYPE-GOOD? .TPS> <DATTYP-FLUSH .D1> <PUT .D1 ,DATTYP .TPS>)> + <COND (<OR .FST <NOT .FLG>> + <COND (<0? .ML> + <SET DAT + <MOVE:ARG .DAT + <DATUM LIST + <COND (.FST ,AC-B) (ELSE ,AC-E)>>>> + <COND (.FST + <RET-TMP-AC .D1> + <SET FDAT <DATUM LIST <DATVAL .DAT>>> + <REGSTO T> + <PUT ,AC-B ,ACLINK (.FDAT)> + <PUT <DATVAL .D1> ,ACLINK (.D1)> + <COND (<TYPE? <DATTYP .D1> AC> + <PUT <DATTYP .D1> ,ACLINK (.D1)>)>)> + <MT-TEST .D1 .TG1 .TPS>)> + <SET TEM + <OFFPTR <COND (<==? .TPS UVECTOR> -1) (ELSE 0)> .D1 .TPS>> + <SET D3 <DATUM <COND (.ET) (ELSE .TEM)> .TEM>> + <SET D3 <MOVE:ARG .D3 <DATUM ,AC-C ,AC-D> T>> + <COND (<AND .FLG .FST> <RET-TMP-AC .FDAT>) + (<NOT .FLG> + <SET DAT <MOVE:ARG .DAT <DATUM LIST ,AC-E>>> + <RET-TMP-AC .DAT>)> + <RET-TMP-AC .D3> + <REGSTO T> + <AND .FST <EMIT '<`MOVEI `E* >>> + <EMIT <INSTRUCTION `PUSHJ + `P* + <COND (<0? .DF> |C1CONS ) (ELSE |CICONS )>>> + <COND (<AND .FST <0? .ML>> + <EMIT <INSTRUCTION `MOVEM `B* !<ADDR:VALUE .DAT>>>)>)> + <COND (<OR <NOT .FST> <NOT <0? .ML>>> + <SET FDAT <DATUM LIST ,AC-B>> + <PUT ,AC-B ,ACLINK (.FDAT)>)> + <COND (<OR .FST <NOT .FLG>> <SET D1 <1REST .D1 .TPS>>)> + <COND (<OR <NOT .FST> <NOT <0? .ML>>> + <SET DAT <MOVE:ARG .FDAT <DATUM LIST ,AC-E> T>>)> + <RET-TMP-AC .D1> + <RET-TMP-AC .FDAT> + <REGSTO T> + <PUT <DATVAL .D1> ,ACLINK (.D1)> + <COND (<TYPE? <DATTYP .D1> AC> <PUT <DATTYP .D1> ,ACLINK (.D1)>)> + <PUT ,AC-B ,ACLINK (.FDAT)> + <COND (<L=? .ML 1> <MT-TEST .D1 .TG1 .TPS>)> + <SET D4 <DATUM !.D1>> + <LABEL:TAG .TG2> + <SET TEM <OFFPTR <COND (<==? .TPS UVECTOR> -1) (ELSE 0)> .D1 .TPS>> + <SET D3 + <MOVE:ARG <DATUM <COND (.ET) (ELSE .TEM)> .TEM> + <DATUM ,AC-C ,AC-D> + T>> + <SGETREG ,AC-E <>> + <RET-TMP-AC .D3> + <COND (.FLG <EMIT '<`MOVEI `E* >>) + (ELSE <EMIT <INSTRUCTION `HRRZ `E* `@ !<ADDR:VALUE .FDAT>>>)> + <REGSTO T> + <EMIT <INSTRUCTION `PUSHJ + `P* + <COND (<0? .DF> |C1CONS ) (ELSE |CICONS )>>> + <COND (.SMQ <EMIT <INSTRUCTION `SKIPE `C* !<ADDR:VALUE .FDAT>>>)> + <EMIT <INSTRUCTION `HRRM `B* `@ !<ADDR:VALUE .FDAT>>> + '<EMIT <INSTRUCTION `MOVEM `B* !<ADDR:VALUE .FDAT>>> + <COND (.SMQ + <EMIT '<`SKIPN `C >> + <EMIT <INSTRUCTION `MOVEM `B* !<ADDR:VALUE .SMQ>>>)> + <REST-N-JMP .D1 .TPS .TG2 .D4> + <COND (.FLG <SET FDAT <DATUM LIST ,AC-B>> <PUT ,AC-B ,ACLINK (.FDAT)>) + (ELSE <SET DAT <MOVE:ARG .DAT <DATUM LIST ,AC-E>>>)> + <LABEL:TAG .TG1> + <COND (<AND .FLG .FST> (.DAT .FDAT <0? .ML>)) (.FLG .FDAT) (ELSE .DAT)>> + +<DEFINE MT-TEST (D TG TP) #DECL ((TP) ATOM (D) DATUM) + <SET D <TOACV .D>> + <COND (<==? .TP LIST> <EMIT <INSTRUCTION `JUMPE <ACSYM <DATVAL .D>> .TG>>) + (ELSE <EMIT <INSTRUCTION `JUMPGE <ACSYM <DATVAL .D>> .TG>>)>> + +<DEFINE 1REST (D TP + "AUX" (DD + <DATUM <COND (<ISTYPE-GOOD? .TP> .TP) (ELSE ANY-AC)> + ANY-AC>) AC) + #DECL ((TP) ATOM (D DD) DATUM (AC) AC) + <COND (<==? .TP LIST> + <PUT .DD ,DATVAL <SET AC <GETREG .DD>>> + <EMIT <INSTRUCTION `HRRZ <ACSYM .AC> `@ !<ADDR:VALUE .D>>> + <RET-TMP-AC .D>) + (ELSE + <SET DD <MOVE:ARG .D .DD>> + <EMIT <INSTRUCTION `ADD + <ACSYM <DATVAL .DD>> + <COND (<==? .TP UVECTOR> '[<1 (1)>]) + (ELSE '[<2 (2)>])>>>)> + .DD> + +<DEFINE REST-N-JMP (D TP TG D1 "AUX" (AC <DATVAL .D1>)) + #DECL ((D D1) DATUM (TP) ATOM (AC) AC) + <COND (<==? .TP LIST> + <EMIT <INSTRUCTION `HRRZ <ACSYM .AC> `@ !<ADDR:VALUE .D>>> + <EMIT <INSTRUCTION `JUMPN <ACSYM .AC> .TG>> + <RET-TMP-AC .D> + <PUT .AC ,ACLINK (.D1 !<ACLINK .AC>)>) + (ELSE + <EMIT <INSTRUCTION `MOVE <ACSYM .AC> !<ADDR:VALUE .D>>> + <COND (<TYPE? <DATTYP .D1> AC> + <EMIT <INSTRUCTION `MOVE + <ACSYM <DATTYP .D1>> + !<ADDR:TYPE .D>>> + <PUT <DATTYP .D1> ,ACLINK (.D1 !<ACLINK + <DATTYP .D1>>)>)> + <RET-TMP-AC .D> + <PUT .AC ,ACLINK (.D1 !<ACLINK .AC>)> + <COND (<==? .TP UVECTOR> + <EMIT <INSTRUCTION `AOBJN <ACSYM .AC> .TG>>) + (ELSE + <EMIT <INSTRUCTION `ADD <ACSYM .AC> '[<2 (2)>]>> + <EMIT <INSTRUCTION `JUMPL <ACSYM .AC> .TG>>)>)> + T> + + +<ENDPACKAGE> \ No newline at end of file diff --git a/<mdl.comp>/cacs.mud.28 b/<mdl.comp>/cacs.mud.28 new file mode 100644 index 0000000..5724a07 --- /dev/null +++ b/<mdl.comp>/cacs.mud.28 @@ -0,0 +1,859 @@ +<PACKAGE "CACS"> + +<ENTRY GETREG SGETREG RET-TMP-AC TOACT TOACV FLUSH-RESIDUE TOACT FLUSH-RESIDUE + SAVE-STATE MUNG-AC TOACV AC+1OK? DATTYP-FLUSH SAVE:RES PREFER-DATUM + MERGE-STATE GET2REG SMASH-INACS SAVE-NUM-SYM ANY2ACS RESTORE-STATE KILL-LIST + CHECK:VARS CALL-INTERRUPT SINACS FREE-ACS REGSTO FIX-NUM-SYM SPEC-OFFPTR + KILL-LOOP-AC SMASH-NUM-SYM GET-NUM-SYM STORE-VAR STORE-TVAR STOREV VAR-STORE + KILL-STORE UNPREFER> + +<USE "COMPDEC" "CHKDCL" "COMCOD" "CODGEN" "CUP"> + +<DEFINE GETREG (DAT + "OPTIONAL" (TYPE-AC <>) + "AUX" AC (BEST <>) (OLDAGE <CHTYPE <MIN> FIX>)(WINNAGE -1)) + #DECL ((DAT) ANY (BEST) <OR FALSE AC> (VALUE) AC (WINNAGE OLDAGE) FIX) + <MAPF <> + <FUNCTION (AC "AUX" (SCORE 0) PAC NAC) + #DECL ((AC PAC NAC) AC (SCORE) FIX) + <PROG () + <COND (<ACPROT .AC> <RETURN>)> + <COND (<ACLINK .AC> + <COND (<G? .WINNAGE ,LINKED> <RETURN>)> + <COND (<G? <ACAGE .AC> .OLDAGE> <RETURN>)> + <SET WINNAGE ,LINKED> + <SET OLDAGE <ACAGE <SET BEST .AC>>> + <RETURN>)> + <COND (<ACRESIDUE .AC> + <COND (<G? .WINNAGE ,NO-RESIDUE> <RETURN>)> + <COND (<ALL-STORED? <ACRESIDUE .AC>> + <COND (<G? .WINNAGE ,STORED-RESIDUE> <RETURN>)> + <SET SCORE ,STORED-RESIDUE>) + (<G? .WINNAGE ,NOT-STORED-RESIDUE> <RETURN>) + (ELSE <SET SCORE ,NOT-STORED-RESIDUE>)>) + (ELSE <SET SCORE ,NO-RESIDUE>)> + <COND (<NOT <ACPREF .AC>> <SET SCORE <+ .SCORE ,NOT-PREF>>)> + <COND (<NOT .TYPE-AC> <SET SCORE <+ .SCORE <RATE .AC PREV>>>) + (ELSE <SET SCORE <+ .SCORE ,P-N-CLEAN>>)> + <SET SCORE <+ .SCORE <RATE .AC NEXT>>> + <COND (<G? .SCORE .WINNAGE> + <SET WINNAGE .SCORE> + <SET BEST .AC>)>>> + ,ALLACS> + <SET BEST <CHTYPE .BEST AC>> + ;"Make sure the poor compiler knows this guy is an AC" + <COND (<TYPE? .DAT DATUM> <PUT .BEST ,ACLINK (.DAT)>) + (ELSE <PUT .BEST ,ACLINK .DAT>)> + <COND (<ACRESIDUE .BEST> + <MAPF <> + <FUNCTION (SYMT "AUX" (INAC <SINACS .SYMT>) IAC) + #DECL ((INAC) DATUM) + <COND (<AND <TYPE? <SET IAC <DATTYP .INAC>> AC> + <N==? .IAC .BEST>> + <FLUSH-RESIDUE .IAC .SYMT>)> + <COND (<AND <TYPE? <SET IAC <DATVAL .INAC>> AC> + <N==? .IAC .BEST>> + <FLUSH-RESIDUE .IAC .SYMT>)> + <STOREV .SYMT>> + <ACRESIDUE .BEST>> + <PUT .BEST ,ACRESIDUE <>>)> + <PUT .BEST ,ACAGE <SETG ATIME <+ ,ATIME 1>>> + .BEST> + +<DEFINE ALL-STORED? (L) #DECL ((L) LIST) + <MAPF <> <FUNCTION (S) <COND (<AND <TYPE? .S SYMTAB> + <NOT <STORED .S>>> + <MAPLEAVE <>>)> T> .L>> + +<DEFINE RATE (AC PREV-OR-NEXT + "AUX" (PREV <==? .PREV-OR-NEXT PREV>) (SCORE 0) OTHAC) + #DECL ((AC OTHAC) AC (PREV-OR-NEXT) ATOM) + <PROG () + <COND (.PREV + <COND (<OR <==? .AC ,AC-A> + <ACPROT <SET OTHAC + <NTH ,ALLACS <- <ACNUM .AC> 1>>>>> + <RETURN 0>)>) + (<OR <==? .AC ,LAST-AC> + <ACPROT <SET OTHAC <NTH ,ALLACS <+ <ACNUM .AC> 1>>>>> + <RETURN 0>)> + <COND (<ACLINK .OTHAC> <RETURN ,P-N-LINKED>)> + <COND (<ACRESIDUE .OTHAC> + <COND (<ALL-STORED? <ACRESIDUE .OTHAC>> + <RETURN ,P-N-STO-RES>) + (ELSE <RETURN ,P-N-NO-STO-RES>)>) + (ELSE <RETURN ,P-N-CLEAN>)>>> + +<DEFINE UNPREFER () <MAPF <> <FUNCTION (X) <PUT .X ,ACPREF <>>> ,ALLACS>> + +<DEFINE PREFER-DATUM (WHERE) + #DECL ((WHERE) <OR DATUM ATOM>) + <COND (<NOT <TYPE? .WHERE ATOM>> + <PREF-AC <1 .WHERE>> + <PREF-AC <2 .WHERE>>)>> + +<DEFINE PREF-AC (DAT) <COND (<TYPE? .DAT AC> <PUT .DAT ,ACPREF T>)>> + +<DEFINE RELREG (AC D "AUX" (ACL <ACLINK .AC>)) + #DECL ((AC) AC (ACL) <OR FALSE <LIST [REST DATUM]>> (D) DATUM) + <COND (.ACL + <REPEAT ((ACP ())) + #DECL ((ACP) LIST) + <AND <EMPTY? .ACL> <RETURN>> + <COND (<==? <1 .ACL> .D> + <COND (<==? .ACL <ACLINK .AC>> + <PUT .AC ,ACLINK <REST .ACL>>) + (ELSE <PUTREST .ACP <REST .ACL>>)>)> + <SET ACL <REST <SET ACP .ACL>>>> + <AND <EMPTY? <ACLINK .AC>> <PUT .AC ,ACLINK <>>>)> + <PUT .AC ,ACPROT <>> + .AC> + +<DEFINE GETTMP (TYP) <CHTYPE <VECTOR <CREATE-TMP .TYP> <>> TEMP>> + +<DEFINE SAVE:REG (AC FLS + "OPTIONAL" (HANDLE-VARS T) + "AUX" TMP (ACL <ACLINK .AC>) (TYPS <>) (VALS <>) TTMP HLAC) + #DECL ((AC) AC (TMP) TEMP (ACL) <OR FALSE <LIST [REST DATUM]>> (TTMP) DATUM) + <COND + (<AND .HANDLE-VARS <ACRESIDUE .AC>> + <MAPF <> + <FUNCTION (SYM "AUX" SAC (INAC <SINACS .SYM>)) + #DECL ((SYM) SYMBOL (INAC) DATUM) + <COND (<AND <TYPE? .SYM SYMTAB> <NOT <STORED .SYM>>> + <STOREV .SYM .FLS>)> + <COND (.FLS + <COND (<AND <TYPE? <SET SAC <DATTYP .INAC>> AC> + <N==? .SAC .AC>> + <FLUSH-RESIDUE .SAC .SYM>) + (<AND <TYPE? <SET SAC <DATVAL .INAC>> AC> + <N==? .SAC .AC>> + <FLUSH-RESIDUE .SAC .SYM>)> + <SMASH-INACS .SYM <>> + <COND (<AND .FLS + <TYPE? .SYM SYMTAB> + <TYPE? <NUM-SYM .SYM> LIST> + <1 <NUM-SYM .SYM>>> + <PUT <NUM-SYM .SYM> 1 <>>)>)>> + <ACRESIDUE .AC>>)> + <COND + (.ACL + <SET TMP + <GETTMP <COND (<AND <TYPE? <DATTYP <1 .ACL>> ATOM> + <VALID-TYPE? <DATTYP <1 .ACL>>>> + <DATTYP <1 .ACL>>) + (ELSE <>)>>> + <OR .FLS <PUT .TMP ,TMPAC <DATUM !<1 .ACL>>>> + <COND (<TYPE? <DATTYP <SET TTMP <1 .ACL>>> TEMP> + <PUT <CHTYPE <DATVAL .TTMP> AC> ,ACPROT T> + <TOACT .TTMP> + <PUT <CHTYPE <DATVAL .TTMP> AC> ,ACPROT <>>) + (<TYPE? <DATVAL .TTMP> TEMP> + <PUT <CHTYPE <DATTYP .TTMP> AC> ,ACPROT T> + <TOACV .TTMP> + <PUT <CHTYPE <DATTYP .TTMP> AC> ,ACPROT <>>)> + <MAPF <> + <FUNCTION (D) + #DECL ((D) DATUM) + <COND (<TYPE? <SET HLAC <DATTYP .D>> AC> + <OR .TYPS <SET TYPS .HLAC>> + <PUT <PUT .HLAC ,ACLINK <>> ,ACPROT <>> + <OR .FLS + <MEMQ .TMP <ACRESIDUE .HLAC>> + <PUT .HLAC + ,ACRESIDUE + (.TMP !<ACRESIDUE <DATTYP .D>>)>> + <PUT .D ,DATTYP .TMP>) + (<TYPE? .HLAC OFFPTR> + <SET VALS <HACK-OFFPTR .HLAC .TMP>> + <SET VALS <3 .HLAC>>)> + <COND (<TYPE? <SET HLAC <DATVAL .D>> AC> + <OR .VALS <SET VALS .HLAC>> + <PUT <PUT .HLAC ,ACLINK <>> ,ACPROT <>> + <OR .FLS + <MEMQ .TMP <ACRESIDUE .HLAC>> + <PUT .HLAC ,ACRESIDUE (.TMP !<ACRESIDUE + .HLAC>)>> + <PUT .D ,DATVAL .TMP>) + (<TYPE? .HLAC OFFPTR> + <SET VALS <HACK-OFFPTR .HLAC .TMP>> + <SET TYPS <3 .HLAC>>)>> + .ACL> + <OR .TYPS <SET TYPS <DATTYP <1 .ACL>>>> + <SET VALS <CHTYPE <OR .VALS <DATVAL <1 .ACL>>> AC>> + <COND (<TYPE? .TYPS AC> + <STORE-TMP <ACSYM .TYPS> <ACSYM .VALS> <STEMP:ADDR .TMP>>) + (ELSE <STORE-TMP .TYPS <ACSYM .VALS> <STEMP:ADDR .TMP>>)>)> + <AND .FLS + <NOT .HANDLE-VARS> + <MESSAGE INCONSISTENCY "AC-LOSSAGE">> + <AND .FLS <PUT .AC ,ACRESIDUE <>>> + .AC> + +<DEFINE RETTMP (TMP "AUX" INAC AC) + #DECL ((TMP) TEMP (INAC) <OR FALSE DATUM>) + <COND (<SET INAC <SINACS .TMP>> + <COND (<TYPE? <SET AC <DATTYP .INAC>> AC> + <FLUSH-RESIDUE .AC .TMP>)> + <COND (<TYPE? <SET AC <DATVAL .INAC>> AC> + <FLUSH-RESIDUE .AC .TMP>)>)>> + +<DEFINE MUNG-AC (AC "OPTIONAL" (GD <>) (FLS T) "AUX" ACL (ACPR <ACPROT .AC>)) + #DECL ((AC) AC (GD ACL) <PRIMTYPE LIST>) + <COND + (<ACRESIDUE .AC> + <MAPF <> + <FUNCTION (V "AUX" (INAC <SINACS .V>) TT) + #DECL ((INAC) <OR DATUM FALSE>) + <STOREV .V .FLS> + <AND .INAC + .FLS + <OR <COND (<OR <AND <==? .AC <DATTYP .INAC>> + <TYPE? <SET TT <DATVAL .INAC>> AC>> + <AND <==? .AC <DATVAL .INAC>> + <TYPE? <SET TT <DATTYP .INAC>> AC>>> + <MUNG-AC .TT .GD .FLS>)> + <PROG () + <AND <TYPE? <SET TT <DATTYP .INAC>> AC> + <NOT <==? .TT .AC>> + <MUNG-AC .TT .INAC .FLS>> + <AND <TYPE? <SET TT <DATVAL .INAC>> AC> + <NOT <==? .TT .AC>> + <MUNG-AC .TT .INAC .FLS>>>>>> + <ACRESIDUE .AC>> + <COND (.FLS <PUT .AC ,ACRESIDUE <>>)>)> + <COND (<AND .GD <SET ACL <ACLINK .AC>>> + <REPEAT ((OA ())) + #DECL ((OA) LIST) + <AND <EMPTY? .ACL> <RETURN <SET GD <>>>> + <COND (<==? <1 .ACL> .GD> + <COND (<EMPTY? .OA> + <COND (<EMPTY? <REST .ACL>> + <PUT .AC ,ACLINK <>>) + (ELSE <PUT .AC ,ACLINK <REST .ACL>>)>) + (ELSE <PUTREST .OA <REST .ACL>>)> + <RETURN>)> + <SET ACL <REST <SET OA .ACL>>>>) + (ELSE <SET GD <>>)> + <COND (.GD + <PUT .AC ,ACPROT <>> + <SGETREG .AC .GD> + <PUT .AC ,ACPROT .ACPR>)> + .AC> + +<DEFINE VAR-STORE ("OPTIONAL" (FLS T)) + <UNPREFER> + <MAPF <> <FUNCTION (AC) <MUNG-AC .AC <> .FLS>> ,ALLACS>> + +<DEFINE GET:ACS () <MAPF ,LIST + <FUNCTION (X) <CHTYPE <VECTOR !.X> AC>> + ,ALLACS>> + +<DEFINE REGSTO (FLUSH-RES "OPTIONAL" (HANDLE-VARS T)) + <MAPF <> + <FUNCTION (AC) #DECL ((AC) AC) <SAVE:REG .AC .FLUSH-RES .HANDLE-VARS>> + ,ALLACS>> + +<DEFINE SGETREG (AC DAT "AUX" (ACL <ACLINK .AC>)) + #DECL ((AC) AC (ACL) <OR FALSE <LIST [REST DATUM]>>) + <AND <ACPROT .AC> + <MESSAGE INCONSISTENCY "NEEDED AC IS PROTECTED? ">> + <COND + (.ACL + <COND + (<MAPF <> + <FUNCTION (AC1) + #DECL ((AC1) AC) + <COND + (<AND <NOT <ACLINK .AC1>> <NOT <ACPROT .AC1>>> + <MUNG-AC .AC1> + <PUT .AC1 ,ACLINK .ACL> + <PUT .AC1 ,ACRESIDUE <ACRESIDUE .AC>> + <MAPF <> + <FUNCTION (D "AUX" (L <MEMQ .AC .D>)) + #DECL ((D) DATUM (L) <PRIMTYPE LIST>) + <COND (.L <PUT .L 1 .AC1>) + (ELSE + <MESSAGE INCONSISTENCY " AC LOSSAGE ">)>> + .ACL> + <MAPF <> + <FUNCTION (SYM "AUX" L) + #DECL ((SYM) SYMBOL) + <COND (<SET L <MEMQ .AC <CHTYPE <SINACS .SYM> DATUM>>> + <PUT .L 1 .AC1>)>> + <ACRESIDUE .AC1>> + <PUT .AC ,ACRESIDUE <>> + <MOVE:VALUE .AC .AC1> + <MAPLEAVE T>)>> ,ALLACS>) + (ELSE <SAVE:REG .AC T>)>) + (ELSE <MUNG-AC .AC>)> + <COND (<TYPE? .DAT DATUM> <PUT .AC ,ACLINK (.DAT)>) + (ELSE <PUT .AC ,ACLINK .DAT>)> + <PUT .AC ,ACAGE <SETG ATIME <+ ,ATIME 1>>> + .AC> + +<DEFINE DATUM (TY VA) #DECL ((VALUE) DATUM) <CHTYPE (.TY .VA) DATUM>> + +<DEFINE OFFPTR (OFF DAT TYP) <CHTYPE (.OFF .DAT .TYP) OFFPTR>> + +<DEFINE SPEC-OFFPTR (OFF DAT TYP AT) <CHTYPE (.OFF .DAT .TYP .AT) OFFPTR>> + +<DEFINE DATTYP-FLUSH (DAT) + #DECL ((DAT) DATUM) + <COND (<N==? <DATVAL .DAT> <DATTYP .DAT>> + <RET-TMP-AC <DATTYP .DAT> .DAT>)>> + +<DEFINE RET-TMP-AC (ADR "OPTIONAL" D "AUX" (AD .ADR)) + #DECL ((D) DATUM) + <COND (<TYPE? .ADR AC> <RELREG .ADR .D>) + (<TYPE? .ADR TEMP> <RETTMP .ADR>) + (<TYPE? .ADR DATUM> + <REPEAT () + <AND <EMPTY? .ADR> <RETURN>> + <RET-TMP-AC <DATTYP .ADR> .AD> + <RET-TMP-AC <DATVAL .ADR> .AD> + <SET ADR <REST .ADR 2>>>) + (<TYPE? .ADR OFFPTR> <RET-TMP-AC <2 .ADR>>)>> + + +<DEFINE TOACV (DAT "AUX" AC) + #DECL ((DAT) DATUM (AC) AC) + <TEMP-MOD .DAT> + <COND (<NOT <TYPE? <DATVAL .DAT> AC>> + <MOVE:VALUE <DATVAL .DAT> <SET AC <GETREG .DAT>>> + <RET-TMP-AC <DATVAL .DAT>> + <PUT .DAT ,DATVAL .AC>)> + .DAT> + +<DEFINE TOACT (DAT "AUX" AC) + #DECL ((DAT) DATUM (AC) AC) + <TEMP-MOD .DAT> + <COND (<NOT <TYPE? <DATTYP .DAT> AC>> + <MOVE:TYP <DATTYP .DAT> <SET AC <GETREG .DAT>>> + <DATTYP-FLUSH .DAT> + <PUT .DAT ,DATTYP .AC>)> + .DAT> + +<DEFINE AC+1OK? (AC) + <COND (<TYPE? .AC AC> + <REPEAT ((F ,ALLACS) (AC .AC)) + #DECL ((F) <UVECTOR [REST AC]> (AC) AC) + <AND <==? .AC <1 .F>> <RETURN <NOT <ACLINK <2 .F>>>>> + <AND <EMPTY? <REST <SET F <REST .F>>>> <RETURN <>>>>)>> + +<DEFINE GET2REG () + #DECL ((VALUE) <OR AC FALSE>) + <REPEAT ((F ,ALLACS)) + #DECL ((F) <UVECTOR [REST AC]>) + <AND <NOT <ACLINK <1 .F>>> + <NOT <ACLINK <2 .F>>> + <RETURN <1 .F>>> + <AND <EMPTY? <REST <SET F <REST .F>>>> <RETURN <>>>>> + +<DEFINE ANY2ACS ("AUX" T) + #DECL ((VALUE) DATUM) + <RELREG <DATTYP <SET T <DATUM <GETREG ()> <GETREG <>>>>> + .T> + .T> + +<DEFINE GET1REG () + #DECL ((VALUE) <OR AC FALSE>) + <REPEAT ((F ,ALLACS)) + #DECL ((F) <UVECTOR [REST AC]>) + <OR <ACLINK <1 .F>> <RETURN <1 .F>>> + <AND <EMPTY? <SET F <REST .F>>> <RETURN <>>>>> + +<DEFINE FREE-ACS ("OPTIONAL" (SUPER-FREE <>) "AUX" (N 0)) + #DECL ((N VALUE) FIX) + <MAPF <> + <FUNCTION (AC) + #DECL ((AC) AC) + <COND (<AND <NOT <ACPROT .AC>> + <NOT <ACLINK .AC>> + <OR <NOT .SUPER-FREE> + <AND <NOT <ACRESIDUE .AC>> + <NOT <ACPREF .AC>>>>> + <SET N <+ .N 1>>)>> + ,ALLACS> + .N> + +<DEFINE SAVE-STATE ("AUX" (STATV #SAVED-STATE ()) ST) + #DECL ((STATV) SAVED-STATE (ST) <OR FALSE <LIST NODE>>) + <MAPF <> + <FUNCTION (AC) #DECL ((AC) AC) + <SET STATV + <CHTYPE + ((.AC + <LIST !<ACRESIDUE .AC>> + !<MAPF ,LIST + <FUNCTION (X) + (.X + <DATUM !<SINACS .X>> + <AND <TYPE? .X SYMTAB> <STORED .X>> + <AND <TYPE? .X SYMTAB> + <AND <SET ST <PROG-AC .X>> + <NOT <MEMQ .X <LOOP-VARS <1 .ST>>>>>>)> + <CHTYPE <ACRESIDUE .AC> LIST>>) + !.STATV) + SAVED-STATE>>> + ,ALLACS> + .STATV> + +<DEFINE RESTORE-STATE (STATV + "OPTIONAL" (NORET T) + "AUX" (MUNGED-SYMS ()) PA OACR) + #DECL ((STATV) SAVED-STATE (PA) <OR FALSE <LIST NODE>> (OACR) <OR FALSE LIST>) + <MAPF <> + <FUNCTION (ACLST + "AUX" (AC <1 .ACLST>) (SMT <2 .ACLST>) (SYMT <REST .ACLST 2>)) + #DECL ((ACLST) + <LIST AC + <OR FALSE <LIST [REST SYMBOL]>> + [REST <LIST SYMBOL ANY>]> + (SYMT) + <LIST [REST <LIST SYMBOL ANY>]> + (AC) + AC + (SMT) + <OR FALSE <LIST [REST SYMBOL]>>) + <AND .SMT <EMPTY? .SMT> <SET SMT <>>> + <MAPF <> + <FUNCTION (ST) + <OR <MEMQ .ST .MUNGED-SYMS> <SMASH-INACS .ST <> <>>>> + <ACRESIDUE .AC>> + <AND .SMT <SET SMT <LIST !.SMT>>> + <SET OACR <ACRESIDUE .AC>> + <PUT .AC ,ACRESIDUE .SMT> + <MAPF <> + <FUNCTION (SYMB "AUX" (SYMT <1 .SYMB>) (INAC <2 .SYMB>)) + #DECL ((SYMB) <LIST SYMBOL ANY> (SYMT) SYMBOL) + <COND (<TYPE? .SYMT SYMTAB> + <PUT .SYMT + ,STORED + <GET-STORED .SYMT <3 .SYMB> <4 .SYMB>>> + <COND (<SET PA <PROG-AC .SYMT>> + <AND <STORED .SYMT> + <NOT <MEMQ .SYMT <LOOP-VARS <1 .PA>>>> + <NOT .NORET> + <NOT <MEMQ .SYMT .OACR>> + <KILL-LOOP-AC .SYMT> + <FLUSH-RESIDUE .AC .SYMT> + <SET INAC <>>>) + (<4 .SYMB> + <FLUSH-RESIDUE .AC .SYMT> + <SET INAC <>>)>)> + <OR <MEMQ .SYMT .MUNGED-SYMS> + <SET MUNGED-SYMS (.SYMT !.MUNGED-SYMS)>> + <SMASH-INACS .SYMT .INAC>> + .SYMT>> + .STATV>> + +<DEFINE GET-STORED (SYMT PREV-STORED PROG-AC-POSS "AUX" PAC) + #DECL ((PREV-STORED PROG-AC-POSS) <OR FALSE ATOM> (PAC) <OR FALSE <LIST NODE>> + (SYMT) SYMTAB) + <COND (.PROG-AC-POSS + <AND .PREV-STORED + <OR <NOT <SET PAC <PROG-AC .SYMT>>> + <NOT <MEMQ .SYMT <LOOP-VARS <1 .PAC>>>>>>) + (.PREV-STORED)>> + +<DEFINE MERGE-STATE (STATV) + #DECL ((STATV) SAVED-STATE) + <MAPF <> + <FUNCTION (STATV + "AUX" (AC <1 .STATV>) (DATS <REST .STATV 2>) + (STATAC <ACRESIDUE .AC>) (NINACS ()) (NRES ())) + #DECL ((STATV) <LIST AC ANY [REST <LIST SYMBOL ANY>]> + (AC) AC (DATS) <LIST [REST <LIST SYMBOL ANY>]> + (STATAC) <OR FALSE <LIST [REST SYMBOL]>> + (NRES) <LIST [REST SYMBOL]> + (NINACS) <LIST [REST <LIST SYMBOL ANY>]>) + <MAPF <> + <FUNCTION (ACX + "AUX" (SYMT <1 .ACX>) (INAC <2 .ACX>) (OINAC <SINACS .SYMT>) + (TEM <>) (PMERG T)) + #DECL ((ACX) <LIST SYMBOL ANY> + (SYMT) SYMBOL + (INAC OINAC) <PRIMTYPE LIST>) + <COND (<TYPE? .SYMT SYMTAB> + <COND (<STORED .SYMT> + <PUT .SYMT + ,STORED + <GET-STORED .SYMT <3 .ACX> <4 .ACX>>>)> + <COND (<AND <SS-POTENT-SLOT .ACX> <NOT <PROG-AC .SYMT>>> + <SET PMERG <>>)>)> + <COND + (<AND <MEMQ .SYMT .STATAC> + .OINAC + .INAC + .PMERG + <==? <DATVAL .INAC> <DATVAL .OINAC>> + <OR <==? <DATTYP .INAC> <DATTYP .OINAC>> + <AND <TYPE? .SYMT SYMTAB> + <SET TEM + <ISTYPE? <1 <CHTYPE <DECL-SYM .SYMT> + LIST>>>> + <OR <==? <DATTYP .INAC> .TEM> + <==? <DATTYP .OINAC> .TEM>>>>> + <SET NRES (.SYMT !.NRES)> + <SET NINACS + ((.SYMT <DATUM <OR .TEM <DATTYP .INAC>> <DATVAL .INAC>>) + !.NINACS)> + <COND (<AND .TEM + <OR <TYPE? <SET TEM <DATTYP .INAC>> AC> + <TYPE? <SET TEM <DATTYP .OINAC>> AC>>> + <FLUSH-RESIDUE .TEM .SYMT>)>)> + <COND (<AND .OINAC + <OR <==? .AC <DATTYP .OINAC>> + <==? .AC <DATVAL .OINAC>>>> + <SMASH-INACS .SYMT <> <>>)>> + .DATS> + <MAPF <> + <FUNCTION (SYMT) + #DECL ((SYMT) SYMBOL) + <SMASH-INACS .SYMT <> <>>> + <ACRESIDUE .AC>> + <PUT .AC ,ACRESIDUE <COND (<NOT <EMPTY? .NRES>> .NRES)>> + <MAPF <> + <FUNCTION (SYMB "AUX" (SYMT <1 .SYMB>) (ELEIN <2 .SYMB>)) + #DECL ((SYMT) SYMBOL) + <SMASH-INACS .SYMT .ELEIN>> + .NINACS>> + .STATV>> + +<DEFINE SINACS (SYM) + #DECL ((SYM) SYMBOL (VALUE) <OR DATUM FALSE>) + <COND (<TYPE? .SYM TEMP> <TMPAC .SYM>) + (<TYPE? .SYM COMMON> <COMMON-DATUM .SYM>) + (<INACS .SYM>)>> + +<DEFINE SMASH-INACS (ITEM OBJ "OPTIONAL" (SMASH-NUM-SYM T)) + #DECL ((ITEM) SYMBOL) + <COND (<TYPE? .ITEM COMMON> <PUT .ITEM ,COMMON-DATUM .OBJ>) + (<TYPE? .ITEM TEMP> <PUT .ITEM ,TMPAC .OBJ>) + (ELSE <PUT .ITEM ,INACS .OBJ>)>> + +<DEFINE TEMP-MOD (DAT "AUX" TAC VAC TDAC VDAC) + #DECL ((DAT) DATUM) + <COND (<TYPE? <SET TDAC <DATTYP .DAT>> TEMP> + <COND (<SET TAC <TMPAC .TDAC>> + <AND <TYPE? <SET TAC <DATTYP .TAC>> AC> + <PUT .TAC ,ACLINK (.DAT)> + <PUT .DAT ,DATTYP .TAC> + <OR <MEMQ .TDAC <CHTYPE <ACRESIDUE .TAC> LIST>> + <PUT .TAC + ,ACRESIDUE + (.TDAC !<ACRESIDUE .TAC>)>>>)>)> + <COND (<TYPE? <SET VDAC <DATVAL .DAT>> TEMP> + <COND (<SET VAC <TMPAC .VDAC>> + <AND <TYPE? <SET VAC <DATVAL .VAC>> AC> + <PUT .VAC ,ACLINK (.DAT)> + <PUT .DAT ,DATVAL .VAC> + <OR <MEMQ .VDAC <CHTYPE <ACRESIDUE .VAC> LIST>> + <PUT .VAC + ,ACRESIDUE + (.VDAC !<ACRESIDUE .VAC>)>>>)>)>> + +<DEFINE POTENT-L-V? (SYM "AUX" PA) #DECL ((SYM) SYMTAB (PA) <OR FALSE <LIST NODE>>) + <COND (<AND <STORED .SYM> + <SET PA <PROG-AC .SYM>> + <NOT <MEMQ .SYM <LOOP-VARS <1 .PA>>>>> T)>> + + + +<DEFINE SAVE:RES ("AUX" (SYM-LIST ())) #DECL ((SYM-LIST) LIST) + <MAPF <> + <FUNCTION (AC) + #DECL ((AC) AC) + <MAPF <> + <FUNCTION (SYMT "AUX" ONSYMT OP!-PACKAGE) + <COND (<AND <TYPE? .SYMT SYMTAB> + <NOT <MEMQ .SYMT .SYM-LIST>>> + <SET OP!-PACKAGE <POTLV .SYMT>> + <SET ONSYMT <NUM-SYM .SYMT>> + <SMASH-NUM-SYM .SYMT> + <SET SYM-LIST + (.SYMT + <INACS .SYMT> + .ONSYMT + .OP!-PACKAGE + <> + !.SYM-LIST)> + <COND (<NOT <STORED .SYMT>> <STOREV .SYMT <>>) + (<POTENT-L-V? .SYMT> + <COND (<NOT .OP!-PACKAGE> + <PUT .SYMT ,STORED <>> + <STOREV .SYMT <>> + <PUT .SYMT ,POTLV T>)> + <PUT .SYM-LIST 5 <LIST !<NUM-SYM .SYMT>>>)>)>> + <ACRESIDUE .AC>>> + ,ALLACS> + .SYM-LIST> + +<DEFINE SAVE-NUM-SYM (SYM-LIST "AUX" (L (())) (LP .L) TMP) + #DECL ((SYM-LIST) <LIST [REST SYMTAB ANY ANY <OR FALSE ATOM> ANY]>) + <REPEAT () + <COND (<EMPTY? .SYM-LIST> <RETURN <REST .L>>)> + <SET LP + <REST + <PUTREST + .LP + (<LIST !<COND (<AND <TYPE? <SET TMP <NUM-SYM <1 .SYM-LIST>>> LIST> + <NOT <EMPTY? .TMP>>> + <REST .TMP>) + (ELSE ())>>)>>> + <SET SYM-LIST <REST .SYM-LIST 5>>>> + +<DEFINE FIX-NUM-SYM (L1 L2 "AUX" LL TMP) + #DECL ((L1) <LIST [REST LIST]> + (L2) <LIST [REST SYMTAB ANY ANY <OR FALSE ATOM> ANY]>) + <REPEAT () + <COND (<OR <EMPTY? .L1> <EMPTY? .L2>> <RETURN>) + (<AND <TYPE? <SET TMP <NUM-SYM <1 .L2>>> LIST> + <NOT <EMPTY? .TMP>>> + <SET LL <1 .L1>> + <REPEAT ((L <REST .TMP>)) + <COND (<EMPTY? .L> <RETURN>)> + <COND (<NOT <MEMQ <1 .L> .LL>> + <PUTREST .TMP <REST .L>> + <SET L <REST .TMP>>) + (ELSE <SET L <REST <SET TMP .L>>>)>>)> + <SET L1 <REST .L1>> + <SET L2 <REST .L2 5>>>> + +<DEFINE CHECK:VARS (RES UNK "AUX" SLOT TEM SYMT PRGAC) + #DECL ((RES) + <LIST [REST SYMTAB ANY ANY <OR FALSE ATOM> <OR FALSE LIST>]> + (SYMT) + SYMTAB + (SLOT) + LIST + (PRGAC) + <OR FALSE <LIST NODE>> + (TEM) + <OR FALSE LIST>) + <REPEAT ((PTR .RES)) + <COND (<EMPTY? .PTR> <RETURN>)> + <SET SYMT <1 .PTR>> + <COND (<AND <INACS .SYMT> .UNK> + <COND (<AND <1 <SET SLOT <NUM-SYM .SYMT>>> + <NOT <EMPTY? <REST .SLOT>>>> + <PUT .SYMT ,STORED <POTENT-L-V? .SYMT>> + <MAPF <> ,KILL-STORE <REST .SLOT>>)>)> + <COND (<AND <POTLV .SYMT> + <NOT <AND <SET PRGAC <PROG-AC .SYMT>> + <MEMQ .SYMT <LOOP-VARS <1 .PRGAC>>>>> + <SET TEM <5 .PTR>> + <G=? <LENGTH .TEM> 1> + <NUM-SYM .SYMT> + <1 .TEM>> + <MAPF <> ,KILL-STORE <REST .TEM>>)> + <COND (<=? <NUM-SYM .SYMT> '(#FALSE ())> + <PUT .SYMT ,NUM-SYM <3 .PTR>> + <COND (<AND <TYPE? <NUM-SYM .SYMT> LIST> + <NOT <EMPTY? <NUM-SYM .SYMT>>>> + <PUT <NUM-SYM .SYMT> 1 <>>)>) + (ELSE <PUT .SYMT ,NUM-SYM <3 .PTR>>)> + <PUT .SYMT ,POTLV <4 .PTR>> + <SET PTR <REST .PTR 5>>>> + + +<DEFINE STORE-TVAR (NAME DAT1 DAT2 ADDR) + <EMIT <CHTYPE [,STORE:TVAR + .NAME + .ADDR + .DAT1 + .DAT2 + <NOT <TYPE? .DAT1 AC>>] + TOKEN>>> + +<DEFINE KILL-STORE (SS) + <SET SS <CHTYPE .SS ATOM>> + <SET KILL-LIST (.SS !.KILL-LIST)> + <EMIT <CHTYPE [,KILL:STORE .SS] TOKEN>>> + +<DEFINE STORE-VAR (NAME DAT ADDR BOOL) + #DECL ((DAT) DATUM) + <EMIT <CHTYPE [,STORE:VAR + .NAME + .ADDR + <COND (<TYPE? <DATTYP .DAT> AC> <ACSYM <DATTYP .DAT>>) + (<DATTYP .DAT>)> + <COND (<TYPE? <DATVAL .DAT> AC> <ACSYM <DATVAL .DAT>>) + (<DATVAL .DAT>)> + .BOOL] + TOKEN>>> + +<DEFINE FLUSH-RESIDUE (AC SYMT) #DECL ((AC) AC (SYMT) SYMBOL) + <AND <NOT <EMPTY? <ACRESIDUE .AC>>> + <PUT .AC ,ACRESIDUE <RES-FLS <ACRESIDUE .AC> .SYMT>>>> + + +<DEFINE CALL-INTERRUPT ("AUX" (ACDATA ![0 0!]) (ACLIST ()) (ACNUM 1)) + #DECL ((ACNUM) FIX (ACDATA) <UVECTOR FIX FIX> (ACLIST) <SPECIAL LIST>) + <MAPF <> + <FUNCTION (AC "AUX" TYP (ACL <ACLINK .AC>) (ACR <ACRESIDUE .AC>)) + #DECL ((AC) AC (ACR) <OR FALSE LIST> (ACL) <OR FALSE <LIST [REST DATUM]>>) + <COND (.ACL + <COND (<L? .ACNUM 7> + <PUT .ACDATA + 1 + <DEPOSIT-DATA <1 .ACDATA> + .ACNUM + .AC + <DATTYP <1 .ACL>>>>) + (ELSE + <PUT .ACDATA + 2 + <DEPOSIT-DATA <2 .ACDATA> + <- .ACNUM 6> + .AC + <DATTYP <1 .ACL>>>>)>) + (.ACR + <COND (<L? .ACNUM 7> + <PUT .ACDATA + 1 + <DEPOSIT-DATA <1 .ACDATA> + .ACNUM + .AC + <SINACS <1 .ACR>>>>) + (ELSE + <PUT .ACDATA + 2 + <DEPOSIT-DATA + <2 .ACDATA> + <- .ACNUM 6> + .AC + <SINACS <1 .ACR>>>>)>)> + <SET ACNUM <+ .ACNUM 1>>> + ,ALLACS> + <COND (<AND <0? <1 .ACDATA>> <0? <2 .ACDATA>>> <EMIT '<INTGO!-OP!-PACKAGE>>) + (ELSE + <EMIT '<`SKIPGE |INTFLG >> + <MAPR <> + <FUNCTION (PTR "AUX" (TYP <1 .PTR>)) + #DECL ((TYP) ATOM) + <PUT .PTR + 1 + <FORM 0 <FORM TYPE-WORD!-OP!-PACKAGE .TYP>>>> + .ACLIST> + <EMIT <INSTRUCTION <COND (<0? <2 .ACDATA>> `SAVAC* ) (ELSE `LSAVA* )> + <COND (<0? <2 .ACDATA>> + [<FORM (<GETBITS <1 .ACDATA> <BITS 18 18>>) + <GETBITS <1 .ACDATA> <BITS 18>>> + !.ACLIST]) + (ELSE + [<FORM (<GETBITS <1 .ACDATA> <BITS 18 18>>) + <GETBITS <1 .ACDATA> <BITS 18>>> + <FORM (<GETBITS <2 .ACDATA> <BITS 18 18>>) + <GETBITS <2 .ACDATA> <BITS 18>>> + !.ACLIST])>>>)>> + +<DEFINE DEPOSIT-DATA (DATA ACNUM AC DAT "AUX" TYP) + #DECL ((DATA ACNUM) FIX (AC) AC (DAT) DATUM) + <COND (<TYPE? <SET TYP <DATTYP .DAT>> ATOM> + <DEPOSIT-TYPE .DATA .ACNUM .TYP>) + (<TYPE? .TYP AC> + <COND (<N=? .AC .TYP> <DEPOSIT-AC .DATA .ACNUM .TYP>) + (.DATA)>) + (<TYPE? .TYP OFFPTR> <DEPOSIT-TYPE .DATA .ACNUM <3 .TYP>>)>> + +<DEFINE DEPOSIT-TYPE (DATA ACNUM TYP "AUX" (ACL .ACLIST)) + #DECL ((DATA ACNUM) FIX (TYP) ATOM (ACLIST ACL) LIST) + <COND (<==? <TYPEPRIM .TYP> TEMPLATE> + <SET DATA + <CHTYPE <PUTBITS .DATA + <NTH ,DATABITS .ACNUM> + #WORD *000000000077*> + FIX>> + <COND (<EMPTY? .ACL> <SET ACLIST (.TYP)>) + (<PUTREST <REST .ACL <- <LENGTH .ACL> 1>> (.TYP)>)>) + (<==? <TYPEPRIM .TYP> WORD>) + (<SET DATA + <CHTYPE <PUTBITS .DATA + <NTH ,DATABITS .ACNUM> + <+ <CHTYPE <PRIM-CODE <TYPE-C .TYP>> FIX> 8>> + FIX>>)> + .DATA> + +<DEFINE DEPOSIT-AC (DATA ACNUM TYP) + #DECL ((DATA ACNUM) FIX (TYP) AC) + <CHTYPE <PUTBITS .DATA <NTH ,DATABITS .ACNUM> <ACNUM .TYP>> + FIX>> + +<SETG DATABITS + ![<BITS 6 30> + <BITS 6 24> + <BITS 6 18> + <BITS 6 12> + <BITS 6 6> + <BITS 6 0>!]> + +<GDECL (DATABITS) <UVECTOR [6 BITS]>> + +<DEFINE FIND-AC-TYPE (OBJ) <COND (<TYPE? .OBJ OFFPTR> <3 .OBJ>) (.OBJ)>> + +<DEFINE FIND-AC-VAL (OBJ) <COND (<TYPE? .OBJ OFFPTR> <DATVAL <2 .OBJ>>)>> + +<DEFINE FIND-TYPE-OF-ACL (DAT "AUX" D1) + #DECL ((DAT) DATUM) + <COND (<OR <TYPE? <SET D1 <DATTYP .DAT>> OFFPTR> + <TYPE? <SET D1 <DATVAL .DAT>> OFFPTR>> + <3 <CHTYPE .D1 OFFPTR>>) ;"This CHTYPE to get around compiler bug." + (<AND <TYPE? <SET D1 <DATTYP .DAT>> ATOM> <VALID-TYPE? .D1>> + .D1)>> + +<DEFINE HACK-OFFPTR (OFF TMP "AUX" DAT) + #DECL ((OFF) OFFPTR (TMP) TEMP) + <SET DAT <2 .OFF>> + <PUT .DAT ,DATVAL .TMP>> + + + +<DEFINE STOREV (SYM "OPTIONAL" (FLS T) "AUX" (DAT <SINACS .SYM>)) + #DECL ((SYM) <OR TEMP SYMTAB COMMON> (DAT) <OR FALSE DATUM>) + <SMASH-INACS .SYM <> <>> + <COND + (<TYPE? .SYM SYMTAB> + <AND + .DAT + <NOT <STORED .SYM>> + <PROG ((SLOT <NUM-SYM .SYM>) NT ADDR) + <SET NT <GET-NUM-SYM .SYM>> + <COND + (<TYPE? <ADDR-SYM .SYM> TEMPV> + <STORE-TVAR .NT + <COND (<TYPE? <DATTYP .DAT> AC> <ACSYM <DATTYP .DAT>>) + (ELSE <DATTYP .DAT>)> + <ACSYM <CHTYPE <DATVAL .DAT> AC>> + <DATVAL <SET ADDR + <LADDR .SYM <> <ISTYPE-GOOD? <DATTYP .DAT>> <>>>>>) + (<STORE-VAR + .NT + .DAT + <DATVAL <SET ADDR <LADDR .SYM <> <ISTYPE-GOOD? <DATTYP .DAT>> <>>>> + <ISTYPE-GOOD? <DATTYP .ADDR>>>)> + <RET-TMP-AC .ADDR> + <PUT .SYM ,STORED T>>>)> + <COND (.FLS <SMASH-INACS .SYM <>>) + (<SMASH-INACS .SYM .DAT>)>> + + +<DEFINE GET-NUM-SYM (SYM "AUX" (SLOT <NUM-SYM .SYM>) NT) + <COND (<AND <TYPE? .SLOT LIST> <1 .SLOT>> + <PUTREST .SLOT (<SET NT <MAKE:TAG "VAR">> !<REST .SLOT>)>) + (ELSE <SET NT T>)> + .NT> + + +<DEFINE KILL-LOOP-AC (SYMT "AUX" PNOD) + <COND (<AND <TYPE? .SYMT SYMTAB> + <SET PNOD <PROG-AC .SYMT>> + <NOT <MEMQ .SYMT <LOOP-VARS <PROG-SLOT .PNOD>>>>> + <PUT .SYMT ,PROG-AC <>>)>> + + +<DEFINE SMASH-NUM-SYM (SYM) #DECL ((SYM) SYMTAB) <PUT .SYM ,NUM-SYM (T)>> + + +<ENDPACKAGE> \ No newline at end of file diff --git a/<mdl.comp>/carana.mud.337 b/<mdl.comp>/carana.mud.337 new file mode 100644 index 0000000..096e350 --- /dev/null +++ b/<mdl.comp>/carana.mud.337 @@ -0,0 +1,393 @@ +<PACKAGE "CARANA"> + +<ENTRY ARITH-ANA MOD-ANA ABS-ANA ROT-ANA LSH-ANA FIX-ANA FLOAT-ANA ARITHP-ANA + HACK-BOUNDS BIT-TEST-ANA> + +<USE "SYMANA" "CHKDCL" "COMPDEC" "ADVMESS"> + +" This file contains analyzers and code generators for arithmetic + SUBRs and predicates. For convenience many of the SUBRs that are +similar are combined into one analyzer/generator. For more info +on analyzers see SYMANA and on generators see CODGEN. +" + +<SETG ASTATE ![![2 3 5!] ![2 4 5!] ![4 3 5!] ![4 4 5!] ![5 5 5!]!]> + +" Analyze +,-,* and /. Take care of no arg and one arg problems." + +<DEFINE ARITH-ANA (NOD RTYP + "AUX" (NN <NODE-NAME .NOD>) (DEFLT <GET-DF .NN>) (STATE 1) + (K <KIDS .NOD>) (FIXDIV <>) RT) + #DECL ((NOD) <SPECIAL NODE> (K) <LIST [REST NODE]> (STYP) FIX + (STATE) <SPECIAL FIX> (DEFLT) <OR FIX FLOAT>) + <SET RT <COND (<NOT <TYPE-OK? .RTYP FLOAT>> FIX) (ELSE '<OR FIX FLOAT>)>> + <COND + (<EMPTY? .K> + <PUT .NOD ,NODE-TYPE ,QUOTE-CODE> + <PUT .NOD ,RESULT-TYPE <TYPE .DEFLT>> + <PUT .NOD ,NODE-NAME .DEFLT> + <PUT .NOD ,KIDS ()> + <TYPE-OK? <TYPE .DEFLT> .RTYP>) + (<AND <EMPTY? <REST .K>> + <N==? <NODE-TYPE <1 .K>> ,SEGMENT-CODE> + <N==? <NODE-TYPE <1 .K>> ,SEG-CODE> + <COND (<==? <NODE-SUBR .NOD> ,/> + <SET FIXDIV T> + <PUT .NOD + ,KIDS + <SET K + (<NODE1 ,QUOTE-CODE .NOD <TYPE .DEFLT> .DEFLT ()> + !.K)>> + <>) + (ELSE T)>> + <COND (<==? <NODE-SUBR .NOD> ,-> <PUT .NOD ,NODE-TYPE ,ABS-CODE> + ;"Treat like a call + to ABS.") + (ELSE <PUT .NOD ,NODE-TYPE ,ID-CODE>)> + <EANA <1 .K> .RT <NODE-NAME .NOD>>) + (ELSE + <MAPF <> <FUNCTION (N) <ARITH-ELE .N .RT>> .K> + <COND (<L? .STATE 5> + <COND (<AND .FIXDIV <N==? .STATE 2>> + <PUT <PUT <1 .K> ,NODE-NAME 1.0> ,RESULT-TYPE FLOAT>)> + <PUT .NOD + ,NODE-TYPE + <COND (<OR <==? .NN MAX> <==? .NN MIN>> ,MIN-MAX-CODE) + (ELSE ,ARITH-CODE)>> + <MAPF <> + <FUNCTION (NN) + #DECL ((NN) NODE) + <COND (<==? <NODE-TYPE .NN> ,SEGMENT-CODE> + <PUT .NN ,NODE-TYPE ,SEG-CODE>)>> + .K>) + (ELSE + <PUT .NOD ,NODE-TYPE ,ISUBR-CODE> + <PUT .NOD + ,STACKS + <* <MAPF ,+ + <FUNCTION (N "AUX" (CD <NODE-TYPE .N>)) + #DECL ((N) NODE (CD) FIX) + <COND (<OR <==? .CD ,SEGMENT-CODE> + <==? .CD ,SEG-CODE>> + <PUT .NOD ,SEGS T> + <PUT .N ,NODE-TYPE ,SEGMENT-CODE> + <MAPRET>) + (ELSE 1)>> + .K> + 2>>)> + <TYPE-OK? <NTH '[FIX FLOAT FLOAT <OR FIX FLOAT>] <- .STATE 1>> .RTYP>)>> + +<DEFINE GET-DF (S) + #DECL ((S) ATOM) + <NTH '[0 0 1 1 1.7014117E+38 -1.7014117E+38] + <LENGTH <MEMQ .S '![MAX MIN * / - +!]>>>> + +<DEFINE ARITH-ELE (N RT "AUX" TT TEM (FL <>)) + #DECL ((N NOD) NODE (STATE TT) FIX) + <COND (<OR <==? <NODE-TYPE .N> ,SEGMENT-CODE> + <==? <NODE-TYPE .N> ,SEG-CODE>> + <SET FL T> + <SET TEM + <EANA <1 <KIDS .N>> + <FORM STRUCTURED [REST .RT]> + <NODE-NAME .NOD>>> + <PUT .N ,RESULT-TYPE <RESULT-TYPE <1 <KIDS .N>>>> + <SET TEM <OR <AND <ISTYPE? .TEM> <GET-ELE-TYPE .TEM ALL>> ANY>>) + (ELSE + <SET TEM <EANA .N .RT <NODE-NAME .NOD>>> + <AND <==? <NODE-TYPE .N> ,QUOTE-CODE> + <OR <==? .STATE 4> <==? .STATE 3>> + <PUT .N ,NODE-NAME <FLOAT <NODE-NAME .N>>> + <PUT .N ,RESULT-TYPE FLOAT>>)> + <SET TT + <COND (<==? <ISTYPE? .TEM> FIX> 1) + (<==? .TEM FLOAT> 2) + (<NOT <TYPE-OK? .TEM FLOAT>> + <PUT .N + ,RESULT-TYPE + <COND (.FL + <TYPE-MERGE '<STRUCTURED [REST FIX]> + <RESULT-TYPE .N>>) + (ELSE FIX)>> + 1) + (<NOT <TYPE-OK? .TEM FIX>> + <PUT .N + ,RESULT-TYPE + <COND (.FL + <TYPE-MERGE '<STRUCTURED [REST FLOAT]> + <RESULT-TYPE .N>>) + (ELSE FLOAT)>> + 2) + (ELSE 3)>> + <COND (<AND .VERBOSE <==? .TT 3>> + <ADDVMESS <PARENT .N> + ("Arithmetic can't open compile because: " .N + " is of type: " .TEM)>)> + <SET STATE <NTH <NTH ,ASTATE .STATE> .TT>>> + +<DEFINE ABS-ANA (N RT "AUX" (K <KIDS .N>) TEM) + #DECL ((N) NODE (K) <LIST [REST NODE]>) + <COND (<SEGFLUSH .N .RT>) + (ELSE + <ARGCHK <LENGTH .K> 1 ABS> + <PUT .N ,NODE-TYPE ,ABS-CODE> + <SET TEM <EANA <1 .K> '<OR FIX FLOAT> ABS>> + <TYPE-OK? <TYPE-OK? '<OR FLOAT <FIX (0 34359738367)>> .RT> + .TEM>)>> + +<PUT ,ABS ANALYSIS ,ABS-ANA> + +<DEFINE MOD-ANA (N R "AUX" (K <KIDS .N>)) + #DECL ((N) NODE (K) <LIST [REST NODE]>) + <COND (<SEGFLUSH .N .R>) + (ELSE + <ARGCHK <LENGTH .K> 2 MOD> + <EANA <1 .K> FIX MOD> + <EANA <2 .K> FIX MOD> + <PUT .N ,NODE-TYPE ,MOD-CODE>)> + <TYPE-OK? <COND (<==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> + <FORM FIX (0 <- <NODE-NAME <2 .K>> 1>)>) + (ELSE FIX)> .R>> + +<PUT ,MOD ANALYSIS ,MOD-ANA> + +<DEFINE ROT-LSH-ANA (N R COD "AUX" (K <KIDS .N>) (NAM <NODE-NAME .N>)) + <COND (<SEGFLUSH .N .R>) + (ELSE + <ARGCHK <LENGTH .K> 2 .NAM> + <EANA <1 .K> '<PRIMTYPE WORD> .NAM> + <EANA <2 .K> FIX .NAM> + <PUT .N ,NODE-TYPE .COD>)> + <TYPE-OK? WORD .R>> + +<DEFINE ROT-ANA (N R) <ROT-LSH-ANA .N .R ,ROT-CODE>> + +<DEFINE LSH-ANA (N R) <ROT-LSH-ANA .N .R ,LSH-CODE>> + +<PUT ,ROT ANALYSIS ,ROT-ANA> + +<PUT ,LSH ANALYSIS ,LSH-ANA> + +<DEFINE FLOAT-ANA (N R) + #DECL ((N) NODE) + <FL-FI-ANA .N .R FLOAT FIX ,FLOAT-CODE>> + +<PUT ,FLOAT ANALYSIS ,FLOAT-ANA> + +<DEFINE FIX-ANA (N R) #DECL ((N) NODE) <FL-FI-ANA .N .R FIX FLOAT ,FIX-CODE>> + +<PUT ,FIX ANALYSIS ,FIX-ANA> + +<DEFINE FL-FI-ANA (N RT OT IT COD "AUX" (K <KIDS .N>) TY NUM) + #DECL ((N NUM) NODE (OT IT) ATOM (K) <LIST [REST NODE]> (COD) FIX) + <COND (<SEGFLUSH .N .RT>) + (ELSE + <ARGCHK <LENGTH .K> 1 .OT> + <SET TY <EANA <SET NUM <1 .K>> '<OR FIX FLOAT> .OT>> + <COND (<==? <NODE-TYPE .NUM> ,QUOTE-CODE> + <PUT .N ,NODE-TYPE ,QUOTE-CODE> + <PUT .N ,NODE-NAME <APPLY ,.OT <NODE-NAME .NUM>>>) + (ELSE + <PUT .N ,NODE-TYPE .COD>)>)> + <TYPE-OK? .OT .RT>> + +<DEFINE ARITHP-ANA (NOD RTYP + "AUX" (WHON <AND <==? .PRED <PARENT .NOD>> .NOD>) (WHO ()) + (GLN .NOD) (GLE ()) (NN <NODE-NAME .NOD>) + (N + <COND (<OR <==? .NN 0?> + <==? .NN 1?> + <==? <NODE-TYPE .NOD> ,0-TST-CODE>> + 1) + (ELSE 2)>) (K <KIDS .NOD>) TEM (STATE 1)) + #DECL ((WHO) <SPECIAL LIST> (WHON GLN) <SPECIAL ANY> + (NOD NOD2) <SPECIAL NODE> (TEM) NODE (K) <LIST [REST NODE]> + (STATE) <SPECIAL FIX> (COD N) FIX (GLE) <SPECIAL LIST>) + <COND (<SEGFLUSH .NOD .RTYP>) + (ELSE + <ARGCHK <LENGTH .K> .N <NODE-NAME .NOD>> + <MAPF <> <FUNCTION (N) <ARITH-ELE .N '<OR FIX FLOAT>>> .K> + <COND (<AND <==? .N 2> + <OR <AND <==? <NODE-TYPE <1 .K>> ,QUOTE-CODE> + <0? <NODE-NAME <1 .K>>> + <SET TEM <2 .K>> + <PUT .NOD + ,NODE-NAME + <FLOPP <NODE-NAME .NOD>>>> + <AND <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> + <0? <NODE-NAME <2 .K>>> + <SET TEM <1 .K>>>>> + <PUT .NOD ,NODE-TYPE ,0-TST-CODE> + <PUT .NOD ,KIDS (.TEM)>) + (<==? <NODE-TYPE .NOD> ,0-TST-CODE>) + (<OR <==? <NODE-NAME .NOD> 0?> <==? <NODE-NAME .NOD> N0?>> + <PUT .NOD ,NODE-TYPE ,0-TST-CODE>) + (<L? .STATE 5> + <PUT .NOD + ,NODE-TYPE + <COND (<==? .N 2> ,TEST-CODE) + (<==? <NODE-NAME .NOD> 0?> ,0-TST-CODE) + (ELSE ,1?-CODE)>>) + (<==? <NODE-SUBR .NOD> ,1?> <PUT .NOD ,NODE-TYPE ,1?-CODE>) + (<OR <==? <NODE-SUBR .NOD> ,==?> + <==? <NODE-SUBR .NOD> ,N==?>> + <PUT .NOD ,NODE-TYPE ,EQ-CODE>) + (ELSE <PUT .NOD ,NODE-TYPE ,ISUBR-CODE>)> + <COND (<==? .STATE 2> <HACK-BOUNDS .WHO .GLE .NOD .K>)> + <CHECK-FOR-BIT-HACK .NOD>)> + <TYPE-OK? '<OR FALSE ATOM> .RTYP>> + +<DEFINE CHECK-FOR-BIT-HACK (N "AUX" (NN <1 <KIDS .N>>) DATA CONST K) + #DECL ((NN DATA N) NODE (CONST) <PRIMTYPE WORD>) + <COND (<AND <==? <NODE-TYPE .N> ,0-TST-CODE> + <==? <NODE-TYPE .NN> ,CHTYPE-CODE> + <SET NN <1 <KIDS .NN>>> + <OR <AND <==? <NODE-TYPE .NN> ,GETBITS-CODE> + <SET K <KIDS .NN>> + <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> + <SET DATA <1 .K>> + <SET CONST <PUTBITS 0 <NODE-NAME <2 .K>> -1>>> + <AND <==? <NODE-TYPE .NN> ,BITL-CODE> + <==? <NODE-SUBR .NN> ,ANDB> + <==? <LENGTH <SET K <KIDS .NN>>> 2> + <OR <AND <==? <NODE-TYPE <1 .K>> ,QUOTE-CODE> + <SET CONST <NODE-NAME <1 .K>>> + <SET DATA <2 .K>>> + <AND <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> + <SET CONST <NODE-NAME <2 .K>>> + <SET DATA <1 .K>>> + <SET CONST 0>>>>> + <PUT .N ,NODE-TYPE ,BIT-TEST-CODE> + <PUT .N ,NODE-SUBR .CONST> + <PUT .N ,KIDS <COND (<ASSIGNED? DATA> (.DATA)) (ELSE .K)>> + <COND (<ASSIGNED? DATA> <PUT .DATA ,PARENT .N>) + (ELSE + <PUT <1 .K> ,PARENT .N> + <PUT <2 .K> ,PARENT .N>)>)>> + +<DEFINE BIT-TEST-ANA (N R "AUX" (K <KIDS .N>)) + #DECL ((N) NODE (K) <LIST [REST NODE]>) + <EANA <1 .K> '<PRIMTYPE WORD> BIT-TEST> + <COND (<NOT <EMPTY? <SET K <REST .K>>>> + <EANA <1 .K> '<PRIMTYPE WORD> BIT-TEST>)> + <TYPE-OK? <RESULT-TYPE .N> .R>> + +<DEFINE HACK-BOUNDS (WHO GLE NOD K "AUX" NUM YES NO NOD2 (HACKT <>)) + #DECL ((WHO GLE) LIST (NOD NOD2) NODE (K) <LIST [REST NODE]>) + <SET NUM + <COND (<OR <==? <NODE-NAME .NOD> 0?> <==? <NODE-TYPE .NOD> ,0-TST-CODE>> + <SET NOD2 <1 .K>> + 0) + (<==? <NODE-NAME .NOD> 1?> <SET NOD2 <1 .K>> 1) + (<==? <NODE-TYPE <1 .K>> ,QUOTE-CODE> + <SET NOD2 <2 .K>> + <NODE-NAME <1 .K>>) + (<==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> + <SET NOD2 <1 .K>> + <PUT .NOD ,NODE-NAME <FLOPP <NODE-NAME .NOD>>> + <PUT .NOD ,KIDS (<2 .K> <1 .K>)> + <NODE-NAME <2 .K>>)>> + <COND (.NUM + <SET YES <FORM FIX <GTV .NOD .NUM>>> + <SET NO <FORM FIX <NGTV .NOD .NUM>>> + <MAPF <> + <FUNCTION (L "AUX" (SYM <2 .L>)) + #DECL ((L) <LIST ANY SYMTAB> (SYM) SYMTAB) + <SET TRUTH + <ADD-TYPE-LIST .SYM .YES .TRUTH <> <REST .L 2>>> + <SET UNTRUTH + <ADD-TYPE-LIST .SYM .NO .UNTRUTH <> <REST .L 2>>>> + .WHO>)> + <COND (<AND .NUM <G=? .NUM 0>> + <COND (<OR <AND <NOT <0? .NUM>> + <OR <==? <NODE-NAME .NOD> G=?> + <==? <NODE-NAME .NOD> L?>>> + <AND <0? .NUM> + <OR <AND <==? <NODE-NAME .NOD> G?> <SET HACKT T>> + <==? <NODE-NAME .NOD> L=?>>>> + <SET NUM <+ .NUM 1>>)> + <OR .HACKT <SET HACKT <MEMQ <NODE-NAME .NOD> '![1? L? L=? ==?!]>>> + <COND (<==? <NODE-NAME .NOD> 0?> <SET NUM 1>)> + <COND (<L=? .NUM 0> STRUCTURED) + (ELSE <SET NUM <CHTYPE (STRUCTURED !<ANY-PAT .NUM>) FORM>>)> + <MAPF <> + <FUNCTION (L "AUX" (SYM <2 .L>) (FLG <1 .L>)) + #DECL ((L) <LIST ANY SYMTAB> (SYM) SYMTAB) + <COND (.HACKT + <SET TRUTH + <ADD-TYPE-LIST .SYM + .NUM + .TRUTH + <> + <REST .L 2>>>) + (ELSE + <SET UNTRUTH + <ADD-TYPE-LIST .SYM + .NUM + .UNTRUTH + <> + <REST .L 2>>>)> + T> + .GLE>)>> + +<SETG APSUBTAB [1? 0? L? L=? G? G=? ==? N==?]> + +<SETG DCLTAB + [(1 1) + (0 0) + ('<+ .VAL 1> ,PLUSINF) + ('.VAL ,PLUSINF) + (,MINUSINF '<- .VAL 1>) + (,MINUSINF '.VAL) + ('.VAL '.VAL) + (,MINUSINF '<- .VAL 1> '<+ .VAL 1> ,PLUSINF)]> + +<SETG NDCLTAB + [(,MINUSINF 0 2 ,PLUSINF) + (,MINUSINF -1 1 ,PLUSINF) + (,MINUSINF '.VAL) + (,MINUSINF '<- .VAL 1>) + ('.VAL ,PLUSINF) + ('<+ .VAL 1> ,PLUSINF) + (,MINUSINF '<- .VAL 1> '<+ .VAL 1> ,PLUSINF) + ('.VAL '.VAL)]> + +<DEFINE NGTV (NOD VAL) + #DECL ((VAL) <SPECIAL ANY> (NOD) NODE) + <EVAL <NTH ,NDCLTAB + <- 9 <LENGTH <MEMQ <NODE-NAME .NOD> ,APSUBTAB>>>>>> + +<DEFINE GTV (NOD VAL) + #DECL ((NOD) NODE (VAL) <SPECIAL ANY>) + <EVAL <NTH ,DCLTAB + <- 9 <LENGTH <MEMQ <NODE-NAME .NOD> ,APSUBTAB>>>>>> + +<DEFINE FLOPP (SUBR) + #DECL ((SUBR VALUE) ATOM) + <1 <REST <MEMQ .SUBR '![G? L? G? G=? L=? G=? ==? ==? N==? N==?!]>>>> + +<PUT ,+ ANALYSIS ,ARITH-ANA> + +<PUT ,- ANALYSIS ,ARITH-ANA> + +<PUT ,* ANALYSIS ,ARITH-ANA> + +<PUT ,/ ANALYSIS ,ARITH-ANA> + +<PUT ,MAX ANALYSIS ,ARITH-ANA> + +<PUT ,MIN ANALYSIS ,ARITH-ANA> + +<PUT ,0? ANALYSIS ,ARITHP-ANA> + +<PUT ,1? ANALYSIS ,ARITHP-ANA> + +<PUT ,L? ANALYSIS ,ARITHP-ANA> + +<PUT ,G? ANALYSIS ,ARITHP-ANA> + +<PUT ,G=? ANALYSIS ,ARITHP-ANA> + +<PUT ,L=? ANALYSIS ,ARITHP-ANA> + +<ENDPACKAGE> \ No newline at end of file diff --git a/<mdl.comp>/cargen.mud.31 b/<mdl.comp>/cargen.mud.31 new file mode 100644 index 0000000..97bfcf4 --- /dev/null +++ b/<mdl.comp>/cargen.mud.31 @@ -0,0 +1,1332 @@ +<PACKAGE "CARGEN"> + +<ENTRY ARITH-GEN ABS-GEN FLOAT-GEN FIX-GEN MOD-GEN ROT-GEN LSH-GEN 1?-GEN + GEN-FLOAT GENFLOAT MIN-MAX PRED:BRANCH:GEN 0-TEST FLIP TEST-GEN> + +<USE "CACS" "CODGEN" "CHKDCL" "COMCOD" "COMPDEC" "CONFOR" "STRGEN"> + + +" This file contains analyzers and code generators for arithmetic + SUBRs and predicates. For convenience many of the SUBRs that are +similar are combined into one analyzer/generator. For more info +on analyzers see SYMANA and on generators see CODGEN. +" + +"A type TRANS specifies to an inferior node what arithmetic transforms are +prohibited, permitted or desired. A transform consists of 3 main elements: +a NODE, an input, an output. The input and output are UVECTORS of 7 fixes: + +1) negative ok 0-no, 1-ok, 2-pref +2) + or - const ok 0-no, 1-ok, 2-pref +3) const for + or - +4) * or / const ok 0-no, 1-* ok, 2-* pref, 3-/ ok, 4-/ pref +5) hw ok 0-no, 1-ok, 2-pref +6) hw swapped also 0-no, 1-ok, 2-pref +" + +<SETG SNODES ![,QUOTE-CODE ,LVAL-CODE ,GVAL-CODE!]> + +<SETG SNODES1 <REST ,SNODES>> + +<DEFINE COMMUTE (K OP L "AUX" TT FK KK TYP NN N CD CD1) + #DECL ((K KK FK) <LIST [REST NODE]> (N NN) NODE (CD1 CD) FIX (L) LIST) + <PROG ((REDO <>)) + <COND (<EMPTY? <SET KK <REST <SET FK .K>>>> <RETURN>)> + <SET TYP <ISTYPE? <RESULT-TYPE <1 .KK>>>> + <REPEAT () + <AND <EMPTY? .KK> <RETURN>> + <COND + (<==? .TYP + <SET TYP <ISTYPE? <RESULT-TYPE <SET NN <1 .KK>>>>>> + <SET CD1 <NODE-TYPE .NN>> + <COND + (<AND <==? <SET CD <NODE-TYPE <SET N <1 .FK>>>> ,QUOTE-CODE> + <==? .CD1 ,QUOTE-CODE>> + <PUT .N + ,NODE-NAME + <APPLY ,.OP <NODE-NAME .N> <NODE-NAME .NN>>> + <PUTREST .FK <SET KK <REST .KK>>> + <SET REDO T> + <AGAIN>) + (<==? .CD ,QUOTE-CODE> + <PUT .KK 1 .N> + <PUT .FK 1 .NN> + <SET REDO T>) + (<AND <NOT <MEMQ .CD1 ,SNODES>> + <MEMQ .CD ,SNODES> + <NOT <SIDE-EFFECTS .NN>>> + <COND (<AND <==? .CD ,LVAL-CODE> + <COND (<==? <LENGTH <SET TT <TYPE-INFO .N>>> 2> <2 .TT>) + (ELSE T)> + <SET TT <NODE-NAME .N>> + <NOT <MAPF <> + <FUNCTION (LL) + <AND <==? <1 .LL> .TT> <MAPLEAVE>>> + .L>>> + <SET L ((<NODE-NAME .N> <>) !.L)>)> + <PUT .KK 1 .N> + <PUT .FK 1 .NN> + <SET REDO T>)>)> + <SET KK <REST <SET FK .KK>>>> + <COND (.REDO <SET REDO <>> <AGAIN>)> + .K> + .L> + +" Generate code for +,-,* and /. Note sexy AOS and SOS generator. Also +note bug causing result to be left in AC even if not wanted." + +<DEFINE ARITH-GEN AG (NOD WHERE + "AUX" REG (K <KIDS .NOD>) REG1 T1 + (ATYP + <LENGTH <MEMQ <NODE-NAME .NOD> '![/ * - +!]>>) TT + (MODE 1) (TEM <1 .K>) SEGF SHFT TRIN + (COM <OR <==? .ATYP 1> <==? .ATYP 3>>) INA + (DONE <>) (NEGF <>) (ONO .NO-KILL) + (NO-KILL .NO-KILL)) + #DECL ((NOD TEM TT) NODE (K) <LIST [REST NODE]> (ATYP MODE) FIX + (REG1 REG) DATUM (WHERE COM) ANY (NO-KILL) <SPECIAL LIST>) + <SET REG <GOODACS .NOD .WHERE>> + <SET NO-KILL + <COMMUTE <REST .K <NTH '![0 1 0 1!] .ATYP>> + <NTH '![+ + * *!] .ATYP> + .NO-KILL>> + <COND + (<AND <==? <RESULT-TYPE .NOD> FIX> ;"All this hair to try for AOS or SOS." + <OR <==? .ATYP 1> <==? .ATYP 2>> ;"+ or - only." + <==? <LENGTH .K> 2> + <==? <NODE-TYPE <SET TEM <1 .K>>> ,LVAL-CODE> + <==? <NODE-TYPE <SET TT <2 .K>>> ,QUOTE-CODE> + <==? <NODE-NAME .TT> 1> + <NOT <EMPTY? <SET T1 <PARENT .NOD>>>> + <==? <NODE-TYPE <SET TT .T1>> ,SET-CODE> + <==? <NODE-NAME .TEM> <NODE-NAME .TT>> + <STORED <NODE-NAME .TEM>> + <OR <NOT <SET INA <INACS <NODE-NAME .TEM>>>> + <NOT <PROG-AC <NODE-NAME .TEM>>>>> + <COND (<SET INA <INACS <NODE-NAME .TEM>>> + <AND <TYPE? <DATTYP .INA> AC> <MUNG-AC <DATTYP .INA> .INA>> + <AND <TYPE? <DATVAL .INA> AC> <MUNG-AC <DATVAL .INA> .INA>>)> + <PUT <NODE-NAME .TEM> ,INACS <>> + <EMIT <INSTRUCTION <NTH '![`AOS `SOS !] .ATYP> + !<COND (<TYPE? <DATVAL .REG> AC> + <SGETREG <DATVAL .REG> .REG> + (<ACSYM <DATVAL .REG>>)) + (<==? <DATVAL .REG> ANY-AC> + <PUT .REG ,DATVAL <GETREG .REG>> + (<ACSYM <DATVAL .REG>>)) + (ELSE + <SET REG <DATUM <1 .WHERE> <2 .WHERE>>> + ())> + !<ADDR:VALUE <LADDR <NODE-NAME .TEM> + <> + <1 <TYPE-INFO .TT>>>>>> + <PUT <NODE-NAME .TEM> ,INACS .REG> + <SET STORE-SET T> + <RETURN <COND (<G? <LENGTH .WHERE> 2> + <MOVE:ARG .REG <CHTYPE <REST .WHERE 2> DATUM>>) + (ELSE .REG)> + .AG>) + (<AND <==? <RESULT-TYPE .NOD> FIX> + <==? <LENGTH .K> 2> + <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE>> + <COND + (<AND <ASSIGNED? TRANSFORM> + <==? <PARENT .NOD> <1 .TRANSFORM>> + <SET TRIN <2 .TRANSFORM>> + <COND + (<AND <L=? .ATYP 2> + <OR <1? <2 .TRIN>> + <AND <==? <2 .TRIN> 2> + <==? <3 .TRIN> + <COND (<1? .ATYP> <- <NODE-NAME <2 .K>>>) + (ELSE <NODE-NAME <2 .K>>)>>>>> + <PUT <PUT <3 .TRANSFORM> 2 1> + 3 + <COND (<1? .ATYP> <- <NODE-NAME <2 .K>>>) + (ELSE <NODE-NAME <2 .K>>)>>) + (<AND <==? .ATYP 3> + <OR <1? <4 .TRIN>> + <AND <==? <4 .TRIN> 4> + <==? <5 .TRIN> <NODE-NAME <2 .K>>>>>> + <PUT <PUT <3 .TRANSFORM> 4 4> 5 <NODE-NAME <2 .K>>>) + (ELSE <>)>> + <RETURN <GEN <1 .K> .WHERE> .AG>) + (<N==? <NODE-TYPE <SET TEM <1 .K>>> ,SEG-CODE> + <PROG ((TRANSFORM + <MAKE-TRANS .NOD + 0 + <COND (<L? .ATYP 3> 2) (ELSE 0)> + <COND (<1? .ATYP> <NODE-NAME <2 .K>>) + (<==? .ATYP 2> <- <NODE-NAME <2 .K>>>) + (ELSE 0)> + <COND (<G? .ATYP 2> + <COND (<==? .ATYP 3> 2) (ELSE 4)>) + (ELSE 0)> + <COND (<G? .ATYP 2> <NODE-NAME <2 .K>>) (ELSE 1)> + 0 + 0>)) + #DECL ((TRANSFORM) <SPECIAL TRANS>) + <SET REG + <GEN .TEM + <COND (<AND <TYPE? <DATVAL .REG> AC> + <ACLINK <DATVAL .REG>>> + <DATUM <DATTYP .REG> ANY-AC>) + (ELSE .REG)>>> + <SET DONE T> + <MAPF <> + <FUNCTION (NN) + #DECL ((NN) FIX) + <COND (<NOT <0? .NN>> + <RETURN <MOVE:ARG .REG .WHERE> .AG>)>> + <3 .TRANSFORM>>>)>)> + <COND (.DONE) + (<==? <NODE-TYPE <SET TEM <1 .K>>> ,SEG-CODE> + <SET REG1 + <GEN <SET TEM <1 <KIDS .TEM>>> + <DATUM <STRUCTYP <RESULT-TYPE .TEM>> ANY-AC>>> + <SET MODE + <SEGINS .ATYP T .TEM .REG .REG1 1 <GET-DF <NODE-NAME .NOD>>>>) + (ELSE + <SET REG + <GEN .TEM + <COND (<AND <TYPE? <DATVAL .REG> AC> + <ACLINK <DATVAL .REG>>> + <DATUM <DATTYP .REG> ANY-AC>) + (ELSE .REG)>>> + <AND <==? <RESULT-TYPE .TEM> FLOAT> <SET MODE 2>>)> + <AND <TYPE? <DATTYP .REG> ATOM> + <PUT .REG ,DATTYP <NTH '![FIX FLOAT!] .MODE>>> + <MAPR <> + <FUNCTION (N + "AUX" NN TEM TRANSFORM + (NXT + <COND + (<==? <NODE-TYPE <SET NN <1 .N>>> ,SEG-CODE> + <SET SEGF T> + <GEN <SET NN <1 <KIDS .NN>>> + <DATUM <STRUCTYP <RESULT-TYPE .NN>> ANY-AC>>) + (ELSE + <SET SEGF <>> + <SET TRANSFORM + <MAKE-TRANS .NOD + <COND (<AND .NEGF <G? .ATYP 2>> 2) + (ELSE 1)> + 0 + 0 + 0 + 0 + 0 + 0>> + <GEN .NN DONT-CARE>)>) (COM .COM)) + #DECL ((N) <LIST NODE> (NXT REG) DATUM (MODE) FIX (NN) NODE + (TRANSFORM) <SPECIAL TRANS>) + <COND + (.SEGF + <SET MODE <SEGINS .ATYP <> .NN .REG .NXT .MODE 0>> + <RET-TMP-AC .NXT>) + (ELSE + <AND <ASSIGNED? TRANSFORM> + <NOT <0? <1 <3 .TRANSFORM>>>> + <PROG () + <SET COM <NOT .COM>> + <SET NEGF <NOT .NEGF>>>> + <COND (<==? .MODE 2> + <COND (<==? <ISTYPE? <RESULT-TYPE .NN>> FIX> + <TOACV .NXT> + <DATTYP-FLUSH <SET NXT <GEN-FLOAT .NXT>>> + <PUT .NXT ,DATTYP FLOAT>)>) + (<==? <ISTYPE? <RESULT-TYPE .NN>> FLOAT> + <TOACV .REG> + <DATTYP-FLUSH <SET REG <GEN-FLOAT .REG>>> + <PUT .REG ,DATTYP FLOAT> + <SET MODE 2>)> + <COND (<AND .COM + <NOT <TYPE? <DATVAL .REG> AC>> + <TYPE? <DATVAL .NXT> AC>> + <SET TEM .NXT> + <SET NXT .REG> + <SET REG .TEM>)> + <SET NXT <SAME-AC-FIX .REG .NXT>> + <COND (<AND <==? .ATYP 3> + <==? .MODE 1> + <==? <NODE-TYPE .NN> ,QUOTE-CODE> + <SET SHFT <POPWR2 <NODE-NAME .NN>>>> + <SHIFT-INS .REG .SHFT .ATYP>) + (ELSE + <SET REG + <ARITH-INS <COND (<AND .NEGF <L? .ATYP 3>> + <SET NEGF <>> + <- 3 .ATYP>) + (ELSE .ATYP)> + .REG + .NXT + <AND <EMPTY? <REST .N>> + <TYPE? .WHERE DATUM> + <==? <DATVAL .WHERE> <DATVAL .NXT>>> + .MODE>>)>)>> + <REST .K>> + <COND (.NEGF + <COND (<AND <ASSIGNED? TRANSFORM> + <==? <1 .TRANSFORM> <PARENT .NOD>> + <NOT <0? <1 <2 .TRANSFORM>>>>> + <PUT <3 .TRANSFORM> 1 1>) + (ELSE <EMIT <INSTRUCTION `MOVNS !<ADDR:VALUE .REG>>>)>)> + <DELAY-KILL .NO-KILL .ONO> + <MOVE:ARG .REG .WHERE>> + +<DEFINE SAME-AC-FIX (D1 D2 "AUX" (ACQ <DATVAL .D1>)) + #DECL ((D1 D2) DATUM) + <COND + (<AND <TYPE? .ACQ AC> <==? .ACQ <DATVAL .D2>>> + <COND + (<ACRESIDUE .ACQ> + <MAPF <> + <FUNCTION (SYM) + #DECL ((SYM) SYMTAB) + <COND (<STORED .SYM> + <PUT .SYM ,INACS <>> + <RET-TMP-AC .D2> + <FLUSH-RESIDUE .ACQ .SYM> + <SET D2 <LADDR .SYM <> <ISTYPE-GOOD? <DATTYP .D2>>>> + <MAPLEAVE>)>> + <ACRESIDUE .ACQ>>) + (ELSE <RET-TMP-AC .D2>)>)> + .D2> + +<DEFINE SHIFT-INS (REG SHFT ATYP) + #DECL ((REG) DATUM (SHFT ATYP) FIX) + <TOACV .REG> + <MUNG-AC <DATVAL .REG> .REG> + <EMIT <INSTRUCTION `ASH + <ACSYM <DATVAL .REG>> + <COND (<==? .ATYP 3> .SHFT) (ELSE <- .SHFT>)>>>> + +<DEFINE SEGINS (ATYP FD N REG REG2 MD DEFLT + "AUX" SAC SL TYP (STYP <RESULT-TYPE .N>) (TG <MAKE:TAG>) + (LOOP <MAKE:TAG>) RAC) + #DECL ((N) NODE (ATYP SL MD) FIX (REG REG2) DATUM (RAC SAC) AC) + <SET TYP + <COND (<==? <GET-ELE-TYPE .STYP ALL> FIX> 1) (ELSE 2)>> + <SET STYP <STRUCTYP .STYP>> + <SET SL <MINL <RESULT-TYPE .N>>> + <COND (.FD + <COND (<TYPE? <DATVAL .REG> AC> + <SGETREG <SET RAC <DATVAL .REG>> .REG>) + (ELSE <SET RAC <GETREG .REG>> <PUT .REG ,DATVAL .RAC>)> + <PUT .RAC ,ACPROT T> + <MUNG-AC .RAC .REG> + <SET SAC <DATVAL <TOACV .REG2>>> + <MUNG-AC .SAC .REG2> + <PUT .RAC ,ACPROT <>> + <SET MD .TYP> + <AND <==? .TYP 2> <==? .DEFLT 1> <SET DEFLT 1.0>> + <IMCHK '(`MOVE `MOVEI `MOVNI ) + <ACSYM .RAC> + <REFERENCE:ADR .DEFLT>> + <COND (<L? .SL 1> + <EMPTY-JUMP .STYP .SAC .TG>)> + <COND (<OR <==? .ATYP 2> <==? .ATYP 4>> + <GETEL .RAC .SAC .STYP> + <ADVANCE .STYP .SAC> + <SET SL <- .SL 1>>) + (ELSE <SET SL 1>)>) + (ELSE + <TOACV .REG> + <AND <1? .MD> + <==? .TYP 2> + <DATTYP-FLUSH <SET REG <GEN-FLOAT .REG>>> + <PUT .REG ,DATTYP FLOAT>> + <SET RAC <DATVAL .REG>> + <PUT .RAC ,ACPROT T> + <MUNG-AC .RAC .REG> + <SET SAC <DATVAL <TOACV .REG2>>> + <MUNG-AC .SAC .REG2> + <PUT .RAC ,ACPROT <>>)> + <COND (<L? .SL 1> <EMPTY-JUMP .STYP .SAC .TG>)> + <LABEL:TAG .LOOP> + <EMITSEG .RAC .SAC .STYP .ATYP .TYP .MD> + <ADVANCE-AND-CHECK .STYP .SAC .LOOP> + <LABEL:TAG .TG> + <RET-TMP-AC .REG2> + .MD> + +<DEFINE ADVANCE (STYP SAC "AUX" AMT) + #DECL ((STYP) ATOM (SAC) AC (AMT) FIX) + <SET AMT <COND (<==? .STYP UVECTOR> 1) (ELSE 2)>> + <COND (<==? .STYP LIST> + <EMIT <INSTRUCTION `HRRZ <ACSYM .SAC> (<ADDRSYM .SAC>)>>) + (ELSE + <EMIT <INSTRUCTION `ADD <ACSYM .SAC> [<FORM .AMT (.AMT)>]>>)>> + +<DEFINE ADVANCE-AND-CHECK (STYP SAC TG) + #DECL ((SAC) AC (STYP) ATOM) + <COND (<==? .STYP UVECTOR> + <EMIT <INSTRUCTION `AOBJN <ACSYM .SAC> .TG>>) + (<==? .STYP LIST> + <EMIT <INSTRUCTION `HRRZ <ACSYM .SAC> (<ADDRSYM .SAC>)>> + <EMIT <INSTRUCTION `JUMPN <ACSYM .SAC> .TG>>) + (ELSE + <EMIT <INSTRUCTION `ADD <ACSYM .SAC> '[<2 (2)>]>> + <EMIT <INSTRUCTION `JUMPL <ACSYM .SAC> .TG>>)>> + +<DEFINE EMPTY-JUMP (STYP SAC TG) + #DECL ((SAC) AC (STYP TG) ATOM) + <COND (<==? .STYP LIST> + <EMIT <INSTRUCTION `JUMPE <ACSYM .SAC> .TG>>) + (ELSE <EMIT <INSTRUCTION `JUMPGE <ACSYM .SAC> .TG>>)>> + +<DEFINE EMITSEG (RAC SAC STYP ATYP TYP MD "AUX" DAT) + #DECL ((SAC RAC) AC (TYP MD ATYP) FIX (DAT) DATUM) + <COND (<AND <==? .MD 2> <==? .TYP 1>> + <SET DAT <DATUM FIX ANY-AC>> + <PUT .DAT ,DATVAL <GETREG .DAT>> + <GETEL <DATVAL .DAT> .SAC .STYP> + <DATTYP-FLUSH <SET DAT <GEN-FLOAT .DAT>>> + <PUT .DAT ,DATTYP FLOAT> + <GENINS .ATYP .MD .RAC 0 <ADDRSYM <DATVAL .DAT>>> + <RET-TMP-AC .DAT>) + (ELSE + <GENINS .ATYP + .MD + .RAC + <COND (<==? .STYP UVECTOR> 0) (ELSE 1)> + (<ADDRSYM .SAC>)>)>> + +<DEFINE GENINS (ATYP MD RAC OFFS ADD "AUX" INS) + #DECL ((MD ATYP OFFS) FIX (RAC) AC) + <COND (<G? .ATYP 4> + <EMIT <INSTRUCTION <NTH '![`CAMG `CAML!] <- .ATYP 4>> + <ACSYM .RAC> + .OFFS + .ADD>> + <EMIT <INSTRUCTION `MOVE <ACSYM .RAC> .OFFS .ADD>>) + (ELSE + <SET INS <NTH <NTH <2 ,INS1> .MD> .ATYP>> + <AND <TYPE? .INS LIST> <SET INS <1 .INS>>> + <EMIT <INSTRUCTION .INS <ACSYM .RAC> .OFFS .ADD>>)>> + +<DEFINE GETEL (RAC SAC STYP) + <EMIT <INSTRUCTION `MOVE + <ACSYM .RAC> + <COND (<==? .STYP UVECTOR> 0) (ELSE 1)> + (<ADDRSYM .SAC>)>>> + +<SETG INS1 + ![![![`ADDM `SUBM `IMULM `IDIVM !] + ![`FADRM `FSBRM `FMPRM `FDVRM !]!] + ![![(`ADD `ADDI `SUBI ) + (`SUB `SUBI `ADDI ) + (`IMUL `IMULI ) + (`IDIV `IDIVI )!] + ![(`FADR () () `FADRI ) + (`FSBR () () `FSBRI ) + (`FMPR () () `FMPRI ) + (`FDVR () () `FDVRI )!]!]!]> + +" Do the actual arithmetic code generation here with all args set up." + +<DEFINE ARITH-INS (ATYP REG REG2 MEM MODE "AUX" RTM INS T TT REG+1) + #DECL ((ATYP MODE) FIX (REG REG2) DATUM (T) AC) + <PROG () + <COND + (<==? .ATYP 4> + <COND (<AND <TYPE? <DATVAL .REG> AC> + <OR <AC+1OK? <DATVAL .REG>> + <AND <N==? <DATVAL .REG> ,LAST-AC> + <==? <NTH ,ALLACS <+ <ACNUM <DATVAL .REG>> 1>> + <DATVAL .REG2>>>>>) + (<SET TT <GET2REG>> + <SET REG <MOVE:ARG .REG <DATUM <DATTYP .REG> .TT>>>) + (<TYPE? <DATVAL .REG> AC> + <COND (<AND <NOT .MEM> + <OR <==? <DATVAL .REG> ,LAST-AC> + <N==? <NTH ,ALLACS <+ 1 <ACNUM <DATVAL .REG>>>> + <DATVAL .REG2>>>> + <EMIT <INSTRUCTION `PUSH `P* <ADDRSYM <DATVAL .REG>> 1>> + <SET RTM T>)>) + (ELSE <TOACV .REG> <AGAIN>)> + <AND <NOT <ASSIGNED? RTM>> + <NOT .MEM> + <MUNG-AC <SET REG+1 <NTH ,ALLACS <+ 1 <ACNUM <DATVAL .REG>>>>>> + <PUT .REG+1 ,ACPROT T>>) + (<NOT <TYPE? <DATVAL .REG> AC>> <TOACV .REG>)> + <PUT <DATVAL .REG> ,ACPROT T> + <SET INS <NTH <NTH <NTH ,INS1 <COND (.MEM 1) (ELSE 2)>> .MODE> .ATYP>> + <OR .MEM <MUNG-AC <DATVAL .REG> .REG>> + <COND (<TYPE? .INS LIST> + <IMCHK .INS <ACSYM <DATVAL .REG>> <DATVAL .REG2>>) + (ELSE + <EMIT <INSTRUCTION .INS + <ACSYM <DATVAL .REG>> + !<ADDR:VALUE .REG2>>>)> + <AND <ASSIGNED? REG+1> <PUT .REG+1 ,ACPROT <>>> + <PUT <DATVAL .REG> ,ACPROT <>> + <AND <ASSIGNED? RTM> + <EMIT <INSTRUCTION `POP `P* <ADDRSYM <DATVAL .REG>> 1>>> + <COND (.MEM <RET-TMP-AC .REG> .REG2) (ELSE <RET-TMP-AC .REG2> .REG)>>> + +<DEFINE MIN-MAX (NOD WHERE + "AUX" (MAX? <==? MAX <NODE-NAME .NOD>>) (K <KIDS .NOD>) REG + (MODE 1) REG1 SEGF (C <OR <AND .MAX? 5> 6>) TEM + (ONO .NO-KILL) (NO-KILL .ONO)) + #DECL ((NOD) NODE (MODE C) FIX (MAX?) ANY (REG) DATUM (K) <LIST [REST NODE]> + (NO-KILL) <SPECIAL LIST>) + <SET NO-KILL <COMMUTE .K <NODE-NAME .NOD> .NO-KILL>> + <SET REG <REG? <RESULT-TYPE .NOD> .WHERE>> + <COND (<==? <NODE-TYPE <SET TEM <1 .K>>> ,SEG-CODE> + <SET REG1 + <GEN <SET TEM <1 <KIDS .TEM>>> + <DATUM <STRUCTYP <RESULT-TYPE .TEM>> ANY-AC>>> + <SET MODE + <SEGINS .C + T + .TEM + .REG + .REG1 + 1 + <OR <AND .MAX? <MAX>> <MIN>>>>) + (ELSE + <SET REG <GEN .TEM .REG>> + <AND <==? <RESULT-TYPE .TEM> FLOAT> <SET MODE 2>>)> + <MAPF <> + <FUNCTION (N + "AUX" (NXT + <COND + (<==? <NODE-TYPE .N> ,SEG-CODE> + <SET SEGF T> + <GEN <SET N <1 <KIDS .N>>> + <DATUM <STRUCTYP <RESULT-TYPE .N>> ANY-AC>>) + (ELSE <SET SEGF <>> <GEN .N DONT-CARE>)>)) + #DECL ((NXT REG) DATUM (N) NODE (MODE) FIX) + <COND (.SEGF + <SET MODE <SEGINS .C <> .N .REG .NXT .MODE 0>> + <RET-TMP-AC .NXT>) + (ELSE + <COND (<==? .MODE 2> + <COND (<==? <ISTYPE? <RESULT-TYPE .N>> FIX> + <DATTYP-FLUSH <SET NXT <GEN-FLOAT .NXT>>> + <PUT .NXT ,DATTYP FLOAT>)>) + (<==? <ISTYPE? <RESULT-TYPE .N>> FLOAT> + <DATTYP-FLUSH <SET REG <GEN-FLOAT .REG>>> + <PUT .REG ,DATTYP FLOAT> + <SET MODE 2>)> + <COND (<AND <NOT <TYPE? <DATVAL .REG> AC>> + <TYPE? <DATVAL .NXT> AC>> + <SET TEM .NXT> + <SET NXT .REG> + <SET REG .TEM>)> + <COND (<TYPE? <DATVAL .REG> AC> + <MUNG-AC <DATVAL .REG> .REG>)> + <TOACV .REG> ;"Make sure in AC" + <PUT <DATVAL .REG> ,ACPROT T> + <IMCHK <COND (.MAX? '(`CAMG `CAIG )) (ELSE '(`CAML `CAIL ))> + <ACSYM <DATVAL .REG>> + <DATVAL .NXT>> + <MOVE:VALUE <DATVAL .NXT> <DATVAL .REG>> + <PUT <DATVAL .REG> ,ACPROT <>> + <RET-TMP-AC .NXT>)>> + <REST .K>> + <DELAY-KILL .NO-KILL .ONO> + <MOVE:ARG .REG .WHERE>> + +<DEFINE ABS-GEN ACT (N W + "AUX" (K1 <1 <KIDS .N>>) NUM (TRIN <>) + (ABSFLG <==? <NODE-NAME .N> ABS>) TEM T2 (DONE <>)) + #DECL ((N K1) NODE (NUM) DATUM (TEM) <DATUM ANY AC> (TRANSFORM) TRANS) + <PROG ((TRANSFORM <MAKE-TRANS .N 2 0 0 0 1 0 0>)) + #DECL ((TRANSFORM) <SPECIAL TRANS>) + <SET NUM + <GEN .K1 + <COND (<AND <==? <NODE-TYPE .K1> ,LNTH-CODE> + <TYPE? .W DATUM>> + <DATUM !.W>) + (ELSE DONT-CARE)>>> + <COND (<NOT <0? <1 <3 .TRANSFORM>>>> + <RETURN <MOVE:ARG .NUM .W> .ACT>)>> + <COND (<AND <ASSIGNED? TRANSFORM> + <==? <1 .TRANSFORM> <PARENT .N>> + <NOT .ABSFLG>> + <SET TRIN <2 .TRANSFORM>>)> + <COND + (<AND <TYPE? .W DATUM> + <REPEAT ((W <CHTYPE .W LIST>)) + #DECL ((W) LIST) + <COND (<EMPTY? .W> <RETURN <>>) + (<OR <=? <DATVAL .W> <DATVAL .NUM>> + <AND <TYPE? <DATVAL .NUM> AC> + <==? <DATVAL .W> ANY-AC>>> + <RETURN T>) + (ELSE <SET W <REST .W 2>>)>>> + <COND (<NOT <AND .TRIN <NOT <0? <1 .TRIN>>>>> + <AND <TYPE? <DATVAL .NUM> AC> <MUNG-AC <DATVAL .NUM> .NUM>> + <EMIT <INSTRUCTION <COND (.ABSFLG `MOVMS ) (ELSE `MOVNS )> + !<ADDR:VALUE .NUM>>>) + (ELSE <PUT <3 .TRANSFORM> 1 1>)> + <MOVE:ARG .NUM .W>) + (<AND <==? .W DONT-CARE> <TYPE? <DATVAL .NUM> AC>> + <COND (<NOT <AND .TRIN <NOT <0? <1 .TRIN>>>>> + <AND <TYPE? <DATVAL .NUM> AC> <MUNG-AC <DATVAL .NUM> .NUM>> + <EMIT <INSTRUCTION <COND (.ABSFLG `MOVMS ) (ELSE `MOVNS )> + !<ADDR:VALUE .NUM>>>) + (ELSE <PUT <3 .TRANSFORM> 1 1>)> + <MOVE:ARG .NUM .W>) + (<AND .TRIN <NOT <0? <1 .TRIN>>>> + <PUT <3 .TRANSFORM> 1 1> + <MOVE:ARG .NUM .W>) + (ELSE + <COND (<SET T2 + <OR <ISTYPE? <DATTYP .NUM>> <ISTYPE? <RESULT-TYPE .K1>>>> + <SET TEM <REG? .T2 .W T>>) + (ELSE + <SET TEM <REG? TUPLE .W T>> + <COND (<AND <NOT <==? <DATVAL .TEM> <DATTYP .NUM>>> + <==? <DATVAL .NUM> <DATTYP .TEM>>> + <MUNG-AC <DATVAL .TEM> .TEM> + <EMIT <INSTRUCTION <COND (.ABSFLG `MOVM ) (ELSE `MOVN )> + <ACSYM <DATVAL .TEM>> + !<ADDR:VALUE .NUM>>> + <RET-TMP-AC <DATVAL .NUM> .NUM> + <SET DONE T>)> + <COND (<==? <DATTYP .TEM> ANY-AC> + <PUT .TEM ,DATTYP <GETREG .TEM>>) + (<TYPE? <DATTYP .TEM> AC> <SGETREG <DATTYP .TEM> .TEM>)> + <MOVE:TYP <DATTYP .NUM> <DATTYP .TEM>>)> + <RET-TMP-AC .NUM> + <PUT <DATVAL .TEM> ,ACLINK (.TEM !<ACLINK <DATVAL .TEM>>)> + <COND (<NOT .DONE> + <MUNG-AC <DATVAL .TEM> .TEM> + <EMIT <INSTRUCTION <COND (.ABSFLG `MOVM ) (ELSE `MOVN )> + <ACSYM <DATVAL .TEM>> + !<ADDR:VALUE .NUM>>>)> + <MOVE:ARG .TEM .W>)>> + +<DEFINE MOD-GEN (N W + "AUX" (N1 <GEN <1 <KIDS .N>> DONT-CARE>) NN + (N2 <GEN <SET NN <2 <KIDS .N>>> DONT-CARE>) TEM T1 TT + (ACE ,LAST-AC) (ACD ,LAST-AC-1)) + #DECL ((N) NODE (N1 N2) DATUM (ACE ACD TT T1) AC) + <COND + (<AND <==? <NODE-TYPE .NN> ,QUOTE-CODE> + <POPWR2 <NODE-NAME .NN>>> + <SET N1 <MOVE:ARG .N1 <REG? FIX .W>>> + <MUNG-AC <DATVAL .N1> .N1> + <IMCHK '(`AND `ANDI ) + <ACSYM <DATVAL .N1>> + <REFERENCE:ADR <- <NODE-NAME .NN> 1>>>) + (ELSE + <PROG () + <COND (<AC+1OK? <SET TEM <DATVAL .N1>>> <SET T1 .TEM>) + (<SET TEM <GET2REG>> + <SET N1 <MOVE:ARG .N1 <DATUM FIX <SET T1 .TEM>>>>) + (<TYPE? <SET TEM <DATVAL .N1>> AC> + <COND (<==? <SET T1 .TEM> .ACE> + <SET N1 <MOVE:ARG .N1 <DATUM FIX <SGETREG .ACD <>>>>> + <SET T1 .ACD>) + (ELSE <SGETREG <NTH ,ALLACS <+ <ACNUM .T1> 1>> <>>)>) + (ELSE + <SET TEM <ACPROT .ACE>> + <PUT .ACE ,ACPROT T> + <TOACV .N1> + <PUT .ACE ,ACPROT .TEM> + <AGAIN>)> + <PUT <SET TT <NTH ,ALLACS <+ <ACNUM .T1> 1>>> ,ACPROT T> + <MUNG-AC .T1 .N1> + <PUT .TT ,ACPROT <>> + <AND <ACLINK .T1> <RET-TMP-AC .T1 .N1>> + <RET-TMP-AC <DATTYP .N1> .N1> + <PUT .N1 ,DATTYP FIX> + <PUT .N1 ,DATVAL <SET TT <NTH ,ALLACS <+ <ACNUM .T1> 1>>>> + <MUNG-AC <PUT .TT ,ACLINK (.N1 !<ACLINK .TT>)> .N1> + <PUT .T1 ,ACPROT T> + <IMCHK '(`IDIV `IDIVI ) <ACSYM .T1> <DATVAL .N2>> + <EMIT <INSTRUCTION `SKIPGE <ADDRSYM .TT>>> + <IMCHK '(`ADD `ADDI ) <ACSYM .TT> <DATVAL .N2>> + <RET-TMP-AC .N2> + <PUT .T1 ,ACPROT <>>>)> + <MOVE:ARG .N1 .W>> + +<DEFINE ROT-GEN (N W) <ROT-LSH-GEN .N .W `ROT>> + +<DEFINE LSH-GEN (N W) <ROT-LSH-GEN .N .W `LSH>> + +<DEFINE ROT-LSH-GEN (N W INS + "AUX" (K <KIDS .N>) (A1 <1 .K>) (A2 <2 .K>) W1 W2 AC1) + #DECL ((N A1 A2) NODE (K) <LIST [2 NODE]> (W1 W2) DATUM (AC1) AC) + <COND (<==? <NODE-TYPE .A2> ,QUOTE-CODE> ;" LSH-ROT by fixed amount" + <SET W1 <GEN .A1 DONT-CARE>> + <TOACV .W1> + <RET-TMP-AC <DATTYP .W1> .W1> + <PUT .W1 ,DATTYP WORD> + <MUNG-AC <DATVAL .W1> .W1> + <EMIT <INSTRUCTION .INS <ACSYM <DATVAL .W1>> <NODE-NAME .A2>>>) + (ELSE + <COND (<AND <MEMQ <NODE-TYPE .A1> ,SNODES> + <NOT <MEMQ <NODE-TYPE .A2> ,SNODES>> + <NOT <SIDE-EFFECTS .A2>>> + <SET W2 <GEN .A2 DONT-CARE>> + <SET W1 <GEN .A1 DONT-CARE>>) + (ELSE + <SET W1 <GEN .A1 DONT-CARE>> + <SET W2 <GEN .A2 DONT-CARE>>)> + <TOACV .W1> + <RET-TMP-AC <DATTYP .W1> .W1> + <PUT .W1 ,DATTYP WORD> + <SET AC1 <DATVAL .W1>> + <PUT .AC1 ,ACPROT T> + <TOACV .W2> + <PUT .AC1 ,ACPROT <>> + <MUNG-AC .AC1 .W1> + <EMIT <INSTRUCTION .INS + <ACSYM <DATVAL .W1>> + (<ADDRSYM <CHTYPE <DATVAL .W2> AC>>)>> + <RET-TMP-AC .W2>)> + <MOVE:ARG .W1 .W>> + +<DEFINE FLOAT-GEN (N W + "AUX" (NUM <1 <KIDS .N>>) TEM1 (RT <RESULT-TYPE .NUM>) BR + TEM) + #DECL ((N NUM) NODE (TEM TEM1) DATUM (BR) ATOM) + <COND (<==? .RT FLOAT> + <MESSAGE WARNING "UNECESSARY FLOAT "> + <GEN .NUM .W>) + (<==? <ISTYPE? .RT> FIX> + <SET TEM <GEN-FLOAT <GEN .NUM <GOODACS .N .W>>>> + <RET-TMP-AC <DATTYP .TEM> .TEM> + <PUT .TEM ,DATTYP FLOAT> + <MOVE:ARG .TEM .W>) + (ELSE + <SET TEM <GEN .NUM DONT-CARE>> + <EMIT <INSTRUCTION GETYP!-OP `O* !<ADDR:TYPE .TEM>>> + <RET-TMP-AC <DATTYP <SET TEM <MOVE:ARG .TEM <REG? FLOAT .W>>>> + .TEM> + <PUT .TEM ,DATTYP FLOAT> + <SET TEM1 <DATUM !.TEM>> + <MOVE:ARG <GEN-FLOAT .TEM <SET BR <MAKE:TAG>>> .TEM1> + <LABEL:TAG .BR> + <MOVE:ARG .TEM1 .W>)>> + +<DEFINE FIX-GEN (N W + "AUX" (NUM <1 <KIDS .N>>) (RT <RESULT-TYPE .NUM>) TEM TEM1 BR) + #DECL ((N NUM) NODE (TEM TEM1) DATUM (BR) ATOM) + <COND (<==? <ISTYPE? .RT> FIX> + <MESSAGE WARNING "UNECESSARY FIX "> + <GEN .NUM .W>) + (<==? .RT FLOAT> + <SET TEM <GEN-FIX <GEN .NUM DONT-CARE>>> + <RET-TMP-AC <DATTYP .TEM> .TEM> + <PUT .TEM ,DATTYP FIX> + <MOVE:ARG .TEM .W>) + (ELSE + <SET TEM <GEN .NUM DONT-CARE>> + <EMIT <INSTRUCTION GETYP!-OP `O* !<ADDR:TYPE .TEM>>> + <RET-TMP-AC <DATTYP <SET TEM <MOVE:ARG .TEM <REG? FIX .W>>>> + .TEM> + <PUT .TEM ,DATTYP FIX> + <SET TEM1 <DATUM !.TEM>> + <MOVE:ARG <GEN-FIX .TEM <SET BR <MAKE:TAG>>> .TEM1> + <LABEL:TAG .BR> + <MOVE:ARG .TEM1 .W>)>> + +<DEFINE GEN-FLOAT (DAT "OPTIONAL" (BR <>) "AUX" TT T RTM) + #DECL ((DAT) DATUM (T) AC) + <PROG () + <COND (<AC+1OK? <DATVAL .DAT>>) + (<SET TT <GET2REG>> + <SET DAT <MOVE:ARG .DAT <DATUM <DATTYP .DAT> .TT>>>) + (<TYPE? <DATVAL .DAT> AC> + <EMIT <INSTRUCTION `PUSH `P* <ADDRSYM <DATVAL .DAT>> 1>> + <SET RTM T>) + (ELSE <TOACV .DAT> <AGAIN>)> + <SET T <DATVAL .DAT>> + <OR <ASSIGNED? RTM> + <PUT <NTH ,ALLACS <+ <ACNUM .T> 1>> ,ACPROT T>> + <MUNG-AC .T .DAT> + <AND <NOT <ASSIGNED? RTM>> + <PUT <NTH ,ALLACS <+ <ACNUM .T> 1>> ,ACPROT <>> + <MUNG-AC <NTH ,ALLACS <+ <ACNUM .T> 1>>>> + <COND (.BR + <EMIT <INSTRUCTION `CAIE `O* '<TYPE-CODE!-OP!-PACKAGE FIX>>> + <BRANCH:TAG .BR>)> + <EMIT <INSTRUCTION `IDIVI <ACSYM .T> 131072>> + <EMIT <INSTRUCTION `FSC <ACSYM .T> 172>> + <EMIT <INSTRUCTION `FSC <AC1SYM .T> 155>> + <EMIT <INSTRUCTION `FADR <ACSYM .T> <ACNUM .T> 1>> + <AND <ASSIGNED? RTM> + <EMIT <INSTRUCTION `POP `P* <ADDRSYM .T> 1>>> + .DAT>> + +<DEFINE GEN-FIX (DAT "OPTIONAL" (BR <>) "AUX" TEM TT (ACE ,LAST-AC) + (ACD ,LAST-AC-1) T1 NXTAC) + #DECL ((DAT) DATUM (ACE ACD TT TEM) AC) + <PROG () + <COND (<AC+1OK? <SET T1 <DATVAL .DAT>>> <SET TEM .T1>) + (<SET T1 <GET2REG>> + <SET DAT <MOVE:ARG .DAT <DATUM FIX <SET TEM .T1>>>>) + (<TYPE? <SET T1 <DATVAL .DAT>> AC> + <COND (<==? <SET TEM .T1> .ACE> + <MOVE:ARG .DAT + <DATUM FIX <SET TEM <SGETREG .ACD <>>>>>) + (ELSE + <SGETREG <NTH ,ALLACS <+ <ACNUM .TEM> 1>> <>>)>) + (ELSE + <SET T1 <ACPROT .ACE>> + <PUT .ACE ,ACPROT T> + <TOACV .DAT> + <PUT .ACE ,ACPROT .T1> + <AGAIN>)> + <PUT <SET NXTAC <NTH ,ALLACS <+ <ACNUM .TEM> 1>>> + ,ACPROT + T> + <MUNG-AC .TEM .DAT> + <PUT .NXTAC ,ACPROT <>> + <AND <ACLINK .TEM> <RET-TMP-AC .TEM .DAT>> + <RET-TMP-AC <DATTYP .DAT> .DAT> + <PUT .DAT ,DATTYP FIX> + <PUT .DAT ,DATVAL <SET TT .NXTAC>> + <MUNG-AC <PUT .TT ,ACLINK (.DAT !<ACLINK .TT>)> .DAT> + <COND (.BR + <EMIT '<`CAIE 0 <TYPE-CODE!-OP!-PACKAGE FLOAT>>> + <BRANCH:TAG .BR>)> + <EMIT <INSTRUCTION `MULI <ACSYM .TEM> 256>> + <EMIT <INSTRUCTION `TSC <ACSYM .TEM> <ADDRSYM .TEM>>> + <EMIT <INSTRUCTION `ASH <ACSYM .TT> (<ADDRSYM .TEM>) -163>> + .DAT>> + +<DEFINE FLOP (SUBR) + #DECL ((SUBR VALUE) ATOM) + <1 <REST <MEMQ .SUBR + '![G? L? G? G=? L=? G=? ==? ==? N==? N==? 1? -1? 1? 0? + 0?!]>>>> + +<DEFINE FLIP (SUBR "AUX" N) + #DECL ((N) FIX (SUBR VALUE) ATOM) + <NTH ,0SUBRS + <- 13 + <SET N <LENGTH <MEMQ .SUBR ,0SUBRS>>> + <COND (<0? <MOD .N 2>> -1) (ELSE 1)>>>> + +<SETG 0SUBRS ![1? N1? -1? N-1? 0? N0? G? L=? L? G=? ==? N==?!]> + +<DEFINE PRED? (N) #DECL ((N) FIX) <1? <NTH ,PREDV .N>>> + +<DEFINE PRED:BRANCH:GEN (TAG NOD TF + "OPTIONAL" (WHERE FLUSHED) (NF <>) + "AUX" TT + (W2 + <COND (<==? .WHERE FLUSHED> DONT-CARE) + (<AND <TYPE? .WHERE DATUM> + <ISTYPE? <DATTYP .WHERE>>> + <DATUM ANY-AC <DATVAL .WHERE>>) + (ELSE .WHERE)>) TAG2) + #DECL ((NOD) NODE (TT) DATUM) + <COND (<==? <RESULT-TYPE .NOD> NO-RETURN> + <GEN .NOD FLUSHED> + ,NO-DATUM) + (<PRED? <NODE-TYPE .NOD>> + <APPLY <NTH ,GENERATORS <NODE-TYPE .NOD>> + .NOD + .WHERE + .NF + .TAG + .TF>) + (.NF + <SET TT <GEN .NOD DONT-CARE>> + <VAR-STORE <>> + <COND (<==? .WHERE FLUSHED> + <D:B:TAG .TAG .TT <NOT .TF> <RESULT-TYPE .NOD>> + <RET-TMP-AC .TT>) + (<D:B:TAG <SET TAG2 <MAKE:TAG>> .TT .TF <RESULT-TYPE .NOD>> + <RET-TMP-AC .TT> + <SET TT <MOVE:ARG <REFERENCE .TF> .WHERE>> + <BRANCH:TAG .TAG> + <LABEL:TAG .TAG2> + .TT)>) + (ELSE + <SET TT <GEN .NOD .W2>> + <VAR-STORE <>> + <D:B:TAG .TAG .TT .TF <RESULT-TYPE .NOD>> + <MOVE:ARG .TT .WHERE>)>> + +<DEFINE LN-LST (N) + #DECL ((N) NODE) + <AND <==? <NODE-TYPE .N> ,LNTH-CODE> + <==? <STRUCTYP <RESULT-TYPE <1 <KIDS .N>>>> LIST>>> + +<DEFINE 0-TEST (NOD WHERE + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" (REG ,NO-DATUM) (NN <1 <KIDS .NOD>>) + (TRANSFORM + <MAKE-TRANS .NOD 1 1 0 1 1 1 <SW? <NODE-NAME .NOD>>>)) + #DECL ((TRANSFORM) <SPECIAL TRANS> (NOD NN) NODE (REG) DATUM) + <OR <LN-LST .NN> <SET REG <GEN .NN DONT-CARE>>> + <TEST-DISP .NOD + .WHERE + .NOTF + .BRANCH + .DIR + .REG + <DO-TRANS 0 .TRANSFORM> + <NOT <0? <1 <3 .TRANSFORM>>>>>> + +<DEFINE SW? (SBR) + #DECL ((SBR) ATOM) + <COND (<MEMQ .SBR '![0? N0? 1? -1? N1? N-1? ==? N==?!]> 0) + (ELSE 1)>> + +<DEFINE MAKE-TRANS (N NEG +- +-V */ */V HW SW) + #DECL ((N) NODE (NEG +- +-V */ */V HW SW) FIX) + <CHTYPE [.N ![.NEG .+- .+-V .*/ .*/V .HW .SW!] <IUVECTOR 7 0>] + TRANS>> + +<DEFINE DO-TRANS (N TR "AUX" (X <3 .TR>) (NN <NODE-NAME <1 .TR>>)) + #DECL ((TR) TRANS (N) FIX (X) <UVECTOR [7 FIX]>) + <COND (<AND <NOT <0? .N>> <NOT <0? <6 .X>>> <NOT <0? <7 .X>>>> + <COND (<==? .NN G?> <SET N <- .N 1>>) + (<==? .NN L=?> <SET N <- .N 1>>)>)> + <COND (<NOT <0? <1 .X>>> <SET N <- .N>>)> + <COND (<NOT <0? <2 .X>>> <SET N <+ .N <3 .X>>>)> + <COND (<G? <4 .X> 2> <SET N </ .N <5 .X>>>) + (<NOT <0? <4 .X>>> <SET N <* .N <5 .X>>>)> + <COND (<NOT <0? <6 .X>>> + <SET N <CHTYPE <ANDB .N 262143> FIX>> + <COND (<NOT <0? <7 .X>>> + <SET N <CHTYPE <PUTBITS 0 <BITS 18 18> .N> FIX>>)>)> + .N> + +<DEFINE UPDATE-TRANS (NOD TR "AUX" (X <3 .TR>) FLG) + #DECL ((TR) TRANS) + <MAKE-TRANS .NOD + <COND (<NOT <0? <1 .X>>> 2) (ELSE 0)> + <COND (<SET FLG <NOT <0? <2 .X>>>> 2) (ELSE 0)> + <COND (.FLG <3 .X>) (ELSE 0)> + <COND (<SET FLG <G? <4 .X> 2>> 4) + (<SET FLG <NOT <0? <4 .X>>>> 2) + (ELSE 0)> + <COND (.FLG <5 .X>) (ELSE 1)> + <COND (<NOT <0? <6 .X>>> 2) (ELSE 0)> + <COND (<NOT <0? <7 .X>>> 2) (ELSE 0)>>> + +<DEFINE TEST-DISP (N W NF BR DI REG NUM NEG) + #DECL ((NUM) <OR FIX FLOAT> (N) NODE) + <COND (<==? .REG ,NO-DATUM> + <LIST-LNT-SPEC .N .W .NF .BR .DI .NUM>) + (<0? .NUM> <0-TEST1 .N .W .NF .BR .DI .REG .NEG>) + (<AND <OR <1? .NUM> <==? .NUM -1>> + <OR <==? <NODE-NAME .N> 1?> + <==? <ISTYPE? <RESULT-TYPE <1 <KIDS .N>>>> FIX>>> + <COND (<==? .NUM -1> <SET NEG T>)> + <1?-TEST .N .W .NF .BR .DI .REG .NEG>) + (ELSE <TEST-GEN2 .N .W .NF .BR .DI .REG .NUM .NEG>)>> + +<DEFINE 0-TEST1 (NOD WHERE NOTF BRANCH DIR REG NEG + "AUX" (SBR <NODE-NAME .NOD>) B2 (RW .WHERE) + (ARG <1 <KIDS .NOD>>) (SDIR .DIR) + (ATYP <ISTYPE? <RESULT-TYPE .ARG>>) (LDAT <>) S TT) + #DECL ((NOD ARG) NODE (REG) DATUM (LDAT) <OR FALSE DATUM> (S) SYMTAB) + <SET WHERE <UPDATE-WHERE .NOD .WHERE>> + <COND (.NEG + <COND (<==? <NODE-TYPE .NOD> ,0-TST-CODE> <SET SBR <FLOP .SBR>>) + (ELSE + <COND (<SET TT <MEMQ .SBR '![G? G=? G? L? L=? L?!]>> + <SET SBR <2 .TT>>)>)>)> + <COND (<AND <NOT <TYPE? <DATVAL .REG> AC>> + .ATYP + <==? <NODE-TYPE .ARG> ,LVAL-CODE> + <STORED <SET S <NODE-NAME .ARG>>> + <NOT <INACS .S>> + <OR <SPEC-SYM .S> <2 <TYPE-INFO .ARG>>> + <G? <FREE-ACS T> 0>> + <SET LDAT <DATUM .ATYP <GETREG <>>>> + <PUT .S ,INACS .LDAT> + <PUT <DATVAL .LDAT> ,ACRESIDUE (.S)>)> + <COND (.BRANCH + <AND .NOTF <SET DIR <NOT .DIR>>> + <AND .DIR <SET SBR <FLIP .SBR>>> + <VAR-STORE <>> + <COND (<==? .RW FLUSHED> + <ZER-JMP .SBR .REG .BRANCH .LDAT> + <RET-TMP-AC .REG>) + (ELSE + <SET B2 <MAKE:TAG>> + <SET SBR <FLIP .SBR>> + <ZER-JMP .SBR .REG .B2 .LDAT> + <RET-TMP-AC .REG> + <SET RW + <MOVE:ARG <MOVE:ARG <REFERENCE .SDIR> .WHERE> .RW>> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2> + .RW)>) + (ELSE + <AND .NOTF <SET SBR <FLIP .SBR>>> + <VAR-STORE <>> + <AND <TYPE? .WHERE ATOM> <SET WHERE <ANY2ACS>>> + <ZER-JMP .SBR .REG <SET BRANCH <MAKE:TAG>> .LDAT> + <RET-TMP-AC .REG> + <MOVE:ARG <REFERENCE T> .WHERE> + <RET-TMP-AC .WHERE> + <BRANCH:TAG <SET B2 <MAKE:TAG>>> + <LABEL:TAG .BRANCH> + <MOVE:ARG <REFERENCE <>> .WHERE> + <LABEL:TAG .B2> + <MOVE:ARG .WHERE .RW>)>> + +<DEFINE ZER-JMP (SBR REG BR LDAT "AUX" TEM) + #DECL ((REG) DATUM (LDAT) <OR FALSE DATUM>) + <COND (<TYPE? <SET TEM <DATVAL .REG>> AC> + <EMIT <INSTRUCTION <NTH ,0JMPS <LENGTH <MEMQ .SBR ,0SUBRS>>> + <ACSYM .TEM> + .BR>>) + (ELSE + <EMIT <INSTRUCTION <NTH ,0SKPS <LENGTH <MEMQ .SBR ,0SUBRS>>> + <COND (.LDAT <ACSYM <DATVAL .LDAT>>) (ELSE 0)> + !<ADDR:VALUE .REG>>> + <BRANCH:TAG .BR>)>> + +<SETG 0SKPS + ![`SKIPN `SKIPE `SKIPGE `SKIPL `SKIPLE `SKIPG `SKIPN `SKIPE !]> + +<SETG 0JMPS + ![`JUMPE `JUMPN `JUMPL `JUMPGE `JUMPG `JUMPLE `JUMPE `JUMPN !]> + +<DEFINE 1?-GEN (NOD WHERE + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" (REG ,NO-DATUM) (NN <1 <KIDS .NOD>>) + (TRANSFORM + <MAKE-TRANS .NOD 1 2 -1 1 1 1 <SW? <NODE-NAME .NOD>>>)) + #DECL ((NOD NN) NODE (REG) DATUM (TRANSFORM) <SPECIAL TRANS>) + <OR <LN-LST .NN> <SET REG <GEN .NN DONT-CARE>>> + <TEST-DISP .NOD + .WHERE + .NOTF + .BRANCH + .DIR + .REG + <DO-TRANS 1 .TRANSFORM> + <NOT <0? <1 <3 .TRANSFORM>>>>>> + +<DEFINE 1?-TEST (NOD WHERE NOTF BRANCH DIR REG NEG + "AUX" (SBR <NODE-NAME .NOD>) B2 (RW .WHERE) (K <1 <KIDS .NOD>>) + (SDIR .DIR) (NM <>) (ATYP <ISTYPE? <RESULT-TYPE .K>>) + (RFLG <MEMQ .ATYP ![FIX FLOAT!]>) (SDIR .DIR)) + #DECL ((NOD K) NODE (REG) DATUM) + <SET REG + <MOVE:ARG .REG <DATUM <COND (.ATYP) (ELSE ANY-AC)> ANY-AC>>> + <SET NM <ACRESIDUE <DATVAL .REG>>> + <SET WHERE <UPDATE-WHERE .NOD .WHERE>> + <COND (.BRANCH + <AND .NOTF <SET DIR <NOT .DIR>>> + <COND (<AND .CAREFUL <NOT .RFLG>> <CFFLARG .REG>)> + <VAR-STORE <>> + <COND (<==? .RW FLUSHED> + <COND (.RFLG + <GEN-COMP .ATYP + .REG + .DIR + .BRANCH + .SBR + .NEG + .NM>) + (ELSE + <GENFLOAT .REG .DIR .BRANCH .NEG> + <GEN-COMP FIX .REG .DIR .BRANCH .SBR .NEG .NM>)> + <RET-TMP-AC .REG>) + (ELSE + <SET B2 <MAKE:TAG>> + <COND (.RFLG + <GEN-COMP .ATYP + .REG + <NOT .DIR> + .B2 + .SBR + .NEG + .NM>) + (ELSE + <GENFLOAT .REG <NOT .DIR> .B2 .NEG> + <GEN-COMP FIX .REG <NOT .DIR> .B2 .SBR .NEG .NM>)> + <RET-TMP-AC .REG> + <SET RW + <MOVE:ARG <MOVE:ARG <REFERENCE .SDIR> .WHERE> .RW>> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2> + .RW)>) + (ELSE + <COND (<AND .CAREFUL <NOT .RFLG>> <CFFLARG .REG>)> + <VAR-STORE <>> + <AND <TYPE? .WHERE ATOM> <SET WHERE <ANY2ACS>>> + <COND (.RFLG + <GEN-COMP .ATYP + .REG + .NOTF + <SET BRANCH <MAKE:TAG>> + .SBR + .NEG + .NM>) + (ELSE + <GENFLOAT .REG .NOTF <SET BRANCH <MAKE:TAG>> .NEG> + <GEN-COMP FIX .REG .NOTF .BRANCH .SBR .NEG .NM>)> + <RET-TMP-AC .REG> + <MOVE:ARG <REFERENCE T> .WHERE> + <RET-TMP-AC .WHERE> + <BRANCH:TAG <SET B2 <MAKE:TAG>>> + <LABEL:TAG .BRANCH> + <MOVE:ARG <REFERENCE <>> .WHERE> + <LABEL:TAG .B2> + <MOVE:ARG .WHERE .RW>)>> + +<SETG AOJS + ![`AOJL `AOJLE `AOJG `AOJGE `AOJE `AOJN `AOJE `AOJN `AOJE +`AOJN `AOJE `AOJN !]> + +<SETG SOJS + ![`SOJL `SOJLE `SOJG `SOJGE `SOJE `SOJN `SOJE `SOJN `SOJE +`SOJN `SOJE `SOJN !]> + +<DEFINE GEN-COMP (TYP REG DIR BR SBR NEG NM) + #DECL ((REG) <DATUM ANY AC> (TYP BR) ATOM) + <COND + (<==? <ISTYPE? .TYP> FIX> + <AND .DIR <SET SBR <FLIP .SBR>>> + <COND (.NM + <EMIT <INSTRUCTION + <NTH <NTH ,SKIPS <LENGTH <MEMQ .SBR ,CMSUBRS>>> + <COND (.NEG 1) (ELSE 2)>> + <ACSYM <DATVAL .REG>> + <COND (.NEG '[-1]) (ELSE 1)>>> + <BRANCH:TAG .BR>) + (ELSE + <MUNG-AC <DATVAL .REG> .REG> + <EMIT <INSTRUCTION <NTH <COND (.NEG ,AOJS) (ELSE ,SOJS)> + <LENGTH <MEMQ .SBR ,CMSUBRS>>> + <ACSYM <DATVAL .REG>> + .BR>>)>) + (ELSE + <EMIT <INSTRUCTION <COND (.DIR `CAMN ) (ELSE `CAME )> + <ACSYM <DATVAL .REG>> + <COND (.NEG '[-1.0]) (ELSE '[1.0])>>> + <BRANCH:TAG .BR>)>> + +<DEFINE GENFLOAT (REG DIR BR NEG) + <EMIT <INSTRUCTION <COND (<NOT .DIR> `CAME ) (ELSE `CAMN )> + <ACSYM <DATVAL .REG>> + <COND (.NEG '[-1.0]) (ELSE '[1.0])>>> + <COND (.DIR <BRANCH:TAG .BR>)>> + +<DEFINE CFFLARG (DAT "AUX" (LABGOOD <MAKE:TAG>)) + #DECL ((DAT) DATUM (LABGOOD) ATOM) + <EMIT <INSTRUCTION GETYP!-OP `O* !<ADDR:TYPE .DAT>>> + <EMIT <INSTRUCTION `CAIE `O* '<TYPE-CODE!-OP!-PACKAGE FLOAT>>> + <EMIT <INSTRUCTION `CAIN `O* '<TYPE-CODE!-OP!-PACKAGE FIX>>> + <DATTYP-FLUSH .DAT> + <BRANCH:TAG .LABGOOD> + <BRANCH:TAG |COMPERR> + <LABEL:TAG .LABGOOD>> + +<DEFINE TEST-GEN (NOD WHERE + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" (K <1 <KIDS .NOD>>) (K2 <2 <KIDS .NOD>>) REGT REGT2 + (S <SW? <NODE-NAME .NOD>>) TRANSFORM ATYP ATYP2 B2 + (SDIR .DIR) (RW .WHERE) TRANS1 (FLS <==? .RW FLUSHED>) + TEM (ONO .NO-KILL) (NO-KILL .ONO) + "ACT" TA) + #DECL ((NOD K K2) NODE (REGT) DATUM (TRANSFORM) <SPECIAL TRANS> + (TRANS1) TRANS (NO-KILL) <SPECIAL LIST>) + <SET WHERE + <COND (<==? .WHERE FLUSHED> FLUSHED) + (ELSE <UPDATE-WHERE .NOD .WHERE>)>> + <COND (<OR <==? <NODE-TYPE .K2> ,QUOTE-CODE> + <AND <NOT <MEMQ <NODE-TYPE .K> ,SNODES>> + <NOT <SIDE-EFFECTS .NOD>> + <MEMQ <NODE-TYPE .K2> ,SNODES>>> + <COND (<AND <==? <NODE-TYPE .K> ,LVAL-CODE> + <COND (<==? <LENGTH <SET TEM <TYPE-INFO .K>>> 2> <2 .TEM>) + (ELSE T)> + <SET TEM <NODE-NAME .K>> + <NOT <MAPF <> + <FUNCTION (LL) + <AND <==? <1 .LL> .TEM> <MAPLEAVE>>> + .NO-KILL>>> + <SET NO-KILL ((<NODE-NAME .K> <>) !.NO-KILL)>)> + <SET K .K2> + <SET K2 <1 <KIDS .NOD>>> + <PUT .NOD ,NODE-NAME <FLOP <NODE-NAME .NOD>>>)> + <SET ATYP <ISTYPE? <RESULT-TYPE .K2>>> + <SET ATYP2 <ISTYPE-GOOD? <RESULT-TYPE .K>>> + <SET REGT + <DATUM <COND (.ATYP .ATYP) (ELSE ANY-AC)> ANY-AC>> + <SET REGT2 + <COND (<OR <==? <NODE-TYPE .K> ,QUOTE-CODE> + <NOT <SIDE-EFFECTS .K2>>> + DONT-CARE) + (.ATYP2 <DATUM .ATYP2 ANY-AC>) + (ELSE <DATUM ANY-AC ANY-AC>)>> + <COND (<N==? <NODE-TYPE .K> ,QUOTE-CODE> + <COND (<OR <==? .ATYP FLOAT> <==? .ATYP2 FLOAT>>) + (ELSE + <SET TRANSFORM <MAKE-TRANS .NOD 1 1 0 1 1 <+ 2 <- .S>> .S>> + <PUT <2 .TRANSFORM> 6 1> + <PUT <2 .TRANSFORM> 7 0>)> + <SET REGT2 <GEN .K .REGT2>> + <COND (<ASSIGNED? TRANSFORM> + <SET TRANS1 .TRANSFORM> + <SET TRANSFORM <UPDATE-TRANS .NOD .TRANS1>>)> + <COND (<TYPE? <DATVAL .REGT2> AC> + <SET REGT <GEN .K2 DONT-CARE>> + <COND (<TYPE? <DATVAL .REGT2> AC> + <PUT .NOD ,NODE-NAME <FLOP <NODE-NAME .NOD>>> + <SET TEM .REGT> + <SET REGT .REGT2> + <SET REGT2 .TEM> + <COND (<ASSIGNED? TRANSFORM> + <SET TEM .TRANS1> + <SET TRANS1 .TRANSFORM> + <SET TRANSFORM .TEM>)> + <SET TEM .ATYP> + <SET ATYP .ATYP2> + <SET ATYP2 .TEM>) + (ELSE <TOACV .REGT>)>) + (ELSE <SET REGT <GEN .K2 .REGT>>)>) + (ELSE + <COND (<OR <==? .ATYP FIX> + <0? <NODE-NAME .K>> + <1? <NODE-NAME .K>>> + <SET TRANSFORM <MAKE-TRANS .NOD 1 1 0 1 1 <+ 2 <- .S>> .S>>)> + <COND (<==? .ATYP FIX> + <PUT <PUT <2 .TRANSFORM> 2 1> 3 <FIX <NODE-NAME .K>>>)> + <COND (<LN-LST .K2> <SET REGT ,NO-DATUM>) + (ELSE + <SET REGT <GEN .K2 .REGT>> + <DATTYP-FLUSH .REGT> + <PUT .REGT ,DATTYP .ATYP>)> + <RETURN + <TEST-DISP .NOD + .WHERE + .NOTF + .BRANCH + .DIR + .REGT + <COND (<ASSIGNED? TRANSFORM> + <DO-TRANS <FIX <NODE-NAME .K>> .TRANSFORM>) + (ELSE <NODE-NAME .K>)> + <AND <ASSIGNED? TRANSFORM> <NOT <0? <1 <3 .TRANSFORM>>>>>> + .TA>)> + <DELAY-KILL .NO-KILL .ONO> + <AND <ASSIGNED? TRANSFORM> + <CONFORM .REGT .REGT2 .TRANSFORM .TRANS1> + <PUT .NOD ,NODE-NAME <FLOP <NODE-NAME .NOD>>>> + <COND (.BRANCH + <AND .NOTF <SET DIR <NOT .DIR>>> + <VAR-STORE <>> + <GEN-COMP2 <NODE-NAME .NOD> + .ATYP2 + .ATYP + .REGT2 + .REGT + <COND (.FLS .DIR) (ELSE <NOT .DIR>)> + <COND (.FLS .BRANCH) (ELSE <SET B2 <MAKE:TAG>>)>> + <COND (<NOT .FLS> + <SET RW <MOVE:ARG <MOVE:ARG <REFERENCE .SDIR> .WHERE> .RW>> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2> + .RW)>) + (ELSE + <VAR-STORE <>> + <GEN-COMP2 <NODE-NAME .NOD> + .ATYP2 + .ATYP + .REGT2 + .REGT + .NOTF + <SET BRANCH <MAKE:TAG>>> + <MOVE:ARG <REFERENCE T> .WHERE> + <RET-TMP-AC .WHERE> + <BRANCH:TAG <SET B2 <MAKE:TAG>>> + <LABEL:TAG .BRANCH> + <MOVE:ARG <REFERENCE <>> .WHERE> + <LABEL:TAG .B2> + <MOVE:ARG .WHERE .RW>)>> + +<DEFINE TEST-GEN2 (NOD WHERE NOTF BRANCH DIR REG NUM NEG + "AUX" (SDIR .DIR) (RW .WHERE) (FLS <==? .RW FLUSHED>) B2 + (SBR <NODE-NAME .NOD>)) + #DECL ((NOD) NODE (REG) DATUM (NUM) <OR FIX FLOAT>) + <SET WHERE + <COND (<==? .WHERE FLUSHED> FLUSHED) + (ELSE <UPDATE-WHERE .NOD .WHERE>)>> + <TOACV .REG> + <COND (.BRANCH + <COND (.NEG <SET SBR <FLOP .SBR>>)> + <AND .NOTF <SET DIR <NOT .DIR>>> + <VAR-STORE <>> + <GEN-COMP2 .SBR + <TYPE .NUM> + <ISTYPE? <DATTYP .REG>> + <REFERENCE .NUM> + .REG + <COND (.FLS .DIR) (ELSE <NOT .DIR>)> + <COND (.FLS .BRANCH) (ELSE <SET B2 <MAKE:TAG>>)>> + <COND (<NOT .FLS> + <SET RW + <MOVE:ARG <MOVE:ARG <REFERENCE .SDIR> .WHERE> .RW>> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2> + .RW)>) + (ELSE + <VAR-STORE <>> + <AND .NOTF <SET DIR <NOT .DIR>>> + <COND (.NEG <SET SBR <FLOP .SBR>>)> + <GEN-COMP2 .SBR + <TYPE .NUM> + <ISTYPE? <DATTYP .REG>> + <REFERENCE .NUM> + .REG + .NOTF + <SET BRANCH <MAKE:TAG>>> + <MOVE:ARG <REFERENCE T> .WHERE> + <RET-TMP-AC .WHERE> + <BRANCH:TAG <SET B2 <MAKE:TAG>>> + <LABEL:TAG .BRANCH> + <MOVE:ARG <REFERENCE <>> .WHERE> + <LABEL:TAG .B2> + <MOVE:ARG .WHERE .RW>)>> + +<DEFINE GEN-COMP2 (SB T1 T2 R1 R2 D BR) + #DECL ((R1) DATUM (R2) <DATUM ANY AC> (SB T1 T2 BR) ATOM) + <AND .D <SET SB <FLIP .SB>>> + <COND (<==? .T1 .T2>) + (<==? <ISTYPE? .T1> FIX> + <DATTYP-FLUSH <SET R1 <GEN-FLOAT .R1>>> + <PUT .R1 ,DATTYP FLOAT>) + (ELSE + <DATTYP-FLUSH <GEN-FLOAT .R2>> + <PUT .R2 ,DATTYP FLOAT>)> + <OR <TYPE? <DATVAL .R2> AC> <TOACV .R2>> + <PUT <DATVAL .R2> ,ACPROT T> + <IMCHK <NTH ,SKIPS <LENGTH <MEMQ .SB ,CMSUBRS>>> + <ACSYM <DATVAL .R2>> + <DATVAL .R1>> + <RET-TMP-AC .R1> + <RET-TMP-AC .R2> + <BRANCH:TAG .BR>> + +<DEFINE GET-DF (S) + #DECL ((S) ATOM) + <NTH '[0 0 1 1 1.7014117E+38 -1.7014117E+38] + <LENGTH <MEMQ .S '![MAX MIN * / - +!]>>>> + +<SETG CMSUBRS '![0? N0? 1? N1? -1? N-1? ==? N==? G? G=? L? L=?!]> + +<SETG SKIPS + '![(`CAMGE `CAIGE ) + (`CAMG `CAIG ) + (`CAMLE `CAILE ) + (`CAML `CAIL ) + (`CAMN `CAIN ) + (`CAME `CAIE ) + (`CAMN `CAIN ) + (`CAME `CAIE ) + (`CAMN `CAIN ) + (`CAME `CAIE ) + (`CAMN `CAIN ) + (`CAME `CAIE )!]> + +<ENDPACKAGE> diff --git a/<mdl.comp>/case.mud.59 b/<mdl.comp>/case.mud.59 new file mode 100644 index 0000000..60865d6 --- /dev/null +++ b/<mdl.comp>/case.mud.59 @@ -0,0 +1,380 @@ +<PACKAGE "CASE"> + +<ENTRY CASE-FCN CASE-GEN> + +<USE "PASS1" "CODGEN" "CHKDCL" "CACS" "COMPDEC" "COMCOD"> + +<SETG PMAX ,NUMPRI!-MUDDLE> + +<SETG MAX-DENSE 2> + +<NEWTYPE OR LIST> + +<FLOAD "PRCOD.NBIN"> + +<DEFINE CASE-FCN (OBJ AP + "AUX" (OP!-PACKAGE .PARENT) (PARENT .PARENT) (FLG T) (WIN T) + TYP (DF <>) P TEM X) + #DECL ((PARENT) <SPECIAL NODE> (OBJ) <FORM ANY> (VALUE) NODE) + <COND + (<AND + <G? <LENGTH .OBJ> 3> + <PROG () + <COND (<AND <TYPE? <SET X <2 .OBJ>> FORM> + <==? <LENGTH .X> 2> + <==? <1 .X> GVAL> + <MEMQ <SET P <2 .X>> '![==? TYPE? PRIMTYPE?!]>>) + (ELSE <SET WIN <>>)> + 1> + <MAPF <> + <FUNCTION (O) + <COND + (<AND .FLG <==? .O DEFAULT>> <SET DF T>) + (<AND .DF <TYPE? .O LIST>> <SET DF <>> <SET FLG <>>) + (<AND <NOT .DF> <TYPE? .O LIST> <NOT <EMPTY? .O>>> + <COND + (<SET TEM <VAL-CHK <1 .O>>> + <COND (<ASSIGNED? TYP> <OR <==? .TYP <TYPE .TEM>> <SET WIN <>>>) + (ELSE <SET TYP <TYPE .TEM>>)>) + (<OR <TYPE? <SET TEM <1 .O>> OR> + <AND <N==? .P ==?> + <TYPE? .TEM SEGMENT> + <==? <LENGTH .TEM> 2> + <==? <1 .TEM> QUOTE> + <NOT <MONAD? <SET TEM <2 .TEM>>>>>> + <MAPF <> + <FUNCTION (TY) + <COND (<NOT <SET TY <VAL-CHK .TY>>> <SET WIN <>>) + (ELSE + <COND (<ASSIGNED? TYP> + <OR <==? .TYP <TYPE .TY>> + <SET WIN <>>>) + (ELSE <SET TYP <TYPE .TY>>)>)>> + .TEM>) + (ELSE <SET WIN <>>)>) + (ELSE <MAPLEAVE <>>)> + T> + <REST .OBJ 3>> + <NOT .DF>> + <COND (<AND .WIN + <NOT <OR <AND <==? <TYPEPRIM .TYP> WORD> <==? .P ==?>> + <AND <N==? .P ==?> <==? .TYP ATOM>>>>> + <SET WIN <>>)> + <COND + (.WIN + <SET PARENT <NODECOND ,CASE-CODE .OP!-PACKAGE <> CASE ()>> + <PUT + .PARENT + ,KIDS + (<PCOMP <2 .OBJ> .PARENT> + <PCOMP <3 .OBJ> .PARENT> + !<MAPF ,LIST + <FUNCTION (CLA "AUX" TT) + #DECL ((CLA) <OR ATOM LIST> (TT) NODE) + <COND (.DF <SET CLA (ELSE !.CLA)>)> + <COND + (<NOT <TYPE? .CLA ATOM>> + <PUT <SET TT <NODEB ,BRANCH-CODE .PARENT <> <> ()>> + ,PREDIC + <PCOMP <COND (<TYPE? <SET TEM <1 .CLA>> SEGMENT> + <FORM QUOTE + <MAPF ,LIST ,VAL-CHK <2 .TEM>>>) + (<TYPE? .TEM OR> + <FORM QUOTE <MAPF ,LIST ,VAL-CHK .TEM>>) + (ELSE <VAL-CHK .TEM>)> + .TT>> + <PUT .TT + ,CLAUSES + <MAPF ,LIST + <FUNCTION (O) <PCOMP .O .TT>> + <REST .CLA>>> + <SET DF <>> + .TT) + (ELSE <SET DF T> <PCOMP .CLA .PARENT>)>> + <REST .OBJ 3>>)>) + (ELSE <PMACRO .OBJ .OP!-PACKAGE>)>) + (ELSE <MESSAGE ERROR "BAD CASE USAGE" .OBJ>)>> + +<DEFINE VAL-CHK (TEM "AUX" TT) + <OR <AND <OR <TYPE? .TEM ATOM> <==? <PRIMTYPE .TEM> WORD>> + .TEM> + <AND <TYPE? .TEM FORM> + <==? <LENGTH .TEM> 2> + <OR <AND <==? <1 .TEM> QUOTE> <2 .TEM>> + <AND <==? <1 .TEM> GVAL> <MANIFESTQ <2 .TEM>> ,<2 .TEM>> + <AND <==? <1 .TEM> ASCII> + <TYPE? <2 .TEM> CHARACTER FIX> + <EVAL .TEM>>>> + <AND <TYPE? .TEM FORM> + <==? <LENGTH .TEM> 3> + <==? <1 .TEM> CHTYPE> + <TYPE? <3 .TEM> ATOM> + <NOT <TYPE? <2 .TEM> FORM LIST VECTOR UVECTOR SEGMENT>> + <EVAL .TEM>> + <AND <TYPE? .TEM FORM> + <NOT <EMPTY? .TEM>> + <TYPE? <SET TT <1 .TEM>> ATOM> + <GASSIGNED? .TT> + <TYPE? ,.TT MACRO> + <VAL-CHK <EMACRO .TEM>>>>> + +<DEFINE EMACRO (OBJ "AUX" (ERR <GET ERROR!-INTERRUPTS INTERRUPT>) TEM) + <COND (.ERR <OFF .ERR>)> + <ON "ERROR" + <FUNCTION (FR "TUPLE" T) + <COND (<AND <GASSIGNED? MACACT> <LEGAL? ,MACACT>> + <DISMISS [!.T] ,MACACT>) + (ELSE <APPLY ,<PARSE "OVALRET!-COMBAT!-"> " ">)>> + 100> + <COND (<TYPE? <SET TEM + <PROG MACACT () #DECL ((MACACT) <SPECIAL ACTIVATION>) + <SETG MACACT .MACACT> + (<EXPAND .OBJ>)>> + VECTOR> + <OFF "ERROR"> + <COND (.ERR <EVENT .ERR>)> + <ERROR " MACRO EXPANSION LOSSAGE " !.TEM>) + (ELSE <OFF "ERROR"> <AND .ERR <EVENT .ERR>> <1 .TEM>)>> + + + +<DEFINE DATFIX (W) <COND (<TYPE? .W DATUM> <DATUM !.W>) (ELSE .W)>> + +<DEFINE CASE-GEN (N W + "AUX" (K <KIDS .N>) (P <NODE-NAME <1 <KIDS <1 .K>>>>) + (N1 <2 .K>) (SKIP-CH <>) (RW .W) (LNT 0) (DF <>) DN + (DFT <MAKE:TAG "CASEDF">) MI MX RNGS W1 (TAGS (X)) + (TBL <MAKE:TAG "CASETBL">) (ET <MAKE:TAG "CASEND">) NOW + DAC TG TT W2 (FIRST T) S1 (S2 ()) TNUM) + #DECL ((N DN N1) NODE (P) ATOM (S1) SAVED-STATE + (S2) <LIST [REST SAVED-STATE]> (RNGS) UVECTOR) + <REGSTO <>> + <SET W + <COND (<==? .W FLUSHED> FLUSHED) (ELSE <GOODACS .N .W>)>> + <PREFER-DATUM .W> + <SET W2 + <GEN .N1 + <COND (<AND <==? .P ==?> <SET TT <ISTYPE? <RESULT-TYPE .N1>>>> + <DATUM .TT ANY-AC>) + (ELSE DONT-CARE)>>> + <SET K + <MAPR ,UVECTOR + <FUNCTION (NP "AUX" (N <1 .NP>)) + #DECL ((N) NODE) + <COND (<==? <NODE-TYPE .N> ,QUOTE-CODE> + <SET DF T> + <MAPRET>)> + <COND (.DF <SET DN .N> <SET DF <>> <MAPRET>)> + <COND (<==? <RESULT-TYPE .N> FALSE> + <MESSAGE NOTE " CASE PHRASE ALWAYS FALSE " .N> + <MAPRET>)> + <COND (<AND <==? <RESULT-TYPE .N> ATOM> + <NOT <EMPTY? <REST .NP>>>> + <MESSAGE NOTE + " NON REACHABLE CASE CLAUSE(S) " + <2 .NP>> + (.N () FOO))> + (.N () FOO)> + <REST .K 2>>> + <SET LNT + <LENGTH + <SET RNGS + <MAPF ,UVECTOR + <FUNCTION (L "AUX" (N <1 .L>) (NN <NODE-NAME <PREDIC .N>>)) + #DECL ((N) NODE) + <PUT .L 3 <MAKE:TAG "CASE">> + <COND + (<==? .P ==?> + <COND (<TYPE? .NN LIST> + <MAPR <> <FUNCTION (L) <PUT .L 1 <FIX <1 .L>>>> .NN>) + (ELSE <SET NN <CHTYPE .NN FIX>>)>) + (<==? .P TYPE?> + <COND (<TYPE? .NN LIST> + <MAPR <> + <FUNCTION (L "AUX" TT) + <COND (<G? <SET TT <CHTYPE <1 .L> FIX>> ,PMAX> + <SET SKIP-CH T>)> + <PUT .L 1 .TT>> + .NN>) + (ELSE + <COND (<G? <SET NN <CHTYPE <TYPE-C .NN> FIX>> ,PMAX> + <SET SKIP-CH T>)> + .NN)>) + (<TYPE? .NN LIST> + <MAPR <> + <FUNCTION (L) <PUT .L 1 <CHTYPE <PTYPE-C <1 .L>> FIX>>> + .NN>) + (ELSE <SET NN <CHTYPE <PTYPE-C .NN> FIX>>)> + <COND (<TYPE? .NN LIST> <PUT .L 2 .NN> <MAPRET !.NN>) + (ELSE <PUT .L 2 (.NN)> .NN)>> + .K>>>> + <SORT <> .RNGS> + <COND (<L=? .LNT 3> <SET SKIP-CH T>) + (<G? <- <SET MX <NTH .RNGS .LNT>> <SET MI <SET TNUM <1 .RNGS>>>> + <* .LNT ,MAX-DENSE>> + <SET SKIP-CH T>)> + <MAPF <> + <FUNCTION (NUM) + <COND (<==? .NUM .TNUM> + <MESSAGE ERROR " DUPLICATE CASE ENTRY " .N>)> + <SET TNUM .NUM>> + <REST .RNGS>> + <COND + (<==? .P ==?> + <COND + (<NOT .TT> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O !<ADDR:TYPE .W2>>> + <EMIT + <INSTRUCTION + `CAIE + `O + <FORM + TYPE-CODE!-OP!-PACKAGE + <TYPE <COND (<TYPE? <SET TT <NODE-NAME <PREDIC <1 <1 .K>>>>> LIST> + <1 .TT>) + (ELSE .TT)>>>>> + <BRANCH:TAG .DFT>)> + <SET W2 <TOACV .W2>> + <SET DAC <DATVAL .W2>>) + (<==? .P TYPE?> + <SET DAC <GETREG <>>> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE + <ACSYM .DAC> + !<ADDR:TYPE .W2>>>) + (ELSE + <SET DAC <GETREG <>>> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE + <ACSYM .DAC> + !<ADDR:TYPE .W2>>> + <EMIT <INSTRUCTION `ASH <ACSYM .DAC> 1>> + <EMIT <INSTRUCTION `ADD <ACSYM .DAC> TYPVEC!-MUDDLE 1 `(TVP) >> + <EMIT <INSTRUCTION `LDB + <ACSYM .DAC> + [<FORM (576) (<ADDRSYM .DAC>)>]>>)> + <COND + (<NOT .SKIP-CH> + <MUNG-AC .DAC .W2> + <RET-TMP-AC .W2> + <COND (<0? .MI> <EMIT <INSTRUCTION `JUMPL <ACSYM .DAC> .DFT>>) + (<==? .MI 1> + <EMIT <INSTRUCTION `JUMPLE <ACSYM .DAC> .DFT>>) + (ELSE + <IMCHK '(`CAMGE `CAIGE) <ACSYM .DAC> <REFERENCE:ADR .MI>> + <BRANCH:TAG .DFT>)> + <COND (<0? .MX> <EMIT <INSTRUCTION `JUMPG <ACSYM .DAC> .DFT>>) + (<==? .MX -1> + <EMIT <INSTRUCTION `JUMPGE <ACSYM .DAC> .DFT>>) + (ELSE + <IMCHK '(`CAMLE `CAILE) <ACSYM .DAC> <REFERENCE:ADR .MX>> + <BRANCH:TAG .DFT>)> + <EMIT <INSTRUCTION `ADD <ACSYM .DAC> [<INSTRUCTION `SETZ .TBL>]>> + <EMIT <INSTRUCTION `JRST `@ <- .MI> (<ADDRSYM .DAC>)>> + <LABEL:TAG .DFT> + <SET S1 <SAVE-STATE>> + <COND (<ASSIGNED? DN> + <SET W1 <SEQ-GEN <KIDS .DN> <DATFIX .W>>> + <ACFIX .W .W1> + <COND (<N==? <RESULT-TYPE .DN> NO-RETURN> + <SET S2 (<SAVE-STATE>)> + <BRANCH:TAG .ET>)> + <VAR-STORE <>>) + (ELSE + <SET W1 <MOVE:ARG <REFERENCE <>> <DATFIX .W>>> + <ACFIX .W .W1> + <SET S2 (<SAVE-STATE>)> + <VAR-STORE <>> + <BRANCH:TAG .ET>)> + <LABEL:TAG .TBL> + <SET NOW <+ .MI 1>> + <REPEAT () + <COND (<EMPTY? .RNGS> <RETURN>)> + <COND (<N==? .NOW <+ <1 .RNGS> 1>> + <SET NOW <+ .NOW 1>> + <EMIT <INSTRUCTION `SETZ .DFT>>) + (ELSE + <EMIT <INSTRUCTION `SETZ <DOTAGS <1 .RNGS> .K>>> + <SET NOW <+ .NOW 1>> + <SET RNGS <REST .RNGS>>)>> + <MAPF <> + <FUNCTION (L "AUX" (N <1 .L>) (TG <3 .L>)) + <RET-TMP-AC .W1> + <RESTORE-STATE .S1> + <COND (<NOT .FIRST> <OR <==? .W1 ,NO-DATUM> <BRANCH:TAG .ET>>) + (ELSE <SET FIRST <>>)> + <LABEL:TAG .TG> + <COND + (<NOT <EMPTY? <KIDS .N>>> + <SET W1 <SEQ-GEN <KIDS .N> <DATFIX .W>>>) + (ELSE + <SET W1 + <MOVE:ARG + <REFERENCE <COND (<==? .P ==?> T) + (ELSE <NODE-NAME <PREDIC .N>>)>> + <DATFIX .W>>>)> + <OR <==? .W1 ,NO-DATUM> <SET S2 (<SAVE-STATE> !.S2)>> + <ACFIX .W .W1>> + .K>) + (ELSE + <RET-TMP-AC .W2> + <SET S1 <SAVE-STATE>> + <REPEAT (L) + <COND (<EMPTY? .K> <RETURN>)> + <DISTAG <2 <SET L <1 .K>>> .DAC <SET TG <3 .L>>> + <COND (<NOT <EMPTY? <KIDS <1 .L>>>> + <SET W1 <SEQ-GEN <KIDS <1 .L>> <DATFIX .W>>>) + (ELSE <SET W1 <MOVE:ARG <REFERENCE T> <DATFIX .W>>>)> + <OR <==? .W1 ,NO-DATUM> <SET S2 (<SAVE-STATE> !.S2)>> + <VAR-STORE <>> + <RESTORE-STATE .S1> + <ACFIX .W .W1> + <OR <==? .W1 ,NO-DATUM> <BRANCH:TAG .ET>> + <LABEL:TAG .TG> + <SET K <REST .K>> + <RET-TMP-AC .W1>> + <COND (<ASSIGNED? DN> <SET W1 <SEQ-GEN <KIDS .DN> <DATFIX .W>>>) + (ELSE <SET W1 <MOVE:ARG <REFERENCE <>> <DATFIX .W>>>)> + <OR <==? .W1 ,NO-DATUM> <SET S2 (<SAVE-STATE> !.S2)>>)> + <COND (<AND <TYPE? .W DATUM> <N==? <RESULT-TYPE .N> NO-RETURN>> + <SET W2 .W> + <AND <ISTYPE? <DATTYP .W2>> + <TYPE? <DATTYP .W1> AC> + <NOT <==? <DATTYP .W2> <DATTYP .W1>>> + <RET-TMP-AC <DATTYP .W1> .W1>> + <AND <TYPE? <DATTYP .W2> AC> + <FIX-ACLINK <DATTYP .W2> .W2 .W1>> + <AND <TYPE? <DATVAL .W2> AC> + <FIX-ACLINK <DATVAL .W2> .W2 .W1>>)> + <MERGE-STATES .S2> + <LABEL:TAG .ET> + <MOVE:ARG .W .RW>> + +<DEFINE DOTAGS (N L) + #DECL ((N) FIX (L) <UVECTOR [REST <LIST NODE <LIST [REST FIX]> ATOM>]>) + <MAPF <> + <FUNCTION (LL) <COND (<MEMQ .N <2 .LL>> <MAPLEAVE <3 .LL>>)>> + .L>> + +<DEFINE DISTAG (L DAC ATM "AUX" TG) + #DECL ((L) <LIST [REST FIX]> (DAC) AC (ATM) ATOM) + <COND (<G=? <LENGTH .L> 2> <SET TG <MAKE:TAG>>)> + <REPEAT () + <COND (<EMPTY? .L> + <BRANCH:TAG .ATM> + <AND <ASSIGNED? TG> <LABEL:TAG .TG>> + <RETURN>) + (<EMPTY? <REST .L>> + <IMCHK '(`CAME `CAIE) <ACSYM .DAC> <REFERENCE:ADR <1 .L>>> + <BRANCH:TAG .ATM> + <AND <ASSIGNED? TG> <LABEL:TAG .TG>> + <RETURN>) + (ELSE + <IMCHK '(`CAME `CAIE) <ACSYM .DAC> <REFERENCE:ADR <1 .L>>> + <IMCHK '(`CAMN `CAIN) <ACSYM .DAC> <REFERENCE:ADR <2 .L>>> + <BRANCH:TAG .TG>)> + <SET L <REST .L 2>>>> + +<DEFINE PTYPE-C (ATM) <PRIM-CODE <TYPE-C .ATM>>> + +<ENDPACKAGE> + + \ No newline at end of file diff --git a/<mdl.comp>/caseld.mud.1 b/<mdl.comp>/caseld.mud.1 new file mode 100644 index 0000000..e81cef4 --- /dev/null +++ b/<mdl.comp>/caseld.mud.1 @@ -0,0 +1,37 @@ + + +<USE "MACROS" "SORTX"> + +<SET REDEFINE T> + +<PACKAGE "CC"> + +<BEGIN-HACK "BTB"> + +<BEGIN-MHACK> + +<COND (<NOT <GASSIGNED? CASE-CODE>> <SETG CASE-CODE ,SPARE1-CODE>)> + +<BLOCK (<ROOT>)> + +PRIMTYPE? + +<COND (<NOT <GASSIGNED? CASE>> + <SETG CASE (1)>)> + +<ENDBLOCK> + +<PROG ((CH <OR <OPEN "READB" "COMPIL;CASE FBIN"> + <OPEN "READB" "COMPIL;CASE NBIN">>)) + <COND (.CH <PRINC "Using Compiled CASE."> <CRLF> + <LOAD .CH><CLOSE .CH>) + (ELSE <GROUP-LOAD "COMPIL;CASE >">)>> + +<PUT ,CASE PAPPLY-OBJECT ,CASE-FCN> + +<PUT ,ANALYZERS ,CASE-CODE ,CASE-ANA> + +<PUT ,GENERATORS ,CASE-CODE ,CASE-GEN> + +<ENDPACKAGE> +  \ No newline at end of file diff --git a/<mdl.comp>/cback.mud.18 b/<mdl.comp>/cback.mud.18 new file mode 100644 index 0000000..71439d2 --- /dev/null +++ b/<mdl.comp>/cback.mud.18 @@ -0,0 +1,145 @@ +<PACKAGE "CBACK"> + +<ENTRY BACK-GEN TOP-GEN> + +<USE "CODGEN" "CHKDCL" "CACS" "COMPDEC" "COMCOD" "STRGEN"> + + +<DEFINE BACK-GEN (NOD WHERE + "AUX" (K <KIDS .NOD>) (TYP <RESULT-TYPE <1 .K>>) + (TPS <STRUCTYP .TYP>) + (NUMKN <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE>) + (NUM <COND (.NUMKN <NODE-NAME <2 .K>>) (ELSE 0)>)) + #DECL ((NUMKN) <OR ATOM FALSE> (NUM) FIX (TPS) ATOM (NOD) NODE + (WHERE) <OR ATOM DATUM> (K) <LIST [REST NODE]>) + <APPLY <NTH ,BACKERS <LENGTH <MEMQ .TPS ,STYPES>>> + .NOD + .WHERE + .TYP + .TPS + .NUMKN + .NUM + <1 .K> + <2 .K>>> + +<DEFINE NO-BACK-ERROR (NOD "TUPLE" ERR) + <MESSAGE INCONSISTENCY "CANT OPEN-COMPILE BACK" .ERR .NOD>> + +<DEFINE VEC-BACK-GEN (NODE WHERE TYP TPS NUMKN NUM STRNOD NUMNOD + "AUX" (ONO .NO-KILL) (NO-KILL .ONO) + (CAREFL <AND .CAREFUL <N==? .TPS TUPLE>>) + (UV? <==? .TPS UVECTOR>) NAC SAC STR NUMN (RV <>) + TAC TDAT (W <GOODACS .NODE .WHERE>)) + #DECL ((NOD NUMNOD STRNOD) NODE (W TDAT STR NUMN) DATUM (TAC SAC NAC) AC (NUM) FIX + (NO-KILL) <SPECIAL LIST> (RV CAREFL UV?) <OR ATOM FALSE>) + <COND + (.NUMKN + <COND (<L? .NUM 0> <MESSAGE INCONSISTENCY "ARG OUT OF RANGE BACK" .NODE>) + (<0? .NUM> <SET STR <GEN .STRNOD .W>>) + (ELSE + <SET STR <GEN .STRNOD .W>> + <COND (.CAREFL + <SET TAC <GETREG <SET TDAT <DATUM FIX ANY-AC>>>> + <MUNG-AC .TAC> + <PUT .TDAT ,DATVAL .TAC> + <SET TAC <DATVAL .TDAT>> + <EMIT <INSTRUCTION `HLRE `O !<ADDR:VALUE .STR>>> + <EMIT <INSTRUCTION `MOVE <ACSYM .TAC> !<ADDR:VALUE .STR>>> + <EMIT <INSTRUCTION `SUB <ACSYM .TAC> `O >> + <EMIT <INSTRUCTION `HLRZ <ACSYM .TAC> 1 (<ADDRSYM .TAC>)>> + <EMIT <INSTRUCTION `ADD <ACSYM .TAC> `O >> + <EMIT <INSTRUCTION `SUBI + <ACSYM .TAC> + <+ <COND (.UV? .NUM) (ELSE <* .NUM 2>)> + 1>>> + <EMIT <INSTRUCTION `JUMPLE <ACSYM .TAC> |COMPER >> + <RET-TMP-AC .TDAT>)> + <TOACV .STR> + <SET SAC <DATVAL .STR>> + <MUNG-AC .SAC .STR> + <EMIT <INSTRUCTION `SUB + <ACSYM .SAC> + <COND (.UV? [<FORM (.NUM) .NUM>]) + (ELSE + [<FORM (<* .NUM 2>) <* .NUM 2>>])>>>)>) + (ELSE + <SET RV <COMMUTE-STRUC <> .NUMNOD .STRNOD>> + <COND (.RV <SET NUMN <GEN .NUMNOD DONT-CARE>> <SET STR <GEN .STRNOD .W>>) + (<SET STR <GEN .STRNOD .W>> <SET NUMN <GEN .NUMNOD DONT-CARE>>)> + <DELAY-KILL .NO-KILL .ONO> + <TOACV .NUMN> + <SET NAC <DATVAL .NUMN>> + <MUNG-AC .NAC .NUMN> + <COND (<NOT .UV?> <EMIT <INSTRUCTION `ASH <ACSYM .NAC> 1>>)> + <COND (.CAREFUL + <EMIT <INSTRUCTION `JUMPL <ACSYM .NAC> |COMPER >> + <SET TAC <GETREG <SET TDAT <DATUM FIX ANY-AC>>>> + <PUT .TDAT ,DATVAL .TAC> + <EMIT <INSTRUCTION `HLRE `O !<ADDR:VALUE .STR>>> + <EMIT <INSTRUCTION `MOVE <ACSYM .TAC> !<ADDR:VALUE .STR>>> + <EMIT <INSTRUCTION `SUB <ACSYM .TAC> `O >> + <EMIT <INSTRUCTION `HLRZ <ACSYM .TAC> 1 (<ADDRSYM .TAC>)>> + <EMIT <INSTRUCTION `ADD <ACSYM .TAC> `O >> + <EMIT <INSTRUCTION `SUB <ACSYM .TAC> <ADDRSYM .NAC>>> + <EMIT <INSTRUCTION `SOJLE <ACSYM .TAC> |COMPER >> + <RET-TMP-AC .TDAT>)> + <EMIT <INSTRUCTION `HRLI <ACSYM .NAC> (<ADDRSYM .NAC>)>> + <TOACV .STR> + <MUNG-AC <DATVAL .STR> .STR> + <EMIT <INSTRUCTION `SUB <ACSYM <CHTYPE <DATVAL .STR> AC>> <ADDRSYM .NAC>>> + <PUT .NAC ,ACPROT <>> + <RET-TMP-AC .NUMN> + <COND (<N==? .TPS TUPLE> + <RET-TMP-AC <DATTYP .STR> .STR> + <PUT .STR ,DATTYP .TPS>)>)> + <MOVE:ARG .STR .WHERE>> + +<GDECL (BACKERS) VECTOR> + +<SETG BACKERS + [,NO-BACK-ERROR + ,NO-BACK-ERROR + ,NO-BACK-ERROR + ,VEC-BACK-GEN + ,VEC-BACK-GEN + ,VEC-BACK-GEN + ,VEC-BACK-GEN + ,NO-BACK-ERROR]> + +<DEFINE TOP-GEN (N RW + "AUX" (NN <1 <KIDS .N>>) (TY <RESULT-TYPE .NN>) + (TPS <STRUCTYP .TY>) OAC SAC (FLG <>) W DAC D) + #DECL ((N NN) NODE (W D) DATUM (TPS) ATOM (OAC SAC DAC) AC) + <SET W <GOODACS .N .RW>> + <SET D <GEN .NN <DATUM <COND (<ISTYPE? .TY>) (ELSE .TPS)> ANY-AC>>> + <PUT <SET SAC <DATVAL .D>> ,ACPROT T> + <COND (<==? <DATVAL .W> <DATVAL .D>> <SET OAC <GETREG <>>> <SET FLG T>) + (<TYPE? <DATVAL .W> AC> + <PUT <CHTYPE <DATVAL .W> AC> ,ACPROT T> + <SET OAC <GETREG <>>> + <PUT <CHTYPE <DATVAL .W> AC> ,ACPROT <>>) + (ELSE <SET OAC <GETREG <>>>)> + <EMIT <INSTRUCTION `HLRE <ACSYM .OAC> <ADDRSYM .SAC>>> + <EMIT <INSTRUCTION `SUBM <ACSYM .SAC> <ADDRSYM .OAC>>> + <COND (<AND <NOT .FLG> <TYPE? <DATVAL .W> AC>> + <SET DAC <SGETREG <DATVAL .W> <>>> + <EMIT <INSTRUCTION `MOVEI <ACSYM .DAC> 2 (<ADDRSYM .OAC>)>>) + (<OR .FLG <0? <CHTYPE <FREE-ACS T> FIX>>> + <MUNG-AC <SET DAC .SAC> .D> + <EMIT <INSTRUCTION `MOVEI <ACSYM .SAC> 2 (<ADDRSYM .OAC>)>>) + (ELSE + <PUT .OAC ,ACPROT T> + <SET DAC <GETREG <>>> + <EMIT <INSTRUCTION `MOVEI <ACSYM .DAC> 2 (<ADDRSYM .OAC>)>>)> + <EMIT <INSTRUCTION `HLR <ACSYM .OAC> 1 (<ADDRSYM .OAC>)>> + <EMIT <INSTRUCTION `HRLI <ACSYM .OAC> -2 (<ADDRSYM .OAC>)>> + <EMIT <INSTRUCTION `SUB <ACSYM .DAC> <ADDRSYM .OAC>>> + <PUT .SAC ,ACPROT <>> + <PUT .OAC ,ACPROT <>> + <RET-TMP-AC .D> + <SET D <DATUM .TPS .DAC>> + <PUT .DAC ,ACLINK (.D)> + <MOVE:ARG .D .RW>> + +<ENDPACKAGE> + \ No newline at end of file diff --git a/<mdl.comp>/cdrive.mud.12 b/<mdl.comp>/cdrive.mud.12 new file mode 100644 index 0000000..e5df0dd --- /dev/null +++ b/<mdl.comp>/cdrive.mud.12 @@ -0,0 +1,270 @@ +<PACKAGE "CDRIVE"> + +<ENTRY COMPILE COMPILE-GROUP COMP2> + +<USE "CODGEN" "SYMANA" "VARANA" "COMCOD" "COMPDEC" "PASS1" "TIMFCN" "ADVMES" + "CUP"> +"****** TOP LEVEL COMILER CALLS ******" + +"COMPILE -- compile one function or a group. Compile does not merge a group + into one big RSUBR (see COMPILE-GROUP). + + The arguments to compile are: + + FCNS -- an atom whose GVAL is a function, a locative to a function + or a list of the previous 2. + + SRC-FLG -- a channel for assembly listing or #FALSE () for none. + + BIN-FLG -- If false, don't assemble else do. + + CAREFUL -- If true compile bounds checking else don't. + + GLOSP -- Whether or not default is SPECIAL. +" + +<DEFINE <ENTRY COMPILE> (FCNS + "OPTIONAL" (SRC-FLG <>) (BIN-FLG T) (CAREFUL T) + (GLOSP <>) (REASONABLE T) (GLUE T) + (ANALY-OK T) (VERBOSE <>) + "AUX" (IND (1)) (TAG:COUNT 0) "NAME" COMPILER) + #DECL ((FCNS SRC-FLG BIN-FLG CAREFUL GLOSP REASONABLE GLUE IND + TAG:COUNT COMPILER ANALY-OK VERBOSE) <SPECIAL ANY>) + <ZTMPLST> + <COND (<TYPE? .FCNS LIST> + <MAPF <> ,VERIFY .FCNS> + <MAPF <> + <FUNCTION (FCN) <PRINC <COMP2 .FCN>> <TERPRI>> + .FCNS> + <MAPF <> ,UNASSOC .FCNS>) + (ELSE <VERIFY .FCNS> + <PRINC <COMP2 .FCNS>> + <UNASSOC .FCNS>)> + <TERPRI> + "DONE"> + +"COMP2 -- compile one thing (atom or locative) print time if second arg + missing or false. Assemble result if desired (time entire job)." + +<DEFINE COMP2 (TH "OPTIONAL" (SILENT <>) + "AUX" (CODE:TOP (())) MESS + (CODE:PTR .CODE:TOP) + (ST <TIME>) (RT <RTIME>) (DAT <DATE>)) + #DECL ((CODE:PTR CODE:TOP) <SPECIAL LIST>) + <SET MESS <COMP1 .TH <> <> .SILENT>> + <COND (<TYPE? .MESS LIST> + <SETLOC <1 .MESS> <ASSEM? .SRC-FLG>> + <STRING "Job done in: " + <TIME-STR1 <FIX <+ 0.5 <- <TIME> .ST>>>> " / " + <TIME-DIF1 .DAT <DATE> .RT <RTIME>>>) + (ELSE .MESS)>> + +"VERIFY -- check types of arguments prior to compilation." + +<DEFINE VERIFY (THING) + <COND (<TYPE? .THING ATOM> + <IF-NOT <GASSIGNED? .THING> + <MESSAGE ERROR " UNASSIGNED " .THING>> + <IF-NOT <OR <TYPE? ,.THING FUNCTION> + <AND <TYPE? ,.THING MACRO> + <NOT <EMPTY? ,.THING>> + <TYPE? <1 ,.THING> FUNCTION>>> + <MESSAGE ERROR " NOT A FUNCTION " .THING>>) + (<TYPE? .THING LOCL LOCV LOCU LOCA LOCAS LOCD> + <IF-NOT <TYPE? <IN .THING> FUNCTION> + <MESSAGE ERROR " NOT A FUNCTION " .THING>>) + (ELSE <MESSAGE ERROR " ARG WRONG TYPE " .THING>)>> + +"COMP1 -- compile one object and time compilation. Make noise if second arg + there and not false." + +<DEFINE COMP1 (THING SUB? INT? + "OPTIONAL" (SILENT <>) + "EXTRA" (START-TIME <TIME>) (NM1 .THING) RDCL (REALT <RTIME>) + (TH .THING) (RDAT <DATE>) + "NAME" COMPILER) + #DECL ((SUB? INT? RDCL COMPILER) <SPECIAL ANY> (START-TIME) FLOAT) + <COND (<TYPE? .THING ATOM> + <COND (<GASSIGNED? SNAME-SETTER> <SNAME-SETTER .THING>)> + <COND (<NOT .SILENT> + <PRINC "COMPILING "> + <PRIN1 .THING> + <TERPRI>)> + <COND (<TYPE? ,.THING FUNCTION> <SET TH <GLOC .THING>>) + (ELSE <SET TH <AT ,.THING 1>>)>) + (ELSE + <OR .SILENT <PRINC "COMPILING LOCATIVE">> + <SET NM1 <MAKE:TAG "ANONF">>)> + <COMPILE-FUNCTION <IN .TH> .NM1 .THING> + (.TH + <STRING "Compilation done in " + <TIME-STR1 <FIX <+ 0.5 <- <TIME> .START-TIME>>>> + "cpu time, " + <ASCII 13> + <ASCII 10> + <TIME-DIF1 .RDAT <DATE> .REALT <RTIME>> + " real time. " + <ASCII 13> + <ASCII 10>>)> + +"COMPILE-GROUP -- compile into one RSUBR a group of functions. Eliminate identity + of internal RSUBRs. First arg same as for COMPILE. Second arg + specifies those FUNCTIONS to become external. Third arg + name of entire group upon completion of compilation." + +<DEFINE <ENTRY COMPILE-GROUP> + (FCNS EXTS GROUP-NAME + "OPTIONAL" (SRC-FLG <>) + (BIN-FLG T) + (CAREFUL T) + (GLOSP <>) + (REASONABLE T) + (GLUE T) + (TMPCHN <>) + (ANALY-OK T) + (VERBOSE <>) + "AUX" (FIRST T) (IND (1)) (TAG:COUNT 0) + (STRT <TIME>) + (RSTRT <RTIME>) + (RDAT <DATE>) + (CODE:TOP (())) + (CODE:PTR .CODE:TOP) + "NAME" COMPILER) + #DECL ((FCNS GROUP-NAME SEC-FLG BIN-FLG CAREFUL GLOSP REASONABLE GLUE + IND TAG:COUNT CODE:TOP CODE:PTR COMPILER ANALY-OK VERBOSE) + <SPECIAL ANY>) + <MAPF <> ,VERIFY .FCNS> + <ZTMPLST> + <GROUP:INITIAL .GROUP-NAME> + <MAPF <> + <FUNCTION (FCN "AUX" (MESS <COMP1 .FCN T <NOT <MEMQ .FCN .EXTS>>>)) + <COND (<TYPE? .MESS LIST>) + (ELSE <RETURN <CHTYPE (.MESS) FALSE> .COMPILER>)> + <SET FIRST <>> + <TERPRI> + <ASSEM? .CODE:TOP <>> + <COND (.TMPCHN <OUTCOD .CODE:TOP .TMPCHN> + <SET CODE:PTR <SET CODE:TOP (())>>)>> + .FCNS> + <MAPF <> ,UNASSOC .FCNS> + <COND (.TMPCHN <CLOSE .TMPCHN>) + (ELSE <SETG .GROUP-NAME <ASSEM? .SRC-FLG>>)> + <STRING "Time for group: " + <TIME-STR1 <FIX <+ 0.5 <- <TIME> .STRT>>>> " / " + <TIME-DIF1 .RDAT <DATE> .RSTRT <RTIME>>>> + +<SETG WDCNTLC ![1623294726!]> + +<SETG WDSPACE ![17315143744!]> + +<DEFINE OUTCOD (L TMPCH "AUX" (OBLIST (<MOBLIST OP!-PACKAGE> <GET MUDDLE OBLIST> + !.OBLIST)) ACC ACC2) + #DECL ((L) LIST (TMPCH) CHANNEL (OBLIST) <SPECIAL LIST> (ACC ACC2) FIX) + <SET ACC <17 .TMPCH>> + <RESET .TMPCH> + <ACCESS .TMPCH .ACC> + <PRINC <ASCII 12> .TMPCH> + <REPEAT () + <COND (<EMPTY? <SET L <REST .L>>> <RETURN>)> + <TERPRI .TMPCH> + <OR <TYPE? <1 .L> ATOM> <PRINC " " .TMPCH>> + <PRIN1 <1 .L> .TMPCH>> + <BUFOUT .TMPCH> + <PRINTB ,WDCNTLC .TMPCH> + <SET ACC2 <17 .TMPCH>> + <ACCESS .TMPCH <- .ACC 1>> + <PRINTB ,WDSPACE .TMPCH> + <ACCESS .TMPCH .ACC2> + <CLOSE .TMPCH>> + +<DEFINE UNASSOC (THING) + <COND (<TYPE? .THING ATOM> + <PUT ,.THING .IND>) + (ELSE <PUT <IN .THING> .IND>)>> + +"COMPILE-FUNCTION -- run the compiler on one function. + PASS1 builds internal structure. + ANA further specifies the structure and computes types for all nodes. + VARS allocates stack slots for variables. + CODE-GEN generates assembler source. +" + +<DEFINE COMPILE-FUNCTION (FCN NAME "OPTIONAL" (RNAME .NAME) "AUX" INAME (LOCAL-TAGS ()) + (VP (()))) + #DECL ((LOCAL-TAGS) <SPECIAL LIST>) + <COND (.VERBOSE <SET VERBOSE .VP>)> + <REACS> + <SET INAME <NODE-NAME <SET FCN <PASS1 .FCN .NAME <> .RNAME>>>> + <ANA .FCN ANY> + <VARS .FCN> + <COND (.VERBOSE <ANA-MESS .VP>)> + <REACS> + <COND (<ACS .FCN> ;"AC call exists?" + <COND (<AND .INT? .SUB?> + <INT:INITIAL .NAME>) + (.SUB? <SUB:INT:INITIAL .NAME> <ARGS-TO-ACS .FCN>) + (ELSE <FCN:INT:INITIAL .NAME> <ARGS-TO-ACS .FCN>)>) + (<AND <ASSIGNED? GROUP-NAME> + <NOT <EMPTY? <ACS .FCN>>> + <OR .INT? <NOT <EMPTY? .INAME>>>> + <INT:LOSER:INITIAL .NAME .FCN>) + (.SUB? <SUB:INITIAL .NAME>) + (ELSE + <FUNCTION:INITIAL .NAME>)> + <CODE-GEN .FCN> + <CHECK-LOCAL-TAGS .LOCAL-TAGS> + <PUT .FCN ,BINDING-STRUCTURE ()> + <PUT .FCN ,KIDS ()> + <PUT .FCN ,SYMTAB ,LVARTBL> + <COND (<ACS .FCN> + <COND (.INT? <INT:FINAL .FCN>) + (ELSE + <PUT .RDCL 2 <RSUBR-DECLS .FCN>> + <FS:INT:FINAL <ACS .FCN>>)>) + (ELSE + <PUT .RDCL 2 <RSUBR-DECLS .FCN>> + <FCNSUB:FINAL .FCN>)>> + + + + +<DEFINE TIME-STR1 (NSEC "AUX" (NMIN </ <FIX .NSEC> 60>) + (NHRS </ .NMIN 60>)) + #DECL ((NSEC) <OR FIX FLOAT> (NMIN NHRS) FIX (VALUE) STRING) + <TIMEST1 .NHRS + <- .NMIN <* .NHRS 60>> + <- .NSEC <* .NMIN 60>>>> + +<DEFINE TIME-DIF1 (D1 D2 T1 T2 + "AUX" (DY + <- <DAYS <1 .D2> <2 .D2> <3 .D2>> + <DAYS <1 .D1> <2 .D1> <3 .D1>>>)) + #DECL ((D1 D2 T1 T2) <LIST FIX FIX FIX> (VALUE) STRING) + <TIME-STR1 <- <+ <* .DY 3600 24> + <* <1 .T2> 3600> + <* <2 .T2> 60> + <3 .T2>> + <+ <* <1 .T1> 3600> <* <2 .T1> 60> <3 .T1>>>>> + +<DEFINE TIMEST1 (HR MI SE) + #DECL ((HR MI SE) FIX) + <STRING <COND (<NOT <0? .HR>> <STRING <UNPARSE .HR> ":">) (ELSE "")> + <COND (<OR <NOT <0? .MI>> <NOT <0? .HR>>> + <STRING <COND (<L=? .MI 9> + <STRING <COND (<0? .HR> "") (ELSE "0")> + <CHTYPE <+ .MI 48> CHARACTER>>) + (ELSE + <STRING <CHTYPE <+ </ .MI 10> 48> CHARACTER> + <CHTYPE <+ <MOD .MI 10> 48> + CHARACTER>>)> + ":">) + (ELSE "")> + <COND (<L=? .SE 9> + <STRING <COND (<OR <NOT <0? .MI>> <NOT <0? .HR>>> "0") + (ELSE "")> + <CHTYPE <+ .SE 48> CHARACTER>>) + (ELSE + <STRING <CHTYPE <+ </ .SE 10> 48> CHARACTER> + <CHTYPE <+ <MOD .SE 10> 48> CHARACTER>>)>>> + +<ENDPACKAGE> \ No newline at end of file diff --git a/<mdl.comp>/chkdcl.mud.44 b/<mdl.comp>/chkdcl.mud.44 new file mode 100644 index 0000000..91046b4 --- /dev/null +++ b/<mdl.comp>/chkdcl.mud.44 @@ -0,0 +1,1343 @@ + +<PACKAGE "CHKDCL"> + +<ENTRY TYPE-AND + TYPE-OK? + TASTEFUL-DECL + GET-ELE-TYPE + STRUCTYP + TYPE-ATOM-OK? + ISTYPE-GOOD? + TYPE-MERGE + DEFERN + TOP-TYPE + ISTYPE? + TYPESAME + ANY-PAT + STRUC + GETBSYZ + GEN-DECL + REST-DECL + MINL + GET-RANGE> + + +<USE "COMPDEC"> + +<SETG DECL-RESTED 1> + +<SETG DECL-ELEMENT 2> + +<SETG DECL-ITEM-COUNT 3> + +<SETG DECL-IN-REST 4> + +<SETG DECL-IN-COUNT-VEC 5> + +<SETG DECL-REST-VEC 6> + +<MANIFEST DECL-RESTED + DECL-ELEMENT + DECL-ITEM-COUNT + DECL-IN-REST + DECL-IN-COUNT-VEC + DECL-REST-VEC> + +<SETG HIGHBOUND 2> + +<SETG LOWBOUND 1> + +<MANIFEST HIGHBOUND LOWBOUND> + +<SETG ALLWORDS '<PRIMTYPE WORD>> + +<DEFINE TASTEFUL-DECL (D "AUX" TEM) + <COND (<OR <NOT .D> <==? .D NO-RETURN>> ANY) + (<AND <TYPE? .D ATOM> <VALID-TYPE? .D>> .D) + (<AND <OR <TYPE? <SET TEM .D> ATOM> <SET TEM <ISTYPE? .D>>> + <GET .TEM DECL>> + .TEM) + (<TYPE? .D FORM SEGMENT> + <COND (<LENGTH? .D 1> + <OR <AND <EMPTY? .D> ANY> <TASTEFUL-DECL <1 .D>>>) + (<==? <1 .D> FIX> FIX) + (<AND <==? <LENGTH .D> 2> <==? <1 .D> NOT>> ANY) + (<TYPE? .D SEGMENT> + <CHTYPE <MAPF ,LIST ,TASTEFUL-DECL .D> SEGMENT>) + (ELSE <CHTYPE <MAPF ,LIST ,TASTEFUL-DECL .D> FORM>)>) + (<TYPE? .D VECTOR> + [<COND (<==? <1 .D> OPT> OPTIONAL) (ELSE <1 .D>)> + !<MAPF ,LIST ,TASTEFUL-DECL <REST .D>>]) + (ELSE .D)>> + +<DEFINE TMERGE (P1 P2) + <COND (<OR <AND <TYPE? .P1 FORM SEGMENT> + <==? <LENGTH .P1> 2> + <TYPE? <2 .P1> LIST>> + <AND <TYPE? .P2 FORM SEGMENT> + <==? <LENGTH .P2> 2> + <TYPE? <2 .P2> LIST>> + <CTMATCH .P1 .P2 <> <> T>> + <CTMATCH .P1 .P2 T T <>>) + (<=? .P1 '<NOT ANY>> .P2) + (<=? .P2 '<NOT ANY>> .P1) + (ELSE <CHTYPE (OR !<PUT-IN <PUT-IN () .P1> .P2>) FORM>)>> + +<DEFINE TYPE-AND (P1 P2) <CTMATCH .P1 .P2 T <> <>>> + +<DEFINE TMATCH (P1 P2) <CTMATCH .P1 .P2 <> <> <>>> + +<DEFINE CTMATCH (P1 P2 ANDF ORF MAYBEF) + #DECL ((ANDF ORF MAYBEF) <SPECIAL <OR FALSE ATOM>>) + <DTMATCH .P1 .P2>> + +<DEFINE DTMATCH (PAT1 PAT2) + <OR .PAT1 <SET PAT1 ANY>> + <OR .PAT2 <SET PAT2 ANY>> + <COND (<=? .PAT1 .PAT2> .PAT1) + (<TYPE? <SET PAT1 <VTS .PAT1>> ATOM> <TYPMAT .PAT1 <VTS .PAT2>>) + (<TYPE? <SET PAT2 <VTS .PAT2>> ATOM> <TYPMAT .PAT2 .PAT1>) + (<AND <TYPE? .PAT1 FORM SEGMENT> <TYPE? .PAT2 FORM SEGMENT>> + <TEXP1 .PAT1 .PAT2>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>> + +<DEFINE VTS (X) + <OR <AND <TYPE? .X ATOM> + <OR <VALID-TYPE? .X> + <MEMQ .X '![STRUCTURED LOCATIVE APPLICABLE ANY!]>> + .X> + <AND <TYPE? .X ATOM> <GET .X DECL>> + .X>> + +<DEFINE 2-ELEM (OBJ) + #DECL ((OBJ) <PRIMTYPE LIST>) + <AND <NOT <EMPTY? .OBJ>> <NOT <EMPTY? <REST .OBJ>>>>> + +<DEFINE TYPMAT (TYP PAT "AUX" TEM) + #DECL ((TYP) ATOM) + <OR <SET TEM + <COND (<TYPE? .PAT ATOM> + <OR <AND <==? .PAT ANY> <COND (.ORF ANY) (ELSE .TYP)>> + <AND <==? .TYP ANY> <COND (.ORF ANY) (ELSE .PAT)>> + <AND <=? .PAT .TYP> .TYP> + <STRUC .TYP .PAT T> + <STRUC .PAT .TYP <>>>) + (<TYPE? .PAT FORM SEGMENT> <TEXP1 .PAT .TYP>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>> + <AND <EMPTY? .TEM> + <OR <AND <N==? <SET TEM <VTS .TYP>> .TYP> <DTMATCH .TEM .PAT>> + <AND <N==? <SET TEM <VTS .PAT>> .PAT> + <TYPMAT .TYP .TEM>>>>>> + +" " + +<DEFINE TEXP1 (FORT PAT) + #DECL ((FORT) <OR FORM SEGMENT>) + <COND (<EMPTY? .FORT> #FALSE (EMPTY-TYPE-FORM!-ERRORS)) + (<MEMQ <1 .FORT> '![OR AND NOT PRIMTYPE!]> <ACTORT .FORT .PAT>) + (<AND <==? <1 .FORT> QUOTE> <2-ELEM .FORT>> + <DTMATCH <GEN-DECL <2 .FORT>> .PAT>) + (ELSE <FORMATCH .FORT .PAT>)>> + +<DEFINE ACTORT (FORT PAT "AUX" (ACTOR <1 .FORT>) TEM1) + #DECL ((FORT) <PRIMTYPE LIST>) + <COND + (<==? .ACTOR OR> + <COND + (<EMPTY? <SET FORT <REST .FORT>>> + #FALSE (EMPTY-OR-MATCH!-ERRORS)) + (ELSE + <REPEAT (TEM (AL ())) + #DECL ((AL) LIST) + <COND + (<OR <AND <TYPE? <SET TEM <1 .FORT>> ATOM> + <PROG () + <COND (<VALID-TYPE? .TEM>) + (<SET TEM1 <GET .TEM DECL>> + <SET TEM .TEM1> + <AND <TYPE? .TEM ATOM> <AGAIN>>) + (ELSE T)>> + <SET TEM <TYPMAT .TEM .PAT>>> + <AND <TYPE? .TEM FORM SEGMENT> <SET TEM <TEXP1 .TEM .PAT>>>> + <COND (<==? .ACTOR OR> + <COND (.ANDF + <COND (.TEM + <COND (<==? .TEM ANY> <RETURN ANY>)> + <COND (.ORF <SET AL <PUT-IN .AL .TEM>>) + (ELSE + <OR <MEMBER .TEM .AL> + <SET AL (.TEM !.AL)>>)>)>) + (ELSE <RETURN T>)>)>) + (<NOT <EMPTY? .TEM>> <RETURN .TEM>)> + <COND (<EMPTY? <SET FORT <REST .FORT>>> + <RETURN <AND <NOT <EMPTY? .AL>> + <COND (<EMPTY? <REST .AL>> <1 .AL>) + (ELSE + <ORSORT <CHTYPE (.ACTOR !.AL) + FORM>>)>>>)>>)>) + (<==? .ACTOR NOT> <NOT-IT .FORT .PAT>) + (ELSE <PTACT .FORT .PAT>)>> + +<DEFINE PTACT (FORTYP PAT) + <COND (<TYPE? .FORTYP FORM SEGMENT> + <COND (<AND <2-ELEM .FORTYP> <==? <1 .FORTYP> PRIMTYPE>> + <PRIMATCH .FORTYP .PAT>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>) + (<TYPE? .FORTYP ATOM> <TYPMAT .FORTYP .PAT>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>> + +" " + +<DEFINE STRUC (WRD TYP ACTAND) + #DECL ((TYP) ATOM) + <PROG () + <COND (<COND (<==? .WRD STRUCTURED> + <COND (<==? .TYP LOCATIVE> <>) + (<==? .TYP APPLICABLE> + <RETURN <COND (.ORF '<OR APPLICABLE STRUCTURED>) + (ELSE + '<OR RSUBR RSUBR-ENTRY FUNCTION CLOSURE MACRO>)>>) + (<AND <VALID-TYPE? .TYP> + <MEMQ <TYPEPRIM .TYP> + '![LIST VECTOR UVECTOR TEMPLATE STRING TUPLE + STORAGE BYTES!]>>)>) + (<==? .WRD LOCATIVE> + <MEMQ .TYP '![LOCL LOCAS LOCD LOCV LOCU LOCS LOCA!]>) + (<==? .WRD APPLICABLE> + <COND (<==? .TYP LOCATIVE> <RETURN <>>) + (<==? .TYP STRUCTURED> + <RETURN <STRUC .TYP .WRD .ACTAND>>) + (<MEMQ .TYP + '![RSUBR SUBR FIX FSUBR FUNCTION + RSUBR-ENTRY MACRO CLOSURE + OFFSET!]>)>)> + <COND (.ORF .WRD) (ELSE .TYP)>) + (ELSE + <COND (<AND .ORF <NOT .ACTAND>> <ORSORT <FORM OR .WRD .TYP>>) + (ELSE <>)>)>>> + +<DEFINE PRIMATCH (PTYP PAT "AUX" PAT1 ACTOR TEM) + #DECL ((PAT1) <PRIMTYPE LIST> + (PTYP) <OR <FORM ANY ANY> <SEGMENT ANY ANY>>) + <COND (<AND <TYPE? .PAT FORM SEGMENT> + <SET PAT1 .PAT> + <==? <LENGTH .PAT1> 2> + <==? <1 .PAT1> PRIMTYPE>> + <COND (<==? <2 .PAT1> <2 .PTYP>> .PAT1) + (ELSE <COND (.ORF <ORSORT <FORM OR .PAT1 .PTYP>>)>)>) + (<TYPE? .PAT ATOM> + <COND (<==? .PAT ANY> <COND (.ORF ANY) (.ANDF .PTYP) (ELSE T)>) + (<MEMQ .PAT '![STRUCTURED LOCATIVE APPLICABLE!]> + <COND (<STRUC .PAT <2 .PTYP> T> + <COND (.ORF .PAT) (ELSE .PTYP)>) + (ELSE <COND (.ORF <ORSORT <FORM OR .PAT .PTYP>>)>)>) + (<AND <VALID-TYPE? .PAT> + <==? <TYPEPRIM .PAT> <2 .PTYP>> + <COND (.ORF .PTYP) (ELSE .PAT)>>) + (ELSE <COND (.ORF <ORSORT <FORM OR .PTYP .PAT>>)>)>) + (<AND <TYPE? .PAT FORM SEGMENT> + <SET PAT1 .PAT> + <NOT <EMPTY? .PAT1>>> + <COND (<==? <SET ACTOR <1 .PAT1>> OR> <ACTORT .PAT .PTYP>) + (<==? .ACTOR NOT> + <COND (.ORF <NOT-IT .PAT .PTYP>) + (ELSE + <SET TEM <PRIMATCH .PTYP <2 .PAT1>>> + <COND (<AND <NOT .TEM> <EMPTY? .TEM>> .PTYP) + (<NOT .TEM> .TEM) + (<N=? .TEM .PTYP> ANY)>)>) + (<SET TEM <PRIMATCH .PTYP <1 .PAT1>>> + <COND (.ORF .TEM) + (.ANDF <COND (<TYPE? .PAT FORM> + <FORM .TEM !<REST .PAT1>>) + (ELSE + <CHTYPE (.TEM !<REST .PAT1>) SEGMENT>)>) + (ELSE T)>)>)>> + +" " + +<DEFINE NOT-IT (NF PAT "AUX" T1) + #DECL ((NF) <OR FORM SEGMENT>) + <COND (<AND <TYPE? .PAT FORM SEGMENT> + <NOT <EMPTY? .PAT>> + <OR <==? <1 .PAT> OR> <==? <1 .PAT> AND>>> + <ACTORT .PAT .NF>) + (ELSE + <COND (<==? <LENGTH .NF> 2> + <COND (<NOT <SET T1 <TYPE-AND <2 .NF> .PAT>>> + <COND (.ORF .NF) (.ANDF .PAT) (ELSE T)>) + (<==? <2 .NF> ANY> <COND (.ORF .PAT)>) + (<AND <N==? .T1 .PAT> + <N=? .T1 .PAT> + <N=? <CANONICAL-DECL .PAT> + <CANONICAL-DECL .T1>>> + <COND (<OR .ANDF .ORF> ANY) (ELSE T)>) + (.ORF ANY)>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>)>> + +<DEFINE NOTIFY (D) + <COND (<AND <TYPE? .D FORM SEGMENT> + <==? <LENGTH .D> 2> + <==? <1 .D> NOT>> + <2 .D>) + (ELSE <FORM NOT .D>)>> +" " + +<DEFINE FORMATCH (FRM RPAT "AUX" TEM (PAT .RPAT) EX) + #DECL ((FRM) <OR <FORM ANY> <SEGMENT ANY>> + (RPAT) <OR ATOM FORM LIST SEGMENT VECTOR FIX>) + <COND + (<AND <TYPE? .RPAT ATOM> <TYPE? <1 .FRM> ATOM> <==? <1 .FRM> .RPAT>> + <COND (.ORF .RPAT) (ELSE .FRM)>) + (ELSE + <COND (<TYPE? .RPAT ATOM> <SET PAT <SET EX <GET .RPAT DECL '.RPAT>>>) + (ELSE <SET RPAT <1 .PAT>>)> + <COND + (<TYPE? .PAT ATOM> + <SET TEM + <COND (<AND .ORF <NOT <CTMATCH .PAT <1 .FRM> <> <> T>>> + <ORSORT <FORM OR .RPAT .FRM>>) + (ELSE + <COND (<TYPE? <1 .FRM> ATOM> <TYPMAT <1 .FRM> .PAT>) + (<TYPE? <1 .FRM> FORM> <ACTORT <1 .FRM> .PAT>)>)>> + <COND (<AND .ANDF <NOT .ORF> .TEM> + <COND (<TYPE? .FRM FORM> <CHTYPE (.TEM !<REST .FRM>) FORM>) + (ELSE <CHTYPE (.TEM !<REST .FRM>) SEGMENT>)>) + (ELSE .TEM)>) + (<TYPE? .PAT FORM SEGMENT> + <COND (<MEMQ <1 .PAT> '![OR AND NOT PRIMTYPE!]> <ACTORT .PAT .FRM>) + (ELSE + <COND (<AND <==? <LENGTH .PAT> 2> <TYPE? <2 .PAT> LIST>> + <WRDFX .PAT .FRM .RPAT>) + (<AND <G=? <LENGTH .PAT> 2> <TYPE? <2 .PAT> FIX>> + <BYTES-HACK .PAT .FRM .RPAT>) + (<AND <G=? <LENGTH .FRM> 2> <TYPE? <2 .FRM> FIX>> + <BYTES-HACK .FRM .PAT <1 .FRM>>) + (<AND .ORF + <ASSIGNED? EX> + <NOT <CTMATCH .RPAT .FRM <> <> T>>> + <ORSORT <FORM OR .RPAT .FRM>>) + (<AND .ORF <NOT <CTMATCH .PAT .FRM <> <> T>>> + <ORSORT <FORM OR .PAT .FRM>>) + (ELSE + <SET TEM <ELETYPE .PAT .FRM .RPAT>> + <AND <ASSIGNED? EX> + <TYPE? .TEM FORM SEGMENT> + <G? <LENGTH .TEM> 1> + <==? <1 .TEM> OR> + <MAPR <> + <FUNCTION (EL) + <AND <=? <1 .EL> .EX> + <PUT .EL 1 .RPAT> + <MAPLEAVE>>> + <REST .TEM>>> + .TEM)>)>)>)>> + +" " + +<DEFINE BYTES-HACK (F1 F2 RPAT "AUX" FST TL TEM SEGF MLF1 MLF2) + #DECL ((F1 F2) <OR FORM SEGMENT> (MLF1 MLF2) FIX) + <SET SEGF <SEGANDOR .F1 .F2 .ORF>> + <COND (<OR <EMPTY? .F1> <EMPTY? .F2>> #FALSE (EMPTY-FORM-IN-DECL!-ERRORS))> + <SET FST + <COND (<TYPE? .RPAT ATOM> + <COND (<TYPE? <1 .F2> ATOM> <TYPMAT <1 .F2> .RPAT>) + (<TYPE? <1 .F2> FORM> <ACTORT <1 .F2> .RPAT>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>) + (<TYPE? .RPAT FORM> <ACTORT .RPAT <1 .F2>>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>> + <COND + (<NOT .FST> .FST) + (ELSE + <COND + (<CTMATCH .RPAT '<PRIMTYPE BYTES> <> <> <>> + <SET MLF1 <MINL .F1>> + <SET MLF2 <MINL .F2>> + <COND (<AND <G=? <LENGTH .F2> 2> <TYPE? <2 .F2> FIX>> + <COND (<CTMATCH <1 .F2> '<PRIMTYPE BYTES> <> <> <>> + <COND (.ORF + <COND (<==? <2 .F2> <2 .F1>> + <FOSE .SEGF .FST <2 .F1> <MIN .MLF1 .MLF2>>) + (ELSE <ORSORT <FORM OR .F1 .F2>>)>) + (<AND <==? <2 .F2> <2 .F1>> + <NOT <AND <TYPE? .F1 SEGMENT> + <TYPE? .F2 SEGMENT> + <N==? <2 .F1> <2 .F2>>>>> + <FOSE .SEGF .FST <2 .F1> <MAX .MLF1 .MLF2>>)>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>) + (<TMATCH .F2 '<PRIMTYPE BYTES>> + <COND (.ORF + <COND (<TMATCH .F2 + <SET TEM + <COND (<0? .MLF1> + <FOSE .SEGF + <1 .F1> + '[REST FIX]>) + (ELSE + <FOSE .SEGF + <1 .F1> + [.MLF1 FIX] + '[REST FIX]>)>>> + <TYPE-MERGE .TEM .F2>) + (ELSE <ORSORT <FORM .F1 .F2>>)>) + (<TMATCH .F2 + <COND (<0? .MLF1> + <FOSE .SEGF STRUCTURED '[REST FIX]>) + (ELSE + <FOSE .SEGF + STRUCTURED + [.MLF1 FIX] + '[REST FIX]>)>> + <FOSE .SEGF .FST <2 .F1> <MAX .MLF2 .MLF1>>)>) + (ELSE <COND (.ORF <ORSORT <FORM OR .F1 .F2>>) (ELSE <>)>)>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>)>> + +<DEFINE FOSE ("TUPLE" TUP "AUX" (FLG <1 .TUP>)) + <COND (.FLG <CHTYPE (!<REST .TUP>) SEGMENT>) + (ELSE <CHTYPE (!<REST .TUP>) FORM>)>> + +<DEFINE SEGANDOR (F1 F2 ORF) + <COND (.ORF <AND <TYPE? .F1 SEGMENT> <TYPE? .F2 SEGMENT>>) + (ELSE <OR <TYPE? .F1 SEGMENT> <TYPE? .F2 SEGMENT>>)>> + +<DEFINE WRDFX (F1 F2 RPAT "AUX" FST TL) + #DECL ((F1 F2) <OR FORM SEGMENT>) + <COND (<OR <EMPTY? <SET F1 <CHTYPE .F1 FORM>>> + <EMPTY? <SET F2 <CHTYPE .F2 FORM>>>> + #FALSE (EMPTY-FORM-IN-DECL!-ERRORS))> + <SET FST + <COND (<TYPE? .RPAT ATOM> + <COND (<TYPE? <1 .F2> ATOM> <TYPMAT <1 .F2> .RPAT>) + (<TYPE? <1 .F2> FORM> <ACTORT <1 .F2> .RPAT>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>) + (<TYPE? .RPAT FORM> <ACTORT .RPAT <1 .F2>>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>> + <COND + (<NOT .FST> .FST) + (ELSE + <COND (<CTMATCH .RPAT ,ALLWORDS <> <> <>> + <COND (<AND <LENGTH? .F2 2> <TYPE? <2 .F2> LIST>> + <COND (<CTMATCH <1 .F2> ,ALLWORDS <> <><>> + <COND (.ORF + <SET TL <MAP-MERGE !<2 .F1> !<2 .F2>>> + <COND (<EMPTY? .TL> .FST) + (ELSE <FORM .FST .TL>)>) + (<SET TL <AND-MERGE <2 .F1> <2 .F2>>> + <FORM .FST .TL>)>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>) + (ELSE <COND (.ORF <ORSORT <FORM OR .F1 .F2>>) (ELSE <>)>)>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>)>> + +<DEFINE MAP-MERGE ("TUPLE" PAIRS "AUX" (HIGH <2 .PAIRS>) (LOW <1 .PAIRS>)) + #DECL ((PAIRS) <TUPLE [REST FIX]> (HIGH LOW) FIX) + <REPEAT () + <COND (<EMPTY? <SET PAIRS <REST .PAIRS 2>>> <RETURN>)> + <SET HIGH <MAX .HIGH <2 .PAIRS>>> + <SET LOW <MIN .LOW <1 .PAIRS>>>> + <COND (<AND <==? .HIGH <CHTYPE <MIN> FIX>> + <==? .LOW <CHTYPE <MAX> FIX>>> + ()) + (ELSE (.LOW .HIGH))>> + + +<DEFINE AND-MERGE (L1 L2 "AUX" (FLG <>) HIGH LOW TEM (L (0)) (LL .L)) + #DECL ((L LL L1 L2) <LIST [REST FIX]> (HIGH LOW) FIX) + <COND (<G? <LENGTH .L1> <LENGTH .L2>> + <SET TEM .L1> + <SET L1 .L2> + <SET L2 .TEM>)> + <REPEAT () + <SET LOW <1 .L2>> + <SET HIGH <2 .L2>> + <REPEAT ((L1 .L1) LO HI) + #DECL ((L1) <LIST [REST FIX]> (LO HI) FIX) + <COND (<EMPTY? .L1> <RETURN>)> + <SET HI <2 .L1>> + <COND (<OR <AND <G=? <SET LO <1 .L1>> .LOW> + <L=? .LO .HIGH>> + <AND <L=? .HI .HIGH> <G=? .HI .LOW>> + <AND <G=? .LOW .LO> <L=? .LOW .HI>> + <AND <L=? .HIGH .HI> <G=? .HIGH .LO>>> + <SET LOW <MAX .LOW .LO>> + <SET HIGH <MIN .HIGH .HI>> + <SET L <REST <PUTREST .L (.LOW .HIGH)> 2>> + <SET FLG T> + <RETURN>)> + <SET L1 <REST .L1 2>>> + <COND (<EMPTY? <SET L2 <REST .L2 2>>> + <RETURN <COND (.FLG <REST .LL>) (ELSE <>)>>)>>> + +" " + +<DEFINE GET-RANGE (L1 "AUX" TT) + <COND (<AND <TYPE? .L1 FORM> + <TMATCH .L1 ,ALLWORDS> + <TYPE? <2 .L1> LIST>> + <COND (<NOT <EMPTY? <SET TT <MAP-MERGE !<2 .L1>>>>> .TT)>)>> + +" " + +<DEFINE ELETYPE (F1 F2 RTYP + "AUX" (S1 <VECTOR .F1 <> 0 <> <> '[]>) (FAIL <>) (INOPT <>) + (S2 <VECTOR .F2 <> 0 <> <> '[]>) (FL ()) (FP '<>) FSTL + SEGF RTEM) + #DECL ((S1 S2) <VECTOR <PRIMTYPE LIST> ANY FIX ANY ANY ANY> + (F1 F2) <PRIMTYPE LIST> (FP) <OR FORM SEGMENT> (FL) LIST) + <SET SEGF <SEGANDOR .F1 .F2 .ORF>> + <COND + (<OR <EMPTY? .F1> <EMPTY? .F2>> #FALSE (EMPTY-FORM-IN-DECL!-ERRORS)) + (<AND .ANDF .ORF <NOT <TMATCH <1 .F2> .RTYP>>> <ORSORT <FORM OR .F1 .F2>>) + (ELSE + <COND + (<SET FSTL + <COND (<TYPE? .RTYP ATOM> + <COND (<TYPE? <1 .F2> ATOM> <TYPMAT .RTYP <1 .F2>>) + (<TYPE? <1 .F2> FORM> <ACTORT <1 .F2> .RTYP>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>) + (<TYPE? .RTYP FORM> <ACTORT .RTYP <1 .F2>>) + (ELSE #FALSE (BAD-SYNTAX!-ERRORS))>> + <COND (.ANDF + <SET FL + <CHTYPE <SET FP + <COND (.SEGF <CHTYPE (.FSTL) SEGMENT>) + (ELSE <FORM .FSTL>)>> + LIST>>)> + <PUT .S1 ,DECL-RESTED <REST .F1>> + <PUT .S2 ,DECL-RESTED <REST .F2>> + <REPEAT ((TEM1 <>) (TEM2 <>) T1 T2 TEM TT) + #DECL ((TT) <VECTOR FIX ANY>) + <SET T1 <SET T2 <>>> + <COND + (<AND <OR <AND <SET TEM1 <NEXTP .S1>> <SET T1 <DECL-ELEMENT .S1>>> + <AND <EMPTY? .TEM1> <SET T1 ANY>>> + <OR <AND <SET TEM2 <NEXTP .S2>> <SET T2 <DECL-ELEMENT .S2>>> + <AND .TEM1 <EMPTY? .TEM2> <SET T2 ANY>>>> + <COND (<AND .ORF <OR <NOT .TEM1> <NOT .TEM2>>> + <RETURN <COND (<LENGTH? .FP 1> <1 .FP>) (ELSE .FP)>>)> + <OR <SET RTEM + <SET TEM + <COND (<NOT .TEM1> + <COND (<OR <TYPE? .F1 FORM> <DECL-IN-REST .S2>> + .T2) + (ELSE <SET FAIL T> <>)>) + (<NOT .TEM2> + <COND (<OR <TYPE? .F2 FORM> <DECL-IN-REST .S1>> + .T1) + (ELSE <SET FAIL T> <>)>) + (ELSE <DTMATCH .T1 .T2>)>>> + <COND (.ORF <SET TEM <ORSORT <FORM OR .T1 .T2>>>) + (.MAYBEF <COND (.FAIL <RETURN <>>) (ELSE <SET FAIL T>)>) + (ELSE <RETURN <>>)>> + <COND (<AND <NOT .INOPT> + <OR <AND .ORF + <OR <DECL-IN-COUNT-VEC .S1> + <DECL-IN-COUNT-VEC .S2>>> + <AND .ANDF + <NOT .ORF> + <DECL-IN-COUNT-VEC .S1> + <DECL-IN-COUNT-VEC .S2>>>> + <SET INOPT <COND (.ANDF (OPTIONAL .TEM)) (ELSE ())>>) + (<AND .INOPT .ANDF> + <PUTREST <REST .INOPT <- <LENGTH .INOPT> 1>> (.TEM)>)> + <COND (<AND .INOPT + <OR <AND .ORF + <OR <0? <DECL-ITEM-COUNT .S1>> + <0? <DECL-ITEM-COUNT .S2>>>> + <AND .ANDF + <0? <DECL-ITEM-COUNT .S1>> + <0? <DECL-ITEM-COUNT .S2>>>>> + <AND .ANDF <SET TEM [!.INOPT]>> + <SET INOPT <>>)> + <COND + (<OR <AND .ORF + <OR <AND <DECL-IN-REST .S1> <EMPTY? <DECL-RESTED .S2>>> + <AND <DECL-IN-REST .S2> <EMPTY? <DECL-RESTED .S1>>>>> + <AND <OR <DECL-IN-REST .S1> + <AND .ANDF <OR <NOT .TEM1> <DECL-IN-COUNT-VEC .S1>>>> + <OR <DECL-IN-REST .S2> + <AND .ANDF + <OR <NOT .TEM2> <DECL-IN-COUNT-VEC .S2>>>>>> + <COND + (<OR .ORF .ANDF> + <COND (<N==? 0 + <SET T1 + <RESTER? .S1 + .S2 + .FL + .RTEM + <TYPE? .F2 SEGMENT>>>> + <COND (<==? .T1 T> + <RETURN <COND (<LENGTH? .FP 1> <1 .FP>) + (ELSE .FP)>>) + (ELSE + <RETURN <COND (<AND <TYPE? .T1 FORM SEGMENT> + <LENGTH? .FP 1>> + <1 .T1>) + (ELSE .T1)>>)>) + (<N==? 0 + <SET T1 + <RESTER? .S2 + .S1 + .FL + .RTEM + <TYPE? .F1 SEGMENT>>>> + <COND (<==? .T1 T> + <RETURN <COND (<LENGTH? .FP 1> <1 .FP>) + (ELSE .FP)>>) + (ELSE + <RETURN <COND (<AND <TYPE? .T1 FORM SEGMENT> + <LENGTH? .FP 1>> + <1 .T1>) + (ELSE .T1)>>)>)>) + (ELSE <RETURN T>)>) + (<AND <NOT .ANDF> + <OR <DECL-IN-REST .S1> <NOT .TEM1>> + <OR <DECL-IN-REST .S2> <NOT .TEM2>>> + <RETURN T>)> + <COND (<AND <NOT .INOPT> + .ANDF + <OR <NOT .ORF> + <NOT <OR <DECL-IN-REST .S1> <DECL-IN-REST .S2>>>>> + <COND (<AND <TYPE? <1 .FL> VECTOR> + <=? <2 <SET TT <1 .FL>>> .TEM>> + <PUT .TT 1 <+ <1 .TT> 1>>) + (<AND <N==? <CHTYPE .FP LIST> .FL> <=? .TEM <1 .FL>>> + <PUT .FL 1 [2 .TEM]>) + (ELSE <SET FL <REST <PUTREST .FL (.TEM)>>>)>)>) + (ELSE + <COND (<AND <EMPTY? .TEM1> <EMPTY? <SET TEM1 .TEM2>>> + <COND (.ANDF + <RETURN <COND (<LENGTH? .FP 1> <1 .FP>) (ELSE .FP)>>) + (ELSE <RETURN T>)>) + (ELSE <RETURN .TEM1>)>)>>)>)>> + +" " + +<DEFINE RESTER? (S1 S2 FL FST SEGF + "AUX" (TT <DECL-REST-VEC .S1>) (TEM1 T) (TEM2 T) (OPTIT <>)) + #DECL ((S1 S2) <VECTOR ANY ANY ANY ANY ANY VECTOR> (FL) <LIST ANY> + (TT) VECTOR) + <COND (<AND <OR .ORF <DECL-IN-COUNT-VEC .S2>> + <EMPTY? <DECL-RESTED .S2>> <NOT <DECL-IN-REST .S2>>> + <SET OPTIT T>)> + <COND + (<AND .SEGF <NOT .ORF> <OR <NOT <DECL-IN-REST .S1>> + <NOT <DECL-IN-REST .S2>>>> T) + (<AND <NOT <EMPTY? .TT>> + <OR <NOT <DECL-IN-REST .S2>> <G=? <LENGTH .TT> + <LENGTH <REST <TOP <DECL-REST-VEC .S2>>>>>>> + <SET TT <REST <TOP .TT>>> + <MAPR <> + <FUNCTION (SO "AUX" T1) + #DECL ((SO) <VECTOR ANY>) + <SET T1 + <OR <AND <SET TEM1 <NEXTP .S2>> <DECL-ELEMENT .S2>> + <AND <EMPTY? .TEM1> + <COND (.ORF <MAPLEAVE>) (ELSE ANY)>>>> + <AND <OR .ORF <DECL-IN-COUNT-VEC .S2>> + <EMPTY? <DECL-RESTED .S2>> + <NOT <DECL-IN-REST .S2>> + <SET OPTIT T>> + <COND (<NOT .TEM1> <AND <EMPTY? .TEM1> <SET TEM1 T>>)> + <COND (.T1 + <PUT .SO + 1 + <SET TEM2 + <DTMATCH <AND <NEXTP .S1> + <DECL-ELEMENT .S1>> .T1>>>)> + <AND <OR <NOT .T1> <NOT .TEM2>> <MAPLEAVE>>> + <REST <SET TT [REST .FST !<REST .TT>]> 2>> + <COND (.OPTIT <PUT .TT 1 OPTIONAL>) + (ELSE <SET TT <UNIQUE-VECTOR-CHECK .TT>>)> + <COND (<AND .TEM1 .TEM2> <PUTREST .FL (.TT)> T) + (<AND <NOT .TEM1> <NOT <EMPTY? .TEM1>>> .TEM1) + (ELSE .TEM2)>) + (ELSE 0)>> + +<DEFINE UNIQUE-VECTOR-CHECK (V "AUX" (FRST <2 .V>)) + #DECL ((V) <VECTOR [2 ANY]>) + <COND (<MAPF <> + <FUNCTION (X) <COND (<N=? .X .FRST> <MAPLEAVE .V>)>> + <REST .V 2>>) + (ELSE [REST .FRST])>> + + +<DEFINE NEXTP (S "AUX" TEM TT N) + #DECL ((S) <VECTOR <PRIMTYPE LIST> ANY FIX ANY ANY ANY> (N) FIX + (TT) VECTOR) + <COND (<0? <DECL-ITEM-COUNT .S>> <PUT .S ,DECL-IN-COUNT-VEC <>>)> + <COND (<DECL-IN-REST .S> <NTHREST .S>) + (<NOT <0? <DECL-ITEM-COUNT .S>>> + <PUT .S ,DECL-ITEM-COUNT <- <DECL-ITEM-COUNT .S> 1>> + <NTHREST .S>) + (<EMPTY? <SET TEM <DECL-RESTED .S>>> <>) + (<TYPE? <1 .TEM> ATOM FORM SEGMENT> + <SET TEM <1 .TEM>> + <PUT .S ,DECL-RESTED <REST <DECL-RESTED .S>>> + <PUT .S ,DECL-ELEMENT .TEM>) + (<TYPE? <1 .TEM> VECTOR> + <SET TT <1 .TEM>> + <PUT .S ,DECL-RESTED <REST <DECL-RESTED .S>>> + <PUT .S ,DECL-REST-VEC <REST .TT>> + <COND (<G? <LENGTH .TT> 1> + <COND (<==? <1 .TT> REST> + <COND (<AND <==? <LENGTH .TT> 2> + <==? <2 .TT> ANY>> + <>) + (ELSE + <PUT .S ,DECL-IN-REST T> + <PUT .S + ,DECL-ELEMENT + <DECL-ELEMENT .TT>>)>) + (<OR <AND <TYPE? <1 .TT> FIX> <SET N <1 .TT>>> + <AND <MEMQ <1 .TT> '![OPT OPTIONAL!]> + <SET N 1>>> + <OR <TYPE? <1 .TT> FIX> + <PUT .S ,DECL-IN-COUNT-VEC T>> + <PUT .S + ,DECL-ITEM-COUNT + <- <* .N <- <LENGTH .TT> 1>> 1>> + <PUT .S ,DECL-ELEMENT <2 .TT>> + <COND (<L=? .N 0> <>) (ELSE .S)>) + (#FALSE (BAD-VECTOR-SYNTAX!-ERRORS))>) + (ELSE #FALSE (BAD-FORM-SYNTAX!-ERRORS))>) + (ELSE #FALSE (BAD-FORM-SYNTAX!-ERRORS))>> + +" " + +<DEFINE NTHREST (S "AUX" (TEM <REST <DECL-REST-VEC .S>>)) + #DECL ((S) <VECTOR ANY ANY ANY ANY ANY VECTOR> (TEM) VECTOR) + <COND (<EMPTY? .TEM> <SET TEM <REST <TOP .TEM>>>)> + <PUT .S ,DECL-REST-VEC .TEM> + <PUT .S ,DECL-ELEMENT <1 .TEM>>> +" " + +<DEFINE GET-ELE-TYPE (DCL2 NN + "OPTIONAL" (RST <>) (PT <>) + "AUX" (LN 0) (CNT 0) ITYP DC SDC DCL (N 0) DC1 (QOK <>) + (FMOK <>) STRU (GD '<>) (GP ()) (K 0) (DCL1 .DCL2) + (SEGF <>) TEM) + #DECL ((LN CNT K N) FIX (DCL) <PRIMTYPE LIST> (SDC DC) VECTOR + (GD) <OR FORM SEGMENT> (GP) LIST) + <PROG () + <COND (<AND .PT <SET TEM <ISTYPE? .DCL1>>> + <SET PT <TYPE-AND <GET-ELE-TYPE .TEM .NN> .PT>>)> + <AND <TYPE? .DCL1 ATOM> <SET DCL1 <GET .DCL1 DECL '.DCL1>>> + <COND (<TYPE? .DCL1 SEGMENT> <SET SEGF T>)> + <COND (<==? <STRUCTYP .DCL2> BYTES> + <RETURN <GET-ELE-BYTE .DCL2 .NN .RST .PT>>)> + <COND (.RST <SET STRU <COND (<STRUCTYP .DCL1>) (ELSE STRUCTURED)>>) + (.PT + <SET STRU + <COND (<ISTYPE? .DCL2>) + (<SET STRU <STRUCTYP .DCL1>> <FORM PRIMTYPE .STRU>) + (ELSE STRUCTURED)>>)> + <COND + (<AND <TYPE? .DCL1 FORM SEGMENT> + <SET DCL .DCL1> + <G? <SET LN <LENGTH .DCL>> 1> + <NOT <SET FMOK <MEMQ <1 .DCL> '![OR AND NOT!]>>> + <NOT <SET QOK <==? <1 .DCL> QUOTE>>> + <NOT <==? <1 .DCL> PRIMTYPE>>> + <COND + (<==? .NN ALL> + <AND .PT <SET GP <CHTYPE <SET GD <FOSE .SEGF .STRU>> LIST>>> + <OR + <AND <TYPE? <SET DC1 <2 .DCL>> VECTOR> + <SET DC .DC1> + <G=? <LENGTH .DC> 2> + <==? <1 .DC> REST> + <COND (<==? <LENGTH .DC> 2> + <COND (.RST <FORM .STRU [REST <2 .DC>]>) + (.PT <FORM .STRU [REST <TYPE-MERGE <2 .DC> .PT>]>) + (ELSE <2 .DC>)>) + (.RST <FORM .STRU [REST <TYPE-MERGE !<REST .DC>>]>) + (.PT + <FORM .STRU + [REST + <MAPF ,TYPE-MERGE + <FUNCTION (D) <TYPE-MERGE .D .PT>> + <REST .DC>>]>) + (ELSE <TYPE-MERGE !<REST .DC>>)>> + <REPEAT (TT (CK <DCX <SET TT <2 .DCL>>>) (D .DCL) TEM) + #DECL ((D) <PRIMTYPE LIST>) + <COND (<EMPTY? <SET D <REST .D>>> + <SET TEM + <OR .SEGF + <AND <TYPE? .TT VECTOR> <==? <1 .TT> REST>>>> + <RETURN <COND (.TEM + <COND (.RST <FORM .STRU [REST .CK]>) + (.PT .GD) + (ELSE .CK)>) + (.PT .GD) + (.RST .STRU) + (ELSE ANY)>>)> + <SET CK <TYPE-MERGE .CK <DCX <SET TT <1 .D>>>>> + <AND .PT + <SET GP + <REST + <PUTREST .GP + (<COND (<TYPE? .TT VECTOR> + [<1 .TT> + !<MAPF ,LIST + <FUNCTION (X) + <TYPE-MERGE .X .PT>> + <REST .TT>>]) + (ELSE + <TYPE-MERGE .PT .TT>)>)>>>>>>) + (ELSE + <SET N .NN> + <AND .PT <SET GP <CHTYPE <SET GD <FOSE .SEGF .STRU>> LIST>>> + <AND .RST <SET N <+ .N 1>>> + <COND (<EMPTY? <SET DCL <REST .DCL>>> + <RETURN <COND (.RST .STRU) + (.PT <FOSE .SEGF .STRU !<ANY-PAT <- .N 1>> .PT>) + (ELSE ANY)>>)> + <REPEAT () + <COND + (<NOT <0? .CNT>> + <COND + (<EMPTY? <SET SDC <REST .SDC>>> + <SET SDC <REST .DC>> + <AND + <0? <SET CNT <- .CNT 1>>> + <COND (<EMPTY? <SET DCL <REST .DCL>>> + <RETURN <COND (.RST .STRU) + (.PT + <PUTREST .GP (!<ANY-PAT <- .N 1>> .PT)> + .GD) + (ELSE ANY)>>) + (ELSE <AGAIN>)>>)> + <SET ITYP <1 .SDC>>) + (<TYPE? <1 .DCL> ATOM FORM SEGMENT> + <SET ITYP <1 .DCL>> + <SET DCL <REST .DCL>>) + (<TYPE? <SET DC1 <1 .DCL>> VECTOR> + <SET DC .DC1> + <COND + (<==? <1 .DC> REST> + <AND <OR <AND .RST <NOT <1? .N>>> .PT> + <==? 2 <LENGTH .DC>> + <=? <2 .DC> '<NOT ANY>> + <RETURN <>>> + <SET K <MOD <- .N 1> <- <LENGTH .DC> 1>>> + <SET N </ <- .N 1> <- <LENGTH .DC> 1>>> + <RETURN + <COND + (.RST + <FOSE .SEGF + .STRU + <COND (<0? .K> .DC) + (ELSE [REST <TYPE-MERGE !<REST .DC>>])>>) + (.PT + <PUTREST + .GP + (!<COND (<L=? .N 0> ()) + (<1? .N> (!<REST .DC>)) + (ELSE ([.N !<REST .DC>]))> + !<MAPF ,LIST + <FUNCTION (O) + <COND (<==? <SET K <- .K 1>> -1> .PT) + (ELSE .O)>> + <REST .DC>> + .DC)> + .GD) + (ELSE <NTH .DC <+ .K 2>>)>>) + (<OR <TYPE? <1 .DC> FIX> <==? <1 .DC> OPT> <==? <1 .DC> OPTIONAL>> + <SET CNT <COND (<TYPE? <1 .DC> FIX> <1 .DC>) (ELSE 1)>> + <SET SDC .DC> + <AGAIN>)>)> + <AND + <0? <SET N <- .N 1>>> + <RETURN + <COND + (.RST + <COND (<AND <EMPTY? .DCL> <0? .CNT>> .STRU) + (<FOSE .SEGF + .STRU + !<COND (<0? .CNT> (.ITYP !.DCL)) + (<N==? .SDC <REST .DC>> + <COND (<0? <SET CNT <- .CNT 1>>> + (!.SDC !<REST .DCL>)) + (ELSE + (!.SDC + [.CNT !<REST .DC>] + !<REST .DCL>))>) + (ELSE ([.CNT !.SDC] !<REST .DCL>))>>)>) + (.PT + <SET GP <REST <PUTREST .GP (.PT)>>> + <AND <ASSIGNED? SDC> <SET SDC <REST .SDC>>> + <COND (<AND <EMPTY? .DCL> <0? .CNT>> .GD) + (<PUTREST .GP + <COND (<OR <0? .CNT> + <AND <1? .CNT> <==? .SDC <REST .DC>>>> + .DCL) + (<==? .SDC <REST .DC>> + ([.CNT !<REST .DC>] !<REST .DCL>)) + (<L=? <SET CNT <- .CNT 1>> 0> + (!.SDC !<REST .DCL>)) + (ELSE + (!.SDC + [.CNT !<REST .DC>] + !<REST .DCL>))>> + .GD)>) + (ELSE .ITYP)>>> + <AND <OR .PT .RST> <=? .ITYP '<NOT ANY>> <RETURN <>>> + <AND .PT <SET GP <REST <PUTREST .GP (.ITYP)>>>> + <COND (<EMPTY? .DCL> + <RETURN <COND (.RST .STRU) + (.PT + <PUTREST .GP (!<ANY-PAT <- .N 1>> .PT)> + .GD) + (ELSE ANY)>>)>>)>) + (.QOK <SET DCL1 <GEN-DECL <2 .DCL>>> <AGAIN>) + (<AND .FMOK <==? <1 .FMOK> OR>> + <MAPF ,TYPE-MERGE + <FUNCTION (D "AUX" IT) + <COND (<SET IT <GET-ELE-TYPE .D .NN .RST .PT>> + <AND <==? .IT ANY> <MAPLEAVE ANY>> + .IT) + (ELSE <MAPRET>)>> + <REST .DCL>>) + (<AND .FMOK <==? <1 .FMOK> AND>> + <SET ITYP ANY> + <MAPF <> + <FUNCTION (D) + <SET ITYP <TYPE-OK? .ITYP <GET-ELE-TYPE .D .NN .RST>>>> + <REST .DCL>> + .ITYP) + (.RST <COND (<STRUCTYP .DCL1>) (ELSE STRUCTURED)>) + (.PT + <COND (<==? .NN ALL> .DCL1) + (ELSE <FOSE .SEGF .DCL1 !<ANY-PAT <- .NN 1>> .PT>)>) + (ELSE ANY)>>> + +" " + +<DEFINE GET-ELE-BYTE (DCL N RST PT "AUX" SIZ) + #DECL ((N) <OR ATOM FIX>) + <COND (.PT + <COND (<==? .N ALL> .DCL) + (<TYPE-AND .DCL <FORM STRUCTURED [.N FIX] [REST FIX]>>)>) + (.RST + <COND (<==? .N ALL> <SET N <MINL .DCL>>) + (<G? .N <MINL .DCL>> <SET N 0>) + (ELSE <SET N <- <MINL .DCL> .N>>)> + <COND (<SET SIZ <GETBSYZ .DCL>> <FORM BYTES .SIZ .N>) + (ELSE BYTES)>) + (ELSE FIX)>> + +<DEFINE GETBSYZ (DCL "AUX" TEM) + <COND (<==? <SET TEM <STRUCTYP .DCL>> STRING> 7) + (<AND <==? .TEM BYTES> <TYPE? .DCL FORM SEGMENT> <G=? <LENGTH .DCL> 2> + <TYPE? <SET TEM <2 .DCL>> FIX>> + .TEM)>> + +<DEFINE MINL (DCL "AUX" (N 0) DD D DC (LN 0) (QOK <>) (ANDOK <>) TT (OROK <>)) + #DECL ((N VALUE LN) FIX (DC) <PRIMTYPE LIST> (D) VECTOR) + <AND <TYPE? .DCL ATOM> <SET DCL <GET .DCL DECL '.DCL>>> + <COND + (<AND <TYPE? .DCL FORM SEGMENT> + <SET DC .DCL> + <G? <LENGTH .DC> 1> + <N==? <SET TT <1 .DC>> PRIMTYPE> + <NOT <SET OROK <==? .TT OR>>> + <NOT <SET QOK <==? .TT QUOTE>>> + <NOT <SET ANDOK <==? .TT AND>>> + <N==? .TT NOT>> + <SET DC <REST .DC>> + <COND (<AND <NOT <EMPTY? .DC>> <TYPE? <1 .DC> FIX>> + <OR <TMATCH .TT '<PRIMTYPE BYTES>> + <MESSAGE ERROR "BAD-DECL-SYNTAX" .DCL>> + <COND (<AND <==? <LENGTH .DC> 2> <TYPE? <2 .DC> FIX>> + <2 .DC>) + (ELSE 0)>) + (ELSE + <REPEAT () + #DECL ((VALUE) FIX) + <COND (<AND <TYPE? <SET DD <1 .DC>> VECTOR> + <SET D .DD> + <G? <LENGTH .D> 1>> + <COND (<MEMQ <1 .D> '[REST OPT OPTIONAL]> <RETURN .N>) + (<TYPE? <1 .D> FIX> + <SET LN <1 .D>> + <SET N <+ .N <* .LN <- <LENGTH .D> 1>>>>) + (ELSE <MESSAGE ERROR "BAD DECL " .DCL>)>) + (<TYPE? .DD ATOM FORM SEGMENT> <SET N <+ .N 1>>) + (ELSE <MESSAGE ERROR "BAD DECL " .DCL>)> + <AND <EMPTY? <SET DC <REST .DC>>> <RETURN .N>>>)>) + (<OR .OROK .ANDOK> <CHTYPE <MAPF <COND (.OROK ,MIN) (ELSE ,MAX)> ,MINL <REST .DC>> + FIX>) + (.QOK <COND (<STRUCTURED? <2 .DC>> <LENGTH <2 .DC>>) (ELSE 0)>) + (<TYPE? .DCL ATOM FALSE FORM SEGMENT> 0) + (ELSE <MESSAGE "BAD DECL " .DCL>)>> + +<DEFINE STRUCTYP (DCL) + <SET DCL <TYPE-AND .DCL STRUCTURED>> + <COND (<TYPE? .DCL ATOM> + <AND <VALID-TYPE? .DCL> <TYPEPRIM .DCL>>) + (<TYPE? .DCL FORM SEGMENT> + <COND (<PRIMHK .DCL T>) + (<TYPE? <1 .DCL> FORM> <PRIMHK <1 .DCL> <>>)>)>> + +<DEFINE PRIMHK (FRM FLG "AUX" TEM (LN <LENGTH .FRM>)) + #DECL ((FRM) <OR FORM SEGMENT> (LN) FIX) + <COND (<AND <==? .LN 2> + <COND (<==? <SET TEM <1 .FRM>> PRIMTYPE> + <AND <TYPE? <SET TEM <2 .FRM>> ATOM> + <VALID-TYPE? .TEM> + <STRUCTYP <2 .FRM>>>) + (<==? .TEM QUOTE> <PRIMTYPE <2 .FRM>>) + (<==? .TEM NOT> <>)>>) + (<NOT <0? .LN>> + <COND (<==? <SET TEM <1 .FRM>> OR> + <SET TEM NO-RETURN> + <MAPF <> + <FUNCTION (D) + <SET TEM <TYPE-MERGE <STRUCTYP .D> .TEM>>> <REST .FRM>> + <COND (<AND <TYPE? .TEM ATOM> <VALID-TYPE? .TEM>> .TEM)>) + (<==? .TEM AND> + <MAPF <> + <FUNCTION (D) + <COND (<SET TEM <STRUCTYP .D>> <MAPLEAVE>)>> + <REST .FRM>> + .TEM) + (<AND <TYPE? .TEM ATOM> <VALID-TYPE? .TEM>> + <TYPEPRIM .TEM>)>)>> + +" " + +<DEFINE TYPESAME (T1 T2) + <AND <SET T1 <ISTYPE? .T1>> + <==? .T1 <ISTYPE? .T2>>>> + +<DEFINE ISTYPE-GOOD? (TYP "OPTIONAL" (STRICT <>)) + <AND <SET TYP <ISTYPE? .TYP .STRICT>> + <NOT <MEMQ <TYPEPRIM .TYP> '![BYTES STRING LOCD TUPLE FRAME!]>> + .TYP>> + +<DEFINE TOP-TYPE (TYP "AUX" TT) + <COND (<AND <TYPE? .TYP ATOM> <NOT <VALID-TYPE? .TYP>> + <NOT <MEMQ .TYP '![STRUCTURED APPLICABLE ANY LOCATIVE]>>> + <SET TYP <GET .TYP DECL '.TYP>>)> + <COND (<TYPE? .TYP ATOM> .TYP) + (<AND <TYPE? .TYP FORM SEGMENT> <NOT <LENGTH? .TYP 1>>> + <COND (<==? <SET TT <1 .TYP>> OR> + <MAPF ,TYPE-MERGE ,TOP-TYPE <REST .TYP>>) + (<==? .TT NOT> ANY) + (<==? .TT QUOTE> <TYPE <2 .TYP>>) + (<==? .TT PRIMTYPE> .TYP) + (ELSE .TT)>)>> + +<DEFINE ISTYPE? (TYP "OPTIONAL" (STRICT <>) "AUX" TY) + <PROG () + <OR .STRICT <TYPE? .TYP ATOM> <SET TYP <TYPE-AND .TYP '<NOT + UNBOUND>>>> + <COND + (<TYPE? .TYP FORM SEGMENT> + <COND (<AND <==? <LENGTH .TYP> 2> <==? <1 .TYP> QUOTE>> + <SET TYP <TYPE <2 .TYP>>>) + (<==? <1 .TYP> OR> + <SET TYP <ISTYPE? <2 <SET TY .TYP>>>> + <MAPF <> + <FUNCTION (Z) + <COND (<N==? .TYP <ISTYPE? .Z>> + <MAPLEAVE <SET TYP <>>>)>> + <REST .TY 2>>) + (ELSE <SET TYP <1 .TYP>>)>)> + <AND <TYPE? .TYP ATOM> + <COND (<VALID-TYPE? .TYP> .TYP) + (<SET TYP <GET .TYP DECL>> <AGAIN>)>>>> + + +<DEFINE DCX (IT "AUX" TT LN) + #DECL ((TT) VECTOR (LN) FIX) + <COND (<AND <TYPE? .IT VECTOR> + <G=? <SET LN <LENGTH <SET TT .IT>>> 2> + <COND (<==? .LN 2> <2 .TT>) + (ELSE <TYPE-MERGE !<REST .TT>>)>>) + (ELSE .IT)>> + +"DETERMINE IF A TYPE PATTERN REQUIRES DEFERMENT 0=> NO 1=> YES 2=> DONT KNOW " + +" " + +<DEFINE DEFERN (PAT "AUX" STATE TEM) + #DECL ((STATE) FIX) + <PROG () + <COND + (<TYPE? .PAT ATOM> + <COND (<VALID-TYPE? .PAT> + <COND (<MEMQ <SET PAT <TYPEPRIM .PAT>> + '![STRING TUPLE LOCD FRAME BYTES!]> + 1) + (ELSE 0)>) + (<SET PAT <GET .PAT DECL>> <AGAIN>) + (ELSE 2)>) + (<AND <TYPE? .PAT FORM SEGMENT> <NOT <EMPTY? .PAT>>> + <COND (<==? <SET TEM <1 .PAT>> QUOTE> <DEFERN <TYPE <2 .PAT>>>) + (<==? .TEM PRIMTYPE> <DEFERN <2 .PAT>>) + (<AND <==? .TEM OR> <NOT <EMPTY? <REST .PAT>>>> + <SET STATE <DEFERN <2 .PAT>>> + <MAPF <> + <FUNCTION (P) + <OR <==? <DEFERN .P> .STATE> <SET STATE 2>>> + <REST .PAT 2>> + .STATE) + (<==? .TEM NOT> 2) + (<==? .TEM AND> + <SET STATE 2> + <MAPF <> + <FUNCTION (P) + <COND (<L? <SET STATE <DEFERN .P>> 2> + <MAPLEAVE>)>> + <REST .PAT>> + .STATE) + (ELSE <DEFERN <1 .PAT>>)>) + (ELSE 2)>>> + +" Define a decl for a given quoted object for maximum winnage." + +" " + +<DEFINE GEN-DECL (OBJ) + <COND + (<OR <MONAD? .OBJ> <APPLICABLE? .OBJ> <TYPE? .OBJ STRING>> <TYPE .OBJ>) + (<==? <PRIMTYPE .OBJ> BYTES> + <CHTYPE (<TYPE .OBJ> <BYTE-SIZE .OBJ> <LENGTH .OBJ>) SEGMENT>) + (ELSE + <REPEAT ((DC <GEN-DECL <1 .OBJ>>) (CNT 1) + (FRM <CHTYPE (<TYPE .OBJ>) SEGMENT>) (FRME .FRM) TT T1) + #DECL ((CNT) FIX (FRME) <<PRIMTYPE LIST> ANY>) + <COND (<EMPTY? <SET OBJ <REST .OBJ>>> + <COND (<G? .CNT 1> + <SET FRME <REST <PUTREST .FRME ([.CNT .DC])>>>) + (ELSE <SET FRME <REST <PUTREST .FRME (.DC)>>>)> + <RETURN .FRM>) + (<AND <=? <SET TT <GEN-DECL <1 .OBJ>>> .DC> .DC> + <SET CNT <+ .CNT 1>>) + (ELSE + <COND (<G? .CNT 1> + <SET FRME <REST <PUTREST .FRME ([.CNT .DC])>>>) + (ELSE <SET FRME <REST <PUTREST .FRME (.DC)>>>)> + <SET DC .TT> + <SET CNT 1>)>>)>> + +" " + +<DEFINE REST-DECL (DC N "AUX" TT TEM) + #DECL ((N) FIX) + <COND + (<TYPE? .DC FORM SEGMENT> + <COND + (<OR <==? <SET TT <1 .DC>> OR> <==? .TT AND>> + <SET TT + <CHTYPE (.TT + !<MAPF ,LIST + <FUNCTION (D "AUX" (IT <REST-DECL .D .N>)) + <COND (<==? .IT ANY> + <COND (<==? .TT OR> <MAPLEAVE (ANY)>) + (ELSE <MAPRET>)>) + (ELSE .IT)>> + <REST .DC>>) + FORM>> + <COND (<EMPTY? <REST .TT>> ANY) + (<EMPTY? <REST .TT 2>> <2 .TT>) + (ELSE .TT)>) + (<==? .TT NOT> ANY) + (<==? <STRUCTYP .DC> BYTES> + <COND (<==? .TT PRIMTYPE> + .DC) + (<==? <LENGTH .DC> 2> + <CHTYPE (!.DC .N) FORM>) + (<FORM .TT <2 .DC> <+ <CHTYPE <3 .DC> FIX> .N>>)>) + (<==? .TT PRIMTYPE> + <COND (<0? .N> .DC) + (ELSE <CHTYPE (.DC !<ANY-PAT .N>) FORM>)>) + (ELSE + <FOSE <TYPE? .DC SEGMENT> <COND (<SET TEM <STRUCTYP .TT>> <FORM PRIMTYPE .TEM>) + (ELSE STRUCTURED)> + !<ANY-PAT .N> + !<REST .DC>>)>) + (<SET TEM <STRUCTYP .DC>> + <COND (<OR <0? .N> + <==? .TEM BYTES>> <FORM PRIMTYPE .TEM>) + (ELSE <CHTYPE (<FORM PRIMTYPE .TEM> !<ANY-PAT .N>) FORM>)>) + (ELSE + <COND (<0? .N> STRUCTURED) + (ELSE <CHTYPE (STRUCTURED !<ANY-PAT .N>) FORM>)>)>> + +<DEFINE ANY-PAT (N) + #DECL ((N) FIX) + <COND (<L=? .N 0> ()) (<1? .N> (ANY)) (ELSE ([.N ANY]))>> + +" TYPE-OK? are two type patterns compatible. If the patterns + don't parse, send user a message." + +<DEFINE TYPE-OK? (P1 P2 "AUX" TEM) + <COND (<OR <==? .P1 NO-RETURN> <==? .P2 NO-RETURN>> NO-RETURN) + (<SET TEM <TYPE-AND .P1 .P2>> .TEM) + (<EMPTY? .TEM> .TEM) + (ELSE <MESSAGE ERROR " " <1 .TEM> " " .P1 " " .P2>)>> + +" TYPE-ATOM-OK? does an atom's initial value agree with its DECL?" + +<DEFINE TYPE-ATOM-OK? (P1 P2 ATM) + #DECL ((ATM) ATOM) + <OR <TYPE-OK? .P1 .P2> + <MESSAGE ERROR "TYPE MISUSE " .ATM>>> + +" Merge a group of type specs into an OR." + +" " + +<DEFINE TYPE-MERGE ("TUPLE" TYPS) + #DECL ((TYPS) TUPLE (FTYP) FORM (LN) FIX) + <COND (<EMPTY? .TYPS> <>) + (ELSE + <REPEAT ((ORS <1 .TYPS>)) + <COND (<EMPTY? <SET TYPS <REST .TYPS>>> <RETURN .ORS>)> + <SET ORS + <COND (<==? <1 .TYPS> NO-RETURN> .ORS) + (<==? .ORS NO-RETURN> <1 .TYPS>) + (ELSE <TMERGE .ORS <1 .TYPS>>)>>>)>> + +<DEFINE PUT-IN (LST ELE) + #DECL ((LST) <PRIMTYPE LIST> (VALUE) LIST) + <COND (<AND <TYPE? .ELE FORM SEGMENT> + <NOT <EMPTY? .ELE>> + <==? <1 .ELE> OR>> + <SET ELE <LIST !<REST .ELE>>>) + (ELSE <SET ELE (.ELE)>)> + <SET LST + <MAPF ,LIST + <FUNCTION (L1 "AUX" TT) + <COND (<EMPTY? .ELE> .L1) + (<REPEAT ((A .ELE) B) + #DECL ((A B) LIST) + <COND (<TMATCH <1 .A> .L1> + <SET TT <TMERGE <1 .A> .L1>> + <COND (<==? .A .ELE> <SET ELE <REST .ELE>>) + (ELSE <PUTREST .B <REST .A>>)> + <RETURN T>)> + <AND <EMPTY? <SET A <REST <SET B .A>>>> + <RETURN <>>>> + .TT) + (ELSE .L1)>> + .LST>> + <LSORT <COND (<EMPTY? .ELE> .LST) + (ELSE <PUTREST <REST .ELE <- <LENGTH .ELE> 1>> .LST> .ELE)>>> + +<DEFINE ORSORT (F) #DECL ((F) <FORM ANY ANY>) <PUTREST .F <LSORT <REST .F>>>> + +<DEFINE LSORT (L "AUX" (M ()) (B ()) (TMP ()) (IT ()) (N 0) A1 A2) + #DECL ((L M B TMP IT VALUE) LIST (N) FIX (CMPRSN) <OR FALSE APPLICABLE>) + <PROG () + <COND (<L? <SET N <LENGTH .L>> 2> <RETURN .L>)> + <SET B <REST <SET TMP <REST .L <- </ .N 2> 1>>>>> + <PUTREST .TMP ()> + <SET L <LSORT .L>> + <SET B <LSORT .B>> + <SET TMP ()> + <REPEAT () + <COND (<EMPTY? .L> + <COND (<EMPTY? .TMP> <RETURN .B>) + (ELSE <PUTREST .TMP .B> <RETURN .M>)>) + (<EMPTY? .B> + <COND (<EMPTY? .TMP> <RETURN .L>) + (ELSE <PUTREST .TMP .L> <RETURN .M>)>) + (ELSE + <SET A1 <1 .L>> + <SET A2 <1 .B>> + <COND (<COND (<AND <TYPE? .A1 ATOM> <TYPE? .A2 ATOM>> + <L? <STRCOMP .A1 .A2> 0>) + (<TYPE? .A1 ATOM> T) + (<TYPE? .A2 ATOM> <>) + (ELSE <FCOMPARE .A1 .A2>)> + <SET L <REST <SET IT .L>>>) + (ELSE <SET B <REST <SET IT .B>>>)> + <PUTREST .IT ()> + <COND (<EMPTY? .M> <SET M <SET TMP .IT>>) + (ELSE <SET TMP <REST <PUTREST .TMP .IT>>>)>)>>>> +" " + +<DEFINE FCOMPARE (F1 F2 "AUX" (L1 <LENGTH .F1>) (L2 <LENGTH .F2>)) + #DECL ((F1 F2) <PRIMTYPE LIST> (L1 L2) FIX) + <COND (<==? .L1 .L2> + <L? <STRCOMP <UNPARSE .F1> <UNPARSE .F2>> 0>) + (<L? .L1 .L2>)>> + + +<DEFINE CANONICAL-DECL (D) + <SET D <VTS .D>> + <COND (<AND <TYPE? .D FORM SEGMENT> <NOT <EMPTY? .D>>> + <COND (<==? <1 .D> OR> + <ORSORT <FORM OR !<CAN-ELE <REST .D>>>>) + (<==? <1 .D> QUOTE> <CANONICAL-DECL <GEN-DECL <2 .D>>>) + (ELSE <CAN-ELE .D>)>) + (ELSE .D)>> + + +<DEFINE CAN-ELE (L "AUX" (SAME <>) SAMCNT TT TEM) + #DECL ((L) <PRIMTYPE LIST> (SAMCNT) FIX) + <CHTYPE + (<CANONICAL-DECL <1 .L>> + !<MAPR ,LIST + <FUNCTION (EL "AUX" (ELE <1 .EL>) (LAST <EMPTY? <REST .EL>>)) + <COND + (<TYPE? .ELE VECTOR> + <COND + (<AND <==? <LENGTH .ELE> 2> <TYPE? <1 .ELE> FIX>> + <SET TT <CANONICAL-DECL <2 .ELE>>> + <COND (<AND .SAME <=? .SAME .TT>> + <SET SAMCNT <+ .SAMCNT <1 .ELE>>> + <COND (.LAST [.SAMCNT .TT]) (ELSE <MAPRET>)>) + (ELSE + <COND (.SAME <SET TEM <GR-RET .SAME .SAMCNT>>) + (ELSE <SET TEM <>>)> + <SET SAME .TT> + <SET SAMCNT <1 .ELE>> + <COND (.LAST + <COND (.TEM <MAPRET .TEM <GR-RET .TT .SAMCNT>>) + (ELSE <GR-RET .TT .SAMCNT>)>) + (.TEM) + (ELSE <MAPRET>)>)>) + (<AND <==? <1 .ELE> REST> + <==? <LENGTH .ELE> 2> + <==? <2 .ELE> ANY>> + <COND (.SAME + <SET TEM <GR-RET .SAME .SAMCNT>> + <SET SAME <>> + <MAPRET .TEM>) + (ELSE <MAPRET>)>) + (ELSE + <COND (.SAME <SET TEM <GR-RET .SAME .SAMCNT>>) + (ELSE <SET TEM <>>)> + <SET TT <IVECTOR <LENGTH .ELE>>> + <PUT .TT 1 <COND (<==? <1 .ELE> OPT> OPTIONAL) (ELSE <1 .ELE>)>> + <MAPR <> + <FUNCTION (X Y) <PUT .X 1 <CANONICAL-DECL <1 .Y>>>> + <REST .TT> + <REST .ELE>> + <SET SAME <>> + <COND (.TEM <MAPRET .TEM .TT>) (ELSE .TT)>)>) + (ELSE + <SET ELE <CANONICAL-DECL .ELE>> + <COND (<AND .SAME <=? .SAME .ELE>> + <SET SAMCNT <+ .SAMCNT 1>> + <COND (.LAST <GR-RET .ELE .SAMCNT>) (ELSE <MAPRET>)>) + (ELSE + <COND (.SAME <SET TEM <GR-RET .SAME .SAMCNT>>) + (ELSE <SET TEM <>>)> + <SET SAME .ELE> + <SET SAMCNT 1> + <COND (.LAST <COND (.TEM <MAPRET .TEM .ELE>) (ELSE .ELE)>) + (.TEM) + (ELSE <MAPRET>)>)>)>> + <REST .L>>) + FORM>> + +<DEFINE GR-RET (X N) #DECL ((N) FIX) + <COND (<1? .N> .X)(ELSE [.N .X])>> + +<ENDPACKAGE> diff --git a/<mdl.comp>/cleanac.mud.2 b/<mdl.comp>/cleanac.mud.2 new file mode 100644 index 0000000..80d22a6 --- /dev/null +++ b/<mdl.comp>/cleanac.mud.2 @@ -0,0 +1,45 @@ +<PACKAGE "NEWREP"> + +<ENTRY PROG-REP-GEN RETURN-GEN AGAIN-GEN TAG-GEN GO-GEN CLEANUP-STATE + AGAIN-UP RETURN-UP PROG-START-AC> + +<USE "CODGEN" "COMCOD" "CACS" "CHKDCL" "COMPDEC" "CUP"> + +<DEFINE CLEAN-AC (AC "AUX" ACRES INAC OAC) + #DECL ((AC) AC (INAC) DATUM) + <COND + (<SET ACRES <ACRESIDUE .AC>> + <PUT .AC ,ACRESIDUE <>> + <MAPF <> + <FUNCTION (SYM) + <COND + (<TYPE? .SYM SYMTAB> + <MAPF <> + <FUNCTION (SYMT) + <COND (<N==? .SYMT .SYM> + <COND (<OR <NOT <TYPE? .SYMT SYMTAB>> + <STORED .SYMT>> + <SMASH-INACS .SYMT <>>) + (ELSE <STOREV .SYMT T>)>)>> + .ACRES> + <COND + (<AND <SET INAC <INACS .SYM>> + <OR <AND <==? <DATTYP .INAC> .AC> + <TYPE? <SET OAC <DATVAL .INAC>> AC>> + <AND <==? <DATVAL .INAC> .AC> + <TYPE? <SET OAC <DATTYP .INAC>> AC>>>> + <MAPF <> + <FUNCTION (SYMT) + <COND (<N==? .SYMT .SYM> + <COND (<OR <NOT <TYPE? .SYMT SYMTAB>> + <STORED .SYMT>> + <SMASH-INACS .SYMT <>>) + (ELSE <STOREV .SYMT T>)>)>> + <ACRESIDUE .OAC>> + <PUT .OAC ,ACRESIDUE (.SYM)>)> + <PUT .AC ,ACRESIDUE (.SYM)> + <MAPLEAVE <1 <ACRESIDUE .AC>>>) + (ELSE <SMASH-INACS .SYM <>> <>)>> + .ACRES>)>> + +<ENDPACKAGE> diff --git a/<mdl.comp>/codgen.mud.8 b/<mdl.comp>/codgen.mud.8 new file mode 100644 index 0000000..c7c216e --- /dev/null +++ b/<mdl.comp>/codgen.mud.8 @@ -0,0 +1,2192 @@ +<PACKAGE "CODGEN"> + +<ENTRY GEN CODE-GEN STB SEQ-GEN MERGE-STATES FRMS LVAL-UP GOOD-TUPLE + UPDATE-WHERE NSLOTS NTSLOTS STFIXIT STK GET-TMPS PRE + STACK:L NO-KILL DELAY-KILL BSTB TOT-SPEC BASEF AC-HACK BINDUP SPECD LADDR + ADD:STACK GENERATORS GOODACS FRMID RES-FLS STORE-SET TRUE-FALSE ACFIX + SUBR-GEN BIND-CODE SPEC-LIST BTP NPRUNE REG? ARG? ARGS-TO-ACS> + +<USE "CACS" "CHKDCL" "COMCOD" "COMPDEC" "STRGEN" "MAPGEN" "MMQGEN" "BUILDL" "BITSGEN" + "LNQGEN" "ISTRUC" "CARGEN" "NOTGEN" "COMSUB" "BITTST" "CBACK" "ALLR" + "CUP" "SUBRTY" "NEWREP" "CPRINT" "INFCMP" "CASE" "SPCGEN"> + +<SETG FUDGE <>> + +;"DISABLE FUNNY COND./BOOL FEATURE" + +" This file contains the major general codde generators. These include + variable access functions (LVAL, SETG etc.), FSUBRs (COND, AND, REPEAT) + and a few assorted others." + +" All generators are called with a node and a destination for the + result. The destinations are either DATUMs (lists of ACs or types) + or the special atoms DONT-CARE or FLUSHED. Generators for + SUBRs that can be predicates may have additional arguments when they + are being invoked for their branching effect." + +" The atom STK always points to a list that specifies the model + of the TP stack." + +" Main generator, dispatches to specific code generators. " + +<SETG OTBSAV + <PROG (TEM) + <COND (<AND <SET TEM <LOOKUP "OTBSAV" <GET MUDDLE OBLIST>>> + <GASSIGNED? .TEM>> + ,.TEM) + (ELSE <SQUOTA |OTBSAV >)>>> + +<GDECL (OTBSAV) FIX> + +<DEFINE GEN (NOD WHERE "AUX" TEMP) + #DECL ((NOD) NODE (WHERE) <OR ATOM DATUM>) + <SET TEMP <APPLY <NTH ,GENERATORS <NODE-TYPE .NOD>> .NOD .WHERE>> + <OR <ASSIGNED? NPRUNE> <PUT .NOD ,KIDS ()>> + .TEMP> + +" Generate a sequence of nodes flushing all values except the ladt." + +<DEFINE SEQ-GEN (L WHERE "OPTIONAL" (INPROG <>) (SINPROG <>) (INCODE-GEN <>)) + #DECL ((L) <LIST [REST NODE]> (WHERE) <OR ATOM DATUM>) + <MAPR <> + <FUNCTION (N "AUX" (ND <1 .N>)) + #DECL ((N) <LIST NODE> (ND) NODE) + <COND (<AND .INPROG + <==? <NODE-TYPE .ND> ,QUOTE-CODE> + <==? <RESULT-TYPE .ND> ATOM> + <OR <NOT <EMPTY? <REST .N>>> + <ISTAG? <NODE-NAME .ND>>>> + <MESSAGE WARNING " TAG SEEN IN PROG/REPEAT " .ND> + <REGSTO T> + <LABEL:TAG <UNIQUE:TAG <NODE-NAME .ND> T>> + <COND (<EMPTY? <REST .N>> + <SET WHERE + <GEN .ND + <COND (<TYPE? .WHERE DATUM> <DATUM !.WHERE>) + (ELSE .WHERE)>>>)>) + (<EMPTY? <REST .N>> + <SET WHERE + <GEN .ND + <COND (<AND .INPROG <TYPE? .WHERE DATUM>> + <DATUM !.WHERE>) + (ELSE .WHERE)>>>) + (ELSE <RET-TMP-AC <GEN .ND FLUSHED>>)>> + .L> + <COND (<AND <NOT .INPROG> <NOT .INCODE-GEN>> <VAR-STORE>)> + .WHERE> + +" The main code generation entry (called from CDRIVE). Sets up initial + stack model, calls to generate code for the bindings and generates code for + the function's body." + +<DEFINE CODE-GEN (BASEF + "AUX" (TOT-SPEC 0) (NTSLOTS (<FORM GVAL <TMPLS .BASEF>>)) + (IDT 0) XX (STB (0)) (STK (0 !.STB)) (PRE <>) (FRMID 1) + BTP (FRMS (1 .STK .BASEF 0 .NTSLOTS)) (BSTB .STB) + (SPECD <>) + (TMPS <COND (<ACTIVATED .BASEF> (2)) (ELSE (0))>) + START:TAG (AC-HACK <ACS .BASEF>) (K <KIDS .BASEF>) + (CD <>) + (DEST + <COND (<ACTIVATED .BASEF> <FUNCTION:VALUE>) + (ELSE <GOODACS .BASEF <FUNCTION:VALUE>>)>) + (ATAG <MAKE:TAG "AGAIN">) (RTAG <MAKE:TAG "EXIT">) + (SPEC-LIST ()) (RET <>) (NO-KILL ()) (KILL-LIST ())) + #DECL ((TOT-SPEC IDT) <SPECIAL FIX> (BASEF) <SPECIAL NODE> + (SPEC-LIST KILL-LIST STK BSTB NTSLOTS) <SPECIAL LIST> + (PRE SPECD) <SPECIAL ANY> (FRMID TMPS) <SPECIAL ANY> + (START:TAG) <SPECIAL ATOM> (AC-HACK) <SPECIAL <PRIMTYPE LIST>> + (FRMS NO-KILL) <SPECIAL LIST> (K) <LIST [REST NODE]> (BTP) LIST + (CD) <OR DATUM FALSE>) + <BEGIN-FRAME <TMPLS .BASEF> + <ACTIVATED .BASEF> + <PRE-ALLOC .BASEF>> + <PUT .BASEF ,STK-B .STB> + <BIND-CODE .BASEF .AC-HACK> + <VAR-STORE> + <LABEL:TAG .ATAG> + <SET SPEC-LIST (.BASEF .SPECD <SPECS-START .BASEF>)> + <SET STK (0 !<SET BTP .STK!>)> + <COND (.AC-HACK <EMIT '<INTGO!-OP!-PACKAGE>>)> + <PUT .BASEF ,ATAG .ATAG> + <PUT .BASEF ,RTAG .RTAG> + <PUT .BASEF ,BTP-B .BTP> + <PUT .BASEF ,DST .DEST> + <PUT .BASEF ,PRE-ALLOC .PRE> + <PUT .BASEF ,SPCS-X .SPECD> + <COND (<N==? <SET CD + <SEQ-GEN .K + <COND (<TYPE? .DEST DATUM> <DATUM !.DEST>) + (ELSE .DEST)> + <> + <> + T>> + ,NO-DATUM> + <SET RET T> + <ACFIX .DEST .CD>) + (ELSE <SET CD <CDST .BASEF>>)> + <COND (<AND <TYPE? .DEST DATUM> + .CD + <ISTYPE? <DATTYP .DEST>> + <TYPE? <DATTYP .CD> AC>> + <RET-TMP-AC <DATTYP .CD> .CD>)> + <COND (<AND .RET .AC-HACK> + <UNBIND:LOCS .STK .STB <=? .AC-HACK '(FUNNY-STACK)>>)> + <LABEL:TAG .RTAG> + <COND (.CD + <AND <TYPE? <DATTYP .DEST> AC> + <FIX-ACLINK <DATTYP .DEST> .DEST .CD>> + <AND <TYPE? <DATVAL .DEST> AC> + <FIX-ACLINK <DATVAL .DEST> .DEST .CD>>)> + <MAPF <> + <FUNCTION (AC) + #DECL ((AC) AC) + <MAPF <> + <FUNCTION (ITEM) + <COND (<TYPE? .ITEM SYMTAB> + <PUT .ITEM ,STORED T>)>> + <ACRESIDUE .AC>>> + ,ALLACS> + <SET XX <RET-TMP-AC <MOVE:ARG .DEST <FUNCTION:VALUE>>>> + <END-FRAME> + .XX> + + +" Update ACs with respect to their datums." + +<DEFINE ACFIX (OLD1 NEW1 "AUX" OLD NEW) + #DECL ((OLD NEW) DATUM) + <COND (<TYPE? .OLD1 DATUM> + <SET NEW .NEW1> + <SET OLD .OLD1> + <COND (<==? <DATTYP .OLD> ANY-AC> + <PUT .OLD ,DATTYP <DATTYP .NEW>>)> + <COND (<==? <DATVAL .OLD> ANY-AC> + <PUT .OLD ,DATVAL <DATVAL .NEW>>)>)> + T> + +" Generate code for setting up and binding agruments." + +<DEFINE BIND-CODE (NOD + "OPTIONAL" (FLG <>) + "AUX" (BST <BINDING-STRUCTURE .NOD>) B (NPRUNE T) + (NSLOTS <SSLOTS .NOD>) (TSLOTS <TMPLS .NOD>) (LARG <>) + INAME GOOD-OPTS + (SFLG + <AND .FLG <MEMBER .FLG '![(STACK) (FUNNY-STACK)!]>>) + (STB <STK-B .NOD>)) + #DECL ((NOD) NODE (BST B) <LIST [REST SYMTAB]> (NPRUNE) <SPECIAL ANY> + (NSLOTS) <SPECIAL FIX> (TSLOTS) ATOM (INAME) <UVECTOR [REST ATOM]> + (FRMS) <LIST [5 ANY]> (TOT-SPEC) FIX (BASEF) NODE) + <AND <ACTIVATED .NOD> <ACT:INITIAL> <ADD:STACK 2>> + <OR .PRE .FLG <PROG () + <SALLOC:SLOTS .TSLOTS> + <ADD:STACK .TSLOTS>>> + <AND .FLG <SET INAME <NODE-NAME .NOD>>> + <COND + (<AND .SFLG <L? <TOTARGS .NOD> 0>> + <EMIT <INSTRUCTION INTERNAL-ENTRY!-OP!-PACKAGE <1 .INAME> -1>> + <EMIT '<`SUBM `M* `(P) >> + <ADD:STACK PSTACK> + <ADD:STACK 4> + <PUT .FRMS 2 <SET BSTB <SET STB <SET STK (0 !.STK)>>>> + <TUPLE1-B <1 .BST>> + <PUT <1 .BST> ,POTLV <>> + <SET BST <REST .BST>>) + (.SFLG + <SET GOOD-OPTS + <OPT-CHECK <REST .BST <REQARGS .NOD>> + <- <TOTARGS .NOD> <REQARGS .NOD>> + .INAME>> + <ADD:STACK <* 2 <TOTARGS .NOD>>> + <SET TMPS <STACK:L .STK .STB>> + <ADD:STACK .TSLOTS> + <REPEAT ((I (.TSLOTS 0)) (TG <MAKE:TAG>) (TRG <TOTARGS .NOD>) (OPS 0) + (OSTK .STK)) + #DECL ((TG) ATOM (OPS TRG) FIX (STK OSTK) LIST) + <EMIT <INSTRUCTION INTERNAL-ENTRY!-OP!-PACKAGE <1 .INAME> .TRG>> + <SET STK (0 !.STK)> + <EMIT '<`SUBM `M* `(P) >> + <SALLOC:SLOTS <2 .I>> + <ALLOC:SLOTS <1 .I>> + <SET B .BST> + <REPEAT ((TRG .TRG) (OPS .OPS) SYM T1) + #DECL ((TRG OPS) FIX (SYM) SYMTAB (T1) ADDRESS:C) + <COND (<EMPTY? .B> <RETURN>) (ELSE <SET SYM <1 .B>>)> + <PUT .SYM ,POTLV <>> + <COND (<OR <==? <CODE-SYM .SYM> 7> + <==? <CODE-SYM .SYM> 8> + <==? <CODE-SYM .SYM> 9>> + <TUPCHK <INIT-SYM .SYM> T>)> + <COND + (<NOT <0? .TRG>> + <AND + <SPEC-SYM .SYM> + <PUSH:BIND + <NAME-SYM .SYM> + <DATUM + <COND (<=? .AC-HACK '(FUNNY-STACK)> + <SET T1 + <ADDRESS:C <- -3 + <* 2 + <- <TOTARGS .NOD> + <ARGNUM-SYM .SYM>>>> + `(FRM) >>) + (<SET T1 + <ADDRESS:C <FORM - + <* 2 <ARGNUM-SYM .SYM>> + !<STACK:L .STK .BSTB> + 3> + `(TP) >>)> + .T1> + <DECL-SYM .SYM>> + <ADD:STACK 6> + <VAR-STORE> + <BIND:END> + <SET SPECD T> + <SET TOT-SPEC <+ .TOT-SPEC 6>>> + <SET TRG <- .TRG 1>>) + (<NOT <0? .OPS>> + <COND (<L=? <CODE-SYM .SYM> 7> + <COND (<SPEC-SYM .SYM> <AUX1-B .SYM>) + (ELSE <GEN <INIT-SYM .SYM> <LADDR .SYM T <>>>)>) + (ELSE + <COND (<SPEC-SYM .SYM> <AUX2-B .SYM>) + (ELSE + <MOVE:ARG <REFERENCE:UNBOUND> <LADDR .SYM T <>>>)>)> + <VAR-STORE> + <SET OPS <- .OPS 1>>) + (ELSE <RETURN>)> + <AND <OR .GOOD-OPTS <1? <LENGTH .INAME>>> + <SPEC-SYM .SYM> + <PUT .SYM ,ARGNUM-SYM <TMPLS .BASEF>>> + <SET B <REST .B>>> + <PUT .I 2 <+ <CHTYPE <2 .I> FIX> 2>> + <SET TRG <- .TRG 1>> + <SET OPS <+ .OPS 1>> + <COND (<OR .GOOD-OPTS <EMPTY? <SET INAME <REST .INAME>>>> + <LABEL:TAG .TG> + <SET BST .B> + <RETURN>) + (ELSE <SET STK .OSTK> <BRANCH:TAG .TG>)>> + <SET LARG T>) + (.FLG <LABEL:TAG <1 .INAME>> <EMIT '<`SUBM `M* `(P) >>)> + <REPEAT ((COD 0) SYM) + #DECL ((COD) FIX (SYM) SYMTAB) + <COND (<EMPTY? .BST> + <COND (<AND .FLG + <NOT .LARG> + <COND (.SPECD <VAR-STORE> <BIND:END> T) (ELSE T)>> + <SALLOC:SLOTS .TSLOTS> + <SET TMPS <STACK:L .STK .STB>> + <ADD:STACK .TSLOTS>)> + <OR .PRE + <0? .NSLOTS> + <PROG () + <COND (<G? .NSLOTS 0> + <SALLOC:SLOTS <- .NSLOTS .TOT-SPEC>> + <ADD:STACK <- .NSLOTS .TOT-SPEC>>)> + <SET PRE T> + <EMIT-PRE T>>> + <AND <ACTIVATED .NOD> <ACT:FINAL>> + <RETURN>)> + <SET COD <CODE-SYM <SET SYM <1 .BST>>>> + <PUT .SYM ,POTLV <>> + <COND (<L? .COD 0> + <PUT .SYM ,CODE-SYM <SET COD <- .COD>>> + <COND (<G? .NSLOTS 0> + <SALLOC:SLOTS <- .NSLOTS .TOT-SPEC>> + <ADD:STACK <- .NSLOTS .TOT-SPEC>>)> + <SET PRE T> + <EMIT-PRE T>)> + <COND (<AND .FLG + <NOT .LARG> + <0? <NTH '![0 0 0 0 1 0 0 0 0 1 0 1 1!] .COD>> + <SET LARG T> + <COND (.SPECD <VAR-STORE> <BIND:END> T) (ELSE T)>> + <SET TMPS <STACK:L .STK .STB>> + <SALLOC:SLOTS .TSLOTS> + <ADD:STACK .TSLOTS>)> + <APPLY <NTH ,BINDERS .COD> .SYM> + <OR .PRE <PUT .SYM ,SPEC-SYM FUDGE>> + <SET BST <REST .BST>>> + .TOT-SPEC> + +<DEFINE OPT-CHECK (B NUM LBLS "AUX" (N .NUM) (RQ <REQARGS .BASEF>) NOD S) + #DECL ((B) <LIST [REST SYMTAB]> (N NUM RQ) FIX (LBLS) <UVECTOR [REST ATOM]> + (NOD BASEF) NODE (S) SYMTAB) + <COND + (<AND + <NOT <0? .NUM>> + <MAPF <> + <FUNCTION (S) + #DECL ((S) SYMTAB) + <PUT .S ,POTLV <>> + <COND (<L? <SET N <- .N 1>> 0> <MAPLEAVE>)> + <COND (<AND <OR <==? <CODE-SYM .S> 6> <==? <CODE-SYM .S> 7>> + <NOT <MEMQ <NODE-TYPE <CHTYPE <INIT-SYM .S> NODE>> ,SNODES>>> + <MAPLEAVE <>>) + (ELSE T)>> + .B>> + <REPEAT (ADDR OFFS) + #DECL ((OFFS) FIX) + <SET S <1 .B>> + <SET B <REST .B>> + <EMIT <INSTRUCTION INTERNAL-ENTRY!-OP!-PACKAGE + <NTH .LBLS <+ .NUM 1>> + .RQ>> + <COND (<OR <==? <CODE-SYM .S> 6> <==? <CODE-SYM .S> 7>> + <COND (<==? <NODE-TYPE <SET NOD <INIT-SYM .S>>> ,LVAL-CODE> + <SET OFFS <* <- .RQ + <ARGNUM-SYM <CHTYPE <NODE-NAME .NOD> SYMTAB>>> 2>> + <SET ADDR <ADDRESS:C <- -1 .OFFS> `(TP) >> + <SET ADDR <DATUM .ADDR .ADDR>>) + (ELSE <SET ADDR <GEN .NOD DONT-CARE>>)>) + (ELSE <SET ADDR <REFERENCE:UNBOUND>>)> + <STACK:ARGUMENT .ADDR> + <COND (<L=? <SET NUM <- .NUM 1>> 0> <RETURN>)> + <SET RQ <+ .RQ 1>>>)>> + +" Generate \"BIND\" binding code." + +<DEFINE BIND-B (SYM) #DECL ((SYM) SYMTAB) <BINDUP .SYM <MAKE:ENV>>> + +" Do code generation for normal arguments." + +<DEFINE NORM-B (SYM) + #DECL ((SYM) SYMTAB (AC-HACK) <PRIMTYPE LIST>) + <COND (.AC-HACK + <BINDUP .SYM <DATUM !<NTH .AC-HACK <ARGNUM-SYM .SYM>>> <>>) + (<TYPE? <ADDR-SYM .SYM> DATUM>) + (ELSE <BINDUP .SYM <REFERENCE:ARG <ARGNUM-SYM .SYM>>>)>> + +" Initialized optional argument binder." + +<DEFINE OPT1-B (SYM) + #DECL ((SYM) SYMTAB) + <TUPCHK <INIT-SYM .SYM>> + <OPTBIND .SYM <INIT-SYM .SYM>>> + +" Uninitialized optional argument binder." + +<DEFINE OPT2-B (SYM) #DECL ((SYM) SYMTAB) <OPTBIND .SYM>> + +" Create a binding either by pushing or moving if slots PRE created." + +<DEFINE BINDUP (SYM SRC "OPTIONAL" (SPCB T)) + #DECL ((SYM) SYMTAB (SRC) DATUM (TOT-SPEC) FIX) + <COND (<SPEC-SYM .SYM> + <SET SPECD T> + <COND (.PRE + <PUT .SYM ,ADDR-SYM <- <CHTYPE <ADDR-SYM .SYM> FIX> .TOT-SPEC>> + <STORE:BIND .SYM .SRC>) + (ELSE + <PUSH:BIND <NAME-SYM .SYM> .SRC <DECL-SYM .SYM>> + <SET TOT-SPEC <+ .TOT-SPEC 6>> + <ADD:STACK 6> + <AND .SPCB <VAR-STORE> <BIND:END>>)>) + (ELSE <CLOB:PAIR .SYM .PRE .SRC>)> + <RET-TMP-AC .SRC>> + +" Push or store a non special argument." + +<DEFINE CLOB:PAIR (SYM PRE SRC) + #DECL ((SYM) SYMTAB (SRC) DATUM (TOT-SPEC) FIX) + <COND (.PRE + <PUT .SYM ,ADDR-SYM <- <CHTYPE <ADDR-SYM .SYM> FIX> .TOT-SPEC>> + <STORE:PAIR .SYM .SRC>) + (ELSE <PUSH:PAIR .SRC> <ADD:STACK 2>)>> + +" Create a binding for either intitialized or unitialized optional." + +<DEFINE OPTBIND (SYM + "OPTIONAL" DVAL + "AUX" (GIVE <MAKE:TAG>) (DEF <MAKE:TAG>) DV (LPRE .PRE)) + #DECL ((SYM) SYMTAB (BASEF DVAL) NODE (GIVE DEF) ATOM (DV) DATUM (TOT-SPEC) FIX) + <COND (<SPEC-SYM .SYM> + <SET SPECD T> + <OR .LPRE <PUSH:ATB <NAME-SYM .SYM>>>)> + <TEST:ARG <ARGNUM-SYM .SYM> .DEF> + <COND + (.LPRE + <COND + (<SPEC-SYM .SYM> + <MOVE:ARG <REFERENCE:ARG <ARGNUM-SYM .SYM>> + <FUNCTION:VALUE>>) + (ELSE + <MOVE:ARG + <REFERENCE:ARG <ARGNUM-SYM .SYM>> + <REFERENCE:STACK + (<ADDR-SYM .SYM> + <COND (<TYPE? <ARGNUM-SYM .SYM> ATOM> + <FORM GVAL <ARGNUM-SYM .SYM>>) + (ELSE 0)>)>>)>) + (ELSE <PUSH:PAIR <REFERENCE:ARG <ARGNUM-SYM .SYM>>>)> + <BRANCH:TAG .GIVE> + <LABEL:TAG .DEF> + <SET DV + <COND (<ASSIGNED? DVAL> + <GEN .DVAL <COND (.LPRE <FUNCTION:VALUE>) (ELSE DONT-CARE)>>) + (ELSE <REFERENCE:UNBOUND>)>> + <AND <OR <NOT .LPRE> <NOT <SPEC-SYM .SYM>>> + <CLOB:PAIR .SYM .LPRE .DV>> + <LABEL:TAG .GIVE> + <AND <SPEC-SYM .SYM> + <COND (.LPRE <STORE:BIND .SYM .DV>) + (ELSE + <PUSH:PAIR <REFERENCE <DECL-SYM .SYM>>> + <ADD:STACK 4> + <VAR-STORE> + <BIND:END>)>> + <VAR-STORE> + <COND (<AND <NOT .LPRE> <SPEC-SYM .SYM>> + <SET TOT-SPEC <+ .TOT-SPEC 6>>)> + <RET-TMP-AC .DV>> + +" Do a binding for a named activation." + +<DEFINE ACT-B (SYM) + #DECL ((SYM) SYMTAB) + <AND <ASSIGNED? START:TAG> <BINDUP .SYM <MAKE:ACT>>>> + +" Bind an \"AUX\" variable." + +<DEFINE AUX1-B (SYM "AUX" TT TEM TY) + #DECL ((SYM) SYMTAB (TT) DATUM (FCN) NODE (TOT-SPEC) FIX) + <PUT .SYM ,POTLV <>> + <TUPCHK <INIT-SYM .SYM>> + <COND + (<AND <NOT .PRE> <SPEC-SYM .SYM>> + <PUSH:ATB <NAME-SYM .SYM>> + <ADD:STACK 2> + <PUSH:PAIR <SET TT <GEN <INIT-SYM .SYM> DONT-CARE>>> + <PUSH:PAIR <REFERENCE <DECL-SYM .SYM>>> + <SET SPECD T> + <ADD:STACK 4> + <VAR-STORE> + <BIND:END> + <SET TOT-SPEC <+ .TOT-SPEC 6>> + <RET-TMP-AC .TT>) + (<TYPE? <ADDR-SYM .SYM> TEMPV> + <SET TY <CREATE-TMP <SET TEM <ISTYPE-GOOD? <1 <DECL-SYM .SYM>>>>>> + <PUT .SYM + ,ADDR-SYM + <CHTYPE (.BSTB + .TY + <COND (<=? .AC-HACK '(FUNNY-STACK)> <* <TOTARGS .FCN> -2>) + (ELSE 0)> + !.TMPS) + TEMPV>> + <SET TT + <GEN + <INIT-SYM .SYM> + <DATUM <COND (<OR <ISTYPE-GOOD? <RESULT-TYPE <INIT-SYM .SYM>>> .TEM>) + (ELSE ANY-AC)> + ANY-AC>>> + <SMASH-INACS .SYM .TT> + <PUT .SYM ,STORED <>> + <PUT <SET TEM <CHTYPE <DATVAL .TT> AC>> ,ACRESIDUE (.SYM !<ACRESIDUE .TEM>)> + <COND (<TYPE? <SET TEM <DATTYP .TT>> AC> + <PUT .TEM ,ACRESIDUE (.SYM !<ACRESIDUE .TEM>)>)> + <RET-TMP-AC .TT>) + (ELSE <BINDUP .SYM <GEN <INIT-SYM .SYM> DONT-CARE>>)>> + +" Do a binding for an uninitialized \"AUX\" " + +<DEFINE AUX2-B (SYM "AUX" ADR TY) + #DECL ((SYM) SYMTAB (FCN) NODE) + <PUT .SYM ,POTLV <>> + <TUPCHK <INIT-SYM .SYM>> + <COND (<TYPE? <ADDR-SYM .SYM> TEMPV> + <SET TY <CREATE-TMP <ISTYPE-GOOD? <1 <DECL-SYM .SYM>>>>> + <COND (<ISTYPE-GOOD? <1 <DECL-SYM .SYM>>> + <PUT .SYM ,INIT-SYM T>)> + <PUT .SYM + ,ADDR-SYM + <CHTYPE (.BSTB + .TY + <COND (<=? .AC-HACK '(FUNNY-STACK)> + <* <TOTARGS .FCN> -2>) + (ELSE 0)> + !.TMPS) + TEMPV>>) + (<AND <SET TY <ISTYPE-GOOD? <1 <DECL-SYM .SYM>>>> + <NOT <ASS? .SYM>> + <NOT <SPEC-SYM .SYM>>> + <SET ADR <ADDRESS:PAIR <FORM TYPE-WORD!-OP!-PACKAGE .TY> '[0]>> + <PUT .SYM ,INIT-SYM T> + <BINDUP .SYM <DATUM .ADR .ADR>>) + (ELSE <BINDUP .SYM <REFERENCE:UNBOUND>>)>> + +<DEFINE TUPCHK (TUP "OPTIONAL" (OPT <>) "AUX" (NS .NSLOTS) (TS .TOT-SPEC)) + #DECL ((TUP) <OR FALSE NODE> (NS TS) FIX) + <OR .PRE + <COND (<AND <TYPE? .TUP NODE> + <OR <==? <NODE-NAME .TUP> ITUPLE> + <==? <NODE-NAME .TUP> TUPLE>>> + <COND (<OR .OPT + <==? <NODE-TYPE .TUP> ,ISTRUC-CODE> + <NOT <GOOD-TUPLE .TUP>>> + <COND (<G? .NS 0> + <SALLOC:SLOTS <- .NS .TS>> + <ADD:STACK <- .NS .TS>>)> + <EMIT-PRE <SET PRE T>>)>)>>> + +<DEFINE GOOD-TUPLE (TUP "AUX" (K <KIDS .TUP>) NT (WD 0)) + #DECL ((NT) FIX (TUP) NODE (K) <LIST [REST NODE]>) + <AND <NOT <==? <NODE-TYPE .TUP> ,ISTRUC-CODE>> + <COND (<==? <NODE-SUBR .TUP> ,ITUPLE> + <AND <==? <NODE-TYPE <1 .K>> ,QUOTE-CODE> + <OR <==? <SET NT <NODE-TYPE <2 .K>>> ,QUOTE-CODE> + <==? .NT ,FLVAL-CODE> + <==? .NT ,FGVAL-CODE> + <==? .NT ,GVAL-CODE> + <==? .NT ,LVAL-CODE>> + <* <NODE-NAME <1 .K>> 2>>) + (ELSE + <MAPF <> + <FUNCTION (K) + <COND (<==? <NODE-TYPE .K> ,SEGMENT-CODE> + <MAPLEAVE <>>) + (ELSE <SET WD <+ .WD 2>>)>> + .K>)>>> + +" Do a \"TUPLE\" binding." + +<DEFINE TUPLE1-B (SYM) + #DECL ((SYM) SYMTAB) + <EMIT '<`PUSH `P* `A >> + <EMIT '<`PUSHJ `P* |MAKTU2 >> + <COND (<SPEC-SYM .SYM> + <EMIT '<`POP `TP* `B >> + <EMIT '<`POP `TP* `A >> + <BINDUP .SYM <FUNCTION:VALUE T>>)>> + +<DEFINE TUPL-B (SYM "AUX" (SK <* 2 <- <ARGNUM-SYM .SYM> 1>>)) + #DECL ((SYM) SYMTAB (SK) FIX) + <EMIT '<`MOVE `B* `AB >> + <OR <L=? .SK 0> + <EMIT <INSTRUCTION `ADD `B* [<FORM .SK (.SK)>]>>> + <EMIT '<`HLRZ `A* |OTBSAV `(TB) >> + <EMIT '<`HRLI `A* <TYPE-CODE!-OP!-PACKAGE TUPLE>>> + <BINDUP .SYM <FUNCTION:VALUE T>>> + +" Generate the code to actually build a TUPLE." + +<DEFINE BUILD:TUPLE (NUM "AUX" (STAG <MAKE:TAG>) (ETAG <MAKE:TAG>)) + #DECL ((NUM) FIX (STAG ETAG) ATOM) + <COPY:ARGPNTR> + <AND <NOT <1? .NUM>> <BUMP:ARGPNTR <- .NUM 1>>> + <LABEL:TAG .STAG> + <TEST:ARGPNTR .ETAG> + <STACK:ARGUMENT <REFERENCE:ARGPNTR>> + <BUMP:ARGPNTR> + <BUMP:CNTR> + <BRANCH:TAG .STAG> + <LABEL:TAG .ETAG> + <TUPLE:FINAL>> + +" Dispatch table for binding generation code." + +<SETG BINDERS + ![,ACT-B ,AUX1-B ,AUX2-B ,TUPL-B ,NORM-B ,OPT1-B ,OPT1-B ,OPT2-B ,OPT2-B + ,NORM-B ,BIND-B ,NORM-B ,NORM-B!]> + +<DEFINE MENTROPY (N R) T> + +<COND (<GASSIGNED? NOTIMP> + <SETG MBINDERS + [,ACT-B + ,AUX1-B + ,AUX2-B + ,NOTIMP + ,MENTROPY + ,MOPTG + ,MOPTG + ,MOPTG2 + ,MOPTG2 + ,MENTROPY + ,BIND-B + ,MENTROPY + ,MENTROPY]>)> + +" Appliacation of a form could still be an NTH." + +<DEFINE FORM-F-GEN (NOD WHERE "AUX" (K <KIDS .NOD>) TY) + #DECL ((NOD) NODE) + <COND (<==? <ISTYPE? <SET TY <RESULT-TYPE <1 .K>>>> FIX> + <PUT .NOD ,NODE-NAME INTH> + <PUT .NOD ,NODE-TYPE <NODE-SUBR .NOD>> + <PUT .NOD ,NODE-SUBR ,NTH> + <COND (<OR <==? <NODE-TYPE .NOD> ,ALL-REST-CODE> + <==? <NODE-TYPE .NOD> ,NTH-CODE>> + <SET K (<2 .K> <1 .K>)>)> + <PUT .NOD ,KIDS .K> + <GEN .NOD .WHERE>) + (.TY <FORM-GEN .NOD .WHERE>) + (ELSE + <MESSAGE ERROR + " NON APPLICABLE OBJECT " + <NODE-NAME .NOD> + .NOD>)>> + +" Generate a call to EVAL for uncompilable FORM." + +<DEFINE FORM-GEN (NOD WHERE "AUX" (SSTK .STK) TEM (STK (0 !.STK))) + #DECL ((NOD) NODE (WHERE) <OR ATOM DATUM> (TEM) DATUM + (STK) <SPECIAL LIST> (SSTK) LIST) + <RET-TMP-AC <STACK:ARGUMENT <REFERENCE <NODE-NAME .NOD>>>> + <ADD:STACK 2> + <REGSTO T> + <SET TEM <FUNCTION:VALUE T>> + <SUBR:CALL EVAL 1> + <SET STK .SSTK> + <MOVE:ARG .TEM .WHERE>> + +" Generate code for LIST/VECTOR etc. evaluation." + +<GDECL (COPIERS) <UVECTOR [REST ATOM]>> + +<DEFINE COPY-GEN (NOD WHERE + "AUX" GT RES (I 0) (ARGS <KIDS .NOD>) (UNK <>) + (TYP <ISTYPE? <RESULT-TYPE .NOD>>) + (INAME + <NTH + '[|IILIST |CIVEC |CIUVEC TUPLE] + <LENGTH <CHTYPE <MEMQ .TYP ,COPIERS> UVECTOR>>>)) + #DECL ((GT) <OR FALSE FIX> (NOD) NODE (WHERE) <OR ATOM DATUM> + (ARGS) <LIST [REST NODE]> (I) FIX (VALUE RES) DATUM) + <PROG ((STK (0 !.STK))) + #DECL ((STK) <SPECIAL LIST>) + <COND + (<REPEAT () + <AND <EMPTY? .ARGS> <RETURN>> + <COND (<==? <NODE-TYPE <1 .ARGS>> ,SEGMENT-CODE> + <RET-TMP-AC <GEN <1 <KIDS <1 .ARGS>>> <FUNCTION:VALUE>>> + <COND (<AND <==? <NODE-NAME .NOD> LIST> + <EMPTY? <REST .ARGS>>> + <REGSTO T> + <SEGMENT:LIST .I .UNK> + <SET RES <FUNCTION:VALUE T>> + <RETURN <>>) + (ELSE + <REGSTO T> + <SEGMENT:STACK </ <STACKS .NOD> 2> .UNK> + <ADD:STACK <- <STACKS .NOD>>> + <ADD:STACK PSTACK> + <SET UNK T>)>) + (ELSE + <RET-TMP-AC <STACK:ARGUMENT <GEN <1 .ARGS> DONT-CARE>>> + <ADD:STACK 2> + <SET I <+ .I 1>>)> + <SET ARGS <REST .ARGS>>> + <REGSTO T> + <SET RES <FUNCTION:VALUE T>> + <COND (.UNK + <AND <NOT <==? .INAME TUPLE>> + <EMIT <INSTRUCTION `POP + `P* + <COND (<==? .INAME TUPLE> `D ) + (ELSE `A )>>>>) + (ELSE + <EMIT <INSTRUCTION `MOVEI + <COND (<==? .INAME TUPLE> `D* ) (ELSE `A* )> + <COND (<==? .INAME TUPLE> <+ .I .I>) + (ELSE .I)>>>)> + <COND (<==? .INAME TUPLE> + <COND (.UNK + <EMIT <INSTRUCTION `MOVE `D* `(P) >> + <EMIT <INSTRUCTION `ASH `D* 1>>)> + <EMIT <INSTRUCTION `PUSHJ `P* |MAKTUP >>) + (ELSE <EMIT <INSTRUCTION `PUSHJ `P* .INAME>>)>)>> + <COND (<==? .INAME TUPLE> + <COND (<SET GT <GOOD-TUPLE .NOD>> <ADD:STACK <+ 2 .GT>>) + (ELSE <EMIT <INSTRUCTION `AOS `(P) >> <ADD:STACK PSTACK>)>)> + <MOVE:ARG .RES .WHERE>> + +<SETG COPIERS ![TUPLE UVECTOR VECTOR LIST!]> + +"Generate code for a call to a SUBR." + +<DEFINE SUBR-GEN (NOD WHERE) + #DECL ((WHERE) <OR ATOM DATUM> (NOD) NODE) + <COMP:SUBR:CALL <NODE-NAME .NOD> + <KIDS .NOD> + <STACKS .NOD> + .WHERE>> + +" Compile call to a SUBR that doesn't compile or PUSHJ." + +<DEFINE COMP:SUBR:CALL (SUBR OBJ STA W + "AUX" RES (I 0) (UNK <>) (OS .STK) (STK (0 !.STK))) + #DECL ((STA I) FIX (OBJ) <LIST [REST NODE]> (UNK) <OR FALSE ATOM> + (STK) <SPECIAL LIST> (OS) LIST (RES) DATUM) + <MAPF <> + <FUNCTION (OB) + #DECL ((OB) NODE (I STA) FIX) + <COND (<==? <NODE-TYPE .OB> ,SEGMENT-CODE> + <RET-TMP-AC <GEN <1 <KIDS .OB>> <FUNCTION:VALUE>>> + <REGSTO T> + <SEGMENT:STACK </ .STA 2> .UNK> + <ADD:STACK <- .STA>> + <ADD:STACK PSTACK> + <SET UNK T>) + (ELSE + <RET-TMP-AC <STACK:ARGUMENT <GEN .OB DONT-CARE>>> + <ADD:STACK 2> + <SET I <+ .I 1>>)>> + .OBJ> + <REGSTO T> + <SET RES <FUNCTION:VALUE T>> + <COND (.UNK <SEGMENT:FINAL .SUBR>) + (ELSE <SUBR:CALL .SUBR .I>)> + <SET STK .OS> + <MOVE:ARG .RES .W>> + + +<GDECL (SUBRS TEMPLATES) UVECTOR> + +<DEFINE GET-TMPS (SUB "AUX" (LS <MEMQ .SUB ,SUBRS>)) + #DECL ((VALUE) <LIST ANY ANY> (LS) <OR FALSE UVECTOR>) + <COND (.LS <NTH ,TEMPLATES <LENGTH .LS>>) + (ELSE '(ANY ANY))>> + +" Generate calls to SUBRs using the internal PUSHJ feature." + +<DEFINE ISUBR-GEN (NOD WHERE + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" (TMPL <GET-TMPS <NODE-SUBR .NOD>>) W (SDIR .DIR) B2 + (OS .STK) (STK (0 !.STK)) W2 (TP <4 .TMPL>)) + #DECL ((NOD) NODE (WHERE W2) <OR ATOM DATUM> (W) DATUM + (TMPL) <LIST ANY ANY ANY ANY ANY ANY> (UNK) <OR FALSE ATOM> + (STA ARGS) FIX (STK) <SPECIAL LIST> (OS) LIST) + <AND .NOTF <SET DIR <NOT .DIR>>> + <COND (<==? <NODE-NAME .NOD> INTH> <SET TP (<2 <CHTYPE .TP LIST>> + <1 <CHTYPE .TP LIST>>)>)> + <COND (<=? .TP STACK> <STACK-ARGS .NOD T>) + (<NOT <AC-ARGS .NOD .TP>> <AC-SEG-CALL .TP>)> + <REGSTO T> + <EMIT <INSTRUCTION `PUSHJ `P* <6 .TMPL>>> + <SET STK .OS> + <COND (<AND .BRANCH <5 .TMPL>> + <COND (<==? .WHERE FLUSHED> + <COND (.DIR <EMIT '<`SKIPA >> <BRANCH:TAG .BRANCH>) + (ELSE <BRANCH:TAG .BRANCH>)>) + (ELSE + <COND (.DIR <BRANCH:TAG <SET B2 <MAKE:TAG>>>) + (<OR .NOTF + <NOT <OR <==? .WHERE DONT-CARE> + <AND <TYPE? .WHERE DATUM> + <SET W .WHERE> + <==? <LENGTH .W> 2> + <OR <==? <DATTYP .W> ANY-AC> + <==? <DATTYP .W> ,AC-A>> + <OR <==? <DATVAL .W> ANY-AC> + <==? <DATVAL .W> ,AC-B>>>>>> + <EMIT '<`SKIPA >> + <BRANCH:TAG <SET B2 <MAKE:TAG>>>)> + <SET WHERE + <MOVE:ARG <COND (.NOTF <REFERENCE .SDIR>) + (ELSE <FUNCTION:VALUE T>)> + .WHERE>> + <BRANCH:TAG .BRANCH> + <COND (<ASSIGNED? B2> <LABEL:TAG .B2>)> + .WHERE)>) + (.BRANCH + <OR <==? .WHERE FLUSHED> <SET DIR <NOT .DIR>>> + <D:B:TAG <COND (<==? .WHERE FLUSHED> .BRANCH) + (ELSE <SET B2 <MAKE:TAG>>)> + <FUNCTION:VALUE> + .DIR + <RESULT-TYPE .NOD>> + <SET W2 + <MOVE:ARG <COND (.NOTF <REFERENCE .SDIR>) + (ELSE <FUNCTION:VALUE T>)> + .WHERE>> + <COND (<N==? .WHERE FLUSHED> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2>)> + .W2) + (<5 .TMPL> + <GEN:FALSE> + <MOVE:ARG <FUNCTION:VALUE T> .WHERE>) + (ELSE <MOVE:ARG <FUNCTION:VALUE T> .WHERE>)>> + +<DEFINE STACK-ARGS (NOD PASN + "AUX" (UNK <>) (ARGS 0) (STA <STACKS .NOD>) N + (K <KIDS .NOD>)) + #DECL ((NOD N) NODE (ARGS STA) FIX (K) <LIST [REST NODE]>) + <REPEAT () + <AND <EMPTY? .K> <RETURN>> + <COND (<==? <NODE-TYPE <SET N <1 .K>>> ,SEGMENT-CODE> + <RET-TMP-AC <GEN <1 <KIDS .N>> <FUNCTION:VALUE>>> + <REGSTO T> + <SEGMENT:STACK </ .STA 2> .UNK> + <ADD:STACK <- .STA>> + <ADD:STACK PSTACK> + <SET UNK T>) + (ELSE + <RET-TMP-AC <STACK:ARGUMENT <GEN .N DONT-CARE>>> + <ADD:STACK 2> + <SET ARGS <+ .ARGS 1>>)> + <SET K <REST .K>>> + <REGSTO T> + <COND (.UNK <EMIT '<`POP `P* `A >>) + (.PASN <EMIT <INSTRUCTION `MOVEI `A* .ARGS>>)> + <COND (<NOT .UNK> .ARGS)>> + +" Get a bunch of goodies into ACs for a PUSHJ call." + +<DEFINE AC-ARGS (NOD ACTMP "AUX" WHS) + #DECL ((WHS) <LIST [REST DATUM]> (NOD) NODE (ACTMP) LIST) + <COND + (<SEGS .NOD> <STACK-ARGS .NOD <>>) + (<SET WHS + <MAPR ,LIST + <FUNCTION (NL WL + "AUX" (N <1 .NL>) (W <1 .WL>) (SD <SIDES <REST .NL>>) + (RT <ISTYPE-GOOD? <DATTYP .W>>)) + #DECL ((N) NODE (W) <OR DATUM LIST> (RT) <OR ATOM FALSE>) + <SET W + <GEN .N + <COND (<==? <NODE-TYPE .N> ,QUOTE-CODE> DONT-CARE) + (.SD + <DATUM <COND (<ISTYPE-GOOD? <RESULT-TYPE .N>>) + (ELSE ANY-AC)> + ANY-AC>) + (ELSE <DATUM !.W>)>>> + <AND .SD <REGSTO <>>> + <COND (.RT <DATTYP-FLUSH .W> <PUT .W ,DATTYP .RT>)> + .W> + <KIDS .NOD> + .ACTMP>> + <SET WHS + <MAPF ,LIST + <FUNCTION (W1 W2) + #DECL ((W1) DATUM (W2) LIST) + <MOVE:ARG .W1 <DATUM !.W2>>> + .WHS + .ACTMP>> + <MAPF <> ,RET-TMP-AC .WHS> + T)>> + +<DEFINE SIDES (L) + #DECL ((L) <LIST [REST NODE]>) + <MAPF <> + <FUNCTION (N) + <COND (<==? <NODE-TYPE .N> ,QUOTE-CODE> <>) + (<OR <==? <NODE-TYPE .N> ,ISUBR-CODE> + <MEMQ ALL <SIDE-EFFECTS .N>>> + <MAPLEAVE T>)>> + .L>> + +" Generate code for a call to an RSUBR (maybe PUSHJ)." + +<DEFINE RSUBR-GEN (N W + "AUX" (IT <NODE-NAME .N>) ACST RN KNWN (OS .STK) + (STK (0 !.STK))) + #DECL ((N RN) NODE (W) <OR ATOM DATUM> (STK) <SPECIAL LIST> (OS) LIST) + <MAPF <> + <FUNCTION (ARG) + #DECL ((ARG) NODE) + <OR <RESULT-TYPE .ARG> + <==? <NODE-TYPE .ARG> ,SEGMENT-CODE> + <MESSAGE ERROR "BAD ARG TO " <NODE-NAME .N> .ARG>>> + <KIDS .N>> + <COND (<AND <TYPE? <NODE-SUBR .N> FUNCTION> + <SET ACST <ACS <SET RN <GET .IT .IND>>>> + <OR <ASSIGNED? GROUP-NAME> <==? .FCN .RN>>> + <COND (<OR <=? .ACST '(STACK)> <=? .ACST '(FUNNY-STACK)>> + <SET KNWN <STACK-ARGS .N <>>> + <REGSTO T> + <SET STK .OS> + <STACK-CALL <REQARGS .RN> + <TOTARGS .RN> + <NODE-NAME .RN> + .KNWN <>>) + (ELSE + <OR <AC-ARGS .N .ACST> <AC-SEG-CALL .ACST>> + <REGSTO T> + <SET STK .OS> + <EMIT <INSTRUCTION `PUSHJ `P* <1 <CHTYPE <NODE-NAME .RN> + UVECTOR>>>>)> + <MOVE:ARG <FUNCTION:VALUE T> .W>) + (ELSE <SUBR-GEN .N .W>)>> + +" Generate a call to an internal compiled goodies using a PUSHJ." + +<DEFINE IRSUBR-GEN (NOD WHERE + "AUX" KNWN (N <NODE-SUBR .NOD>) (AN <2 .N>) (OS .STK) + (STK (0 !.STK))) + #DECL ((NOD) NODE (WHERE) <OR ATOM DATUM> (STK) <SPECIAL LIST> (OS) LIST + (N) <IRSUBR ANY <LIST [REST FIX]>> (AN) <LIST [REST FIX]>) + <REGSTO T> + <SET KNWN <STACK-ARGS .NOD <>>> + <STACK-CALL <MIN !.AN> + <MAX !.AN> + '![!] + .KNWN + <NODE-NAME .NOD>> + <MOVE:ARG <FUNCTION:VALUE T> .WHERE>> + +" Get the arguemnts to a FUNCTION into the ACs." + +<DEFINE ARGS-TO-ACS (NOD + "AUX" (RQRG <REQARGS .NOD>) (INAME <NODE-NAME .NOD>) (N 1) + (ACST <ACS .NOD>) TG1 TG2 TG) + #DECL ((N RQRG) FIX (INAME) <UVECTOR [REST ATOM]> (ACST) LIST (NOD) NODE) + <COND + (<MEMBER .ACST '![(STACK) (FUNNY-STACK)!]> + <COND (<AND <EMPTY? <REST .INAME>> <NOT <L? .RQRG 0>>> + <REPEAT () + <AND <G? .N .RQRG> <RETURN>> + <STACK:ARGUMENT <REFERENCE:ARG .N>> + <SET N <+ .N 1>>> + <EMIT <INSTRUCTION `PUSHJ `P* <1 .INAME>>> + <EMIT '<`JRST |FINIS >>) + (ELSE + <EMIT '<`MOVE `A* `AB >> + <AND <L=? .RQRG 0> + <EMIT <INSTRUCTION `JUMPGE `AB* <SET TG1 <MAKE:TAG>>>>> + <LABEL:TAG <SET TG2 <MAKE:TAG>>> + <AND <L? .RQRG 0> <EMIT '<INTGO!-OP>>> + <STACK:ARGUMENT <REFERENCE:ARG 1>> + <EMIT <INSTRUCTION `ADD `AB* '[<2 (2)>]>> + <EMIT <INSTRUCTION `JUMPL `AB* .TG2>> + <AND <L=? .RQRG 0> <LABEL:TAG .TG1>> + <EMIT '<`HLRES `A >> + <EMIT '<`ASH `A* -1>> + <COND (<G=? .RQRG 0> + <EMIT <INSTRUCTION `ADDI `A* <SET TG <MAKE:TAG>>>> + <EMIT <INSTRUCTION `PUSHJ `P* `@ .RQRG '`(A) >>) + (ELSE + <EMIT '<`MOVMS `A >> + <EMIT <INSTRUCTION `PUSHJ `P* <1 .INAME>>>)> + <EMIT '<`JRST |FINIS >> + <COND (<G=? .RQRG 0> + <REPEAT () + <AND <EMPTY? <REST .INAME>> <LABEL:TAG .TG>> + <EMIT <INSTRUCTION `SETZ <1 .INAME>>> + <AND <EMPTY? <SET INAME <REST .INAME>>> + <RETURN>>>)>)>) + (ELSE + <REPEAT () + <AND <EMPTY? .ACST> <RETURN>> + <RET-TMP-AC <MOVE:ARG <REFERENCE:ARG .N> <DATUM !<1 .ACST>>>> + <SET N <+ .N 1>> + <SET ACST <REST .ACST>>> + <EMIT <INSTRUCTION `PUSHJ `P* <1 .INAME>>> + <EMIT '<`JRST |FINIS >>)>> + +" Push the args supplied in ACs onto the stack." + +<DEFINE ACS-TO-STACK (ACST "AUX" (N 0)) + #DECL ((N) FIX (ACST) LIST (VALUE) FIX) + <MAPF <> + <FUNCTION (W) + #DECL ((N) FIX) + <STACK:ARGUMENT <DATUM !.W>> + <SET N <+ .N 1>>> + .ACST> + .N> + +<DEFINE AC-SEG-CALL (ACS "AUX" (NARG <LENGTH .ACS>) TT OFFS) + #DECL ((OFFS NARG) FIX (ACS) LIST (TT) ADDRESS:C) + <COND (.CAREFUL + <EMIT <INSTRUCTION `CAIE `A* .NARG>> + <EMIT '<`JRST |COMPER >>)> + <SET OFFS <- 1 <SET NARG <* .NARG 2>>>> + <MAPF <> + <FUNCTION (X) + #DECL ((X) LIST) + <SET TT <ADDRESS:C .OFFS '`(TP) >> + <SET OFFS <+ .OFFS 2>> + <RET-TMP-AC <MOVE:ARG <DATUM .TT .TT> <DATUM !.X>>>> + .ACS> + <EMIT <INSTRUCTION `SUB `TP* [<FORM .NARG (.NARG)>]>>> + +" Generate PUSHJ in stack arg case (may go different places)" + +<DEFINE STACK-CALL (RQRG TRG INAME KNWN INT) + #DECL ((TRG RQRG) FIX (INAME) <UVECTOR [REST ATOM]> (KNWN) <OR FIX FALSE> + (INT) <OR ATOM FALSE>) + <COND + (<L? .TRG 0> ;"TUPLE?" + <COND (.KNWN <EMIT <INSTRUCTION `MOVEI `A* .KNWN>>)> + <EMIT <COND (.INT + <INSTRUCTION `PUSHJ + `P* + `@ + <FORM MQUOTE!-OP!-PACKAGE + <INTERNAL-RSUBR .INT -1 T>>>) + (ELSE <INSTRUCTION `PUSHJ `P* <1 .INAME>>)>>) + (ELSE + <COND + (<NOT .KNWN> + <COND + (<==? .RQRG .TRG> + <COND (.CAREFUL + <EMIT <INSTRUCTION `CAIE `A* .RQRG>> + <EMIT '<`JRST |COMPER >>)> + <EMIT <COND (.INT + <INSTRUCTION `PUSHJ + `P* + `@ + <FORM MQUOTE!-OP!-PACKAGE + <INTERNAL-RSUBR .INT .RQRG T>>>) + (ELSE <INSTRUCTION `PUSHJ `P* <1 .INAME>>)>>) + (ELSE + <COND (.CAREFUL + <EMIT <INSTRUCTION `CAIG `A* .TRG>> + <EMIT <INSTRUCTION `CAIGE `A* .RQRG>> + <EMIT '<`JRST |COMPER >>)> + <EMIT + <INSTRUCTION + `ADDI + `A* + <PROG ((I <+ <- .TRG .RQRG> 2>)) + #DECL ((I) FIX) + <IVECTOR + <- .I 1> + '<COND + (.INT + <FORM `@ + <FORM MQUOTE!-OP!-PACKAGE + <INTERNAL-RSUBR .INT + <- .TRG <SET I <- .I 1>>> + T>>>) + (ELSE <FORM <NTH .INAME <SET I <- .I 1>>>>)>>>>> + <EMIT <INSTRUCTION `PUSHJ `P* `@ <- .RQRG> `(A) >>)>) + (ELSE + <EMIT <COND (.INT + <INSTRUCTION `PUSHJ + `P* + `@ + <FORM MQUOTE!-OP!-PACKAGE + <INTERNAL-RSUBR .INT .KNWN T>>>) + (ELSE + <INSTRUCTION `PUSHJ + `P* + <NTH .INAME <- .TRG .KNWN -1>>>)>>)>)>> + + +" Generate code for a stackform." + +<DEFINE STACKFORM-GEN (NOD WHERE + "AUX" (K <KIDS .NOD>) TT T1 T2 TTT (PRE T) (OS .STK) + (STK (0 !.STK)) + (SUBRC + <AND + <==? <NODE-TYPE <SET TT <1 .K>>> ,FGVAL-CODE> + <==? <NODE-TYPE <SET TT <1 <KIDS .TT>>>> + ,QUOTE-CODE> + <GASSIGNED? <SET TTT <NODE-NAME .TT>>> + <TYPE? ,.TTT SUBR> + .TTT>)) + #DECL ((NOD TT) NODE (K) <LIST [REST NODE]> (PRE) <SPECIAL ANY> + (WHERE) <OR ATOM DATUM> (STK) <SPECIAL LIST> (OS) LIST) + <REGSTO T> + <COND (<NOT .SUBRC> + <RET-TMP-AC <STACK:ARGUMENT <GEN <1 .K> DONT-CARE>>>)> + <PCOUNTER <COND (.SUBRC 0) (ELSE 1)>> + <ADD:STACK PSTACK> + <LABEL:TAG <SET T1 <MAKE:TAG>>> + <PRED:BRANCH:GEN <SET T2 <MAKE:TAG>> <3 .K> <>> + <RET-TMP-AC <STACK:ARGUMENT <GEN <2 .K> DONT-CARE>>> + <COUNTP> + <BRANCH:TAG .T1> + <LABEL:TAG .T2> + <SEGMENT:FINAL <COND (.SUBRC .SUBRC) (ELSE APPLY)>> + <SET STK .OS> + <MOVE:ARG <FUNCTION:VALUE T> .WHERE>> + +" Generate code for a COND." + +<DEFINE COND-GEN (NOD WHERE + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" SACS NWHERE (ALLSTATES ()) (SSTATE #SAVED-STATE ()) + (RW .WHERE) LOCN (COND <MAKE:TAG "COND">) W2 + (KK <CLAUSES .NOD>) (SDIR .DIR) (SACS-OK T) + (SNUMSYM ())) + #DECL ((NOD) NODE (WHERE RW) <OR ATOM DATUM> (COND) ATOM (W2) DATUM + (KK) <LIST [REST NODE]> (ALLSTATES) <LIST [REST SAVED-STATE]> + (SSTATE) SAVED-STATE (LOCN) DATUM) + <AND .NOTF <SET DIR <NOT .DIR>>> + <COND (<AND ,FUDGE .BRANCH> <VAR-STORE>) (ELSE <SET SACS <SAVE:RES>> <REGSTO <>>)> + <PREFER-DATUM .WHERE> + <SET WHERE <GOODACS .NOD .WHERE>> + <COND (<AND <TYPE? .WHERE DATUM> + <SET W2 .WHERE> + <OR <==? <ISTYPE? <RESULT-TYPE .NOD>> FALSE> + <==? <ISTYPE? <DATTYP .W2>> FALSE>>> + <SET WHERE <DATUM ANY-AC <DATVAL .W2>>>)> + <MAPR <> + <FUNCTION (BRN + "AUX" (LAST <EMPTY? <REST .BRN>>) (BR <1 .BRN>) NEXT + (K <CLAUSES .BR>) (PR <PREDIC .BR>) (NO-SEQ <>) (LEAVE <>) + (W + <COND (<TYPE? .WHERE DATUM> <DATUM !.WHERE>) + (ELSE .WHERE)>) FLG (BRNCHED <>)) + #DECL ((PR BR) NODE (BRN) <LIST NODE> (K) <LIST [REST NODE]>) + <OR <AND ,FUDGE .BRANCH> <SET SNUMSYM <SAVE-NUM-SYM .SACS>>> + <RESTORE-STATE .SSTATE <AND <ASSIGNED? LOCN> <==? .LOCN ,NO-DATUM>>> + <COND + (<EMPTY? .K> + <COND + (<OR <SET FLG <NOT <TYPE-OK? <RESULT-TYPE .PR> FALSE>>> .LAST> + <OR .LAST <COND-COMPLAIN "NON REACHABLE COND CLAUSE(S) " <2 .BRN>>> + <COND (<AND .FLG .BRANCH> + <SET LOCN + <GEN .PR <COND (<==? .RW FLUSHED> FLUSHED) (ELSE .W)>>> + <COND (.DIR <BRANCH:TAG .BRANCH>)>) + (<AND .BRANCH .LAST> + <SET LOCN + <PRED:BRANCH:GEN .BRANCH + .PR + .SDIR + <COND (<==? .RW FLUSHED> FLUSHED) + (ELSE .W)> + .NOTF>>) + (ELSE + <SET LOCN + <GEN .PR <COND (<==? .RW FLUSHED> FLUSHED) (ELSE .W)>>> + <ACFIX .WHERE .W> + <VAR-STORE <>>)> + <COND (<==? .LOCN ,NO-DATUM> + <SET SACS-OK <SAVE-TYP .PR>> + <OR <AND ,FUDGE .BRANCH> <FIX-NUM-SYM .SNUMSYM .SACS>>) + (<NOT <AND ,FUDGE .BRANCH>><SET ALLSTATES (<SAVE-STATE> !.ALLSTATES)>)> + <MAPLEAVE>) + (<==? <ISTYPE? <RESULT-TYPE .PR>> FALSE> <GEN .PR FLUSHED>) + (<==? .RW FLUSHED> + <PRED:BRANCH:GEN <COND (<AND .BRANCH .SDIR> .BRANCH) (ELSE .COND)> + .PR + T + FLUSHED + .NOTF>) + (ELSE + <COND + (<AND .BRANCH .SDIR> + <RET-TMP-AC <PRED:BRANCH:GEN .BRANCH .PR T FLUSHED .NOTF>>) + (ELSE + <RET-TMP-AC + <PRED:BRANCH:GEN + .COND + .PR + T + <COND (<AND <TYPE? .W DATUM> <ISTYPE? <DATTYP .W>>> + <PUT .W ,DATTYP ANY-AC> + .W) + (ELSE .W)> + .NOTF>>)>)> + <SET SSTATE <SAVE-STATE>> + <OR <==? <RESULT-TYPE .PR> FLUSHED> + <AND ,FUDGE .BRANCH> + <SET ALLSTATES (.SSTATE !.ALLSTATES)>> + <VAR-STORE <>>) + (ELSE + <SET NEXT <MAKE:TAG "PHRASE">> + <COND (<==? <ISTYPE? <RESULT-TYPE .PR>> FALSE> + <COND (<AND .BRANCH .LAST <NOT .DIR>> + <SET LOCN <GEN .PR .W>> + <BRANCH:TAG .BRANCH>) + (ELSE + <COND (<AND .LAST <NOT <==? .RW FLUSHED>>> + <SET LOCN <GEN .PR .W>>) + (ELSE <SET LOCN <GEN .PR FLUSHED>>)> + <AND <N==? .LOCN ,NO-DATUM> <BRANCH:TAG .NEXT>>)> + <SET NO-SEQ T> + <OR <AND ,FUDGE .BRANCH> <SET ALLSTATES (<SAVE-STATE> !.ALLSTATES)>> + <COND-COMPLAIN "COND PREDICATE ALWAYS FALSE" .PR>) + (<TYPE-OK? FALSE <RESULT-TYPE .PR>> + <COND (<AND .LAST <NOT .DIR> .BRANCH> + <RET-TMP-AC <PRED:BRANCH:GEN .BRANCH .PR <> .W .NOTF>>) + (<AND .LAST .BRANCH> + <RET-TMP-AC <PRED:BRANCH:GEN .NEXT .PR <> FLUSHED>>) + (<AND .LAST <NOT <==? .RW FLUSHED>>> + <RET-TMP-AC <PRED:BRANCH:GEN .NEXT .PR <> .W>>) + (ELSE <PRED:BRANCH:GEN .NEXT .PR <> FLUSHED>)> + <COND (<AND .LAST <N==? <RESULT-TYPE .PR> NO-RETURN>> + <OR <AND ,FUDGE .BRANCH> + <SET ALLSTATES (<SAVE-STATE> !.ALLSTATES)>>) + (<==? <RESULT-TYPE .PR> NO-RETURN> + <SET SACS-OK <SAVE-TYP <NTH .K <LENGTH .K>>>> + <OR <AND ,FUDGE .BRANCH> <FIX-NUM-SYM .SNUMSYM .SACS>>)>) + (ELSE + <SET K (.PR !.K)> + <COND (<NOT .LAST> + <SET LEAVE T> + <COND-COMPLAIN "NON REACHABLE COND CLAUSE(S)" + <2 .BRN>>)>)> + <SET SSTATE <SAVE-STATE>> + <VAR-STORE <>> + <COND + (.BRANCH + <OR + .NO-SEQ + <COND + (<OR + <SET FLG + <NOT <TYPE-OK? + <RESULT-TYPE <SET PR <NTH .K <LENGTH .K>>>> FALSE>>> + <NOT <TYPE-OK? <RESULT-TYPE .PR> '<NOT FALSE>>>> + <COND (.NOTF + <SEQ-GEN .K FLUSHED> + <COND (<==? .RW FLUSHED> <SET LOCN ,NO-DATUM>) + (ELSE + <SET LOCN <MOVE:ARG <REFERENCE <NOT .FLG>> .W>>)>) + (<SET LOCN + <SEQ-GEN .K + <COND (<OR <==? .RW FLUSHED> + <N==? .SDIR .FLG>> + FLUSHED) + (ELSE .W)>>>)> + <AND <==? .FLG .SDIR> <SET BRNCHED T> <BRANCH:TAG .BRANCH>>) + (ELSE + <SET LOCN + <PSEQ-GEN .K + <COND (<==? .RW FLUSHED> FLUSHED) (ELSE .W)> + .BRANCH + .SDIR + .NOTF>>)>> + <AND .LAST .NO-SEQ <NOT .DIR> <BRANCH:TAG .BRANCH>>) + (<NOT .NO-SEQ> + <SET LOCN + <PSEQ-GEN .K + <COND (<==? .RW FLUSHED> FLUSHED) (ELSE .W)> + .BRANCH + .SDIR + .NOTF>>)> + <VAR-STORE <>> + <COND (<N==? .LOCN ,NO-DATUM> + <OR <AND ,FUDGE .BRANCH> <SET ALLSTATES (<SAVE-STATE> !.ALLSTATES)>>) + (ELSE + <SET SACS-OK <SAVE-TYP <NTH .K <LENGTH .K>>>> + <OR <AND ,FUDGE .BRANCH> <FIX-NUM-SYM .SNUMSYM .SACS>> + <RESTORE-STATE .SSTATE T>)> + <COND (<AND <NOT .LAST> <N==? .LOCN ,NO-DATUM>> + <OR .NO-SEQ <RET-TMP-AC .LOCN>> + <OR .BRNCHED <BRANCH:TAG .COND>>)> + <LABEL:TAG .NEXT>)> + <ACFIX .WHERE .W> + <OR <ASSIGNED? NPRUNE> <PUT .BR ,CLAUSES ()>> + <AND .LEAVE <MAPLEAVE>>> + .KK> + <OR <ASSIGNED? NPRUNE> <PUT .NOD ,CLAUSES ()>> + <COND (<AND <TYPE? .WHERE DATUM> <N==? <RESULT-TYPE .NOD> NO-RETURN>> + <SET W2 .WHERE> + <AND <ISTYPE? <DATTYP .W2>> + <TYPE? <DATTYP .LOCN> AC> + <NOT <==? <DATTYP .W2> <DATTYP .LOCN>>> + <RET-TMP-AC <DATTYP .LOCN> .LOCN>> + <AND <TYPE? <DATTYP .W2> AC> <FIX-ACLINK <DATTYP .W2> .W2 .LOCN>> + <AND <TYPE? <DATVAL .W2> AC> <FIX-ACLINK <DATVAL .W2> .W2 .LOCN>>)> + <LABEL:TAG .COND> + <SET NWHERE + <COND (<==? <RESULT-TYPE .NOD> NO-RETURN> ,NO-DATUM) + (ELSE <MOVE:ARG .WHERE .RW>)>> + <AND <N==? .NWHERE ,NO-DATUM> <NOT <AND ,FUDGE .BRANCH>> <MERGE-STATES .ALLSTATES>> + <OR .BRANCH <CHECK:VARS .SACS .SACS-OK>> + .NWHERE> + +<DEFINE PSEQ-GEN (L W B D N) + #DECL ((L) <LIST [REST NODE]>) + <REPEAT () + <COND (<EMPTY? <REST .L>> + <RETURN <COND (.B <PRED:BRANCH:GEN .B <1 .L> .D .W .N>) + (ELSE <GEN <1 .L> .W>)>>)> + <RET-TMP-AC <GEN <1 .L> FLUSHED>> + <SET L <REST .L>>>> + +<DEFINE COND-COMPLAIN (MSG N1) #DECL ((N1) NODE) <MESSAGE NOTE .MSG .N1>> + +<DEFINE SAVE-TYP (NOD) + #DECL ((NOD) NODE) + <==? <NODE-TYPE .NOD> ,RETURN-CODE>> + +<DEFINE MERGE-STATES (ALLSTATES) + #DECL ((ALLSTATES) LIST) + <COND + (<EMPTY? .ALLSTATES> + <MAPF <> + <FUNCTION (AC "AUX" (NRES <ACRESIDUE .AC>)) + <COND (.NRES + <MAPF <> <FUNCTION (X) <SMASH-INACS .X <>>> .NRES>)> + <PUT .AC ,ACRESIDUE <>>> + ,ALLACS>) + (ELSE <MAPF <> <FUNCTION (X) <MERGE-STATE .X>> .ALLSTATES>)>> + +" Fixup where its going better or something?" + +<DEFINE UPDATE-WHERE (NOD WHERE "AUX" TYP) + #DECL ((NOD) NODE (WHERE VALUE) <OR ATOM DATUM>) + <COND (<==? .WHERE FLUSHED> DONT-CARE) + (<SET TYP <ISTYPE? <RESULT-TYPE .NOD>>> <REG? .TYP .WHERE>) + (<==? .WHERE DONT-CARE> <DATUM ANY-AC ANY-AC>) + (ELSE .WHERE)>> + +" Generate code for OR use BOOL-GEN to do work." + +<DEFINE OR-GEN (NOD WHERE "OPTIONAL" (NF <>) (BR <>) (DIR T)) + #DECL ((NOD) NODE) + <BOOL-GEN .NOD <CLAUSES .NOD> T .WHERE .NF .BR .DIR>> + +" Generate code for AND use BOOL-GEN to do work." + +<DEFINE AND-GEN (NOD WHERE "OPTIONAL" (NF <>) (BR <>) (DIR <>)) + #DECL ((NOD) NODE) + <BOOL-GEN .NOD <CLAUSES .NOD> <> .WHERE .NF .BR .DIR>> + +<DEFINE BOOL-GEN (NOD PREDS RESULT WHERE NOTF BRANCH DIR + "AUX" SACS (SSTATE ()) (SS #SAVED-STATE ()) (RW .WHERE) + (BOOL <MAKE:TAG "BOOL">) (FLUSH <==? .RW FLUSHED>) + (FLS <AND <NOT .BRANCH> .FLUSH>) RTF SRES + (LOCN <DATUM ANY ANY>) FIN (SACS-OK T)) + #DECL ((PREDS) <LIST [REST NODE]> (SSTATE) <LIST [REST SAVED-STATE]> + (SS) SAVED-STATE (NOTF DIR FLUSH FLS RTF) ANY (BOOL) ATOM + (BRANCH) <OR ATOM FALSE> (WHERE RW) <OR DATUM ATOM> (NOD) NODE + (LOCN) ANY (SRES RESULT) ANY) + <COND (<AND ,FUDGE .BRANCH> <VAR-STORE <>>) (ELSE <SET SACS <SAVE:RES>> <REGSTO <>>)> + <PREFER-DATUM .WHERE> + <AND .NOTF <SET RESULT <NOT .RESULT>>> + <SET SRES .RESULT> + <SET RTF + <AND <NOT .FLUSH> <==? .SRES .DIR> <TYPE-OK? <RESULT-TYPE .NOD> FALSE>>> + <AND .DIR <SET RESULT <NOT .RESULT>>> + <SET WHERE <GOODACS .NOD .WHERE>> + <COND + (<EMPTY? .PREDS> <SET LOCN <MOVE:ARG <REFERENCE .RESULT> .WHERE>>) + (ELSE + <MAPR <> + <FUNCTION (BRN + "AUX" (BR <1 .BRN>) (LAST <EMPTY? <REST .BRN>>) + (RT <RESULT-TYPE .BR>) + (W + <COND (<AND <TYPE? .WHERE DATUM> + <ISTYPE? <DATTYP .WHERE>> + <NOT .LAST>> + <GOODACS .BR <DATUM ANY-AC <DATVAL .WHERE>>>) + (<AND <OR <NOT .RTF> .LAST> <TYPE? .WHERE DATUM>> + <DATUM !.WHERE>) + (<==? .RW FLUSHED> FLUSHED) + (ELSE .WHERE)>) (RTFL <>)) + #DECL ((BRN) <LIST NODE> (BR) NODE (W) <OR ATOM DATUM>) + <SET SS <SAVE-STATE>> + <COND + (<AND <TYPE-OK? .RT FALSE> <NOT <SET RTFL <==? <ISTYPE? .RT> FALSE>>>> + <COND + (<OR .BRANCH <AND .FLS <NOT .LAST>>> + <COND (.LAST + <SET LOCN + <PRED:BRANCH:GEN .BRANCH + .BR + .DIR + <COND (.FLUSH FLUSHED) (ELSE .W)> + .NOTF>>) + (ELSE + <RET-TMP-AC + <PRED:BRANCH:GEN <COND (.FLS .BOOL) + (.RESULT .BOOL) + (ELSE .BRANCH)> + .BR + .SRES + <COND (.RTF .W) (ELSE FLUSHED)> + .NOTF>>)> + <COND (<AND <NOT <AND ,FUDGE .BRANCH>> <N==? .RT NO-RETURN>> + <SET SSTATE (<SAVE-STATE> !.SSTATE)>) + (<==? .RT NO-RETURN> + <SET SACS-OK <SAVE-TYP .BR>> + <RESTORE-STATE .SS T>)>) + (.LAST + <SET LOCN <GEN .BR .W>> + <COND (<AND <NOT <AND ,FUDGE .BRANCH>> <N==? .RT NO-RETURN>> + <SET SSTATE (<SAVE-STATE> !.SSTATE)>) + (<==? .RT NO-RETURN> + <SET SACS-OK <SAVE-TYP .BR>> + <RESTORE-STATE .SS T>)> + .LOCN) + (ELSE + <SET LOCN <PRED:BRANCH:GEN .BOOL .BR .DIR .W .NOTF>> + <COND (<AND <NOT <AND ,FUDGE .BRANCH>> <N==? .RT NO-RETURN>> + <SET SSTATE (<SAVE-STATE> !.SSTATE)>) + (<==? .RT NO-RETURN> + <SET SACS-OK <SAVE-TYP .BR>> + <RESTORE-STATE .SS T>)> + <RET-TMP-AC .LOCN>)>) + (<OR <N==? .SRES <COND (.NOTF <SET RTFL <NOT .RTFL>>) (ELSE .RTFL)>> + .LAST> + <OR .LAST <MESSAGE NOTE "NON REACHABLE AND/OR CLAUSE" <2 .BRN>>> + <COND (.BRANCH + <SET LOCN + <GEN .BR <COND (<N==? .DIR .RTFL> .W) (ELSE FLUSHED)>>> + <AND <N==? .DIR .RTFL> + <N==? .LOCN ,NO-DATUM> + <PROG () + <VAR-STORE> + T> + <BRANCH:TAG .BRANCH>>) + (ELSE <SET LOCN <GEN .BR .W>>)> + <ACFIX .WHERE .W> + <VAR-STORE> + <MAPLEAVE>) + (ELSE <RET-TMP-AC <GEN .BR FLUSHED>>)> + <ACFIX .WHERE .W> + <VAR-STORE <>>> + .PREDS>)> + <OR <ASSIGNED? NPRUNE> <PUT .NOD ,CLAUSES ()>> + <COND (<AND <TYPE? .WHERE DATUM> <TYPE? .LOCN DATUM>> + <AND <NOT <==? <DATTYP .WHERE> <DATTYP .LOCN>>> + <ISTYPE? <DATTYP .WHERE>> + <TYPE? <DATTYP .LOCN> AC> + <RET-TMP-AC <DATTYP .LOCN> .LOCN>> + <AND <TYPE? <DATTYP .WHERE> AC> + <FIX-ACLINK <DATTYP .WHERE> .WHERE .LOCN>> + <AND <TYPE? <DATVAL .WHERE> AC> + <FIX-ACLINK <DATVAL .WHERE> .WHERE .LOCN>>)> + <OR <AND .BRANCH <NOT .RESULT>> <LABEL:TAG .BOOL>> + <SET FIN + <COND (<==? <RESULT-TYPE .NOD> NO-RETURN> ,NO-DATUM) + (ELSE <OR <AND ,FUDGE .BRANCH> + <MERGE-STATES .SSTATE>> <MOVE:ARG .WHERE .RW>)>> + <OR <AND ,FUDGE .BRANCH> <CHECK:VARS .SACS .SACS-OK>> + .FIN> + +" Get the best set of acs around for this guy." + +<DEFINE GOODACS (N W1 "AUX" W) + #DECL ((N) NODE (W) DATUM) + <COND (<==? .W1 FLUSHED> DONT-CARE) + (<TYPE? .W1 DATUM> + <SET W .W1> + <DATUM <COND (<OR <ISTYPE-GOOD? <DATTYP .W>> + <ISTYPE-GOOD? <RESULT-TYPE .N>>>) + (<TYPE? <DATTYP .W> AC> <DATTYP .W>) + (ELSE ANY-AC)> + <COND (<TYPE? <DATVAL .W> AC> <DATVAL .W>) + (ELSE ANY-AC)>>) + (ELSE + <DATUM <COND (<ISTYPE-GOOD? <RESULT-TYPE .N>>) (ELSE ANY-AC)> + ANY-AC>)>> + +" Generate code for ASSIGNED?" + +<DEFINE ASSIGNED?-GEN (N W + "OPTIONAL" (NF <>) (BR <>) (DIR <>) + "AUX" (A <LOCAL-ADDR .N <>>) (SDIR .DIR) + (FLS <==? .W FLUSHED>) B2) + #DECL ((A) DATUM (N) NODE) + <AND .NF <SET DIR <NOT .DIR>>> + <SET DIR + <COND (<AND .BR <NOT .FLS>> <NOT .DIR>) (ELSE .DIR)>> + <EMIT <INSTRUCTION GETYP!-OP `O* !<ADDR:TYPE .A>>> + <EMIT <INSTRUCTION <COND (.DIR `CAIE ) (ELSE `CAIN )> + `O* + '<TYPE-CODE!-OP!-PACKAGE UNBOUND>>> + <RET-TMP-AC .A> + <COND (<AND .BR .FLS> <BRANCH:TAG .BR> FLUSHED) + (.BR + <BRANCH:TAG <SET B2 <MAKE:TAG>>> + <SET W <MOVE:ARG <REFERENCE .SDIR> .W>> + <BRANCH:TAG .BR> + <LABEL:TAG .B2> + .W) + (ELSE + <BRANCH:TAG <SET BR <MAKE:TAG>>> + <TRUE-FALSE .N .BR .W>)>> + +<DEFINE TRUE-FALSE (N B W "OPTIONAL" (THIS T) "AUX" (RW .W) (B2 <MAKE:TAG>)) + #DECL ((N) NODE (B2 B) ATOM (W) <OR DATUM ATOM>) + <SET W <UPDATE-WHERE .N .W>> + <MOVE:ARG <REFERENCE .THIS> .W> + <RET-TMP-AC .W> + <BRANCH:TAG .B2> + <LABEL:TAG .B> + <MOVE:ARG <REFERENCE <NOT .THIS>> .W> + <LABEL:TAG .B2> + <MOVE:ARG .W .RW>> + +" Generate code for LVAL." + +<DEFINE LVAL-GEN (NOD WHERE + "AUX" (SYM <NODE-NAME .NOD>) (TAC <>) (VAC <>) TT ADDR + (LIVE + <COND (<==? <LENGTH <SET TT <TYPE-INFO .NOD>>> 2> + <2 .TT>) + (ELSE T)>)) + #DECL ((NOD) NODE (SYM) SYMTAB (ADDR) <OR FALSE DATUM> + (TAC VAC) <OR FALSE AC> (NO-KILL) LIST) + <LVAL-UP .SYM> + <COND (<SET ADDR <INACS .SYM>> + <AND <TYPE? <DATTYP <SET ADDR <DATUM !.ADDR>>> AC> + <PUT <SET TAC <DATTYP .ADDR>> + ,ACLINK + (.ADDR !<ACLINK .TAC>)>> + <AND <TYPE? <DATVAL .ADDR> AC> + <PUT <SET VAC <DATVAL .ADDR>> + ,ACLINK + (.ADDR !<ACLINK .VAC>)>> + <SET ADDR <MOVE:ARG .ADDR .WHERE>>) + (ELSE + <SET ADDR <MOVE:ARG <LADDR .SYM <> <>> .WHERE>> + <COND (<AND <TYPE? <SET TT <DATVAL .ADDR>> AC> <SET VAC .TT>> + <AND <TYPE? <SET TT <DATTYP .ADDR>> AC> <SET TAC .TT>> + <COND (<N==? <DATTYP .ADDR> DONT-CARE> + <SMASH-INACS .SYM <DATUM !.ADDR>> + <AND .TAC <PUT .TAC ,ACRESIDUE (.SYM)>> + <AND .VAC <PUT .VAC ,ACRESIDUE (.SYM)>>)>)>)> + <COND (<AND ,DEATH + <NOT .LIVE> + <NOT <MAPF <> + <FUNCTION (LL) + #DECL ((LL) LIST) + <AND <==? <1 .LL> .SYM> + <PUT .LL 2 T> + <MAPLEAVE>>> + .NO-KILL>>> + <OR <STORED .SYM> <EMIT <MAKE:TAG <SPNAME <NAME-SYM .SYM>>>>> + <SMASH-INACS .SYM <> <>> + <AND .TAC + <ACRESIDUE .TAC> + <PUT .TAC ,ACRESIDUE <RES-FLS <ACRESIDUE .TAC> .SYM>>> + <AND .VAC + <ACRESIDUE .VAC> + <PUT .VAC ,ACRESIDUE <RES-FLS <ACRESIDUE .VAC> .SYM>>>)> + .ADDR> + +<DEFINE DELAY-KILL (L1 L2 "AUX" TT TAC SYM) + #DECL ((L1 L2) <LIST [REST !<LIST SYMTAB <OR ATOM FALSE>>]> (SYM) SYMTAB) + <REPEAT () + <COND (<OR <==? .L1 .L2> <NOT ,DEATH>> <RETURN>)> + <COND (<2 <SET TT <1 .L1>>> + <OR <STORED <SET SYM <1 .TT>>> + <EMIT <MAKE:TAG <SPNAME <NAME-SYM .SYM>>>>> + <COND (<SET TT <INACS .SYM>> + <AND <TYPE? <SET TAC <DATTYP .TT>> AC> + <ACRESIDUE .TAC> + <PUT .TAC + ,ACRESIDUE + <RES-FLS <ACRESIDUE .TAC> .SYM>>> + <AND <TYPE? <SET TAC <DATVAL .TT>> AC> + <ACRESIDUE .TAC> + <PUT .TAC + ,ACRESIDUE + <RES-FLS <ACRESIDUE .TAC> .SYM>>> + <SMASH-INACS .SYM <>>)>)> + <SET L1 <REST .L1>>>> + +<DEFINE RES-FLS (L S) + #DECL ((L) <LIST [REST <OR TEMP SYMTAB COMMON>]> (S) SYMBOL) + <COND + (<EMPTY? .L> <>) + (ELSE + <REPEAT ((L1 .L) (LL .L)) + #DECL ((LL L1) <LIST [REST <OR TEMP SYMTAB COMMON>]>) + <COND (<==? <1 .LL> .S> + <COND (<==? .LL .L> + <RETURN <COND (<NOT <EMPTY? <SET L <REST .L>>>> .L)>>) + (ELSE <PUTREST .L <REST .LL>> <RETURN .L1>)>)> + <AND <EMPTY? <SET LL <REST <SET L .LL>>>> <RETURN .L1>>>)>> + +" Generate LVAL for free variable." + +<DEFINE FLVAL-GEN (NOD WHERE "AUX" T2 T1 TT) + #DECL ((NOD) NODE (TT) SYMTAB (T2) DATUM) + <REGSTO T> + <COND (<TYPE? <SET T1 <NODE-NAME .NOD>> SYMTAB> + <SET TT .T1> + <MOVE:ARG <REFERENCE <NAME-SYM .TT>> + <SET T2 <DATUM ATOM <2 ,ALLACS>>>>) + (ELSE <SET T2 <GEN <1 <KIDS .NOD>> <DATUM ATOM <2 ,ALLACS>>>>)> + <FAST:VAL> + <RET-TMP-AC .T2> + <MOVE:ARG <FUNCTION:VALUE T> .WHERE>> + +<DEFINE FSET-GEN (NOD WHERE "AUX" TT TEM T1 T2) + #DECL ((NOD TEM) NODE (T1) SYMTAB (T2) DATUM) + <REGSTO T> + <COND (<TYPE? <SET TT <NODE-NAME .NOD>> SYMTAB> + <SET T1 .TT> + <SET T2 <MOVE:ARG <REFERENCE <NAME-SYM .T1>> DONT-CARE>> + <SET TEM <2 <KIDS .NOD>>>) + (ELSE + <SET T2 <GEN <1 <KIDS .NOD>> DONT-CARE>> + <SET TEM <2 <KIDS .NOD>>>)> + <SET TT <GEN .TEM <FUNCTION:VALUE>>> + <SET T2 <MOVE:ARG .T2 <DATUM ATOM <3 ,ALLACS>>>> + <FAST:SET> + <RET-TMP-AC .T2> + <MOVE:ARG .TT .WHERE>> + +" Generate code for an internal SET." + +<DEFINE SET-GEN (NOD WHERE + "AUX" (SYM <NODE-NAME .NOD>) + (TY <ISTYPE-GOOD? <1 <TYPE-INFO .NOD>>>) TEM + (TYAC ANY-AC) (STORE-SET <>) (VAC ANY-AC) DAT1 (TT <>)) + #DECL ((NOD) NODE (ADDR TEM) DATUM (SYM) SYMTAB + (STORE-SET) <SPECIAL ANY>) + <COND (<TYPE? .WHERE DATUM> + <AND <==? <DATVAL .WHERE> DONT-CARE> <PUT .WHERE ,DATVAL ANY-AC>> + <AND <==? <DATTYP .WHERE> DONT-CARE> <PUT .WHERE ,DATTYP ANY-AC>> + <AND <TYPE? <DATTYP .WHERE> AC> <SET TYAC <DATTYP .WHERE>>> + <AND <TYPE? <DATVAL .WHERE> AC> <SET VAC <DATVAL .WHERE>>>)> + <COND (<TYPE? .TYAC AC> + <COND (<MEMQ .SYM <ACRESIDUE .TYAC>> + <MAPF <> + <FUNCTION (S) + #DECL ((S) SYMTAB) + <OR <==? .S .SYM> <STOREV .SYM>>> + <ACRESIDUE .TYAC>> + <PUT .TYAC ,ACRESIDUE (.SYM)>) + (ELSE <MUNG-AC .TYAC .WHERE>)>)> + <COND (<TYPE? .VAC AC> + <COND (<MEMQ .SYM <ACRESIDUE .VAC>> + <MAPF <> + <FUNCTION (S) + #DECL ((S) SYMTAB) + <OR <==? .S .SYM> <STOREV .SYM>>> + <CHTYPE <ACRESIDUE .VAC> LIST>> + <PUT .VAC ,ACRESIDUE (.SYM)>) + (ELSE <MUNG-AC .VAC .WHERE>)>)> + <OR .TY + <AND <OR <==? <SPEC-SYM .SYM> FUDGE> <NOT <SPEC-SYM .SYM>>> + <OR <ARG? .SYM> <INIT-SYM .SYM>> + <SET TY <ISTYPE-GOOD? <1 <DECL-SYM .SYM>>>>>> + '<COND (<AND <SET TT <INACS .SYM>> + <==? .TYAC ANY-AC> + <==? .VAC ANY-AC> + <PROG-AC .SYM> + <MEMQ .SYM <LOOP-VARS <1 <PROG-AC .SYM>>>> + <OR <==? .TY <DATTYP .TT>> + <AND <NOT .TY> + <TYPE? <DATTYP .TT> AC> + <SET TYAC <DATTYP .TT>>>>> + <SET VAC <DATVAL .TT>>)> + <SET TEM + <GEN <2 <KIDS .NOD>> + <COND (.TY <DATUM .TY .VAC>) + (ELSE <SET TY <>> <DATUM .TYAC .VAC>)>>> + <REPEAT ((TT .TEM) AC) + #DECL ((TT) <PRIMTYPE LIST> (AC) AC) + <COND (<EMPTY? .TT> <RETURN>) + (<TYPE? <1 .TT> AC> + <OR <MEMQ .TEM <ACLINK <SET AC <1 .TT>>>> + <PUT .AC ,ACLINK (.TEM !<ACLINK .AC>)>> + <OR <MEMQ .SYM <ACRESIDUE .AC>> + <PUT .AC ,ACRESIDUE (.SYM !<ACRESIDUE .AC>)>>)> + <SET TT <REST .TT>>> + <COND (<SET DAT1 <INACS .SYM>> + <COND (<TYPE? <DATTYP .DAT1> AC> + <OR <MEMQ <DATTYP .DAT1> .TEM> + <FLUSH-RESIDUE <DATTYP .DAT1> .SYM>>)> + <COND (<TYPE? <DATVAL .DAT1> AC> + <OR <MEMQ <DATVAL .DAT1> .TEM> + <FLUSH-RESIDUE <DATVAL .DAT1> .SYM>>)>)> + <COND (<TYPE? <DATVAL .TEM> AC> <SMASH-INACS .SYM <DATUM !.TEM>>)> + <PUT .SYM ,STORED .STORE-SET> + <KILL-LOOP-AC .SYM> + <FLUSH-COMMON-SYMT .SYM> + <MOVE:ARG .TEM .WHERE>> + + +<DEFINE ARG? (SYM) #DECL ((SYM) SYMTAB) <1? <NTH ,ARGTBL <CODE-SYM .SYM>>>> + +<SETG ARGTBL ![0 0 0 0 1 0 0 0 0 1 0 1 1!]> + +<GDECL (ARGTBL) <UVECTOR [REST FIX]>> + +" Update the stack model with a FIX or an ATOM." + +<DEFINE ADD:STACK (THING) + #DECL ((STK) <LIST FIX>) + <COND (<TYPE? .THING FIX> <PUT .STK 1 <+ <1 .STK> .THING>>) + (<OR <==? .THING PSLOT> <==? .THING PSTACK>> + <SET STK (0 .THING !.STK)>) + (<TYPE? .THING ATOM> + <SET STK (0 <FORM GVAL .THING> !.STK)>) + (ELSE <MESSAGE INCONSISTENCY "BAD CALL TO ADD:STACK ">)>> + +" Return the current distance between two stack places." + +<DEFINE STACK:L (FROM TO "AUX" (LN 0) (TF 0) (LF ())) + #DECL ((LN TF) FIX (FROM TO) LIST (VALUE) <OR FALSE LIST>) + <REPEAT (T) + <AND <==? <SET T <1 .FROM>> PSTACK> <RETURN <>>> + <COND (<N==? .T PSLOT> + <COND (<NOT <TYPE? .T FIX>> <SET LF (.T !.LF)>) + (ELSE <SET TF .T> <SET LN <+ .LN .TF>>)>)> + <AND <==? .TO .FROM> <RETURN (.LN !.LF)>> + <SET FROM <REST .FROM>>>> + +" Compute the address of a local variable using the stack model." + +<DEFINE LOCAL-ADDR (NOD STYP "AUX" (S <NODE-NAME .NOD>)) + #DECL ((NOD) NODE (S) SYMTAB) + <LADDR .S <> .STYP>> + +<DEFINE LADDR (S LOSER STYP + "OPTIONAL" (NOSTORE T) + "AUX" TEM T2 T3 T4 (FRMS .FRMS) (AC-HACK .AC-HACK) + (NTSLOTS .NTSLOTS)) + #DECL ((S) SYMTAB (T4) ADDRESS:C (VALUE TEM) DATUM (FRMS NTSLOTS) LIST) + <SET TEM + <COND + (<SET T2 <INACS .S>> + <COND (<TYPE? <DATTYP <SET T2 <DATUM !.T2>>> AC> + <PUT <DATTYP .T2> ,ACLINK (.T2 !<ACLINK <DATTYP .T2>>)>)> + <COND (<TYPE? <DATVAL .T2> AC> + <PUT <DATVAL .T2> ,ACLINK (.T2 !<ACLINK <DATVAL .T2>>)>)> + <SET LOSER T> + .T2) + (ELSE + <COND (<AND .NOSTORE <TYPE? <NUM-SYM .S> LIST> <1 <NUM-SYM .S>>> + <PUT <NUM-SYM .S> 1 <>>)> + <COND + (<AND <TYPE? <ADDR-SYM .S> TEMPV> <==? <1 .FRMS> <FRMNO .S>>> + <COND + (<=? .AC-HACK '(STACK)> + <SET T4 + <ADDRESS:C + !<FIX:ADDR (-1 !<STACK:L .STK <1 <ADDR-SYM .S>>>) + <REST <ADDR-SYM .S>>> + `(TP) >>) + (<SET T4 + <ADDRESS:C !<REST <ADDR-SYM .S>> + <COND (<=? .AC-HACK '(FUNNY-STACK)> `(FRM) ) + (ELSE `(TB) )> + <COND (<=? .AC-HACK '(FUNNY-STACK)> 1) (ELSE 0)>>>)> + <DATUM .T4 .T4>) + (<TYPE? <ADDR-SYM .S> DATUM> <DATUM !<ADDR-SYM .S>>) + (<TYPE? <ADDR-SYM .S> FIX TEMPV> + <COND + (<AND .AC-HACK <=? .AC-HACK '(STACK)> <==? <1 .FRMS> <FRMNO .S>>> + <SET T4 + <ADDRESS:C + !<FIX:ADDR (-1 !<STACK:L .STK .BSTB>) + (<ADDR-SYM .S> + !<COND (<TYPE? <ARGNUM-SYM .S> ATOM> + <MEMBER <FORM GVAL <ARGNUM-SYM .S>> .NTSLOTS>) + (ELSE (0))>)> + `(TP) >> + <DATUM .T4 .T4>) + (<==? <1 .FRMS> <FRMNO .S>> + <SPEC:REFERENCE:STACK + .AC-HACK + (<ADDR-SYM .S> + !<COND (<TYPE? <ARGNUM-SYM .S> FIX> + <COND (<NOT .AC-HACK> + <REST .NTSLOTS <- <LENGTH .NTSLOTS> 1>>) + (ELSE '(-2))>) + (<AND .PRE <NOT <SPEC-SYM .S>>> .NTSLOTS) + (ELSE <MEMBER <FORM GVAL <ARGNUM-SYM .S>> .NTSLOTS>)>)>) + (<REPEAT ((FRMS .FRMS) NNTSLTS (LB <>) (OFFS (0 ())) (CURR <>)) + #DECL ((FRMS NNTSLTSJ) LIST (OFFS) <LIST [2 <OR FIX LIST>]>) + <COND + (<SET CURR <==? <4 .FRMS> FUZZ>> + <COND (.LB + <SET T3 + <SPEC-OFFPTR + <- ,OTBSAV <1 .OFFS> 1> + <DATUM <ADDRESS:PAIR |$TTB > .T3> + VECTOR + (<FORM - 0 !<2 .OFFS>>)>> + <SET OFFS (0 ())>) + (ELSE + <SET LB T> + <SET T3 + <SPEC-OFFPTR + <- ,OTBSAV <1 .OFFS> 1> + <DATUM <ADDRESS:PAIR |$TTB > + <ADDRESS:PAIR |$TTB `TB >> + VECTOR + (<FORM - 0 !<2 .OFFS>>)>> + <SET OFFS (0 ())>)>) + (ELSE <SET OFFS <STFIXIT .OFFS <4 .FRMS>>>)> + <AND <EMPTY? <SET FRMS <REST .FRMS 5>>> + <MESSAGE INCONSISTANCY "BAD FRAME MODEL ">> + <AND + <==? <FRMNO .S> <1 .FRMS>> + <SET OFFS + (<COND (<TYPE? <ADDR-SYM .S> FIX> + (<+ <ADDR-SYM .S> <- <1 .OFFS>>>)) + (ELSE + <FIX:ADDR (<1 .OFFS>) + <REST <CHTYPE <ADDR-SYM .S> LIST>>>)> + (<FORM - 0 !<2 .OFFS>>))> + <SET NNTSLTS <5 .FRMS>> + <RETURN + <COND + (.LB + <SET T3 + <SPEC-OFFPTR + !<1 .OFFS> + <DATUM <ADDRESS:PAIR |$TTB > .T3> + VECTOR + (!<2 .OFFS> + !<COND (<TYPE? <ARGNUM-SYM .S> ATOM> + <MEMBER <FORM GVAL <ARGNUM-SYM .S>> .NNTSLTS>) + (ELSE <REST .NNTSLTS <- <LENGTH .NNTSLTS> 1>>)>)>> + <DATUM .T3 .T3>) + (ELSE + <REFERENCE:STACK + (!<1 .OFFS> + !<COND (<TYPE? <ARGNUM-SYM .S> ATOM> + <MEMBER <FORM GVAL <ARGNUM-SYM .S>> .NNTSLTS>) + (<AND <TYPE? <ADDR-SYM .S> FIX> + <G=? <CODE-SYM .S> 6> + <L=? <CODE-SYM .S> 9> + <N=? <ACS <3 .FRMS>> '(STACK)>> + <REST .NNTSLTS <- <LENGTH .NNTSLTS> 1>>) + (ELSE '(0))> + !<2 .OFFS>)>)>>>>)>) + (ELSE <MESSAGE INCONSISTENCY "BAD VARIABLE ADDRESS ">)>)>> + <COND (<AND <NOT .LOSER> + <NOT <SPEC-SYM .S>> + <OR <ARG? .S> <INIT-SYM .S>> + <SET T2 <ISTYPE-GOOD? <1 <DECL-SYM .S>>>>> + <DATUM .T2 <DATVAL .TEM>>) + (<AND <NOT .LOSER> .STYP <SET T2 <ISTYPE-GOOD? .STYP>>> + <DATUM .T2 <DATVAL .TEM>>) + (ELSE .TEM)>> + +<DEFINE STFIXIT (OFF FRM "AUX" (NF 0) (NX ())) + #DECL ((NF) FIX (NX) LIST (OFF) <LIST FIX LIST> (FRM) LIST) + <MAPF <> + <FUNCTION (IT) + <COND (<TYPE? .IT FIX> <SET NF <+ .NF .IT>>) + (ELSE <SET NX (.IT !.NX)>)>> + .FRM> + (<+ <1 .OFF> .NF> (!.NX !<2 .OFF>))> + +" Generate obscure stuff." + +<DEFINE DEFAULT-GEN (NOD WHERE) + #DECL ((NOD) NODE) + <MOVE:ARG <REFERENCE <NODE-NAME .NOD>> .WHERE>> + +" Do GVAL using direct locative reference." + +<DEFINE GVAL-GEN (N W + "AUX" (GD <GLOC? <NODE-NAME <1 <KIDS .N>>>>) + (RT <ISTYPE-GOOD? <RESULT-TYPE .N>>)) + #DECL ((N) NODE) + <SET GD <OFFPTR 0 .GD VECTOR>> + <MOVE:ARG <DATUM <COND (.RT) (ELSE .GD)> .GD> .W>> + +" Do SETG using direct locative reference." + +<DEFINE SETG-GEN (N W + "AUX" GD DD (NN <2 <KIDS .N>>) (FA <FREE-ACS T>) + (RT <ISTYPE-GOOD? <RESULT-TYPE .N>>) + (D + <GEN + .NN + <COND (<==? .W FLUSHED> DONT-CARE) + (<G=? .FA 3> + <SET DD <GOODACS .N .W>> + <COND (<NOT <TYPE? <DATTYP .DD> AC>> + <PUT .DD ,DATTYP ANY-AC>)> + .DD) + (<AND .RT <G=? .FA 2>> <GOODACS .N .W>) + (ELSE DONT-CARE)>>)) + #DECL ((N NN) NODE (D) DATUM (FA) FIX) + <SET GD <OFFPTR 0 <SET GD <GLOC? <NODE-NAME <1 <KIDS .N>>>>> VECTOR>> + <MOVE:ARG .D <SET GD <DATUM .GD .GD>> T> + <COND (<AND <OR <AND <TYPE? <DATTYP .D> ATOM> + <ISTYPE-GOOD? <DATTYP .D>>> + <TYPE? <DATTYP .D> AC>> + <TYPE? <DATVAL .D> AC>> + <RET-TMP-AC .GD> + <MOVE:ARG .D .W>) + (ELSE <RET-TMP-AC .D> <MOVE:ARG .GD .W>)>> + +<BLOCK (<ROOT>)> + +RGLOC + +<ENDBLOCK> + +<DEFINE GLOC? (ATM "AUX" GL) + #DECL ((GL) DATUM) + <COND (.GLUE + <SET GL + <MOVE:ARG <REFERENCE <RGLOC .ATM T>> <DATUM LOCR ANY-AC>>> + <EMIT <INSTRUCTION `ADD + <ACSYM <CHTYPE <DATVAL .GL> AC>> + |GLOTOP + 1 >> + <RET-TMP-AC <DATTYP .GL> .GL> + <PUT .GL ,DATTYP VECTOR> + .GL) + (ELSE <REFERENCE <GLOC .ATM T>>)>> + +<SETG USE-RGLOC T> + +" Generate GVAL calls." + +<DEFINE FGVAL-GEN (NOD WHERE) + #DECL ((NOD) NODE) + <RET-TMP-AC <GEN <1 <KIDS .NOD>> <DATUM ATOM ,AC-B>>> + <REGSTO T> + <FAST:GVAL> + <MOVE:ARG <FUNCTION:VALUE T> .WHERE>> + +" Generate a SETG call." + +<DEFINE FSETG-GEN (NOD WHERE "AUX" TT TEM) + #DECL ((NOD) NODE (TT TEM) DATUM) + <SET TT <GEN <1 <KIDS .NOD>> DONT-CARE>> + <SET TEM <GEN <2 <KIDS .NOD>> <FUNCTION:VALUE>>> + <SET TT <MOVE:ARG .TT <DATUM ATOM <3 ,ALLACS>>>> + <PUT <3 ,ALLACS> ,ACPROT T> + <MOVE:ARG .TEM <SET TEM <FUNCTION:VALUE>>> + <PUT <3 ,ALLACS> ,ACPROT <>> + <RET-TMP-AC .TT> + <REGSTO T> + <FAST:SETG> + <MOVE:ARG .TEM .WHERE>> + +<DEFINE CHTYPE-GEN (NOD WHERE + "AUX" (TYP <ISTYPE? <RESULT-TYPE .NOD>>) (N <1 <KIDS .NOD>>) + TEM + (ITYP + <COND (<ISTYPE? <RESULT-TYPE .N>>) + (<MEMQ <NODE-TYPE .N> ,SNODES> DONT-CARE) + (ELSE ANY-AC)>)) + #DECL ((NOD N) NODE (TEM) DATUM (WHERE) <OR ATOM DATUM>) + <COND (<TYPE? .WHERE ATOM> + <COND (<ISTYPE-GOOD? .TYP> + <SET TEM <GEN .N DONT-CARE>> + <DATTYP-FLUSH .TEM> + <PUT .TEM ,DATTYP .TYP>) + (ELSE + <SET TEM <GEN .N <DATUM ANY-AC ANY-AC>>> + <MUNG-AC <DATTYP .TEM> .TEM> + <EMIT <INSTRUCTION `HRLI + <ACSYM <CHTYPE <DATTYP .TEM> AC>> + <FORM TYPE-CODE!-OP!-PACKAGE .TYP>>> + <MOVE:ARG .TEM .WHERE>)>) + (<ISTYPE-GOOD? .TYP> + <COND (<AND <==? <LENGTH .WHERE> 2> <TYPE? <DATVAL .WHERE> AC>> + <DATTYP-FLUSH <SET TEM <GEN .N <DATUM .ITYP <DATVAL .WHERE>>>>> + <PUT .TEM ,DATTYP .TYP> + <MOVE:ARG .TEM .WHERE>) + (ELSE + <DATTYP-FLUSH <SET TEM <GEN .N <DATUM .ITYP ANY-AC>>>> + <PUT .TEM ,DATTYP .TYP> + <MOVE:ARG .TEM .WHERE>)>) + (ELSE + <SET TEM <GEN .N <DATUM ANY-AC ANY-AC>>> + <MUNG-AC <DATTYP .TEM> .TEM> + <EMIT <INSTRUCTION `HRLI + <ACSYM <CHTYPE <DATTYP .TEM> AC>> + <FORM TYPE-CODE!-OP!-PACKAGE .TYP>>> + <MOVE:ARG .TEM .WHERE>)>> + +" Generate do-nothing piece of code." + +<DEFINE ID-GEN (N W) #DECL ((N) NODE) <GEN <1 <KIDS .N>> .W>> + +<DEFINE UNWIND-GEN (N W + "AUX" (OSTK .STK) (STK (0 !.STK)) (UNBRANCH <MAKE:TAG>) + (NOUNWIND <MAKE:TAG>) W1) + #DECL ((N) NODE (STK) <SPECIAL LIST> (OSTK) LIST (W1) DATUM) + <SGETREG ,AC-C <>> + <EMIT <INSTRUCTION `MOVEI `C* .UNBRANCH>> + <EMIT <INSTRUCTION `SUBI `C* `(M) >> + <EMIT <INSTRUCTION `PUSHJ `P* |IUNWIN >> + <ADD:STACK 10> + <RET-TMP-AC <SET W1 <GEN <1 <KIDS .N>> <GOODACS .N .W>>>> + <VAR-STORE> + <SGETREG ,AC-E <>> + <EMIT '<`PUSHJ `P* |POPUNW>> + <BRANCH:TAG .NOUNWIND> + <LABEL:TAG .UNBRANCH> + <GEN <2 <KIDS .N>> FLUSHED> + <VAR-STORE> + <EMIT '<`JRST |UNWIN2 >> + <LABEL:TAG .NOUNWIND> + <AND <TYPE? <DATTYP .W1> AC> <SGETREG <DATTYP .W1> .W1>> + <AND <TYPE? <DATVAL .W1> AC> <SGETREG <DATVAL .W1> .W1>> + <POP:LOCS .STK .OSTK> + <SET STK .OSTK> + <MOVE:ARG .W1 .W>> + +" Generate call to READ etc. with eof condition." + +<DEFINE READ2-GEN (N W + "AUX" (OSTK .STK) (STK (0 !.STK)) (I 0) SPOB BRANCH + (PSJ <MEMQ <NODE-NAME .N> '![READCHR NEXTCHR!]>)) + #DECL ((N) NODE (STK) <SPECIAL LIST> (OSTK) LIST (I) FIX (SPOB) NODE) + <MAPF <> + <FUNCTION (OB) + #DECL ((OB SPOB) NODE (I) FIX) + <COND (.PSJ + <COND (<==? <NODE-TYPE .OB> ,EOF-CODE> <SET SPOB .OB>) + (ELSE <RET-TMP-AC <GEN .OB <DATUM ,AC-A ,AC-B>>>)>) + (ELSE + <COND (<==? <NODE-TYPE .OB> ,EOF-CODE> + <SET SPOB .OB> + <ADD:STACK PSLOT> + <TIME:STACK>) + (ELSE <RET-TMP-AC <STACK:ARGUMENT <GEN .OB DONT-CARE>>>)> + <ADD:STACK 2> + <SET I <+ .I 1>>)>> + <KIDS .N>> + <REGSTO T> + <COND (.PSJ + <EMIT <INSTRUCTION `PUSHJ + `P* + <COND (<==? <NODE-NAME .N> READCHR> |CREADC ) + (ELSE |CNXTCH )>>> + <EMIT '<`CAIA >> + <BRANCH:TAG <SET BRANCH <MAKE:TAG>>>) + (ELSE + <SUBR:CALL <NODE-NAME .N> .I> + <SET BRANCH <TIME:CHECK>>)> + <SET STK .OSTK> + <RET-TMP-AC <GEN .SPOB + <COND (<==? .W FLUSHED> .W) (ELSE <FUNCTION:VALUE>)>>> + <VAR-STORE> + <LABEL:TAG .BRANCH> + <MOVE:ARG <FUNCTION:VALUE T> .W>> + +<DEFINE GET-GEN (N W) <GETGET .N .W T>> + +<DEFINE GET2-GEN (N W) <GETGET .N .W <>>> + +<GDECL (GETTERS) UVECTOR> + +<DEFINE GETGET (N W REV + "AUX" (K <KIDS .N>) PITEM PINDIC (BR <MAKE:TAG>) + (INDX <LENGTH <CHTYPE <MEMQ <NODE-SUBR .N> ,GETTERS> UVECTOR>>) + (LN <LENGTH .K>)) + #DECL ((N) NODE (K) <LIST NODE NODE [REST NODE]> (PITEM PINDIC) DATUM + (INDX LN) FIX) + <SET PITEM <GEN <1 .K> <DATUM ,AC-A ,AC-B>>> + <SET PINDIC <GEN <2 .K> <DATUM ,AC-C ,AC-D>>> + <SET PITEM <MOVE:ARG .PITEM <DATUM ,AC-A ,AC-B>>> + <RET-TMP-AC <MOVE:ARG .PINDIC <DATUM ,AC-C ,AC-D>>> + <RET-TMP-AC .PITEM> + <REGSTO T> + <EMIT <INSTRUCTION `PUSHJ + `P* + <NTH '![|CIGETP |CIGTPR |CIGETL |CIGET !] .INDX>>> + <COND (<==? .LN 2> <EMIT '<`JFCL >>) + (ELSE + <EMIT '<`SKIPA >> + <BRANCH:TAG .BR> + <COND (.REV + <RET-TMP-AC <STACK:ARGUMENT <GEN <3 .K> DONT-CARE>>> + <REGSTO T> + <SUBR:CALL EVAL 1>) + (ELSE <RET-TMP-AC <GEN <3 .K> <FUNCTION:VALUE>>>)> + <VAR-STORE> + <LABEL:TAG .BR>)> + <MOVE:ARG <FUNCTION:VALUE T> .W>> + + +<DEFINE REG? (TYP TRY + "OPTIONAL" (GETIT <>) + "AUX" (FUNNY <MEMQ <TYPEPRIM .TYP> '![STRING BYTES FRAME TUPLE LOCD!]>) + (TRY1 .TRY)) + #DECL ((TYP) ATOM) + <COND (<AND <TYPE? .TRY1 DATUM> + <REPEAT () + <AND <EMPTY? .TRY1> <RETURN <>>> + <AND <TYPE? <DATVAL .TRY1> AC> <RETURN T>> + <SET TRY1 <REST .TRY1 2>>>> + <DATUM <COND (.FUNNY <DATTYP .TRY1>) (ELSE .TYP)> + <DATVAL .TRY1>>) + (.FUNNY + <COND (.GETIT <ANY2ACS>) (ELSE <DATUM ANY-AC ANY-AC>)>) + (ELSE + <DATUM .TYP <COND (.GETIT <GETREG <>>) (ELSE ANY-AC)>>)>> + +<SETG GETTERS ![,GET ,GETL ,GETPROP ,GETPL!]> + +<COND (<GASSIGNED? ARITH-GEN> +<SETG GENERATORS + <DISPATCH ,DEFAULT-GEN + (,FORM-CODE ,FORM-GEN) + (,PROG-CODE ,PROG-REP-GEN) + (,SUBR-CODE ,SUBR-GEN) + (,COND-CODE ,COND-GEN) + (,LVAL-CODE ,LVAL-GEN) + (,SET-CODE ,SET-GEN) + (,OR-CODE ,OR-GEN) + (,AND-CODE ,AND-GEN) + (,RETURN-CODE ,RETURN-GEN) + (,COPY-CODE ,COPY-GEN) + (,AGAIN-CODE ,AGAIN-GEN) + (,GO-CODE ,GO-GEN) + (,ARITH-CODE ,ARITH-GEN) + (,RSUBR-CODE ,RSUBR-GEN) + (,0-TST-CODE ,0-TEST) + (,NOT-CODE ,NOT-GEN) + (,1?-CODE ,1?-GEN) + (,TEST-CODE ,TEST-GEN) + (,EQ-CODE ,==-GEN) + (,TY?-CODE ,TYPE?-GEN) + (,LNTH-CODE ,LNTH-GEN) + (,MT-CODE ,MT-GEN) + (,REST-CODE ,REST-GEN) + (,NTH-CODE ,NTH-GEN) + (,PUT-CODE ,PUT-GEN) + (,PUTR-CODE ,PUTREST-GEN) + (,FLVAL-CODE ,FLVAL-GEN) + (,FSET-CODE ,FSET-GEN) + (,FGVAL-CODE ,FGVAL-GEN) + (,FSETG-CODE ,FSETG-GEN) + (,STACKFORM-CODE ,STACKFORM-GEN) + (,MIN-MAX-CODE ,MIN-MAX) + (,CHTYPE-CODE ,CHTYPE-GEN) + (,FIX-CODE ,FIX-GEN) + (,FLOAT-CODE ,FLOAT-GEN) + (,ABS-CODE ,ABS-GEN) + (,MOD-CODE ,MOD-GEN) + (,ID-CODE ,ID-GEN) + (,ASSIGNED?-CODE ,ASSIGNED?-GEN) + (,ISTRUC-CODE ,ISTRUC-GEN) + (,ISTRUC2-CODE ,ISTRUC-GEN) + (,BITS-CODE ,BITS-GEN) + (,GETBITS-CODE ,GETBITS-GEN) + (,BITL-CODE ,BITLOG-GEN) + (,PUTBITS-CODE ,PUTBITS-GEN) + (,ISUBR-CODE ,ISUBR-GEN) + (,EOF-CODE ,ID-GEN) + (,READ-EOF2-CODE ,READ2-GEN) + (,READ-EOF-CODE ,SUBR-GEN) + (,IPUT-CODE ,IPUT-GEN) + (,IREMAS-CODE ,IREMAS-GEN) + (,GET-CODE ,GET-GEN) + (,GET2-CODE ,GET2-GEN) + (,IRSUBR-CODE ,IRSUBR-GEN) + (,MAP-CODE ,MAPFR-GEN) + (,MARGS-CODE ,MPARGS-GEN) + (,MAPLEAVE-CODE ,MAPLEAVE-GEN) + (,MAPRET-STOP-CODE ,MAPRET-STOP-GEN) + (,UNWIND-CODE ,UNWIND-GEN) + (,GVAL-CODE ,GVAL-GEN) + (,SETG-CODE ,SETG-GEN) + (,TAG-CODE ,TAG-GEN) + (,PRINT-CODE ,PRINT-GEN) + (,MEMQ-CODE ,MEMQ-GEN) + (,LENGTH?-CODE ,LENGTH?-GEN) + (,FORM-F-CODE ,FORM-F-GEN) + (,INFO-CODE ,INFO-GEN) + (,OBLIST?-CODE ,OBLIST?-GEN) + (,AS-NXT-CODE ,AS-NXT-GEN) + (,AS-IT-IND-VAL-CODE ,ASSOC-FIELD-GET) + (,ALL-REST-CODE ,ALL-REST-GEN) + (,COPY-LIST-CODE ,LIST-BUILD) + (,PUT-SAME-CODE ,SPEC-PUT-GEN) + (,BACK-CODE ,BACK-GEN) + (,TOP-CODE ,TOP-GEN) + (,SUBSTRUC-CODE ,SUBSTRUC-GEN) + (,ROT-CODE ,ROT-GEN) + (,LSH-CODE ,LSH-GEN) + (,BIT-TEST-CODE ,BIT-TEST-GEN)>> + )> + +<ENDPACKAGE> \ No newline at end of file diff --git a/<mdl.comp>/combat.tailor.6 b/<mdl.comp>/combat.tailor.6 new file mode 100644 index 0000000000000000000000000000000000000000..800847dc24b4418e3485c9514107b1a399c888f7 GIT binary patch literal 1228 zcmeH_K}*9x5QX3BB?v+f3Ox?J=*7AxkrG2{wk5$d39X<vg^Fk~RrIp{d*8%E#7io8 z>>j?%%)WiQ*;$7e1{|M$`C7ke)G_RSiUU!RHMax;99r}c#pvTPhF~Se0%FcV^J7L7 zF%^wi6IO{-Q7P^fPYUiY@PvUPP|(1do<<bgi$2z3)L>V2e+GSdsvREV<9#^_>xY-2 z{&&Qx=lKay94Sr}XSx83dD48h=)M8lE!kY*G1e~dv3Pwf9yf}+#$el&&F}GFn-bvp z=gt9EZR!?RKyjHBECs0B2~F2++UmljEQ(2Ted4mY4A|6BICJ?hDQ8tQi1xy1UXI=G PiFA@zjU>yd`L_K6mnS<G literal 0 HcmV?d00001 diff --git a/<mdl.comp>/comcod.mud.45 b/<mdl.comp>/comcod.mud.45 new file mode 100644 index 0000000..c92c715 --- /dev/null +++ b/<mdl.comp>/comcod.mud.45 @@ -0,0 +1,936 @@ +<PACKAGE "COMCOD"> + +<ENTRY MOVE:ARG ADDR:TYPE ADDR:VALUE MOVE:VALUE STEMP:ADDR MOVE:TYP EMIT + D:B:TAG SEGMENT:LIST TUPLE:FINAL STORE:BIND LOCAL-TAGS TEST:ARGPNTR + REFERENCE BRANCH:TAG PSLOT COPY:ARGPNTR BIND:END TIME:STACK + ACT:FINAL PUSH:BIND TIME:CHECK START:TAG ISTAG? FAST:GVAL + REFERENCE:ARGPNTR REFERENCE:ARG POP:LOCS SEGMENT:STACK PUSH:PAIR + MAKE:ENV LABEL:TAG FAST:SETG BUMP:CNTR MAKE:ACT REFERENCE:STACK + SPEC:REFERENCE:STACK ADDRESS:PAIR PCOUNTER STACK:ARGUMENT + SALLOC:SLOTS FAST:VAL GEN:FALSE SUBR:CALL STORE:PAIR FIX-ACLINK + BUMP:ARGPNTR COUNTP SEGMENT:FINAL TEST:ARG FUNCTION:VALUE + REFERENCE:UNBOUND ACT:INITIAL UNBIND:LOCS FIX:ADDR FAST:SET PUSH:ATB + UNIQUE:TAG ALLOC:SLOTS ADDR:TYPE1 PROG:END ADDR:VALUE1 FUNCTION:INITIAL + REFERENCE:ADR ALLOCATE:SLOTS GETUVT UNBIND:FUNNY LABEL:OFF IMCHK + CODE:PTR CODE:TOP BUILD:FRAME FRAMLN CHECK-LOCAL-TAGS GROUP:INITIAL + INT:LOSER:INITIAL INT:INITIAL SUB:INT:INITIAL FCN:INT:INITIAL + SUB:INITIAL FS:INT:INITIAL RDCL INT:FINAL FS:INT:FINAL FCNSUB:FINAL + ASSEM? TAG:COUNT> + +<USE "CACS" "COMPDEC" "NPRINT" "CODGEN" "PEEPH" "CODING" "CHKDCL" "CUP"> + +<BLOCK (<ROOT>)> + +CSOURCE + +<ENDBLOCK> + +<BLOCK (!.OBLIST <GET PACKAGE OBLIST>)> + + + +"***** BEGINNING OF THE IMPLEMENTATION SECTION *****" + +<DEFINE EMIT (INSTR) + #DECL ((CODE:PTR) LIST) + <PUTREST .CODE:PTR (.INSTR)> + <SET CODE:PTR <REST .CODE:PTR>>> + +<SETG BIND-BEGIN [<FORM (<CHTYPE <TYPE-C ATOM> FIX>) -1>]> + +"Special datum meaning nothing returned." + +<SETG NO-DATUM <CHTYPE (FLUSHED FLUSHED) DATUM>> + +<NEWTYPE ADDRESS:C LIST> + +<DEFINE ADDRESS:C ("TUPLE" T) <CHTYPE (!.T) ADDRESS:C>> + +<NEWTYPE ADDRESS:PAIR LIST> + +<DEFINE ADDRESS:PAIR ("TUPLE" T) <CHTYPE (!.T) ADDRESS:PAIR>> + +<NEWTYPE TYPED:ADDRESS LIST> + +<DEFINE TYPED:ADDRESS (TYP ADR) + <CHTYPE (.TYP !<REFERENCE .ADR>) TYPED:ADDRESS>> + +<NEWTYPE IRSUBR LIST> + +;"FUNNY FUDGES " + +<OR <GASSIGNED? TDEFER!-OP> <SETG TDEFER!-OP <SQUOTA |TDEFER >>> + +<OR <GASSIGNED? TTP!-OP> <SETG TTP!-OP <SQUOTA |TTP >>> + +<OR <GASSIGNED? TTB!-OP> <SETG TTB!-OP <SQUOTA |TTB >>> + +<SETG FRAMACT 9> + +<SETG FRAMLN 7> + +<DEFINE MAKE:TAG ("OPTIONAL" (STR "TAG") ATM) + #DECL ((STR) STRING (ATM) ATOM (TAG:COUNT) FIX) + <SET STR <STRING .STR <UNPARSE .TAG:COUNT>>> + <SET TAG:COUNT <+ .TAG:COUNT 1>> + <GUNASSIGN <SET ATM + <OR <LOOKUP .STR ,TMP:OBL> <INSERT .STR ,TMP:OBL>>>> + .ATM> + +<DEFINE BRANCH:TAG (TAG) <EMIT <INSTRUCTION `JRST .TAG>>> + +<DEFINE LABEL:TAG (TAG) <EMIT .TAG>> + +<DEFINE ISTAG? (ATM) + #DECL ((LOCAL-TAGS) LIST) + <MAPF <> + <FUNCTION (LL) + #DECL ((LL) <LIST ATOM>) + <COND (<==? <1 .LL> .ATM> <MAPLEAVE T>)>> + .LOCAL-TAGS>> + +<DEFINE UNIQUE:TAG (ATM DEF?) + #DECL ((ATM) ATOM (DEF?) <OR ATOM FALSE> (LOCAL-TAGS) LIST) + <COND (<MAPF <> + <FUNCTION (L) + #DECL ((L) <LIST ATOM ATOM <OR FALSE ATOM>>) + <COND (<==? <1 .L> .ATM> + <COND (<AND .DEF? <3 .L>> + <MESSAGE ERROR + "MULTIPLY DEFINED TAG " + .ATM>)> + <AND .DEF? <PUT .L 3 T>> + <MAPLEAVE <2 .L>>)>> + .LOCAL-TAGS>) + (ELSE + <SET LOCAL-TAGS + ((.ATM <SET ATM <MAKE:TAG <PNAME .ATM>>> .DEF?) + !.LOCAL-TAGS)> + .ATM)>> + +<DEFINE CHECK-LOCAL-TAGS (L "AUX" (LOSERS ())) + #DECL ((L LOSERS) LIST) + <MAPF <> + <FUNCTION (LL) + #DECL ((LL) <LIST ATOM ATOM <OR ATOM FALSE>>) + <COND (<NOT <3 .LL>> <SET LOSERS (<1 .LL> !.LOSERS)>)>> + .L> + <COND (<NOT <EMPTY? .LOSERS>> + <MESSAGE ERROR " UNDEFINED LABEL (S) " .LOSERS>)>> + +<DEFINE LABEL:OFF (TAG) + <COND (.GLUE <LABEL:TAG .TAG>) + (<EMIT <INSTRUCTION + PSEUDO!-OP + <FORM SETG + .TAG + '<ANDB 262143 <CHTYPE .HERE!-OP FIX>>>>>)>> + +<DEFINE TRUE:BRANCH:TAG (TAG SRC) <D:B:TAG .TAG .SRC T <>>> + +<DEFINE FALSE:BRANCH:TAG (TAG SRC) <D:B:TAG .TAG .SRC <> <>>> + +<DEFINE D:B:TAG (TAG SRC DIR TYP "AUX" DT) + #DECL ((SRC) DATUM (DIR) <OR FALSE ATOM>) + <COND (<AND .TYP + <SET DT <ISTYPE? <TYPE-AND .TYP '<NOT FALSE>>>> + <OR <MEMQ .DT '![CHANNEL RSUBR ATOM!]> + <AND <MEMQ <TYPEPRIM .DT> '![UVECTOR VECTOR!]> + <G? <MINL .DT> 0>>>> + <COND (<TYPE? <SET DT <DATVAL .SRC>> AC> + <EMIT <INSTRUCTION <COND (.DIR `JUMPL ) (ELSE `JUMPGE )> + <ACSYM .DT> + .TAG>>) + (ELSE + <EMIT <INSTRUCTION <COND (.DIR `SKIPGE ) (ELSE `SKIPL )> + !<ADDR:VALUE .SRC>>> + <BRANCH:TAG .TAG>)>) + (ELSE + <EMIT <INSTRUCTION GETYP!-OP `O* !<ADDR:TYPE .SRC>>> + <EMIT <INSTRUCTION <COND (.DIR `CAIE ) (ELSE `CAIN )> + `O* + '<TYPE-CODE!-OP FALSE>>> + <BRANCH:TAG .TAG>)>> + +<DEFINE GEN:FALSE () <EMIT <INSTRUCTION `PUSHJ `P* |RTFALS >>> + +<DEFINE SUBR:CALL (ADR ARG-NUMBER) + <EMIT <INSTRUCTION MCALL!-OP .ARG-NUMBER .ADR>>> + +<DEFINE FUNCTION:VALUE ("OPTIONAL" (ALLOC <>) "AUX" (DAT <DATUM ,AC-A ,AC-B>)) + <COND (.ALLOC + <SGETREG <DATTYP .DAT> .DAT> + <SGETREG <DATVAL .DAT> .DAT>)> + .DAT> + +<SETG TMP:OBL <MOBLIST <OR <LOOKUP "TMP" <ROOT>> <INSERT "TMP" <ROOT>>>>> + +<DEFINE ADDR:TYPE (DAT "AUX" (TYP <DATTYP .DAT>)) + #DECL ((DAT) <DATUM ANY ANY>) + <ADDR:TYPE1 .TYP>> + +<DEFINE ADDR:TYPE1 (ADR "AUX" TT) + <COND (<TYPE? .ADR AC> (<ADDRSYM .ADR>)) + (<TYPE? .ADR ATOM> (<TYPE:SYM .ADR>)) + (<TYPE? .ADR TEMP> <TEMP:ADDR .ADR 0>) + (<TYPE? .ADR ADDRESS:C> .ADR) + (<TYPE? .ADR ADDRESS:PAIR> (<1 .ADR>)) + (<TYPE? .ADR OFFPTR> + <COND (<=? <DATVAL <2 .ADR>> #ADDRESS:PAIR (|$TTB + `TB )> + (<1 .ADR> `(TB) )) + (ELSE + <TOACV <2 .ADR>> ;"FORCE INDEX INTO REG " + <COND (<AND <MEMQ <SET TT <3 .ADR>> <ALLTYPES>> + <MEMQ <TYPEPRIM .TT> '![STORAGE UVECTOR!]>> + (<GETUVT <DATVAL <2 .ADR>>>)) + (ELSE + (<1 .ADR> + !<COND (<==? <LENGTH .ADR> 4> <4 .ADR>) + (ELSE (0))> + (<ADDRSYM <DATVAL <2 .ADR>>>)))>)>)>> + +<DEFINE GETUVT (AC "OPTIONAL" (TOAC ,ACO) (NS <>) "AUX" TAC (P <ACPROT .AC>)) + #DECL ((AC TAC TOAC) AC) + <PUT .AC ,ACPROT T> + <EMIT <INSTRUCTION `HLRE + <ACSYM <SET TAC <GETREG <>>>> + <ADDRSYM .AC>>> + <EMIT <INSTRUCTION `SUBM <ACSYM .AC> <ADDRSYM .TAC>>> + <PUT .AC ,ACPROT .P> + <EMIT <INSTRUCTION GETYP!-OP <ACSYM .TOAC> (<ADDRSYM .TAC>)>> + <OR .NS <EMIT <INSTRUCTION `HRLZS <ADDRSYM .TOAC>>>> + <ADDRSYM .TOAC>> + +<DEFINE TYPE:SYM (NAME) <FORM TYPE-WORD!-OP .NAME>> + +<DEFINE ADDR:VALUE (DAT "AUX" (VAL <DATVAL .DAT>)) + #DECL ((DAT) <DATUM ANY ANY>) + <ADDR:VALUE1 .VAL>> + +<DEFINE ADDR:VALUE1 (ADR) + <COND (<TYPE? .ADR ADDRESS:C> (!.ADR 1)) + (<TYPE? .ADR ADDRESS:PAIR> <REST .ADR>) + (<TYPE? .ADR AC> (<ADDRSYM .ADR>)) + (<TYPE? .ADR TEMP> <TEMP:ADDR .ADR 1>) + (<TYPE? .ADR OFFPTR> + <COND (<=? <DATVAL <2 .ADR>> #ADDRESS:PAIR (|$TTB + `TB )> + (<+ <1 .ADR> 1> `(TB) )) + (ELSE + <TOACV <2 .ADR>> + (!<COND (<==? <LENGTH .ADR> 4> <4 .ADR>) (ELSE (0))> + <+ 1 <1 .ADR>> + (<ADDRSYM <DATVAL <2 .ADR>>>)))>) + (ELSE <MESSAGE INCONSISTENCY "BAD ADDRESS "> ())>> + + +<DEFINE TEMP:ADDR (TM OFF "AUX" DAT) + #DECL ((DAT) <OR FALSE DATUM> (TM) TEMP (OFF) FIX (FCN) NODE) + <COND (<SET DAT <TMPAC .TM>> + <COND (<0? .OFF> <ADDR:TYPE1 <DATTYP .DAT>>) + (<1? .OFF> <ADDR:VALUE1 <DATVAL .DAT>>) + (<MESSAGE "INCONSISTENCY" "TEMPORARY OFFSET BAD">)>) + (<COND (<=? .AC-HACK '(STACK)> + (!<FIX:ADDR (-1 <- .OFF> !<STACK:L .STK .BSTB>) + (<TMPNO .TM> !.TMPS)> + '`(TP) )) + (ELSE + <REFERENCE:STACK:ADR + (.OFF <TMPNO .TM> + <COND (<=? .AC-HACK '(FUNNY-STACK)> + <* <TOTARGS .FCN> -2>) + (ELSE 0)> !.TMPS) .AC-HACK>)>)>> + +<DEFINE STEMP:ADDR (TM "OPTIONAL" (OFF 0)) + #DECL ((TM) TEMP (OFF) FIX (FCN) NODE) + <COND (<=? .AC-HACK '(STACK)> + (!<FIX:ADDR (-1 <- .OFF> !<STACK:L .STK .BSTB>) + (<TMPNO .TM> !.TMPS)> + '`(TP) )) + (ELSE + <REFERENCE:STACK:ADR + (.OFF <TMPNO .TM> + <COND (<=? .AC-HACK '(FUNNY-STACK)> + <* <TOTARGS .FCN> -2>) + (ELSE 0)> !.TMPS) .AC-HACK>)>> + +"FIX:ADDR TAKES TWO ARGUMENTS. THESE ARE A NEGATIVE AND POSITIVE OFFSETS ON THE STACK + AND BUILDS A COMPOSITE OFFSET ELIMINATING DUPLICATION" + +<DEFINE FIX:ADDR (NEGS OPOS + "AUX" (POS <LIST !.OPOS>) (NUM 0) (NPOS ()) (NNEGS ()) LN) + #DECL ((NEGS POS) LIST (NUM) FIX (NNEGS) LIST) + <MAPF <> + <FUNCTION (NEG1 "AUX" NEGX) + <COND (<TYPE? .NEG1 FIX> <SET NUM <- .NUM .NEG1>>) + (<AND <TYPE? .NEG1 FORM ATOM> + <SET NEGX <MEMBER .NEG1 .POS>>> + <SET LN <- <LENGTH .POS> <LENGTH .NEGX> -1>> + <SET POS <DEL .POS .LN>>) + (ELSE <SET NNEGS (.NEG1 !.NNEGS)>)>> + .NEGS> + <MAPF <> + <FUNCTION (NPOS1) + <COND (<TYPE? .NPOS1 FIX> <SET NUM <+ .NUM .NPOS1>>) + (<SET NPOS (.NPOS1 !.NPOS)>)>> + .POS> + <COND (<NOT <EMPTY? .NNEGS>> (<FORM - .NUM !.NNEGS> !.NPOS)) + (ELSE (.NUM !.NPOS))>> + +<DEFINE DEL (IT NUM) + #DECL ((IT) <LIST ANY> (NUM) FIX) + <COND (<==? .NUM 1> <REST .IT>) + (ELSE <PUTREST <REST .IT <- .NUM 2>> <REST .IT .NUM>> .IT)>> + +<DEFINE REFERENCE:ADR (OBJECT "EXTRA" TTYPE) + <COND (<AND <==? <PRIMTYPE .OBJECT> WORD> + <SET TTYPE <FORM TYPE-WORD!-OP <TYPE .OBJECT>>>> + <ADDRESS:PAIR .TTYPE [.OBJECT]>) + (<AND <==? <PRIMTYPE .OBJECT> LIST> <EMPTY? .OBJECT>> + <ADDRESS:PAIR <FORM TYPE-WORD!-OP <TYPE .OBJECT>> '[0]>) + (ELSE + <ADDRESS:C <FORM MQUOTE!-OP <FORM QUOTE .OBJECT>> -1>)>> + +<DEFINE REFERENCE (OBJ "AUX" ADR) + #DECL ((VALUE) <DATUM ANY ANY>) + <SET ADR <REFERENCE:ADR .OBJ>> + <DATUM .ADR .ADR>> + +<DEFINE STACK:ARGUMENT (DAT "AUX" TEM) + #DECL ((DAT) <DATUM ANY ANY>) + <COND (<N==? .DAT ,NO-DATUM> + <EMIT <INSTRUCTION `PUSH `TP* !<ADDR:TYPE .DAT>>> + <SET TEM <ADDR:VALUE .DAT>> + <EMIT <INSTRUCTION `PUSH + `TP* + !.TEM + !<COND (<MEMQ '`(TP) .TEM> '(-1))>>>)> + .DAT> + +<DEFINE STACK:ADR (ADR) + <EMIT <INSTRUCTION `PUSH `TP* !<ADDR:TYPE1 .ADR>>> + <EMIT <INSTRUCTION `PUSH `TP* !<ADDR:VALUE1 .ADR>>> + .ADR> + +<DEFINE MOVE:ARG (FROM1 TO1 + "OPTIONAL" (KEEP <>) + "AUX" TMP TT TO TAC T1 TMP1 T2 FROM (NOTYET <>) (NOTYET2 <>) + VAL LSEXCH) + #DECL ((TMP FROM TO) <<PRIMTYPE LIST> ANY ANY> (TAC) AC (VAL) FIX) + <PROG () + <COND + (<TYPE? .TO1 ATOM> <AND <==? .TO1 FLUSHED> <RET-TMP-AC .FROM1>> FLUSHED) + (<==? .FROM1 ,NO-DATUM> <RETURN ,NO-DATUM>) + (<AND <SET FROM .FROM1> <SET TMP1 <ACS? <SET TO .TO1>>> <SET TMP .TMP1>> + <COND (<==? <SET TT <DATTYP .TMP>> ANY-AC> + <COND (<TYPE? <DATTYP .FROM> AC> <SET TT <DATTYP .FROM>>) + (ELSE <SET TT <GETREG <>>>)> + <REPEAT ((L ())) + #DECL ((L) <LIST [REST AC]>) + <COND (<MEMQ .TT .TO> + <SET L (.TT !.L)> + <PUT .TT ,ACPROT T> + <SET TT <GETREG <>>>) + (ELSE + <PUT .TMP ,DATTYP .TT> + <MAPF <> + <FUNCTION (TT) + #DECL ((TT) AC) + <PUT .TT ,ACPROT <>>> + .L> + <RETURN>)>>)> + <AND <==? <SET T1 <DATVAL .TMP>> ANY-AC> + <COND (<TYPE? <DATVAL .FROM> AC> + <PUT .TMP ,DATVAL <SET T1 <DATVAL .FROM>>>) + (ELSE + <COND (<TYPE? .TT AC> + <SET TAC .TT> + <SET T2 <ACPROT .TAC>> + <PUT .TAC ,ACPROT T>)> + <PUT .TMP ,DATVAL <SET T1 <GETREG <>>>> + <COND (<TYPE? .TT AC> + <SET TAC .TT> + <PUT .TAC ,ACPROT .T2>)>)>> + <COND (<AND <TYPE? <DATTYP .FROM> AC> + <TYPE? <DATVAL .FROM> AC> + <==? .T1 <DATTYP .FROM>> + <OR <TYPE? .TT ATOM> <==? .TT <DATVAL .FROM>>>> + <EMIT <INSTRUCTION `EXCH <ACSYM .T1> <ADDRSYM <DATVAL .FROM>>>> + <SET LSEXCH <EXCH-ACL .T1 <SET T2 <DATVAL .FROM>> <ACLINK .T1>>> + <SET LSEXCH <EXCH-ACL .T2 .T1 <ACLINK .T2> .LSEXCH>> + <MAPF <> + <FUNCTION (S "AUX" (SNA <SINACS .S>)) + <COND (<NOT <MEMQ .SNA .LSEXCH>> + <SET LSEXCH (.SNA !.LSEXCH)> + <EXCH-AC .T1 .T2 <SINACS .S>>)>> + <ACRESIDUE <DATVAL .FROM>>>)> + <AND <TYPE? .TT ATOM> + <TYPE? <DATTYP .FROM> AC> + <PUT .TMP ,DATTYP <SET TT <DATTYP .FROM>>>> + <AND <TYPE? .TT AC> + <SET TAC .TT> + <COND (<==? .TAC <DATTYP .FROM>> <FIX-ACLINK .TAC .TO .FROM>) + (<NOT <AND <NOT .KEEP> <ACLINK .TAC> <ACMEMQ .TAC .FROM>>> + <SGETREG .TAC .TO>) + (ELSE <SET NOTYET T>)>> + <AND <TYPE? .T1 AC> + <SET TAC .T1> + <COND (<==? <DATVAL .FROM> .TAC> <FIX-ACLINK .TAC .TO .FROM>) + (<NOT <AND <NOT .KEEP> + <NOT .NOTYET> + <ACLINK .TAC> + <ACMEMQ .TAC .FROM>>> + <SGETREG .TAC .TO>) + (ELSE <SET NOTYET2 T>)>> + <COND (<OR .NOTYET .NOTYET2> + <RET-TMP-AC .FROM> + <COND (.NOTYET + <SGETREG .TT .TO> + <MOVE:VALUE <DATVAL .FROM> .T1> + <MOVE:TYP <DATTYP .FROM> .TT>) + (ELSE + <SGETREG .T1 .TO> + <MOVE:TYP <DATTYP .FROM> .TT> + <MOVE:VALUE <DATVAL .FROM> .T1>)> + <PUT .FROM ,DATTYP FIX> + <PUT .FROM ,DATVAL DONT-CARE>) + (ELSE + <MOVE:TYP <DATTYP .FROM> .TT> + <MOVE:VALUE <DATVAL .FROM> .T1>)> + <REPEAT ((L .TO)) + #DECL ((L) <PRIMTYPE LIST>) + <AND <EMPTY? .L> <RETURN .TO>> + <OR <==? .TMP .L> + <PROG () + <MOVE:TYP <DATTYP .TMP> <DATTYP .L>> + <MOVE:VALUE <DATVAL .TMP> <DATVAL .L>>>> + <SET L <REST .L 2>>>) + (<SET TMP1 <ACS? .FROM>> + <SET TMP .TMP1> + <REPEAT ((L .TO)) + #DECL ((L) <PRIMTYPE LIST>) + <MOVE:TYP <DATTYP .TMP> <DATTYP .L>> + <MOVE:VALUE <DATVAL .TMP> <DATVAL .L>> + <AND <EMPTY? <SET L <REST .L 2>>> <RETURN>>>) + (ELSE + <COND (<NOT <OR <TYPE? <DATTYP .TO> ATOM> + <AND <==? <LENGTH .TO> 2> + <=? <DATTYP .TO> <DATTYP .FROM>>>>> + <MOVE:TYP <DATTYP .FROM> ,ACO> + <REPEAT ((L .TO)) + #DECL ((L) <PRIMTYPE LIST>) + <MOVE:TYP ,ACO <DATTYP .L>> + <AND <EMPTY? <SET L <REST .L 2>>> <RETURN>>>)> + <COND + (<NOT <OR <TYPE? <DATVAL .TO> ATOM> + <AND <==? <LENGTH .TO> 2> <=? <DATVAL .TO> <DATVAL .FROM>>>>> + <COND (<AND <TYPE? <DATVAL .FROM> ADDRESS:PAIR> + <OR <==? <SET VAL <CHTYPE <1 <2 <DATVAL .FROM>>> FIX>> -1> + <0? .VAL>>> + <REPEAT ((L .TO)) + #DECL ((L) <PRIMTYPE LIST>) + <EMIT <INSTRUCTION <COND (<0? .VAL> `SETZM ) + (ELSE `SETOM )> + !<ADDR:VALUE .L>>> + <AND <EMPTY? <SET L <REST .L 2>>> <RETURN>>>) + (ELSE + <MOVE:VALUE <DATVAL .FROM> ,ACO> + <REPEAT ((L .TO)) + #DECL ((L) <PRIMTYPE LIST>) + <MOVE:VALUE ,ACO <DATVAL .L>> + <AND <EMPTY? <SET L <REST .L 2>>> <RETURN>>>)>)>)> + <COND (<TYPE? .TO1 DATUM> + <MAPF <> + <FUNCTION (X) <COND (<TYPE? .X AC> <PUT .X ,ACPROT <>>)>> + .TO>)> + <COND (<AND <NOT .KEEP> <NOT <TYPE? .TO1 ATOM>>> + <REPEAT ((L .FROM)) + #DECL ((L) <PRIMTYPE LIST>) + <OR <MEMQ <1 .L> .TO> <RET-TMP-AC <1 .L> .FROM>> + <AND <EMPTY? <SET L <REST .L>>> <RETURN .TO>>>) + (<TYPE? .TO1 ATOM> .FROM1) + (ELSE .TO1)>>> + +<DEFINE MOVE:TYP (ADDRF ADDRT "AUX" TT TAC) + #DECL ((TAC) AC) + <COND (<=? .ADDRF .ADDRT>) + (<TYPE? .ADDRT AC> + <SET TAC .ADDRT> + <PUT .TAC ,ACPROT T> + <COND (<AND <TYPE? .ADDRF OFFPTR> + <MEMQ <SET TT <3 .ADDRF>> <ALLTYPES>> + <MEMQ <TYPEPRIM .TT> '![STORAGE UVECTOR!]>> + <TOACV <2 .ADDRF>> + <GETUVT <DATVAL <2 .ADDRF>> .TAC>) + (ELSE + <EMIT <INSTRUCTION `MOVE + <ACSYM .TAC> + !<ADDR:TYPE1 .ADDRF>>>)> + <PUT .TAC ,ACPROT <>>) + (<TYPE? .ADDRF AC> + <SET TAC .ADDRF> + <PUT .TAC ,ACPROT T> + <OR <TYPE? .ADDRT ATOM> + <EMIT <INSTRUCTION `MOVEM + <ACSYM .TAC> + !<ADDR:TYPE1 .ADDRT>>>> + <PUT .TAC ,ACPROT <>>) + (<NOT <TYPE? .ADDRT ATOM>> + <MOVE:TYP .ADDRF ,ACO> + <MOVE:TYP ,ACO .ADDRT>)>> + +<DEFINE MOVE:VALUE (ADDRF ADDRT "AUX" TAC) + #DECL ((TAC) AC) + <COND (<=? .ADDRT .ADDRF>) + (<TYPE? .ADDRT AC> + <SET TAC .ADDRT> + <PUT .TAC ,ACPROT T> + <IMCHK '(`MOVE `MOVEI `MOVNI `MOVSI ) + <ACSYM .TAC> + .ADDRF> + <PUT .TAC ,ACPROT <>>) + (<TYPE? .ADDRF AC> + <SET TAC .ADDRF> + <PUT .TAC ,ACPROT T> + <OR <TYPE? .ADDRT ATOM> + <EMIT <INSTRUCTION `MOVEM + <ACSYM .TAC> + !<ADDR:VALUE1 .ADDRT>>>> + <PUT .TAC ,ACPROT <>>) + (<NOT <TYPE? .ADDRT ATOM>> + <MOVE:VALUE .ADDRF ,ACO> + <MOVE:VALUE ,ACO .ADDRT>)>> + +<DEFINE ACMEMQ (TAC DAT "AUX" (T1 <DATTYP .DAT>) (TT <DATVAL .DAT>)) + #DECL ((TAC) AC (DAT) DATUM) + <OR <==? .T1 .TAC> + <==? .TT .TAC> + <AND <OR <ISTYPE? .T1> <==? .T1 .TT>> + <TYPE? .TT OFFPTR> + <TOACV <2 .TT>> + <==? <DATVAL <2 .TT>> .TAC>>>> + +<DEFINE EXCH-ACL (AC1 AC2 L "OPTIONAL" (LST ())) + #DECL ((AC1 AC2) AC (L) <LIST [REST DATUM]>) + <MAPF <> + <FUNCTION (D) + #DECL ((D) DATUM) + <COND (<NOT <MEMQ .D .LST>> + <EXCH-AC .AC1 .AC2 .D> + <SET LST (.D !.LST)>)>> + .L> + .LST> + +<DEFINE EXCH-AC (AC1 AC2 D "AUX" TMP) + #DECL ((AC1 AC2) AC (D) DATUM) + <COND (<AND <==? .AC1 <DATTYP .D>> <==? .AC2 <DATVAL .D>>> + <PUT .D ,DATVAL .AC1> + <PUT .D ,DATTYP .AC2>) + (<SET TMP <MEMQ .AC1 .D>> + <PUT .TMP 1 .AC2> + <PUT .AC2 ,ACLINK (.D !<ACLINK .AC2>)> + <PUT .AC1 + ,ACLINK + <MAPF ,LIST + <FUNCTION (DAT) + <COND (<N==? .DAT .D> <MAPRET .DAT>) + (<MAPRET>)>> + <ACLINK .AC1>>>) + (<SET TMP <MEMQ .AC2 .D>> + <PUT .TMP 1 .AC1> + <PUT .AC1 ,ACLINK (.D !<ACLINK .AC1>)> + <PUT .AC2 + ,ACLINK + <MAPF ,LIST + <FUNCTION (DAT) + <COND (<==? .DAT .D> <MAPRET>) + (ELSE <MAPRET .DAT>)>> + <ACLINK .AC2>>>)>> + +<DEFINE FIX-ACLINK (AC TO FROM "AUX" (L <MEMQ .FROM <ACLINK .AC>>)) + #DECL ((AC) AC (L) <PRIMTYPE LIST>) + <COND (.L <PUT .L 1 .TO>) + (ELSE <PUT .AC ,ACLINK (.TO !<ACLINK .AC>)>)>> + +<DEFINE ACS? (DAT) + #DECL ((DAT) <PRIMTYPE LIST>) + <REPEAT () + <AND <EMPTY? .DAT> <RETURN <>>> + <COND (<OR <TYPE? <DATVAL .DAT> AC> <==? <DATVAL .DAT> ANY-AC>> + <RETURN .DAT>) + (<AND <TYPE? <DATVAL .DAT> ATOM> + <OR <TYPE? <DATTYP .DAT> AC> + <==? <DATTYP .DAT> ANY-AC>>> + <RETURN .DAT>)> + <SET DAT <REST .DAT 2>>>> + +<DEFINE IMCHK (INS AC ISRC "OPTIONAL" (COM <>) + "AUX" SRC VAL (LN <LENGTH .INS>)) + #DECL ((AC) <PRIMTYPE WORD> (VAL LN) FIX (INS) <LIST ANY ANY> + (SRC) <<PRIMTYPE LIST> ANY <VECTOR <PRIMTYPE WORD>>>) + <COND (<AND <TYPE? .ISRC ADDRESS:PAIR> + <NOT <EMPTY? <REST .ISRC>>> + <TYPE? <2 .ISRC> VECTOR> + <SET SRC .ISRC>> + <SET VAL <CHTYPE <1 <2 .SRC>> FIX>> + <COND (<AND <G=? .VAL 0> + <L? .VAL 262144> + <TYPE? <2 .INS> OPCODE!-OP>> + <EMIT <INSTRUCTION <2 .INS> .AC .VAL>>) + (<AND <G=? .LN 3> + <N==? <CHTYPE .VAL WORD> #WORD *400000000000*> + <L? <ABS .VAL> 262144> + <TYPE? <3 .INS> OPCODE!-OP>> + ;"Was negative immediate ins supplied?" + <EMIT <INSTRUCTION <3 .INS> .AC <- <ABS .VAL> <COND (.COM 1) + (0)>>>>) + (<AND <==? .LN 4> + <0? <CHTYPE <GETBITS .VAL <BITS 18>> FIX>>> + <EMIT <INSTRUCTION <4 .INS> + .AC + <CHTYPE <GETBITS .VAL <BITS 18 18>> FIX>>>) + (ELSE + <EMIT <INSTRUCTION <1 .INS> .AC !<ADDR:VALUE1 .SRC>>>)>) + (ELSE + <EMIT <INSTRUCTION <1 .INS> .AC !<ADDR:VALUE1 .ISRC>>>)>> + +<DEFINE GROUP:INITIAL (NAME) + <EMIT <INSTRUCTION TITLE .NAME>> + <EMIT <INSTRUCTION DECLARE!-OP '("VALUE" ATOM)>> + <EMIT <INSTRUCTION `MOVE `A* <FORM MQUOTE!-OP .NAME> -1>> + <EMIT <INSTRUCTION `MOVE `B* <FORM MQUOTE!-OP .NAME>>> + <EMIT <INSTRUCTION `JRST |FINIS >>> + +<DEFINE FUNCTION:INITIAL (NAME) + <AND .NAME <EMIT <INSTRUCTION TITLE .NAME <>>>> + <EMIT <SET RDCL <INSTRUCTION DECLARE!-OP 0>>> ;"Initial declarations."> + +<DEFINE SUB:INITIAL (NAME "AUX" DC) + #DECL ((DC) <FORM ATOM>) + <EMIT <SET DC <INSTRUCTION SUB-ENTRY!-OP .NAME 0>>> + <SET RDCL <REST .DC>>> + +<DEFINE INT:INITIAL (NAME) <SET RDCL <CHTYPE (0 0) IRSUBR>>> + +<DEFINE SUB:INT:INITIAL (NAME "AUX" DC) + #DECL ((DC) <FORM ATOM>) + <EMIT <SET DC <INSTRUCTION SUB-ENTRY!-OP .NAME 0>>> + <SET RDCL <REST .DC>>> + +<DEFINE FCN:INT:INITIAL (NAME) + <EMIT <INSTRUCTION TITLE .NAME <>>> + <EMIT <SET RDCL <INSTRUCTION DECLARE!-OP 0>>>> + +<DEFINE INT:LOSER:INITIAL (NAME FCN + "AUX" (ACSTR <1 <ACS .FCN>>) (TR <TOTARGS .FCN>) + (RQ <REQARGS .FCN>) (INAME <NODE-NAME .FCN>) TG + DC) + #DECL ((FCN) NODE (TR RQ) FIX (INAME) UVECTOR) + <COND (<=? .ACSTR '(STACK)> + <COND (<EMPTY? <REST .INAME>> + <LABEL:TAG <1 .INAME>> + <EMIT '<`SUBM `M* `(P) >> + <EMIT <INSTRUCTION MCALL!-OP .TR .NAME>>) + (ELSE + <SET TG <MAKE:TAG>> + <MAPR <> + <FUNCTION (NN "AUX" (LAST <EMPTY? <REST .NN>>)) + <LABEL:TAG <1 .NN>> + <EMIT <INSTRUCTION `MOVEI `A* .TR>> + <COND (.LAST <LABEL:TAG .TG>) + (ELSE <BRANCH:TAG .TG>)> + <SET TR <- .TR 1>>> + .INAME> + <EMIT '<`SUBM `M* `(P) >> + <EMIT <INSTRUCTION ACALL!-OP `A* .NAME>>)>) + (ELSE + <LABEL:TAG <1 .INAME>> + <EMIT '<`SUBM `M* `(P) >> + <MAPF <> + <FUNCTION (L) + #DECL ((L) LIST) + <RET-TMP-AC <STACK:ARGUMENT <DATUM <1 .L> <2 .L>>>>> + .ACSTR> + <EMIT <INSTRUCTION MCALL!-OP .TR .NAME>>)> + <EMIT '<`JRST |MPOPJ >> + <EMIT <SET DC <INSTRUCTION SUB-ENTRY!-OP .NAME 0>>> + <SET RDCL <REST .DC>>> + +<DEFINE FCNSUB:FINAL (NOD) <EMIT <INSTRUCTION `JRST |FINIS >>> + +<DEFINE FS:INT:FINAL (ACS) + <COND (<=? .ACS '(STACK)> <EMIT '<`JRST |MPOPJ >>) + (ELSE <EMIT '<`JRST |FMPOPJ >>)>> + +<DEFINE INT:FINAL (NOD) + #DECL ((RDCL) <LIST ANY> (NOD) NODE) + <EMIT <INSTRUCTION `JRST |MPOPJ >> + <PUT .RDCL 1 .NOD> + .RDCL> + + +<DEFINE ASSEM? (SRC-FLG "OPTIONAL" (BIN-FLG .BIN-FLG) "AUX" X (T <TIME>)) + #DECL ((CODE:TOP) <LIST ANY>) + <COND (<AND <ASSIGNED? CSOURCE> .CSOURCE> + <PRT <REST .CODE:TOP>>)> + <PUTREST .CODE:TOP <SET X <CDUP <REST .CODE:TOP>>>> + <EXP-MAC .CODE:TOP> + <COND (.PEEP <PEEP .X !.X> <TERPRI>)> + <COND (.BIN-FLG + <ASSEMBLE1!-CODING!-PACKAGE .X <1 .OBLIST> <> .SRC-FLG>) + (ELSE .X)>> + + +<DEFINE BLOCK:INITIAL () T> + +<DEFINE BLOCK:FINAL () T> + +<DEFINE PROG:END () <EMIT <INSTRUCTION `JRST |FINIS >>> + +<DEFINE UNBIND:FUNNY (N "TUPLE" Y) + <AND .SPECD + <EMIT <INSTRUCTION `MOVEI + `E* + .N + !.Y + <COND (.AC-HACK 1) (ELSE 0)> + <COND (.AC-HACK '`(FRM) ) (ELSE '`(TB) )>>> + <EMIT <INSTRUCTION `PUSHJ `P* |SSPEC1 >>>> + +<DEFINE UNBIND:LOCS (FROM TO "OPTIONAL" (FLG <>)) + <COND (<NOT .FLG> + <AND <POP:LOCS .FROM .TO> + .SPECD + <EMIT <INSTRUCTION `PUSHJ `P* |SSPECS >>>) + (.SPECD + <EMIT '<`MOVE `TP* `FRM>> + <EMIT '<`PUSHJ `P* |SSPECS>>)>> + +<DEFINE POP:LOCS (FROM TO "AUX" (OTHERS ()) (AMNT 0) (PST 0) REG (PSTN 0) TEM) + #DECL ((FROM TO) LIST (AMNT PST PSTN) FIX (REG) AC) + <REPEAT ((FROM .FROM)) ;"First count known locals and # of slots." + #DECL ((FROM) LIST) + <AND <==? .TO .FROM> <RETURN>> + <COND (<TYPE? <SET TEM <1 .FROM>> FIX> <SET AMNT <+ .AMNT .TEM>>) + (<==? .TEM PSLOT> <SET PSTN <+ .PSTN 1>>) + (<==? .TEM PSTACK> <SET PST <+ .PST 1>>) + (ELSE <SET OTHERS (.TEM !.OTHERS)>)> + <SET FROM <REST .FROM>>> + <COND + (<0? .PST> + <OR <AND <0? .AMNT> <EMPTY? .OTHERS>> + <EMIT <INSTRUCTION DEALLOCATE (.AMNT !.OTHERS)>>> + <OR <0? .PSTN> + <EMIT <INSTRUCTION `SUB `P* [<FORM .PSTN (.PSTN)>]>>>) + (ELSE + <SET REG <GETREG <>>> + <COND + (<AND <1? .PST> <0? .PSTN>> + <EMIT <INSTRUCTION `POP `P* <ADDRSYM .REG>>>) + (ELSE + <REPEAT ((OFFS 0) (FST T)) + #DECL ((OFFS) FIX) + <COND (<==? <SET TEM <1 .FROM>> PSLOT> <SET OFFS <+ .OFFS 1>>) + (<==? .TEM PSTACK> + <COND (.FST + <EMIT <INSTRUCTION `MOVEI + <ACSYM .REG> + `@ + <- .OFFS> + '`(P) >> + <SET FST <>>) + (ELSE + <EMIT <INSTRUCTION `ADDI + <ACSYM .REG> + `@ + <- .OFFS> + '`(P) >>)>)> + <AND <==? .TO <SET FROM <REST .FROM>>> <RETURN>>> + <EMIT <INSTRUCTION `SUB + `P* + [<FORM <SET PST <+ .PSTN .PST>> (.PST)>]>>)> + <EMIT <INSTRUCTION `ADDI + <ACSYM .REG> + !.OTHERS + .AMNT + (<ADDRSYM .REG>)>> + <EMIT <INSTRUCTION `HRLI <ACSYM .REG> (<ADDRSYM .REG>)>> + <EMIT <INSTRUCTION `SUB `TP* <ADDRSYM .REG>>>)> + <NOT <AND <0? .AMNT> <0? .PST>>>> + +;"This is machine dependant code associated with setting up argument TUPLEs." + +<DEFINE COPY:ARGPNTR () + <EMIT <INSTRUCTION `MOVE `C* `AB >> + <EMIT <INSTRUCTION `MOVEI `D* 0>> ;"D will count args pushed."> + +<DEFINE BUMP:ARGPNTR ("OPTIONAL" (N 1)) + #DECL ((N) FIX) + <SET N <* .N 2>> + <EMIT <INSTRUCTION `ADD `C* [<FORM .N (.N)>]>> + ;"Bump an AOBJN pointer"> + +<DEFINE BUMP:CNTR ("OPTIONAL" (N 1)) + #DECL ((N) FIX) + <SET N <* .N 2>> + <EMIT <INSTRUCTION `ADDI `D* .N>>> + +<DEFINE TEST:ARGPNTR (TAG) <EMIT <INSTRUCTION `JUMPGE `C* .TAG>>> + +<DEFINE REFERENCE:ARGPNTR () + #DECL ((VALUE) <DATUM ADDRESS:C ADDRESS:C>) + <DATUM #ADDRESS:C (`(C) ) #ADDRESS:C (`(C) )>> + +<DEFINE TUPLE:FINAL ("AUX" (VAL <FUNCTION:VALUE T>)) + #DECL ((VALUE) <DATUM AC AC>) + <EMIT <INSTRUCTION `PUSHJ `P* |MAKTUP >> + .VAL> + +<DEFINE REFERENCE:STACK:ADR (N "OPTIONAL" (AC-HACK .AC-HACK)) + <COND (.AC-HACK <ADDRESS:C 1 `(FRM) !.N>) + (ELES <ADDRESS:C `(TB) !.N>)>> + +<DEFINE REFERENCE:STACK (N "AUX" (TT <REFERENCE:STACK:ADR .N>)) + #DECL ((VALUE) <DATUM ADDRESS:C ADDRESS:C>) + <DATUM .TT .TT>> + +;"Machine dependant stuff for activations and environemnts" + +<DEFINE SPEC:REFERENCE:STACK (AC-HACK ADDRESS + "AUX" (TT + <REFERENCE:STACK:ADR .ADDRESS .AC-HACK>)) + <DATUM .TT .TT>> + +<DEFINE MAKE:ENV ("AUX" (VAL <FUNCTION:VALUE T>)) + <EMIT <INSTRUCTION `PUSHJ `P* |MAKENV >> + .VAL> + +<DEFINE ACT:INITIAL () + <SET START:TAG <MAKE:TAG>> + <COND (.GLUE + <EMIT <INSTRUCTION `MOVEI `O* .START:TAG>> + <EMIT '<`SUB `O* `M >> + <EMIT '<`HRLI `O* TTP!-OP>> + <EMIT '<`PUSH `TP* `O* >>) + (ELSE + <EMIT <INSTRUCTION `PUSH `TP* [<FORM (TTP!-OP) .START:TAG>]>>)> + <EMIT <INSTRUCTION `PUSH `TP* [0]>>> + +<DEFINE ACT:FINAL () + <EMIT <INSTRUCTION `MOVEM `TP* `(TB) 1>> + <LABEL:OFF .START:TAG>> + +<DEFINE MAKE:ACT ("AUX" (VAL <FUNCTION:VALUE T>)) + <EMIT <INSTRUCTION `PUSHJ `P* |MAKACT >> + .VAL> + +<DEFINE BUILD:FRAME (PC) + <EMIT <INSTRUCTION `MOVEI `A* .PC>> + <AND .GLUE <EMIT '<`SUB `A* `M >>> + <EMIT <INSTRUCTION `PUSHJ `P* |BFRAME >>> + +;"Machine dependent segment hacking code." + +<DEFINE SEGMENT:LIST (N FLG) + <OR .FLG <EMIT <INSTRUCTION `PUSH `P* [.N]>>> + <EMIT <INSTRUCTION `MOVEI `O* |SEGLST >> + <EMIT <INSTRUCTION `PUSHJ `P* |RCALL >> + <EMIT <INSTRUCTION `SUB `P* [<FORM 1 (1)>]>>> + +<DEFINE SEGMENT:STACK (TAG FLG) + <OR .FLG <EMIT <INSTRUCTION `PUSH `P* [.TAG]>>> + <EMIT <INSTRUCTION `MOVEI `O* |SEGMNT >> + <EMIT <INSTRUCTION `PUSHJ `P* |RCALL >>> + +<DEFINE SEGMENT:FINAL (SUBR) + <EMIT <INSTRUCTION `POP `P* `A >> + <EMIT <INSTRUCTION ACALL!-OP `A* .SUBR>>> + +<DEFINE PCOUNTER (N) <EMIT <INSTRUCTION `PUSH `P* [.N]>>> + +<DEFINE COUNTP () <EMIT <INSTRUCTION `AOS `(P) >>> + +<DEFINE PUSH:BIND (ATM VAL DC) + <STACK:ADR <ADDRESS:PAIR ,BIND-BEGIN !<REFERENCE:ADR .ATM> 1>> + <STACK:ARGUMENT .VAL> + <STACK:ADR <REFERENCE:ADR .DC>>> + +<DEFINE PUSH:PAIR (VAL) <STACK:ARGUMENT .VAL>> + +<DEFINE PUSH:ATB (ATM) + <STACK:ADR <ADDRESS:PAIR ,BIND-BEGIN !<REFERENCE:ADR .ATM> 1>>> + +<DEFINE STORE:BIND (SYM VAL) + <RET-TMP-AC <MOVE:ARG .VAL <FUNCTION:VALUE>>> + <REGSTO T> + <EMIT <INSTRUCTION + `MOVEI + `E* + !<REFERENCE:STACK:ADR (<- <ADDR-SYM .SYM> 2> !.NTSLOTS)>>> + <EMIT <INSTRUCTION `MOVE + `C* + !<REFERENCE:ADR <NAME-SYM .SYM>> + 1>> + <EMIT <INSTRUCTION `MOVE + `D* + !<REFERENCE:ADR <DECL-SYM .SYM>> + 1>> + <EMIT <INSTRUCTION `PUSHJ `P* |IBIND >>> + +<DEFINE STORE:PAIR (SYM VAL) + <MOVE:ARG .VAL + <REFERENCE:STACK (<ADDR-SYM .SYM> !.NTSLOTS)>>> + +<DEFINE BIND:END () <EMIT <INSTRUCTION `PUSHJ `P* |SPECBN >>> + +<DEFINE REFERENCE:UNBOUND () + #DECL ((VALUE) <DATUM ATOM ADDRESS:PAIR>) + <DATUM UNBOUND + <ADDRESS:PAIR '<TYPE-WORD!-OP UNBOUND> '[-1]>>> + +<DEFINE REFERENCE:ARG (NUMBER "AUX" TEM) + #DECL ((VALUE) <DATUM ADDRESS:C ADDRESS:C> (NUMBER) FIX) + <SET TEM <ADDRESS:C `(AB) <* 2 <- .NUMBER 1>>>> + <DATUM .TEM .TEM>> + +<DEFINE TEST:ARG (NUMBER TAG) + <EMIT <INSTRUCTION `CAMLE `AB* [<FORM (<+ 1 <* -2 .NUMBER>>)>]>> + <EMIT <INSTRUCTION `JRST .TAG>>> + +<DEFINE SALLOC:SLOTS ("TUPLE" TSLOTS) + <EMIT <INSTRUCTION ALLOCATE:SLOTS !.TSLOTS>>> + +<DEFINE ALLOC:SLOTS ("TUPLE" TSLOTS "AUX" (TOTARGS <+ <* <TOTARGS .FCN> 2> 2>)) + <COND (<=? .AC-HACK '(FUNNY-STACK)> + <EMIT <INSTRUCTION `PUSH `TP* [<FORM (TTP!-MUDDLE) .TOTARGS>]>> + <EMIT <INSTRUCTION `PUSH `TP* `FRM >> + <EMIT <INSTRUCTION `MOVE `FRM* `TP >>)> + <EMIT <INSTRUCTION ALLOCATE:SLOTS !.TSLOTS>>> + +<DEFINE FAST:VAL () <EMIT <INSTRUCTION `PUSHJ `P* |CILVAL >>> + +<DEFINE FAST:SET () <EMIT <INSTRUCTION `PUSHJ `P* |CISET >>> + +<DEFINE FAST:GVAL () <EMIT <INSTRUCTION `PUSHJ `P* |CIGVAL >>> + +<DEFINE FAST:SETG () <EMIT <INSTRUCTION `PUSHJ `P* |CSETG >>> + +;"Special code for READ EOF hacks." + +<DEFINE TIME:STACK () + <EMIT <INSTRUCTION `HLRZ `O* `TB >> + <EMIT <INSTRUCTION `PUSH `P* `O* >> + <EMIT <INSTRUCTION `PUSH `TP* '<TYPE-WORD!-OP TIME>>> + <EMIT <INSTRUCTION `PUSH `TP* `O* >>> + +<DEFINE TIME:CHECK ("AUX" BR) + <EMIT <INSTRUCTION GETYP!-OP `O* `A >> + <EMIT <INSTRUCTION `POP `P* `C >> + <EMIT <INSTRUCTION `CAIN `O* '<TYPE-CODE!-OP TIME>>> + <EMIT <INSTRUCTION `CAIE `B* '`(C) >> + <EMIT <INSTRUCTION `JRST <SET BR <MAKE:TAG>>>> + .BR> + +<ENDBLOCK> +<ENDPACKAGE> diff --git a/<mdl.comp>/comfil.mud.3 b/<mdl.comp>/comfil.mud.3 new file mode 100644 index 0000000..5326279 --- /dev/null +++ b/<mdl.comp>/comfil.mud.3 @@ -0,0 +1,650 @@ + +<SETG OSETG ,SETG> + +<USE "DATIME"> + +<USE "NOW"> + +<COND (<L? ,MUDDLE 100> + <SETG COMPILER-DIR "NCOMPI">) + (<SETG COMPILER-DIR "MDL.COMP">)> + +<FLOAD "GETORD" "FBIN" "DSK" ,COMPILER-DIR> + +<COND (<L? ,MUDDLE 100> + <FLOAD "NCOMPI;SNMSET FBIN">)> + +<SETG WDCNTLC ![1623294726!]> + +<SETG WDSPACE ![17315143744!]> + + +<SETG GC-COUNT 0> + +<DEFINE FCOMP (CH "TUPLE" TUP "EXTRA" (ACC <17 .CH>) VAL) +;"Called by PLANs & PCOMPs to do File Compile. + Tastefully Closes & Resets Channel during Compilation. + Calling sequence is <FCOMP %.INCHAN \"IN\" \"OUT\">" + #DECL ((CH) CHANNEL (TUP) TUPLE (ACC) FIX) + <CLOSE .CH> ;"Flush PLAN Channel" + <COND (<NOT <SET VAL <FILE-COMPILE !.TUP>>> ;"Do It" + <ERROR .VAL>)> + <AND <RESET .CH> <ACCESS .CH .ACC>> + ;"Restore PLAN Channel to Former Glory" + <MODES-INIT> ;"Reset the Various Compiler Flags" + .VAL> + +<DEFINE FILE-COMPILE FCEX (INFILE + "OPTIONAL" OUTFILE + "AUX" (INCH <OPEN "READ" .INFILE>) OUTCH TEMPCH + (STARCPU <FIX <+ <TIME> 0.5>>) (GFLG T) + (PREV ()) (STARR <RTIME:SEC>) R (TW? <G? ,MUDDLE 100>) + (SRC-CHAN #FALSE ()) (IC <>) ATOM-LIST OC SOURCE-STR + FILE-DATA GC-HANDLER OREDEFINE REDONE LOSS ATL + (GCTIME 0.0000000) (OUTCHAN .OUTCHAN) VERS) + #DECL ((FCEX) <SPECIAL ACTIVATION> (SOURCE-STR INFILE OUTFILE VERS) STRING + (TW?) <OR ATOM FALSE> + (OUTCHAN) <SPECIAL CHANNEL> (INCH OC IC) <OR FALSE CHANNEL> + (TEMPCH SRC-CHAN) <SPECIAL <OR CHANNEL FALSE>> (PREV) LIST + (OUTCH) <OR FALSE CHANNEL> (STARCPU STARR ATNUM) <SPECIAL FIX> + (ATOM-LIST ATL) <SPECIAL <LIST [REST <OR LIST ATOM>]>> + (FILE-DATA) <LIST <LIST [REST ATOM]> ATOM> (REDONE) <LIST [REST + LIST]> + (GCTIME) <SPECIAL FLOAT>) + <COND (<NOT .INCH> <RETURN #FALSE ("INPUT FILE NOT FOUND") .FCEX>)> + <PRINSPEC "Input from " .INCH> + <COND (.TW? + <SET VERS <REST <MEMQ !\. <8 .INCH>>>> + <SET VERS + <SUBSTRUC .VERS 0 <- <LENGTH .VERS> <LENGTH <MEMQ !\; <8 .INCH>>>>>>)> + <CLOSE .INCH> + <SET OUTCH + <COND (<ASSIGNED? OUTFILE> <CHANNEL "PRINT" .OUTFILE>) + (ELSE + <CHANNEL "PRINT" + <SET OUTFILE + <COND (.TW? + <STRING !\< <10 .INCH> !\> <7 .INCH> + ".NBIN." .VERS>) + (<STRING <10 .INCH> !\; <7 .INCH> " NBIN">)>>>)>> + <PRINSPEC "Output to " .OUTCH> + <SET SOURCE-STR <COND (.TW? <STRING "SOURCE." .VERS>) + ("SOURCE")>> + <AND <==? .SOURCE T> + <SET SOURCE <OPEN "PRINT" <3 .INCH> + .SOURCE-STR + "DSK" <COND (.TW? <SNAME>)(ELSE "HUDINI")>>>> + <SET SRC-CHAN + <DO-AND-CHECK "Source listing generated " + .SOURCE-STR + SOURCE + .INCH + .OUTCH + #FALSE ()>> + <COND (<AND <ASSIGNED? PRECOMPILED> <TYPE? .PRECOMPILED STRING>> + <COND (<SET IC <OPEN "READ" .PRECOMPILED>> + <PRINSPEC "Will load precompilation from " .IC> + <CLOSE .IC>)>)> + <COND (<NOT .CAREFUL> + <PRINCTHEM "Bounds checking off." ,CRET>)> + <COND (.SPECIAL + <PRINCTHEM "Default declaration is SPECIAL." ,CRET>)> + <COND (<NOT <EMPTY? .REDO>> <PRINC "Recompiling: "> <PRINT .REDO> <TERPRI>)> + <COND (.GROUP-MODE + <PRINC "Making a GROUP named "> + <PRIN1 .GROUP-MODE> + <TERPRI>)> + <COND (<NOT <ASSIGNED? TEMPNAME>> + <SET TEMPNAME <STRING "_" <7 .INCH> <COND (.TW? ".TEMP") + (ELSE " >")>>>)> + <PRINCTHEM "Temporary output going to: " .TEMPNAME ,CRET> + <COND (<SET OC + <DO-AND-CHECK <COND (.TW? "Writing record ") + ("Running disowned, with record ")> + "RECORD" + DISOWN + .INCH + .OUTCH + .SRC-CHAN>> + <AND .ERROR-LOGOUT <ON "ERROR" ,ERROR-HANDLER 100>> + <PRINCTHEM "Toodle-oo." ,CRET> + <COND (<AND <NOT .TW?> <NOT <DEMON?>>> <VALRET ":PROCED +">)> + <SETG COMPCHAN <SET OUTCHAN .OC>> + <PRINSPEC "Compilation record for: " .INCH> + <PRINSPEC "Output file: " .OUTCH> + <COND (<NOT .TW?> <PRINCTHEM ,CRET "It is now " <NOW> ,CRET ,CRET>)>)> + <SETG GC-COUNT 0> + <SET GC-HANDLER <ON "GC" ,COUNT-GCS 10>> + <SET KEEP-FIXUPS T> + <SET FILE-DATA <FIND-DEFINE-LOAD .INFILE>> + <PRINCTHEM "File loaded." ,CRET> + <COND (<SET TEMPCH <OPEN "PRINTB" .TEMPNAME>>) + (ELSE <ERROR CANT-OPEN-TEMPORARY-FILE!-ERRORS FILE-COMPILE>)> + <COND + (.IC + <COND (<ASSIGNED? REDEFINE> <SET OREDEFINE .REDEFINE>)> + <SET REDEFINE T> + <RESET .IC> + <SET REDONE + <MAPR ,LIST + <FUNCTION (L "AUX" (ATM <1 .L>)) + #DECL ((ATM) ATOM (L) <LIST ATOM>) + <COND (.PACKAGE-MODE + <SET ATM <PACK-FIX .PACKAGE-MODE .ATM>>)> + <PUT .L 1 .ATM> + <COND (<GASSIGNED? .ATM> (.ATM ,.ATM)) (ELSE <MAPRET>)>> + .REDO>> + <REPEAT (F V) + <PRINT <SET F <READ .IC '<RETURN>>> .TEMPCH> + <COND (<AND <TYPE? .F FORM> + <NOT <EMPTY? .F>> + <OR <MEMQ <1 .F> + '![PACKAGE ENDPACKAGE ENTRY USE USE-DEFER + USE-TOTAL BLOCK ENDBLOCK!]> + <AND <==? <1 .F> SETG> + <==? <LENGTH .F> 3> + <OR <TYPE? <3 .F> RSUBR RSUBR-ENTRY> + <AND <TYPE? <SET V <3 .F>> FORM> + <G=? <LENGTH .V> 2> + <OR <==? <1 .V> RSUBR> + <==? <1 .V> RSUBR-ENTRY> + <AND <==? <1 .V> QUOTE> + <TYPE? <2 .V> + RSUBR + RSUBR-ENTRY>>>>>> + <AND <==? <1 .F> AND> + <==? <LENGTH .F> 4> + <=? <2 .F> '<ASSIGNED? GLUE>> + <=? <3 .F> '.GLUE>>>> + <SET V <EVAL .F>> + <COND (<AND .MAX-SPACE + <TYPE? .V RSUBR RSUBR-ENTRY> + <==? <LENGTH .F> 3> + <TYPE? <2 .F> ATOM> + <==? <2 .F> <2 .V>>> + <PUT .V GLUE> + <PUT .V RSUBR> + <SETG <2 .F> <RSUBR [#CODE ![!] <2 .V> <3 .V>]>>)>)>> + <CLOSE .IC> + <BUFOUT .TEMPCH> + <MAPF <> + <FUNCTION (L) #DECL ((L) <LIST ATOM ANY>) <SETG <1 .L> <2 .L>>> + .REDONE> + <SET REDONE ()> + <PRINCTHEM "Precompilation loaded." ,CRET> + <COND (<ASSIGNED? OREDEFINE> <SET REDEFINE .OREDEFINE>) + (ELSE <UNASSIGN REDEFINE>)>) + (<NOT <EMPTY? .IC>> + <PRINCTHEM ,CRET "Precompilation file not found." ,CRET>)> + <PRINTB ,WDCNTLC .TEMPCH> + <CLOSE .TEMPCH> + <PUT .TEMPCH 2 "PRINTO"> + <SET ATOM-LIST + <MAPF ,LIST + <FUNCTION (ATM) + <COND (<OR <TYPE? ,.ATM FUNCTION> + <AND <TYPE? ,.ATM MACRO> + <NOT <EMPTY? ,.ATM>> + <TYPE? <1 ,.ATM> FUNCTION>>> + .ATM) + (ELSE + <COND (<AND .MAX-SPACE + <TYPE? ,.ATM RSUBR RSUBR-ENTRY>> + <SETG .ATM + <RSUBR [#CODE ![!] .ATM <3 ,.ATM>]>>)> + <MAPRET>)>> + <1 .FILE-DATA>>> + <FLUSH-COMMENTS> + <COND (<EMPTY? .ATOM-LIST> + <PRINCTHEM "No DEFINEd functions in this file." ,CRET> + <SET ATOM-LIST ()>) + (ELSE <SET ATOM-LIST <GETORDER !<SET ATL .ATOM-LIST>>>)> + <PRINCTHEM "Functions ordered." ,CRET> + <MAPF <> + <FUNCTION (A) + <COND (<NOT <GASSIGNED? .A>> + <PRIN1 .A> + <PRINCTHEM " not REdone." ,CRET>)>> + .REDO> + <COND + (.GROUP-MODE + <AND .PACKAGE-MODE <SET GROUP-MODE <PACK-FIX .PACKAGE-MODE .GROUP-MODE>>> + <COND (<AND .PACKAGE-MODE <NOT .SURVIVORS>> + <PROG ((OBLIST .OBLIST)) + #DECL ((OBLIST) <SPECIAL ANY>) + <PACKAGE .PACKAGE-MODE> + <SET SURVIVORS + <MAPF ,LIST <FUNCTION (L) <MAPRET !.L>> <2 .OBLIST>>> + <ENDPACKAGE>>) + (<AND .PACKAGE-MODE <TYPE? .SURVIVORS LIST>> + <SET SURVIVORS + <MAPF ,LIST + <FUNCTION (A) <PACK-FIX .PACKAGE-MODE .A>> + .SURVIVORS>>)> + <SET ATOM-LIST <LINEARIZE .ATOM-LIST>> + <SET ATL <LINEARIZE .ATL>> + <REPEAT ((AL (START)) (AL1 <SET ATOM-LIST (START !.ATOM-LIST)>) + (AL2 <REST .AL1>) (AL4 .AL) AL5) + #DECL ((AL AL1 AL2 AL4 AL5) <LIST [REST ATOM]>) + <COND (<EMPTY? .AL2> + <SET ATL <REST .AL4>> + <SET ATOM-LIST <REST .ATOM-LIST>> + <RETURN>) + (<MEMQ <1 .AL2> .ATL> <SET AL2 <REST <SET AL1 .AL2>>>) + (ELSE + <SET AL <REST <PUTREST .AL .AL2>>> + <SET AL5 <REST .AL2>> + <PUTREST .AL2 ()> + <PUTREST .AL1 <SET AL2 .AL5>>)>> + <MAPF <> + <FUNCTION (AL) + <APPLY ,COMPILE + .AL + .SRC-CHAN + T + .CAREFUL + .SPECIAL + .REASONABLE + .GLUE + .HAIRY-ANALYSIS + .DEBUG-COMPILE>> + .ATL> + <COND (<SET LOSS + <APPLY ,COMPILE-GROUP + .ATOM-LIST + <COND (<TYPE? .SURVIVORS LIST> .SURVIVORS) + (ELSE .ATOM-LIST)> + .GROUP-MODE + .SRC-CHAN + T + .CAREFUL + .SPECIAL + .REASONABLE + .GLUE + .TEMPCH + .HAIRY-ANALYSIS + .DEBUG-COMPILE>> + <PRINC .LOSS> + <KILL-COMP> + <CLOSE .TEMPCH> + <PUT .TEMPCH 2 "READ"> + <OR <RESET .TEMPCH> <ERROR WHERE-HAS-TEMP-FILE-GONE!-ERRORS>> + <BEGIN-HACK!-ICC!-CC!-PACKAGE "BTB"> + <BEGIN-MHACK!-ICC!-CC!-PACKAGE> + <APPLY ,ASSEMBLE!-CODING!-PACKAGE .TEMPCH .OBLIST <> .SRC-CHAN> + <GUNASSIGN READ-TABLE> + <UNASSIGN READ-TABLE>) + (<RETURN .LOSS .FCEX>)> + <COND + (<GASSIGNED? .GROUP-MODE> + <MAPR <> + <FUNCTION (OBP "AUX" (OBJ <1 .OBP>) IT) + #DECL ((OBP) <LIST ANY>) + <COND (<AND <TYPE? .OBJ FORM> + <G=? <LENGTH .OBJ> 2> + <OR <==? <1 .OBJ> DEFINE> <==? <1 .OBJ> DEFMAC>>> + <AND .GFLG + <PUT .OBP 1 <FORM SETG .GROUP-MODE ,.GROUP-MODE>> + <PUTREST .OBP (.OBJ !<REST .OBP>)>> + <OR <TYPE? .SURVIVORS LIST> <MAPLEAVE>> + <SET OBJ <1 .OBP>> + <OR .GFLG + <MEMQ <SET IT <GET <2 .OBJ> VALUE '<2 .OBJ>>> + .SURVIVORS> + <AND <GASSIGNED? .IT> <TYPE? ,.IT RSUBR RSUBR-ENTRY>> + <COND (<EMPTY? .PREV> + <SET <2 .FILE-DATA> <REST .OBP>>) + (ELSE <SET OBP <PUTREST .PREV <REST .OBP>>>)>> + <SET GFLG <>>)> + <SET PREV .OBP>> + .<2 .FILE-DATA>>)>) + (ELSE + <AND .REASONABLE <SET ATOM-LIST <LINEARIZE .ATOM-LIST>>> + <MAPF <> + #FUNCTION ((AL) + #DECL ((AL) <SPECIAL <OR LIST ATOM>> (TEMPCH) <SPECIAL CHANNEL>) + <COND (<NOT .TW?> <SNAME-SETTER <COND (<TYPE? .AL LIST> <1 .AL>) (ELSE .AL)>>)> + <APPLY ,COMPILE + .AL + .SRC-CHAN + T + .CAREFUL + .SPECIAL + .REASONABLE + .GLUE + .HAIRY-ANALYSIS + .DEBUG-COMPILE> + <AND .SRC-CHAN + <PRINC ,CRET .SRC-CHAN> + <PRINC <ASCII 12> .SRC-CHAN> + <BUFOUT .SRC-CHAN>> + <BUFOUT .OUTCHAN> + <MAPF <> + #FUNCTION ((AT "AUX" ACC ACC2) + #DECL ((AT) ATOM (LN ACC ACC2) FIX) + <BLOCK ()> + <SET ACC <17 .TEMPCH>> + <RESET .TEMPCH> + <ACCESS .TEMPCH .ACC> + <PRINT <FORM SETG .AT ,.AT> .TEMPCH> + <AND .GLUE + <PRINT + <FORM AND + '<ASSIGNED? GLUE> + '.GLUE + <FORM PUT + <COND (<TYPE? ,.AT MACRO> + <FORM 1 <FORM GVAL .AT>>) + (<FORM GVAL .AT>)> + GLUE + <GET ,.AT GLUE>>> + .TEMPCH>> + <BUFOUT .TEMPCH> + <PRINTB ,WDCNTLC .TEMPCH> + <SET ACC2 <17 .TEMPCH>> + <ACCESS .TEMPCH <- .ACC 1>> + <PRINTB ,WDSPACE .TEMPCH> + <ACCESS .TEMPCH .ACC2> + <CLOSE .TEMPCH> + <ENDBLOCK> + <COND (<AND .MAX-SPACE <TYPE? ,.AT RSUBR RSUBR-ENTRY>> + <PUT ,.AT RSUBR> + <PUT ,.AT GLUE> + <SETG .AT <RSUBR [#CODE ![!] .AT <3 ,.AT>]>>)>) + <COND (<TYPE? .AL ATOM> (.AL)) (ELSE .AL)>>) + .ATOM-LIST>)> + <COND (.MAX-SPACE + <PROG ((REDEFINE T)) + #DECL ((REDEFINE) <SPECIAL ATOM>) + <FLOAD <7 .TEMPCH> <8 .TEMPCH> <9 .TEMPCH> <10 .TEMPCH>>>)> + <COND (.NILOBL <BLOCK ()>)> + <AND .GLUE <DOGLUE .<2 .FILE-DATA>>> + <OR <SET R <GROUP-DUMP .OUTFILE <2 .FILE-DATA> ,PRINT>> + <ERROR GROUP-DUMP .R>> + <COND (.NILOBL <ENDBLOCK>)> + <CLOSE .OUTCH> + <CLOSE .TEMPCH> + <COND (.DESTROY + <RENAME <FILENAME .TEMPCH>>)> + <PRINTSTATS> + <OFF .GC-HANDLER> + <OFF ,ERROR-HANDLER> + <AND .SRC-CHAN <CLOSE .SRC-CHAN>> + <SETG COMPCHAN ,OUTCHAN> + <COND (<AND <NOT .TW?> <ASSIGNED? DISOWN> .DISOWN> + <APPLY ,LOGOUT> + "So you re-owned me, eh? I'm done anyway.") + (ELSE "Compilation completed. Your patience is godlike.")>> + +<DEFINE DOGLUE (GRP "AUX" OBJ) + #DECL ((GRP) LIST) + <REPEAT (RSBR NXT MCR) + <SET MCR <>> + <COND (<EMPTY? .GRP> <RETURN>) + (<AND <TYPE? <SET OBJ <1 .GRP>> FORM> + <G=? <LENGTH .OBJ> 2> + <MEMQ <1 .OBJ> '![DEFINE SETG DEFMAC]> + <GASSIGNED? <SET OBJ <GET <2 .OBJ> VALUE '<2 .OBJ>>>> + <OR <TYPE? <SET RSBR ,.OBJ> RSUBR> + <AND <TYPE? .RSBR MACRO> + <NOT <EMPTY? .RSBR>> + <TYPE? <SET RSBR <1 .RSBR>> RSUBR> + <SET MCR T>>> + <GET .RSBR GLUE>> + <COND (<AND <NOT <EMPTY? <REST .GRP>>> + <TYPE? <SET NXT <2 .GRP>> FORM> + <==? <LENGTH .NXT> 4> + <==? <1 .NXT> AND> + <=? <2 .NXT> '<ASSIGNED? GLUE>> + <=? <3 .NXT> '.GLUE> + <=? <2 <2 <4 .NXT>>> .OBJ>>) + (ELSE + <SET GRP <PUTREST .GRP (0 !<REST .GRP>)>>)> + <COND (<==? <2 .RSBR> .OBJ> + <PUT <SET GRP <REST .GRP>> 1 <FORM AND '<ASSIGNED? GLUE> + '.GLUE + <FORM PUT <COND (.MCR <FORM 1 <FORM GVAL .OBJ>>) + (ELSE <FORM GVAL .OBJ>)> GLUE + <GET .RSBR GLUE>>>>) + (ELSE <PUTREST .GRP <REST .GRP 2>>)>)> + <SET GRP <REST .GRP>>>> + +<DEFINE PACK-FIX (PCK ATM + "AUX" (S <PNAME .ATM>) (WIN <>) + (PO <LOOKUP .PCK <GET PACKAGE OBLIST>>)) + <AND .PO <SET PO ,.PO>> + <MAPF <> + <FUNCTION (O) + #DECL ((O) OBLIST) + <AND <SET WIN <LOOKUP .S .O>> <MAPLEAVE>>> + .PO> + <COND (.WIN) (.PO <INSERT .S <1 .PO>>) (ELSE .ATM)>> + +<DEFINE LINEARIZE (ATOM-LIST) #DECL ((ATOM-LIST) LIST) + <REPEAT ((L <SET ATOM-LIST (START !.ATOM-LIST)>) (LL <REST .L>)) + #DECL ((L LL) LIST) + <COND (<EMPTY? .LL> <RETURN <REST .ATOM-LIST>>) + (<TYPE? <1 .LL> LIST> + <PUTREST .L <1 .LL>> + <PUTREST <SET L <REST .L <- <LENGTH .L> 1>>> + <SET LL <REST .LL>>>) + (ELSE <SET LL <REST <SET L .LL>>>)>>> + +<DEFINE NSETG (ATM VAL) + <COND (<NOT <MEMQ .ATM .REDO>> <OSETG .ATM .VAL>)>> + + +<DEFINE KILL-COMP ("AUX" (ENTS <LOOKUP "CC" <GET PACKAGE OBLIST>>) + INTS ENTO INTO) + <GUNASSIGN COMPILE> + <GUNASSIGN COMPILE-GROUP> + <COND (<NOT <TYPE? ,GDECL FSUBR>> + <GUNASSIGN GDECL>)> + <COND (<NOT <TYPE? ,MANIFEST SUBR>> + <GUNASSIGN MANIFEST>)> + <COND (.ENTS <SET ENTO <PUT .ENTS OBLIST>>)> + <COND (<AND .ENTO <SET INTS <LOOKUP "ICC" .ENTO>>> + <SET INTO <PUT .INTS OBLIST>>)> + <COND (.ENTO <MUNGOB .ENTO>)> + <COND (.INTO <MUNGOB .INTO>)> + <COND (.ENTS <REMOVE .ENTS>)> + <COND (.INTS <REMOVE .INTS>)>> + +<DEFINE MUNGOB (OB) #DECL ((OB) OBLIST) + <MAPF <> + <FUNCTION (L) #DECL ((L) LIST) + <MAPF <> + <FUNCTION (ATM) + <GUNASSIGN <SET ATM <CHTYPE .ATM ATOM>>> ; "LINKS?" + <UNASSIGN .ATM> + <REMOVE .ATM>> .L>> .OB>> + + +<DEFINE PRINTSTATS ("AUX" (TSTARCPU <- <FIX <+ 0.5 <TIME>>> .STARCPU>) + (TSTARR <- <RTIME:SEC> .STARR>)) + #DECL((STARCPU STARR TSTARCPU TSTARR) FIX) + <COND (<L? .TSTARR 0> ;"Went over midnight." + <SET TSTARR <+ .TSTARR %<* 24 60 60>>>)> + <PRINCTHEM ,CRET ,CRET "Total time used is" ,CRET ,TAB> + <PRINTIME .TSTARCPU "CPU time,"> + <PRINCTHEM ,CRET ,TAB> + <PRINTIME <FIX .GCTIME> "garbage collector CPU time,"> + <PRINCTHEM ,CRET ,TAB> + <PRINTIME .TSTARR "real time."> + <PRINCTHEM ,CRET + "CPU utilization is " <* 100.0 </ .TSTARCPU <FLOAT .TSTARR>>> + "%." ,CRET + "Number of garbage collects = " ,GC-COUNT ,CRET>> + +<DEFINE PRINTIME (AMT STR) #DECL((AMT) FIX) + <COND (<G? .AMT %<* 60 60>> + <PRINCTHEM </ .AMT %<* 60 60>> " hours "> + <SET AMT <MOD .AMT %<* 60 60>>>)> + <COND (<G? .AMT 60> + <PRINCTHEM </ .AMT 60> " min. "> + <SET AMT <MOD .AMT 60>>)> + <PRINCTHEM .AMT " sec. " .STR>> + + +<DEFINE STATUS ("AUX" FL PL) + <COND (<AND <ASSIGNED? ATOM-LIST> .GROUP-MODE <GASSIGNED? COMPILE>> + <PRINCTHEM ,CRET "Running group " <LENGTH .ATOM-LIST> " long."> + <PRINTSTATS>) + (<AND <ASSIGNED? ATOM-LIST> <ASSIGNED? AL>> + <SET FL <LENGTH .ATOM-LIST>> + <SET PL <- .FL <LENGTH <MEMQ .AL .ATOM-LIST>>>> + <PRINCTHEM ,CRET "Running: " .PL " finished, working on "> + <PRIN1 .AL> + <PRINCTHEM ", and " <- .FL .PL 1> " to go."> + <PRINTSTATS>) + (<AND <ASSIGNED? STARCPU> <ASSIGNED? STARR>> + <COND (<NOT <ASSIGNED? FILE-DATA>> + <PRINC " +Files not yet loaded."> + <PRINTSTATS>) + (<NOT <ASSIGNED? ATOM-LIST>> + <PRINC" +Files loaded, but functions not yet ordered for compilation."> + <PRINTSTATS>) + (ELSE <PRINC " +Almost done, just cleaning up and writing out final file."> + <PRINTSTATS>)>) + (ELSE <PRINCTHEM ,CRET "I'm not running." ,CRET>)>> + +<DEFINE COUNT-GCS (TI RS SU) <SETG GC-COUNT <+ ,GC-COUNT 1>> + <AND <ASSIGNED? GCTIME> <SET GCTIME <+ .GCTIME .TI>>>> + +<GDECL (GC-COUNT) FIX> + +<SETG NOT-COMPILE-TIME + '![PREV + SPLOUTEM + REVERSE + ORDEREM + REMEMIT + FINDREC + FINDEM + FINDEMALL + GETORDER + PRINSPEC + DO-AND-CHECK + FIND-DEFINE-LOAD + FDREAD-LP + NEW-DEFINE + NEW-FLOAD + HELP + NOT-COMPILE-TIME!]> + +<MANIFEST CRET NOT-COMPILE-TIME> + +<SETG CRET " +"> + +<SETG TAB <ASCII 9> ;"Char Tab"> + +<MANIFEST CRET TAB> + +<DEFMAC PRINCTHEM ("ARGS" A) #DECL ((A) LIST) + <FORM PROG () + !<MAPF ,LIST <FUNCTION (X) + <FORM PRINC .X>> + .A>>> + +<DEFINE FIND-DEFINE-LOAD (FNM "AUX" GRP (OLD-FLOAD ,FLOAD)) + <SET GRP <GROUP-LOAD .FNM>> + (<1 <GET-ATOMS ..GRP>> .GRP)> + +<DEFINE GET-ATOMS (L "AUX" (L1 .L) (AL ()) (LL ()) TEM TT MCR ATM VAL) + #DECL ((L AL L1 LL) LIST (TT) FORM) + <REPEAT () + <SET MCR <>> + <COND (<EMPTY? .L1> <RETURN (.AL .L)>) + (<AND <TYPE? <1 .L1> FORM> + <NOT <EMPTY? <SET TT <1 .L1>>>>> + <COND (<OR <==? <1 .TT> DEFINE> + <SET MCR <==? <1 .TT> DEFMAC>>> + <COND (<AND .MCR .MACRO-FLUSH> + <PUT .L1 1 <FORM DEFINE <ATOM "A"> ()>>) + (ELSE + <PUT .L1 1 <FORM <1 .TT> <2 .TT> <>>>)> + <SET ATM <GET <2 .TT> VALUE '<2 .TT>>> + <OR <AND .MCR <NOT .MACRO-COMPILE>> + <SET AL (.ATM !.AL)>>)>)> + <SET L1 <REST .L1>>>> + +<DEFINE NEW-ERROR (FRM "TUPLE" TUP "EXTRA" (OUTCHAN ,COMPCHAN)) + #DECL ((TUP) TUPLE (OUTCHAN) <SPECIAL ANY>) + <COND (<AND <NOT <EMPTY? .TUP>> <==? <1 .TUP> CONTROL-G?!-ERRORS>> + <INT-LEVEL 0> + <OFF ,ERROR-HANDLER> ;"HAVE TO NEST TO TURN HANDLER ON AND OFF" + <ERROR !.TUP> + <ON "ERROR" ,ERROR-HANDLER 100> + <ERRET T .FRM>) + (ELSE <PRINC" +*********************************************************** +* ERROR ERROR ERROR ERROR ERROR ERROR ERROR * +*********************************************************** + +to wit,"> + <MAPF <> ,PRINT .TUP> + <PRINC " +Compilation totally aborted. +Status at death was: + +"> + <STATUS> <FRATM> + <APPLY ,LOGOUT> <OFF ,ERROR-HANDLER>)>> + +<SETG COMPCHAN ,OUTCHAN> + +<OFF <SETG ERROR-HANDLER <ON "ERROR" ,NEW-ERROR 100>>> + +<DEFINE PRINSPEC (STR CHAN) #DECL((STR) STRING (CHAN) CHANNEL) + <PRINCTHEM .STR <FILENAME .CHAN> ,CRET>> + + +<DEFINE FILENAME (CHAN) #DECL ((CHAN) CHANNEL) + <COND (<G? ,MUDDLE 100> + <STRING <9 .CHAN> ":<" <10 .CHAN> !\> <7 .CHAN> !\. <8 .CHAN>>) + (<STRING <9 .CHAN> !\: <10 .CHAN> !\; <7 .CHAN> !\ <8 .CHAN>>)>> + +<DEFINE DO-AND-CHECK (STR1 STR2 ATM INCH OUTCH FOOCH "AUX" NEW-CHAN) + <COND (<AND <ASSIGNED? .ATM> ..ATM> ;"Do it?" + <PRINC .STR1> + <COND ;"Yes. Get the channel." + (<TYPE? ..ATM CHANNEL> ;"Output channel already open." + <COND (<OR <0? <1 ..ATM>> <NOT <=? "PRINT" <2 ..ATM>>>> + ;"But is it good?" + <CLOSE .INCH> <CLOSE .OUTCH> <AND .FOOCH <CLOSE .FOOCH>> + <RETURN #FALSE("CLOSED special channel??") .FCEX>) + (ELSE <SET NEW-CHAN ..ATM>)>) + (<TYPE? ..ATM STRING> ;"Name of output file given." + <COND (<SET NEW-CHAN <OPEN "PRINT" ..ATM>>) ;"So try opening it." + (ELSE ;"Bad name." + <CLOSE .INCH> <CLOSE .OUTCH> <AND .FOOCH <CLOSE .FOOCH>> + <RETURN #FALSE("Can't open channel.") .FCEX>)>) + (<SET NEW-CHAN + <OPEN "PRINT" <7 .INCH> .STR2 "DSK" <10 .INCH>>>) + (ELSE <CLOSE .INCH> <CLOSE .OUTCH> <AND .FOOCH <CLOSE .FOOCH>> + <RETURN #FALSE("Can't open channel.") .FCEX>)> + <PRINSPEC "on " .NEW-CHAN> + .NEW-CHAN)>> + +<DEFINE FLUSH-COMMENTS ("AUX" (A <ASSOCIATIONS>) B) + <REPEAT () + <SET B <NEXT .A>> + <COND (<==? <INDICATOR .A> COMMENT> + <PUT <ITEM .A> COMMENT>)> + <OR <SET A .B> <RETURN>>>> + +<SETG DEMON? + %<FIXUP!-RSUBRS '[ +#CODE ![4793303048 28063301637 17859346449 17330864128 23085680158 17859346471 +17200316423 23085680158 13893633 5768480256 0 2!] + DEMON? + #DECL ("VALUE" <OR FALSE ATOM>) + T] + '(54 FINIS!-MUDDLE 230942 (8 5))>> + + diff --git a/<mdl.comp>/comp106.save.1 b/<mdl.comp>/comp106.save.1 new file mode 100644 index 0000000000000000000000000000000000000000..4c22666651b5e115934ec682f0b4bd026ad3af76 GIT binary patch literal 593881 zcmeFai+9t;_b+Ps1!<sB;_yf*h44<PL4iU@DBs|>9X~XF#dZ?v1WHZHBT7Pm5X=78 z&u5P`V_8!A``vriId|Q)e(I`GG+TT2Yxd0S*)v+yo?gEm2n4qS_7(ikH~jfBFnl{7 z{?UFmmFQ06_BH?E&xXU}Z`bWo=Rf!CKmMP;;ly&z@yF{k?^|*Fz2$iJKezvF3EU5y zX*~)ASRhQVM19^<0)a>y&m-@~e$Ei+|KT61LR=t?n_l1<o{Y>furvf2!@mSrATazE z*shKKwC@D<FJ(#dSN!+?>St&Uaq*wX2!TXAx(SYMPrI9<0{(Lv#J@hD%56h~XAWFI z&}dWz-rP2R-nZ}*`O^mBdJYGm)zQz(fEEb63@pkYy#F%5e;(5v|M{Kn_|FqpZU1|J z{(o5c{p%o||M;+QcJ%D}dTThm{%31Ac#1dD_Z5imxBsC0KSA8Re2Jgy$$)bEHxlyw z0Pg7B5dBQh4{s)P^WVRWi)X_eLEs>G=Jxyl`o$nXQfLdVYwE(U(Ef$r=m&0c>cT_% zfx4$IK);;F(a+R{J5-RTp91|9Js=!->Zb#{VCq8l6p#x~3BdyWEYr^l{ro{cFX(5L zeqPc~l73S3lMzTGeHirx238ah6bKSq%02rh@(#@<(z95N52r8gUHR2GxJ^yc!T#`g zTOp=zmGBz5j6gtt$^XF*+}Tw2JAOh}@pG1UW1O)vv{w6}o&h=kbN&BQ0>h*c2*85L zTfOYV`0dMTOyaM9|9Ae9cxmn(+1e)l{5c`s8QqB||JA=icw6fl-B}$jr;3^`zqoG} zfB62(J3jtn+4OZ^sDFL<5~aLGZt<hL>+ZLPFVDq$!-HE-$$cHihQsvYyZ+;s&mIoH zoC|y$4%zDg3i|ZgH~OJF)(>1?kDs}YTZ=&4xUYT#PpA}qGO+aT1VYf)P*oH2!!MBc zaM%u*!@=3WE7_){{M@+kclZO|7;F1JK-MF0lzaz{);{BJ&QbPV|L*n8GB~>S>u^|& z5=S=S|6Qcc+R#ln|NPf`<uVoj-+DvYhG73N+DkXiZp4?$iDD+6($g8V6i7S}SOwu6 z<b~Q^zA<qlzLYJr%gss-WgZZ%{rtwn>-bW=nQX4xrArb4YrnYh0}v!TjZDp5`X9BO zh<u)jFR^AVQ+1b?)Xt)^nTY?LtkpL}y%KXt>tG<FP-!An^t{VD7?+?l!vN(eH9AX! zd%P6gp1ZWHcF;%hQjCEdr6d}0neCFEN~82cU^akZr!BCG+DY(t@2n?E&Ud*ulWKcM z33eubDbzBxnqC7k8@-fxQft3aCwBo-Y1A@_v>ym-zeOFBzW_(J)U2bqc(54l-i43H z97L8%B2#L6mm@$Oryxja?e~%Cg~?xXnMS>l@S`-v+8>AMDhDYN%%X>kwAMc471a}E zCQ2n4Y1Te6|Js@Sh26=Jw0v02u(qjun&WlED@}CB0*e$_#%K?fpY|<~l<o(TRXd9E z2o)tE(ITsXZMVQSjE%dXbYdf)sORIAM0u<&5NUyc8iSJWq2U<&XSc1px7D-JfP(SU z(5yz!$h*e@<vMw;Z)V%RJC3f&yN<ZK)f0DjC#?}pfL~{=e?Sjvvo3NE!!Kvyj1+We zX7b){CZM$Oj8AWP>C3ZQRX&)p-vCwrbN4?oAnW|UYX_dTASs}s%5a#tI~U-C7ETs# zQE#hve{otnwX(O>dj|n-*~6DXlu`@8-A#FSkKX}F@T$1O9}a$j<>Y1H8RMAycLS?u z1Io|9axniJ96VZ&b=j?Kiv@ycU&CSV<5l}^d+Lg~n|yBHwWt2J@46r7Md{N+dG|%Y zEh!T2ktkg%iMy#M;_iuQ-?bn7A@0uoBkrDl6mSn>;%@4hC_O7EX#aRDo=yEC?`Fjt z56+9b-#VgnX+b=DD(c;y`b|7LzarqKn&R1%<Rd8gcxu?CZ0Sew#^fdO#!^k(J@`T1 zosoB8`>wtC+P>?36!dMM74^10zOqYO9|hd@x!VHEImzYO|JcvEAA6$oY1h7MKe#AM z_w2jg$ItTFH+k2$@3tSP;_lppDE%a~%FYQc+fM~my-$M6?k6FQ?xz|1-QFkhM(>lb ztM*f&x9+E#vJRn{_W2|GS$;~;*ZTCk{j6|T$WQ+yIscTlOZ86$`z~=uaJ2eK$Tat9 z(=Odnt_6ZxAQ=4l%%>fB2afD#f62SIbf*v;q^ku&bob82()#pX-tEgf(H8ViC*s+j zkY9H%YCr4kowM({d(-kxXsf-X%V)ycTYGoqGhwm%-lF|X-&>NU!m`^>g(a@;W$n_X zy|R6mxFe|V?QO_+h2?BdOv-1F2KN!&J<&q-y-)I)(AExS4z@4Z6Ro>v2+n&(M3frB zu6l-Op*=&$U?(cA)0h)=7@~Fej2rf|ov82;UE^1wBjbTx+EMVX7KlJw22{$a?}UUj zc0v{VS<et2Zu^|zX#3n(yR`jOSdMO_<Qu}mbVEq86Ux}7JE4Sx+mcvT?Yo>Iy{PfQ ze%3V(<ejK@`v=i_wx0?atnLd*vMFKN`o6HC*1mY7yMNin*W3TuzT2J>+VAcQ`E~d2 z*`<X$Lg%gh$M&;_`@-9<?!OdRme6LnBy;;E`)+k#$h5oPwx4zG2&wHv*X?KB{WtdA zwf$ZDF1Ih*O#8gBuue#5E4L3DvfA50knY0J<w02BI}rYKCv@L_);kb3)SeO?^$yUY ztTufhywA3Z&eMJ-+E(vC_@Ry>u`DHR%<Uzi-`;_cQ0qWQsC)3jhN~(<A5}%r*FGnt zkvkAJw0vjHeuJIsh&rYOZx0Vd+t&|Tc4_NCSX1s`$9|?Cz$0;eY@ZXl+&(XCWBZ(t zZtegr#cB%&ur)0ZB}s}_cK1M7oqjO1@m22#j`Ty}+gA^#M7@V2FD0p8dL?K%``y0l z9o~_5LPy(kqLsCmw(Zi^p=g7xLt$(Bp^$j@P{?X~O1AhzA)%d+Xdk^pA*=4;rl4i% ztbMl=lH-UtWMD~66Vz|t`%yf5P!)F*63g%KFV-8kgzUGMmc_HBReAS^xO*z-+kPrq zO82v9jlIv(>OM;eeHIexeHJaC_xXv9ulHGuOM0J0ZN1NFQQM;E8+)InU;A8_?}~QW z{Va8K4lTgqXwtOrcA{_XyY`Z>tM;8)@hoQ8clu{xIla$9(>uXK0e2Z~m1FK63EAh4 z&fCvgM?wqw(PjDUs(eGV!S0cecqjPYE=ANv+}#tB>>dew*}f&Ub?=)E*9i)3^^Qav z>>Y`oZhLCMhU*;(Z?U}~yjkx^c&Xlzu-NU#ujLz}j_#3=-|831`IiYBuKPvURriaK z<o1%#`Sz0VdhL6{TWnu?D&Kuz-?hFxw(nNIJhSg|UxXd3ei1EY^-EE{A^6b0h*pvN zvSpX*Uj!dHgc>bv>0bnwt6zjJFMSdE)xS#L^i}Yte-(bR`&IY@W;Sem-LFEcy{|&6 zJHdioy1gVc*j~C|KWi_EmfZdN!hV+fDm>=uSMl!ZSJAe*U)ROE3&Pgg3zPP<?$^KV zyX|vgoVb1dSUmedc(eAoko~On^@Dxa{xvF}eX;MlU;Fl5@0%i?eT&FD;U|0FRQXKu z_EgBe6BKQ_`|Yj`*FGoO{`POe7jK^v+V4b#pKL!Bn%=%G>eyZq6m0)4G~Hf$Xk*TO z6C;%N`Jw%6>04daD_U~<oY3^$Z?b(n6%yZ`68?GnsqmP+Z$ehRZ=#>cPYKIueG{_k z9t&A59ZQ)W3xCi(p0R1skA)4jj)iUL$HGtMjzyc%kAD-q9Y3<~TF0VQ=*PlxR*#c* zY42F@(LJunH>3=fguS#?X$Qxmee48p*l*~^vhO(-Ty}zj(oX!I4cGlHuynsq2nxOn zTWft6UZ8MW=%YO;?cjmnw>|lj{cii|u6?)tK=9k16qu{Gh2B=b3%NY}{@8wF_4|r_ z_wakdzRN!q{wnufNF(=MwAzQ?h4xp!@5pzBkH~%Bv!AukiN2@(gRt@L_anPh|1PNN zeivM}PJ{>99*B0Sp9ns70^(VFa>>Th2?)FIo&0D&%bmpRyY2G_;%-TB-a8Sqgx1MT zyR>&AG}AkY+t1nq!CQMEuyjv^<@8QcHeB~4FR_Sr)H|us2r7UP)QM<sy_2>L*E)G+ z-)%n?_SZTQ8f={i`E^f3%Ue1*5w-P$@=mmr_ERAjy)V3NtAELc)B9KD8^TVzeZg-B zt6FwX+!q$n>x-7s?F)YOzTkIzAlh`dFZk{D>o%5NA6#N+0?zw_%N=AK;Tg@2`+wSS zI|wleIHAGqsSzAxZ^^I!#(pE$e@o9M3ClnBvsV9;ygRh-y8UnVU9Ue7&&-g0S5>4g zO<^zF=R}W~GeyhmnLo*QuL*qSEkU!nU_V<mg;(yHi}tgYDXg<){vol5w$(GU@|mc& zYgXmEqPJQ#Aq_r8YMDX?4^7d^x~8y_mML45DXb)i#X0-kfv}RL0eqMi_yO`8%-E&5 zf$*o@!O!-y-eBIo>kjVNcWkL?-)%1y#NE%YC7j^0{c~476Rl!tAgn|m2oKU7NDnd? zy&<f)qX-#v2cp+l9SAOagTAO^s1QeI!O>7~*&7OP(HlzrE(y!-4lm1hWvdtpetSc~ zZ$}Z-_l6JbH+n;0u`GM|Ok!D~XEf&=uG-IXL!s%`Fejgt?7O8Q_YBlNhUg`2e2|8H z2c6q@qV;s{UXZnQU-GDIRW1{4svF1~!O{$0rmQ!xd_(JyVj(CemfkkC4NA6|*hn<= z@{3gmh+He$Qa2VOJNpwGSk;O%EE^_r$TIPw+R`>2n{TEqxNM;WAoqgN7Tb8DsJj*j zUoY~47#mCGPGVvsos9EkrE-G#)z;Uxutpg$+s*Y%s$s7RexO_-N%$t)h;!b6Dv?TM z>UB?Tuhb1%wdA#>N_yRg=2vV3*)|r4&N7t|=dz-Y>Ly|N<L7!NQA_0=<PwOyl<wlK zUb9lH=ⅇ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%0D=d!h0;dctIzdy?DXdJ}m!G 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 HmAYw}`7((>AYq^}MEBJUYH@ zZ1ZYY@ti~!g0@ij0BL5RENol#-1l63du{%s=G}4i=Kr;+>ila>9caC~<Qf!p-^1Ln zDYufV^G^8sd>1SPb3EVMvQTRCPql?OTQTN7Dw%Qf@%)#A_cK#4AAIjuZ3|bd^rP15 z=nEGxf+la?Z6dWc$Vpr8l}jzaGg>pW;D0vdT1010z9)`fp-LRT(o1)O70zQr6UgB_ z=Z0)!^Pt}5MYL>dsjiB7T{H8T?Y6Dscx~PZ%Wxj1ku6n8Gykn}5)Nlu3NMaL!N+4# z=?ETVi7lPh)P$zS6rS5i!}%dC4K#&wx-5D*Q}}@I&s4#`6#sFf`cgRwKHJff6pjXc z4>QN+y=AJ6dGDCQN2z=~5{H!V`Glzy^G=z<D*%2&!sBr(e~_4@;Pgd<&r;m@_u;KX ziX+qDRzR&)+?9mV(57vtG&OTZ3KGuZC@5a6t)iDE6l{S-zBJ%BTx1Hb8TbvCEe~p- z%kU-rLHa9H^(nk5w!jCr{f5BQD;#`4-<D*)v?AP{J$iF+DktgWOT(~*OyPpI!h^hR zQJoXM2t0u-*ucCZUq|p8qR~g(AtBEke8BoBdhIL~U!T;wW^t5>Lud)-j!cU}`U4#H z9NJV=TAO=o^FnP=n}fGe>b*psNj+t$8Px{NSUWOhrlcQG-->)I!f$}gu_GvQgR`Uo zQr>cR)6g<~@IfU_L)B{}L6EyYXuXF_$;kX@TU0*a#diKWUtZz;w^J&Cr%n#ZCqZwV z%KbOU(;KH&2}C_~BE`?G>8|1Jo#GXV6h6j=dWYOip$puA3nZqDg^<Olcf@*_**8w# zX}y1`;9juY<u|2J`rhryhzK>iv+&+Vso<^RJvfN%+_;K)5U?Y@*W&h>D~N1G`YhMD zi`n^gfR>lf!{@{xeA4oP33H`Q-fm-_JfM)0(=RcmS_TH8$(WxSQw_!57Ox@0qgCI- z+L9G2{405FhI%JEp#+vZTu=<ppL5h>4aRrQbI@U{SFzIt#NvAwT#tJ3{iBSRVO~!? zj*EcTJg8D7OB|Po*TpOEdzT$HJiqQ}>9dfFz0m7Qo;-quaVvQ^XAH0QY72b*l;72I zJNpVCU%jOC>GzL%@iJcq=i;DGq>9x`0B_9j0Hr|gdsv}{Low|EYcP)E5piS`$Bgn| zhB%6ZBGM<qA^IP*zLF>UA9R(Bca`<9&cDEh$eI{7IP1{gZpHSkV*8d*p#S-v>VMQb z_q`JHuxd-*4Z~+U6RBU7yqh+!<dsd&kw>nX(p#EZ)s#Gfg|>E%U(pm+p3Zxhx^la+ zwHB;H+jDkz(EHua+G=I%_D(zx-`!ie?W$yZH+A4EB(h56(FB2@u!y1wva1thhb`p& z1DPQ5={GQ2T3}&Ux7W9JZ*jg_i$3TLCC^#@y+8i8w!2yVEdb-R%Fn;8Ft4uJuc)9^ zvc10%FYVujpB;Tv)k@wUpgv}On#H2n_O@<;J^JT9{#x0FDx;8t-lxh9Sj;8wSv@!Y zaoEoKT0!p%SGoZD3=ih9-5LJPUpN;-l<j?e&i-P^d6QEA%=W&+(CzH5Z0+s@x7O~i zZv`v6_}<~_$}T>97}YEHeu(O=ZQYL7vRz&3J=s{fwYH%>Kdp!4Sd#BcY~J74U9WCD z3U066S>IZ_9Z16n+frW&EScxswE1@abH14!#L;12^ZhN?Xy?)9tqSy2?M$)n{QVt3 zTfsTF!xr?l-CDUFn7Wp<pfA0)S>1gU+^KAD#(NSqTk7lDscx*Vu5aD7UxVDL?6T@^ zr5bFkJy?t5z1Mfqz}r~g*$tEgi>=sq*_1w5TivZ}yK*h<yT7%K^>cS?{YTKgzPpCC z;;1k7NybjVIy;q(2khOQ-L>t&EV-b%va{nV-|HJTb1k^D9^S8VJca!A9g-9QE%)Wg zlKQ&$R#tJA=|C;@O-<DOT7YM5^A?6oJ_{O5PY15<y}n{y)rl6safQXcdE(lAR9(YI zIB&0MLB4Nc=iy4ViVkUEP`MLqtv%%5TCd!94b+=D4=dZ~hGks7?>Zrap>{T*()#Yk z8i2SeOMPX@x)wwP1%0>HH#XMpu53VvfstD)8`EoByRtwn<fT6Ft*%H>-g9kt?%(>n zS+Vc?DA%?K`Zf`Fv9YoZvhMG)f7OkZ)iqmM?1Ng?Ol~EHK;nJ_=B?kb?WOKC?9fYy ze6zsko;iWhaG#|Qa84B~eM&~GZ|$sY?_%h|f~}R!2*-~sUA?!mjVi&;dU$IcXp{mt z{xS^^gMI^SwwUhFP@_=7UQlX)2sFD#!|zOSpKG89M9S^vxMdyN(^~PMMmXmjaDIb+ z{j%>VvHeYKu!$5Kdj5iW(Edsd_{NYp(Mk=X{o!4_Jauq>#0B-BX4-mm0dh|>f)A9& zDQH1yb?%YdRU6*g&7|D-mK6L;C}P*>9^P<d;guSk_E%~U?N4|hpFoPR)oTnb*lEML z2M${TCbs;_{qS*S5(!{SG}QGsk#zk?*w_COr37UjLpN(|%wE>@2)?p#Zd-AvuGvrR zFG1}u5!e2_eMY4Ci8k;wK^aP|xRikQ7yE81KbBKU$Q9tP;XVHYIeDshGuk(N{Ueje z5{Fn@%E^Rif8bRqahcdSUlMZrjhsw~_wQ?*Z1|qowiMf-VjCp3A!5tbb2867xP42B z5$)wDctxGQlo0I?I=!7G&}d2tL_hP00q`c-78Z77OYA46U?cGHrBY&=@Tkir;QjLx z>izqw=I9}AB%J$RslTe!UnLZH|NI0f(0LCW&ihwNSnnU|U1Pm(>#4$?O$!I3%GVEQ z!<1mB2z^M&Cy>6z)AlE%>aJ3?s#M|jM<xML>nCp4Qzc*jg{P&IxT`$C?%*fH2E<7F ziS?E3ySnpa`<*L^42w_Oc1)je?zTmqdfTSRD|Pj{u>8Wgva9#E3nnl3@6^@n{)P2! zXlFu&_mG`I%(I_(RNtAO&|=|tmj1$0=yEau=z>m*dYZe**g2Tqfh@#CgyV5NErYD* zo+kEV_4exPaf#1eJp&$Mu3}=d3#LGAZdU6#7j(H_CgDp`FNUvOYM2ZZWC<9)r34J$ zFbxNKDM7;*rxiwQ?kC=8FUMW#8~c#HSL}xnEG1O*C9LQJuRap8I()v$t1ddX=isU_ zyh=u*?-U$QQuHO`qAyWOCf#@>Q!Ir>Z5G5=msKZ6a1IVui$g`<z&YZe=u6g%z9dCo zlA<rEqAy9qH`0{3wVBNoq98sBoh|H<a|-*(9yh}VXaXnk*p#2lIGTB&QA%bl$1_Pt zQ9p^p5HrJ)mwvck*>yW{c7XCPY2_b4VR!J8uzvrG>6peFDB+xX8InUv5CZ=)$q_<< z{4-261VR4E-fg8`{q#;x5FTv&;nACH8^Oaz=VQ~c{VnUkLuT1tP`m}=on>1fjpG&T zS9&>53OH?(cvs6$;uJz<tdqs{RCVC9f7Lm)?333N+ciRg)bo?e_1LgXxv;_0|0w@D zv3G}aJ=zbIe*=_%$u&Zb%Rg^Fxz0TJWlKqsf52Nx^2^Jy>4QC`l>82PvXdk?*y8(G zF98L5yzjy1a^@&>Jmoa&QmVGKzuTmWnqU&Uka8FB5K<V2SFiDOVkZgb(hBcKh4&-j z;R=YK{3!+x)Kip_e`hZPj^JFY!uws}QIsZes_Q46-(9>-1`6QC=TIB?7a|hM&7r>( z3J!iVNvO4c5+-oGmlShJn82l^=zqd{c>jd=rR0H`*;Ypq(U*LsbL}<T9>zw&@%}Sj z4U?*rQWecL_*P>ppiSyEXuVHL{U=g?LTosqj#1wz0uR2yQX_O$qjNPj7@94gXW=_P zb4Iia$Kk&<>#ecLVGHoUQl=4xy^r9G2pe!vRPkWC)Og<T;46?5D4oTbmWAA*kUIz& zN5Fn#XAH8p-$+kiV>cmRAY_h0V~@qABaOU^{|RpgM`rfO;f+LT&|AmnjvU5g_KmC8 z7$|)K>C2Ip!5DqOJA@Xp_8T!qM$$CW``0MmKYPsyZS%|%pFOn}ismzU-+?p6aQ2l_ z;2udV2h*g0`d_2!e<EWWi-rP}!VK~oXDxkS$C18G9M8X$yTM`|H`0tBp8ea=5^br$ zvWY@DnSq1d^rJev@9H(ev1UeQ)~(fQQ2x3fI^iWv;Qh)l?5p|Pp^1D$u=`W*{M8&j znIJA`aYi#X+I;aqBJ<{Nzcg`9DOTx@N@K3-&BS-mW91jQs-Fh<1X89EUQ8e75Oq^| zyM7|s1$*?a5l0709S{K3Sv}s4w8H>KSLO7scfJNpc4%jRb1X?=Qd^cd4_-JMx`W!6 zzq?clPHQtQX7#W&iX@qZ8w|_=%_&SS3lE~+rf{%o+hP-ulx$;FG-%4=A31Po3YZG< z4}NgxO1*G)MccyjD5ZXC)aBt|FxJ8xxTK&331rM`d&qVtB@^=krgv&yTVTPOqns21 z9xPrlDR{t?!l##P9*)}x&m19{W3&{ELfh8$D4fMu)=&>T5EFohL@Cvu$#J2oh#IzU zcw`Mwco>}8WQvDBsV!GJyJ)H3Pi?alk*0oX*Y$i}$4!sWxgac`aggk2dEoM9W%=<a zF(qycfmc%s9y2ASvSkVNdq&7K1%niVsc!bIi}loyO^N7(Syf6=^wD3PNm2hxss8t+ z&T40D3zetY`#KYQ4K}Yl2!}={Mb$6mR6lcAlfuD=F_u$-T??fYEsXROThR1P<s5x6 zyf|Kz*(6RAn^I#w1<_YZ<q3r%JY`K^q@V=KVV7+&x4pJmp?C4S`<qpIi`KW`JLHI4 zPtnrg4FAIZX8%btCI2vCeu(+Qw3P31;DX5DJU?T;DQ-=k53JLr48I#u6t*f`a0tSY z%)cy->fqAO_v_VZK_A%0))B2_EZcm#Ha~}o69`+cJa}{E_U(1L2jP@kho^UAqw)~_ zyY(no5u7B|R=ziQTe`hl30C0$j<wS&OM_VFrPMmO7J2^X`|fPq-?=Bw*%c6d3$8cg z<aCgi1~=;*@`GEe+m)T2=`;IQ9E4y5|MVXwNI^6IR~&@vIr7|P2Qm3eDVmJ4SMfq= z3Jbakr;=`Izz8m-e&imt53fOrrf=#e=KcIx7j*husqXE)#IwQ(`m}rr25TdMP>>}B z*}=!y2$dz-!9SuFL98G@xM%pXy>=VkdK@hn|2{@1;)^wXoq)%o&b`^ZE*E<?jO9Wb zB1NxX>V=#9atfBBu9ter9*O=Z(;G%`Y*Nog;yPz`Sc@%<kiF_`zhXPm#d$<*9|-w< z3>$F3hM<<=xciBCkC~^3SgA;_Q$u@p#6m9S5ZOb`(osOoau%@(!Z)8%Ret4M3KZ~R zMc<d$2^B_uv!NhS^3Q3C`X8u5-r4$}#nuk9KAgR%*i`?^QS|xL|9pttnCSDn6|xh8 zR!~^0%|RAj#hqTp+&j5Tb^UEGkb(|NLA)NKRbqT;BcEpx4PyDC{=XdkfBq0DRUs&P zm~Ztz@Id^35QimS>|csaKhGAT|GBI0B_BdixMq7)uWGbaNI{EIpr^k%p8opS(tN-E z^w*zNUWxrHc(EjXf1W&z@P1Q|x1N)2Q{<4Zc-1D!(f;*m|N642yBT4rpR4B|ToKh- zMB-Tft?0a3A(T}@xm7>XqLnUMDG*{~j*my{W56q(C_EQiS<d11TgInP(1+_!XO6e; z!xE0as%uZX?R;rnK`)DHiTFP#eLoN$B!usaLSTCdcp>wk8kGF|<R90$?~Z^=KII={ zHY_*dC)RcSxJtbL+J2-W1v2+beSiA^uc(%Y|5)jJO#1#HEx*V53tFC#f;q>(^SEgq zo6jwXYY2<Zu88BUmw)FVk-{Qu13PXi|8kUnKINZZFaL0j!pc8i<X_bD`WbPKdqB}y z6LAXO)lqs5j<T@mtciHN52oJx2R<cSa*6d89HmYB$|1~>%IT(ezU)CmknyM%p<<gJ zHO(0n(dVCTv?2x9@vl~dqXHw2zBNHzHKSU@;knJbp?OaAV;rC>E!mOrn?!}h9P*pW zUNY->pME{qLm0TEDtqvrTgY(HSjbovHV?tAHg8qoiGPUEYfWp+qbk`1g}^AdO;Chw zN<2VRdYd*Zw!+?PE#0zt>AhDjLawQ5@_sqk6W6Y^l@%Z<cz_I5tuJi7${yrK78cuw z$|)R|k}90;s6y}foR9ci6vbbtzfW2u1+z+IlivhQ!RA3fuzmZ5DWO2rcxfR@w4|U! z8>+Y?hGw*^I_;N-5b2z0qWo(T`RC+SsmaN|Qquxg*>9`|IDQkPPb4QTWL06CU@n!K zmbuEf_M5IVr7Ip#94%LD3MW5x;U7a~oaSD0nn!j>N18jQU<>j6=9!t9sLEQv6YYRK zbE?qL-RpPmZ>>^=4K!~(UL`y9J*+rwksaEA(2o7Ng_EV&pV(&*H-&%FkP*-$T!h2W zHiypP%?|C1*Zp}v$HU!R5LF3=9_Ci=hmz%*1w)T=yZ5UbQc=nMDaS*b`nJF1sEblB zuLF=D`faQZ@8jI+%7&?<@czglhTwKRygfG_ZSOh0PdUDSa(q>yH~quBzc`kE>!?0M zs`Z>}i}CgLn+{oz+D#M8|CpxLgq31viPN;g;@mxw3pIJ@kS$)b1!ZT`TSCDh$QLur z?!Qj1;jA(&7F1q+u<*)59|+|Wp?r+>12{zgQ=PC0(y;^$JWgqIB<mcdnD>s-;bfg; zZNPbBSe$eeG^_t_nEt<J`v02a{y%TO8IcxpR%y6_wIF+s?U4s9C@iW@-JEtk8cq{l zC*gI}^{Bbaa4k`4w)!9H^|0QB82^Cx67ygLm-wMqvo4!?2vWZ;OU>Zv8Rrm|z6NTv zMM$oI<K{OHD18H@4<Utqa}c8sc;Rj0eR?<gb_8GCX@-Wk)YAqVV(?c7uc$lIFb;Dn zCvUv-L}XVy9tW~`&*5NB`1j!4bxmPsvUydP!URf!LZiXk(!x_$TKGp(&>l?NcDP<l zsw<}{SPqg`%i+~kQ`)1YJ+MhkUMo(KO{xWF1h(F`OLc&Hlh=>0){`pXfu!8%!~YzP zz*`XtcMF)nCRJ>36lmnRjiu*)Sxk}Rl>Eget%p5D+Tz2FHjg{ItA{x$wA4T;@)&hp zY_WME>>g8E9l>rO^{O-QSQ`gZvCY++LVv3=4e*aib!aM!6k5=!Q&iW`;E9(+!Kb72 zpDU(Cs?2(VBOLr!X^E)9jFr;p#>JU#rQ&60=i!r-Hj*9l#iZWh@h8U(xZ8y02rs?e zUJYb;K35(~#k8|{;e#j5Cu4;}xZtEM2(o$U!*3PxH=2Uj3JDL-mTKy%=aV_WF`-mJ z&j#e<p9;^hivuV|ALlOM8so@|IG`15{Kw@%B-_z)BNI-eSg`rf@GQ;KkP!l}HXUdR zg2&c#mP2hU?Mi2Ua4AOko3?5vzbm@Eo4#;c+WN{%X2F;7^x=A}mkx(IOs8Jj7U2{$ z84FqW{VCNQi*X01tvBy>Ci?juWax<o%J`at%yS6gRgo;N@gE;w$FubiU+?nnY6>(< zivV>^y>RfgrXreG927WAZ9R2x)}|p;YXAUjFsp3JIZSI~t**tG+a>9g<tIDX!f`yD z#=(tk3s<&H;o#7wLPr7oDlYFQFA3g%`uE^Z$Bl5h*I`?PH_EpC)oaLeUcD>UY-x4S z@w7JhyVi?RPav7_>#UA2{^cCwU(Uf!!NkK|HnHB%Epmr|R4JW<U159~=e{*5v{+^f zjJ|0Rb9&ZG{swHj)gn%`1ETZKl?`66JW?j!Tg(IR<9Jt13zV+0RP=jN^;I0+K6g_+ z4L|pt;`oj@VD<XvMEj5WwrN_Rw8B!1<=6Ugv~Z5j?-acxIqU(Z9|g5OM|Npjts=Z1 zKRXj4rEr3esgn8&-U^w;4<LbM4>*0$az*oSY+_2=VgH&`0l_UM740NgQ8q8Tp($7= z=%?9TT-#f&w4l3Wv`3Bp>`L2lXF7|v$-)slEJz(MRi3SxR7>S4u*sSM8Lme;Cx>c_ zaVcQxl~K=0Lde|^f8yu%qZ;-y;xLj`u)VJwY{sOXYY|D-s}`@_k7&~sc3d8JD|0`l zAT|@FXaVtrLNkZnq)3BF<&jFDGn~5-4rl;u(bUX}LbG4^*-(0|^4js>NZW=}H*9GE zF=*1GYX|(qpFj?CBMJo$-5P=Vg<mzLQiUh(#2eocXK^y0#VE8Cp1NMj4J?6-mB&tj z(%LBIka#f6ob;iU){5{Q4$uDuY%Lo9H_G@wKCSGxTy!&A)^rQw|Ii{)Y7zZUr9AX; z+;+h2nRhJ%u1CdgH``mr4Fz6#6z_c^edg_%MCf_)^)0-=mGmwS;|dMWAm#Q9z7WZ~ z?!&@tcs6N7CE8lMe|sri<DU&u<~0PP<D`C))KAn?4?kQi3KQ`g!j0NO%PeRfq@O0| z!rA=7sM3txxpI>9T57;$=RvW<^{o|lh4A@7>!PNxN7+1GQIXcyiWP55^}w=K*H-Jk zmcG=~M@=DG)3j}aC)K91n(B3_NI&gXsv;@S4(d(YshUe=Fk@|=YQ9sd`Htdn(v~V! z?W-;?t38@Jc6pu9)=i7vA(xs)T!zh4c(~zY^QJKqO=*wHwJyamsyL<xT)k1{-&3qr z(>D9erKT0ig<mueV`=J*{NPg4SkoqN^odJNLtis_(>FAQI7^$S8vJxc^I+}R(uXb; zSsm>-%(ggmq<j8$dDDNmR0eX*LitluQI8HZ@3p4>)s)VXA*Eni=S#cJtC3f(MVG?s zO1iv}A6;rj^Jbb{-Z|YDX3o33(H@r?dFxVXZQB`HHjoFVZ(Ry6+M{~0=b2LMWwJ9J zy-RDoF6Cbr?tYtko$p*KvcaO=s_UjJZGYiX=g!#kX3|D>9vvLqwemjDbskPRxf}BX zPgdRjF$4QUXyG2^b|JU-gsRcjrkk8>pK*3dIE6#55Qsc~2J%#(M7kO8OuN#o!%=8= zshHm0ru8nl(y6~(YPwNVfu^+Hv|4i1EG;dUZM~SiFas@Iv>Sh>UsEdOvEnWD!|<t^ zeqg7wJJ`&im&|^y{m&~loZX?+=n-bG1pwuw(*VNJ9cK&83|Slu#Bez1A>i&DLVu2S zY{C0J{jb&FWBX+dR*bRu`e*PNP*89@Soz!8tF@fbnomY6__Di&4Ew{RWWN+mp&X;s z**&zBj8=d`ZR_kAT5VR(p83-54kvIbDE(kqfa@Eatu?~(XBIW30UI+BpUYahs;RpQ z&)HEm_>0-!(}sg1wdss)&%lWp7y43b#ZzO#m%`uYEzNgkDhdx0Q*;n+ky7v5gJ%f( zW{Ynt&o*^@sricDG!fDKK<Y)>+{qZNW7o@v2FhUiZ)XeDrr&bbQHPuPQQ<kOEgXjv zD>NK}l$Vhy;!ln*xuzP_41Cgg((-Obt(ciV6)zN^nrQ(SrcL2gMyL-bad>6(Ub;M3 zxGwL|QPpBc-zOxuX5M(hmt6X9=id-tnz;`?^N#iCd7t^f6mOr;I6qQ2gZXFb6#&ps zP|!6!4vWvMOFVmO`AomJfl^Q(Pvo~Kv<fY!>B>>GYRj&z+MzKoPC?~ML8+hGH$56W z_}k4P2~QVZi7&|9Dlg#h*^Eq~hg8vfRLGdN!NK23U-U*sbF@;-YZ)i`gF|C$9G46K zB$Ws1#VO#0X^b>RwV)Dd5k{fqm61NjLFMn1;62G#4%cjpeSYZ7)*CUp-aswS_~+JH z%$!!RR=8`d*;YCK1$RrWjOBzs*0ybhyf3xN`NuL-Jpa%$LrM$LF|8l-67DXA@Qhh2 z(ASgT{BnK09oB<18=m?=T5cNpymI~~>04nQ#x0^xcu(sjj;$Lp1Yyy4*jn!>lskli zzx-Cn2!-P9x30sm;HZ{bzhgfz|LP$-YZiBn!(u`qR}^xEkbfZLY78>qZ3AB6l#tOk zNm<DC_WmV=;e_yLe%bS|u5Xu0tao%qJ=kC|8>bo36JY^*N#Nn<x7L)>8YzV+@LM0( zQ!4l07|PYU$I>S(btnDxG+S=?@N|R)XjK-+--_dJLV-Z>Tc6eAcy3yN8*=_3^Xh;c zN9t@GYw&6mo+}RfL^Wo_8{&9J9B=D!{Hr*QEaXzFy#xZhAI`+){OveXzgPInVT&xo z{At}N_<$T1_FTO->TUd$$CIF{Ed{FDAg^LGtPOq+zYX%L)CSKEXP8|_Z7}FcZ4&>& zbtK_0x@}1ybX%)wa5jU|3>z-|uB3D-DV-#xn`oh~DJeka!e2^lJ&r+b8KlI(ZIk1V zuMI~#*cZY)ZycUT0&*1OGj7A54>N56hVmjpvZ_-sCIYf0cJw|T(CyRdrC4BkR4qXD z=ARhKf>T)|Q>{HR?huH8-qpEo+OKMhB~7hr3aYJ4s|S%G5*Y-Mf*iS#oV!VkW7k%V ziAcTgP^G>DJu)~Vr9M*rBXcmOwyTj483bJluT@RwE<HMl6#XtW?z+_2j#U20Z0ypW zcc~$AmNC(#Mpn!ydi|v#0u#davdeALwdo<Z(RDkOI&!E}skhr;_j$Lt=@1TOq`TGm z8!6%4ZCbBeQyrR$N+WE#nX1YkQ{cOu;Sj2_Uc<hU%zEBQ=fNx8#9@+{nMl*c(Wl!! zOdQjq@=7U)ObsXnrmZ~pB&*EthPw$kPCukif3Pdh@9s8G<T$`#`%P7T%wpk-hvzkn zGPeXanN(R*0a60_{lRHPTg*98(hYS3&A6u3gn$BX1x@!QtGp7P%flGe_^01Jpee-8 z+q^MNO=xObQ|PQ<<H3bcC2mnea~?36cOr&}r3x|7u9p#gPW29_?kPN{<i^~X-Edx7 zY~uFj!CAN4rr}~VQm@^c=&0KU(`9ZSFrotx<oWIT_{#)uzO}>t^V`8Sm5$ziJ9I3+ zovyxiIsT<kZm0V%ItZ5Sy!{IDm@-ts%_`fk-AGbC<s`<);??UP69Mr;1M}MlV|alB za-7?s<$e1w@iP2Rq;k82|9v5qtqX7D9ch7!+hTLyH7HL^5*vohZ$}WJ_7ae16fzz3 zMT|$O9oIk1aYefg|3h2YtbRL6{|i+h-NF9C<P-{G@_u5eZamH-v@9&FDW%uVxOwG? z>!cLHCVu;k7^N5wXtjR(P11+4GzatT2)Pr!2=Akj2|pW!Bo8<Wkf&da0+eeiOO}7b zTdY^odfzKm-;=6MQm_%D3bdewjMjcTY$U%OCSs|*s`UMUR6%AA)IZ^_oh3_zhqEic z9VX&`!PE0^ICmi#EcHJsRlNSzj)m>F{}iJNyn4*MUr5WZN((M<TUu)Dr8C*>nB(~a zat$p+{bP7Z`yQeE2lda+@n+~M)dD(U=~MM@g6dy8)xY+7^{*Z3AIB}4<MB1a=L*8Y zl)^jI{vHzE8^VL6j?dz^?4`_It^lMAWUBIU$lgQpU>sUYk!D5vM}_>6kdK*%T`dk7 zPVu-IV3l<{U)nlJ>8PW$wcy}Q+VB@~;XyLAquvZ$n}$Oj8l*f42OsbFG<x_M2~vew z2IYSow4_(e{(E{St-E+yU7KmRX@IXz3rhd#c4ulb;tV)a$Tc|7OkOR@!>(rV)(X%} zLlgk-q2@s;wKEoKtfXoM96s23uT_pO+EOd2`6OH#r9#0|z%(iBs^l&oUrUSO&!eaG zd*<;DP5L8Kbi||?j>#RYI`iJml8%I8(*yh&-LdQL&?K{-cXBQLT6SHSE`A5bgL&T` zyv7QZ_2ze^T#sfDuqvgM*PEJWj+9QmExi8TmZo2?YblH|wpcoN4FhtCl-fWOx@kI~ zjTF&Sq+r652QlXxonUs}cff@#rJObvN;|kA@c3Y+P3iGI9d|ab&0g4S3MLu;oL=R) zA^a~kcX=t#$ni9cC!4xsQw9h28Tm5G$%{1Pn#qGB!OT;Hvb(&rGo7oGc>KBP>;tSH zxvBHQT+{p$&%0~hfW!0R$pFv7<Lz)9VDUVwxy;!fz1`f_o*w^%9P?`cckpY-Pr^?| z(QJiGlAeRY6-QbW<vfX3_r%_%w;bopu-mJJi*Bi<T|`=W5@-CGGzDY2R?jAgK3U?W zG(=xmxBwxTmdIybib~^(iJwL+z*mK|xyIKX01A9Wjl+ZAvBfivDSqWi3PJAYe)^vn zUT;5*)!?V$V=JX$`NrO@qfNM<eq~DSRAD_kWKP+^NuE4ERQY~w3r{x%tM@sVa1fZ~ z|B93EHY#|r2~RFnE8Bde%NFD(-%G)RmF;!j>d_YY$&W5C;Db<iD!AaHrNzmU`&+kG zHrBRQanlHoYOQ`BY~s<QjR@t^RKgM&&b%XOJ9rXm&EXBEQbW5!>vaVhOf@Ne*Iel3 z6i$sIpxLPwyb9FOIu$SzsW!gU#|gqk_pYOzz|7BbJeXn(U<aIUeg~BIXhB&1)%#o8 zF<-)&@7#Rpxah`hif6zbuv7dFoIofPZ@;6Dc{nF1bx`#~<Sz1hk;ixI3=UBYJNh{z z=<(^0>u+BuZFXk!9g=Vc=O>?UN>f8-X8*h2kq6`}P{zV(oaF@UuHUK3$<&yKO#}|> zGV%=t)fuPkKm~JKLdP@D1J`g6{w@51=x5#5(E(qQQ2zk+3>5LdD%Wh^Vv(#@Tz?lL z!H7**T7(OF3WF`i2|P6!8SiW$&%m`Ck}AK$3H{m(lvD#{Chr-E;CCjR-?9_Fm1b$t z>1&=EfQYwprOrHz)>eo+3>NZvJ?X(2jis*>TVTyVZnu!{bizQ$a;|N4;?-|Sl{%f* z^+l&UkEum3`gY<g_2BdA>3*kTo4M{K(e`Ak@aDCYas(%o(n-e+I(nq%H9U}KJ-eN_ zbz}RBdpb5%aP<~m+IlZKF-c9^>9;l|A9pc%=9Gh5ZzrPIg}w)!kR@g_>@?>hCtK+^ zCSL9Iq=J`t3<bY-F5A?8=S}6%EiHwaR>aH$<hx99Q}4WYk9_o+i&J=cn)2Ds;&V{N zYcn{T3|Q=U9GH4udFln%8>L>y%lh^9mU&P~N*%AwdP52-vAhl-eG9=|wEdU$M6EbG z+R0KdQ097rlSn8?owO+hP(Ml?jC_vfGX;0eP|B6uiBUDCM`r_5PKk~g+B2}#FwOW6 zLPWwDgu!F$wGr?|L;#pEs?P8_PMWd*3y=5@{l4eVX+3xPQ=P$iWvNqKe^@i6&Ncz+ z#+UQC)R`7gOu_uB;YDAhpqf@&X})$M@;Pk%o2hQ37E}%`$aMpF?j=m$1nke!4oKf8 zJYL$Gp*wKlrKPGmO-pzNP--(ol-OVj1l4BfuAHGmbEeT&zBkPdw$jJAAmc`1xd8PX zv<PYZ6BK|T{`1~83#W7VGtNI-ke?o57hwNJ%NeA(DSy^`lG77*Xgj9e0=u`s@twh8 z1_YFa98AwxDEFqFfT~Wz2&o$$C1Va-+caOko8Eb}wYw6!eHCF8(bBak9CMl!u(@eA z{Vn%K0tm2mWjVQmX_*I9afJ86SPnp~?V82AG);%U@WoCk{(0G!7N_A1DRr)rr%o1! zi<qL(SenslyT&SRK$oWP2E=d4$WGtm`-H)!ysF3&?Hldi&P^<^&ba;S?RVk<0dru| zSs}w{H+J&)qqAy7OX{C!k<@R!&Cp82Y4{z92`wHdhaM10$h?O!QGgC|r2q#~KWgeH z#rq3e{QPyi_PC<mCtg@e7Vqzhm(Ra+LU;8$aSaI4)P-_(?hyy9%Kc6XqfYqxN}Yc) z&s~un?R@&h=tuUx&}_so1<I4$D4`rU(bDNG+?Ue_gp7G$h0H6aBK~1El{!@jc2Wq& zN~8H_`Rop>q`wI5vHjKSAJe@4(Fxt#?}X^n{(Ae+osfsEsMIO;uLvGq|4=^{@it_- z5~$Y&JLPN2u~l&zcF6JCmnsedYh-h<^}29XraBFU#ZcOH-i-``ZGf$f*jno;h5qMv za&zbsA;`JWMcE`Xv5QJzmneZ}A7DAW5WdyvQ1Pk~h|m<^r4raxuLO3{J81Ayt{H4p z47++AeP0c??cxSBeV<l-{o&>e!a>B8vEhmIkxl=gRB1ro3_gCI>B<uu#J`RkdOmJw zL25#&nqoc3zt6|W9nD%_hKDntaC%Fz%_{F_iH-ihF3dm0hFQXka5(-&3KolxOF~F3 zm^`$=eD}NH7l`ndy1rHVD2KR`bydWBp8kR35h>;BFM;9^pDzu+kmfT~=b6<yPPRhn z2&Zux^aaQ3{eKCpsBl`9lP*=U5g39VQT}zs<sbNL{eMVN{>jC^F3P{IYP{$5y|l9~ zgUz)%jnkXY75|xf)3<@U)wEMs{4VwXAshr${Y-2>#YP6SfG?C+D8)Iw-}P&pmQq&@ z@bI*k<GsC9YpF_pPpZ`0*tMtgV2|(+G2(YY{^>jbHa_=-*@V)+SqjBJ8uR*|J3low zqiIx<bsqB)&m7osGsZk0I1i_B()C3>oJ?`0Sa<_CHVvoY*RyitU#0n9QUw>1-*ptD z8S_+D9zz$pKALfJ+_19KQ3@YQIISMOZqGr6)zXmZru^#``DgbEZ@;^lc}YO-ZsaIX zc6O(j0xN1Betx&lJZekWKOEjG%tJrod0HB~3aWXr)q|bMLQWG3<X=ojisM)d@j$NI z?F-#2ckvdA{@DZbx;qn)M5Zo!7bLaSoo#&cywYl%SRS1Wz=09uvs+$!H*T}?XZx|3 zV%xq#z&xb-`G2I!{P!tSce;bAfPW!1XpDJBeU6ZE{vp?U?992sdL!Cm)V2VZ%@3t{ zh&cR^8utWW3ZvAxbob~r^Cq?Jlxb^du`On_v`}A)Q7v`D<hH#8i!tJ^ms5|Z!>z1t ztZ#j9`4<$vf%`;NrfgxsOwohUZcKrtQK-82h9L9<0`jMR0EzsSd0(M&^1*AW;V;X? zsRalHoY~-Dy~A1MU2vxgOCCfKps~YPJ-&^OwJ*R2U|L*&Shp!X1a95eJdF;%fS0jA z*XgJI3ol)1<QIsdl6xSG47?s3;n>u=X)9vH<tervjbH82_|+)>H;SZ=4*7fF=`fI^ z$nnevmlqwZM-juZ!*M-WkD|I;)ejOKlSjw>(V=|i#Nmh{sd0Bv_##5VQWYJdM=`h2 zZO5!~2*ChuiNlW1(l7Aq6kMz!M<3tj)Ra5eWGt;|!2?y}I4`57Nr5F=iZSA9^n+O5 z&x!*tXbQG>Q&1Odihd+gP+P=7nn~f?Spr2?g-IPn@P@A|eQL_^DOS@~9~!05vWs|X z!qJCY83ynE)U?aP)mPiMC=xi@iqxD7hkfT2nnHMB7IBq77oPtisS~gA(pk~;l2~|% zzO{a&DTsBUk8z78W$$nDSYqlM+g~m~TRQ#Lrm9osYdFV0r=LG|r9<kHAA)zm^nA!2 zJk*9>YM!byL$J1Oy+1VtyCMWitbH7XX3?Xc4xaz!O2@ZdiZ2>S+Yqj2Y@|FGnYv|K z$h{wF`@V2sjwMX&ux&A1)=^l~6#8lLe&;ph#V<8w+8+N@d5%Lu!B&gDSA}><3vbRu zA;xcB))0G53O<itl{}4BG;xN^J8h^OwMmQ9;{v{cBlRS**sTDaSEDcxIG>xE@sBIT zI+8gK!tHE&F=gJGkQ<fg9DW@yi#RHyLSU7c#(UUArVv6Au-L!gjxWkZL_cPD`0rm3 zUzKj#7ZCX;FOZflz$09Pp@VvGZu=L$kE=7K3!A1iVYr4(Snyik(&f9vi{K@}n|gKG z(C3wLi!oj=i_Jfr(j(3bYWf!M6K_boansk^zd$wb!Xs=-7sT|XT5&;4-^e_K3Q<p$ z<wgQ#WH^O8yOtYz_pVqYwm%42?mVl(d%>Q60Ed{qG^;K^iIzj#{R@Ah1<cpauvv4n zX%h9OMikpW%7bUb_JY^|FQ!0VI53bcJgAcJXYYHsi0f8pIF)nodT?kay?oHq<x-L4 zKTA?aQa-l30G@#o?F*3{=iVr@uB;T)7Tr;3Og^hLiz{tz6evrKJSCK57AwAV@XWl_ za+0mQ!p?by^k%)&lfvn1!?k1)?=>}KdfLFXp1A3oDD~h_Sxl%>4^3aHh@~EyzTh8H zoh)^0i?_aH{#k7#3$s3)LReV<(g0a+zRmU!8))!*03|j?Jq&#@kg56^Y-;-U(DdyQ z)Awvc+szI74ySO6H(W}g#RZ)kvpA86nZ6!<mQz`!Pfg!h_|`K$d19+KeS2v7(mhe? zQPa1Frf<&~rmtJIma2wbm^@R^v@AE&^qs}U{7er`-yU#Mx#8{i(Da3a#O`@LP|8a^ z3!p&M{T{@_3a?~_aTMZfpN_KXRI6gs(3e?w*)u&1ed)Oo!v@GV37KoK2d)E~V(1I< z&;lEu-y=uAj`yV=m@QJzQcy3Ydg)@F!aYjqZ_NBc$AwaB{0!1PJC#yOH{D8}-5}ly z@ov>qS|wias?-A$KE5h!WVV%)*%6fDxbTa2y78=JoL8+doWe<HWOiiK^qqY~3MdnM zeu`0mk*P5cyIQH|S5iPZ*~8G6$oz`V>D)Z9{k?)+qdEy4(_&N8clHUfQR?-?O<!Pp ziad#c@A(Tjuqy0~Kwi8bm*KdqPU61S@DD?15uM%P7KPM%@An)+o;JhhdvEf4M?prP z$;Z8Z$i#b|kM3EyTb(@AdXr9?W%RaQbmtFRy_I#5o*n7l8N4tdv*baf7f13mx)&G8 z&Pex;Y=}q;kKXx+<Zet0N8b##NLPksBigm>R$u7ZkyMVtYN30Zy&`tUOtt3fq}3zp z^y0WCZTA_ThzTwCCgC)eR5%4IL8LPNj7e|XBDzVEK_CH#!t*n56`QuP-QbKp`8;N# z)GJS7XE!Y({gkWQ<U!{$yM`<_iv#foQfk9%cuOYZ@<MYTkKbd={H1!+RkK!`I`DCU zhD>IflupG~N}`mR;i{li$rQ}oMXIQIG<{7e+)p+&uc@m{VW%r)aDHTVgN(>ON~8>E z^)rjarV=TmuD{GRg|e(EIf`;TAU0VQR)0xhFRM<vlkb?knk(0@9-J=KCZFl5STj8E z%J@hJsJct4U|YrHIQKpCk%`Q@(n9?Y6rct5zl`XA)QrCB&~4^H%OqA=U}l8c_H$K2 zVPIfpJBAlr!;TZ*A#8u`e$+?@&ZIi*Gmo?%A>sW*c(@6s{Q$h50Z(?n3|)Vsy=Lh8 z%fwxO-hKx2Nn%c9HrY|-ksoHAnPGCEP|866i}L6!OqD$kH}E`<0UH}DyKBMimE9Ey z6j^z&Vk1e^`%#|zYX#5UZr#QA#J2A4-s9Jy+&9)FB!v*1BkJB9kA5>RNiLMic(-1e zp+E-@nc~Khk@Jt|y8PZS?=4Fih>@YMF9S2Jl=&BVqOfG-C{HIB*<`wpluR?bDaqBF z$$NGf<I@b!@lZK=<zHlkOZNpp9&T~NJ$1zm&pbA?%4sv~2>k4Fp41EV7e5*?cl<7k zB`y>^h};B`8X7rBvhYNkdXadI#CqhihzV)<y+KV~U`O4P7Y^^PgPeu1w6tjKV6+ir zFKa1+OiaC=$f=`Fj>s7jZ7k8vjUGLcoP_FUv0<57cu+%4D%y6k>g<Bc=Zh^N+JK@h zCfc6bmC|VIh&G#;GYMOQ#jDu3#eAle>+>68v|5M8B$l(Z4I{V1BuuxgnAZqhb14{X zQjfyYnY8n^^c}VxBkIeTFQ08YKJzRNxPctDvZk&(vmSwM76-N%gZJH}b1cY)76KH0 za5YKa@<`hjaC}(jz@&3`@Pnte6iyxEFn9-H<RF_^$>aA22lm3NIwj(+h+6cpB?Pj= zp=%Jvl;Z~0wB?X}=1E)|t_99Wg?fJyks&svu9sFs1V~%E1=77U>0CK{t_re*0WXtB zPFhTU)D*rVl;vo(Lk&$Lb^Jbk02d}wC$;oDCk`V8gTYWzDmOQzg<P38Q0^d1&5R{* zS*l{6rH|Zg!+2~}@IFA8nt@U|uusPv6%JNyTe_}HY5D-J4bu1T!2vEmV(<|5Hq~wO zDhK9KmE(U42N-=@3M0;@G{$<$-TJr}(N};%$zQqyA6;+AT!cO2U;I=jfiKGWFPwY( z7f(?t4*_QBK%{E0L|UliL+TyWxgjT^R0ag?XS>}hJ5!eE+K*N;mBo;4c?ZVgfTaHV z`jE#5IJ3D&xml8h!(O2HS=eeewP5<22=GzbhD^4H^dVSAcN}j&i{L^N&yc<7_Kz&1 zUSuc9(g>a`IjWG7eZi_JX`11aIL`}6hM(;>*u3)9equwepB;!{OO&z_97OJB5g3~~ z`JO2n2>i58DLV{!qKIS}FObD-j}$7)`+7yG2@av^<f2l5%}jpftCOUFN?<mw1OnSE z^AP`1%2Ejwb14fYkk3IG-t+M(H`32>o|2s(7MNuAaKI$;zQJ)AQ)SO{CqLQ68O@ss zm=s<)N5BD9960EP`3SY2RU`N+L%Fgvg0po-u<0*GL7-SShKJMF>ZEhG`Po(NFF${j zT_Y3;PE*HL_Kx8x`U_W`QCzby`;01-RV6TMl|a<Pd1!pLTStl=^HwO);UpY+?zl!N zsMgJm);Fw|Kcn7meUIqWnN;UlR=>}7m8xI%NA?JNiq2TjCr&`D#!{9_py)_hIsc^! zo23$%jVpoCSk{dPpoEifiVed*ju!TLGt6C@zS(`|!QfE5*7(8ws5&TcN`#ZntrU9- z{VE*4G4~FiyRJ^c%{Tll1G2Lk1bFp;*dXft?8_K7^iA|Xl{s!6yt|YA7qheBJn#<R zb@P65OGn{f%BHJciu2F(Je-6?8Xm?{^DjX+lX>;v(z>P)Z(;KKRZGKz@3w7THJ;e9 zSd<6t!L-dmwu6S#zcRg$geI?d!pg8fX{n7sRSZd+KZzAD^=gaoH`zR#=9)Y;9;ruI z-cMRbeD>fKT-l}`jNoJzJD9i^Z60=Fo0`V`nLK6o9q_>JLeR)e-smJ`lR$}rWTWF1 zd4$5^P~CeHVyR}Rhm*~;&EpK$?z#o0`0bWSIKW6%G5y-@t8}NjwlEY8<V6IJSa>R9 zvByi>-z)EWY^w0C+qJ;SuWg$LEuo>Mta*@1Hg84q+<{Ro@A_L?{MMCXcee0`fAs`! zw(tr%HL1_0Uzwfw<YML34W-l^&752;ymAJ9I2?YdY2}@}Jj_3HI2NzF)Ivp58!iQ% z!Hm)V<eJMHhI@>(Tui^R0lS%lSBoYuQ+Wk_4W*~23zIhd_FVNFn!cCraJB=AuHQuI z66GIv@zN#AzgUEU-BVn+Y$Mk+oTJ0DNkUO4;5VCuTwz|l6Y!Ea0pSu|GWvm)m`@*E zq8{6YAjRtNfm^E+RtNFQ-(cUboUC~*WelTjJK6T-T8$2$ui(0c;CK+I29HN$-FlmG zso;}KMF+@;`L^{28(k^~hnj(h19L+`h!y|EN`{pndBP#vB9aF==qd&ZR=m`cy~5}( z0s6)fJib<Vw&OWHC(?nHYtYOs59p>c4~pdB_OdBm({y{;JauA?+;#IluXX^}rBD@) z+}6^X!+~de>`KYI6%bCqMpS#jmHzHp;PE7v=Nw?Qk!Y12Xz3G&H=6f&WW@HZZvEQ4 z5x4fkk!$Q5zv`67-eahT7LGhhl|15%B#*N=DLhR-)B90)Ldfyu1yc-4&%d%QVvn@s z)tcbWX`V&Q!+%ipy4d0aQ#^vj!w;5%1$don7)H+@hd02`H{Qe)-E!mSwKUB<+9cyR zs0!I4_NZg49>qtFX*}hF7Q{P#(P5*D&_d~DijT;QtK@2xzR|`R7rC2e3IPX}D&Vkf zot#8Gx`iz6JHyivHy+^#Y%uOyr<rkk?EY8!g|Ui`pB}t$`wVvo#{-O3(d!^yCwHwi zCjEf+WpK12BFfzD8@KSzellr%)6v%kOGMh%@Kr3drGs-Ea?(QCk$sD!@X*zZ4$-N{ znlFBtM}mYySRX~Nn@~g_lF`z+n}6$O?D$jG<Cu>_Qd_*jXW=g9i{+_Mb%pgXOAMvc zLtZiq`D|VlFtcgGtayC|fOB`E(YD|-)@*V7ZQ&UljRM8qB;-BFiE|FyM4K&@0B;Mq z!?jp27Nq%bf`xM4&7tau?w2EIVdl^T@(d>@T)l7vILyqMKzM77^VOfwxrWFt1GzQ@ z>0|cz3Ct!-i_ALmc|s26$iE5uxY)PpXU+pejmJV+baS#cg1KS%H=>e%_}KMrSh<Tw zv}AT3FHB6kQe6E21zcql?oc4oS{Maq_s|I^F{{I}x`jT>2!nS*=V|nu)`ZGVd}azb zIA10pF>QaJXx^U=%Hn`>?H@-UgE-8nE*89G79+iM@J!bcq=hXVSAA&WKzoF_X6TEq z1tCO+P)_>OuOQ9LJe_!_c+IO8@*FMJF@6`zi+Dzzy7%F`E08Zs{Pbv;|H<vYf!<44 z?4hoF(Q66N%u+Rp`>XuZ^RK{HDv}}g{BE!BcDm>ll;}Cj$V(S_FC(92^xR?el1cPX z=707;Mt;KRU@7wOMF&tZzbNbg;p77xfk{8&p<L0yQcv`%ifR<GAUh3Wi#&^$)Lx)| zZ*cUg<`HQHz0lXlKcfrSdU{wFWL;Z)KGZ@9M%*ayiJeeJAyDmAkGuHZh?(Or0u8-d zfR9#Mc%JIEc^B4G!xcF@uhfGkcB4>LgCvY}6<aTV=vo+UgzG%e^^19L=L=VgfwFK( z^KNpU!UFe$89RqE0WzdsIR2CN4YAl+a41nY64}(s7H*}~7H+u~Sko3q<b%Sc7b~v< zCq;RX5$P|sMV%JzIOP1IWw6+^Ag@6)pQXcBJzZPb7bLH$rQ41wee5!NzMZ~T+t%zt zlpw(_+j1ufLM;_dK{#X{P(Hp<cxFPSj&G!&{lymC4FVi%8}7olDU{OT;waD~oG|~Z z@)YKE$lmyY+v)24n2rbYw&wt^E%r3^r;#OX!6L(=dK&<*S2(18mEMH0A-w%w*xG(C zBzmbAmP2$&FYZIJ7KS@^hxJ~abYTXubC;!-I<G<VN7jQ?9*{`Cx7|?Xm6vc?Gt=9_ zJjY2sS_fL-&GUOZNeco>jCZRSAt>_tMX8tPIG80U<=qFqePXy<fc8-8h5xTQ0WWc; zm-jz<vm6C?oN4M&?-a>u-nwdHP{Rbm2Zry$JoJ0j|F=Z{UoWWkd$CevEtp63dd2?- zyd{QYoWUXMEo){>^aNy>?fIDYe2kF!Rz$DpdTu;~K2k6AIZF=x4JRPiKKE5EVO_Ex zwq75PGbdguHuw3N@)B<p^fL6NcRtn+@EQ30UTEf}UJZijU1X0OPkBYta@TRq+Jmhb zV*3YF<%Z~cZPmWPvrVeRhmu%ogGVkLhpqMn_3*G%PM}nhITptR4#I~YVO#Y3-aC03 z`Ew#k9a)R8D((K(k9|=1_aHjU>c<TLlh+Ti01E5mI8VRCQW6RfGlaF;?`$F3QLg8A zH1*uJ$b)9PLi<;3X*dC3Aq)I|tJgIi96{r@c?xCXJIzx$Iiab@Zp1{ytfK|g59uhg z*zZ?8TXmlrK5JxVr{51fTl!m@SWz55D1GqEno>Mn>8NtO3@30*Y$;WZY~rf6b&|gp z>2S~!4ZLt-)Ipv=_%fJtda~dDP~jbFY2YQZC~d49jcBRvZ#wJZ(nst@O5lFfGg@xH z+c_5o8Z5lR(GW{Hf&;$e)j%^-)EEa^nBvYf;PmkjZ;M#!7tiaiYdl`3jp-xRkOw;0 zmQsG;0#ke`WPlnO`f*xa#AEF2QS#tOWQ3F&+u$@=IqG8z+I|DrS8b|Sp+qer>khlK z8S??r%&8#{IPT)3U>2|F0u~;03!9p@wD9u=W@dv(*CMh+CWIT*1qR%xMvwT0&{}NY z#!qc39LE{B^fG<q^aGK=!h>21q_?E1<8R!k4nWe_yqB8#$3RIO9Jzj2o0GfbfX=mX z=QXH}!*5|MmVrg4WE5ackd{Q{$c+NE5tBz9#O;kTb7ahMwj=92BsYrq57=%pC8cFc zU+gQow9ke5n$ZAc4#6Wwyr=sESgU3x4t(e8Y4~?--1z#;Q^i7+gi@mgb&vt*C3bwP zOv#MhW{Pusz^%sG)rZW(zU2>?H)~GYDo0NGpbHM~xav*#R)M40N}q<pk+V~3<2Q9= ze$;w6v*B7j%?$jcdEaVkK~u782(Mmvrbp?cb0*~-95uOm^nDqdZa_8FDA1o*-tFpn z!<6v!U#0}Iv4Bp!$`R~U%OTj3W@ZQ07WWEAZgxgD;i|@mLU@5It*Ngi9KS*+qQi+~ z;2a9D0_^x=NJFp_npUgL<I~J&A-bM9>pk_-M-9xQPb+|yYufU{zJ=meKy9(hL4jRn zN~1@H!^m!2bn7T~Zodf0An-z1l@{{COYB<sUG%=?$LsoV5bpPhcgyJvrM^$tu_ds# z@7QW1r9L_TeU6>IkN1D6ahLir(r4%@c0c#HPfs9#Iv_f~pLenND_=_iZ+{c>9RG|K z)Za{a&=gAj=a|9?$9{hY>w&waerSg#wx=IXO1~f6E%o!w0h~J{#q%--q8a|3nX+1% z)o$cA<;3q_>Jis)zQ9j-oVNEXPvHY_{m5xQE`9YA9)mc=?UrYdf)vz8zJ-*E9y;<o zjK=v=;jfh82>xtnmSjWowLvlmC#!z{5GRNZN<Wp#XhU1D7ayHUhbX=3gc|ex?!kld zHGTu6pYhNAllAbX2~UO*N0&AwN59CkOtkUJPC-L#UO4ek8DS#}F`x)!$@JsQ#_z{a zD9so==nQ^81Z}B*i8!cE_e=aA5Y*UXzyBHsnQC&sloE#;cAV%&pzQbKB-rpMx_sxp z=i(KwsmM*w-Pzt`)hxkhudU){Vm}<+^0NR`*6CSCOy^Hu2@u$}`zX*aVX~=(SG@K; zBHaRfVKUfQ$D>MGkiWLcf?Ji_j{;XYxK??vvT=V+X@MnDBQU=o^10N%6YnZ#vG;5L zeU>YI@N>DLaE$f)We20o>HmYw79A7&o7Lv_?Ev`wPc`+o)_bOT7-ZX4JemT}N`{8w zwcq*8OV^L=wLkb-%;?X(x^J{!+jk$=RBi;<p7JA{QH#IjJDtjiXZVz-R?c2~z83Co zuW0FumDSx?=}UeKGy;V);Tl=w_rE3+d7K`bC2y5s&OrjPZWnCv8a9U|Zcmu)!S2I~ zd3$4LcN_7EJHh%^uo7%n9tHqzX(?a(B;UPXt=!#O|52X1VqI3Pd$yyzOp448Ht~Ne z1spORYs-EeJC~ckWan~Az-y+v_s&9ITy7I$WJ0d&25Vcl8D+^l*N>&;4l`f*oEL}( zhM=+?U=)I=%7q{9S9W!>F82sZ&V#^mBUrvDd7KPU-X+O1FQ9N?2pP6Tak-at-``my zMXq12ZE<-(+H$J6ykL1y@?^dQWTXX^UmgyGK-{(^*|CCA17&r0{lSWSx;ECVxI8YU zcPiVPGQyU?Se2#aX{jQFa}u0Yr6^S*J}XsDE9K{PH!5IFAZwm|zKxgDwqukoEiY0= zm~tsnDA(4uw=3KB&+PJYu(`6jT?y90>dMv*zs8G~+ICj%t~oX>E#D+y$DHhPnYbu| zc7t1MoF%K3&FcCFXs|$+mTw2!YqwW7R`74IQ(aqK2dxf3ahZp}-^gx{IBxgNUiYZX z@^^;C)#}Fjs^Kxl6G6ZCH*c+>ixx+DdCSVqh_qn2%1+;=U^MK|PH)#qf#uzY+Z7N# z#Hk`vVz+|D_mC4X*46TI$SH*wVhD8$Dp*E1OeEW_Rxi?#a&167^pX<kC_3<;P7)4? zS4~P)Iu6+DNDbcdA9W&p`AMB5T;8u=Gk>}%9wY6q`YO-ZHAi@M`JXz$xcq{BGXjaT zb$jRjt!*P}bQoXZiN8v4XYHXfDPneU`3(U81>XUTaV@|6uQc0S*?JUfXMq-%KLm3Y zt;j)2LCQG1Or&^^h3#DW2DB~6U-yLOwY!^ZTf4#CO6B(Y+Kg*fyq?^-SGm7&dut43 zYrDa{we2;XFU9LVzBcV9s_wUBG3IF0t@8Djm95Iw9g8x1U5{3SHtYd`sD9KQ0tVjE zk!Pj+oLvT75QOk(vvPkY+So0;^7ZcE&idB+&OKl~qnaD7@^u^JWF1irEx<OeZpgm( zcAqI<w}B3}UMt*awLI=F4R2uA^8<bQ`T79#rU0s<ABb}Rlh7!_0o;5>0S|2GpX-rT zVJ&12_Z-6f$H>K{6yzNbioEiaXW;w7EmXex#64eieaZ|dWb=KB7T3%C^_e<hbRCLC z<@7yHgU+kxeF2^^nO=V2m|br%L${!xAwUab9S8ObMuT^q?*#=2TJ{52hGwk>*XmZ; zbs5VWpjq_Opkz{LMtw36Lz@dWxLLP)uCKUGr=L^v+FsiooW}IJwSxagv#EF;Gcfuy zd;N}WMiKsB$=&PUbDHtFGf`#(UILC!xYZTNeFWJ=0^oX;dAql8g~YKqxW3IiO0Zbo zZotf-dT*QmTiJNH@(6QvWdnc2>XomDkf#t0Yb&ew_-v<X1-XtLC%-f9R$lq~&jjaC zX0QJe+{U-kDZXtJEZ6Nv1nrji^~Z?d41S*%bUaX)HK{wnlewCQAM=VPbtl-L!(TSf zr0xVy=QVFuQW&yl95T^Bqv`#R4lT|g?I6F<6e2=x-b+pC{f~h0f2y~$UY*Apk&j^> zCd%**M1UXY`!Cn|{!8$ldE)hpX!)QxaH=49t?;mm*cw=u8K;^@BuwDp7dxAP=@R!& z^BwRoUp=E<qpA1SAEYgwqT-sz^ArNl&*@v)HxLnDIn8@bW#BQ(zM9`~^#&h1|8o@S zG^qDAqDMHQ^G3uxMSf~Yi8*Jz*n^0_lKwsz#7UA#<(gb7im;0O;~h5UNkous5&6+^ z3TkL(yp%1CVyzGjY4ai<yv9`WlS9^Xl7pAij6y6fXguy)x1}2EhY!kHywSs+jC3+l zG&#hxR>4j`kAJNBkc0O~pv2<v5DA#f;$;4D<pnktg9Dxf=AB$By!u|-I^#kj&O-ua zM31B1ori{tpuj>=qdI?}c@T59)Jai(mdxfMhQ(1jZS(LrqD$dP4O<UBvLxs;k1Dtp z5UUn4>_$md^X5Sd6A>ycjQ=lm)Y}&DHrf;(f^a>uUTo)gWJFI6_I{0R{T!?xo6_@u z=yW(IdjNf3ImA|&D4N{5rZ$;kEKW{*mh{}^#8cVF6yCLB-%j^)ze_KV9~WMnm()pJ zwClLZlbbn?7U%N~^XgAr9JPIm-4n^}n@#h4#|_-b$PE609^pgJW@j?n@!%6DBL?@Z z^eGMU5d>~emd{pNI9JI7u5QE<2g0GjXKrJ@!KV-SU21>upL!f3|KR(w@T^?3@H%ee zI&dCQ$`+n|6u>LrcujZ+S@H+P2dZ*ykg9=v#bNMYn>rIRU!SVx%L>`PCJx9r6UpHF z^MEW~(+INq|8my<=Qs|JW+}(>U-&W_u+&aZALP`3s(#y;6DzGZ=1TVcKi6LvA@`tK z;#L6M%zo~?<6r4KsLHi55B@)OH36?Efo?q5bCJpxp2rc)f8%<Y>sEM(f6nB32oJv3 zI6Rz2nq4Rd2cA*Ja=iZ$8}s@xYJ&+C=I21OjVV_gD$VHQu`2~9HKklYcvN<BJpYaD zYD-%OZ-RrDdoO}N4xYdK>z}<R!S8#2JbwFnFL?9*<zDdD>uZ5b1-o}wOOR%zTpkpt z{Ik?gD2_>{RMJGQL{YMGGg?oafLGi~q0A}e;9iU#6eSeb57@t@+*NIhaf{(7{#L!e z3(Eg`@n-<qp9F6Xg2TP%2k-WR$FE->{PEZ0H-8<x;Pnvghj0T<zzCc4sFZ^e$ds8^ z`#C6qc0Nb4__^hHv2-hD27v?zK3{@@zsrlOcn`f2Y~F`mV4Vt;Ti>m%?#6j~ueAR4 zQ8?HSp6u=K9nM(7@0B*cURj4sD{qr8!jb)h!#FR3=Z|0f_44gMjxoxYhr#0);NR27 zm>2uO+>_w(;h$z2*eXk<9|`pN<M+Ss1+U*6zWw9P+rzz}9{fxY>~j79#O&)g5eyxG zm!-!XLHYpF{rIPu6Ei*K904Vm(xn_9QB)r-DsQfB{t#@fJ%B4<cl&;wx>_v##Rc{c z7nn1zjZn?0>X)PFljDY*RsGNcZazQvl1uXJPz$R@B|0I##t>*NBj@Md>7si}yhns0 zM?xyTa_`wA2#QjUs-MB@RKHU06H9RwB9o)&%Zcban}T<lAqux9h~{u)%TbWmJKs0u z67a0oSi}6blXVOM=)>38x1k-U3JpDsDQK=9La$_cKN!NngGt4L5Hz%X=nq#qgrhuD z4+@%1LGd#1sEj$tQGmB9K%<bSA&7*2q;}(|9%zl~_Bq<<po~J)3%1(GiKaffl!l~* zRKaXLsNFV&-O6G^yoyataHM%?n@7sjn^wHjZ7vU=*>WvrY+g8W=t@UawHm?ZYM@NP z<zrGK2n7*rRMlc(8m4q~(o1HsW#uX#dbEX8vO-n2qC>*?lhcm7;aJACja>H{R>5OH z;;<o`2CoeiK9vu62?gdOVWxECHw&*i)<q6cJ%XAnQ2GvD9oSUm6|Q)Z`qTbA&SGrJ z9UeqS@%)~yX`6lpZhWp1=b@@uyiN&}m;cQ%Wqy?u@W?rT*VQwJ*%Fu!l}_4P)ruhs z`OO%|1#f@l)myVdTfCdwSY>z!5o=+WkadL)L3xU8vsj_BmD`JUS!_ksF&Ha>%-Ery z+={=+M^J};A-tdK;r+^We$mlPg`VL=RyE)&JmJ`(g%^9N>n2prSiN>`Kx6Lh34h3j z!g=MJ`^1Zh=?}Rh7fLv9e~40#FTj<Cp0P(xDdJg{<ul}v;CPZ5;sN&<m6%biZYLwO zZ!a0zH0U*!(P_))F<hK?s)k$f(YM^A0Ndz0=21Xw^rGQeA25tUaz}nu$Zj1~$6#K| zNIy91V}%`omg<$>D6lvBL}B#pbvzFc8K@R=^!@aa_og)d4RlB!TQ3%-tA=d!EWs#3 z2@R#A=QO23U84h<rvbZ>nH!nX(c3nWIoyizFp#5X1V-_3ON&jzdGTD8%Y*B{mWD1B zna%jpi7kynr14orn}<+km+Ez?(Vt!F%+Tk*U1{_PLi8EQx*ftojzXlPaP8<D_t8tE zqfZ><*oPuvUYowP<BQ0cv*tNomxpjgQyK+xN6$n=0o2jErVO+e*~BI8W;-q-g!t3* zN3qHTUUb~A9~?YB!2NSq3csE?;vDl`9^NdpP{!zlp~RF=Jk|s<zMAgxAVCZc>^-i9 z?uZCa68h*5bBgd7LcUa<S}3|3)bARm9>A+~bV0X-=k_QBBZv4CKexNYKc$ImDfP#6 zZ^YFtM{|pzrHQR=9;A<@3VWGV-pATqDZY5^usIVn3NqoYVbtz-W8K;|>)`1#5%@@i z*3%0RW5W&yKFDdfMxkbDi2}1ClVWUAaTGO$SkoGN<BvH93BPfl%wji{XBb?m{kqC$ z?@zi?*pe2?E#;pHZ92&p4p+4l4qRJrT~qMi+PsRUwq4(%-G1(^%fnS&p)a34wAV$) z4i0gZvl-n$Kim$>PkBkbiNfKIYkSpPm^qoK9Gc*-lgWca?1Sv@MEcOS7_S^|n!L&M z;Um{}S}EYe7fUk7M{6#X-dE}$XzG!s^h(><Z<-g)mp#pUswwz)Eng5wAlPc7zqpiM z-QvezT`3OhYzqzQ8r9IwF}N`-%{w|q+N0=mv17QrW3WwkyVPh^Q=8h>>A<zo?;PZ5 z)zU^)lNp6GJ~ShvdhDnkD2(ckty*by)ah5XQ4Ms3e(!pDRa3K88=?2n^$psqXgq#i zHEC#|uC3F;LwtzV@(QlvWEP`8Ryn+(^#)zaxZCJt%cpF;!l9jiW9dVCMR@e!aM87( z=0SMkGP6|8UQ=w4gjVZowe<>zF!hc5E)OYcMlj!_sf(I|Yr~Ap_yCu>=k<Ck)jAz6 z^CNXQxUGkC7-WCMMQD^)cA-m+U^4h44=jg_wKx(Q4JuI@dBl`+^e|PY9l`~2Z;U}* zpFJnB@{6fwKS$ky_w}k{&~5?}=#TtvDD}!KbOMe%VV*lcHrm_>CciugV*2K^QVZ`~ zncAVoUyZ0ce}(oh%n`t=w|_@y|BCfFV(nkld&zp(!PM$CeE$6Nl|8Uw!!cNppMS<+ z<xL$odZ61@$0}#kJF4SG6GD-yW8W(`j+Gm90*;)LD%g239eor#XUvi3xZ&Q>#Pb>9 z7<8Y{ACb6a4?*k$T9?6ta13tE&p#f1tJ%<JFNQSrvfhfLZ&bh3bgLEgjWQf?6nj~m zKD?Y}to%`U2#h0ilvh7s2cX3Twt(DFKHC}l`E0^*Qgsa4oS7w~mmFViWeElGiT>#2 zdc2@iH2utIKTF~IGgN)~W}KTjf3R=R9W9O_#gQY95kkQps(thJM{(-mH$#S%M#tEr z-&hZ(v_A^D@kNimsT=9`Ux;l%v2m5~SH3k(DA;iQ(Lz18Z<q%eRvMjS-{_zloo5P~ zLTOZ7e@;WOd|ogd2Ry75AJXwls_d$@<J$(edN>BFJRmJG+v*nfbJ}2bzI5WmJsc~z zdZQ~!eVNp+5*ut-<rV0Icg8%~GrDF{sCSq3L_0j&vty|mA0W0##kQf?z9+UVLfMRA z!^q&w#viSaFYf7s(&!K5)fFcb=>py#rPO0RBTJAMmthw#5ig&J`RubWx8NxvH>@Rm z5dpCw^s6sE8*=L>Q_p>Lwukj#JR0tf*0diobFjVpqmN_#0QH!YHGB-!(N`~HlQ#*k z4|qS5-nagAd%!5#mPY?ZJ;dgrzm#jEkbk97Ir>#gcr=pZ;|^Q#H%njf79?S5^pzPm zKzU0jhs=9Tp2|$bF>1`=j5&#VA6XCjL1`36A2GXo)agUf#bC^0#Rg5GG%EhT=YTTC znK%mnUupD2vB}Ygo9%?0D2+9+6ysYOvqv9DB@JFc@d0HFezVe83fzc$O<jM}S2kCw z>VVCzI>SW3n+Y=4%5wWl-5F~wm-$Buq$mFTc>SRTMJEwT(^G+z-WlsKU%_z7d#6A_ zAFxNV2EI48+U<sHtVi>(skg&+!4JWVA^-1>VSBd}G!Vz7fZ3jd4CAcEzx}aZg@TKL z?U*I_MNlvq6pCvxs4WKBBF7f^S-eBq0{y)+HWEmo!wX4RV}?JLS15TxfjE?(g@UX1 z7Oy~=QVvbma|lNfuAah!G%1b2>BM*BKmlf${MyGL1o87yW&TY>DE<FPdlR=Nk|%CF zfW%vnTk#lg6p)}OhdP8K;U)nB47%&agLok-9_zY?|N8s+bXV8(B=P$`zu%kZS+<?& zuCA`GuCA+l?hTuNp@i_L`IY%MeFH);yn!U>_%cnhE$U4avaA7|ANcUT;}PCI8V&do zZ{dE5dy}_W8w5hVDSJt}V$ZfS1EwiTv+>tZ8W(yRPnl5)y!?&1fh;Sc-n`T^|CVQq z`gX~_jr+ieRzMe+JZQU`YGex$88DIYtf+0*s=uj%w;TGllza;?ZWah-TgMT_<7htU zSt{}E<NhrBZC<_cr0MBz&-!FOdiX4V<9B`gw7GJq;bZb`Ibc)PgZwik%(`7sc=jUT zBff>t!<4f8iyC}ZQOK{F54!&gl91o%+qdbC8(mdz_XY#P0hIT4-pop#k6st~?1Op9 z62vBd@jAz|1Ld&K_N}FObiM3oPo;8<W*^0pTOWUt|Ck15#O4hX1c?QiGx~kS8jN0M z59u2ef;UtMLgxS!ZIS7Q_{v2Rh3c7Yz(1#o`cH&N!oEXQqR*ru<M!Aba|V%ghbH+U z1douQl+#q;?Cep{pzoNQ{l4Sg>~EcFKlq<ez(HhzRCc!2WW_G5Xm9gV3rKuIpGXiJ z!l#LgfvY?}+rciovRO8@3)?QWz8)l}@L9g^j76iNk0k!qr=qV<Mc*vQeyY!iJ~WBg zF5MT4J_99Cc=G8Z2k){Yd*4+jf@UEEpYmR-bRX0~SsD<kT9WDZCSLbd^-N%M$R9j= zzboO`SG)VW2hYCjzPt_WTnKR%W~t+xh5awP2m8<Vg8Vx2?}NC$R(6t*<NN>jlN9*x zvoJjWAAbsJiVQac7WKb>IfE$rR}2<G+ZTI`etvs)@aEa`y<HPVS5}#;39JXR3mYGI z5vbnNCc*yhx7`C1y`50b$<D6C-^@0VP$q!mJ$_2CHK>h!8=S^<Pu)sYkXB|)OO!V8 z_OMP~%lkUHz7Aeyc871PQhMXJzex;y(<J65^MNz7v5auNd1pbDk&Hs`I6`^jo~G(z z1#PacZUi=U+k7)r$D5sfgDge9#|pPe?^_E6-uJvA|1|0JO!pQF6=zNUGt$C`ctQaw zxg`=%-ezV$nFjbM>B>}T28%;p^v!;@Cw7(=W;fiq9DSRa{ieASZ@$Rn9qb}FzW-Tg z=11xEo6o_A=Wlmkd<k~<Uw#gr1)q06ecj!EVS?p|(!V$2Rx$l)j{$82QyUu#a~R?z zP<5E*8o`7&jS~0(s^m>7fjF^_XGtaSq;nxfqc?NkWxX9RufTMSY>8zMjyx)mv$^9n zbFK)0RB^o)_GXM=s>wHD1bZ^OWz1m@wqO^)UE5}IoovDU7hOWoRTMwBbVQISx-V@? zilb1@9Q`n7MZ8XwLKmw!8#%IpzP)T_+Oi9eKgf%|+|^&9f#&F6>Sc3%|Fd39CP{*} zS?xq2K?qoyCiOY1c1jedKHqfPXLL>dbx8S=?HJc9h$tPDh-X78Hwpo86C9Dg2`{#> zQc*HXLlE!Dnb~^C*}}REZ!!s5SED?e^k)V+F|~;&FTWyB=tHn!lky?q1w0bmH%e18 zOXjS|!bUJZ^>}K1mO1g5qMgF#I`ZXbbC*0C6mttW7~q=BOfiq&ZkY;nEVn{TR|RL0 z7Vo`08_;!*a%v%;!<jjilQC8s!Q66T8f;iK?Oq?-vKhAKA{<>Bn!>4&m8l&OFuwdz z7WgfA^X0RbE+sGea!>um{t@{|&zLE*_m^GxfIL)K_xFWj?#1S6oNsL_1UBQ^=a+0w z?cbZUe{aJ6wd&SQ#(%wO1j%^9kcU`eID%g$w{KE?_CM?o9_&7Q@tWHd(!gFK>kH{% zdrShm9h2_!%m?HJVH7XlyufxIJlp&8*<YV+-nhRY{<M@ZTi@PSyYD$DncNQp1%eM- zq)!o-bXEf&`9*{wIKR%PitB|rnT_OjAXUclhXQl1ATTw5y&qsZ@c1vvA2sS*VJUd= z^#Ee=iy4PMJ!AQk%%J-E9=J2p%Dhv~$>dvWB&OY!0yq4ze7m=Q@sN`F9Hx)PSiZXk zimRjpJUdqyDoxE9e8Dcu%R9lwX0cdUhl(4o!EF8lc;i;!c;gl`tay={ESx)D>e^gE zk?hM~wMecOZu=*syeeb)8(v#tBB=G{Z^^+w(tc<?SIps@pc{TBKS(k6E_Ez>{ihRO zv6#Dsv=4(?eKF_K0-}rt`f%rp3<lb&l=K$2|I58^aqvoA{1NVbvmsN?h`_S}51!D+ z9Vrl{=H9mr_x9F=l@^WVJnw(TRVcW>Zq|w1Te*bD&F8U2-&$ssdCrWv`k7+*)*|N! zQa-%3#1ecwc8;);0Tf}t^eu=!E5~oGB+jDbW9Qz$|2lb<r|A9VajyK<0**q>K`@Fa z_jxjtH<6HErRwF4{^#~zljVrk!V#Ig>VLN;f;;xe*v!09;K(Xdf#`DDBAb7SmAkOQ z=Nr(9^Lb?Z*%l7ySpL<_v;7;%#8s(7E5p^x=IIH%W%B<Fof-d7>YA?|hPTYo5A&A( zKVEwm-r~^@<8!+O|6d%RMv@|qk>%D)_=c@JYZ~{K$$!H!!kX7gh`$Kg<o}u8jQ@{* zy<0d8Y5E9n!SwYmRRAsxUATP;S2cqj&FtG4RloZG`l0$!bxu|KkFp+BzkaBGb~orx zvjhV=>__so<*<HUeV~{7nM;zw{$qT5k5G<V0|EV>Bs`P)EWT?o(l0l7+$nr&ypsJ! z_2bz38UIi^mlIb>ON;m!N&>mRN4DPLTsNV>J1yflTLlmQ%#bGsIZ;QS;7=bDnr^S* z&&VywA<fSDmN0n2{pyukQz>XWKcRY~ltoP!`T00^jkv%U;Uxv*T6H&a^(JeId1elo zg<(J9etwI=+7`zj$aphzL$C*FExK*R$<w(zQwMLpynes?<;{!WMJ><Ewi$1b#X0)_ z`r-c*(v73!kr;MB*bo1o@z_M9NV*?K<WBYDbdmXiI3xt*bJ&l9=ScQ$?t{iCn+O@W zpGL6p_VhCdLO~{P8OOQ$41ew;K8P>C;!odqm*P7&&lk(?ttpLCAvN_($s8v%f39+p zuRf8s<+)WZ4LGyY{g8jUG{C^fhil%C@goL?Hw>2~86-2eshEQKYky+uXXeOjBe&ci z1L~;5B{TP%aVmstf5f_Sg1M&-azEUuAU6ISe<0Wgb3Fgn|2!}~qVxiG7k+Ge*_7OZ zkP{=RV6MVBdc|6h2QqK3Dd^0v;cglKzZ2k(V(^ZA?3ot^@-VCL*}kb~o@D}g_Hl{@ z^K2?GrF{PZ{6P2-tLuR&<@>)F@oJvk=CjS!+)NG!#^L75FBiDitMJXtefQrkM1e9j z;~)Kyf4+;FAKmW%FOvlT4i%AL^DFaj8lJhvZ~*ZSuf=h4@&8BmK?}o<SBG3_l<Q-3 z+|EqHk$Fl&^X%$VSH)Jo%zs|QA7MwC%i??sp2fTyBV@SvenIMG=iAL}VP(ZJk@-#| zZvFrtyRW<l^N4@6B3_d5pPk|GAp{e{#|jvL>n}Zkgcn@_sCNMf#a`1EtN>(%5lQZJ zCnxw8vZ>s-EU1mmb8PnHE?1*jd4^1mE~&Bk>v$oflxD#^G9cW-)@QdcjRXCc0$`76 z#P??H&+sW++rWj1{@Cu&mS`ZAOWJ1UG2}9<rw14W9^le7Qf0sdft^$_Hz_*l!vp9A z97cdHzdp5!YYWiaZMgHORK~vn4@Ph}U`EdEX~4)os#^mPH-zWvJ>oO7U^Q?!FzHsZ zo-0C&dBVjR)%j_22EGaf#UMv&<Yjf|2j*-mw`$wi8<oKLX70P^U2mF394iE%mG%oG z82`i{OU_LpV&8m`Y_Y*XCtZI7aQ&t6@eC`PsWX@eujB@tnnV7<6<jPE5XJO>e*bNr z9|0M7!e@^?HcM3okhYcPb)(?`BK<N^Tr(>EeV3lZb=^q@#`3S|Nrr)!GOX<U3-$(C zmmV+|%}Ay;dV}bTb7B;GiBF#ayyyzDN~+`7^YRf8SMMh4&DE)g{C38><s&a??)F!Z zEh5zTqWJL;+`u>D_tm2YXkg;M*mlAJhCXP4hXa3+8r029biETS)iv-B+y2eA^)mt_ zujSZz&W9eB8*FeGEMNoZ8f*fTLAd^O*{3Q<dc=j8r)7TiB2IyKvP5{u{k0<+JgV?; zBUINQw7xX1*N@>fhJz;@_DoD|{u2$$Dg4rd$bSh3DfOT+HuP~#Uq`m9+wz@0l$?F{ z_I)b#@-p_7#J8LUmyZiwl1*^`DDw2jP7V`i9PUNe>{pNQEu1CJ6n)I~QyKs(BUP}K zmu(ANaOmZ9w8O<!yn<}kz`oV|mj&j(3|=EVn3g^~N<HHq8w5v4iBiwZ?;yB|&(Ie7 zd3q39Up%YfAZ4tYmMr-h6;1cZVW?isu?sl(;ALL$LxROC{Mb+C2l_bmx6Ye<?NvCN zU)C&MVJ1garo;j+8TH_G{KtCC<fzJ8Taf%0f!6_zC%U4U9D|zwvXJF?XE@$u{>z|I z{mA2kdA`m0)DUqk=OJ7l7~A|6<eAstvY5nqk2v?ZdGlznnyd%GUA)ra>UlV?C+iKe zUMu>o%6eJYvh_qtnQv@fIjQjU{Ko>%e+>T4Q9}MHzhDhM=QF5&;ou*feQq{`WtO<v z3{nxUXBB~){5k4^g%(}GIf5FxAm`niOMZX4c*R{}obJ-|U<+>(^?Jbf(G{E#tKkh? ziRi)Wo<uzyMzia~yLe#XAXyK_MRXZ=f!KBA_4_SRujeG|At%53`rHLvnCSP*z3lRr zI{3*)Foj?ECF%$#^`zhU173^xoSp}-2T~xqj8keBzY~*g%`B!9^}3<<M3-?o$<}L8 z9$%D8przlQ51{kqT~{y8&07@tBJ~<x5*{)_4Lt8tREuo^ePkQC+$t}-@m*u0DU2;@ zqA*2^E*DpVl_k$S%f^Yh+Yo}`ZEP5xt=4kSI1L4S&*H^gw4jGmdloM_c*ys$keShw zO5eW5Ki7{~3nN&B>1+G-gS*gaZubpkQ~05DGljUcwGvXP?=1d5{#<-@ao8x#2Aa%Z zuy~hU-Wv$`6s7wTsL%4>{NdS{3*+A&kHh$f#^w(O`S!s;R_Z-Wrh+ip=ys@YCzEdt z<f(v7S#LU-rg4bRW}zh6w-9}%w0b*#=*#=U31cp$Qq=NMZ+<N>Z}YboY(3enZX;_v zybb@Kr{p8SidV2q+3T=)2aBE_R?aDytc|88uWo=iAXMYR!@^4`J;=iOBb+lJL@X|1 za}96PB1mjcwDU%Z8Ig>X5Ia>Q_8h;gD`@mBLJ~SwIl>pPViungR5>vJLdm7RWX%JT zu*_2Ww$uND#TPIdZtwDGgEMn)Lmd=|W{zI}QRaK1Ykz?Jw$Bt%g2T@g(Snv1lBV*v z-(M;7S)#=UY}tG^k4shBmV2+V-lzCk<4OwGs^i&boh=*}Fii|Dz};L7rVH#_)m1rh zz=c=kI5K4yf7n}h2ua!oi~pGL43b1<?WH;XjXZI^>{9A~^`Y>xOLPJb(Fy2BRi_ID zy``^b>2MNMBGTk{d7Pjq$K$L1M;pij&fPmTJ3C>*c0t^1Z0WR_GBW|JY!f?H5b;}P zH8=9i66{|?PCR2h4cGzdI@}6=<*}tRn2(`ex4MVU#jCsd*yuPDnuc)mD1V&Qbkom~ zDIh*N%|AJ3pe_Z54<K8(QZ5eU8W)12TP)4+&)5;Rg<-b@j>x7`{Q>{g&^6Qth(k9L zyZsOn@6toicf%pNhRkk1)Xx$YLYeK-Lj!yZeZzWJhhPk(hmiUb4$%Q&TV#MAOi(<7 zzUyhtL+<0Ml_8vmkVSmcK|WP5coI|SyOp7FLZ<6)2)lEvna6FTA$;DIyQElr-G6ge zgN1SR&J5dz0x!Gth~v%j8BAZ*ZUC9&gxzRyQ5($V{u2AkurRI;0LgT`n=awpleask z>5sUqS?EKH+V2AUU1q;aUcVR{1ZR3^g=2%JAXF<57d4iRuYQQ$UsA0LLq!W?|5jO9 zy;C!Ta>JopeoOFD<z{&y+f0B+HFoC`?q@J*7E)zw30K+8=*@_jSb5R6^h8cs;hD~n zZr0db!INd1SZO59(|_+$e;$IEOAkFyj`Ag*oo4i5XqTg;T`}~E^$_@q?F!)ou_lD} z$I0WD@!{;Nmp*~}-(6Ljiv8>62pUxRa<|iDhU6O7RCb9U!5lhZZ=aG_ea5qveQ#`L zF28>}w2f!SxQXC86VafCzH7g{1Z#*E%MhX-%0rmTzk%Odq>Pwx&_9mx{tGA!vxP&j zPRcy#9b$Rl6M#jOGLYlu<7uWv@ir-xX=J~&Lo-Z$xlAdQLF!-mGE$nu3{zh&H@iMA zH{ZH-D{xcRvwRqV5}m=G<s(7jpU31PKYRD&)U=7I`c=l3PeO?^c@4qz((D6XZ#uKQ z{(yBHzbv1IzNi1}S#Dd|TrMpXmv@kMfcyWzYt#qPAa2ox(2;w&JT(nLY4#1j3Y~x% zI+BNRM)6bzS<i>Dzlo&bS_m`LeDOh?R3&o>w9j1Rvj8pXIhah$CUXUE{cQpOS~}Q* ze_HN1x6(2!VduGXqI4NSkT64+if#@Rea)+x{=;{&e`2Du93uXYD&niswzrKQ5sP`Z zqLwoYxTq0Vk#3Z7t1~z*s4wpFHkHCUUCo7jo*6U%A#XFw_Z^ESG*z^=KVi&Zd4dpC zHOM>+%=_ki=22jZDB-poJ|y;+0u;c?8H&hER#-WmnM%ZUmthIZy1auGpUFApIFqkd zj`4Or-lGmpy@YVXv&HyXQ|FN{28!J(`F16#i>CRk;P$~x(c1@^tSV&h0ph5);j%w7 z@c;4WCdEM6a@tL1+rE`?;NB>--5Cf>i+tvB5(5MIH--GW=(|}9181Pa%pYV6tVX-e zN1@F*vg=ep9Sk!s{CeflWj=%a^H>VcFafVQ0k1q+f_iUI&+`3SGAku!W{>rt1pZ25 zimlcL$8Yh{V<)-N62?zump>+Ut2XSW#Y_0uilIc>tCu|gb_%$ZFX5b=t(VaoI+wo_ zD@eUG95}ut%+M1E$tvp?C4ZMZi4jGYaGuV>8&?0{3fa+o7Iir3{~HE<)5BE#hOyr4 zE;(%Cztk;;Au7C^De!S~JUfbKw#29hOO}h_dQRZ7KwR`<z~L5|!R!h@f;4=Z{kD2z z1LQVhKyT=9yY@kWf<97}VHk|*;ZD9~>YsWME5pt^?VXy*bW3lUl{4%OQZGH+`+uF^ zlUIo|&IJnnP&B{nN<b)A2<5VeGqAb}uIA1Z4qp?T>r&$gJZ;gXoIv)xBrCWY&eL-a zgKFhVFcbv?J^!{cNDMN>V93J&{X&DXdg3tk#MDDKACS~O<Yum!OQAv@)v?_tWNL!L zm~-8A0ojB;%zQBP0UgQ7t0d$@*ngu-4-|4%A>%Z8*YGqUPbDGG0G?(OaL#>98?ln- zFX<V;`1I`xKD_49s_`*b880-e@?Nei*?Qu|K8;mYyo68P2~CTNUxE0o6Th`2ejC7# zp_FhK9`K0Tjh$7{z+m7Y7l|ou=Mcym|5#!CW0>)e;bi<{_&4E~B$qgN@P-yI;S){* z@0ns+CcGDfm(>4;U-Q{ZVhXCs`mL}8W~dCm!rNF{@CydEUq^A*FT$C{OP8fzpF8mZ z8&cfWgT)eE!o4Yi-zUZIBk`lwH++z!<QL+Cl@|_w)zUX92~B?{`e?=5;w5OM(uex4 zSAMXMf7!=B$v&w6**>8E+0q?s)}GfC)bPjAiuo;G>T-SDvDRBEm0dlAKJFYwA9t`H z=~_rtuqma|9XlAu9m+q`+a1b3TRM(Xtt1qxomgjYZLYUCZncV!t$5Tuaf;M!arN$W zIO?wQ62LoM#0v7y$Eugl$ftLDhzsU7ymN*nO7A;oSyH>=m-ron4jf&={UDa&cLMGA zBKy6}KH&QE`-LR5Qtu8WrpY9_a}D)Qe{ee!O8(dm8yRuL_0i*eH`!H@e?qHf;2iNo z*Mf`6zg5b=JCuKSeEBE);GJQP*Mxpubg6R3w}0LGbq5PGt8%7Q`fcJRl$UUCkMyfM z`|3FReaL=6U7rSzI9}KlbtOY1W+4jxRd~}%(<#E6B|LLqmEJ0KCnr1<-pOlejx$IN z<<0_I%oBqu+tk@~Hu}}r!hVsEDC1bwepd*EHu0T;Hx5uu?BDv5q2WE@eN%W_3U8C} zBEo}Br*r{4#DL6N2=72X|9Vw4Ag&Sdl3>BqovO{QJ|*O5gk1I@V+}sXGmS;-t|2qn zKpQ7eKmQ%Q|7w-@U)^~_c&|Npz!ch&tlxJDOsk|t16F)7*i%eDDh+7=-Z>y-><~%= zU<yeX+pAoIW-Z9M?LqiZqTscI7hm?d`e(A<C)Ps*p*j+>`ggM4Yu0;Kr=Cbw>384< z>*<{mXJ*|v3b?z2a>&(#?H2{ma^3A+T2C%Pb@iA?5a710ntI0*@cJnu0^SBub@6CH z<e$L1^%v_E>(pycz`OO5^`KeSz!MGB!5b$>EC`*wU9BMci`2Vm=$x+u?_#3gn_KJ` zx>-%X_?WgwznjbC7id~F^=>5UT?79`f$B|novS@t=m%fjy$!y)JLvIMV|bVTKcko2 zh5ygb*cT}vBf4xjVzdqh690AeLSlf}b`7Qy|8@1Swj$&f)z*{vuha_+M<89>uIal| z$~jq%Xoe$#)$6U4yOe~d;4uvEQvP{itmKF;BAKU%j|w};>i;Xy|96-Ezq`Kw5Aaq1 z53&;_`u|Mq{Vx1}R-WEnV~Zkjaq=|0i+x&JQ2%4wq_!lZJa>`QxTd&7I?8S0@|cjJ zDd;GH!4rl28%n?>Rk_PZ@L}9q65f4k-{KjwW03KIXJvf`N$AUxBwfxy&x!DfhFZGp zCU~vaNL$t1?#A?cldK0HSrqg-c=5e6g=D{HzjHp+CwTWjY4C|O_(B@sgpp4JqyL%t zfQIK$7u4`q&soqa3fdh8cUAu@Q2)D2{qJs4|GR7SzxSjm3`I-R5u^XHw~+?vEgYf$ z@0YXM)yjTbUB4rT-H3{5^g9CgUwQ<d32#IrM*lN?Q2#TtI&uQ_PK>a{DYiJ7;II+w z&X&VQ(A%$Z=``Ga!r^jaNO9>%(5j=8IIC7QqW8ZPdH>4@wZoCKNu19q1_=Gy-EZWA zEu|_Wm)L^-zY*>MxH+w%k8ZEsw@`K}BiHyA_HQ^s|DVw|M<Ck`6j>?wUpa*zIo6-m zc52*#>UASH%3yxk;!R>YK*;?`Oila))D_6dJ+vLNy%^v&I{e4B?v{*fahUMn>P(M7 z|MO?-UJ}zJyf*UvMb+0lisNo7Pqv?KXFYtX*Y@kxlaBz4jA;Fg-Y%-%G@|-nk^0{V zrQV3I|AD$WOEuAGAsPIBTj1@EE~>UPqU*Ov`8PuOH{#1bz@vm4S>bGH{A0w(Kg43f z5m>IqN)YPOLK~s{qnxZu@fO(Z(ZvsL<Rk9DTei4G4B&H3kH8176bA;BgvMqXq5Sh8 zCuPY=>LnLdzw%aIQZk$b?-nnr-ZY{%M3MP_BXD4+M|M37Frrr+rCFia5m^FO)C7&( z9dY`fj5mqZacTwlG?U}756ZFo?CleK`<U$QfTN@}Hp1DbJSZFPggo%)@;K%rx(I!( zhKG{+-*Llhzt`@%#iags4DzpdaR>GK3c%`6K`~A0f5+%uy}0H2jW4ZVOX`2e41Vi? zS9Q7lT2lWzc82iO+j#GU>vxTp;NPSCyJzH|+Bo+_{-rASTJaWlM4?_A>zyVg-A-J0 zK8_l!n5|ijmE`})$~zJftNA+h&L(Ez2v@~Lc;sr}T}aeB48KZramrEcp636pG5_!0 zHDaI4|GS5%hvm9^H_#T=G3wo9y}sH}f=hhfIE)n<U4-svdE=hiziYIA@6rCf=i9%H z;k{w)4fd~zw1)TY$}>wz@MNM7?iv>->Wq9eSr5BfgwGJyQb@dDLh&@LrwE@vuB|tj zfS0BR5+7i$tv8db2YV~JIG{9`SH7Af4HiiQB*A!+=H8OX&dNPXLS9f1-ZT0iwm`cE zv8x#x$gRrP44s`m+5G01_JO-ADeql9Mz1eI*SmV1eR%aYll73d8C_I8?A~LAw?mxa z^-JG-;^S<wf^<yuhM6f}#J#^V`|AH&qyO*T3qtYze;6ffA>lRp|0rX_d&d7~XyD{u zaz)A5uEIALU4*Vzt^Kb_{MXepD-W5JHTA^D<LbdCiSWtr+IsRWSXa;NwY){T${t)3 z`6u<RK>ii+`SRL&BLAe`Wy8-$>(mqZC-pADI~d_(={4}yMgF;ZutcJZjdkjY{F8bC zcZdtP+rN4o>tg@9dR&(m{&ur^zt!=^dJAUtKIPwiBmY!R-p9!8tlnq*!_4Y^@&<P> z%Q-Ic<N7$sKEBt%<xGOZf+p5u*5oY&57X%wm-C5w7tPo{)q!^@Sr5DxT|m}k4Gpd( z>RsR*UBIo+HTA^*C*!zq0&{)=A7!q=Z!iJxJoiR?YPJ^MaIzk=VlUtu1!hHgK7e)6 z|D@k@@Kr?@p45RS`k$+Jll7uH^+f-ZdcAwBSE^GFckO!erFVk$^aREIyz)klyn%nE z@8b?wPu3yqZf{o<*)IEs^m`WeWprVsPQNROe!I6xXZS{H<|8TpI+q9!z7Z>tVqevI zQvP*PPF|P>ylTEmO1Mr$MxzUpb?V9er!tOCX#Wx76}9+1ON^rvi#ob6R;QlWzXGp4 zWIcE~YQ`b<uhcvJ46E$Iu&Z}}U+05f*!v$jA0LwQ@gJYT{}<k;{ujq3@da$BNn`W3 ztM>jkftOkT$`*3}A4;&Ntsnh9EnM?aoBPm<t(A5EZ<eUH-~R_Cjhyiuu7yl{D^<Bq z`xm&l-aaL0)k-`0g2ur{54o{zG+}I`X|x?h{)@+Jqtwzy52N2vtRru1qepAUHtO`h z%*JuHfJ8FUhj8?i9UGpB{^#gIeSGw^?L%-zZ~ppdeZzUvJ1$4N6z5Lj+{3oexP6?@ z2)xSZd6r=RhNHd2h0&2w*bv^yY(_5Z%vAN;0!*U|H){E6BPst*QQO4l&};Z~BPst* z-DbVO@zto>zZ<lFM`{0#`t~pALS1ikkT|2QU_ZnX_`t4x<%6>O+PZM@NpNxT0?$ZP z?XVkSiMV=LJ;e*y+3l(r9arj(5vvEpV8Wv=aCt}!s9TIa!iYdWl(4qUv$|TwiQhSL z{UB%jsj-de#7v(sk`-Ek;4-JU<cSNV9zxcMnWnWf%KYb1NGYKZe6L<6<>(6EQh)Kj z!5upKIX}Np;{<(a7f#ion&d!Az2jNd!yWcD)ZI>u=(ySQ4(o`1(-9&6uWR%vu}2b& z&$}=g?ajHPWsHOSzM(1U?5~Pr)KD(y#~DX=74l0$X4H4o<o~HgF-niHoh_`WUqe0$ z-&}+P@NO1V{%uhHjZ*%NCgtBKEn(Qx;MfBx*%jqH7(%rp*AOc|uUgRPpNjK0LjH@8 zzkAfcyczk26<Qf<;@iJDmz008j2+eZ8;)7ZN*+rI<jlrTv>0o!El{G~Ng4>BG6Qyu zvEDJ}zl=4r9%aN>+OKCgr)%se>ly!FeJfQ)c^Eq8{P{l}{l-qYQI<|(lw*{qV=akM zj-6(|Tt{PVEOBj(IsLEhib~T{c^<x?YW^#UohP^)qU=2Xu}(dSf4F)9q`-OjUuxhb zZKfvpjH2`Ee~EK{OA`MOcukjC4{<BIlE>WDr`ZxdkJdGIi!?y~v&Z*i)J1tJv@W+d zQqr7fe5)$wxHObl6^)~;r}3>=(v<Ed>(PII9`P-~&mGInmU#cw7;^p6W8)rvn2!f` zj)cQtU;3-DfqTXI?K<?EOw>!!-a5a5dR017N$g*t-wDzgcXkPWarRhg&cZwR){8uV zv18B*qVq*pZ){n4jrTu~t#TZYe@bVJqafp`j1^(czMmwot>Iam8{lN3>%;KSvi7m1 zeK7tz7O@XM{)-g_PoRlcgk#XD=^J+I683L6_8V|kzj9>^@=tg?UcY6xeoM4w$EcAp ziy<6)juK=d`gkGOOIwkSg7fiy(uKP1^-18@q#m2nD@(t>w$g~Zj5R<PC?gTl@xh*s z?H$Lq&#_@O`t<t%$oN8q@F_}$52W8ikXO-pc$5rZdA3GL>|d#8PH~=xu3S@3>|d$Z zxIuW%7v#ee`}dzp$48FiEY~mnIn{h6_V17D<B)J;>AQpnKaJ)4agEMxVkas5Tu&V> zr(8aIbe?`6(H`9QapLd%#9zvZzdjUyvnl=(T>P!0_}fJB*L~uz?3{wGV&-zI^Rku@ zt+LPJF9^k7Gm5|Xa|+Vd*5h}1Y^hD5#9s@FznFw?7&T$8ZM<7rAd}qn_QSi*$zJS~ zRl4wlx{hOELH6KdyxE~W&=2bg?1Ddh_FvWaUCi5NLa`+>nyF{LePQA88$s?HH+S8d z8IMa?0cLFFL0Ar^6tAOi<B(i^jMRJ^e`vY5`Qs+@fyYOJ0G-+V-D9SdAHP4E)n_O) zXm3vc3pUZgsc}d`^NaX5Jq~s7h<$*+WtP(8?)*ovi3riDajZ83Pg-QPMFUpU_zYY4 z@!!U9e3q-5yWco;8tXkD&+D@}maqoRc=^_>H^<N1+0SQ`pH=>CQvQuo{*5Q)-#F!; z@z9S$#+s6a?4+JRZr<fe(Kz<Fe*XiX>I7tDJ*UUF5|UvYc7WZx$9J?3BmWfpsy?8M zVAVPgWO`ilUpATlGLEQkdOVr`GX93o;QtH9;Yqc+$~gUh7?GO~#6QAu<Nu??9H;-! zj+gNdt!L%)IO8A2w=@n9uGE9yLdNmlmIN|l^oI6--5)=|d>mme#Q9!F`-uh1b*bzo zd`5+zOR1xnd&j5e=|8QKCGk3s<p$QJtijGf*R~&hm^s?&fi-4J@mh`LMl2b6;B~R} zV#yFofu6JOZ7fyd@6NThySI=aH8P?TI*5fF%dq$xX}|b*xRne6s38~dOdtwipp@@B z{od@75v!yppdOWN2}YrmG?NXNDOq?~R1qlvy(yL(0vS@OsRy!Ywq*}7T$J#M>WO=v zlyWWL5uxNVvdO{QR7|l}EvERwmct&QOTpCkVZYGB-sDSH@)ow5ZF?TU82-}bts9UL z6WHj@Ph<(CLMe@1TTv&L`&9w72~sxpxwU3mU&VhCIpf1?1@a1<KmTl!h`EzXYc z*@*wF%ogbh;FX@BaXS(6PgV{tXSPNmF(<~S40<R{Oa&~GIJ35tpLjUON38eAp2gwY zl|Y_N=2<W;@_{MkC#DuyFwYhOQ_4@wNFUi$YRWy!8N!)*k$X0`mg0|ntOYE^61bsj zVu{$p{#6YHv|8sgo`;xN!N_6tq6GVwYufG*m5G9z8NHeYZ|xkVGFxkG0nNiofr*lo z>|8>d^QFMyd+6i5`VS^{1WI;``Ogzih)Xj6d4d-11T_6{f_?#u-&4O2d%A1F*}vh0 z(f?v8D!RAGp~JU`K}W6bvnBpNSMNCbIIrG?iMNXB8)CXgtloK)1b!m_P})aZBSj~m z{~5YiYCv}S)JU`5dH4^^Or<CE{+BJ@|1$B7ePHkQXA8%j7$Fxfb{4bX+yozd@q8UW z!<OiOQm@hIe|6#-TcZEDdMAmWdJP_^|8JZAzX$aHJxKch9(3>-{eKUP{|{?s{{iE= z58(d`ADH|X&9{AUT)DGBI4m0e&+*mv$yDk!894m__HXzAHmqmIKY$bP2;Wi)h#d0T zwkyXbXTKrC*@sr;b{99R+dYYyX<*dj+&^{dolDe9!Fv>))9j81mlR$=3SA-gm%SOp zI86QvxHEhJ|AyU7A6)0y%(EL(s=InpQ<&d#Uu$`HyFZE5eb&RiS~JQa?zNTF(ExO_ zR4blCEQbF?meiu#tp+~2QmnVfJ7T=+#^2bCcg}c+t+yk_J8`V@Q>!=Ha28m^yPwP| zaFKmM_Nc@c-msUsdcHPnp@4|4t=k7F80{Q2Wwz!1mmk+3P{JL8+=$LSanyLIcNcB1 zinRl90<U=PO*{*ZR<UIhQ!Un7VtvD-pIRODD2XrL)@T&*H$`JxDApq`pK-XvvlUZ3 z)<NR$pvKzBg$CK#4SC8OYx)7LUg`qTslQz59Q-uDo~_Y%uTW3<L*LqQv*pjKdxi*6 z4|@CZ;U_dV_QBbz)m7lywJpk{>ryI?LI)|Maw`20=P+dTVC@6mzw;mV;0H0Kp}iS9 z`^_J>;Ry`krtv+!2#&b6@HYt*mnoKs8qwn6A+At*{T>?sAI?pfdWJ&bL%8$gE#;r$ zM-OvD*Fy-r^uuEbdGPRrtoZODrLEDfAD*($(4v(sApc;rG@fhTLsylDjDPUlMCD<d zl<dge2@1#0@Vpn#)$uY#lK<lBVK<1*K?kn(21JtoBK4XOt%}aUVy-@U5BINFS!NwI z(Q|x`5ydL+LIe$&kxT~<yZAglF;ZLada~XX!gF4d^uvBTgQ;wEi!>c1g>e6Y?vj|9 z+e%aDe`Wfr!iSLjW>2=Wirv}AC564acn&!`SFc?nJYD;d#6JY*)H>@uLcOXuNhJBt zt{x<HbZ*?qk~mX4lKf{^Z-Djg172nZ{od33jVPPM?-Kjv$+c>l&L-=15gsCTHTC9` z^`PBE=MW{UskdzFed>A$y>9FTcqro6vjelXLj8_n1U@MIJeoQ}){_-*&WnCIIW!0w z7>aMjHd8Ef24NWY5%S@CM_s-6d(80{zhgfVWUP^i=6tO{?m;wH`cQcq+iJ1jCzgq^ zERLmPEP-R`9m`nHQ}oXDb_!Vsw%>XZJ+UL!$Z^PGq1r9zVMd+?N=eUWgd6X~dV1uf zUUU=RlI($8TPo}!25w42d)T)Ol&nIDXy@^nk)pP@GQNu}a`F*&KeV-;C)*Z-k!OX2 zoYq^`5*#FDR7s^D!OD=*hL$jw^6asee%I17E$wQ_%IE)#Ps?J!rEM{#uS#&H4M9wA z@C&f6kFQ$#t|i2KFa)e~%qrwTGcHqqr12hV01?3BcULT%Z?NX1xA<y-J2xDZ_-n)c z8``4T^%fr15+u6m*LdU%#W@aZJ$(xi#{rMS(-s0Ni{FVb)zpI#U1<4)JOJC)^Ac~m zdPpC@I8I_5p?Yk>UhNlQw=&0*4k5IpbX`ljgPlXY$krP${r<buvZppgIHWCxwS;tN zf#>oC(qUGg&1ebMtJH(dDy0=I>7E=aAB1I&h?m=kFSJzA7H=Fi@GWcy52ltt#-1mo zk6Jp=l5#}&U7yKWfR+>tO`$y^1I_tIOOrtgKeIGasLy9BLHtZSpO5tZgGb)|2lkV5 zXt91ji>3mFB*wE6M7J$LA(avmo=qvszfvy>%)iiL$G_!E-aZ+1Z-0}?J3=19k9|DV zwn$VWOgt;ssrNkKOTK-f^<LJgR{;;$davva48pOGUOP%Ya`tbq^9KHxNAFm_Q9z|1 zVUB>GeTLrl72XGXYlMTR^Y+M{{|I(I5gyLJnIDG_`SL~K8SKBw%;X=z{^ifya<e`A z_%_G(m%jaxc>9Fc;y(Ikz_!Rk6ks9Pw#|1RpZ#vG2EoO?$uCLuL3%khYn(T2Q^8{l z^;Foze_<vqk|8KBgT^x{xlnTO_%J#TkHC9@A4=e7Q_9-^^NO+XxFb_|!e;?fqs+hQ z&|QKMJZ>Qdt>&F#08P;Kt2nzuz`<kK;-|t+w$O<RaVA(=G<w6wEhy^?t8+sO(>wf_ z6`RP7C)vlmFgrZwNF1IgF!SF0uZ?dn4g~xMN`a6#%YXBSXP0jWQo6$b<M%YY#<AI} zuk0gY<=8vCaXrhYXxnGs+GQ%wZfS4*esACT`cw#YkaN@+hExKv-N~{?3Ggy@9F7JC z`#ZK1yoJ}4t=-!uwz$__<|CAF^$SZ4s7_%%sub5C$m4O24SQ5NoJcigS-Ytrn-DVL zBPSk0WR<W6AR`E3Sjwlt)M#1WPN$53N>FH)(%7`cK5a(sx19_4l8~WYn^Km4*$192 zV)M2o<i<-0dwdNBtIC~)gir{v!<E@C9j?#w|0%4Gb<!TXfWJOUN=d`*TMBPGArwON zTxQF3=#rp=$5@1?!Y6!+wPjFChmeFArG18RJRQigjM5)IAIP(3LxGf@+fll<<_0+4 z=Z$5*U_NnzdhULo#}%xK!C$_8!`|LHffBxxenExiy$A0m`1bu|nf(HLIQNXW&hnq% z@t<&_xvnexBr~XQ(e|@_hPDX&C)?ufw*WBAc>lCx@i(vVuRizohm2HcWm^0*Vc%x? zKjPBR75*f}Vc>g)(<C_CI-({USn72+J2$SF1xJn9((TNG$uuayU-k))zD=U%^dy{s zKIEecnNC1s=1$VZYTRCvY6MTJ5j;sF*w$;2dShI9Y++0{!KFD%69r+IfEc7Fo&3u_ z=^!q=1Yxo>iA%Tk+oOHpXo}zhb684D0<;*Iz(11<CePcq!m&7zlE8&V=DAkI<+9R+ zM?WU75|=AUT#OTtM}Q{j1f<ir?kF1=syKHN2HO~oevjhf`V(rTmRJwQlu$zt0zMfc z2GH=*lb9BNW&qhbt0xiem+>M9A~b-*UP^E(%3Gw(NNG&oCUO4j{^TQ!qxlcw(&%u> zHYhb<Kr`fbB#Rld<BiVI9WBPUGpk~Qt)77u2j)(|&@mWn#ipAVyoVlU-^PJM&-n=F zlzkf;sIdz(cHepC+>C2c&q3!Il%HL_IH@5vC_CU(lz!EGjU9AdE~NlfYRtnZ;Sv>o zL6E=30BrFM31|F_IEp7+r%gRDN3ItR?m7O0@l$O)#+PN$ICJnc)Ck2|R>dU37ky@z zoWy~~2t&Xxe*3qR=#&4s7Fp4o(&Z<gAw?&@3}@K}rLX+Ia>@0wYcc6A0SumehqRsi zi?wvGnEa90D<=Pe`Gg<f{c8%cC(E;+ceAF1ztS&C*x&JM=*l)>&1B*F^VUq(I05Of z&l)En<YbslV=Wk0Q<hFZlv0%}C84=&F{|<~Yl0wtcnWKwm^u=mH#?Wb-v4UXLd@+w zaJ_&ne*WC@+#=Y@?X%8(SE{>ukVtRq#qN&SRT8g&*!2=8#>A^4UJLR1KoGsg$$_;{ z<E*LYz^=phSy03Bb4-^c-`lqsjN@lsbY#XR=0DBm>_hhq+-cv^NSAup)oOSgtHN>Y zUB_$LtZS<)$^;^9ZwPg}79)<cvryV1pa#y7OEc1~zdfw|hR1Slb*?mTZBeIj|AyYe zEF6f*>lB;w*_pd#!sNa`Y)koU?v5?tS;myie)M-fi!kq4Lje-F7jh^_;g`<3;9B-K zgn9};f3uo`<2uM3=hk#wGEjD<SYpOuj_e0Vm%%kxFXpD0!(yo%%fFa&>hWpJiQu(* zeC4<piE=$y3;zz`bAN7Dk^YT!XMZu5*isgcZ7D#>wW#Hd2ri$PH*AU9musO;nCy3h z!M{(2-a}n2qYCK!xAXxa$VTk)H#zzypZ>UvKws30M6`gf)7j6qUMl+=L%&%_y>u2g zLHjc28#uxQm9snqLcPTDAD)3X)CkT(^qJog$_S%H=Cl7i%<>uPIr)eF?B&x9T~m0I z&caFV^)_YnKT5bM<Q>_5rw|l1a;;2QOyM@XCL_A}58U~^dfa>Jh#S%G{Pf2Z94hIl zqscy~|Eb2q%ZU^4kPH>|!r2;_-lp{6+3&4{M=faTbP`@W;2C{#ssn8S57;B6-s&n- zaE;4b>VHPBn-cv`=FJ_umJ#)>!0F!mN-;REBRWqEE)oNzOZZd^v=2D!1p_2EOK%8d zNa-r;ao3pAAn=q60*h1;E!W{PLF&SbBh=6!$nX8c1y*l*Dj5Ws(jdqbgCHhlZps8f zsK-tX3kIgQYTEbR{P{E6tBKK5JXXeE_V@ej4Q<j>qu$6<m8pk(h9u~43Ygju*c75` zh6XYs7b+tS{F&~9eqZc;tYe$f-gx!F)C?g{CwrTf-s;lo27@%cdTf14Q_X(o)dy2c zY@1AinSx21o?;Tr6y{v8U)33e6!ot@fV2pwm;`Nk4ZTT8lVGM?5==O?iMM9ePHkzu zZ7sPZ!206=M-+Q;tUe&^(^J1IU4G{{{@}Bx9$kP{S#f@rpgl0~DSiVsPO%pnsD&I~ z+VVTXD-6*I*WEx6GwQ`&Ve7RmDF*WC52<(kE9=c+|ELO2{Vvyyx_bSr2mRT=YyNar z;T<IUy$=1V*b807_B-Vc!DWBv(T}O`9QmK#$iaWm|I(+CXc$iYAa$KY=gjycy2e0X z?*m|Z6DD!`jwVt5E~zhq={3w-)C<krVld4;h`;PproK!!qwO?Oq`kF2P5sYs#5DCk zBVVRTKgc1pp!}OQ@~{4J5Z5n{M)ls)ex3g>`;<q2r%w|~tJiO;G7U*+(=(?j|7^b^ z|ImW=?{p_y{O^7trJ~+p&}E>LE#iJ9fy?0sJ+|08sQ5{$9_YfW|E4doZQ$Y87*13E zfiA!lv5E9F?B8(O$iD|HIr(Q+01w-UES^RfCY<hLTT>4bDL#r*Ew8Q?iIt|tPU|HI zPj3^e4Er7OumUc$gpItKHuf(+fIAKKEj<l;CZ<(5ea~X=_WdL`UBQ|z_9CzpkT=rP z6UrqMgh!b;4eWg`!O;}q5_1R+<E>0n!c9+dyjdMD^gnz2YI@r8ki&q|XL^?PxPMIN z{uh3i0I%2!Tg~EkWkd0k)EAl6i)I|>WBpI-ttM8_MR-4=UW9|4o~ZTK6ZJ0SS+A>3 zy{%+DQlnRWH`C7lmwoz}^!tr;d6J~x?=o_cm~xOq#&I6A74@qBW%{||_nh!v5}pY= z=`pwIU7=q%T|vpNo>wf<Co_#y2BGsCExpyZ@A!;5()6A!p^ts`foCxf38u+)bRODB z)C;%2aE|JKPpSV+Q~#Sz>VMPUv^S^!h11{l*<V^R^3Py}<355PbTb*pzbM&J{--4< ziMHNMN=kxrlH1Q>wxVA3EzRg9sDCsA=b6L6c?QWh9=Fdx{t0Br4cqUGvwy=G>VJlQ zGwT1Fq5sc5qyNwF_zd&|Y1^u$)3%hV%urs<Aha6J82yjZVg~ZhJJfkWqX2;H?*=`f zY1G^7W?@G6qd(4aMCS+@t4v3P-p-4(tvjpclTf|t@tV2p`0o$;|7Pg_n@RfrW{mtJ zugze$w_G;^+o0?nuu9_G4ZSWp3lD+ioS6abV}O0!W*>t|oZ)z<7XsK*5}FH^W~l$E z?#+@<mu}2VbQV^O^r8CSAJqS5F!uC}um1u2aZ;RIH)HfaQ-b~{&yYqUC9Zf|&&WSh zZ&IHb`DdO%{z*N^KbC+!<s@giE_Zg_C(de7&FCdC*y4fnBHJ!_bOEMI+Q%|VW>w4> z{m)<k{ZBA3`k#4*eMX+C{x?JY&$e~?UtRoKpF<X(Ra<;UF9H06sn0WyiC^*(z?mo7 z+i%*3k$(o4r~38}EtRzd{ZCd8`W5_MXz8Wa6Zr?~A_`CH0+-h;y&|n#(pfo$UwQ`N z`EZ8v&+N%Flz$w#j5le&wZhhj&VE!L(o0bP;MLDF2ZV>@2VGl${8_R3Vj%-7O2SU= zc{3{iW+?wG52^f{G4hW);tb`Voe#=C55MF(Y5^sqvwIG|Sr@s@Vyq2avxv>5XAwvA z@SCOmYx<pqeoDxx%4{?0!ES5}XI1~3rT%9)7T=99sd{)z`DdirEajiUZ<g}!m-v}W z&d$DZ_{A46mRl2R^(bU^bavO(o7MP7nemTV>VLCF|I<BhmiDh5hqHexvuAW1XZ39_ zOVm(iAqlOHIeVVZNaxuLDA{pbv?bIFY(12q39<!BmjT)E)hy-TtdW0?uPU=Q`Rp3u zQT`denx*_R_Uf$B|I}_Y-qqP#(r?{WcK8yhfsh|CA!Lnzlo|h+rPeo#DfMTS`k$r7 zT?-jFQxmka>h!;G7V<^vjcRF(B|{C$KT8eDKa>FFfzsfil*$GxP{WtDX-J>wtXkV~ zvS3-Rei7~F5N(pPPjqZKC;7{~`ek;GW5Z!Xe{A!L>4M_7XrG}4qQ2?bCAM(3K{zY& z57@6-oZae9uAWB7zvyh8<kGTSeIPhrnL|BTKyE(t62LOAKAqhm22m2{$F>DH!pJ|v ze?}9eMKEjRpP{&ue@Q<0n!bcX_hTm@i=(qlYOPAtEWfa{clEFai)V{<>dDbxsdwDW z(Xx)?ozk91e`m2hrDyk&<Jec)e~^-3Di;Yk$d`%ff<SKm@1#QhlEBm)-aeaC3|#yp zTmDWA;Pp$-B1zkyeab(}+0_4HNrRH%Kf&M_b=$Mkph4AVot`x$>tW>;&xQ_zoa%qi zsQ=}t|K*bUUrzPEoRNRrw{nz!Mmpwb&E}5tnbH5;!H})oN!?R!Y6){L^m7T>*=O+o zg}F8vWnDgKeoN}o-mmgZJQIyaXwZzEGdeq3r=IBTt{%05vp577n3bGU`}Y~`-yH4V zoNxc8D!ChccA1#c|7Rpz&e*>|*vf+(<zLRoKkRgN97dMpApc^kmtGBj-kOJqGi-Lj zWzccXvq9oQtuKc|aLN(Dh58?2*67XXfAj?AjQoQ?yOKk|!(4PJluY(^2&*wVtCoLG zFF|-l|3;49lpOqjes7R}(i`<ZJEBKgqW%~2Bsjt!TSFHkX%`h6x>AIN+(VEsmC zuh*G3x%$A>Yhb<0b?Pl8`b~Xgy^BiIg3`3WQLb^6#pEd0MNWn}>VNTwP%<O>>pl+Z zHR9e7Lhb|xL)QQ$z5w}IWTWASIgNJqqqDsZgZNNRd`vYyo)bq=;+R|<6^vtsaXclC zPsb4*98)zh7C)&vj@iWN+HssNj_uTo-o!D(INsBNYe@}XZPkmK$5FvNKDQ?PmzO9? z7IcYYHcdT9eg6L8!<?g)M#Gu#?Ak&XMZN#J3!j*Yz(|Ps%v&aP0#U&{YzV9bmO5=c z6Zv*gJQvZ{bY62zU*dUrM3N&QluGB%xZZvdE0@)shvc#;ulaKlnM&s`^4U>h5a=^# zMg~*pK9=j!<>&J0-%sgoM4-poVf&TO_Bh^%?bYXPj4f{9bD68bYHlmH9!%$g+}h^U zav)*FvFDuu(UyPqJZID>-*Y$1ht2pak?(x|>>YiU(UOUVmv)M|Nr7Kl--Mu3c$w!2 zhaADb`Lp%p^P*DGWmrAGqV;5Vk@ay1mVb2iv>RKj?>_HKtfQtz);s0u<<<UuPWv}c z`!_$BSfP1JLVgA!%)=(JJ7S*l&+LtP%0DBU@}mEt-iW?c{V%WjU*73|GFu|KWE>69 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 literal 0 HcmV?d00001 diff --git a/<mdl.comp>/compde.mud.32 b/<mdl.comp>/compde.mud.32 new file mode 100644 index 0000000..17ca1b5 --- /dev/null +++ b/<mdl.comp>/compde.mud.32 @@ -0,0 +1,1205 @@ + +<PACKAGE "COMPDEC"> + +<ENTRY FCNS + DEATH + TMPS + IDT + STYPES + PLUSINF + MINUSINF + IPUT + TEMPV + DEBUGSW + INSTRUCTION + INTH + FCN + IRSUBR + STACK + SNODES + PSTACK + ANY-AC + DUMMY-MAPF + INCONSISTENCY + SEGS + SPEC + CODVEC + QUOTE-CODE + RETURN-CODE + IPUT-CODE + SEG-CODE + PREDV + ACAGE + NUMACS + SYM-SLOT + SAVED-STK + PARENT + TYPE-INFO + PROG-VARS + CURRENT-TYPE + NODE1 + PUTR-CODE + ISUBR-CODE + EOF-CODE + IREMAS-CODE + GVAL-CODE + SPARE4-CODE + ACRESIDUE + AC-F + LOOPVARS-LENGTH + ADDVAR + FSET-CODE + OFFPTR + CSYMT-SLOT + CPOTLV-SLOT + PROG-CODE + COMP-TYPES + INACS-SLOT + SAVED-STACK-STATE + NODE-NAME + AGND + REQARGS + LOOP-VARS + DECL-SYM + PUT-CODE + FLVAL-CODE + SETG-CODE + BACK-CODE + PUT-SAME-CODE + AC-E + SS-POTENT-SLOT + NUM-SYM-SLOT + RSUBR-DECLS + NODEF + AND-CODE + MT-CODE + BITS-CODE + PUTBITS-CODE + COPY-LIST-CODE + SPARE1-CODE + ACLINK + LINKED + SS-SYM-SLOT + ATAG + ASSUM + RETURN-STATES + PURE-SYM + NUM-SYM + KID + GNAME-SYM + CHTYPE-CODE + SAVED-NUM-SYM-SLOT + NODE + SYMTAB + INACS + USAGE-SYM + GDECL-SYM + MAP-CODE + MARGS-CODE + DATVAL + ALLACS + AC-D + SAVED-AC-STATE + NODE-SUBR + LIVE-VARS + SPEC-SYM + AS-NXT-CODE + SUBSTRUC-CODE + BIT-TEST-CODE + SPARE3-CODE + TMPAC + NO-RESIDUE + NOT-PREF + P-N-STO-RES + P-N-NO-STO-RES + FRMNO + NOT-CODE + TEST-CODE + MIN-MAX-CODE + READ-EOF2-CODE + TAG-CODE + LENGTH-CONTROL-STATE + SAVED-NTSLOTS + KIDS + PREDIC + MAKE:TAG + NODEPR + NODEFM + GNEXT-SYM + FIX-CODE + MFCN-CODE + IRSUBR-CODE + CASE-CODE + SCL + ACSYM + ACNUM + AC-C + P-N-CLEAN + CINACS-SLOT + NODE-TYPE + USLOTS + DEAD-VARS + DEATH-LIST + COMPOSIT-TYPE + PROG-AC + PRED + COPY-CODE + LENGTH?-CODE + AC + LINACS-SLOT + TMPLS + INIT-DECL-TYPE + NODECOND + FUNCTION-CODE + AGAIN-CODE + 0-TST-CODE + GETBITS-CODE + MAPRET-STOP-CODE + LSH-CODE + SYMBOL + SAVED-STATE + ACO + LENGTH-PROG-VARS + CSTORED-SLOT + NODEB + SET-CODE + ROT-CODE + AC-B + REGS + PROG-SLOT + SAVED-BSTB + BINDING-STRUCTURE + CDST + VSPCD + NAME-SYM + INIT-SYM + EQ-CODE + ALL-REST-CODE + DISPATCH + TMPNO + AC1SYM + REACS + LSYM-SLOT + DST + RTAG + ACCUM-TYPE + DATUM + ARGNUM-SYM + ADDR-SYM + STORED + USED-AT-ALL + POTLV + NAME + ARGNUM + FGVAL-CODE + ID-CODE + FORM-F-CODE + INFO-CODE + TEMP + STORED-RESIDUE + SAVED-POTLV-SLOT + SAVED-CODE:PTR + CLAUSES + TRG + VARTBL + LVARTBL + SUBR-CODE + LNTH-CODE + STACKFORM-CODE + ASSIGNED?-CODE + GET2-CODE + AS-IT-IND-VAL-CODE + COMMON + DATTYP + AC-A + ACS + RET-AGAIN-ONLY + SEGMENT-CODE + FSETG-CODE + ISTRUC-CODE + MFIRST-CODE + ACPREF + SS-STORED-SLOT + STORED-SLOT + STK-B + AGAIN-STATES + CODE-SYM + BST + RSUBR-CODE + 1?-CODE + REST-CODE + ABS-CODE + MPSBR-CODE + UNWIND-CODE + PRINT-CODE + OBLIST?-CODE + ADDRSYM + AC-H + LAST-AC-1 + NOT-STORED-RESIDUE + P-N-LINKED + SAVED-RET-FLAG + SAVED-FRMS + STACKS + ASS? + BRANCH-CODE + LVAL-CODE + OR-CODE + ISTRUC2-CODE + READ-EOF-CODE + MAPLEAVE-CODE + MEMQ-CODE + REP-STATE + SS-DAT-SLOT + SAVED-PROG-AC-SLOT + LENGTH-CSTATE + RESULT-TYPE + SIDE-EFFECTS + SSLOTS + PRE-ALLOC + NEXT-SYM + FORM-CODE + TY?-CODE + FLOAT-CODE + GET-CODE + SPECS-START + BTP-B + SPCS-X + RES-TYP + GO-CODE + BITL-CODE + TOP-CODE + SPARE2-CODE + AC-G + LAST-AC + ATIME + ACTIVATED + TOTARGS + VTB + RQRG + COND-CODE + ARITH-CODE + NTH-CODE + MOD-CODE + ACPROT + IND + ALL + NOTE + WARNING + PRIM-CODE + DONT-CARE + FLUSHED + NO-RETURN + NO-DATUM + MESSAGE + GROUP-NAME + FUZZ + COMMON-TYPE + COMMON-SYMTAB + COMMON-ITEM + COMMON-PRIMTYPE + COMMON-DATUM + COMMON-SYMT + TRANSFORM + TRANS + N0? + POPWR2 + DEALLOCATE + TOKEN + ERRS + WARNS + NOTES + DEBUG-COMPILE + REASONABLE + CAREFUL + PRECOMPILED + HAIRY-ANALYSIS + SRC-FLG + BIN-FLG + GLOSP + ANALY-OK + VERBOSE + COMPILER + IND + ADDRESS:C + FUNNY-STACK> + + +<SETG PLUSINF <CHTYPE <MIN> FIX>> + +<SETG MINUSINF <CHTYPE <MAX> FIX>> + +"Type specification for NODE." + +<NEWTYPE NODE + VECTOR + '<VECTOR FIX + ANY + ANY + ANY + <LIST [REST NODE]> + FIX + <OR FALSE ATOM> + [REST + LIST + ANY + ANY + LIST + FIX + SYMTAB + FIX + FIX + <OR FALSE ATOM> + ATOM + ANY + LIST + LIST + ANY + ANY + ANY + ANY + ANY + ANY + ANY + <PRIMTYPE LIST> + FIX + FIX + LIST + LIST + LIST + LIST + LIST]>> + +"Offsets into pass 1 structure entities and functions to create same." + +<SETG NODE-TYPE <OFFSET 1 NODE>> + +;"Code specifying the node type." + +<SETG PARENT <OFFSET 2 NODE>> + +;"Pointer to parent node." + +<SETG RESULT-TYPE <OFFSET 3 NODE>> + +;"Type expression for result returned by code + generated by this node." + +<SETG NODE-NAME <OFFSET 4 NODE>> + +;"Usually name of SUBR associated with this node." + +<SETG KIDS <OFFSET 5 NODE>> + +;"List of sub-nodes for this node." + +<SETG STACKS <OFFSET 6 NODE>> + +;"Amount of stack needed by this node." + +<SETG SEGS <OFFSET 7 NODE>> + +;"Predicate: any segments among kids?" + +<SETG TYPE-INFO <OFFSET 8 NODE>> + +;"Points to transient type info for this node." + +<SETG SIDE-EFFECTS <OFFSET 9 NODE>> + +;"General info about side effects (format not yet firm.)" + +<SETG RSUBR-DECLS <OFFSET 10 NODE>> + +;"Function only: final rsubr decls." + +<SETG BINDING-STRUCTURE <OFFSET 11 NODE>> + +;"Partially compiled arg list." + +<SETG SPECS-START <OFFSET 12 NODE>> + +;"Offset to 1st special." + +<SETG SYMTAB <OFFSET 13 NODE>> + +;"Pointer to local symbol table." + +<SETG SSLOTS <OFFSET 14 NODE>> + +;"Number of specials." + +<SETG USLOTS <OFFSET 15 NODE>> + +;"Number of unspecials." + +<SETG ACTIVATED <OFFSET 16 NODE>> + +;"Predicate: any named activation?" + +<SETG TMPLS <OFFSET 17 NODE>> + +;"Offset to unamed temps." + +<SETG PRE-ALLOC <OFFSET 18 NODE>> + +;"Variable slots allocated in advance." + +<SETG STK-B <OFFSET 19 NODE>> + +;"Base of stack at entry." + +<SETG BTP-B <OFFSET 20 NODE>> + +;"Base of stack after bindings." + +<SETG SPCS-X <OFFSET 21 NODE>> + +;"Predicate: any specials bound?" + +<SETG DST <OFFSET 22 NODE>> + +;"Destination spec for value of node." + +<SETG CDST <OFFSET 23 NODE>> + +;"Current destination used." + +<SETG ATAG <OFFSET 24 NODE>> + +;"Label for local againing." + +<SETG RTAG <OFFSET 25 NODE>> + +;"Label for local Returning." + +<SETG ASSUM <OFFSET 26 NODE>> + +;"Node type assumptions." + +<SETG AGND <OFFSET 27 NODE>> + +;"Predicate: Again possible?" + +<SETG ACS <OFFSET 28 NODE>> + +;"Predicate: AC call possible? (if not false + ac structure)" + +<SETG TOTARGS <OFFSET 29 NODE>> + +;"Total number of args (including optional)." + +<SETG REQARGS <OFFSET 30 NODE>> + +;"Required arguemnts." + +<SETG LOOP-VARS <OFFSET 31 NODE>> + +"Variables kept in acs thru loop." + +<SETG AGAIN-STATES <OFFSET 32 NODE>> + +"States at agains" + +<SETG RETURN-STATES <OFFSET 33 NODE>> + +"States at repeats." + +<SETG PROG-VARS <OFFSET 34 NODE>> + +"Vars handled in this prog/repeat." + +;"Information used for merging states with prog-nodes" + +<SETG CLAUSES <OFFSET <INDEX ,KIDS> NODE>> + +;"For COND clauses." + +<SETG NODE-SUBR <OFFSET <INDEX ,RSUBR-DECLS> NODE>> + +;"For many nodes, the SUBR (not its name)." + +<SETG PREDIC <OFFSET <INDEX ,NODE-NAME> NODE>> + +;"For cond clause nodes, the predicate." + +<SETG ACCUM-TYPE <OFFSET <INDEX ,DST> NODE>> + +;"Accumulated type from all returns etc." + +<SETG DEAD-VARS <OFFSET <INDEX ,CDST> NODE>> + +<SETG LIVE-VARS <OFFSET <INDEX ,TYPE-INFO> NODE>> + +<SETG VSPCD <OFFSET <INDEX ,ATAG> NODE>> + +<SETG INIT-DECL-TYPE <OFFSET <INDEX ,RTAG> NODE>> + +" Definitions associated with compiler symbol tables." + +"Offsets for variable description blocks" + +<NEWTYPE SYMTAB + VECTOR + '<VECTOR <PRIMTYPE VECTOR> + ATOM + <OR FALSE ATOM> + FIX + <OR ATOM FIX> + <OR FALSE ATOM> + LIST + ANY + ANY + FIX + <OR FALSE NODE> + <OR FALSE 'T> + <OR FALSE DATUM LIST> + <OR FALSE 'T> + <OR FALSE 'T> + LIST + ANY + ANY + <OR FALSE FIX>>> + +<SETG NEXT-SYM <OFFSET 1 SYMTAB>> + +;"Pointer to next symbol table entry." + +<SETG NAME-SYM <OFFSET 2 SYMTAB>> + +;"Name of variable." + +<SETG SPEC-SYM <OFFSET 3 SYMTAB>> + +;"Predicate: special?" + +<SETG CODE-SYM <OFFSET 4 SYMTAB>> + +;"Code specifying whether AUX, OPTIONAL etc." + +<SETG ARGNUM-SYM <OFFSET 5 SYMTAB>> + +;"If an argument, which one." + +<SETG PURE-SYM <OFFSET 6 SYMTAB>> + +;"Predicate: unchanged in function?" + +<SETG DECL-SYM <OFFSET 7 SYMTAB>> + +;"Decl for this variable." + +<SETG ADDR-SYM <OFFSET 8 SYMTAB>> + +;"Where do I live?" + +<SETG INIT-SYM <OFFSET 9 SYMTAB>> + +;"Predicate: initial value? if so what." + +<SETG FRMNO <OFFSET 10 SYMTAB>> + +;"ID of my frame." + +<SETG RET-AGAIN-ONLY <OFFSET 11 SYMTAB>> + +;"Predicate: used only in AGAIN/RETURN?" + +<SETG ASS? <OFFSET 12 SYMTAB>> + +;"Predicate: used in ASSIGNED?" + +<SETG INACS <OFFSET 13 SYMTAB>> + +;"Predicate: currently in some AC?" + +<SETG STORED <OFFSET 14 SYMTAB>> + +;"Predicate: stored in slot?" + +<SETG USED-AT-ALL <OFFSET 15 SYMTAB>> + +;"Predicate: symbolused at all." + +<SETG DEATH-LIST <OFFSET 16 SYMTAB>> + +;"List of info associated with life time." + +<SETG CURRENT-TYPE <OFFSET 17 SYMTAB>> + +;"Current decl determined by analysis" + +<SETG COMPOSIT-TYPE <OFFSET 18 SYMTAB>> + +<SETG USAGE-SYM <OFFSET 19 SYMTAB>> + +"How a variable is used in a loop." + +<SETG PROG-AC <OFFSET <INDEX ,CURRENT-TYPE> SYMTAB>> + +<SETG NUM-SYM <OFFSET <INDEX ,COMPOSIT-TYPE> SYMTAB>> + +<SETG POTLV <OFFSET <INDEX ,USED-AT-ALL> SYMTAB>> + + +"Slot used to store information for variables in loops." + +;"Type as figured out by all uses of symbol." + +<DEFINE NODE1 (TYP PAR RES-TYP NAME KID) + <CHTYPE [.TYP .PAR .RES-TYP .NAME .KID 0 <>] NODE>> + +"Create a function node with all its hair." + +<DEFINE NODEF (TYP PAR RES-TYP NAME KID RSD BST HAT VTB ACS? TRG RQRG) + <CHTYPE [.TYP .PAR .RES-TYP .NAME .KID 0 <> () <> .RSD .BST 0 .VTB 0 + 0 <> <MAKE:TAG "FRM"> <> () () <> <> <> <> .RES-TYP <> <> + .ACS? .TRG .RQRG] NODE>> + +"Create a PROG/REPEAT node with nearly as much hair." + +<DEFINE NODEPR (TYP PAR RES-TYP NAME KID VL BST HAT VTB) + <CHTYPE [.TYP + .PAR + .RES-TYP + .NAME + .KID + 0 + <> + () + <> + .VL + .BST + 0 + .VTB + 0 + 0 + <> + <MAKE:TAG "FRM"> + <> + () + () + <> + <> + <> + <> + .RES-TYP + <> + <> + <> + 0 + 0 + () + () + () + ()] + NODE>> + +"Create a COND node." + +<DEFINE NODECOND (TYP PAR RES-TYP NAME CLAU) + <CHTYPE [.TYP .PAR .RES-TYP .NAME .CLAU 0 <> () <>] NODE>> + +"Create a node for a COND clause." + +<DEFINE NODEB (TYP PAR RES-TYP PRED CLAU) + <CHTYPE [.TYP .PAR .RES-TYP .PRED .CLAU 0 <> () <>] NODE>> + +"Create a node for a SUBR call etc." + +<DEFINE NODEFM (TYP PAR RES-TYP NAME KID SUB) + <CHTYPE [.TYP .PAR .RES-TYP .NAME .KID 0 <> () <> .SUB] NODE>> + + +<DEFINE ADDVAR (NAM SPEC CODE ARGNUM PURE DCL ADDR INIT) + <SET VARTBL <CHTYPE [.VARTBL .NAM .SPEC .CODE .ARGNUM .PURE .DCL .ADDR .INIT 0 <> + <> <> T <> () <> ANY 0] SYMTAB>>> + + +"Some specialized decl stuff." + +<SETG LVARTBL + <PROG ((VARTBL [])) + #DECL ((VARTBL) <SPECIAL ANY>) + <ADDVAR OBLIST T -1 0 T '(<OR LIST OBLIST>) <> <>> + <ADDVAR OUTCHAN T -1 0 T '(CHANNEL) <> <>> + <ADDVAR INCHAN T -1 0 T '(CHANNEL) <> <>> + .VARTBL>> + +<PUT CHANNEL DECL '<CHANNEL FIX [11 ANY] [5 FIX]>> + +<PUT STRING DECL '<STRING [REST CHARACTER]>> + +<PUT OBLIST DECL '<UVECTOR [REST <LIST [REST <OR ATOM LINK>]>]>> + +"Codes for the node types in the tree built by pass1 and modified by +other passes." + +"Give symbolic codes arbitrary increasing values." + +<PROG ((N 1)) + <SETG CODVEC + <MAPF ,UVECTOR + <FUNCTION (ATM) <SETG .ATM .N> <SET N <+ .N 1>> .ATM> + ![FUNCTION-CODE + QUOTE-CODE + SEGMENT-CODE + FORM-CODE + PROG-CODE + SUBR-CODE + COND-CODE + BRANCH-CODE + RSUBR-CODE + LVAL-CODE + SET-CODE + OR-CODE + AND-CODE + RETURN-CODE + COPY-CODE + GO-CODE + AGAIN-CODE + ARITH-CODE + 0-TST-CODE + NOT-CODE + 1?-CODE + TEST-CODE + EQ-CODE + TY?-CODE + LNTH-CODE + MT-CODE + NTH-CODE + REST-CODE + PUT-CODE + PUTR-CODE + FLVAL-CODE + FSET-CODE + FGVAL-CODE + FSETG-CODE + MIN-MAX-CODE + STACKFORM-CODE + CHTYPE-CODE + ABS-CODE + FIX-CODE + FLOAT-CODE + MOD-CODE + ID-CODE + ASSIGNED?-CODE + ISTRUC-CODE + ISTRUC2-CODE + BITS-CODE + BITL-CODE + GETBITS-CODE + PUTBITS-CODE + MAP-CODE + MFCN-CODE + ISUBR-CODE + READ-EOF-CODE + READ-EOF2-CODE + EOF-CODE + GET-CODE + GET2-CODE + IPUT-CODE + IREMAS-CODE + IRSUBR-CODE + MARGS-CODE + MPSBR-CODE + MAPLEAVE-CODE + MAPRET-STOP-CODE + UNWIND-CODE + GVAL-CODE + SETG-CODE + SEG-CODE + LENGTH?-CODE + TAG-CODE + MFIRST-CODE + PRINT-CODE + MEMQ-CODE + FORM-F-CODE + INFO-CODE + OBLIST?-CODE + AS-NXT-CODE + AS-IT-IND-VAL-CODE + ALL-REST-CODE + CASE-CODE + SUBSTRUC-CODE + BACK-CODE + TOP-CODE + COPY-LIST-CODE + PUT-SAME-CODE + ROT-CODE + LSH-CODE + BIT-TEST-CODE + SPARE1-CODE + SPARE2-CODE + SPARE3-CODE + SPARE4-CODE!]>> + <SETG COMP-TYPES .N>> + + +<USE "NPRINT"> + +"Build a dispatch table based on node types." + +<DEFINE DISPATCH (DEFAULT "TUPLE" PAIRS + "AUX" (TT <IVECTOR ,COMP-TYPES '.DEFAULT>)) + #DECL ((PAIRS) <TUPLE [REST <LIST FIX ANY>]> + (TT) VECTOR) + <REPEAT ((PAIR '(1 1))) #DECL ((PAIR) <LIST FIX ANY>) + <COND (<EMPTY? .PAIRS><RETURN .TT>)> + <PUT .TT <1 <SET PAIR <1 .PAIRS>>> <2 .PAIR>> + <SET PAIRS <REST .PAIRS>>>> + +<SETG PREDV <IUVECTOR ,COMP-TYPES 0>> + +<MAPF <> + <FUNCTION (N) <PUT ,PREDV .N 1>> + ![,0-TST-CODE + ,1?-CODE + ,NOT-CODE + ,TEST-CODE + ,EQ-CODE + ,TY?-CODE + ,MT-CODE + ,OR-CODE + ,AND-CODE + ,ASSIGNED?-CODE + ,ISUBR-CODE + ,NTH-CODE + ,MEMQ-CODE + ,LENGTH?-CODE + ,OBLIST?-CODE + ,AS-NXT-CODE + ,COND-CODE + ,BIT-TEST-CODE!]> + +"Predicate: does this type have special predicate code?" + +<PUT REP-STATE + DECL + '<LIST [5 <LIST [REST SYMTAB DATUM <OR FALSE ATOM> <OR ATOM FALSE>]>]>> + +<PUT SYMBOL DECL '<OR SYMTAB TEMP COMMON>> + +<NEWTYPE TEMP VECTOR '<VECTOR SCL <OR FALSE DATUM>>> + +<NEWTYPE SAVED-STATE + LIST + '<LIST [REST + <LIST AC + <OR FALSE <LIST [REST SYMBOL]>> + [REST <LIST SYMBOL [3 ANY]>]>]>> + +<SETG TMPNO <OFFSET 1 TEMP>> + +<SETG TMPAC <OFFSET 2 TEMP>> + +<SETG DATTYP <OFFSET 1 DATUM>> + +<SETG DATVAL <OFFSET 2 DATUM>> + +<SETG ADDRSYM <OFFSET 1 AC>> + +<SETG ACSYM <OFFSET 2 AC>> + +<SETG ACLINK <OFFSET 3 AC>> + +<SETG ACAGE <OFFSET 4 AC>> + +<SETG ACNUM <OFFSET 5 AC>> + +<SETG ACPROT <OFFSET 6 AC>> + +<SETG AC1SYM <OFFSET 7 AC>> + +<SETG ACRESIDUE <OFFSET 8 AC>> + +<SETG ACPREF <OFFSET 9 AC>> + +<NEWTYPE AC + VECTOR + '<<PRIMTYPE VECTOR> <PRIMTYPE WORD> + <PRIMTYPE WORD> + <OR <LIST [REST DATUM]> FALSE> + FIX + FIX + <OR FALSE ATOM> + <PRIMTYPE WORD> + <OR FALSE LIST> + <OR FALSE ATOM>>> + +<NEWTYPE DATUM + LIST + '<<PRIMTYPE LIST> <OR ATOM <PRIMTYPE LIST> <PRIMTYPE VECTOR>> + <OR ATOM <PRIMTYPE LIST> <PRIMTYPE VECTOR>>>> + +<NEWTYPE OFFPTR LIST '<<PRIMTYPE LIST> FIX DATUM ATOM>> + +<NEWTYPE TEMPV LIST> + +<NEWTYPE IRSUBR LIST> + +"A TOKEN GIVES INFORMATION TO CUP" + +<NEWTYPE TOKEN VECTOR '<<PRIMTYPE VECTOR> FIX>> + +<NEWTYPE ADDRESS:PAIR LIST> + +<NEWTYPE ADDRESS:C LIST> + +<SETG ALLACS + <MAPF ,UVECTOR + <FUNCTION (N1 N2 N N+1 NAME "AUX" THISAC) + <SETG .NAME <SET THISAC <CHTYPE [.N1 .N2 <> 0 .N <> .N+1 <> <>] AC>>> + <EVAL <FORM GDECL (.NAME) AC>> .THISAC> + ![`A `B `C `D `E `F `TVP `SP!] + ![`A* `B* `C* `D* `E* `F* `TVP* `SP*!] + ![1 2 3 4 5 6 7 8!] + ![`B* `C* `D* `E* `F* `TVP* `SP* `AB*!] + ![AC-A AC-B AC-C AC-D AC-E AC-F AC-G AC-H!]>> + +<SETG NUMACS <LENGTH ,ALLACS>> + +<SETG LAST-AC ,AC-H> + +<SETG LAST-AC-1 ,AC-G> + +<DEFINE REACS () + <MAPF <> + <FUNCTION (AC) + #DECL ((AC) AC) + <PUT .AC ,ACLINK <>> + <PUT .AC ,ACPROT <>> + <PUT .AC ,ACAGE 0> + <PUT .AC ,ACRESIDUE <>> + <PUT .AC ,ACPREF <>>> + ,ALLACS> + <SETG REGS 8> + <SETG ATIME 0>> + +<GDECL (ALLACS) !<UVECTOR [8 AC]> (ATIME REGS) FIX (LAST-AC LAST-AC-1 AC0) AC> + +<MANIFEST SS-SYM-SLOT SS-DAT-SLOT SS-STORED-SLOT SS-POTENT-SLOT> + +<MANIFEST TMPFRM TMPNO THOME TUSERS DATTYP DATVAL ADDRSYM ACSYM ACLINK ACAGE + ACNUM ACPROT AC1SYM ACRESIDUE ACPREF ACINUSE TMPAC COMMON-DATUM + NUMACS POTLV> + +<MAPF <> ,MANIFEST ,CODVEC> + +<MANIFEST TOT-MODES RESTS RMODES COMP-TYPES +GDECL-SYM GNAME-SYM GNEXT-SYM FRMNO INIT-SYM ADDR-SYM TOTARGS REQARGS +DECL-SYM PURE-SYM ARGNUM-SYM CODE-SYM SPEC-SYM NAME-SYM NEXT-SYM PREDIC +NODE-SUBR CLAUSES ACS TMPLS ACTIVATED USLOTS SSLOTS SYMTAB SPECS-START +BINDING-STRUCTURE RSUBR-DECLS SEGS STACKS KIDS NODE-NAME RESULT-TYPE PARENT +NODE-TYPE SIDE-EFFECTS RET-AGAIN-ONLY ASS? INACS STORED DST CDST ACCUM-TYPE +INIT-DECL-TYPE VSPCD AGND ASSUM RTAG ATAG SPCS-X BTP-B STK-B PRE-ALLOC +USED-AT-ALL CURRENT-TYPE DEATH-LIST COMPOSIT-TYPE AGAIN-STATES RETURN-STATES +PROG-VARS LOOP-VARS PROG-AC NUM-SYM TYPE-INFO USAGE-SYM LIVE-VARS +DEAD-VARS> + +<REACS> + +<SETG LINKED 1> + +<SETG NO-RESIDUE 10000000> + +<SETG STORED-RESIDUE 1000000> + +<SETG NOT-STORED-RESIDUE 100000> + +<SETG NOT-PREF 10000> + +<SETG P-N-CLEAN 1000> + +<SETG P-N-STO-RES 100> + +<SETG P-N-NO-STO-RES 10> + +<SETG P-N-LINKED 1> + +<MANIFEST LINKED + NO-RESIDUE + STORED-RESIDUE + NOT-STORED-RESIDUE + NOT-PREF + P-N-LINKED + P-N-CLEAN + P-N-STO-RES + P-N-NO-STO-RES> + +<SETG ACO <CHTYPE [`O* `O* <> 0 0 <> `A* <> <>] AC>> + +<SETG SS-SYM-SLOT 1> + +"POINTER TO SYMBOL" + +<SETG SS-DAT-SLOT 2> + +"DATUM OF THE SYMBOL" + +<SETG SS-STORED-SLOT 3> + +"IS THE SYMBOL STORED" + +<SETG SS-POTENT-SLOT 4> + +"IS THE SYMBOL POTENTIAL" + +<MANIFEST SS-SYM-SLOT SS-DAT-SLOT SS-STORED-SLOT SS-POTENT-SLOT> + +"MANIFESTS FOR PROG-AC" + +<SETG PROG-SLOT 1> + +<SETG NUM-SYM-SLOT 2> + +<SETG STORED-SLOT 3> + +<SETG INACS-SLOT 4> + +"MANIFESTED VARIABLES FOR SLOT STORE IN PROG-VARS" + +<SETG SYM-SLOT 1> + +<SETG SAVED-NUM-SYM-SLOT 2> + +<SETG SAVED-PROG-AC-SLOT 3> + +<SETG SAVED-POTLV-SLOT 4> + +<SETG LENGTH-PROG-VARS 4> + +"MANIFESTS FOR AGAIN AND RETURN STATES" + +<SETG SAVED-AC-STATE 1> + +<SETG SAVED-CODE:PTR 2> + +<SETG SAVED-STACK-STATE 3> + +<SETG SAVED-RET-FLAG 4> + +<SETG LENGTH-CONTROL-STATE 4> + +"OFFSETS FOR STACK:INFO" + +<SETG SAVED-FRMS 1> + +<SETG SAVED-BSTB 2> + +<SETG SAVED-NTSLOTS 3> + +<SETG SAVED-STK 4> + +"SLOTS FOR SAVED-AC-SLOT" + +<SETG CSYMT-SLOT 1> + +<SETG CINACS-SLOT 2> + +<SETG CSTORED-SLOT 3> + +<SETG CPOTLV-SLOT 4> + +<SETG LENGTH-CSTATE 4> + +"SLOTS FOR LOOP-VARS" + +<SETG LSYM-SLOT 1> + +<SETG LINACS-SLOT 2> + +<SETG LOOPVARS-LENGTH 2> + +<MANIFEST NUM-SYM-SLOT + LSYM-SLOT + LOOPVARS-LENGTH + LINACS-SLOT + SAVED-FRMS + CSYMT-SLOT + CINACS-SLOT + CSTORED-SLOT + CPOTLV-SLOT + LENGTH-CSTATE + SAVED-BSTB + SAVED-NTSLOTS + SAVED-STK + STORED-SLOT + INACS-SLOT + PROG-SLOT + SYM-SLOT + SAVED-NUM-SYM-SLOT + SAVED-POTLV-SLOT + SAVED-PROG-AC-SLOT + LENGTH-PROG-VARS + LENGTH-CONTROL-STATE + SAVED-AC-STATE + SAVED-CODE:PTR + SAVED-STACK-STATE + SAVED-RET-FLAG> + +<NEWTYPE COMMON + VECTOR + '<<PRIMTYPE VECTOR> ATOM <OR COMMON SYMTAB> FIX ANY <PRIMTYPE LIST>>> + +<SETG COMMON-TYPE <OFFSET 1 COMMON>> + +"TYPE OF COMMON (ATOM)" + +<SETG COMMON-SYMT <OFFSET 2 COMMON>> + +"POINTER TO OR COMMON SYMTAB" + +<SETG COMMON-ITEM <OFFSET 3 COMMON>> + +"3RD ARGUMENT TO NTH,REST,PUT ETC." + +<SETG COMMON-PRIMTYPE <OFFSET 4 COMMON>> + +"PRIMTYPE OF OBJECT IN COMMON" + +<SETG COMMON-DATUM <OFFSET 5 COMMON>> + +"DATUM FOR THIS COMMON" + +<MANIFEST COMMON-TYPE COMMON-SYMTAB COMMON-ITEM COMMON-PRIMTYPE COMMON-DATUM> + +<NEWTYPE TRANS + VECTOR + '<<PRIMTYPE VECTOR> NODE <UVECTOR [7 FIX]> <UVECTOR [7 FIX]>>> + +<DEFINE MESSAGE (SEVERITY STR "TUPLE" TEXT) + <AND <GASSIGNED? DEBUGSW> <ERROR .SEVERITY .STR>> + <MAPF <> + <FUNCTION (SEV ATM) + #DECL ((ATM SEV) ATOM) + <COND (<==? .SEV .SEVERITY> + <AND <ASSIGNED? .ATM> <SET .ATM T>> + <MAPLEAVE>)>> + '(ERROR NOTE WARNING INCONSISTANCY INCONSISTENCY) + '(ERRS NOTES WARNS INCONS INCONS)> + <PRINC "*** "> + <PRINC .SEVERITY> ;"Typically NOTE, WARNING, ERROR, or INCONSISTANCY" + <PRINC " "> + <PRINC .STR> + <REPEAT () + <COND (<EMPTY? .TEXT> <RETURN 0>) + (<==? <TYPE <1 .TEXT>> ATOM> <PRINC <1 .TEXT>>) + (<TYPE? <1 .TEXT> NODE> + <COND (<GASSIGNED? NODE-COMPLAIN> + <TERPRI> + <NODE-COMPLAIN <1 .TEXT>> + <TERPRI>)>) + (ELSE <PRIN1 <1 .TEXT>>)> + <PRINC " "> ;"Space" + <SET TEXT <REST .TEXT>>> + <TERPRI> + <COND (<==? .SEVERITY ERROR> <RETURN " COMPILATION ABORTED " .COMPILER>) + (<OR <==? .SEVERITY INCONSISTANCY> <==? .SEVERITY INCONSISTENCY>> + <RETURN " INFORM BKD; OR CLR; " .COMPILER>)> + T> + +<SETG INSTRUCTION ,FORM> + +<ENDPACKAGE> diff --git a/<mdl.comp>/compdec.mud.1 b/<mdl.comp>/compdec.mud.1 new file mode 100644 index 0000000..31830b0 --- /dev/null +++ b/<mdl.comp>/compdec.mud.1 @@ -0,0 +1,1204 @@ + +<PACKAGE "COMPDEC"> + +<ENTRY FCNS + TMPS + IDT + STYPES + PLUSINF + MINUSINF + IPUT + TEMPV + DEBUGSW + INSTRUCTION + INTH + FCN + IRSUBR + STACK + SNODES + PSTACK + ANY-AC + DUMMY-MAPF + INCONSISTENCY + SEGS + SPEC + CODVEC + QUOTE-CODE + RETURN-CODE + IPUT-CODE + SEG-CODE + PREDV + ACAGE + NUMACS + SYM-SLOT + SAVED-STK + PARENT + TYPE-INFO + PROG-VARS + CURRENT-TYPE + NODE1 + PUTR-CODE + ISUBR-CODE + EOF-CODE + IREMAS-CODE + GVAL-CODE + SPARE4-CODE + ACRESIDUE + AC-F + LOOPVARS-LENGTH + ADDVAR + FSET-CODE + OFFPTR + CSYMT-SLOT + CPOTLV-SLOT + PROG-CODE + COMP-TYPES + INACS-SLOT + SAVED-STACK-STATE + NODE-NAME + AGND + REQARGS + LOOP-VARS + DECL-SYM + PUT-CODE + FLVAL-CODE + SETG-CODE + BACK-CODE + PUT-SAME-CODE + AC-E + SS-POTENT-SLOT + NUM-SYM-SLOT + RSUBR-DECLS + NODEF + AND-CODE + MT-CODE + BITS-CODE + PUTBITS-CODE + COPY-LIST-CODE + SPARE1-CODE + ACLINK + LINKED + SS-SYM-SLOT + ATAG + ASSUM + RETURN-STATES + PURE-SYM + NUM-SYM + KID + GNAME-SYM + CHTYPE-CODE + SAVED-NUM-SYM-SLOT + NODE + SYMTAB + INACS + USAGE-SYM + GDECL-SYM + MAP-CODE + MARGS-CODE + DATVAL + ALLACS + AC-D + SAVED-AC-STATE + NODE-SUBR + LIVE-VARS + SPEC-SYM + AS-NXT-CODE + SUBSTRUC-CODE + BIT-TEST-CODE + SPARE3-CODE + TMPAC + NO-RESIDUE + NOT-PREF + P-N-STO-RES + P-N-NO-STO-RES + FRMNO + NOT-CODE + TEST-CODE + MIN-MAX-CODE + READ-EOF2-CODE + TAG-CODE + LENGTH-CONTROL-STATE + SAVED-NTSLOTS + KIDS + PREDIC + MAKE:TAG + NODEPR + NODEFM + GNEXT-SYM + FIX-CODE + MFCN-CODE + IRSUBR-CODE + CASE-CODE + SCL + ACSYM + ACNUM + AC-C + P-N-CLEAN + CINACS-SLOT + NODE-TYPE + USLOTS + DEAD-VARS + DEATH-LIST + COMPOSIT-TYPE + PROG-AC + PRED + COPY-CODE + LENGTH?-CODE + AC + LINACS-SLOT + TMPLS + INIT-DECL-TYPE + NODECOND + FUNCTION-CODE + AGAIN-CODE + 0-TST-CODE + GETBITS-CODE + MAPRET-STOP-CODE + LSH-CODE + SYMBOL + SAVED-STATE + ACO + LENGTH-PROG-VARS + CSTORED-SLOT + NODEB + SET-CODE + ROT-CODE + AC-B + REGS + PROG-SLOT + SAVED-BSTB + BINDING-STRUCTURE + CDST + VSPCD + NAME-SYM + INIT-SYM + EQ-CODE + ALL-REST-CODE + DISPATCH + TMPNO + AC1SYM + REACS + LSYM-SLOT + DST + RTAG + ACCUM-TYPE + DATUM + ARGNUM-SYM + ADDR-SYM + STORED + USED-AT-ALL + POTLV + NAME + ARGNUM + FGVAL-CODE + ID-CODE + FORM-F-CODE + INFO-CODE + TEMP + STORED-RESIDUE + SAVED-POTLV-SLOT + SAVED-CODE:PTR + CLAUSES + TRG + VARTBL + LVARTBL + SUBR-CODE + LNTH-CODE + STACKFORM-CODE + ASSIGNED?-CODE + GET2-CODE + AS-IT-IND-VAL-CODE + COMMON + DATTYP + AC-A + ACS + RET-AGAIN-ONLY + SEGMENT-CODE + FSETG-CODE + ISTRUC-CODE + MFIRST-CODE + ACPREF + SS-STORED-SLOT + STORED-SLOT + STK-B + AGAIN-STATES + CODE-SYM + BST + RSUBR-CODE + 1?-CODE + REST-CODE + ABS-CODE + MPSBR-CODE + UNWIND-CODE + PRINT-CODE + OBLIST?-CODE + ADDRSYM + AC-H + LAST-AC-1 + NOT-STORED-RESIDUE + P-N-LINKED + SAVED-RET-FLAG + SAVED-FRMS + STACKS + ASS? + BRANCH-CODE + LVAL-CODE + OR-CODE + ISTRUC2-CODE + READ-EOF-CODE + MAPLEAVE-CODE + MEMQ-CODE + REP-STATE + SS-DAT-SLOT + SAVED-PROG-AC-SLOT + LENGTH-CSTATE + RESULT-TYPE + SIDE-EFFECTS + SSLOTS + PRE-ALLOC + NEXT-SYM + FORM-CODE + TY?-CODE + FLOAT-CODE + GET-CODE + SPECS-START + BTP-B + SPCS-X + RES-TYP + GO-CODE + BITL-CODE + TOP-CODE + SPARE2-CODE + AC-G + LAST-AC + ATIME + ACTIVATED + TOTARGS + VTB + RQRG + COND-CODE + ARITH-CODE + NTH-CODE + MOD-CODE + ACPROT + IND + ALL + NOTE + WARNING + PRIM-CODE + DONT-CARE + FLUSHED + NO-RETURN + NO-DATUM + MESSAGE + GROUP-NAME + FUZZ + COMMON-TYPE + COMMON-SYMTAB + COMMON-ITEM + COMMON-PRIMTYPE + COMMON-DATUM + COMMON-SYMT + TRANSFORM + TRANS + N0? + POPWR2 + DEALLOCATE + TOKEN + ERRS + WARNS + NOTES + DEBUG-COMPILE + REASONABLE + CAREFUL + PRECOMPILED + HAIRY-ANALYSIS + SRC-FLG + BIN-FLG + GLOSP + ANALY-OK + VERBOSE + COMPILER + IND + ADDRESS:C> + + +<SETG PLUSINF <CHTYPE <MIN> FIX>> + +<SETG MINUSINF <CHTYPE <MAX> FIX>> + +"Type specification for NODE." + +<NEWTYPE NODE + VECTOR + '<VECTOR FIX + ANY + ANY + ANY + <LIST [REST NODE]> + FIX + <OR FALSE ATOM> + [REST + LIST + ANY + ANY + LIST + FIX + SYMTAB + FIX + FIX + <OR FALSE ATOM> + ATOM + ANY + LIST + LIST + ANY + ANY + ANY + ANY + ANY + ANY + ANY + <PRIMTYPE LIST> + FIX + FIX + LIST + LIST + LIST + LIST + LIST]>> + +"Offsets into pass 1 structure entities and functions to create same." + +<SETG NODE-TYPE <OFFSET 1 NODE>> + +;"Code specifying the node type." + +<SETG PARENT <OFFSET 2 NODE>> + +;"Pointer to parent node." + +<SETG RESULT-TYPE <OFFSET 3 NODE>> + +;"Type expression for result returned by code + generated by this node." + +<SETG NODE-NAME <OFFSET 4 NODE>> + +;"Usually name of SUBR associated with this node." + +<SETG KIDS <OFFSET 5 NODE>> + +;"List of sub-nodes for this node." + +<SETG STACKS <OFFSET 6 NODE>> + +;"Amount of stack needed by this node." + +<SETG SEGS <OFFSET 7 NODE>> + +;"Predicate: any segments among kids?" + +<SETG TYPE-INFO <OFFSET 8 NODE>> + +;"Points to transient type info for this node." + +<SETG SIDE-EFFECTS <OFFSET 9 NODE>> + +;"General info about side effects (format not yet firm.)" + +<SETG RSUBR-DECLS <OFFSET 10 NODE>> + +;"Function only: final rsubr decls." + +<SETG BINDING-STRUCTURE <OFFSET 11 NODE>> + +;"Partially compiled arg list." + +<SETG SPECS-START <OFFSET 12 NODE>> + +;"Offset to 1st special." + +<SETG SYMTAB <OFFSET 13 NODE>> + +;"Pointer to local symbol table." + +<SETG SSLOTS <OFFSET 14 NODE>> + +;"Number of specials." + +<SETG USLOTS <OFFSET 15 NODE>> + +;"Number of unspecials." + +<SETG ACTIVATED <OFFSET 16 NODE>> + +;"Predicate: any named activation?" + +<SETG TMPLS <OFFSET 17 NODE>> + +;"Offset to unamed temps." + +<SETG PRE-ALLOC <OFFSET 18 NODE>> + +;"Variable slots allocated in advance." + +<SETG STK-B <OFFSET 19 NODE>> + +;"Base of stack at entry." + +<SETG BTP-B <OFFSET 20 NODE>> + +;"Base of stack after bindings." + +<SETG SPCS-X <OFFSET 21 NODE>> + +;"Predicate: any specials bound?" + +<SETG DST <OFFSET 22 NODE>> + +;"Destination spec for value of node." + +<SETG CDST <OFFSET 23 NODE>> + +;"Current destination used." + +<SETG ATAG <OFFSET 24 NODE>> + +;"Label for local againing." + +<SETG RTAG <OFFSET 25 NODE>> + +;"Label for local Returning." + +<SETG ASSUM <OFFSET 26 NODE>> + +;"Node type assumptions." + +<SETG AGND <OFFSET 27 NODE>> + +;"Predicate: Again possible?" + +<SETG ACS <OFFSET 28 NODE>> + +;"Predicate: AC call possible? (if not false + ac structure)" + +<SETG TOTARGS <OFFSET 29 NODE>> + +;"Total number of args (including optional)." + +<SETG REQARGS <OFFSET 30 NODE>> + +;"Required arguemnts." + +<SETG LOOP-VARS <OFFSET 31 NODE>> + +"Variables kept in acs thru loop." + +<SETG AGAIN-STATES <OFFSET 32 NODE>> + +"States at agains" + +<SETG RETURN-STATES <OFFSET 33 NODE>> + +"States at repeats." + +<SETG PROG-VARS <OFFSET 34 NODE>> + +"Vars handled in this prog/repeat." + +;"Information used for merging states with prog-nodes" + +<SETG CLAUSES <OFFSET <INDEX ,KIDS> NODE>> + +;"For COND clauses." + +<SETG NODE-SUBR <OFFSET <INDEX ,RSUBR-DECLS> NODE>> + +;"For many nodes, the SUBR (not its name)." + +<SETG PREDIC <OFFSET <INDEX ,NODE-NAME> NODE>> + +;"For cond clause nodes, the predicate." + +<SETG ACCUM-TYPE <OFFSET <INDEX ,DST> NODE>> + +;"Accumulated type from all returns etc." + +<SETG DEAD-VARS <OFFSET <INDEX ,CDST> NODE>> + +<SETG LIVE-VARS <OFFSET <INDEX ,TYPE-INFO> NODE>> + +<SETG VSPCD <OFFSET <INDEX ,ATAG> NODE>> + +<SETG INIT-DECL-TYPE <OFFSET <INDEX ,RTAG> NODE>> + +" Definitions associated with compiler symbol tables." + +"Offsets for variable description blocks" + +<NEWTYPE SYMTAB + VECTOR + '<VECTOR <PRIMTYPE VECTOR> + ATOM + <OR FALSE ATOM> + FIX + <OR ATOM FIX> + <OR FALSE ATOM> + LIST + ANY + ANY + FIX + <OR FALSE NODE> + <OR FALSE 'T> + <OR FALSE DATUM LIST> + <OR FALSE 'T> + <OR FALSE 'T> + LIST + ANY + ANY + <OR FALSE FIX>>> + +<SETG NEXT-SYM <OFFSET 1 SYMTAB>> + +;"Pointer to next symbol table entry." + +<SETG NAME-SYM <OFFSET 2 SYMTAB>> + +;"Name of variable." + +<SETG SPEC-SYM <OFFSET 3 SYMTAB>> + +;"Predicate: special?" + +<SETG CODE-SYM <OFFSET 4 SYMTAB>> + +;"Code specifying whether AUX, OPTIONAL etc." + +<SETG ARGNUM-SYM <OFFSET 5 SYMTAB>> + +;"If an argument, which one." + +<SETG PURE-SYM <OFFSET 6 SYMTAB>> + +;"Predicate: unchanged in function?" + +<SETG DECL-SYM <OFFSET 7 SYMTAB>> + +;"Decl for this variable." + +<SETG ADDR-SYM <OFFSET 8 SYMTAB>> + +;"Where do I live?" + +<SETG INIT-SYM <OFFSET 9 SYMTAB>> + +;"Predicate: initial value? if so what." + +<SETG FRMNO <OFFSET 10 SYMTAB>> + +;"ID of my frame." + +<SETG RET-AGAIN-ONLY <OFFSET 11 SYMTAB>> + +;"Predicate: used only in AGAIN/RETURN?" + +<SETG ASS? <OFFSET 12 SYMTAB>> + +;"Predicate: used in ASSIGNED?" + +<SETG INACS <OFFSET 13 SYMTAB>> + +;"Predicate: currently in some AC?" + +<SETG STORED <OFFSET 14 SYMTAB>> + +;"Predicate: stored in slot?" + +<SETG USED-AT-ALL <OFFSET 15 SYMTAB>> + +;"Predicate: symbolused at all." + +<SETG DEATH-LIST <OFFSET 16 SYMTAB>> + +;"List of info associated with life time." + +<SETG CURRENT-TYPE <OFFSET 17 SYMTAB>> + +;"Current decl determined by analysis" + +<SETG COMPOSIT-TYPE <OFFSET 18 SYMTAB>> + +<SETG USAGE-SYM <OFFSET 19 SYMTAB>> + +"How a variable is used in a loop." + +<SETG PROG-AC <OFFSET <INDEX ,CURRENT-TYPE> SYMTAB>> + +<SETG NUM-SYM <OFFSET <INDEX ,COMPOSIT-TYPE> SYMTAB>> + +<SETG POTLV <OFFSET <INDEX ,USED-AT-ALL> SYMTAB>> + + +"Slot used to store information for variables in loops." + +;"Type as figured out by all uses of symbol." + +<DEFINE NODE1 (TYP PAR RES-TYP NAME KID) + <CHTYPE [.TYP .PAR .RES-TYP .NAME .KID 0 <>] NODE>> + +"Create a function node with all its hair." + +<DEFINE NODEF (TYP PAR RES-TYP NAME KID RSD BST HAT VTB ACS? TRG RQRG) + <CHTYPE [.TYP .PAR .RES-TYP .NAME .KID 0 <> () <> .RSD .BST 0 .VTB 0 + 0 <> <MAKE:TAG "FRM"> <> () () <> <> <> <> .RES-TYP <> <> + .ACS? .TRG .RQRG] NODE>> + +"Create a PROG/REPEAT node with nearly as much hair." + +<DEFINE NODEPR (TYP PAR RES-TYP NAME KID VL BST HAT VTB) + <CHTYPE [.TYP + .PAR + .RES-TYP + .NAME + .KID + 0 + <> + () + <> + .VL + .BST + 0 + .VTB + 0 + 0 + <> + <MAKE:TAG "FRM"> + <> + () + () + <> + <> + <> + <> + .RES-TYP + <> + <> + <> + 0 + 0 + () + () + () + ()] + NODE>> + +"Create a COND node." + +<DEFINE NODECOND (TYP PAR RES-TYP NAME CLAU) + <CHTYPE [.TYP .PAR .RES-TYP .NAME .CLAU 0 <> () <>] NODE>> + +"Create a node for a COND clause." + +<DEFINE NODEB (TYP PAR RES-TYP PRED CLAU) + <CHTYPE [.TYP .PAR .RES-TYP .PRED .CLAU 0 <> () <>] NODE>> + +"Create a node for a SUBR call etc." + +<DEFINE NODEFM (TYP PAR RES-TYP NAME KID SUB) + <CHTYPE [.TYP .PAR .RES-TYP .NAME .KID 0 <> () <> .SUB] NODE>> + + +<DEFINE ADDVAR (NAM SPEC CODE ARGNUM PURE DCL ADDR INIT) + <SET VARTBL <CHTYPE [.VARTBL .NAM .SPEC .CODE .ARGNUM .PURE .DCL .ADDR .INIT 0 <> + <> <> T <> () <> ANY 0] SYMTAB>>> + + +"Some specialized decl stuff." + +<SETG LVARTBL + <PROG ((VARTBL [])) + #DECL ((VARTBL) <SPECIAL ANY>) + <ADDVAR OBLIST T -1 0 T '(<OR LIST OBLIST>) <> <>> + <ADDVAR OUTCHAN T -1 0 T '(CHANNEL) <> <>> + <ADDVAR INCHAN T -1 0 T '(CHANNEL) <> <>> + .VARTBL>> + +<PUT CHANNEL DECL '<CHANNEL FIX [11 ANY] [5 FIX]>> + +<PUT STRING DECL '<STRING [REST CHARACTER]>> + +<PUT OBLIST DECL '<UVECTOR [REST <LIST [REST <OR ATOM LINK>]>]>> + +"Codes for the node types in the tree built by pass1 and modified by +other passes." + +"Give symbolic codes arbitrary increasing values." + +<PROG ((N 1)) + <SETG CODVEC + <MAPF ,UVECTOR + <FUNCTION (ATM) <SETG .ATM .N> <SET N <+ .N 1>> .ATM> + ![FUNCTION-CODE + QUOTE-CODE + SEGMENT-CODE + FORM-CODE + PROG-CODE + SUBR-CODE + COND-CODE + BRANCH-CODE + RSUBR-CODE + LVAL-CODE + SET-CODE + OR-CODE + AND-CODE + RETURN-CODE + COPY-CODE + GO-CODE + AGAIN-CODE + ARITH-CODE + 0-TST-CODE + NOT-CODE + 1?-CODE + TEST-CODE + EQ-CODE + TY?-CODE + LNTH-CODE + MT-CODE + NTH-CODE + REST-CODE + PUT-CODE + PUTR-CODE + FLVAL-CODE + FSET-CODE + FGVAL-CODE + FSETG-CODE + MIN-MAX-CODE + STACKFORM-CODE + CHTYPE-CODE + ABS-CODE + FIX-CODE + FLOAT-CODE + MOD-CODE + ID-CODE + ASSIGNED?-CODE + ISTRUC-CODE + ISTRUC2-CODE + BITS-CODE + BITL-CODE + GETBITS-CODE + PUTBITS-CODE + MAP-CODE + MFCN-CODE + ISUBR-CODE + READ-EOF-CODE + READ-EOF2-CODE + EOF-CODE + GET-CODE + GET2-CODE + IPUT-CODE + IREMAS-CODE + IRSUBR-CODE + MARGS-CODE + MPSBR-CODE + MAPLEAVE-CODE + MAPRET-STOP-CODE + UNWIND-CODE + GVAL-CODE + SETG-CODE + SEG-CODE + LENGTH?-CODE + TAG-CODE + MFIRST-CODE + PRINT-CODE + MEMQ-CODE + FORM-F-CODE + INFO-CODE + OBLIST?-CODE + AS-NXT-CODE + AS-IT-IND-VAL-CODE + ALL-REST-CODE + CASE-CODE + SUBSTRUC-CODE + BACK-CODE + TOP-CODE + COPY-LIST-CODE + PUT-SAME-CODE + ROT-CODE + LSH-CODE + BIT-TEST-CODE + SPARE1-CODE + SPARE2-CODE + SPARE3-CODE + SPARE4-CODE!]>> + <SETG COMP-TYPES .N>> + + +<USE "NPRINT"> + +"Build a dispatch table based on node types." + +<DEFINE DISPATCH (DEFAULT "TUPLE" PAIRS + "AUX" (TT <IVECTOR ,COMP-TYPES '.DEFAULT>)) + #DECL ((PAIRS) <TUPLE [REST <LIST FIX ANY>]> + (TT) VECTOR) + <REPEAT ((PAIR '(1 1))) #DECL ((PAIR) <LIST FIX ANY>) + <COND (<EMPTY? .PAIRS><RETURN .TT>)> + <PUT .TT <1 <SET PAIR <1 .PAIRS>>> <2 .PAIR>> + <SET PAIRS <REST .PAIRS>>>> + +<SETG PREDV <IUVECTOR ,COMP-TYPES 0>> + +<MAPF <> + <FUNCTION (N) <PUT ,PREDV .N 1>> + ![,0-TST-CODE + ,1?-CODE + ,NOT-CODE + ,TEST-CODE + ,EQ-CODE + ,TY?-CODE + ,MT-CODE + ,OR-CODE + ,AND-CODE + ,ASSIGNED?-CODE + ,ISUBR-CODE + ,NTH-CODE + ,MEMQ-CODE + ,LENGTH?-CODE + ,OBLIST?-CODE + ,AS-NXT-CODE + ,COND-CODE + ,BIT-TEST-CODE!]> + +"Predicate: does this type have special predicate code?" + +<PUT REP-STATE + DECL + '<LIST [5 <LIST [REST SYMTAB DATUM <OR FALSE ATOM> <OR ATOM FALSE>]>]>> + +<PUT SYMBOL DECL '<OR SYMTAB TEMP COMMON>> + +<NEWTYPE TEMP VECTOR '<VECTOR SCL <OR FALSE DATUM>>> + +<NEWTYPE SAVED-STATE + LIST + '<LIST [REST + <LIST AC + <OR FALSE <LIST [REST SYMBOL]>> + [REST <LIST SYMBOL [3 ANY]>]>]>> + +<SETG TMPNO <OFFSET 1 TEMP>> + +<SETG TMPAC <OFFSET 2 TEMP>> + +<SETG DATTYP <OFFSET 1 DATUM>> + +<SETG DATVAL <OFFSET 2 DATUM>> + +<SETG ADDRSYM <OFFSET 1 AC>> + +<SETG ACSYM <OFFSET 2 AC>> + +<SETG ACLINK <OFFSET 3 AC>> + +<SETG ACAGE <OFFSET 4 AC>> + +<SETG ACNUM <OFFSET 5 AC>> + +<SETG ACPROT <OFFSET 6 AC>> + +<SETG AC1SYM <OFFSET 7 AC>> + +<SETG ACRESIDUE <OFFSET 8 AC>> + +<SETG ACPREF <OFFSET 9 AC>> + +<NEWTYPE AC + VECTOR + '<<PRIMTYPE VECTOR> <PRIMTYPE WORD> + <PRIMTYPE WORD> + <OR <LIST [REST DATUM]> FALSE> + FIX + FIX + <OR FALSE ATOM> + <PRIMTYPE WORD> + <OR FALSE LIST> + <OR FALSE ATOM>>> + +<NEWTYPE DATUM + LIST + '<<PRIMTYPE LIST> <OR ATOM <PRIMTYPE LIST> <PRIMTYPE VECTOR>> + <OR ATOM <PRIMTYPE LIST> <PRIMTYPE VECTOR>>>> + +<NEWTYPE OFFPTR LIST '<<PRIMTYPE LIST> FIX DATUM ATOM>> + +<NEWTYPE TEMPV LIST> + +<NEWTYPE IRSUBR LIST> + +"A TOKEN GIVES INFORMATION TO CUP" + +<NEWTYPE TOKEN VECTOR '<<PRIMTYPE VECTOR> FIX>> + +<NEWTYPE ADDRESS:PAIR LIST> + +<NEWTYPE ADDRESS:C LIST> + +<SETG ALLACS + <MAPF ,UVECTOR + <FUNCTION (N1 N2 N N+1 NAME "AUX" THISAC) + <SETG .NAME <SET THISAC <CHTYPE [.N1 .N2 <> 0 .N <> .N+1 <> <>] AC>>> + <EVAL <FORM GDECL (.NAME) AC>> .THISAC> + ![`A `B `C `D `E `F `TVP `SP!] + ![`A* `B* `C* `D* `E* `F* `TVP* `SP*!] + ![1 2 3 4 5 6 7 8!] + ![`B* `C* `D* `E* `F* `TVP* `SP* `AB*!] + ![AC-A AC-B AC-C AC-D AC-E AC-F AC-G AC-H!]>> + +<SETG NUMACS <LENGTH ,ALLACS>> + +<SETG LAST-AC ,AC-H> + +<SETG LAST-AC-1 ,AC-G> + +<DEFINE REACS () + <MAPF <> + <FUNCTION (AC) + #DECL ((AC) AC) + <PUT .AC ,ACLINK <>> + <PUT .AC ,ACPROT <>> + <PUT .AC ,ACAGE 0> + <PUT .AC ,ACRESIDUE <>> + <PUT .AC ,ACPREF <>>> + ,ALLACS> + <SETG REGS 8> + <SETG ATIME 0>> + +<GDECL (ALLACS) !<UVECTOR [8 AC]> (ATIME REGS) FIX (LAST-AC LAST-AC-1 AC0) AC> + +<MANIFEST SS-SYM-SLOT SS-DAT-SLOT SS-STORED-SLOT SS-POTENT-SLOT> + +<MANIFEST TMPFRM TMPNO THOME TUSERS DATTYP DATVAL ADDRSYM ACSYM ACLINK ACAGE + ACNUM ACPROT AC1SYM ACRESIDUE ACPREF ACINUSE TMPAC COMMON-DATUM + NUMACS POTLV> + +<MAPF <> ,MANIFEST ,CODVEC> + +<MANIFEST TOT-MODES RESTS RMODES COMP-TYPES +GDECL-SYM GNAME-SYM GNEXT-SYM FRMNO INIT-SYM ADDR-SYM TOTARGS REQARGS +DECL-SYM PURE-SYM ARGNUM-SYM CODE-SYM SPEC-SYM NAME-SYM NEXT-SYM PREDIC +NODE-SUBR CLAUSES ACS TMPLS ACTIVATED USLOTS SSLOTS SYMTAB SPECS-START +BINDING-STRUCTURE RSUBR-DECLS SEGS STACKS KIDS NODE-NAME RESULT-TYPE PARENT +NODE-TYPE SIDE-EFFECTS RET-AGAIN-ONLY ASS? INACS STORED DST CDST ACCUM-TYPE +INIT-DECL-TYPE VSPCD AGND ASSUM RTAG ATAG SPCS-X BTP-B STK-B PRE-ALLOC +USED-AT-ALL CURRENT-TYPE DEATH-LIST COMPOSIT-TYPE AGAIN-STATES RETURN-STATES +PROG-VARS LOOP-VARS PROG-AC NUM-SYM TYPE-INFO USAGE-SYM LIVE-VARS +DEAD-VARS> + +<REACS> + +<SETG LINKED 1> + +<SETG NO-RESIDUE 10000000> + +<SETG STORED-RESIDUE 1000000> + +<SETG NOT-STORED-RESIDUE 100000> + +<SETG NOT-PREF 10000> + +<SETG P-N-CLEAN 1000> + +<SETG P-N-STO-RES 100> + +<SETG P-N-NO-STO-RES 10> + +<SETG P-N-LINKED 1> + +<MANIFEST LINKED + NO-RESIDUE + STORED-RESIDUE + NOT-STORED-RESIDUE + NOT-PREF + P-N-LINKED + P-N-CLEAN + P-N-STO-RES + P-N-NO-STO-RES> + +<SETG ACO <CHTYPE [`O* `O* <> 0 0 <> `A* <> <>] AC>> + +<SETG SS-SYM-SLOT 1> + +"POINTER TO SYMBOL" + +<SETG SS-DAT-SLOT 2> + +"DATUM OF THE SYMBOL" + +<SETG SS-STORED-SLOT 3> + +"IS THE SYMBOL STORED" + +<SETG SS-POTENT-SLOT 4> + +"IS THE SYMBOL POTENTIAL" + +<MANIFEST SS-SYM-SLOT SS-DAT-SLOT SS-STORED-SLOT SS-POTENT-SLOT> + +"MANIFESTS FOR PROG-AC" + +<SETG PROG-SLOT 1> + +<SETG NUM-SYM-SLOT 2> + +<SETG STORED-SLOT 3> + +<SETG INACS-SLOT 4> + +"MANIFESTED VARIABLES FOR SLOT STORE IN PROG-VARS" + +<SETG SYM-SLOT 1> + +<SETG SAVED-NUM-SYM-SLOT 2> + +<SETG SAVED-PROG-AC-SLOT 3> + +<SETG SAVED-POTLV-SLOT 4> + +<SETG LENGTH-PROG-VARS 4> + +"MANIFESTS FOR AGAIN AND RETURN STATES" + +<SETG SAVED-AC-STATE 1> + +<SETG SAVED-CODE:PTR 2> + +<SETG SAVED-STACK-STATE 3> + +<SETG SAVED-RET-FLAG 4> + +<SETG LENGTH-CONTROL-STATE 4> + +"OFFSETS FOR STACK:INFO" + +<SETG SAVED-FRMS 1> + +<SETG SAVED-BSTB 2> + +<SETG SAVED-NTSLOTS 3> + +<SETG SAVED-STK 4> + +"SLOTS FOR SAVED-AC-SLOT" + +<SETG CSYMT-SLOT 1> + +<SETG CINACS-SLOT 2> + +<SETG CSTORED-SLOT 3> + +<SETG CPOTLV-SLOT 4> + +<SETG LENGTH-CSTATE 4> + +"SLOTS FOR LOOP-VARS" + +<SETG LSYM-SLOT 1> + +<SETG LINACS-SLOT 2> + +<SETG LOOPVARS-LENGTH 2> + +<MANIFEST NUM-SYM-SLOT + LSYM-SLOT + LOOPVARS-LENGTH + LINACS-SLOT + SAVED-FRMS + CSYMT-SLOT + CINACS-SLOT + CSTORED-SLOT + CPOTLV-SLOT + LENGTH-CSTATE + SAVED-BSTB + SAVED-NTSLOTS + SAVED-STK + STORED-SLOT + INACS-SLOT + PROG-SLOT + SYM-SLOT + SAVED-NUM-SYM-SLOT + SAVED-POTLV-SLOT + SAVED-PROG-AC-SLOT + LENGTH-PROG-VARS + LENGTH-CONTROL-STATE + SAVED-AC-STATE + SAVED-CODE:PTR + SAVED-STACK-STATE + SAVED-RET-FLAG> + +<NEWTYPE COMMON + VECTOR + '<<PRIMTYPE VECTOR> ATOM <OR COMMON SYMTAB> FIX ANY <PRIMTYPE LIST>>> + +<SETG COMMON-TYPE <OFFSET 1 COMMON>> + +"TYPE OF COMMON (ATOM)" + +<SETG COMMON-SYMT <OFFSET 2 COMMON>> + +"POINTER TO OR COMMON SYMTAB" + +<SETG COMMON-ITEM <OFFSET 3 COMMON>> + +"3RD ARGUMENT TO NTH,REST,PUT ETC." + +<SETG COMMON-PRIMTYPE <OFFSET 4 COMMON>> + +"PRIMTYPE OF OBJECT IN COMMON" + +<SETG COMMON-DATUM <OFFSET 5 COMMON>> + +"DATUM FOR THIS COMMON" + +<MANIFEST COMMON-TYPE COMMON-SYMTAB COMMON-ITEM COMMON-PRIMTYPE COMMON-DATUM> + +<NEWTYPE TRANS + VECTOR + '<<PRIMTYPE VECTOR> NODE <UVECTOR [7 FIX]> <UVECTOR [7 FIX]>>> + +<DEFINE MESSAGE (SEVERITY STR "TUPLE" TEXT) + <AND <GASSIGNED? DEBUGSW> <ERROR .SEVERITY .STR>> + <MAPF <> + <FUNCTION (SEV ATM) + #DECL ((ATM SEV) ATOM) + <COND (<==? .SEV .SEVERITY> + <AND <ASSIGNED? .ATM> <SET .ATM T>> + <MAPLEAVE>)>> + '(ERROR NOTE WARNING INCONSISTANCY INCONSISTENCY) + '(ERRS NOTES WARNS INCONS INCONS)> + <PRINC "*** "> + <PRINC .SEVERITY> ;"Typically NOTE, WARNING, ERROR, or INCONSISTANCY" + <PRINC " "> + <PRINC .STR> + <REPEAT () + <COND (<EMPTY? .TEXT> <RETURN 0>) + (<==? <TYPE <1 .TEXT>> ATOM> <PRINC <1 .TEXT>>) + (<TYPE? <1 .TEXT> NODE> + <COND (<GASSIGNED? NODE-COMPLAIN> + <TERPRI> + <NODE-COMPLAIN <1 .TEXT>> + <TERPRI>)>) + (ELSE <PRIN1 <1 .TEXT>>)> + <PRINC " "> ;"Space" + <SET TEXT <REST .TEXT>>> + <TERPRI> + <COND (<==? .SEVERITY ERROR> <RETURN " COMPILATION ABORTED " .COMPILER>) + (<OR <==? .SEVERITY INCONSISTANCY> <==? .SEVERITY INCONSISTENCY>> + <RETURN " INFORM BKD; OR CLR; " .COMPILER>)> + T> + +<SETG INSTRUCTION ,FORM> + +<ENDPACKAGE> + \ No newline at end of file diff --git a/<mdl.comp>/comsub.mud.10 b/<mdl.comp>/comsub.mud.10 new file mode 100644 index 0000000..5e57e37 --- /dev/null +++ b/<mdl.comp>/comsub.mud.10 @@ -0,0 +1,451 @@ +<PACKAGE "COMSUB"> + +<ENTRY SUBSTRUC-GEN> + +<USE "CODGEN" "CACS" "CHKDCL" "COMCOD" "COMPDEC" "STRGEN"> + + +"ROUTINES TO GENERATE SUBSTRUCT FOR THE COMPILER. CURRENTLY ONLY + HACKS UVECTOR AND VECTOR + CASES 1) COPYING (ALWAYS HACKED) (I.E 1 ARG) + 2) COPYING PORTIONS (2 OR 3 ARGS) (ALWAYS HACKED) + 3) COPYING INTO STRUCTURES HACKED IN 2 CASES + <SUBSTRUC .X .N1 .N2 <REST .X>> + <SUBSTRUC <REST .X> .N1 .N2 .X>" + +"NODE STRUCTURE IS FAIRLY MUNGED TO ALLOW FOR REASONABILITY. + 1==> STRUCTURE NODE + THIS IS ACTUALLY RESTED + 2==> NUMBER NODE (IF IT EXISTS) + 3==> RESTED STRUCTURE NODE (IF IT EXISTS) + DECISION AS TO FOURTH ARG WILL TRY TO BE MADE DURING PASS1 OR SYMANA" + +<DEFINE SUBSTRUC-GEN (NOD WHERE + "AUX" (K <KIDS .NOD>) (STRNOD <1 .K>) + (TPS <STRUCTYP <RESULT-TYPE .STRNOD>>) L) + #DECL ((NOD) NODE (WHERE) <OR ATOM DATUM> (K) <LIST [REST NODE]>) + <COND (<1? <SET L <LENGTH .K>>> <COPY-SB-GEN .STRNOD .TPS .WHERE>) + (<==? .L 2> <COPY-ELE-SB-GEN .STRNOD .TPS <2 .K> .WHERE>) + (<==? .L 3> <COPY-INTO-SB-GEN .STRNOD .TPS <2 .K> <3 .K> .WHERE>) + (<MESSAGE INCONSISTENCY "BAD NODE TO SUBSTRUC">)>> + +\ + +"ROUTINE TO COPY INTO A NEW STRUCTION (1 OR 2 ARGUMENT SUBSTRUCTS." + +<DEFINE COPY-SB-GEN (STRNOD TPS WHERE + "AUX" SDAT TDAT NDAT NAC SAC (END-LABEL <MAKE:TAG "SUB">) + TAC) + #DECL ((STRNOD) NODE (TPS) ATOM (WHERE) <OR ATOM DATUM> + (SDAT TDAT NDAT) DATUM (TAC NAC SAC) AC) + <SET SDAT <GEN .STRNOD DONT-CARE>> + <COND (<==? <DATVAL .SDAT> ,AC-A> + <MUNG-AC ,AC-A .SDAT> + <EMIT <INSTRUCTION `HLRE `A* `A >>) + (<SGETREG ,AC-A <>> + <EMIT <INSTRUCTION `HLRE `A* !<ADDR:VALUE .SDAT>>>)> + <REGSTO T> + <EMIT <INSTRUCTION `MOVNS `A >> + <EMIT <INSTRUCTION `PUSH `P* `A >> + <SET TDAT <GEN-COPY .TPS>> + <SET TAC <DATVAL .TDAT>> + <PUT .TAC ,ACPROT T> + <SET NDAT <DATUM FIX ANY-AC>> + <SET NAC <GETREG .NDAT>> + <PUT .NDAT ,DATVAL .NAC> + <SET NAC <DATVAL .NDAT>> + <EMIT <INSTRUCTION `POP `P* <ADDRSYM .NAC>>> + <EMIT <INSTRUCTION `JUMPE <ACSYM .NAC> .END-LABEL>> + <EMIT <INSTRUCTION `ADDI <ACSYM .NAC> (<ADDRSYM .TAC>)>> + <PUT .NAC ,ACPROT T> + <TOACV .SDAT> + <SET SAC <DATVAL .SDAT>> + <BLTAC .SAC .TAC .NAC <==? .TPS UVECTOR> .SDAT> + <PUT .NAC ,ACPROT <>> + <RET-TMP-AC .SDAT> + <PUT .TAC ,ACPROT <>> + <PUT .NAC ,ACPROT <>> + <RET-TMP-AC .NDAT> + <LABEL:TAG .END-LABEL> + <MOVE:ARG .TDAT .WHERE>> + +\ + +"HERE FOR 3 ARGUMENT SUBSTRUCS" + +<DEFINE COPY-ELE-SB-GEN (STRNOD TPS NUMNOD WHERE + "AUX" TDAT (SDAT <>) NDAT + (NUM + <COND (<==? <NODE-TYPE .NUMNOD> ,QUOTE-CODE> + <NODE-NAME .NUMNOD>)>) TAC + (END-LABEL <MAKE:TAG "SUB">) (ONO .NO-KILL) + (NO-KILL .ONO) NAC SAC) + #DECL ((STRNOD NUMNOD) NODE (TPS) ATOM (WHERE) <OR ATOM DATUM> + (SDAT) <OR FALSE DATUM> (NDAT TDAT) DATUM (TAC NAC SAC) AC + (NO-KILL) <SPECIAL LIST>) + <COND (.NUM + <COND (<L? .NUM 0> <MESSAGE ERROR "OUT OF BOUNDS SUBSTRUC">)> + <REGSTO T> + <COND (<==? .TPS VECTOR> + <EMIT <INSTRUCTION `MOVEI `A* <* .NUM 2>>>) + (<==? .TPS UVECTOR> <EMIT <INSTRUCTION `MOVEI `A* .NUM>>) + (<MESSAGE INCONSISTENCY "BAD SUBSTRUC NODE">)> + <SET TDAT <GEN-COPY .TPS>> + <SET SDAT <GEN .STRNOD <DATUM .TPS ANY-AC>>> + <PUT <SET SAC <DATVAL .SDAT>> ,ACPROT T> + <TOACV .TDAT> + <SET TAC <DATVAL .TDAT>> + <PUT .SAC ,ACPROT <>> + <COND (<==? .NUM 0>) + (<COND (.CAREFUL <KNOWN-CAREFUL-CHECK .SDAT .TPS .NUM>)> + <BLTAC+NUM .SAC .TAC .NUM <> .TPS .SDAT> + <COND (<==? .TPS UVECTOR> + <SET NAC <GETREG <>>> + <EMIT <INSTRUCTION `MOVE + <ACSYM .NAC> + !<ADDR:VALUE .TDAT>>> + <EMIT <INSTRUCTION `HLRE `O* <ADDRSYM .NAC>>> + <EMIT <INSTRUCTION `SUB <ACSYM .NAC> 0>> + <UVECTOR-MUNG-SB .SDAT .NAC>)>)>) + (ELSE + <COND (<NOT <COMMUTE-STRUC <> .STRNOD .NUMNOD>> + <SET SDAT <GEN .STRNOD <DATUM .TPS ANY-AC>>>)> + <SET NDAT <DATUM FIX ,AC-A>> + <SET NAC <SGETREG ,AC-A <>>> + <SET NDAT <GEN .NUMNOD .NDAT>> + <COND (.CAREFUL + <EMIT <INSTRUCTION `JUMPL <ACSYM <DATVAL .NDAT>> |CERR1 >>)> + <COND (<==? .TPS VECTOR> + <EMIT <INSTRUCTION `ASH <ACSYM <DATVAL .NDAT>> 1>> + <MUNG-AC .NAC .NDAT T>)> + <EMIT <INSTRUCTION `PUSH `P* <ADDRSYM .NAC>>> + <RET-TMP-AC .NDAT> + <REGSTO T> + <SET TDAT <GEN-COPY .TPS>> + <COND (.SDAT <TOACV .SDAT>) + (<SET SDAT <GEN .STRNOD <DATUM .TPS ANY-AC>>> + <DELAY-KILL .NO-KILL .ONO>)> + <SET SAC <DATVAL .SDAT>> + <PUT .SAC ,ACPROT T> + <TOACV .TDAT> + <SET TAC <DATVAL .TDAT>> + <PUT .TAC ,ACPROT T> + <SET NAC <GETREG <>>> + <EMIT <INSTRUCTION `POP `P* <ADDRSYM .NAC>>> + <EMIT <INSTRUCTION `JUMPE <ACSYM .NAC> .END-LABEL>> + <COND (.CAREFUL <UNKNOWN-CAREFUL-CHECK .SDAT .NAC>)> + <EMIT <INSTRUCTION `ADDI <ACSYM .NAC> (<ADDRSYM .TAC>)>> + <PUT .NAC ,ACPROT T> + <BLTAC .SAC .TAC .NAC <> .SDAT> + <PUT .NAC ,ACPROT <>> + <PUT .TAC ,ACPROT <>> + <PUT .SAC ,ACPROT <>> + <RET-TMP-AC .NDAT> + <AND <==? .TPS UVECTOR> <UVECTOR-MUNG-SB .SDAT .NAC>>)> + <RET-TMP-AC .SDAT> + <LABEL:TAG .END-LABEL> + <MOVE:ARG .TDAT .WHERE>> + +\ + +"ROUTINE TO COPY INTO A UVECTOR OR VECTOR + <SUBSTRUC .X .N1 .N2 <REST .X>> or + <SUBSTRUC <REST .X> .N1 .N2 .X>." + +<DEFINE COPY-INTO-SB-GEN (STRNOD TPS NUMNOD CPYNOD WHERE + "AUX" NDAT TDAT SDAT SAC TAC NAC + (NUM + <COND (<==? <NODE-TYPE .NUMNOD> ,QUOTE-CODE> + <NODE-NAME .NUMNOD>)>) RV FLG DDAT DAC + (ONO .NO-KILL) (NO-KILL .ONO) TEM TEM2 + (OTHN <>) END-LABEL RR) + #DECL ((STRNOD NUMNOD CPYNOD) NODE (WHERE) <OR ATOM DATUM> + (NDAT DDAT TDAT SDAT) DATUM (DAC NAC TAC SAC) AC + (NO-KILL) <SPECIAL LIST>) + <SET FLG <SUB-CASE-1 .STRNOD .CPYNOD>> + <COND (<AND <==? <NODE-TYPE <SET TEM <2 <KIDS .STRNOD>>>> ,QUOTE-CODE> + <OR <AND <==? <NODE-TYPE .CPYNOD> ,LVAL-CODE> <SET TEM2 0>> + <AND <==? <NODE-TYPE .CPYNOD> ,REST-CODE> + <==? <NODE-TYPE <SET TEM2 <2 <KIDS .CPYNOD>>>> + ,QUOTE-CODE> + <SET TEM2 <NODE-NAME .TEM2>>>>> + <SET OTHN <ABS <- <NODE-NAME .TEM> .TEM2>>> + <OR <==? .TPS UVECTOR> <SET OTHN <* .OTHN 2>>>)> + <COND + (.NUM + <SET RV <COMMUTE-STRUC <> .STRNOD .CPYNOD>> + <COND (<L? .NUM 0> <MESSAGE ERROR "OUT OF BOUNDS SUBSTRUC">)> + <COND (.RV + <SET TDAT <GEN .CPYNOD DONT-CARE>> + <SET SDAT <GEN .STRNOD <DATUM .TPS ANY-AC>>>) + (ELSE + <SET SDAT <GEN .STRNOD <DATUM .TPS ANY-AC>>> + <SET TDAT <GEN .CPYNOD DONT-CARE>>)> + <COND + (<==? .NUM 0>) + (<COND + (.FLG + <TOACV .SDAT> + <SET SAC <DATVAL .SDAT>> + <PUT .SAC ,ACPROT T> + <TOACV .TDAT> + <SET TAC <DATVAL .TDAT>> + <PUT .SAC ,ACPROT <>> + <COND (.CAREFUL + <KNOWN-CAREFUL-CHECK .SDAT .TPS .NUM> + <KNOWN-CAREFUL-CHECK .TDAT .TPS .NUM>)> + <RET-TMP-AC .SDAT> + <BLTAC+NUM .SAC .TAC .NUM <> .TPS <>>) + (ELSE + <TOACV .SDAT> + <SET SAC <DATVAL .SDAT>> + <MUNG-AC .SAC .SDAT <>> + <PUT .SAC ,ACPROT T> + <COND (.OTHN <PUT <SET DAC <GETREG <>>> ,ACPROT T>) + (ELSE + <SET DDAT <DATUM .TPS ANY-AC>> + <SET DAC <GETREG .DDAT>> + <PUT .DDAT ,DATVAL .DAC> + <EMIT <INSTRUCTION `MOVE <ACSYM .DAC> !<ADDR:VALUE .TDAT>>> + <PUT .DAC ,ACPROT T> + <COND (<NOT .CAREFUL> + <EMIT <INSTRUCTION `SUBI + <ACSYM .DAC> + (<ADDRSYM .SAC>)>>)>)> + <REST-IT .SAC <- .NUM 1> .TPS> + <COND (.CAREFUL + <COND (.OTHN <KNOWN-CAREFUL-CHECK .TDAT .TPS .NUM>) + (ELSE + <REST-IT .DAC <- .NUM 1> .TPS> + <EMIT <INSTRUCTION `SUBI + <ACSYM .DAC> + (<ADDRSYM .SAC>)>>)>)> + <BBLT .SAC .DAC .NUM .OTHN .TPS> + <PUT .DAC ,ACPROT <>> + <RET-TMP-AC .SDAT> + <OR .OTHN <RET-TMP-AC .DDAT>>)>)>) + (ELSE + <SET RV <COMMUTE-STRUC <> .NUMNOD .STRNOD>> + <SET RR + <AND <COMMUTE-STRUC <> .CPYNOD .NUMNOD> + <COMMUTE-STRUC <> .CPYNOD .STRNOD>>> + <COND (.RR <SET TDAT <GEN .CPYNOD DONT-CARE>>)> + <COND (.RV + <SET NDAT <GEN .NUMNOD <DATUM FIX ANY-AC>>> + <SET SDAT <GEN .STRNOD <DATUM .TPS ANY-AC>>>) + (ELSE + <SET SDAT <GEN .STRNOD <DATUM .TPS ANY-AC>>> + <SET NDAT <GEN .NUMNOD <DATUM FIX ANY-AC>>>)> + <DELAY-KILL .NO-KILL .ONO> + <COND (<NOT .RR> <SET TDAT <GEN .CPYNOD DONT-CARE>>)> + <TOACV .NDAT> + <SET NAC <DATVAL .NDAT>> + <PUT .NAC ,ACPROT T> + <EMIT <INSTRUCTION `JUMPE + <ACSYM .NAC> + <SET END-LABEL <MAKE:TAG "SUBSTR">>>> + <COND (.CAREFUL <EMIT <INSTRUCTION `JUMPL <ACSYM .NAC> |CERR1 >>)> + <MUNG-AC .NAC .NDAT T> + <COND + (.FLG + <TOACV .SDAT> + <SET SAC <DATVAL .SDAT>> + <PUT .SAC ,ACPROT T> + <COND (<N==? .TPS UVECTOR> <EMIT <INSTRUCTION `ASH <ACSYM .NAC> 1>>)> + <AND .CAREFUL <UNKNOWN-CAREFUL-CHECK .SDAT .NAC>> + <EMIT <INSTRUCTION `HRLI <ACSYM .NAC> (<ADDRSYM .NAC>)>> + <EMIT <INSTRUCTION `ADD <ACSYM .NAC> !<ADDR:VALUE .TDAT>>> + <AND .CAREFUL <RCHK .NAC T>> + <PUT .NAC ,ACPROT <>> + <PUT .SAC ,ACPROT <>> + <BLTAC+DAT .SAC .TDAT .NAC>) + (ELSE + <COND (.OTHN <SET DAC <GETREG <>>>) + (ELSE + <SET DDAT <DATUM .TPS ANY-AC>> + <SET DAC <GETREG .DDAT>> + <PUT .DDAT ,DATVAL .DAC> + <EMIT <INSTRUCTION `MOVE <ACSYM .DAC> !<ADDR:VALUE .TDAT>>>)> + <EMIT <INSTRUCTION `SUBI <ACSYM .NAC> 1>> + <COND (<N==? .TPS UVECTOR> <EMIT <INSTRUCTION `ASH <ACSYM .NAC> 1>>)> + <EMIT <INSTRUCTION `HRLI <ACSYM .NAC> (<ADDRSYM .NAC>)>> + <PUT .DAC ,ACPROT T> + <TOACV .SDAT> + <SET SAC <DATVAL .SDAT>> + <PUT .SAC ,ACPROT T> + <COND (<AND <NOT .CAREFUL> <NOT .OTHN>> + <EMIT <INSTRUCTION `SUBI <ACSYM .DAC> (<ADDRSYM .SAC>)>>)> + <REST-IT .SAC .NAC .TPS> + <COND (.CAREFUL + <COND (.OTHN + <COND (<NOT <0? .OTHN>> + <EMIT <INSTRUCTION `CAML + <ACSYM .SAC> + [<FORM (<- .OTHN>) 0>]>> + <EMIT '<`JRST |CERR2 >>)>) + (ELSE + <REST-IT .DAC .NAC .TPS> + <EMIT <INSTRUCTION `SUBI + <ACSYM .DAC> + (<ADDRSYM .SAC>)>>)>)> + <BBLT .SAC .DAC .NAC .OTHN .TPS> + <PUT .SAC ,ACPROT <>> + <PUT .NAC ,ACPROT <>> + <PUT .DAC ,ACPROT <>> + <OR .OTHN <RET-TMP-AC .DDAT>>)> + <RET-TMP-AC .NDAT> + <LABEL:TAG .END-LABEL>)> + <RET-TMP-AC .SDAT> + <MOVE:ARG .TDAT .WHERE>> + +\ + +"ROUTINE TO GENERATE A CALL TO IBLOCK AND ALSO GENERATE THE APPROPRIATE DATUM" + +<DEFINE GEN-COPY (TPS "AUX" (DAT <DATUM .TPS ,AC-B>)) + #DECL ((DAT) DATUM (TPS) ATOM) + <SGETREG ,AC-B .DAT> + <COND (<==? .TPS UVECTOR> + <EMIT <INSTRUCTION `MOVEI `O |IBLOCK >>) + (<EMIT <INSTRUCTION `MOVEI `O 1 |IBLOK1 >>)> + <EMIT <INSTRUCTION `PUSHJ `P* |RCALL >> + .DAT> + +"ROUTINES TO DETERMINE THE CASE OF THE SUBSTRUC WITH 4 ARGUMENTS" + +"SUB-CASE-1 LOOKS FOR <SUBSTRUC <REST .X> .N1 .N2 .X> AND SIMILAR CASES WHERE + BLTS ARE ALWAYS POSSIBLE. + STRNOD== NODE OF STRUCTURE + CPYNOD== NODE OF STRUCTURE TO COPY INTO" + +<DEFINE SUB-CASE-1 (STRNOD CPYNOD + "AUX" (DATA <GET-SUB-DATA .STRNOD>) + (DATAC <GET-SUB-DATA .CPYNOD>)) + #DECL ((STRNOD CPYNOD) NODE (DATAC DATA) <OR FALSE LIST>) + <AND .DATA + .DATAC + <==? <1 .DATA> <1 .DATAC>> + <TYPE? <2 .DATAC> FIX> + <OR <0? <2 .DATAC>> + <AND <TYPE? <2 .DATA> FIX> <G=? <2 .DATA> <2 .DATAC>>>>>> + +<DEFINE SUB-CASE-2 (STRNOD CPYNOD + "AUX" (DATA <GET-SUB-DATA .STRNOD>) + (DATAC <GET-SUB-DATA .CPYNOD>)) + #DECL ((STRNOD CPYNOD) NODE (DATAC DATA) <OR FALSE LIST>) + <AND .DATA + .DATAC + <==? <1 .DATA> <1 .DATAC>> + <TYPE? <2 .DATA> FIX> + <OR <0? <2 .DATA>> + <AND <TYPE? <2 .DATAC> FIX> <L? <2 .DATA> <2 .DATAC>>>>>> + +<DEFINE GET-SUB-DATA (NOD "AUX" SYM TNOD (NTYP <NODE-TYPE .NOD>)) + #DECL ((NOD TNOD) NODE (SYM) SYMTAB (NTYP) FIX) + <COND (<OR <==? .NTYP ,LVAL-CODE> <==? .NTYP ,SET-CODE>> + (<NODE-NAME .NOD> 0)) + (<AND <==? .NTYP ,REST-CODE> + <COND (<OR <==? <SET NTYP <NODE-TYPE <SET TNOD <1 <KIDS .NOD>>>>> + ,LVAL-CODE> + <==? .NTYP ,SET-CODE>> + <SET SYM <NODE-NAME .TNOD>>)>> + (.SYM <NODE-NAME <2 <KIDS .NOD>>>))>> + + +"ROUTINE TO DO BLT: AC1==> SOURCE + AC2==> START OF DEST + AC3==> END OF DEST." + +<DEFINE BLTAC (AC1 AC2 AC3 FLG SD) + #DECL ((AC3 AC1 AC2) AC (FLG) <OR FALSE ATOM> (SD) DATUM) + <EMIT <INSTRUCTION `HRLI `O* (<ADDRSYM .AC1>)>> + <EMIT <INSTRUCTION `HRRI `O* (<ADDRSYM .AC2>)>> + <EMIT <INSTRUCTION `BLT + `O* + <COND (.FLG 0) (ELSE -1)> + (<ADDRSYM .AC3>)>>> + +"HERE TO BLT WITH SOME KNOWLEDGE + AC1==> SOURCE + AC2==> START OF DEST + AC3==> NUMBER OF WORDS TO TRANSMIT" + +<DEFINE BLTAC+NUM (AC1 AC2 NUM FLG TPS DAT) + #DECL ((AC1 AC2) AC (NUM) FIX (FLG) <OR FALSE ATOM>) + <OR <==? .TPS UVECTOR> <SET NUM <* .NUM 2>>> + <MUNG-AC .AC1 .DAT> + <EMIT <INSTRUCTION `HRLI <ACSYM .AC1> (<ADDRSYM .AC1>)>> + <EMIT <INSTRUCTION `HRRI <ACSYM .AC1> (<ADDRSYM .AC2>)>> + <EMIT <INSTRUCTION `BLT + <ACSYM .AC1> + <COND (.FLG .NUM) (ELSE <- .NUM 1>)> + (<ADDRSYM .AC2>)>>> + +"HERE TO BLT BUT WITH A DATUM AS DEST SLOT" + +<DEFINE BLTAC+DAT (SAC TDAT NAC) + #DECL ((NAC SAC) AC (TDAT) DATUM) + <PUT .SAC ,ACPROT <>> + <SGETREG .SAC <>> + <EMIT <INSTRUCTION `HRLI <ACSYM .SAC> (<ADDRSYM .SAC>)>> + <EMIT <INSTRUCTION `HRR <ACSYM .SAC> !<ADDR:VALUE .TDAT>>> + <EMIT <INSTRUCTION `BLT <ACSYM .SAC> -1 (<ADDRSYM .NAC>)>>> + +"ROUTINE TO GENERATE CHECKS FOR THE CASE WHERE THE LENGTH IS KNOWN." + +<DEFINE KNOWN-CAREFUL-CHECK (SAC TPS NUM) + #DECL ((SAC) DATUM (TPS) ATOM (NUM) FIX) + <EMIT <INSTRUCTION `HLRE `O !<ADDR:VALUE .SAC>>> + <COND (<==? .TPS UVECTOR> <EMIT <INSTRUCTION `ADDI `O .NUM>>) + (<EMIT <INSTRUCTION `ADDI `O <* .NUM 2>>>)> + <EMIT <INSTRUCTION `JUMPG `O |COMPER >>> + +<DEFINE UNKNOWN-CAREFUL-CHECK (SAC NAC) + #DECL ((NAC) AC (SAC) DATUM) + <EMIT <INSTRUCTION `HLRE `O !<ADDR:VALUE .SAC>>> + <EMIT <INSTRUCTION `ADDI `O (<ADDRSYM .NAC>)>> + <EMIT <INSTRUCTION `JUMPG `O |COMPER >>> + +"ROUTINE TO REST A VECTOR/UVECTOR AND CHECK FOR BOUNDS + AC==> UV/V + TPS== PRIMTYPE + NUM== AMOUNT TO REST." + +<DEFINE REST-IT (AC NUM TPS) + #DECL ((AC) AC (TPS) ATOM (NUM) <OR FIX AC>) + <COND (<TYPE? .NUM AC> + <EMIT <INSTRUCTION `ADD <ACSYM .AC> <ADDRSYM .NUM>>>) + (ELSE + <COND (<==? .TPS UVECTOR>) (<SET NUM <* .NUM 2>>)> + <EMIT <INSTRUCTION `ADD <ACSYM .AC> [<FORM (.NUM) .NUM>]>>)> + <COND (.CAREFUL <RCHK .AC T>)>> + +<DEFINE BBLT (SAC DAC NUM OTHN TPS "AUX" (TG <MAKE:TAG>)) + #DECL ((AC1 AC2) AC (NUM) <OR FIX AC> (OTHN) <OR FALSE FIX>) + <COND (.OTHN + <EMIT <INSTRUCTION `MOVE + <ACSYM .DAC> + [<FORM (<ADDRSYM .SAC>) .OTHN>]>>) + (ELSE <EMIT <INSTRUCTION `HRLI <ACSYM .DAC> <ADDRSYM .SAC>>>)> + <COND (<N==? .TPS UVECTOR> <EMIT <INSTRUCTION `ADDI <ACSYM .SAC> 1>>)> + <EMIT <COND (<TYPE? .NUM FIX> <INSTRUCTION `HRLI <ACSYM .SAC> .NUM>) + (ELSE + <INSTRUCTION `HRLI + <ACSYM .SAC> + <COND (<==? .TPS UVECTOR> 1) (ELSE 2)> + (<ADDRSYM .NUM>)>)>> + <LABEL:TAG .TG> + <EMIT <INSTRUCTION `POP <ACSYM .SAC> `@ <ADDRSYM .DAC>>> + <EMIT <INSTRUCTION `TLNE <ACSYM .SAC> -1>> + <EMIT <INSTRUCTION `JRST .TG>>> + +<DEFINE UVECTOR-MUNG-SB (SDAT TAC "AUX" SAC) + #DECL ((SDAT) DATUM (TAC SAC) AC) + <TOACV .SDAT> + <SET SAC <DATVAL .SDAT>> + <EMIT <INSTRUCTION `HLRE `O* <ADDRSYM .SAC>>> + <EMIT <INSTRUCTION `SUB <ACSYM .SAC> `O* >> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O* (<ADDRSYM .SAC>)>> + <EMIT <INSTRUCTION PUTYP!-OP!-PACKAGE `O* (<ADDRSYM .TAC>)>> + <PUT .TAC ,ACPROT <>>> +<ENDPACKAGE> diff --git a/<mdl.comp>/comtem.mud.2 b/<mdl.comp>/comtem.mud.2 new file mode 100644 index 0000000..8894fb4 --- /dev/null +++ b/<mdl.comp>/comtem.mud.2 @@ -0,0 +1,361 @@ +<PACKAGE "COMTEM"> + +<ENTRY TEMPLATE-NTH TEMPLATE-PUT GET:TEMPLATE:LENGTH> + +<USE "CODGEN" "CACS" "CHKDCL" "COMCOD" "COMPDEC"> + +<DEFINE TEMPLATE-NTH (NOD WHERE TYP TPS NK NNUM STRN NUMN + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) EX1 EX2 + "AUX" RLEN COMPLFORM (DIR1 .DIR) + (FLS <==? .WHERE FLUSHED>) + (B2 <COND (.BRANCH .BRANCH) (ELSE <MAKE:TAG>)>) + (TTYPE <GET <SET TYP <ISTYPE? .TYP>> TEMPLATE-DATA>) + DEST (NORMUSE <1 .TTYPE>) (RESTUSE <2 .TTYPE>) + (RX <GEN .STRN <DATUM .TYP ANY-AC>>) RUSE LENCOMB PC + TYPER PCA BITR IDX AC1 AC2) + #DECL ((B2 TYPER) ATOM (AC1 AC2) <PRIMTYPE WORD> + (NNUM RLEN LENCOMB PC PCA IDX) FIX (DEST) <LIST <PRIMTYPE WORD>> + (RX RUSE) DATUM (TTYPE) <VECTOR [2 LIST] [2 FIX] ANY [2 FIX]> + (RESTUSE NORMUSE) <LIST [REST LIST]> (COMPLFORM) <LIST ATOM [4 FIX]> + (STRN NOD) NODE) + <AND .NOTF <SET DIR <NOT .DIR>>> + <COND (<G? .NNUM <3 .TTYPE>> + <COND (<0? <4 .TTYPE>> <MESSAGE ERROR TEMPLATE-OVERFLOW!-ERRORS>)> + <SET RLEN <+ 1 <MOD <- .NNUM 1 <3 .TTYPE>> <4 .TTYPE>>>> + <SET COMPLFORM <NTH .RESTUSE .RLEN>> + <SET COMPLFORM + (<1 .COMPLFORM> + <2 .COMPLFORM> + <3 .COMPLFORM> + <+ <4 .COMPLFORM> + <* <7 .TTYPE> + <COND (<G? <- </ <- .NNUM <3 .TTYPE>> <4 .TTYPE>> 1> 0> + <- </ <- .NNUM <3 .TTYPE>> <4 .TTYPE>> 1>) + (ELSE 0)>>> + <5 .COMPLFORM>)>) + (ELSE <SET COMPLFORM <NTH .NORMUSE .NNUM>>)> + <SET RUSE + <GOODACS .NOD <COND (.FLS DONT-CARE) (ELSE .WHERE)>>> + <SET TYPER <1 .COMPLFORM>> + <SET PCA <3 .COMPLFORM>> + <SET PC <5 .COMPLFORM>> + <SET LENCOMB <2 .COMPLFORM>> + <SET DEST (<ADDRSYM <DATVAL .RX>>)> + <COND (<AND <NOT <==? .LENCOMB 72>> + <NOT <1? .LENCOMB>> + <NOT <==? .LENCOMB 36>>> + <COND (<==? <DATVAL .RUSE> ANY-AC> + <PUT .RUSE ,DATVAL <GETREG .RUSE>>) + (ELSE <SGETREG <DATVAL .RUSE> .RUSE>)> + <SET AC2 <ACSYM <DATVAL .RUSE>>>)> + <COND (<5 .TTYPE> + <SET IDX <+ <4 .COMPLFORM> 1>> + <MUNG-AC <DATVAL .RX> .RX> + <EMIT <INSTRUCTION `LDB `O [<FORM (74816) 1 .DEST>]>> + <EMIT <INSTRUCTION `SUB <ACSYM <DATVAL .RX>> `O >>) + (ELSE <SET IDX <- <4 .COMPLFORM> <6 .TTYPE>>>)> + <COND (<OR <AND <NOT <==? .LENCOMB 72>> <G? .LENCOMB 36>> + <AND <==? .LENCOMB 36> <NOT <0? .PCA>>>> + <COND (<==? <DATTYP .RUSE> ANY-AC> + <PUT .RUSE ,DATTYP <GETREG .RUSE>>) + (ELSE <SGETREG <DATTYP .RUSE> .RUSE>)> + <SET AC1 <ACSYM <DATTYP .RUSE>>>)> + <TOACV .RX> + <SET DEST (<ADDRSYM <DATVAL .RX>>)> + <COND + (<==? .LENCOMB 72> + <COND (<NOT .FLS> + <COND (<AND .BRANCH .NOTF> + <SET WHERE <MOVE:ARG <REFERENCE .DIR1> .RUSE>>) + (ELSE + <PUT .RUSE ,DATTYP <OFFPTR .IDX .RX .TYP>> + <PUT .RUSE ,DATVAL <OFFPTR .IDX .RX .TYP>> + <SET WHERE <MOVE:ARG .RUSE .WHERE>>)>)> + <COND (.BRANCH + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE + `O + .IDX + (!<ADDR:VALUE .RX>)>> + <EMIT <INSTRUCTION <COND (.DIR `CAIE ) (ELSE `CAIN )> + `O + '<TYPE-CODE!-OP!-PACKAGE FALSE>>> + <BRANCH:TAG .BRANCH>)> + <COND (<OR .FLS <AND .BRANCH .NOTF>> <RET-TMP-AC .RX>)>) + (<NOT <0? .PCA>> + <COND (<==? .LENCOMB 36> + <EMIT <INSTRUCTION `MOVE .AC2 .IDX .DEST>> + <RET-TMP-AC .RX> + <EMIT <INSTRUCTION `HRLI .AC1 '<TYPE-CODE!-OP!-PACKAGE STRING>>> + <EMIT <INSTRUCTION `HRRI .AC1 .PCA>>) + (ELSE + <PUT .RUSE ,DATTYP .TYPER> + <COND (<==? .PC 36> <EMIT <INSTRUCTION `HLR .AC2 .IDX .DEST>>) + (ELSE <EMIT <INSTRUCTION `HRR .AC2 .IDX .DEST>>)> + <RET-TMP-AC .RX> + <EMIT <INSTRUCTION `HRLI + .AC2 + <COND (<==? .TYPER UVECTOR> <- .PCA>) + (ELSE <* -2 .PCA>)>>>)>) + (<==? .LENCOMB 54> + <COND (<==? .PC 36> + <EMIT <INSTRUCTION `MOVE .AC2 .IDX .DEST>> + <EMIT <INSTRUCTION `HLR .AC1 <+ .IDX 1> .DEST>>) + (ELSE + <EMIT <INSTRUCTION `MOVE .AC2 <+ .IDX 1> .DEST>> + <EMIT <INSTRUCTION `HRR .AC1 .IDX .DEST>>)> + <EMIT <INSTRUCTION `HRLI .AC1 '<TYPE-CODE!-OP!-PACKAGE STRING>>> + <RET-TMP-AC .RX>) + (<==? .LENCOMB 36> + <PUT .RUSE ,DATTYP .TYPER> + <PUT .RUSE ,DATVAL <OFFPTR <- .IDX 1> .RX .TYP>>) + (<==? .LENCOMB 18> + <PUT .RUSE ,DATTYP .TYPER> + <COND (<AND <==? .TYPER FALSE> .FLS>) + (<EMIT <INSTRUCTION <COND (<==? .PC 36> + <COND (<==? .TYPER FIX> `HLRE ) + (<==? .TYPER FLOAT> `HLLZ ) + (ELSE `HLRZ )>) + (ELSE + <COND (<==? .TYPER FIX> `HRRE ) + (<==? .TYPER FLOAT> `HRLZ ) + (ELSE `HRRZ )>)> + .AC2 + .IDX + .DEST>>)> + <COND (<==? .TYPER FALSE> + <COND (<NOT .FLS> <SET WHERE <MOVE:ARG .RUSE .WHERE>>)> + <COND (<AND .BRANCH <NOT .DIR>> <BRANCH:TAG .BRANCH>)>)>) + (<1? .LENCOMB> + <EMIT <INSTRUCTION `MOVE `O .IDX .DEST>> + <SET BITR + <BITS 1 <COND (<G? .PC 18> <- .PC 19>) (ELSE <- .PC 1>)>>> + <SET BITR + <PUTBITS #WORD *000000000000* .BITR #WORD *777777777777*>> + <RET-TMP-AC .RX> + <COND (<OR <AND <NOT .DIR> <NOT .BRANCH> <NOT .FLS>> + <AND <NOT .DIR1> <NOT .FLS>>> + <RET-TMP-AC <MOVE:ARG <REFERENCE <>> .RUSE>>)> + <COND (<G? .PC 18> <EMIT <INSTRUCTION `TLNN `O .BITR>>) + (ELSE <EMIT <INSTRUCTION `TRNN `O .BITR>>)> + <SET BITR <MAKE:TAG>> + <COND (<NOT .DIR> <BRANCH:TAG .B2>) + (ELSE <BRANCH:TAG .BITR>)> + <COND (<OR <AND <NOT .DIR> <NOT .BRANCH> <NOT .FLS>> + <AND .DIR1 <NOT .FLS>>> + <MOVE:ARG <REFERENCE T> .RUSE>)> + <COND (<AND .DIR .BRANCH> <BRANCH:TAG .B2>)> + <LABEL:TAG .BITR> + <COND (<NOT .BRANCH> <LABEL:TAG .B2>)>) + (ELSE + <PUT .RUSE ,DATTYP .TYPER> + <EMIT <INSTRUCTION `LDB + .AC2 + <BYTE <- .PC .LENCOMB> .LENCOMB .IDX .DEST>>>)> + <COND (<NOT <OR <NOT <0? .PCA>> + <G? .LENCOMB 36> + <1? .LENCOMB> + <==? .LENCOMB 36>>> + <RET-TMP-AC .RX>)> + <COND (<AND <NOT <==? .LENCOMB 72>> <NOT <==? .TYPER FALSE>>> + <MOVE:ARG .RUSE .WHERE>) + (ELSE .WHERE)>> + +\ + +<DEFINE TEMPLATE-PUT (NOD WHERE TYP TPS NK NNUM SNOD NNOD VNOD + "OPTIONAL" EX1 EX2 + "AUX" CK YDAT XDAT RLEN DEST COMPLFORM XTP VDAT + (TTYPE <GET <SET TYP <ISTYPE? .TYP>> TEMPLATE-DATA>) + (NORMUSE <1 .TTYPE>) (RESTUSE <2 .TTYPE>) + (RX <GEN .SNOD <GOODACS .NOD .WHERE>>) LENCOMB PC + TYPER PCA BITR IDX AC1 AC2 TT) + #DECL ((PCA NNUM PC IDX LENCOMB RLEN) FIX (TYPER) ATOM + (AC1 AC2) <PRIMTYPE WORD> (DEST) <LIST <PRIMTYPE WORD>> + (RX XDAT YDAT VDAT) DATUM (RESTUSE NORMUSE) <LIST [REST LIST]> + (TTYPE) <VECTOR [2 LIST] [2 FIX] ANY [2 FIX]> + (COMPLFORM) <LIST ATOM [4 FIX]> (SNOD VNOD NOD) NODE) + <COND (<G? .NNUM <3 .TTYPE>> + <COND (<0? <4 .TTYPE>> <MESSAGE ERROR TEMPLATE-OVERFLOW!-ERRORS>)> + <SET RLEN <+ 1 <MOD <- .NNUM 1 <3 .TTYPE>> <4 .TTYPE>>>> + <SET COMPLFORM <NTH .RESTUSE .RLEN>> + <SET COMPLFORM + (<1 .COMPLFORM> + <2 .COMPLFORM> + <3 .COMPLFORM> + <+ <4 .COMPLFORM> + <* <7 .TTYPE> + <COND (<G? <- </ <- .NNUM <3 .TTYPE>> <4 .TTYPE>> 1> 0> + <- </ <- .NNUM <3 .TTYPE>> <4 .TTYPE>> 1>) + (ELSE 0)>>> + <5 .COMPLFORM>)>) + (ELSE <SET COMPLFORM <NTH .NORMUSE .NNUM>>)> + <SET LENCOMB <2 .COMPLFORM>> + <SET TYPER <1 .COMPLFORM>> + <SET PCA <3 .COMPLFORM>> + <SET PC <5 .COMPLFORM>> + <TOACV .RX> + <SET DEST (<ADDRSYM <DATVAL .RX>>)> + <COND (<SET CK <5 .TTYPE>> + <SET IDX <+ <4 .COMPLFORM> 1>> + <COND (<AND <5 .TTYPE> <N==? .WHERE FLUSHED>> + <PUT <DATVAL .RX> ,ACPROT T> + <SET YDAT <DATUM .TYP ANY-AC>> + <PUT .YDAT ,DATVAL <GETREG .YDAT>> + <EMIT <INSTRUCTION `MOVE + <ACSYM <DATVAL .YDAT>> + <ADDRSYM <DATVAL .RX>>>> + <PUT <DATVAL .RX> ,ACPROT <>>)>) + (ELSE <SET IDX <- <4 .COMPLFORM> <6 .TTYPE>>>)> + <SET XTP <ISTYPE? <RESULT-TYPE .VNOD>>> + <COND + (<NOT <1? .LENCOMB>> + <SET VDAT + <GEN .VNOD + <DATUM <COND (<NOT <ISTYPE-GOOD? .XTP>> ANY-AC) (ELSE .XTP)> + ANY-AC>>> + <COND + (<AND <NOT <==? .LENCOMB 72>> + <SET XTP <ISTYPE? <RESULT-TYPE .VNOD>>>> + <COND (<NOT <OR <==? .TYPER .XTP> <1? .LENCOMB>>> + <MESSAGE ERROR TEMPLATE-TYPE-ERROR-PUT!-ERRORS>)>) + (ELSE + <COND (<AND .CAREFUL + <NOT <==? .TYPER ANY>> + <NOT <==? <RESULT-TYPE .VNOD> .TYPER>>> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O !<ADDR:TYPE .VDAT>>> + <EMIT <INSTRUCTION `CAIE + `O + <FORM TYPE-CODE!-OP!-PACKAGE .TYPER>>> + <BRANCH:TAG |COMPER >)>)>)> + <TOACV .RX> + <SET DEST (<ADDRSYM <DATVAL .RX>>)> + <COND (<AND .CK <NOT <1? .LENCOMB>>> + <MUNG-AC <DATVAL .RX> .RX> + <EMIT <INSTRUCTION `LDB `O [<FORM (74816) 1 .DEST>]>> + <EMIT <INSTRUCTION `SUB <ACSYM <DATVAL .RX>> `O >>)> + <COND (<NOT <1? .LENCOMB>> <SET AC2 <ACSYM <DATVAL .VDAT>>>)> + <COND + (<==? .LENCOMB 72> + <TOACT .VDAT> + <EMIT <INSTRUCTION `MOVEM <ACSYM <DATTYP .VDAT>> .IDX .DEST>> + <RET-TMP-AC <DATTYP .VDAT> .VDAT> + <EMIT <INSTRUCTION `MOVEM .AC2 <+ .IDX 1> .DEST>>) + (<NOT <0? .PCA>> + <COND (<==? .LENCOMB 36> + <COND (.CAREFUL + <EMIT `HRRZ `O !<ADDR:TYPE .VDAT>> + <EMIT <INSTRUCTION `CAIE <ACSYM <DATTYP .VDAT>> .PCA>> + <BRANCH:TAG |COMPER >)> + <EMIT <INSTRUCTION `MOVEM .AC2 .IDX .DEST>>) + (ELSE + <COND (.CAREFUL + <EMIT <INSTRUCTION `HLRZ `O <ADDRSYM <DATVAL .VDAT>>>> + <EMIT <INSTRUCTION `CAIE + `O + <COND (<==? .TYPER UVECTOR> <- .PCA>) + (ELSE <* -2 .PCA>)>>> + <BRANCH:TAG |COMPER >)> + <EMIT <INSTRUCTION <COND (<==? .PC 36> `HRLM ) (ELSE `HRRM )> + .AC2 + .IDX + .DEST>>)>) + (<==? .LENCOMB 54> + <TOACT .VDAT> + <COND (<==? .PC 36> + <EMIT <INSTRUCTION `MOVEM .AC2 .IDX .DEST>> + <EMIT <INSTRUCTION `HRLM + <ACSYM <DATTYP .VDAT>> + <+ .IDX 1> + .DEST>> + <RET-TMP-AC <DATTYP .VDAT> .VDAT>) + (ELSE + <EMIT <INSTRUCTION `MOVEM .AC2 <+ .IDX 1> .DEST>> + <EMIT <INSTRUCTION `HRRM <ACSYM <DATTYP .VDAT>> .IDX .DEST>> + <RET-TMP-AC <DATTYP .VDAT> .VDAT>)> + <RET-TMP-AC <DATTYP .VDAT> .VDAT>) + (<==? .LENCOMB 36> + <EMIT <INSTRUCTION `MOVEM .AC2 .IDX .DEST>>) + (<==? .LENCOMB 18> + <EMIT <INSTRUCTION <COND (<==? .PC 36> + <COND (<==? .TYPER FLOAT> `HLLM ) (ELSE `HRLM )>) + (ELSE + <COND (<==? .TYPER FLOAT> `HLRM ) + (ELSE `HRRM )>)> + .AC2 + .IDX + .DEST>>) + (<1? .LENCOMB> + <SET BITR <BITS 1 <- .PC 1>>> + <SET BITR + <PUTBITS #WORD *000000000000* .BITR #WORD *777777777777*>> + <SET VDAT <GEN .VNOD DONT-CARE>> + <TOACV .RX> + <SET DEST (<ADDRSYM <DATVAL .RX>>)> + <COND (.CK + <MUNG-AC <DATVAL .RX> .RX> + <EMIT <INSTRUCTION `LDB `O [<FORM (74816) 1 .DEST>]>> + <EMIT <INSTRUCTION `SUB <ACSYM <DATVAL .RX>> `O >>)> + <COND (<NOT .XTP> + <SET XDAT <DATUM FIX ANY-AC>> + <PUT <DATVAL .RX> ,ACPROT T> + <PUT .XDAT ,DATVAL <GETREG .XDAT>> + <PUT <DATVAL .RX> ,ACPROT <>> + <SET TT <ACSYM <DATVAL .XDAT>>>) + (ELSE <RET-TMP-AC .VDAT> <SET TT 0>)> + <EMIT <INSTRUCTION `MOVE .TT [.BITR]>> + <COND (.XTP + <EMIT <INSTRUCTION <COND (<==? .XTP FALSE> `ANDCAM ) (ELSE `IORM )> + .TT + .IDX + .DEST>>) + (ELSE + <D:B:TAG <SET BITR <MAKE:TAG>> .VDAT T <RESULT-TYPE .VNOD>> + <RET-TMP-AC .XDAT> + <EMIT <INSTRUCTION `ANDCAM .TT .IDX .DEST>> + <EMIT '<`SKIPA >> + <LABEL:TAG .BITR> + <RET-TMP-AC .VDAT> + <EMIT <INSTRUCTION `IORM .TT .IDX .DEST>>)>) + (ELSE + <EMIT <INSTRUCTION `DPB + .AC2 + <BYTE <- .PC .LENCOMB> .LENCOMB .IDX .DEST>>>)> + <COND (<NOT <1? .LENCOMB>> <RET-TMP-AC .VDAT>)> + <COND (<NOT <5 .TTYPE>> <MOVE:ARG .RX .WHERE>) + (<N==? .WHERE FLUSHED> + <RET-TMP-AC .RX> + <MOVE:ARG .YDAT .WHERE>) + (ELSE <MOVE:ARG .RX .WHERE>)>> + +"ROUTINE TO FIND THE LENGTH OF A TEMPLATE" + +<DEFINE GET:TEMPLATE:LENGTH (NM DAT NDAT "AUX" (TD <GET .NM TEMPLATE-DATA>)) + #DECL ((NM) ATOM (TD) <OR FALSE <VECTOR [2 LIST] [5 ANY]>> + (NDAT) <OR <DATUM ANY AC> AC>) + <COND (<NOT .TD> + <MESSAGE INCONSISTENCY "TEMPLATE DATA NOT AVAIABLE">)> + <COND + (<NOT <5 .TD>> + <MESSAGE WARNING "ASKING LENGTH OF CONSTANT TEMPLATE"> + <EMIT <INSTRUCTION `MOVEI + <ACSYM <COND (<TYPE? .NDAT DATUM> <DATVAL .NDAT>) + (ELSE .NDAT)>> + <LENGTH <1 .TD>>>>) + (ELSE + <EMIT <INSTRUCTION `MOVE + <ACSYM <COND (<TYPE? .NDAT DATUM> <DATVAL .NDAT>) + (ELSE .NDAT)>> + !<ADDR:VALUE1 + <COND (<TYPE? .DAT DATUM> <DATVAL .DAT>)>>>> + <EMIT <INSTRUCTION `HRRZ + <ACSYM <COND (<TYPE? .NDAT DATUM> <DATVAL .NDAT>) + (ELSE .NDAT)>> + (<ADDRSYM <COND (<TYPE? .NDAT DATUM> + <DATVAL .NDAT>) + (ELSE .NDAT)>>) + <COND (<EMPTY? <2 .TD>> 0) (ELSE -1)>>>)>> + +<DEFINE BYTE (BOUND SIZE "TUPLE" LOC) + [<FORM (<+ <* .BOUND 4096> <* .SIZE 64>>) !.LOC>]> + +<ENDPACKAGE> diff --git a/<mdl.comp>/confor.mud.1 b/<mdl.comp>/confor.mud.1 new file mode 100644 index 0000000..a9dddc2 --- /dev/null +++ b/<mdl.comp>/confor.mud.1 @@ -0,0 +1,88 @@ + +<DEFINE CONFORM (R1 R2 T1 T2 + "AUX" (X <3 .T1>) (Y <3 .T2>) (AR1 <TYPE? <DATVAL .R1> AC>) M1 + M2 (AR2 <TYPE? <DATVAL .R2> AC>) AC (VAL <>)) + #DECL ((T1 T2) TRANS (X Y) <UVECTOR [7 FIX]> (R1 R2) DATUM (AC) AC + (M1 M2) FIX) + <SET AC <COND (.AR1 <DATVAL .R1>) (ELSE <DATVAL .R2>)>> + <COND (<N==? <7 .X> <7 .Y>> + <COND (<0? <7 .X>> <HWSH .R2 .R1 <6 .X>>) + (ELSE <HWSH .R1 .R2 <6 .Y>>)>) + (<N==? <6 .X> <6 .Y>> + <COND (<0? <6 .X>> <HWH .R2 .R1>) (ELSE <HWH .R1 .R2>)>)> + <COND (<N==? <1 .X> <1 .Y>> + <AND <NOT <0? <1 .Y>>> <SET VAL T>> + <MUNG-AC .AC <COND (.AR1 .R1)(ELSE .R2)>> + <EMIT <INSTRUCTION `MOVNS <ADDRSYM .AC>>>) + (<NOT <0? <1 .X>>> <SET VAL T>)> + <COND (<OR <NOT <0? <4 .X>>> <NOT <0? <4 .Y>>>> + <SET M1 <M* <4 .X> <4 .Y> <5 .X> <5 .Y>>> + <SET M2 <M* <4 .Y> <4 .X> <5 .Y> <5 .X>>> + <COND (<AND <G=? .M1 .M2> <0? <MOD .M1 .M2>>> + <SET M1 </ .M1 .M2>> + <SET M2 1>) + (<AND <G? .M2 .M1> <0? <MOD .M2 .M1>>> + <SET M2 </ .M2 .M1>> + <SET M1 1>)> + <COND (<NOT <1? .M1>> + <TOACV .R2> + <MUNG-AC <DATVAL .R2> .R2> + <IMCHK '(`IMUL `IMULI ) + <ACSYM <DATVAL .R2>> + <REFERENCE:ADR .M1>>)> + <COND (<NOT <1? .M2>> + <TOACV .R1> + <MUNG-AC <DATVAL .R1> .R1> + <IMCHK '(`IMUL `IMULI ) + <ACSYM <DATVAL .R1>> + <REFERENCE:ADR .M2>>)>)> + <COND (<AND <OR <NOT <0? <2 .X>>> <NOT <0? <2 .Y>>>> + <NOT <0? <SET M1 <- <3 .X> <3 .Y>>>>>> + <COND (<TYPE? <DATVAL .R2> AC> + <MUNG-AC <DATVAL .R2> .R2> + <IMCHK <COND (<L? .M1 0> <SET M1 <- .M1>> '(`SUB + `SUBI )) + (ELSE '(`ADD `ADDI ))> + <ACSYM <DATVAL .R2>> + <REFERENCE:ADR .M1>>) + (ELSE + <TOACV .R1> + <MUNG-AC <DATVAL .R1> .R1> + <IMCHK <COND (<L? .M1 0> <SET M1 <- .M1>> '(`ADD + `ADDI )) + (ELSE '(`SUB `SUBI ))> + <ACSYM <DATVAL .R1>> + <REFERENCE:ADR .M1>>)>)> + .VAL> + +<DEFINE M* (A B C D) + #DECL ((A B C D) FIX) + <* <COND (<OR <==? .A 1> <==? .A 2>> .C) (ELSE 1)> + <COND (<OR <==? .B 3> <==? .B 4>> .D) (ELSE 1)>>> + +<DEFINE HWSH (R1 R2 HW) + #DECL ((R1 R2) DATUM (HW) FIX) + <COND (<NOT <0? .HW>> + <COND (<TYPE? <DATVAL .R1> AC> + <MUNG-AC <DATVAL .R1> .R1> + <EMIT <INSTRUCTION `HLRZS <ADDRSYM <DATVAL .R1>>>>) + (ELSE + <MUNG-AC <DATVAL .R2> .R2> + <EMIT <INSTRUCTION `MOVSS <ADDRSYM <DATVAL .R2>>>>)>) + (ELSE + <COND (<TYPE? <DATVAL .R1> AC> + <MUNG-AC <DATVAL .R1> .R1> + <EMIT <INSTRUCTION `HLRES <ADDRSYM <DATVAL .R1>>>>) + (ELSE + <MUNG-AC <DATVAL .R2> .R2> + <EMIT <INSTRUCTION `MOVSS <ADDRSYM <DATVAL .R2>>>>)>)>> + +<DEFINE HWH (R1 R2) + #DECL ((R1 R2) DATUM) + <COND (<TYPE? <DATVAL .R1> AC> + <MUNG-AC <DATVAL .R1> .R1> + <EMIT <INSTRUCTION `HRRES <ADDRSYM <DATVAL .R1>>>>) + (ELSE + <MUNG-AC <DATVAL .R2> .R2> + <EMIT <INSTRUCTION `ANDI <ACSYM <DATVAL .R2>> 262143>>)>> +  \ No newline at end of file diff --git a/<mdl.comp>/cprint.mud.1 b/<mdl.comp>/cprint.mud.1 new file mode 100644 index 0000000..4ffd540 --- /dev/null +++ b/<mdl.comp>/cprint.mud.1 @@ -0,0 +1,145 @@ + +<DEFINE PRINT-ANA (N R "AUX" (K <KIDS .N>) (LN <LENGTH .K>) RT) + #DECL ((N) NODE (LN) FIX (K) <LIST [REST NODE]>) + <COND (<SEGFLUSH .N .R>) + (ELSE + <ARGCHK .LN '(1 2) <NODE-NAME .N>> + <SET RT <EANA <1 .K> ANY <NODE-NAME .N>>> + <COND (<1? .LN> + <PUTREST .K (<NODEFM ,SUBR-CODE .N ANY LVAL () ,LVAL>)> + <PUT <2 .K> + ,KIDS + (<NODE1 ,QUOTE-CODE <2 .K> ATOM OUTCHAN ()>)>)> + <EANA <2 .K> CHANNEL <NODE-NAME .N>> + <PUT .N ,NODE-TYPE ,PRINT-CODE> + <TYPE-OK? .RT .R>)>> + +<DEFINE FLATSIZE-ANA (N R "AUX" (K <KIDS .N>) (LN <LENGTH .K>)) + #DECL ((N) NODE (K) <LIST [REST NODE]> (LN) FIX) + <COND (<SEGFLUSH .N .R>) + (ELSE + <ARGCHK .LN '(2 3) FLATSIZE> + <EANA <1 .K> ANY FLATSIZE> + <EANA <2 .K> FIX FLATSIZE> + <COND (<==? .LN 2> + <PUTREST <REST .K> (<NODE1 ,QUOTE-CODE .N FIX 10 ()>)>)> + <EANA <3 .K> FIX FLATSIZE> + <PUT .N ,NODE-TYPE ,ISUBR-CODE> + <TYPE-OK? '<OR FIX FALSE> .R>)>> + +<DEFINE UNPARSE-ANA (N R "AUX" (K <KIDS .N>) (LN <LENGTH .K>)) + #DECL ((N) NODE (K) <LIST [REST NODE]>) + <COND (<SEGFLUSH .N .R>) + (ELSE + <ARGCHK .LN '(1 2) UNPARSE> + <EANA <1 .K> ANY UNPARSE> + <COND (<1? .LN> <PUTREST .K (<NODE1 ,QUOTE-CODE .N FIX 10 ()>)>)> + <EANA <2 .K> FIX UNPARSE> + <PUT .N ,NODE-TYPE ,ISUBR-CODE> + <TYPE-OK? STRING .R>)>> + +<DEFINE TERPRI-ANA (N R "AUX" (K <KIDS .N>) (LN <LENGTH .K>)) + #DECL ((N) NODE (K) <LIST [REST NODE]> (LN) FIX) + <COND (<SEGFLUSH .N .R>) + (ELSE + <ARGCHK .LN '(0 1) TERPRI> + <COND (<0? .LN> + <PUT .N + ,KIDS + <SET K (<NODEFM ,SUBR-CODE .N ANY LVAL () ,LVAL>)>> + <PUT <1 .K> + ,KIDS + (<NODE1 ,QUOTE-CODE <1 .K> ATOM OUTCHAN ()>)>)> + <EANA <1 .K> CHANNEL TERPRI> + <PUT .N ,NODE-TYPE ,ISUBR-CODE> + <TYPE-OK? <COND (<==? <NODE-SUBR .N> ,CRLF> ATOM) (ELSE FALSE)> .R>)>> + +<DEFINE READCHR-ANA (N R "AUX" (K <KIDS .N>) (LN <LENGTH .K>)) + #DECL ((N) NODE (LN) FIX) + <COND (<SEGFLUSH .N .R>) + (ELSE + <ARGCHK .LN '(0 1) <NODE-NAME .N>> + <COND (<0? .LN> + <PUT .N + ,KIDS + <SET K (<NODEFM ,SUBR-CODE .N ANY LVAL () ,LVAL>)>> + <PUT <1 .K> + ,KIDS + (<NODE1 ,QUOTE-CODE <1 .K> ATOM INCHAN ()>)>)> + <EANA <1 .K> CHANNEL <NODE-NAME .N>> + <PUT .N ,NODE-TYPE ,ISUBR-CODE> + <TYPE-OK? ANY .R>)>> + +<PUT ,READCHR ANALYSIS ,READCHR-ANA> + +<PUT ,NEXTCHR ANALYSIS ,READCHR-ANA> + +<PUT ,PRINC ANALYSIS ,PRINT-ANA> + +<PUT ,PRIN1 ANALYSIS ,PRINT-ANA> + +<PUT ,PRINT ANALYSIS ,PRINT-ANA> + +<PUT ,FLATSIZE ANALYSIS ,FLATSIZE-ANA> + +<PUT ,UNPARSE ANALYSIS ,UNPARSE-ANA> + +<PUT ,TERPRI ANALYSIS ,TERPRI-ANA> + +<PUT ,CRLF ANALYSIS ,TERPRI-ANA> + +<DEFINE PRINT-GEN (N W + "AUX" (K <KIDS .N>) (OB <1 .K>) (CH <2 .K>) + (RT <ISTYPE? <RESULT-TYPE .OB>>) + (PCOD <LENGTH <MEMQ <NODE-SUBR .N> ,PRINTERS>>) DAT + CDAT) + #DECL ((N OB CH) NODE (K) <LIST [REST NODE]> (PCOD) FIX (DAT CDAT) DATUM) + <SET DAT + <GEN .OB + <COND (<SIDE-EFFECTS .CH> <DATUM ,AC-C ,AC-D>) + (ELSE DONT-CARE)>>> + <SET PCOD + <+ <COND (<==? .RT ATOM> 3) + (<==? .RT STRING> 6) + (<==? .RT CHARACTER> 9) + (ELSE 0)> + .PCOD>> + <COND (<OR <==? <DATTYP .DAT> ,AC-A> + <==? <DATVAL .DAT> ,AC-A> + <==? <DATTYP .DAT> ,AC-B> + <==? <DATVAL .DAT> ,AC-B>> + <SET DAT + <MOVE:ARG + .DAT + <DATUM <COND (<AND <TYPE? <DATTYP .DAT> ATOM> + <ISTYPE? <DATTYP .DAT>>> + <DATTYP .DAT>) + (ELSE ,AC-C)> + ,AC-D>>>)> + <SET CDAT <GEN .CH <DATUM ,AC-A ,AC-B>>> + <SET DAT <MOVE:ARG .DAT + <DATUM <COND (<OR <==? .RT ATOM> <==? .PCOD 12>> .RT) + (ELSE ,AC-C)> + ,AC-D>>> + <RET-TMP-AC <MOVE:ARG .CDAT <DATUM ,AC-A ,AC-B>>> + <RET-TMP-AC .DAT> + <REGSTO T> + <EMIT <INSTRUCTION `PUSHJ `P* <NTH ,IPRINTERS .PCOD>>> + <MOVE:ARG <FUNCTION:VALUE T> .W>> + +<SETG PRINTERS ![,PRINC ,PRIN1 ,PRINT!]> + +<SETG IPRINTERS + ![|CIPRIN + |CIPRN1 + |CIPRNC + |CPATM + |CP1ATM + |CPCATM + |CPSTR + |CP1STR + |CPCSTR + |CIPRIN + |CIPRN1 + |CPCH!]> +  \ No newline at end of file diff --git a/<mdl.comp>/cup.mud.57 b/<mdl.comp>/cup.mud.57 new file mode 100644 index 0000000..c2bdd5d --- /dev/null +++ b/<mdl.comp>/cup.mud.57 @@ -0,0 +1,598 @@ +<PACKAGE "CUP"> + +<ENTRY CUP STORE:VAR STORE:TVAR CREATE-TMP KILL:STORE EMIT-PRE END-FRAME PRE + STORE-TMP BEGIN-FRAME CDUP EXP-MAC ZTMPLST PRIN-SET> + +<USE "COMPDEC" "COMCOD"> + +<FLOAD "PUREQ.NBIN"> + +"AN SCL IS A TEMPORARY. IT IS REPLACED BY A FIX WHICH IS A OFFSET OFF THE BASE OF THE + TEMPORARIES IN THE CODE UPDATE PASS" + +<NEWTYPE SCL WORD> + +"A PFRAME IS A PSEUDO-FRAME GENERATED BY A PROG/REPEAT/MAPF/MAPR/FUNCTION. IT CONTAINS + INFORMATION FOR CUP'S USE." + +<NEWTYPE PFRAME + VECTOR + '<<PRIMTYPE VECTOR> ATOM + <OR ATOM FALSE> + <OR ATOM FALSE> + LIST + LIST + FIX + LIST>> + +<MANIFEST NAME-PF ACT-PF PRE-PF TEMPS-PF KIDS-PF NTEMPS-PF TMP-STR-PF> + +<SETG NAME-PF 1> + +<SETG ACT-PF 2> + +<SETG PRE-PF 3> + +<SETG TEMPS-PF 4> + +<SETG KIDS-PF 5> + +<SETG NTEMPS-PF 6> + +<SETG TMP-STR-PF 7> + +"A TEMPB DESCRIBES A TEMPORARY" + +<NEWTYPE TEMPB + VECTOR + '<<PRIMTYPE VECTOR> SCL LIST FIX FIX FIX <OR ATOM FALSE> LIST>> + +<MANIFEST ID-TMP REF-TMP LOC-TMP HI-TMP LO-TMP TYP-TMP STORE-TEMP> + +<SETG ID-TMP 1> + +<SETG REF-TMP 2> + +<SETG LOC-TMP 5> + +<SETG HI-TMP 3> + +<SETG LO-TMP 4> + +<SETG TYP-TMP 6> + +<SETG STORE-TEMP 7> + + +<MANIFEST BEGIN:FRAME + END:FRAME + CREATE:TEMP + EMIT:PRE + STORE:TMP + STORE:VAR + STORE:TVAR + KILL:STORE> + +<SETG BEGIN:FRAME 1> + +<SETG END:FRAME 2> + +<SETG CREATE:TEMP 3> + +<SETG EMIT:PRE 5> + +<SETG STORE:VAR 4> + +<SETG STORE:TVAR 8> + +<SETG KILL:STORE 7> + +<SETG STORE:TMP 6> + +"BEGIN-FRAME STARTS A FRAME. IT TAKES 3 ARGUMENTS: + 1) ATOM LATER SETG'd TO LENGTH OF TEMPORARY BLOCK + 2) FLAG INDICATING WHETHER THE FRAME IS ACTIVATED + 3) FLAG INDICATING WHETHER PRE-ALLOCATION IS TO BEGIN" + +<DEFINE BEGIN-FRAME (NM ACT PRE) + <EMIT <CHTYPE [,BEGIN:FRAME .NM .ACT .PRE] TOKEN>>> + +"END-FRAME ENDS A FRAME." + +<DEFINE END-FRAME () <EMIT <CHTYPE [,END:FRAME] TOKEN>>> + +"CREATE-TMP CREATES A TEMPORARY AND RETURNS THE ID OF IT" + +<DEFINE CREATE-TMP (TYP) + <EMIT <CHTYPE [,CREATE:TEMP <CHTYPE <SET IDT <+ .IDT 1>> SCL> .TYP] + TOKEN>> + <CHTYPE .IDT SCL>> + +<DEFINE EMIT-PRE (PRE) <EMIT <CHTYPE [,EMIT:PRE .PRE] TOKEN>>> + +<DEFINE STORE-TMP (TYP VAL ADR) + <EMIT <CHTYPE [,STORE:TMP .ADR T .TYP .VAL] TOKEN>>> + +\ + +<DEFINE CDUP (COD "AUX" (CPTR .COD) (MODEL (())) (REMOVES (())) (SNO 0)) + #DECL ((COD) LIST (MODEL REMOVES CPTR) <SPECIAL LIST> + (SNO) <SPECIAL FIX>) + <PASS:1 .MODEL <> ()> + <PASS:2 .MODEL> + <PASS:3 .COD .MODEL>> + +"PASS:1 SETS UP THE INITIAL MODEL FOR CUP. IT ALSO DETERMINES WHICH VARIABLES ARE TO BE + KEPT BY USING A MARK-BIT IN THE TEMPORARY DESCRIPTORS." + +<DEFINE PASS:1 (MODEL PCFRAM VARLST "AUX" FD (CFRAM <>)) + #DECL ((VALUE) PFRAME (CPTR COD) LIST (CFRAM) <OR FALSE PFRAME>) + <REPEAT RETPNT (INST TOKCOD FD) + #DECL ((SNO) FIX (TOKCOD) FIX) + <SET INST <1 .CPTR>> + <SET SNO <+ .SNO 1>> + <COND (<TYPE? .INST ATOM>) + (<TYPE? .INST TOKEN> + <COND (<NOT <OR <==? <SET TOKCOD <1 .INST>> ,STORE:TMP> + <==? .TOKCOD ,STORE:VAR> + <==? .TOKCOD ,STORE:TVAR>>> + <SET REMOVES <ADDON (.CPTR) .REMOVES>>)> + <CASE ,==? + .TOKCOD + (,BEGIN:FRAME + <COND (.CFRAM <PASS:1 .MODEL .CFRAM .VARLST>) + (ELSE + <SET CFRAM + <CHTYPE [<2 .INST> + <3 .INST> + <4 .INST> + (()) + () + 0 + ()] + PFRAME>> + <COND (.PCFRAM + <PUT .PCFRAM + ,KIDS-PF + (.CFRAM !<KIDS-PF .PCFRAM>)>) + (<PUT .MODEL 1 .CFRAM>)>)>) + (,END:FRAME <RETURN .CFRAM .RETPNT>) + (,STORE:VAR <SET VARLST (<2 .INST> .CPTR !.VARLST)>) + (,KILL:STORE <NULLIFY .VARLST <2 .INST>>) + (,CREATE:TEMP + <PUT .CFRAM + ,TEMPS-PF + <ADDON (<CHTYPE [<2 .INST> () 0 .SNO 0 <3 .INST> ()] + TEMPB>) + <TEMPS-PF .CFRAM>>>) + (,EMIT:PRE <PUT .CFRAM ,PRE-PF <2 .INST>>) + (,STORE:TMP + <PUT <SET FD + <COND (<FIND-TMP <FX <2 .INST>> <1 .MODEL>>) + (<MESSAGE INCONSISTENCY "LOST TEMPORARY">)>> + ,STORE-TEMP + (.CPTR .SNO !<STORE-TEMP .FD>)>) + (,STORE:TVAR + <COND (<SET FD <FIND-TMP <FX <3 .INST>> <1 .MODEL>>> + <COND (<EMPTY? <REF-TMP .FD>> <PUT .FD ,HI-TMP .SNO>) + (<PUT .FD ,HI-TMP <CHTYPE <MIN> FIX>>)> + <PUT .FD + ,STORE-TEMP + (.CPTR .SNO !<STORE-TEMP .FD>)>) + (ELSE <MESSAGE INCONSISTENCY "LOST VARIABLE">)> + <SET VARLST (<2 .INST> .CPTR !.VARLST)>) + DEFAULT + (<MESSAGE INCONSISTENCY "BAD TOKEN TO CUP">)>) + (<SET FD <FX .INST>> + <COND (<SET FD <FIND-TMP .FD <1 .MODEL>>> + <PUT .FD ,REF-TMP (.CPTR !<REF-TMP .FD>)> + <COND (<L? .SNO <HI-TMP .FD>>) (<PUT .FD ,HI-TMP .SNO>)>) + (<MESSAGE INCONSISTENCY "VARIABLE NOT FOUND">)>)> + <COND (<EMPTY? <SET CPTR <REST .CPTR>>> + <MESSAGE INCONSISTENCY "UNBALENCED STACK MODEL">)>> + <FIXUP-VARLST .VARLST> + .CFRAM> + +<DEFINE FIXUP-VARLST (VARLST) + #DECL ((VARLST) LIST) + <REPEAT ((VP .VARLST) VAR) + <COND (<EMPTY? .VP> <RETURN>) + (<AND <TYPE? <SET VAR <1 <2 .VP>>> TOKEN> + <==? <1 .VAR> ,STORE:VAR>> + <PUT <2 .VP> + 1 + <INSTRUCTION STORE-MTEMP + <3 .VAR> + <6 .VAR> + <4 .VAR> + <5 .VAR>>>)> + <SET VP <REST .VP 2>>>> + +<DEFINE NULLIFY (MNLST ITEM) + #DECL ((MNLST) <OR FALSE LIST>) + <COND (<SET MNLST <MEMQ .ITEM .MNLST>> + <PUT .MNLST 1 <>> + <PUT <2 .MNLST> 1 '<NULL-MACRO>>)>> + +<DEFINE FX (SC) + <COND (<STRUCTURED? .SC> + <MAPF <> + <FUNCTION (X "AUX" QD) + <COND (<SET QD <FX .X>> <MAPLEAVE .QD>)>> + .SC>) + (<TYPE? .SC SCL> .SC)>> + +"FIND-TMP LOOKS FOR A TEMPORARY. IF IT DOESN'T FIND IT AND ERR IS T IT CAUSES AN ERROR" + +<DEFINE FIND-TMP (ID CFRAM "AUX" XD) + #DECL ((ID) SCL (CFRAM) PFRAME) + <COND (<MAPF <> + <FUNCTION (VL) + #DECL ((VL) TEMPB) + <COND (<EMPTY? .VL>) + (<==? <ID-TMP .VL> .ID> <MAPLEAVE .VL>)>> + <REST <TEMPS-PF .CFRAM>>>) + (<MAPF <> + <FUNCTION (FRM "AUX" VAL) + #DECL ((FRM) PFRAME) + <COND (<SET VAL <FIND-TMP .ID .FRM>> + <MAPLEAVE .VAL>)>> + <KIDS-PF .CFRAM>>)>> + +\ + +"THIS IS PASS2 OF THE VARIABLE ALLOCATION PROCESS. DURING THIS PHASE VARIABLES AND + TEMPORARIES ARE ASSIGNED SLOTS ON THE STACK AND THE LENGTH OF THE BTP'S BECOMES + KNOWN. NO CODE UPDATE IS DONE DURING THIS PHASE." + +<DEFINE PASS:2 (MODEL) #DECL ((MODEL) <LIST PFRAME>) <VAR-ALLOC <1 .MODEL>>> + +"THIS ROUTINE ACTUALLY DOES THE ALLOCATION OF VARIBLES. IF IT MUST DO PREALLOCATION + IT CALLS PRE-ALLOC-VAR." + +<DEFINE VAR-ALLOC (FRM "AUX" SLOTS) + #DECL ((FRM) PFRAME (SLOTS) LIST) + <COND (<PRE-PF .FRM> <PRE-ALLOC-VAR1 .FRM>) + (ELSE + <SET SLOTS <SLOTFIX <REST <TEMPS-PF .FRM>>>> + <PUT .FRM ,TMP-STR-PF .SLOTS> + <PUT .FRM ,NTEMPS-PF <* <LENGTH .SLOTS> 2>> + <MAPF <> + <FUNCTION (FRM) #DECL ((FRM) PFRAME) <VAR-ALLOC .FRM>> + <KIDS-PF .FRM>>)>> + +"THIS ROUTINE TAKES A LIST OF TEMPORARIES AND ALLOCATES THERE SPACE ON THE STACK. + IT TRIES TO KEEP TEMPORARIES OF THE SAME TYPE TOGETHER THOUGH ITS MAIN GOAL IS + TO MINIMIZE THE NUMBER OF TEMPORARIES. IT RETURNS A LIST OF THE TYPES OF THE + TEMPORARIES. A FALSE MEANS THAT THE TYPE CANNOT BE PRE-ALLOCATED." + +<DEFINE SLOTFIX (VARLST "AUX" (NVRLST ()) (SLOTS 0)) + #DECL ((VARLST) LIST (SLOTS) FIX (NVRLST) <LIST [REST LIST]>) + <MAPF <> + <FUNCTION (TMP) + #DECL ((TMP) TEMPB) + <COND + (<NOT <EMPTY? <REF-TMP .TMP>>> + <COND (<MAPF <> + <FUNCTION (TMPLST) + #DECL ((TMPLST) <LIST <OR FALSE ATOM> TEMPB>) + <COND (<AND <TYP-TMP .TMP> + <==? <TYP-TMP .TMP> <1 .TMPLST>> + <FITTMP .TMP <2 .TMPLST>>> + <PUT .TMPLST 2 .TMP> + <MAPLEAVE T>)>> + .NVRLST>) + (<MAPF <> + <FUNCTION (TMPLST) + #DECL ((TMPLST) <LIST <OR FALSE ATOM> TEMPB>) + <COND (<FITTMP .TMP <2 .TMPLST>> + <PUT .TMPLST 1 <>> + <PUT .TMPLST 2 .TMP> + <MAPLEAVE T>)>> + .NVRLST>) + (ELSE + <SET NVRLST ((<TYP-TMP .TMP> .TMP) !.NVRLST)> + <PUT .TMP ,LOC-TMP .SLOTS> + <SET SLOTS <+ .SLOTS 2>>)>)>> + .VARLST> + <LREVERSE <MAPF ,LIST 1 .NVRLST>>> + +<DEFINE FITTMP (VAR CMPVAR "AUX" (SHI <HI-TMP .VAR>) (SLO <LO-TMP .VAR>)) + #DECL ((SLO) FIX (VAR CMPVAR) TEMPB) + <COND (<G? .SLO <HI-TMP .CMPVAR>> + <PUT .VAR ,LOC-TMP <LOC-TMP .CMPVAR>> + <PUT .VAR ,LO-TMP <LO-TMP .CMPVAR>>) + (<L? .SHI <LO-TMP .CMPVAR>> + <PUT .VAR ,LOC-TMP <LOC-TMP .CMPVAR>> + <PUT .VAR ,HI-TMP <HI-TMP .CMPVAR>>)>> + +"THIS ROUTINE DOES PRE-ALLOCATION. THE TOP FRAME GETS THE STRUCTURE AND + THE OTHER FRAMES ARE IGNORED (THEIR TEMPS ARE ALLOCATED IN THE FIRST FRAME)." + +<DEFINE PRE-ALLOC-VAR1 (FRM "AUX" (SLOTS ())) + #DECL ((FRM) PFRAME (SLOTS) LIST) + <SET SLOTS <PRE-ALLOC-VAR .FRM .SLOTS T>> + <SET SLOTS <SLOTFIX .SLOTS>> + <PUT .FRM ,NTEMPS-PF <* <LENGTH .SLOTS> 2>> + <PUT .FRM ,TMP-STR-PF .SLOTS>> + +<DEFINE PRE-ALLOC-VAR (FRM SLOTS "OPTIONAL" (FIRST? <>)) + #DECL ((FRM) PFRAME (SLOTS) LIST) + <COND (<AND <NOT .FIRST?> <ACT-PF .FRM>> <VAR-ALLOC .FRM> .SLOTS) + (<SET SLOTS (!<REST <TEMPS-PF .FRM>> !.SLOTS)> + <MAPF <> + <FUNCTION (FRM) <SET SLOTS <PRE-ALLOC-VAR .FRM .SLOTS>>> + <KIDS-PF .FRM>> + .SLOTS)>> + +\ + +"PASS:3 OF CUP FIXES UP THE REFERENCES TO TEMPORARIES, FIXES UP THE CODE AND + ADDS THE PSEUDO-SETG'S." + +<DEFINE PASS:3 (COD MODEL "AUX" (LFRAM <1 .MODEL>) (NPS ()) (PS ())) + #DECL ((NPS) <LIST [REST FORM]> (MODEL) <LIST PFRAME> (COD) LIST + (PS) <SPECIAL LIST>) + <FIXIT .LFRAM <PRE-PF .LFRAM> T> + <REPEAT () + <COND (<EMPTY? .PS> <RETURN>)> + <SET NPS + (<FORM PSEUDO!-OP!-PACKAGE <FORM SETG <1 .PS> <2 .PS>>> + !.NPS)> + <SET PS <REST .PS 2>>> + <ADDON <UPD .REMOVES .COD> .NPS>> + +<DEFINE FIXIT (FRM PRE "OPTIONAL" (FIRST? <>) "AUX" LX) + #DECL ((LX) LIST (FRM) PFRAME (PS) LIST (ADDS REMOVES) LIST) + <COND (<AND <NOT .FIRST?> <ACT-PF .FRM>> <SET PRE <PRE-PF .FRM>>)> + <COND (<NOT <AND .PRE <NOT <PRE-PF .FRM>>>> + <SET PS <ADDON (<NAME-PF .FRM> <NTEMPS-PF .FRM>) .PS>> + <SETG TMPLST + <ADDON ,TMPLST (<NAME-PF .FRM> <TMP-STR-PF .FRM>)>>)> + <MAPF <> + <FUNCTION (VAR + "AUX" (NUM <LOC-TMP .VAR>) (SC <ID-TMP .VAR>) + (LADJ <REF-TMP .VAR>)) + #DECL ((SC) SCL (NUM) FIX (LADJ) LIST (VAR) TEMPB) + <MAPF <> + <FUNCTION (IT) + #DECL ((IT) <PRIMTYPE LIST>) + <COND (<NOT <EMPTY? .IT>> <ADDIT .SC <1 .IT> .NUM>)>> + .LADJ> + <REPEAT ((PTR <STORE-TEMP .VAR>) (HT <HI-TMP .VAR>) XX) + <COND (<EMPTY? .PTR> <RETURN>)> + <COND + (<AND <NOT <EMPTY? <REF-TMP .VAR>>> <L=? <2 .PTR> .HT>> + <SET XX <1 <1 .PTR>>> + <COND (<NOT <=? .XX '<NULL-MACRO>>> + <COND (<==? <1 .XX> ,STORE:TMP> + <SET XX + <INSTRUCTION STORE-MTEMP + <2 .XX> + <3 .XX> + <4 .XX> + <5 .XX>>>) + (<==? <1 .XX> ,STORE:TVAR> + <SET XX + <INSTRUCTION STORE-MTEMP + <3 .XX> + <6 .XX> + <4 .XX> + <5 .XX>>>) + (<MESSAGE INCONSISTENCY "BAD STORE">)> + <ADDIT .SC .XX .NUM> + <PUT .XX 3 <NTH <2 ,TMPLST> <+ </ <LOC-TMP .VAR> 2> 1>>> + <PUT <1 .PTR> 1 .XX>)>) + (<PUT <1 .PTR> 1 '<NULL-MACRO>>)> + <SET PTR <REST .PTR 2>>>> + <REST <TEMPS-PF .FRM>>> + <COND (<SET LX <KIDS-PF .FRM>> + <MAPF <> + <FUNCTION (X) <FIXIT .X <COND (.PRE .PRE) (ELSE <PRE-PF .X>)>>> + .LX>)>> + +<DEFINE ADDIT (SC FRM NUM) + #DECL ((NUM) FIX) + <COND + (<STRUCTURED? .FRM> + <MAPF <> + <FUNCTION (X) + <COND (<ADDIT .SC .X .NUM> + <MAPR <> + <FUNCTION (X) + <COND (<==? <1 .X> .SC> + <PUT .X 1 .NUM>)>> + .FRM>)>> + .FRM>) + (<==? .FRM .SC>)>> + +\ + +<DEFINE PRIN-SET ("AUX" (UVEC <IVECTOR ,TOKEN-MAX "#TOKEN <">)) + <PRINTTYPE SCL ,SCL-PRINT> + <PRINTTYPE TOKEN ,TOKEN-PRINT> + <REPEAT ((TPS ,TOKENS) CNT ITEM) + <SET ITEMS <1 .TPS>> + <SET CNT <1 .ITEMS>> + <PUT .UVEC .CNT <2 .ITEMS>> + <COND (<EMPTY? <SET TPS <REST .TPS>>> <RETURN>)>> + <SETG TOKEN-TABLE .UVEC>> + +<GDECL (TOKEN-MAX) + FIX + (TOKENS) + <LIST [REST LIST]> + (TOKEN-TABLE) + <VECTOR [REST STRING]>> + +<SETG TOKEN-MAX 10> + +<SETG TOKENS + ((,EMIT:PRE "EMIT:PRE") + (,STORE:VAR "STORE:VAR") + (,CREATE:TEMP "CREATE:TEMPORARY") + (,KILL:STORE "KILL:STORE") + (,STORE:TMP "STORE:TEMPORARY") + (,BEGIN:FRAME "BEGIN:FRAME") + (,END:FRAME "END:FRAME") + (,STORE:TVAR "STORE:TVARIABLE"))> + +<DEFINE SCL-PRINT (X) + #DECL ((X) SCL) + <PRINC "TEMPORARY:"> + <PRIN1 <CHTYPE .X FIX>>> + +<DEFINE MAP-PRINT (X) + #DECL ((X) STRUCTURED) + <MAPF <> <FUNCTION (X) <PRINC !" > <PRIN1 .X>> .X>> + +<DEFINE TOKEN-PRINT (X) + #DECL ((X) TOKEN) + <COND (<L? <1 .X> ,TOKEN-MAX> + <PRINC "<"> + <PRINC <NTH ,TOKEN-TABLE <1 .X>>>) + (ELSE <PRINC "#TOKEN <"> <PRIN1 <1 .X>>)> + <MAP-PRINT <REST .X>> + <PRINC !">>> + + + +<DEFINE UPD (REMOVES QCOD) + #DECL ((QCOD REMOVES) <PRIMTYPE LIST>) + <REPEAT ((TEMP1 .QCOD) (CPTR .QCOD)) + #DECL ((CD) FIX (CPTR QCOD) LIST) + <AND <EMPTY? .CPTR> <RETURN>> + <MAPF <> + <FUNCTION (REMOVES) + <AND <==? .REMOVES .CPTR> + <COND (<==? .QCOD .CPTR> + <SET QCOD <REST .QCOD>>) + (ELSE + <PUTREST .TEMP1 <REST .CPTR>> + <SET CPTR .TEMP1>)>>> + .REMOVES> + <SET TEMP1 .CPTR> + <SET CPTR <REST .CPTR>>> + .QCOD> + +<DEFINE LREVERSE (TEM "AUX" LST VAL TMP) + #DECL ((LST) LIST) + <SET LST .TEM> + <SET VAL ()> + <REPEAT () + <COND (<EMPTY? .LST> <RETURN .VAL>)> + <SET TMP <REST .LST>> + <SET VAL <PUTREST .LST .VAL>> + <SET LST .TMP>>> + +\ + +"THIS ROUTINE CALLED AT ASSEMBLY TIME ALLOCATES SLOTS FOR THE TEMPORARIES." + +<DEFINE ALLOCATE:SLOTS (ATM "OPTIONAL" (FXI 0) "AUX" XX (SPL ())) + #DECL ((SPL) LIST (ATM) <OR ATOM FIX> (FXI) FIX) + <COND + (<TYPE? .ATM FIX> <SET SPL <FIXAD .ATM>>) + (ELSE + <REPEAT ((SLTS <2 <MEMQ .ATM ,TMPLST>>)) + <COND (<EMPTY? .SLTS> + <SET SPL <ADDON <FIXAD .FXI> .SPL>> + <SET FXI 0> + <RETURN>) + (<SET XX <1 .SLTS>> + <SET SPL <ADDON <FIXAD .FXI> .SPL>> + <SET FXI 0> + <SET SPL + <ADDON (<INSTRUCTION + `PUSH `TP* <FORM TYPE-WORD!-OP!-PACKAGE .XX>> + <INSTRUCTION `PUSH `TP* [0]>) + .SPL>>) + (<SET FXI <+ .FXI 2>>)> + <SET SLTS <REST .SLTS>>>)> + <CHTYPE .SPL SPLICE>> + +<DEFINE FIXAD (NUM) + #DECL ((NUM) FIX) + <COND (<0? .NUM> ()) + (<L? .NUM 5> <ILIST .NUM ''<`PUSH `TP* [0]>>) + ((<INSTRUCTION `MOVEI `O* .NUM> + <INSTRUCTION `PUSHJ `P* |NTPALO>))>> + +<DEFINE ZTMPLST () <SETG TMPLST ()>> + +<DEFINE STORE-MTEMP (TMPADR TMPPRED TYP VALUE) + <CHTYPE + (!<COND (.TMPPRED (<INSTRUCTION `MOVEM .VALUE !.TMPADR 1>)) + (ELSE + <COND (<AND <TYPE? .TYP ATOM> <VALID-TYPE? .TYP>> + (<INSTRUCTION `MOVE `O <FORM TYPE-WORD!-OP!-PACKAGE .TYP>> + <INSTRUCTION `MOVEM `O !.TMPADR> + <INSTRUCTION `MOVEM .VALUE !.TMPADR 1>)) + (<STRUCTURED? .TYP> + (<INSTRUCTION `MOVE `O !<ADDR:TYPE1 .TYP>> + <INSTRUCTION `MOVEM `O !.TMPADR> + <INSTRUCTION `MOVEM .VALUE !.TMPADR 1>)) + (ELSE + (<INSTRUCTION `MOVEM .TYP !.TMPADR> + <INSTRUCTION `MOVEM .VALUE !.TMPADR 1>))>)>) + SPLICE>> + +<DEFINE NULL-MACRO () <CHTYPE () SPLICE>> + +<DEFINE DEALLOCATE (LST "AUX" (NUM <+ !.LST>)) + <COND (<0? .NUM> #SPLICE ()) + (<CHTYPE (<INSTRUCTION `SUB `TP* <VECTOR <FORM (.NUM) .NUM>>>) + SPLICE>)>> + +"FUNCTION TO EXPAND THE MACROS IN THE SOURCE GENERATED BY THE COMPILER. + SHOULD BE CALLED AFTER CUP." + +<DEFINE EXP-MAC (CODE "AUX" (CP <REST .CODE>) (TC .CODE) TC1) + #DECL ((CODE CP TC) LIST) + <REPEAT (ELE FRST) + <COND + (<TYPE? <SET ELE <1 .CP>> FORM> + <COND + (<TYPE? <SET FRST <1 .ELE>> ATOM> + <COND + (<==? .FRST PSEUDO!-OP!-PACKAGE> <EVAL <2 .ELE>>) + (<==? <GET <OBLIST? .FRST> OBLIST> OP!-PACKAGE>) + (<==? .FRST TITLE>) + (<GASSIGNED? .FRST> + <COND + (<TYPE? <SET ELE <EVAL .ELE>> SPLICE> + <COND + (<EMPTY? .ELE> <PUTREST .TC <SET CP <REST .CP>>> <AGAIN>) + (ELSE + <PUTREST <SET TC1 <CHTYPE <REST .ELE <- <LENGTH .ELE> 1>> LIST>> + <REST .CP>> + <PUTREST .TC .ELE> + <SET CP <CHTYPE .ELE LIST>> + <AGAIN>)>)>)>) + (<NOT <PUREQ .ELE>> + <PROG ((NUM 0)) + <REPEAT ((PTR .ELE) (RPTR <REST .ELE>) ELE) + #DECL ((PTR RPTR) <PRIMTYPE LIST> (NUM) FIX) + <COND (<EMPTY? .RPTR> <RETURN>)> + <COND (<AND <TYPE? <SET ELE <1 .RPTR>> FORM> + <OR <==? <1 .ELE> -> <==? <1 .ELE> GVAL>>> + <SET ELE <EVAL .ELE>>)> + <COND (<TYPE? .ELE FIX> + <SET NUM <+ .NUM .ELE>> + <PUTREST .PTR <SET RPTR <REST .RPTR>>> + <AGAIN>)> + <SET PTR <REST .PTR>> + <SET RPTR <REST .RPTR>>> + <COND (<NOT <0? .NUM>> + <PUTREST <REST .ELE <- <LENGTH .ELE> 1>> (.NUM)>)>>)>)> + <COND (<EMPTY? <SET CP <REST .CP>>> <RETURN>)> + <SET TC <REST .TC>>> + .CODE> + +<DEFINE ADDON (AD OB) + #DECL ((AD OB) <PRIMTYPE LIST>) + <COND (<EMPTY? .OB> .AD) + (ELSE <PUTREST <REST .OB <- <LENGTH .OB> 1>> .AD> .OB)>> + + +<ENDPACKAGE> diff --git a/<mdl.comp>/etmp.mud.1 b/<mdl.comp>/etmp.mud.1 new file mode 100644 index 0000000..21985b8 --- /dev/null +++ b/<mdl.comp>/etmp.mud.1 @@ -0,0 +1,30 @@ + +<PACKAGE "CHKDCL"> + +<ENTRY TYPE-AND TYPE-OK? TASTEFUL-DECL GET-ELE-TYPE STRUCTYP TYPE-ATOM-OK? ISTYPE-GOOD? TYPE-MERGE DEFERN TOP-TYPE ISTYPE? TYPESAME ANY-PAT STRUC GETBSYZ GEN-DECL REST-DECL MINL GET-RANGE> + +<USE "COMPDEC"> + +<SETG DECL-RESTED 1> + +<SETG DECL-ELEMENT 2> + +<SETG DECL-ITEM-COUNT 3> + +<SETG DECL-IN-REST 4> + +<SETG DECL-IN-COUNT-VEC 5> + +<SETG DECL-REST-VEC 6> + +<MANIFEST DECL-RESTED DECL-ELEMENT DECL-ITEM-COUNT DECL-IN-REST DECL-IN-COUNT-VEC DECL-REST-VEC> + +<SETG HIGHBOUND 2> + +<SETG LOWBOUND 1> + +<MANIFEST HIGHBOUND LOWBOUND> + +<SETG ALLWORDS '<PRIMTYPE WORD>> + +<SETG TASTEFUL-DECL ' \ No newline at end of file diff --git a/<mdl.comp>/eupdat.mud.1 b/<mdl.comp>/eupdat.mud.1 new file mode 100644 index 0000000..01a37c2 --- /dev/null +++ b/<mdl.comp>/eupdat.mud.1 @@ -0,0 +1,122 @@ +<SETG ANALYZERS + <DISPATCH ,SUBR-ANA + (,QUOTE-CODE ,QUOTE-ANA) + (,FUNCTION-CODE ,FUNC-ANA) + (,SEGMENT-CODE ,SEGMENT-ANA) + (,FORM-CODE ,FORM-AN) + (,PROG-CODE ,PRG-REP-ANA) + (,SUBR-CODE ,SUBR-ANA) + (,COND-CODE ,COND-ANA) + (,COPY-CODE ,COPY-AN) + (,RSUBR-CODE ,RSUBR-ANA) + (,ISTRUC-CODE ,ISTRUC-ANA) + (,ISTRUC2-CODE ,ISTRUC2-ANA) + (,READ-EOF-CODE ,READ-ANA) + (,READ-EOF2-CODE ,READ2-ANA) + (,GET-CODE ,GET-ANA) + (,GET2-CODE ,GET2-ANA) + (,MAP-CODE ,MAPPER-AN) + (,MARGS-CODE ,MARGS-ANA) + (,ARITH-CODE ,ARITH-ANA) + (,TEST-CODE ,ARITHP-ANA) + (,0-TST-CODE ,ARITHP-ANA) + (,1?-CODE ,ARITHP-ANA) + (,MIN-MAX-CODE ,ARITH-ANA) + (,ABS-CODE ,ABS-ANA) + (,FIX-CODE ,FIX-ANA) + (,FLOAT-CODE ,FLOAT-ANA) + (,MOD-CODE ,MOD-ANA) + (,LNTH-CODE ,LENGTH-ANA) + (,MT-CODE ,EMPTY?-ANA) + (,NTH-CODE ,NTH-ANA) + (,REST-CODE ,REST-ANA) + (,PUT-CODE ,PUT-ANA) + (,PUTR-CODE ,PUTREST-ANA) + (,UNWIND-CODE ,UNWIND-ANA) + (,FORM-F-CODE ,FORM-F-ANA) + (,COPY-LIST-CODE ,COPY-AN) + (,BACK-CODE ,BACK-ANA) + (,TOP-CODE ,TOP-ANA) + (,SUBSTRUC-CODE ,SUBSTRUC-ANA)>> +<SETG GENERATORS + <DISPATCH ,DEFAULT-GEN + (,FORM-CODE ,FORM-GEN) + (,PROG-CODE ,PROG-REP-GEN) + (,SUBR-CODE ,SUBR-GEN) + (,COND-CODE ,COND-GEN) + (,LVAL-CODE ,LVAL-GEN) + (,SET-CODE ,SET-GEN) + (,OR-CODE ,OR-GEN) + (,AND-CODE ,AND-GEN) + (,RETURN-CODE ,RETURN-GEN) + (,COPY-CODE ,COPY-GEN) + (,AGAIN-CODE ,AGAIN-GEN) + (,GO-CODE ,GO-GEN) + (,ARITH-CODE ,ARITH-GEN) + (,RSUBR-CODE ,RSUBR-GEN) + (,0-TST-CODE ,0-TEST) + (,NOT-CODE ,NOT-GEN) + (,1?-CODE ,1?-GEN) + (,TEST-CODE ,TEST-GEN) + (,EQ-CODE ,==-GEN) + (,TY?-CODE ,TYPE?-GEN) + (,LNTH-CODE ,LNTH-GEN) + (,MT-CODE ,MT-GEN) + (,REST-CODE ,REST-GEN) + (,NTH-CODE ,NTH-GEN) + (,PUT-CODE ,PUT-GEN) + (,PUTR-CODE ,PUTREST-GEN) + (,FLVAL-CODE ,FLVAL-GEN) + (,FSET-CODE ,FSET-GEN) + (,FGVAL-CODE ,FGVAL-GEN) + (,FSETG-CODE ,FSETG-GEN) + (,STACKFORM-CODE ,STACKFORM-GEN) + (,MIN-MAX-CODE ,MIN-MAX) + (,CHTYPE-CODE ,CHTYPE-GEN) + (,FIX-CODE ,FIX-GEN) + (,FLOAT-CODE ,FLOAT-GEN) + (,ABS-CODE ,ABS-GEN) + (,MOD-CODE ,MOD-GEN) + (,ID-CODE ,ID-GEN) + (,ASSIGNED?-CODE ,ASSIGNED?-GEN) + (,ISTRUC-CODE ,ISTRUC-GEN) + (,ISTRUC2-CODE ,ISTRUC-GEN) + (,BITS-CODE ,BITS-GEN) + (,GETBITS-CODE ,GETBITS-GEN) + (,BITL-CODE ,BITLOG-GEN) + (,PUTBITS-CODE ,PUTBITS-GEN) + (,ISUBR-CODE ,ISUBR-GEN) + (,EOF-CODE ,ID-GEN) + (,READ-EOF2-CODE ,READ2-GEN) + (,READ-EOF-CODE ,SUBR-GEN) + (,IPUT-CODE ,IPUT-GEN) + (,IREMAS-CODE ,IREMAS-GEN) + (,GET-CODE ,GET-GEN) + (,GET2-CODE ,GET2-GEN) + (,IRSUBR-CODE ,IRSUBR-GEN) + (,MAP-CODE ,MAPFR-GEN) + (,MARGS-CODE ,MPARGS-GEN) + (,MAPLEAVE-CODE ,MAPLEAVE-GEN) + (,MAPRET-STOP-CODE ,MAPRET-STOP-GEN) + (,UNWIND-CODE ,UNWIND-GEN) + (,GVAL-CODE ,GVAL-GEN) + (,SETG-CODE ,SETG-GEN) + (,TAG-CODE ,TAG-GEN) + (,PRINT-CODE ,PRINT-GEN) + (,MEMQ-CODE ,MEMQ-GEN) + (,LENGTH?-CODE ,LENGTH?-GEN) + (,FORM-F-CODE ,FORM-F-GEN) + (,INFO-CODE ,INFO-GEN) + (,OBLIST?-CODE ,OBLIST?-GEN) + (,AS-NXT-CODE ,AS-NXT-GEN) + (,AS-IT-IND-VAL-CODE ,ASSOC-FIELD-GET) + (,ALL-REST-CODE ,ALL-REST-GEN) + (,COPY-LIST-CODE ,LIST-BUILD) + (,PUT-SAME-CODE ,SPEC-PUT-GEN) + (,BACK-CODE ,BACK-GEN) + (,TOP-CODE ,TOP-GEN) + (,SUBSTRUC-CODE ,SUBSTRUC-GEN) + (,ROT-CODE ,ROT-GEN) + (,LSH-CODE ,LSH-GEN) + (,BIT-TEST-CODE ,BIT-TEST-GEN)>> +  \ No newline at end of file diff --git a/<mdl.comp>/help.compil.7 b/<mdl.comp>/help.compil.7 new file mode 100644 index 0000000..5b6f25a --- /dev/null +++ b/<mdl.comp>/help.compil.7 @@ -0,0 +1,42 @@ + + +<REMOVE MUDREF!-OP!-PACKAGE> + +<NEWTYPE MUDREF!-OP!-PACKAGE WORD> +<LINK OP!-PACKAGE "OP"> +<REMOVE IRSUBR> +<SET HELP-COMPIL T> +<SET GLUE!- T> +<SETG TEMPLATE-NTH T> +<SETG TEMPLATE-PUT T> + +<FLOAD "PS:<COMPIL>BOPHAC.MUD"> +<FLOAD "PS:<COMPIL>MUDHAK.MUD"> + +<BEGIN-HACK "COMPIL"> + +<BEGIN-MHACK> + + +<SETG L-LOADER ,CLOSE> + +<MAPF <> ,REMOVE ( + DEBUGSW + IRSUBR + NOTE + WARNING + ERRS + WARNS + NOTES + DEBUG-COMPILE + REASONABLE + CAREFUL + PRECOMPILED + HAIRY-ANALYSIS + SRC-FLG + BIN-FLG + GLOSP + ANALY-OK + VERBOSE + COMPILER)> +<FLOAD "SRC:<MDL.COMP>COMPDE.NBIN"> diff --git a/<mdl.comp>/infcmp.mud.21 b/<mdl.comp>/infcmp.mud.21 new file mode 100644 index 0000000..3828c1a --- /dev/null +++ b/<mdl.comp>/infcmp.mud.21 @@ -0,0 +1,257 @@ +<PACKAGE "INFCMP"> + +<ENTRY ALLTYPES-ANA ROOT-ANA ERRORS-ANA INTERRUPTS-ANA INFO-GEN OBLIST?-ANA OBLIST?-GEN + ASSOCIATIONS-ANA NEXT-ANA ASSOC-HACK ASSOC-FIELD-GET AS-NXT-GEN> + +<USE "SYMANA" "CHKDCL" "CODGEN" "CACS" "COMCOD" "COMPDEC"> + +<DEFINE ALLTYPES-ANA (N R) + <INFO-GET .N .R |TYPVEC '<VECTOR [REST ATOM]>>> + +<DEFINE ROOT-ANA (N R) <INFO-GET .N .R |ROOT OBLIST>> + +<DEFINE ERRORS-ANA (N R) <INFO-GET .N .R |ERROBL OBLISTT>> + +<DEFINE INTERRUPTS-ANA (N R) <INFO-GET .N .R |INTOBL OBLIST>> + +<DEFINE INFO-GET (N R SYM TYP) + #DECL ((N) NODE) + <ARGCHK <LENGTH <KIDS .N>> 0 <NODE-NAME .N>> + <PUT .N ,NODE-TYPE ,INFO-CODE> + <PUT .N ,NODE-NAME .SYM> + <TYPE-OK? .R .TYP>> + +<DEFINE INFO-GEN (N W + "AUX" (ADR <ADDRESS:C <NODE-NAME .N>>)) + #DECL ((N) NODE (VALUE) DATUM) + <MOVE:ARG <DATUM <ISTYPE? <RESULT-TYPE .N>> .ADR> .W>> + +<PUT ,ALLTYPES ANALYSIS ,ALLTYPES-ANA> + +<PUT ,ROOT ANALYSIS ,ROOT-ANA> + +<PUT ,ERRORS ANALYSIS ,ERRORS-ANA> + +<PUT ,INTERRUPTS ANALYSIS ,INTERRUPTS-ANA> + +<DEFINE OBLIST?-ANA (N R "AUX" (K <KIDS .N>)) + #DECL ((N) NODE (K) <LIST [REST NODE]>) + <COND (<SEGFLUSH .N .R>) + (ELSE + <ARGCHK <LENGTH .K> 1 OBLIST?> + <EANA <1 .K> ATOM OBLIST?> + <PUT .N ,NODE-TYPE ,OBLIST?-CODE>)> + <TYPE-OK? '<OR FALSE OBLIST> .R>> + +<PUT ,OBLIST? ANALYSIS ,OBLIST?-ANA> + +<DEFINE OBLIST?-GEN (N W + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" (FLS <==? .W FLUSHED>) (SDIR .DIR) + (B2 + <COND (<AND .FLS .BRANCH> .BRANCH) + (ELSE <MAKE:TAG>)>) (B3 <MAKE:TAG>) (RW .W) + ATO B4 VAC W2) + #DECL ((N) NODE (ATO) DATUM (NK FLS DIR SDIR NOTF BRANCH) <OR FALSE ATOM>) + <SET W <GOODACS .N .W>> + <AND .NOTF <SET DIR <NOT .DIR>>> + <SET ATO <GEN <1 <KIDS .N>> <DATUM ATOM ANY-AC>>> + <VAR-STORE <>> + <COND + (<AND .BRANCH .FLS> + <COND (<OR <==? ,MUDDLE 105> <==? ,MUDDLE 55>> + <EMIT <INSTRUCTION <COND (.DIR `SKIPE ) (ELSE `SKIPN )> + 2 + (<ADDRSYM <DATVAL .ATO>>)>> + <BRANCH:TAG .BRANCH> + <RET-TMP-AC .ATO>) + (ELSE + <EMIT <INSTRUCTION `HRRZ 2 (<ADDRSYM <DATVAL .ATO>>)>> + <EMIT <INSTRUCTION <COND (.DIR `JUMPN) (ELSE `JUMPE)> .BRANCH>> + <RET-TMP-AC .ATO>)>) + (<OR .NOTF <NOT <==? <NOT .BRANCH> <NOT .DIR>>>> + <RET-TMP-AC .ATO> + <COND (<OR <==? ,MUDDLE 105> <==? ,MUDDLE 55>> + <EMIT <INSTRUCTION <COND (.DIR `SKIPE ) (ELSE `SKIPN )> + 2 + (<ADDRSYM <DATVAL .ATO>>)>> + <BRANCH:TAG .B3>) + (ELSE + <EMIT <INSTRUCTION `HRRZ 2 (<ADDRSYM <DATVAL .ATO>>)>> + <EMIT <INSTRUCTION <COND (.DIR `JUMPN) (ELSE `JUMPE)> .B3>>)> + <MOVE:ARG <REFERENCE .SDIR> .W> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B3>) + (ELSE + <SET W2 <DATUM OBLIST <DATVAL .W>>> + <COND (<TYPE? <DATVAL .W2> AC> + <SGETREG <SET VAC <DATVAL .W2>> .W2>) + (ELSE <PUT .W2 ,DATVAL <SET VAC <GETREG .W2>>>)> + <RET-TMP-AC .ATO> + <COND (.BRANCH + <COND (<OR <==? ,MUDDLE 105> <==? ,MUDDLE 55>> + <EMIT <INSTRUCTION `SKIPN <ACSYM .VAC> 2 + (<ADDRSYM <DATVAL .ATO>>)>>) + (ELSE + <EMIT <INSTRUCTION `HRRZ <ACSYM .VAC> 2 + (<ADDRSYM <DATVAL .ATO>>)>>)> + <COND (<==? .BRANCH .B2> + <COND (<OR <==? ,MUDDLE 105> <==? ,MUDDLE 55>> + <BRANCH:TAG .BRANCH>) + (ELSE + <EMIT <INSTRUCTION `JUMPE <ACSYM .VAC> .BRANCH>>)> + <GEN-OBL .VAC .W .W2>) + (ELSE + <COND (<OR <==? ,MUDDLE 105> <==? ,MUDDLE 55>> + <BRANCH:TAG .B3>) + (ELSE + <EMIT <INSTRUCTION `JUMPE <ACSYM .VAC> .B3>>)> + <GEN-OBL .VAC .W .W2> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B3>)>) + (ELSE + <COND (<OR <==? ,MUDDLE 105> <==? ,MUDDLE 55>> + <EMIT <INSTRUCTION `SKIPN <ACSYM .VAC> 2 + (<ADDRSYM <DATVAL .ATO>>)>> + <BRANCH:TAG .B2>) + (ELSE + <EMIT <INSTRUCTION `HRRZ <ACSYM .VAC> 2 + (<ADDRSYM <DATVAL .ATO>>)>> + <EMIT <INSTRUCTION `JUMPE <ACSYM .VAC> .B2>>)> + <GEN-OBL .VAC .W .W2> + <RET-TMP-AC .W> + <BRANCH:TAG .B3> + <LABEL:TAG .B2> + <MOVE:ARG <REFERENCE <>> .W> + <LABEL:TAG .B3>)>)> + <MOVE:ARG .W .RW>> + +<DEFINE GEN-OBL (AC W1 W2 "AUX" (B <MAKE:TAG>)) + #DECL ((AC) AC (W1 W2) DATUM) + <COND (<OR <==? ,MUDDLE 105> <==? ,MUDDLE 55>> + <EMIT <INSTRUCTION `JUMPL <ACSYM .AC> .B>> + <EMIT <INSTRUCTION `MOVE <ACSYM .AC> (<ADDRSYM .AC>)>> + <LABEL:TAG .B>) + (ELSE + <EMIT <INSTRUCTION `CAMGE <ACSYM .AC> |VECBOT>> + <EMIT <INSTRUCTION `MOVE <ACSYM .AC> (<ADDRSYM .AC>)>> + <EMIT <INSTRUCTION `HRLI <ACSYM .AC> -1>>)> + <MOVE:ARG .W2 .W1>> + +<DEFINE ASSOCIATIONS-ANA (N R) <AS-NXT .N .R <>>> + +<DEFINE NEXT-ANA (N R) <AS-NXT .N .R T>> + +<DEFINE AS-NXT (N R ARG) + <COND (<SEGFLUSH .N .R>) + (ELSE + <COND (.ARG + <ARGCHK <LENGTH <KIDS .N>> 1 NEXT> + <EANA <1 <KIDS .N>> ASOC NEXT>) + (ELSE <ARGCHK <LENGTH <KIDS .N>> 0 ASSOCIATIONS>)> + <PUT .N ,NODE-TYPE ,AS-NXT-CODE>)> + <TYPE-OK? .R '<OR ASOC FALSE>>> + +<DEFINE ASSOC-HACK (N R) + <COND (<SEGFLUSH .N .R>) + (ELSE + <ARGCHK <LENGTH <KIDS .N>> 1 <NODE-NAME .N>> + <EANA <1 <KIDS .N>> ASOC <NODE-NAME .N>> + <PUT .N ,NODE-TYPE ,AS-IT-IND-VAL-CODE>)> + <TYPE-OK? .R ANY>> + +<PUT ,ASSOCIATIONS ANALYSIS ,ASSOCIATIONS-ANA> + +<PUT ,NEXT ANALYSIS ,NEXT-ANA> + +<PUT ,ITEM ANALYSIS ,ASSOC-HACK> + +<PUT ,INDICATOR ANALYSIS ,ASSOC-HACK> + +<PUT ,AVALUE ANALYSIS ,ASSOC-HACK> + +<DEFINE ASSOC-FIELD-GET (N W "AUX" (NN <1 <KIDS .N>>) DAT OFF) + #DECL ((N NN) NODE (OFF) FIX) + <SET OFF + <COND (<==? <NODE-SUBR .N> ,ITEM> 0) + (<==? <NODE-SUBR .N> ,AVALUE> 2) + (ELSE 4)>> + <SET DAT <GEN .NN <DATUM ASOC ANY-AC>>> + <SET DAT <OFFPTR .OFF .DAT ASOC>> + <MOVE:ARG <DATUM .DAT .DAT> .W>> + +<DEFINE AS-NXT-GEN (N W + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" (FLS <==? .W FLUSHED>) (SDIR .DIR) + (B2 + <COND (<AND .FLS .BRANCH> .BRANCH) + (ELSE <MAKE:TAG>)>) (B3 <MAKE:TAG>) (RW .W) ATO + B4 VAC W2) + #DECL ((N) NODE (ATO) DATUM (NK FLS DIR SDIR NOTF BRANCH) <OR FALSE ATOM>) + <SET W <GOODACS .N .W>> + <AND .NOTF <SET DIR <NOT .DIR>>> + <SET ATO + <COND (<==? <NODE-NAME .N> NEXT> + <GEN <1 <KIDS .N>> <DATUM ASOC ANY-AC>>) + (ELSE + <SET ATO <DATUM ASOC ANY-AC>> + <PUT .ATO ,DATVAL <GETREG .ATO>> + <EMIT <INSTRUCTION `MOVE + <ACSYM <DATVAL .ATO>> + |NODES + 1>> + .ATO)>> + <VAR-STORE <>> + <COND + (<AND .BRANCH .FLS> + <EMIT <INSTRUCTION `HRRZ `O* 6 (<ADDRSYM <DATVAL .ATO>>)>> + <EMIT <INSTRUCTION <COND (.DIR `JUMPN ) (ELSE `JUMPE )> + `O* + .BRANCH>> + <RET-TMP-AC .ATO>) + (<OR .NOTF <NOT <==? <NOT .BRANCH> <NOT .DIR>>>> + <RET-TMP-AC .ATO> + <EMIT <INSTRUCTION `HRRZ `O* 6 (<ADDRSYM <DATVAL .ATO>>)>> + <EMIT <INSTRUCTION <COND (.DIR `JUMPN ) (ELSE `JUMPE )> `O* .B3>> + <MOVE:ARG <REFERENCE .SDIR> .W> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B3>) + (ELSE + <SET W2 <DATUM ASOC <DATVAL .W>>> + <COND (<TYPE? <DATVAL .W2> AC> + <SGETREG <SET VAC <DATVAL .W2>> .W2>) + (ELSE <PUT .W2 ,DATVAL <SET VAC <GETREG .W2>>>)> + <RET-TMP-AC .ATO> + <COND (.BRANCH + <COND (<==? .BRANCH .B2> + <EMIT <INSTRUCTION `HRRZ + <ACSYM .VAC> + 6 + (<ADDRSYM <DATVAL .ATO>>)>> + <EMIT <INSTRUCTION `JUMPE <ACSYM .VAC> .BRANCH>> + <MOVE:ARG .W2 .W>) + (ELSE + <EMIT <INSTRUCTION `HRRZ + <ACSYM .VAC> + 6 + (<ADDRSYM <DATVAL .ATO>>)>> + <EMIT <INSTRUCTION `JUMPE <ACSYM .VAC> .B3>> + <MOVE:ARG .W2 .W> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B3>)>) + (ELSE + <EMIT <INSTRUCTION `HRRZ + <ACSYM .VAC> + 6 + (<ADDRSYM <DATVAL .ATO>>)>> + <EMIT <INSTRUCTION `JUMPE <ACSYM .VAC> .B2>> + <MOVE:ARG .W2 .W> + <RET-TMP-AC .W> + <BRANCH:TAG .B3> + <LABEL:TAG .B2> + <MOVE:ARG <REFERENCE <>> .W> + <LABEL:TAG .B3>)>)> + <MOVE:ARG .W .RW>> + +<ENDPACKAGE> + \ No newline at end of file diff --git a/<mdl.comp>/istruc.mud.102 b/<mdl.comp>/istruc.mud.102 new file mode 100644 index 0000000..3ebdd8d --- /dev/null +++ b/<mdl.comp>/istruc.mud.102 @@ -0,0 +1,484 @@ +<PACKAGE "ISTRUC"> + +<ENTRY ISTRUC-GEN> + +<USE "CODGEN" "COMCOD" "CACS" "CHKDCL" "COMPDEC"> + + +"ILIST, IVECTOR, IUVECTOR AND ISTRING." + +<DEFINE ISTRUC-GEN (N W + "AUX" (NAM <NODE-NAME .N>) (K <KIDS .N>) + (NT <NODE-TYPE .N>) (BYTSZ <>)) + #DECL ((N NUM EL) NODE) + <COND (<==? .NAM ITUPLE> + <ITUPLE-GEN .N + .W + <==? .NT ,ISTRUC-CODE> + <1 .K> + <2 .K> + <ISTYPE? <RESULT-TYPE .N>> + .BYTSZ>) + (ELSE + <PROG ((STK (0 !.STK))) + #DECL ((STK) <SPECIAL LIST>) + <COND (<==? .NAM IBYTES> + <SET BYTSZ <1 .K>> + <SET K <REST .K>>)> + <APPLY <NTH ,IERS <LENGTH <MEMQ .NAM ,NAMVEC>>> + .N + .W + <==? .NT ,ISTRUC-CODE> + <1 .K> + <2 .K> + <ISTYPE? <RESULT-TYPE .N>> + .BYTSZ>>)>> + +<DEFINE ILIST-GEN (N W GENR NUMN EL TYP BYTSZ "AUX" NUM START TEM END ELD) + #DECL ((N NUMN EL) NODE (NUM VALUE) DATUM (START END) ATOM) + <SET NUM <GEN .NUMN DONT-CARE>> + <EMIT <INSTRUCTION `PUSH `P* !<ADDR:VALUE .NUM>>> + <RET-TMP-AC .NUM> + <STACK:ARGUMENT <REFERENCE ()>> + <STACK:ARGUMENT <REFERENCE ()>> + <ADD:STACK 4> + <ADD:STACK PSLOT> + <COND (.GENR <SET ELD <GEN .EL DONT-CARE>>)> + <REGSTO T> + <LABEL:TAG <SET START <MAKE:TAG>>> + <EMIT '<`SOSGE `(P) >> + <BRANCH:TAG <SET END <MAKE:TAG>>> + <RET-TMP-AC <COND (.GENR <DOEVS .ELD <DATUM ,AC-C ,AC-D>>) + (ELSE <GEN .EL <DATUM ,AC-C ,AC-D>>)>> + <REGSTO T> + <EMIT '<`MOVEI `E* >> + <EMIT '<`PUSHJ `P* |CICONS >> + <EMIT '<`SKIPE `(TP) >> + <EMIT '<`HRRM `B* `@ `(TP) >> + <EMIT '<`MOVEM `B* `(TP) >> + <EMIT '<`SKIPN `(TP) -2>> + <EMIT '<`MOVEM `B* `(TP) -2>> + <BRANCH:TAG .START> + <LABEL:TAG .END> + <EMIT '<`MOVE `B* `(TP) -2>> + <EMIT '<`SUB `TP* [<4 (4)>]>> + <EMIT '<`SUB `P* [<1 (1)>]>> + <AND .GENR <RET-TMP-AC .ELD>> + <SET TEM <DATUM .TYP ,AC-B>> + <SGETREG ,AC-B .TEM> + <MOVE:ARG .TEM .W>> + +<DEFINE IVEC-GEN (N W GENR NUMN EL TYP BYTSZ + "AUX" NT (UV <==? .TYP UVECTOR>) START END TEM (ETY <>) ADS + ACS ANAC ATAG DAT AC OFPT ELD TTEM) + #DECL ((N NUMN EL) NODE (NT) FIX (DAT TEM) DATUM (AC) AC (OFPT) OFFPTR) + <REGSTO T> + <RET-TMP-AC <GEN .NUMN <DATUM FIX ,AC-A>>> + <COND (.UV <EMIT '<`MOVEI `O* |IBLOCK >>) + (ELSE <EMIT '<`MOVEI `O* |IBLOK1 >>)> + <REGSTO T> + <EMIT '<`PUSHJ `P* |RCALL >> + <COND + (<AND <NOT .GENR> + <==? <NODE-TYPE .EL> ,QUOTE-CODE> + <==? <NODE-NAME .EL> #LOSE *000000000000*>> + <MOVE:ARG <FUNCTION:VALUE T> .W>) + (<AND <NOT .GENR> + <OR <==? <SET NT <NODE-TYPE .EL>> ,QUOTE-CODE> + <==? .NT ,LVAL-CODE> + <==? .NT ,FLVAL-CODE> + <==? .NT ,FGVAL-CODE> + <==? .NT ,GVAL-CODE>>> + <SET DAT <DATUM .TYP ,AC-B>> + <SGETREG <DATVAL .DAT> .DAT> + <MUNG-AC ,AC-B .DAT> + <SET TEM + <GEN .EL + <COND (<AND .UV <SET ETY <ISTYPE? <RESULT-TYPE .EL>>>> + <DATUM .ETY <GETREG <>>>) + (ELSE <ANY2ACS>)>>> + <EMIT <INSTRUCTION `MOVE <SET ACS <ACSYM <SET AC <GETREG <>>>>> `B >> + <SET ADS <ADDRSYM .AC>> + <COND (<==? <NODE-TYPE .NUMN> ,QUOTE-CODE> + <OR <G? <CHTYPE <NODE-NAME .NUMN> FIX> 0> + <MESSAGE ERROR "BAD ARG TO " <NODE-NAME .N>>>) + (ELSE <EMIT <INSTRUCTION `JUMPGE .ACS <SET END <MAKE:TAG>>>>)> + <LABEL:TAG <SET START <MAKE:TAG>>> + <MUNG-AC .AC> + <SET OFPT <OFFPTR <COND (.UV -1) (ELSE 0)> <DATUM .TYP .AC> .TYP>> + <MOVE:ARG .TEM <DATUM <COND (.ETY) (.UV WORD) (ELSE .OFPT)> .OFPT>> + <AND <TYPE? <DATVAL .TEM> AC> <MUNG-AC <DATVAL .TEM> .TEM>> + <AND <TYPE? <DATTYP .TEM> AC> <MUNG-AC <DATTYP .TEM> .TEM>> + <COND (.UV <EMIT <INSTRUCTION `AOBJN .ACS .START>>) + (ELSE + <EMIT <INSTRUCTION `ADD .ACS '[<2 (2)>]>> + <EMIT <INSTRUCTION `JUMPL .ACS .START>>)> + <AND <ASSIGNED? END> <LABEL:TAG .END>> + <COND (.ETY + <EMIT <INSTRUCTION `MOVEI + `O* + <FORM TYPE-CODE!-OP!-PACKAGE .ETY>>> + <EMIT <INSTRUCTION PUTYP!-OP!-PACKAGE `O* (.ADS)>>) + (.UV + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O* !<ADDR:TYPE .TEM>>> + <EMIT <INSTRUCTION PUTYP!-OP!-PACKAGE `O* (.ADS)>>)> + <RET-TMP-AC .OFPT> + <MOVE:ARG .DAT .W>) + (ELSE + <REGSTO T> + <COND (<==? <NODE-TYPE .NUMN> ,QUOTE-CODE> + <OR <G? <CHTYPE <NODE-NAME .NUMN> FIX> 0> + <MESSAGE ERROR "BAD ARG TO " <NODE-NAME .N>>>) + (ELSE <EMIT <INSTRUCTION `JUMPGE `B* <SET END <MAKE:TAG>>>>)> + <SET ETY <ISTYPE? <RESULT-TYPE .EL>>> + <COND (<AND .UV .CAREFUL <NOT .ETY>> + <EMIT <INSTRUCTION `PUSH `P* '[0]>> + <ADD:STACK PSLOT>)> + <STACK:ARGUMENT <DATUM .TYP ,AC-B>> + <STACK:ARGUMENT <DATUM .TYP ,AC-B>> + <ADD:STACK 4> + <COND (<AND .ETY .UV> + <COND (<N==? <NODE-TYPE .NUMN> ,QUOTE-CODE> + <EMIT '<`HLRE `O* `B >> + <EMIT '<`SUB `B* `O* >>)> + <EMIT <INSTRUCTION `MOVEI + `O* + <FORM TYPE-CODE!-OP!-PACKAGE .ETY>>> + <EMIT <INSTRUCTION PUTYP!-OP!-PACKAGE + `O* + <COND (<==? <NODE-TYPE .NUMN> ,QUOTE-CODE> + <NODE-NAME .NUMN>) + (ELSE 0)> + `(B) >>)> + <COND (.GENR <SET ELD <GEN .EL DONT-CARE>> <REGSTO T>)> + <LABEL:TAG <SET START <MAKE:TAG>>> + <SET TTEM + <COND (<AND .UV .ETY> <DATUM .ETY ANY-AC>) + (.UV DONT-CARE) + (ELSE <DATUM ANY-AC ANY-AC>)>> + <SET TEM <COND (.GENR <DOEVS .ELD .TTEM>) (ELSE <GEN .EL .TTEM>)>> + <AND <TYPE? <DATVAL .TEM> AC> <MUNG-AC <DATVAL .TEM> .TEM>> + <AND <TYPE? <DATTYP .TEM> AC> <MUNG-AC <DATTYP .TEM> .TEM>> + <EMIT <INSTRUCTION `MOVE <SET ACS <ACSYM <SET AC <GETREG <>>>>> `(TP) >> + <COND (<AND .UV <NOT .ETY>> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O* !<ADDR:TYPE .TEM>>> + <COND (.CAREFUL + <EMIT <INSTRUCTION `SKIPE '`(P) >> + <BRANCH:TAG <SET ATAG <MAKE:TAG>>>)> + <COND (<==? <NODE-TYPE .NUMN> ,QUOTE-CODE> + <EMIT <INSTRUCTION PUTYP!-OP!-PACKAGE + `O* + <NODE-NAME .NUMN> + (<ADDRSYM .AC>)>>) + (ELSE + <PUT .AC ,ACPROT T> + <EMIT <INSTRUCTION `HLRE + <ACSYM <SET ANAC <GETREG <>>>> + <ADDRSYM .AC>>> + <PUT .AC ,ACPROT <>> + <EMIT <INSTRUCTION `SUBM .ACS <ADDRSYM .ANAC>>> + <EMIT <INSTRUCTION PUTYP!-OP!-PACKAGE + `O* + (<ADDRSYM .ANAC>)>>)> + <COND (.CAREFUL + <EMIT <INSTRUCTION `MOVEM `O* '`(P) >> + <LABEL:TAG .ATAG> + <EMIT <INSTRUCTION `CAIE `O* `@ '`(P) >> + <BRANCH:TAG |COMPER >)>)> + <SET OFPT <OFFPTR <COND (.UV -1) (ELSE 0)> <DATUM .TYP .AC> .TYP>> + <VAR-STORE T> + <MOVE:ARG .TEM <DATUM <COND (.UV WORD) (ELSE .OFPT)> .OFPT>> + <EMIT <INSTRUCTION `ADD .ACS <COND (.UV '[<1 (1)>]) (ELSE '[<2 (2)>])>>> + <EMIT <INSTRUCTION `MOVEM .ACS '`(TP) >> + <EMIT <INSTRUCTION `JUMPL .ACS .START>> + <RET-TMP-AC .OFPT> + <RET-TMP-AC .TEM> + <SET TEM <DATUM <COND (<ISTYPE? <RESULT-TYPE .N>>) (ELSE ,AC-A)> ,AC-B>> + <EMIT <INSTRUCTION `MOVE <ACSYM <CHTYPE <DATVAL .TEM> AC>> -2 '`(TP) >> + <EMIT <INSTRUCTION `SUB `TP* '[<4 (4)>]>> + <COND (<AND .UV .CAREFUL <NOT .ETY>> + <EMIT <INSTRUCTION `SUB `P* '[<1 (1)>]>>)> + <AND <ASSIGNED? END> <LABEL:TAG .END>> + <MOVE:ARG .TEM .W>)>> + +<DEFINE DOEVS (D W) + #DECL ((D VALUE) DATUM) + <STACK:ARGUMENT .D> + <REGSTO T> + <SUBR:CALL EVAL 1> + <MOVE:ARG <FUNCTION:VALUE T> .W>> + +<DEFINE ISTR-GEN (N W GENR NUMN EL TYP BYTSZ + "AUX" RES NK TN NN TT ACS OAC TEM BP START END ETY DAT + (SOB <==? <NODE-SUBR .N> ,ISTRING>) ELD TTEM + (OT <COND (.SOB CHARACTER) (ELSE FIX)>) + (NT <COND (.SOB STRING) (ELSE BYTES)>) (SIZ 7) SIZD) + #DECL ((N NUMN EL) NODE (TN SIZ) FIX (RES DAT SIZD TEM) DATUM (TT) AC + (NN) <PRIMTYPE WORD> (BYTSZ) <OR FALSE NODE> + (BP) <FORM ANY <LIST ANY>>) + <COND (.BYTSZ + <COND (<==? <NODE-TYPE .BYTSZ> ,QUOTE-CODE> + <SET SIZ <NODE-NAME .BYTSZ>>) + (ELSE <SET SIZD <GEN .BYTSZ <DATUM FIX ANY-AC>>>)>)> + <REGSTO T> + <COND (<==? <NODE-TYPE .NUMN> ,QUOTE-CODE> + <SET NK T> + <SGETREG ,AC-A <>> + <AND <OR <L? <SET TN <NODE-NAME .NUMN>> 0> <G? .TN 262143>> + <MESSAGE ERROR "BAD ARG TO ISTRING/IBYTES ">> + <COND (<ASSIGNED? SIZD> + <EMIT '<`MOVEI `A* 36>> + <EMIT <INSTRUCTION `IDIV `A* !<ADDR:VALUE .SIZD>>> + <EMIT <INSTRUCTION `MOVEI `O* .TN>> + <EMIT '<`ADDI `O* (`A ) -1>> + <EMIT '<`IDIVM `O* `A >>) + (ELSE + <EMIT <INSTRUCTION `MOVEI + `A* + </ <+ .TN </ 36 .SIZ> -1> </ 36 .SIZ>>>>)>) + (ELSE + <SET NK <>> + <SET TEM <GEN .NUMN <DATUM FIX ,AC-A>>> + <MUNG-AC ,AC-A .TEM> + <RET-TMP-AC .TEM> + <SGETREG ,AC-B <>> + <ADD:STACK PSLOT> + <COND (<NOT <ASSIGNED? SIZD>> + <EMIT '<`PUSH `P* `A >> + <EMIT <INSTRUCTION `ADDI `A* <- </ 36 .SIZ> 1>>> + <EMIT <INSTRUCTION `IDIVI `A* </ 36 .SIZ>>>) + (ELSE + <EMIT '<`PUSH `P* `A >> + <EMIT '<`MOVEI `A* 36>> + <EMIT <INSTRUCTION `IDIV `A* !<ADDR:VALUE .SIZD>>> + <EMIT <INSTRUCTION `MOVE `O* (`P )>> + <EMIT '<`ADDI `O* (`A ) -1>> + <EMIT '<`IDIVM `O* `A >>)>)> + <EMIT '<`MOVEI `O* |IBLOCK >> + <EMIT '<`PUSHJ `P* |RCALL >> + <SET RES <DATUM UVECTOR ,AC-B>> + <SGETREG ,AC-B .RES> + <MUNG-AC ,AC-A> + <MUNG-AC ,AC-B .RES> + <COND + (<AND <NOT .GENR> <==? <NODE-TYPE .EL> ,QUOTE-CODE> <NOT <ASSIGNED? SIZD>>> + <COND (<NOT <0? <CHTYPE <SET NN <NODE-NAME .EL>> FIX>>> + <OR .NK + <EMIT <INSTRUCTION `JUMPGE `B* <SET END <MAKE:TAG>>>>> + <SET NN <WOFBYTE .SIZ <CHTYPE .NN FIX>>> + <SET DAT <DATUM FIX FIX>> + <PUT .DAT ,DATVAL <GETREG .DAT>> + <EMIT <INSTRUCTION `MOVE <SET ACS <ACSYM <DATVAL .DAT>>> `B >> + <EMIT <INSTRUCTION `MOVE <SET OAC <ACSYM <GETREG <>>>> [.NN]>> + <LABEL:TAG <SET START <MAKE:TAG>>> + <EMIT <INSTRUCTION `MOVEM + .OAC + (<ADDRSYM <CHTYPE <DATVAL .DAT> AC>>)>> + <EMIT <INSTRUCTION `AOBJN .ACS .START>> + <RET-TMP-AC .DAT> + <MUNG-AC <DATVAL .DAT>>)>) + (ELSE + <OR .NK + <ASSIGNED? SIZD> + <EMIT <INSTRUCTION `JUMPGE `B* <SET END <MAKE:TAG>>>>> + <RET-TMP-AC <STACK:ARGUMENT .RES>> + <COND (.NK <EMIT <INSTRUCTION `PUSH `P* [.TN]>>) + (ELSE <EMIT '<`PUSH `P* `(P) >>)> + <EMIT <INSTRUCTION `PUSH + `P* + [<SET BP + <FORM (<COND (<NOT <ASSIGNED? SIZD>> + <ORB #WORD *000000440000* + <LSH .SIZ 6>>) + (ELSE #WORD *000000440000*)>) + (IDX)>>]>> + <MAPF <> ,ADD:STACK '(2 PSLOT PSLOT)> + <COND (<ASSIGNED? SIZD> + <SGETREG ,AC-A <>> + <EMIT '<`MOVEI 36>> + <EMIT <INSTRUCTION `IDIV !<ADDR:VALUE .SIZD>>> + <EMIT '<`ASH `A* 6>> + <EMIT <INSTRUCTION `IOR `A* !<ADDR:VALUE .SIZD>>> + <RET-TMP-AC .SIZD> + <EMIT '<`DPB `A* [<(#WORD *000000300600*) `(P) >]>> + <EMIT '<`ASH `A* 6>> + <EMIT '<`HRRM `A* `(TP) -1>> + <COND (<NOT .NK> + <EMIT '<`SKIPG `(P) -1>> + <BRANCH:TAG <SET END <MAKE:TAG>>>)>)> + <COND (.GENR <SET ELD <GEN .EL DONT-CARE>> <REGSTO T>)> + <LABEL:TAG <SET START <MAKE:TAG>>> + <SET ETY <ISTYPE? <RESULT-TYPE .EL>>> + <SET TTEM + <COND (<AND .CAREFUL <NOT .ETY>> <DATUM ANY-AC ANY-AC>) + (ELSE <DATUM .OT ANY-AC>)>> + <SET TEM <COND (.GENR <DOEVS .ELD .TTEM>) (ELSE <GEN .EL .TTEM>)>> + <COND (<AND .CAREFUL <NOT .ETY>> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O* !<ADDR:TYPE .TEM>>> + <EMIT <INSTRUCTION `CAIE `O* <FORM TYPE-CODE!-OP!-PACKAGE .OT>>> + <BRANCH:TAG |COMPER >)> + <EMIT <INSTRUCTION `HRRZ <ACSYM <SET TT <GETREG <>>>> '`(TP) >> + <PUT <2 .BP> 1 <ADDRSYM .TT>> + <EMIT <INSTRUCTION `IDPB <ACSYM <CHTYPE <DATVAL .TEM> AC>> '`(P) >> + <MUNG-AC <DATVAL .TEM> .TEM> + <AND <TYPE? <DATTYP .TEM> AC> <MUNG-AC <DATTYP .TEM> .TEM>> + <RET-TMP-AC .TEM> + <VAR-STORE T> + <EMIT '<`SOSE `(P) -1>> + <BRANCH:TAG .START> + <COND (<ASSIGNED? END> <LABEL:TAG .END>)> + <EMIT '<`MOVE `B* `(TP) >> + <EMIT '<`HRL `B* `(TP) -1>> + <EMIT '<`SUB `TP* [<2 (2)>]>> + <EMIT '<`SUB `P* [<2 (2)>]>> + <SGETREG <DATVAL .RES> .RES>)> + <RET-TMP-AC .RES> + <COND (.NK + <EMIT <INSTRUCTION `MOVE + `A* + [<FORM .TN + (<FORM TYPE-CODE!-OP!-PACKAGE .NT>)>]>>) + (ELSE + <AND <ASSIGNED? END> <LABEL:TAG .END>> + <EMIT '<`POP `P* `A >> + <EMIT <INSTRUCTION `HRLI `A* <FORM TYPE-CODE!-OP!-PACKAGE .NT>>>)> + <COND (<NOT <ASSIGNED? SIZD>> + <EMIT <INSTRUCTION `HRLI + `B* + <CHTYPE <ORB <LSH .SIZ 6> <LSH <MOD 36 .SIZ> 12>> + FIX>>>)> + <EMIT '<`SUBI `B* 1>> + <MOVE:ARG <FUNCTION:VALUE T> .W>> + +<DEFINE ITUPLE-GEN (N W GENR NUMN EL TYP BYTSZ + "AUX" (START <MAKE:TAG>) (END <MAKE:TAG>) NX NT TEM + (NTEM <DATUM FIX ,AC-D>) (DOFLG <>) (ONEFLG <>) + (SFLG <GOOD-TUPLE .N>) ELD TTEM NW) + #DECL ((NT) FIX (NTEM TEM) DATUM (START END) ATOM (NUMN N EL) NODE + (DOFLG) <OR FIX ATOM FALSE>) + <REGSTO T> + <OR <TYPE-OK? <RESULT-TYPE .NUMN> FIX> + <MESSAGE ERROR "BAD ARG TO ITUPLE" .N>> + <COND (<==? <NODE-TYPE .NUMN> ,QUOTE-CODE> + <COND (<L? <SET DOFLG <NODE-NAME .NUMN>> 0> + <MESSAGE ERROR "BAD-ARG TO ITUPLE" .N>)>)> + <COND + (<AND .SFLG <0? .DOFLG>> <ADD:STACK 2>) + (<COND + (<AND <NOT .GENR> + <==? <NODE-TYPE .EL> ,QUOTE-CODE> + <==? <NODE-NAME .EL> #LOSE *000000000000*>> + <COND (.DOFLG <EMIT <INSTRUCTION `MOVEI `A* <* .DOFLG 2>>>) + (ELSE + <GEN .NUMN .NTEM> + <AND .CAREFUL <EMIT <INSTRUCTION `JUMPL `D* |COMPER >>> + <EMIT <INSTRUCTION `MOVEI `A* (<ADDRSYM <CHTYPE <DATVAL .NTEM> AC>>)>> + <EMIT <INSTRUCTION `ASH `A* 1>> + <EMIT <INSTRUCTION `PUSH `P* <ADDRSYM <CHTYPE <DATVAL .NTEM> AC>>>> + <EMIT <INSTRUCTION `JUMPE <ACSYM <CHTYPE <DATVAL .NTEM> AC>> .END>> + <RET-TMP-AC .NTEM>)> + <REGSTO T> + <EMIT '<`PUSHJ `P* |TPALOC >> + <COND (<SET NX <GOOD-TUPLE .N>> <ADD:STACK <+ <CHTYPE .NX FIX> 2>>) + (ELSE <ADD:STACK PSTACK>)> + <LABEL:TAG .END>) + (<AND <NOT .GENR> + <OR <==? <SET NT <NODE-TYPE .EL>> ,QUOTE-CODE> + <==? .NT ,LVAL-CODE> + <==? .NT ,FLVAL-CODE> + <==? .NT ,FGVAL-CODE> + <==? .NT ,GVAL-CODE>>> + <COND (<NOT .DOFLG> + <GEN .NUMN .NTEM> + <AND .CAREFUL + <EMIT <INSTRUCTION `JUMPL + <ACSYM <CHTYPE <DATVAL .NTEM> AC>> + |COMPER >>>)> + <SET TEM <GEN .EL <DATUM ANY-AC ANY-AC>>> + <COND (<NOT .DOFLG> <TOACV .NTEM> <ADD:STACK PSLOT> <ADD:STACK PSTACK>)> + <COND (.DOFLG + <COND (<==? .DOFLG 1> <SET ONEFLG T>) + (<EMIT <INSTRUCTION `PUSH `P* <VECTOR <- .DOFLG 1>>>>)>) + (ELSE + <EMIT <INSTRUCTION `PUSH `P* <ADDRSYM <CHTYPE <DATVAL .NTEM> AC>>>> + <EMIT <INSTRUCTION `PUSH `P* <ADDRSYM <CHTYPE <DATVAL .NTEM> AC>>>>)> + <COND (<NOT .DOFLG> + <EMIT <INSTRUCTION `JUMPE <ACSYM <CHTYPE <DATVAL .NTEM> AC>> .END>>)> + <TOACV .TEM> + <EMIT <INSTRUCTION `PUSH `TP* <ADDRSYM <CHTYPE <DATTYP .TEM> AC>>>> + <EMIT <INSTRUCTION `PUSH `TP* <ADDRSYM <CHTYPE <DATVAL .TEM> AC>>>> + <COND (<NOT .DOFLG> + <EMIT '<`SOSG -1 `(P) >> + <EMIT <INSTRUCTION `JRST .END>> + <RET-TMP-AC .NTEM>)> + <RET-TMP-AC .TEM> + <REGSTO T> + <COND (<AND .DOFLG .ONEFLG>) + (<LABEL:TAG .START> + <EMIT '<INTGO!-OP!-PACKAGE>> + <EMIT <INSTRUCTION `PUSH `TP* -1 `(TP) >> + <EMIT <INSTRUCTION `PUSH `TP* -1 `(TP) >> + <EMIT <COND (.DOFLG '<`SOSE `(P) >) ('<`SOSE -1 `(P) >)>> + <EMIT <INSTRUCTION `JRST .START>>)> + <LABEL:TAG .END> + <COND (<SET NX <GOOD-TUPLE .N>> + <OR .ONEFLG <EMIT '<`SUB `P* [<1 (1)>]>>> + <ADD:STACK <+ <CHTYPE .NX FIX> 2>>)>) + (ELSE + <COND (<NOT .DOFLG> + <GEN .NUMN .NTEM> + <EMIT <INSTRUCTION `PUSH `P* <ADDRSYM <CHTYPE <DATVAL .NTEM> AC>>>> + <EMIT <INSTRUCTION `PUSH `P* <ADDRSYM <CHTYPE <DATVAL .NTEM> AC>>>>) + (ELSE + <EMIT <INSTRUCTION `PUSH `P* [.DOFLG]>> + <EMIT <INSTRUCTION `PUSH `P* [.DOFLG]>>)> + <ADD:STACK PSLOT> + <ADD:STACK PSTACK> + <COND (<NOT .DOFLG> + <AND .CAREFUL + <EMIT <INSTRUCTION `JUMPL + <ACSYM <CHTYPE <DATVAL .NTEM> AC>> + |COMPER >>> + <EMIT <INSTRUCTION `JUMPE <ACSYM <CHTYPE <DATVAL .NTEM> AC>> .END>> + <RET-TMP-AC .NTEM>)> + <COND (.GENR <SET ELD <GEN .EL DONT-CARE>>)> + <COND (<AND .DOFLG <0? .DOFLG>> <REGSTO T>) + (<REGSTO T> + <LABEL:TAG .START> + <EMIT '<INTGO!-OP!-PACKAGE>> + <SET TEM + <COND (.GENR <DOEVS .ELD <DATUM ANY-AC ANY-AC>>) + (ELSE <GEN .EL <DATUM ANY-AC ANY-AC>>)>> + <EMIT <INSTRUCTION `PUSH `TP* <ADDRSYM <CHTYPE <DATTYP .TEM> AC>>>> + <EMIT <INSTRUCTION `PUSH `TP* <ADDRSYM <CHTYPE <DATVAL .TEM> AC>>>> + <RET-TMP-AC .TEM> + <REGSTO T> + <EMIT <INSTRUCTION `SOSE -1 `(P) >> + <BRANCH:TAG .START>)> + <LABEL:TAG .END>)>)> + <COND (<NOT .SFLG> + <COND (.DOFLG <EMIT <INSTRUCTION `MOVEI `D* <* .DOFLG 2>>>) + (ELSE <EMIT '<`MOVE `D* `(P) >> <EMIT '<`ASH `D* 1>>)> + <EMIT '<`AOS `(P) >>) + (<EMIT <INSTRUCTION `MOVEI `D* <* .DOFLG 2>>>)> + <SET NW <TUPLE:FINAL>> + <COND (<==? .W DONT-CARE> .NW) (ELSE <MOVE:ARG .W .NW>)>> + +<SETG NAMVEC '![ITUPLE ILIST IFORM IVECTOR IUVECTOR ISTRING IBYTES!]> + +<SETG IERS + ![,ISTR-GEN + ,ISTR-GEN + ,IVEC-GEN + ,IVEC-GEN + ,ILIST-GEN + ,ILIST-GEN + ,ITUPLE-GEN!]> + +<DEFINE WOFBYTE (SIZ VAL "AUX" (M <MOD 36 .SIZ>) (NUM </ 36 .SIZ>)) + #DECL ((SIZ VAL NUM M) FIX) + <REPEAT ((TOT 0)) + #DECL ((TOT) FIX) + <SET TOT <CHTYPE <ORB <LSH .TOT .SIZ> .VAL> FIX>> + <AND <L? <SET NUM <- .NUM 1>> 0> <RETURN <LSH .TOT .M>>>>> +<ENDPACKAGE> \ No newline at end of file diff --git a/<mdl.comp>/lnqgen.mud.9 b/<mdl.comp>/lnqgen.mud.9 new file mode 100644 index 0000000..896d143 --- /dev/null +++ b/<mdl.comp>/lnqgen.mud.9 @@ -0,0 +1,230 @@ +<PACKAGE "LNQGEN"> + +<ENTRY LENGTH?-GEN> + +<USE "CODGEN" "COMCOD" "CACS" "CHKDCL" "COMPDEC" "COMTEM"> + +<DEFINE LENGTH?-GEN (N W + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" QDAT (STR <1 <KIDS .N>>) (FLG <>) (NUM <2 <KIDS .N>>) + (TYP <RESULT-TYPE .STR>) (TPS <STRUCTYP .TYP>) + (TYP1 <COND (<ISTYPE? .TYP>) (ELSE .TPS)>) + (FLS <==? .W FLUSHED>) (SDIR .DIR) (B3 <MAKE:TAG>) NK + NN + (B2 + <COND (<AND .FLS .BRANCH> .BRANCH) + (ELSE <MAKE:TAG>)>) SAC NAC STRD NUMD TEM T1 + (TEMP? <==? .TPS TEMPLATE>) (RW .W)) + #DECL ((N STR NUM) NODE (QDAT STRD NUMD) DATUM (SAC NAC) AC (NN) FIX + (TPS TYP1 B2 B3) ATOM (NK FLS DIR SDIR NOTF BRANCH) <OR FALSE ATOM>) + <SET W <GOODACS .N .W>> + <COND (<==? <NODE-TYPE .NUM> ,QUOTE-CODE> + <SET NK T> + <COND (<OR <L? <SET NN <NODE-NAME .NUM>> 0> <G? .NN 262144>> + <MESSAGE ERROR " ARG OUT OF RANGE LENGTH? " .NN>)>) + (ELSE <SET NK <>>)> + <AND .NOTF <SET DIR <NOT .DIR>>> + <COND + (<==? .TPS LIST> + <SET STRD <GEN .STR <DATUM .TYP1 ANY-AC>>> + <COND + (.NK + <PUT <SET NUMD <REG? FIX .W>> + ,DATVAL + <SET NAC <GETREG .NUMD>>> + <EMIT <INSTRUCTION `MOVSI <ACSYM .NAC> <- -1 .NN>>>) + (ELSE + <SET NUMD <GEN .NUM DONT-CARE>> + <COND (<TYPE? <DATVAL .NUMD> AC> + <EMIT <INSTRUCTION `MOVNS <ADDRSYM <SET NAC <DATVAL .NUMD>>>>>) + (ELSE + <EMIT <INSTRUCTION `MOVN + <ACSYM <SET NAC <GETREG .NUMD>>> + !<ADDR:VALUE .NUMD>>> + <RET-TMP-AC <DATVAL .NUMD> .NUMD> + <PUT .NUMD ,DATVAL .NAC>)> + <RET-TMP-AC <DATTYP .NUMD> .NUMD> + <PUT .NUMD ,DATTYP FIX> + <EMIT <INSTRUCTION `MOVSI <ACSYM .NAC> -1 (<ADDRSYM .NAC>)>>)> + <VAR-STORE> + <PUT .NAC ,ACPROT T> + <TOACV .STRD> + <PUT .NAC ,ACPROT <>> + <SET SAC <DATVAL .STRD>> + <MUNG-AC .SAC .STRD> + <MUNG-AC .NAC .NUMD> + <EMIT <INSTRUCTION `JUMPE + <ACSYM .SAC> + <COND (.DIR .B2) (ELSE .B3)>>> + <EMIT <INSTRUCTION `HRRZ <ACSYM .SAC> (<ADDRSYM .SAC>)>> + <EMIT <INSTRUCTION `AOBJN <ACSYM .NAC> '.HERE!-OP!-PACKAGE -2>> + <RET-TMP-AC .STRD> + <COND (<AND .BRANCH .FLS> + <COND (<NOT .DIR> <BRANCH:TAG .B2> <LABEL:TAG .B3>)> + <RET-TMP-AC .NUMD>) + (<OR .NOTF <NOT <==? <NOT .BRANCH> <NOT .DIR>>>> + <RET-TMP-AC .NUMD> + <COND (<AND .NOTF .DIR> <BRANCH:TAG .B3> <LABEL:TAG .B2>)> + <MOVE:ARG <REFERENCE .SDIR> .W> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B3>) + (ELSE + <COND (.BRANCH + <BRANCH:TAG .B3> + <LABEL:TAG .B2> + <EMIT <INSTRUCTION `MOVEI <ACSYM .NAC> (<ADDRSYM .NAC>)>> + <SET W <MOVE:ARG .NUMD .W>> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B3>) + (ELSE + <COND (<==? .NAC <DATVAL .W>> <RET-TMP-AC .NAC .NUMD>)> + <COND (<==? <DATTYP .NUMD> <DATTYP .W>> + <RET-TMP-AC <DATTYP .NUMD> .NUMD>)> + <RET-TMP-AC <MOVE:ARG <REFERENCE <>> .W>> + <BRANCH:TAG .B2> + <LABEL:TAG .B3> + <EMIT <INSTRUCTION `MOVEI <ACSYM .NAC> (<ADDRSYM .NAC>)>> + <SET W <MOVE:ARG .NUMD .W>> + <LABEL:TAG .B2>)>)>) + (ELSE + <COND + (<AND <N==? .TPS STRING> <N==? .TPS BYTES> + .NK + <OR .FLS .NOTF <N==? <NOT .BRANCH> <NOT .DIR>>>> + <COND (.TEMP? + <SET STRD <GEN .STR DONT-CARE>> + <RET-TMP-AC <DATTYP .STRD> .STRD>) + (<SET STRD <GEN .STR <DATUM .TYP1 ANY-AC>>>)> + <VAR-STORE> + <COND (.TEMP? + <SET QDAT <DATUM FIX ANY-AC>> + <COND (<TYPE? <DATVAL .STRD> AC> + <PUT .QDAT ,DATVAL <DATVAL .STRD>>) + (ELSE <PUT .QDAT ,DATVAL <GETREG .QDAT>>)> + <GET:TEMPLATE:LENGTH <ISTYPE? .TYP> .STRD .QDAT> + <EMIT <INSTRUCTION <COND (<COND (<AND .BRANCH .FLS> .DIR) + (ELSE .DIR)> + `CAIL ) + (ELSE `CAIG )> + <ACSYM <DATVAL .QDAT>> + .NN>> + <RET-TMP-AC .QDAT>) + (<EMIT <INSTRUCTION <COND (<COND (<AND .BRANCH .FLS> .DIR) + (ELSE <NOT .DIR>)> + `CAML ) + (ELSE `CAMG )> + <ACSYM <SET SAC <DATVAL .STRD>>> + [<FORM + (<- <* .NN + <COND (<OR <==? .TPS VECTOR> + <==? .TPS TUPLE>> + 2) + (ELSE 1)>>>)>]>>)> + <RET-TMP-AC .STRD> + <SET FLG T>) + (<OR <==? .TPS STRING> <==? .TPS BYTES>> + <SET STRD <GEN .STR DONT-CARE>> + <RET-TMP-AC <DATVAL .STRD> .STRD> + <COND (<TYPE? <DATTYP .STRD> AC> + <SET STRD <DATUM FIX <SET NAC <DATTYP <SET NUMD .STRD>>>>> + <SET SAC + <COND (<AND <TYPE? .W DATUM> <TYPE? <DATVAL .W> AC>> + <SGETREG <DATVAL .W> .STRD>) + (<ACRESIDUE .NAC> <GETREG .STRD>) + (ELSE .NAC)>> + <PUT .STRD ,DATVAL .SAC> + <COND (<N==? .NAC .SAC> + <EMIT <INSTRUCTION `MOVEI <ACSYM .SAC> (<ADDRSYM .NAC>)>> + <RET-TMP-AC .NAC .NUMD>) + (ELSE + <RET-TMP-AC .NUMD> + <SGETREG .SAC .STRD> + <MUNG-AC .SAC .STRD> + <EMIT <INSTRUCTION `MOVEI + <ACSYM .SAC> + (<ADDRSYM .NAC>)>>)>) + (ELSE + <SET SAC + <COND (<AND <TYPE? .W DATUM> <TYPE? <DATVAL .W> AC>> + <SGETREG <DATVAL .W> <>>) + (ELSE <GETREG <>>)>> + <EMIT <INSTRUCTION `HRRZ <ACSYM .SAC> !<ADDR:TYPE .STRD>>> + <RET-TMP-AC <DATTYP .STRD> .STRD> + <SET STRD <DATUM FIX .SAC>> + <PUT .SAC ,ACLINK (.STRD !<ACLINK .SAC>)>)>) + (ELSE + <SET STRD <GEN .STR DONT-CARE>> + <RET-TMP-AC <DATTYP .STRD> .STRD> + <COND + (<AND <TYPE? .W DATUM> + <TYPE? <DATVAL .STRD> AC> + <==? <DATVAL .W> <DATVAL .STRD>>> + <COND (.TEMP? + <GET:TEMPLATE:LENGTH .STRD <SET SAC <DATVAL .STRD>>>) + (ELSE + <EMIT <INSTRUCTION + `HLRES <ADDRSYM <SET SAC <DATVAL .STRD>>>>>)>) + (ELSE + <SET SAC + <COND (<AND <TYPE? .W DATUM> <TYPE? <DATVAL .W> AC>> + <SGETREG <DATVAL .W> .STRD>) + (ELSE <GETREG .STRD>)>> + <RET-TMP-AC .STRD> + <PUT .SAC ,ACPROT T> + <COND (.TEMP? <GET:TEMPLATE:LENGTH <ISTYPE? .TYP> .STRD .SAC>) + (<EMIT <INSTRUCTION `HLRE <ACSYM .SAC> !<ADDR:VALUE .STRD>>>)> + <PUT .SAC ,ACPROT <>> + <PUT .STRD ,DATVAL .SAC>)> + <PUT .STRD ,DATTYP FIX> + <COND (<NOT .TEMP?> + <EMIT <INSTRUCTION `MOVNS <ADDRSYM .SAC>>> + <COND (<OR <==? .TPS VECTOR> <==? .TPS TUPLE>> + <EMIT <INSTRUCTION `ASH <ACSYM .SAC> -1>>)>)>)> + <COND (<NOT .FLG> + <MUNG-AC .SAC .STRD> + <SET NUMD <GEN .NUM DONT-CARE>> + <RET-TMP-AC <DATTYP .NUMD> .NUMD> + <VAR-STORE> + <PUT .NUMD ,DATTYP FIX> + <COND (<N==? .SAC <DATVAL .STRD>> + <COND (<ACLINK .SAC> <TOACV .STRD> <SET SAC <DATVAL .STRD>>) + (ELSE + <MOVE:VALUE <DATVAL .STRD> .SAC> + <PUT .SAC ,ACLINK (.STRD !<ACLINK .SAC>)> + <PUT .STRD ,DATVAL .SAC>)>)> + <IMCHK <COND (<COND (<AND .BRANCH .FLS> .DIR) + (<OR .NOTF <N==? <NOT .BRANCH> <NOT .DIR>>> + <NOT .DIR>) + (ELSE <AND <SET FLG <=? .W .STRD>> .DIR>)> + '(`CAMG `CAIG )) + (ELSE '(`CAMLE `CAILE ))> + <ACSYM .SAC> + <DATVAL .NUMD>> + <RET-TMP-AC .NUMD>)> + <COND (<AND .BRANCH .FLS> + <BRANCH:TAG .BRANCH> + <OR .FLG <RET-TMP-AC .STRD>>) + (<OR .NOTF <N==? <NOT .BRANCH> <NOT .DIR>>> + <OR .FLG <RET-TMP-AC .STRD>> + <BRANCH:TAG .B2> + <COND (.BRANCH + <MOVE:ARG <REFERENCE .SDIR> .W> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2>)>) + (ELSE + <COND (.BRANCH + <COND (<NOT .FLG> <BRANCH:TAG .B2>)> + <RET-TMP-AC <MOVE:ARG .STRD .W>> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2>) + (ELSE + <BRANCH:TAG .B2> + <RET-TMP-AC <MOVE:ARG .STRD .W>> + <BRANCH:TAG .B3> + <LABEL:TAG .B2> + <MOVE:ARG <REFERENCE <>> .W> + <LABEL:TAG .B3>)>)>)> + <MOVE:ARG .W .RW>> + +<ENDPACKAGE> +  \ No newline at end of file diff --git a/<mdl.comp>/mapana.mud.231 b/<mdl.comp>/mapana.mud.231 new file mode 100644 index 0000000..e66683f --- /dev/null +++ b/<mdl.comp>/mapana.mud.231 @@ -0,0 +1,398 @@ +<PACKAGE "MAPANA"> + +<ENTRY MAPPER-AN MAPRET-STOP-ANA MAPLEAVE-ANA MENTROPY MAUX MAUX1 MTUPLE MBAD + MOPT MOPT2 MARGS-ANA MNORM> + +<USE "SYMANA" "CHKDCL" "COMPDEC" "ADVMESS"> + +<SETG SPECIAL-MAPF-R-SUBRS ![,LIST ,+ ,* ,MAX ,MIN!]> + +<DEFINE MAPPER-AN (MNOD MRTYP + "AUX" (K <KIDS .MNOD>) TT ITRNOD FAP T TF (MPSTRS ()) + (R? <==? <NODE-SUBR .MNOD> ,MAPR>) (TUPCNT 1) + (RETYPS NO-RETURN) TEM ASSU L-D L-V D-V VALSPCD SBR + (SBRL <>) (SEGFX ()) FINTYPE STATE (FRET T) (FSTOP T) + (OV .VARTBL) NSTR (CHF <>)) + #DECL ((FAP ITRNOD) NODE (K) <LIST [REST NODE]> (TUPCNT TT NSTR) FIX + (MPSTRS L-V D-V) <SPECIAL LIST> (R?) <SPECIAL <OR ATOM FALSE>> + (STATE) <SPECIAL FIX> (SEGFX) <SPECIAL <LIST [REST NODE]>> + (MNOD) <SPECIAL NODE> (OV) SYMTAB + (FRET FSTOP MRTYP RETYPS) <SPECIAL ANY> (VALSPCD) <SPECIAL LIST> + (ASSU L-D) LIST (SBRL) <OR UVECTOR FALSE>) + <SET TF <EANA <SET FAP <1 .K>> ANY <NODE-NAME .MNOD>>> + <COND (<AND <SET SBR <SUBAP? .FAP>> + <SET SBRL <MEMQ ,.SBR ,SPECIAL-MAPF-R-SUBRS>>> + <PUT .FAP ,NODE-TYPE ,MFIRST-CODE> + <COND (<N==? ,.SBR ,LIST> <SET FINTYPE '<OR FIX FLOAT>> <SET STATE 1>) + (ELSE <SET FINTYPE LIST>)> + <PUT .FAP ,NODE-SUBR <LENGTH .SBRL>>)> + <PUT .MNOD ,STACKS <* <SET NSTR <- <LENGTH .K> 2>> 2>> + <SET ITRNOD <2 .K>> + <MAPF <> + <FUNCTION (N) + #DECL ((N) NODE) + <COND (<L? <MINL <RESULT-TYPE .N>> 1> <SET CHF T>)>> + <REST .K 2>> + <COND + (<==? <SET TT <NODE-TYPE .ITRNOD>> ,MFCN-CODE> + <PUT .ITRNOD ,SIDE-EFFECTS <>> + <MAPF <> + <FUNCTION (N "AUX" RT R) + #DECL ((N) NODE) + <SET RT <EANA .N STRUCTURED <NODE-NAME .MNOD>>> + <COND (<AND .VERBOSE + <OR <NOT <SET R <STRUCTYP .RT>>> <==? .R TEMPLATE>>> + <ADDVMESS + .MNOD + ("Non-specific structure for MAPF/R: " + .N + " type is: " + .RT)>)>> + <SET K <REST .K 2>>> + <SET L-D <SAVE-L-D-STATE .VARTBL>> + <PROG ((HTMPS 0) (TMPS 0) (VARTBL <SYMTAB .ITRNOD>) (KK .K) (LL .LIFE) + (OVV .VERBOSE)) + #DECL ((HTMPS TMPS) <SPECIAL FIX> (VARTBL) <SPECIAL SYMTAB> + (KK) <LIST [REST NODE]>) + <COND (.VERBOSE <PUTREST <SET VERBOSE .OVV> ()>)> + <SET LIFE .LL> + <SET L-V ()> + <SET FSTOP T> + <RESET-VARS .VARTBL .OV> + <MUNG-L-D-STATE .VARTBL> + <SET K .KK> + <SET RETYPS NO-RETURN> + <SET ASSU <BUILD-TYPE-LIST .OV>> + <SET VALSPCD <BUILD-TYPE-LIST .OV>> + <REPEAT ((CNT <+ .NSTR 1>) (B <BINDING-STRUCTURE .ITRNOD>)) + #DECL ((B) <LIST [REST SYMTAB]> (CNT) FIX) + <COND (<L? <SET CNT <- .CNT 1>> 0> <RETURN>)> + <PUT <1 .B> ,CODE-SYM 3> + <PUT <1 .B> ,USED-AT-ALL T> + <SET B <REST .B>>> + <REPEAT ((BNDS <REST <BINDING-STRUCTURE .ITRNOD> <+ .NSTR 1>>)) + <COND (<EMPTY? .BNDS> + <AND <NOT <EMPTY? .K>> + <MESSAGE ERROR + "MAPF FUNC TAKES TOO FEW ARGS. " + .ITRNOD>> + <RETURN>)> + <AND <APPLY <NTH ,MAPANALS <CODE-SYM <1 .BNDS>>> + <1 .BNDS> + <COND (<NOT <EMPTY? .K>> <1 .K>)>> + <SET BNDS <REST .BNDS>>> + <OR <EMPTY? .K> <SET K <REST .K>>>> + <PUT .ITRNOD ,VSPCD (())> + <PROG ((STMPS .TMPS) (SHTMPS .HTMPS) (LL .LIFE) (OV .VERBOSE)) + #DECL ((STMPS SHTMPS) FIX) + <COND (.VERBOSE <PUTREST <SET VERBOSE .OV> ()>)> + <SET LIFE .LL> + <SET FRET T> + <SET TMPS .STMPS> + <SET HTMPS .SHTMPS> + <PUT .ITRNOD ,ASSUM <BUILD-TYPE-LIST .VARTBL>> + <PUT .ITRNOD ,ACCUM-TYPE NO-RETURN> + <SET TEM <SEQ-AN <KIDS .ITRNOD> <INIT-DECL-TYPE .ITRNOD>>> + <OR <NOT <AGND .ITRNOD>> + <ASSUM-OK? <ASSUM .ITRNOD> <AGND .ITRNOD>> + <AGAIN>>> + <COND (<N==? .TEM NO-RETURN> + <COND (<NOT .FRET> + <SET L-V <MSAVE-L-D-STATE .L-V .OV>> + <ASSERT-TYPES <ORUPC .VARTBL <VSPCD .ITRNOD>>>) + (ELSE <SET L-V <SAVE-L-D-STATE .OV>>)>) + (<N==? <ACCUM-TYPE .ITRNOD> NO-RETURN> + <ASSERT-TYPES <VSPCD .ITRNOD>>)> + <SET VALSPCD <ORUPC .OV .VALSPCD>> + <OR <ASSUM-OK? .ASSU <BUILD-TYPE-LIST .VARTBL>> <AGAIN>> + <PUT .ITRNOD ,ACCUM-TYPE <TYPE-MERGE .TEM <ACCUM-TYPE .ITRNOD>>> + <PUT .ITRNOD + ,RESULT-TYPE + <TYPE-OK? <ACCUM-TYPE .ITRNOD> <INIT-DECL-TYPE .ITRNOD>>>> + <ASSERT-TYPES .VALSPCD> + <COND (<ASSIGNED? STATE> + <FIX-STATE <ACCUM-TYPE .ITRNOD> .ITRNOD> + <COND (<G? .STATE 4> + <SET SBRL <>> + <PUT .FAP ,NODE-TYPE ,GVAL-CODE> + <SET FINTYPE '<OR FIX FLOAT>>) + (ELSE + <SET FINTYPE <NTH '![FIX FLOAT FLOAT!] <- .STATE 1>>>)>)> + <SAVE-SURVIVORS .L-D .LIFE T> + <SAVE-SURVIVORS .L-V .LIFE> + <SET D-V + <COND (.FSTOP <SAVE-L-D-STATE .VARTBL>) + (ELSE <MSAVE-L-D-STATE .D-V .VARTBL>)>> + <FREST-L-D-STATE .D-V> + <SET LIFE <KILL-REM .LIFE .OV>> + <COND (.SBRL <MUNG-SEGS .SEGFX>)> + <COND (<SIDE-EFFECTS .ITRNOD> + <PUT .MNOD + ,SIDE-EFFECTS + (!<SIDE-EFFECTS .ITRNOD> !<SIDE-EFFECTS .MNOD>)>)> + <COND (<AND <==? <NODE-TYPE .FAP> ,QUOTE-CODE> + <==? <NODE-NAME .FAP> #FALSE ()>> + <TYPE-OK? <COND (.CHF <TYPE-MERGE FALSE .TEM .RETYPS>) + (ELSE <TYPE-OK? <TYPE-MERGE .TEM .RETYPS> .MRTYP>)> + .MRTYP>) + (<ASSIGNED? FINTYPE> + <COND (<==? .FINTYPE LIST> + <TYPE-OK? <TYPE-MERGE <FORM LIST + [REST <RESULT-TYPE .ITRNOD>]> + .RETYPS> + .MRTYP>) + (ELSE <TYPE-OK? <TYPE-MERGE .FINTYPE .RETYPS> .MRTYP>)>) + (<AND <==? <NODE-TYPE .FAP> ,GVAL-CODE> + <MEMQ <NODE-NAME .FAP> '![VECTOR UVECTOR!]>> + <SET TEM <FORM <NODE-NAME .FAP> [REST .TEM]>> + <TYPE-OK? <TYPE-MERGE .RETYPS .TEM> .MRTYP>) + (ELSE <TYPE-OK? <TYPE-MERGE <APPLTYP .FAP> .RETYPS> .MRTYP>)>) + (ELSE + <COND (<N==? .TT ,MPSBR-CODE> <EANA .ITRNOD APPLICABLE <NODE-NAME .MNOD>>)> + <MAPF <> + <FUNCTION (N "AUX" RT R) + #DECL ((N) NODE) + <SET RT <EANA .N STRUCTURED <NODE-NAME .MNOD>>> + <COND (<AND .VERBOSE + <OR <NOT <SET R <STRUCTYP .RT>>> <==? .R TEMPLATE>>> + <ADDVMESS + .MNOD + ("Non-specific structure for MAPF/R: " + .N + " type is: " + .RT)>)>> + <SET MPSTRS <REST .K 2>>> + <COND (<==? .TT ,MPSBR-CODE> + <SET TEM <EANA <1 <KIDS .ITRNOD>> ANY <NODE-NAME .MNOD>>> + <COND (.CHF <SET TEM <TYPE-MERGE .TEM FALSE>>)>) + (ELSE <SET TEM ANY>)> + <COND (<ASSIGNED? STATE> + <FIX-STATE .TEM <1 <KIDS .ITRNOD>>> + <COND (<G? .STATE 4> + <SET SBRL <>> + <PUT .FAP ,NODE-TYPE ,GVAL-CODE> + <SET FINTYPE '<OR FIX FLOAT>>) + (ELSE + <SET FINTYPE <NTH '![FIX FLOAT FLOAT!] <- .STATE 1>>>)>)> + <COND (.SBRL <MUNG-SEGS .SEGFX>)> + <COND (<AND <==? <NODE-TYPE .FAP> ,QUOTE-CODE> + <==? <NODE-NAME .FAP> #FALSE ()>> + <TYPE-OK? .TEM .MRTYP>) + (<ASSIGNED? FINTYPE> + <COND (<==? .FINTYPE LIST> + <TYPE-OK? <FORM LIST [REST .TEM]> .MRTYP>) + (ELSE <TYPE-OK? .FINTYPE .MRTYP>)>) + (<AND <==? <NODE-TYPE .FAP> ,GVAL-CODE> + <MEMQ <NODE-NAME .FAP> '![VECTOR UVECTOR!]>> + <SET TEM <FORM <NODE-NAME .FAP> [REST .TEM]>> + <TYPE-OK? <TYPE-MERGE .RETYPS .TEM> .MRTYP>) + (ELSE <TYPE-OK? <APPLTYP .FAP> .MRTYP>)>)>> + +\ + +<DEFINE FIX-STATE (TEM N "AUX" TT (SG <MEMQ <NODE-TYPE .N> ,SEG-CODES>)) + #DECL ((STATE TT) FIX (N) NODE) + <SET TT + <COND (<==? .TEM FIX> 1) + (<==? .TEM FLOAT> 2) + (<NOT <TYPE-OK? .TEM FLOAT>> + <PUT .N + ,RESULT-TYPE + <COND (.SG + <TYPE-MERGE '<STRUCTURED [REST FIX]> + <RESULT-TYPE .N>>) + (ELSE FIX)>> + 1) + (<NOT <TYPE-OK? .TEM FIX>> + <PUT .N + ,RESULT-TYPE + <COND (.SG + <TYPE-MERGE '<STRUCTURED [REST FLOAT]> + <RESULT-TYPE .N>>) + (ELSE FLOAT)>> + 2) + (ELSE 3)>> + <SET STATE <NTH <NTH ,ASTATE .STATE> .TT>>> + +<SETG SEG-CODES ![,SEG-CODE ,SEGMENT-CODE!]> + +<DEFINE MUNG-SEGS (SEGS) + #DECL ((SEGS) <LIST [REST NODE]>) + <MAPF <> + <FUNCTION (N) #DECL ((N) NODE) <PUT .N ,NODE-TYPE ,SEG-CODE>> + .SEGS>> + +<DEFINE MARGS-ANA (N R "AUX" (MK .MPSTRS) (NN <NODE-NAME .N>)) + #DECL ((N) NODE (NN) FIX (MK) <LIST [REST NODE]>) + <SET R + <TYPE-OK? <GET-ELE-TYPE <RESULT-TYPE <NTH .MK .NN>> ALL .R?> + .R>> + <COND (.R? <TYPE-OK? .R '<STRUCTURED ANY>>) (ELSE .R)>> + +<DEFINE MAUX (SYM STRUC) + #DECL ((SYM) SYMTAB (STRUC) <OR FALSE NODE>) + <COND (.STRUC <MESSAGE ERROR "TOO MANY ARGS TOO MAPF FCN ">) + (ELSE <NORM-BAN .SYM>)> + T> + +<DEFINE MAUX1 (SYM STRUC) + #DECL ((SYM) SYMTAB (STRUC) <OR FALSE NODE>) + <COND (.STRUC <MESSAGE ERROR "TOO MANY ARGS TO MAPF FCN ">)> + T> + +<DEFINE MNORM (SYM STRUC "AUX" (VARTBL <NEXT-SYM .SYM>) TEM COD N) + #DECL ((SYM) SYMTAB (STRUC) <OR NODE FALSE> (VARTBL) <SPECIAL SYMTAB> + (MNOD N) NODE) + <COND (.STRUC + <PUT .SYM ,PURE-SYM <>> ;"Tell VARANA to allocate me." + <OR <SET TEM + <TYPE-OK? <GET-ELE-TYPE <RESULT-TYPE .STRUC> ALL .R?> + <1 <DECL-SYM .SYM>>>> + <MESSAGE ERROR "BAD MAP FUNC ARG " <NAME-SYM .SYM>>> + <COND (.R? <SET TEM <TYPE-AND .TEM '<STRUCTURED ANY>>>)> + <COND (<N=? .TEM <1 <DECL-SYM .SYM>>> + <PUT .SYM ,CURRENT-TYPE .TEM>)> + <PUT .SYM ,COMPOSIT-TYPE .TEM>) + (ELSE <MESSAGE ERROR "TOO FEW MAPF ARGS FOR FCN ">)> + T> + +<DEFINE MOPT (SYM STRUC "AUX" (VARTBL <NEXT-SYM .SYM>)) + #DECL ((SYM) SYMTAB (VARTBL) <SPECIAL SYMTAB> (STRUC) <OR FALSE NODE>) + <COND (.STRUC <PUT .SYM ,INIT-SYM <>> <MNORM .SYM .STRUC>) + (ELSE <NORM-BAN .SYM>)> + T> + +<DEFINE MBAD (SYM STRUC) <MESSAGE ERROR "BAD ARG DECL IN MAP FCN " <NAME-SYM .SYM>>> + +<DEFINE MOPT2 (SYM STRUC) <COND (.STRUC <MNORM .SYM .STRUC>)> T> +\ + +<DEFINE MTUPLE (SYM STRUC + "AUX" (VARTBL <NEXT-SYM .SYM>) + (ATYP + <GET-ELE-TYPE <1 <DECL-SYM .SYM>> + <SET TUPCNT <+ .TUPCNT 1>>>)) + <COND (.STRUC + <COND (.R? + <SET TEM <EANA .STRUC STRUCTURED .NAME>> + <==? <STRUCTYP .TEM> <STRUCTYP .ATYP>>) + (ELSE + <OR <TYPE-OK? <GET-ELE-TYPE <EANA .STRUC STRUCTURED .NAME> + ALL> + .ATYP> + <MESSAGE ERROR "BAD MAP FCN ARG " <NAME-SYM .SYM>>>)> + <>) + (ELSE T)>> + +<DEFINE MENTROPY (N R) T> + +<SETG MAPANALS + [,MENTROPY + ,MAUX + ,MAUX1 + ,MTUPLE + ,MBAD + ,MOPT + ,MOPT + ,MOPT2 + ,MOPT2 + ,MBAD + ,MENTROPY + ,MNORM + ,MNORM]> + +"Additional SUBR analyzers associated with MAP hackers." + +<DEFINE MAPLEAVE-ANA (N R "AUX" (K <KIDS .N>) (LN <LENGTH .K>) TEM) + #DECL ((N) NODE (K) <LIST [REST NODE]> (LN) FIX) + <COND (<ASSIGNED? MNOD> + <ARGCHK .LN '(0 1) MAPLEAVE> + <COND (<0? .LN> + <PUT .N + ,KIDS + <SET K (<NODE1 ,QUOTE-CODE .N ATOM T ()>)>>)> + <SET TEM <EANA <1 .K> .MRTYP MAPLEAVE>> + <SET VALSPCD <ORUPC .VARTBL .VALSPCD>> + <SET D-V + <COND (.FSTOP <SAVE-L-D-STATE .VARTBL>) + (ELSE <MSAVE-L-D-STATE .D-V .VARTBL>)>> + <SET FSTOP <>> + <SET RETYPS <TYPE-MERGE .RETYPS .TEM>> + <PUT .N ,NODE-TYPE ,MAPLEAVE-CODE>) + (ELSE <SUBR-C-AN .N .R>)> + NO-RETURN> + +\ + +<DEFINE MAPRET-STOP-ANA (NOD R "AUX" (ARGS 0) (TYP NO-RETURN) TYP1 ITRNOD) + #DECL ((MNOD NOD ITRNOD) NODE (ARGS) FIX) + <PROG () + <OR <ASSIGNED? MNOD> <RETURN <SUBR-C-AN .NOD .R>>> + <SET ITRNOD <2 <KIDS .MNOD>>> + <OR <NODE-NAME <1 <KIDS .MNOD>>> + <MESSAGE ERROR " NOTHING TO MAPSTOP/RET TO " .MNOD>> + <MAPF <> + <FUNCTION (N) + #DECL ((N) NODE) + <COND (<OR <==? <NODE-TYPE .N> ,SEGMENT-CODE> + <==? <NODE-TYPE .N> ,SEG-CODE>> + <SET TYP1 + <EANA <1 <KIDS .N>> + <COND (<ASSIGNED? STATE> + '<STRUCTURED [REST <OR FIX FLOAT>]>) + (ELSE STRUCTURED)> + SEGMENT>> + <COND (<ASSIGNED? STATE> <SET STATE 5>) + (ELSE <SET SEGFX (.N !.SEGFX)>)> + <SET TYP <TYPE-MERGE .TYP <GET-ELE-TYPE .TYP1 ALL>>> + <PUT .NOD ,SEGS T>) + (ELSE + <SET ARGS <+ .ARGS 1>> + <SET TYP + <TYPE-MERGE + .TYP + <EANA .N + <COND (<ASSIGNED? STATE> '<OR FIX FLOAT>) + (ELSE ANY)> + <NODE-NAME .NOD>>>>)>> + <KIDS .NOD>> + <AND <ASSIGNED? STATE> <N==? .TYP NO-RETURN> <FIX-STATE .TYP .NOD>> + <COND (<==? <NODE-SUBR .NOD> ,MAPRET> + <SET L-V + <COND (.FRET <SAVE-L-D-STATE .VARTBL>) + (ELSE <MSAVE-L-D-STATE .L-V .VARTBL>)>> + <PUT .ITRNOD + ,VSPCD + <COND (.FRET <BUILD-TYPE-LIST .VARTBL>) + (ELSE <ORUPC .VARTBL <VSPCD .ITRNOD>>)>> + <SET FRET <>>) + (ELSE + <SET D-V + <COND (.FSTOP <SAVE-L-D-STATE .VARTBL>) + (ELSE <MSAVE-L-D-STATE .D-V .VARTBL>)>> + <SET VALSPCD <ORUPC .VARTBL .VALSPCD>> + <SET FSTOP <>>)> + <PUT <2 <KIDS .MNOD>> + ,ACCUM-TYPE + <TYPE-MERGE <ACCUM-TYPE <2 <KIDS .MNOD>>> .TYP>> + <PUT .NOD ,STACKS <* .ARGS 2>> + <PUT .NOD ,NODE-TYPE ,MAPRET-STOP-CODE>> + NO-RETURN> + +<PUT ,MAPLEAVE ANALYSIS ,MAPLEAVE-ANA> + +<PUT ,MAPRET ANALYSIS ,MAPRET-STOP-ANA> + +<PUT ,MAPSTOP ANALYSIS ,MAPRET-STOP-ANA> + +<DEFINE SUBAP? (NOD "AUX" TT (COD 0)) + #DECL ((COD) FIX (NOD) NODE) + <AND <OR <==? <SET COD <NODE-TYPE .NOD>> ,FGVAL-CODE> + <==? .COD ,GVAL-CODE> + <==? .COD ,MFIRST-CODE>> + <==? <NODE-TYPE <SET NOD <1 <KIDS .NOD>>>> ,QUOTE-CODE> + <GASSIGNED? <SET TT <NODE-NAME .NOD>>> + <TYPE? ,.TT SUBR> + .TT>> + +<ENDPACKAGE> diff --git a/<mdl.comp>/mapgen.mud.71 b/<mdl.comp>/mapgen.mud.71 new file mode 100644 index 0000000..c2772a0 --- /dev/null +++ b/<mdl.comp>/mapgen.mud.71 @@ -0,0 +1,1565 @@ +<PACKAGE "MAPGEN"> + +<ENTRY MAPFR-GEN MAPRET-STOP-GEN MAPLEAVE-GEN NOTIMP MBINDERS MPARGS-GEN + MOPTG MOPTG2> + +<USE "CODGEN" "CACS" "COMCOD" "COMPDEC" "CHKDCL" "CARGEN" "CUP" "NEWREP" "CARGEN"> + + +" Definitions of offsets into MAPINFO vector used by MAP hackers inferiors." + +<SETG MAP-STRS 1> + +<SETG MAP-SRC 2> + +\ + +<SETG MAP-FR 3> + +<SETG MAP-TAG 4> + +<SETG MAP-STK 5> + +<SETG MAP-STOF 6> + +<SETG MAP-OFF 7> + +<SETG MAP-TGL 8> + +<SETG MAP-STSTR 9> + +<SETG MAP-STKFX 10> + +<SETG MAP-POFF 11> + +<MANIFEST MAP-FR MAP-TAG MAP-STK MAP-STOF MAP-OFF MAP-TGL MAP-STSTR MAP-STKFX MAP-POFF + MAP-SRC MAP-STRS> +\ + +<DEFINE MAPFR-GEN (NOD WHERE "AUX" (K <KIDS .NOD>) (COD <NODE-TYPE <2 .K>>)) + #DECL ((NOD) NODE (COD) FIX (K) <LIST [REST NODE]>) + <COND + (<==? .COD ,MFCN-CODE> <REGSTO <> <>> <HMAPFR .NOD .WHERE .K>) + (ELSE + <REGSTO <>> + <PROG ((FAP <1 .K>) MPINFO (INRAP <2 .K>) (W <GOODACS .NOD .WHERE>) + (DTEM <DATUM FIX ANY-AC>) F? FF? (MAYBE-FALSE <>) (ANY? <>) + (NARG <LENGTH <SET K <REST .K 2>>>) (RW .WHERE) (POFF 0) + (R? <==? <NODE-SUBR .NOD> ,MAPR>) (OFFS 0) (STKOFFS <>) + (MAPEND <ILIST .NARG '<MAKE:TAG "MAP">>) (MAPLP <MAKE:TAG "MAP">) + (SUBRC <AP? .FAP>) (STB .STK) STOP (STK (0 !.STK)) TT) + #DECL ((FAP INRAP) NODE (DTEM) DATUM (NARG POFF OFFS) FIX + (STKOFFS) <OR FALSE LIST> (MAPLP) ATOM (MAPEND) <LIST [REST + ATOM]> + (STK) <SPECIAL LIST> (STOP STB) LIST + (MPINFO) <SPECIAL <VECTOR <LIST [REST NODE]> + DATUM + <OR FALSE ATOM> + <LIST [REST ATOM]> + ANY + <OR FALSE LIST> + FIX + LIST + LIST + <PRIMTYPE LIST> + FIX>>) + <SET WHERE + <COND (<==? .WHERE FLUSHED> FLUSHED) (ELSE <GOODACS .NOD .WHERE>)>> + <SET F? <DO-FIRST-SETUP .FAP .WHERE <> <> <> <>>> + <OR .F? <SET FF? <==? <NODE-TYPE .FAP> ,MFIRST-CODE>>> + <SET ANY? <PUSH-STRUCS .K T <> () <>>> + <SET STOP .STK> + <SET STK (0 !.STK)> + <COND (.F? <SET MAYBE-FALSE <DO-FINAL-SETUP .FAP .SUBRC>>)> + <REGSTO <>> + <LABEL:TAG .MAPLP> + <EMIT '<INTGO!-OP!-PACKAGE>> + <COND (<N==? .COD ,MPSBR-CODE> + <RET-TMP-AC <STACK:ARGUMENT <GEN .INRAP DONT-CARE>>> + <ADD:STACK 2>)> + <COND (.F? <SET STKOFFS <FIND-FIRST-STRUC .DTEM .STB <NOT .PRE>>>)> + <SET OFFS <- 1 <* .NARG 2>>> + <SET MPINFO + [.K + .DTEM + .R? + .MAPEND + .F? + .STKOFFS + .OFFS + () + .STK + '(0) + <SET POFF <COND (.MAYBE-FALSE -2) (.F? -1) (ELSE 0)>>]> + <SET STK (0 !.STK)> + <COND + (<==? .COD ,MPSBR-CODE> + <COND (.F? + <DO-STACK-ARGS .MAYBE-FALSE <GEN <1 <KIDS .INRAP>> DONT-CARE>>) + (.FF? + <DO-FUNNY-HACK <GEN <1 <KIDS .INRAP>> DONT-CARE> + (<- .OFFS 1> ()) + .NOD + .FAP + <1 <KIDS .INRAP>>>) + (<N==? .WHERE FLUSHED> + <MOVE:ARG <GEN <1 <KIDS .INRAP>> .W> + <DATUM <SET TT <ADDRESS:C <+ -2 .OFFS> '`(TP) >> + .TT>>) + (ELSE <GEN <1 <KIDS .INRAP>> FLUSHED>)>) + (ELSE + <REPEAT ((I .NARG)) + #DECL ((I) FIX) + <RET-TMP-AC <STACK:ARGUMENT <MPARGS-GEN .NOD DONT-CARE>>> + <AND <0? <SET I <- .I 1>>> <RETURN>>> + <SUBR:CALL APPLY <+ .NARG 1>> + <COND (.F? <DO-STACK-ARGS .MAYBE-FALSE <FUNCTION:VALUE>>) + (.FF? + <DO-FUNNY-HACK <FUNCTION:VALUE> + (<- .OFFS 1> ()) + .NOD + .FAP + .INRAP>) + (<N==? .WHERE FLUSHED> + <MOVE:ARG <FUNCTION:VALUE> + <DATUM <SET TT <ADDRESS:C <+ -2 .OFFS> '`(TP) >> + .TT>>)>)> + <COND (<AND .F? <NOT .STKOFFS>> <RET-TMP-AC .DTEM>)> + <COND (.ANY? <EMIT <INSTRUCTION `SETZM .POFF '`(P) >>)> + <BRANCH:TAG .MAPLP> + <GEN-TAGS <MAP-TGL .MPINFO> <>> + <MAPF <> + <FUNCTION (N) + #DECL ((N) NODE) + <COND (<NOT <ISTYPE? <STRUCTYP <RESULT-TYPE .N>>>> + <EMIT '<`SETZM |DSTORE >> + <MAPLEAVE>)>> + .K> + <COND (.F? <SET WHERE <DO-LAST .SUBRC .MAYBE-FALSE .WHERE>>) + (.FF? <SET WHERE <DO-FUNNY-LAST .FAP <- .OFFS 2> .WHERE>>) + (<N==? .WHERE FLUSHED> + <SET WHERE + <MOVE:ARG <DATUM <SET TT <ADDRESS:C <+ -2 .OFFS> '`(TP) >> + .TT> + .WHERE>>)> + <POP:LOCS .STOP .STB> + <SET STK .STB> + <MOVE:ARG .WHERE .RW>>)>> + +\ + +<DEFINE PUSH-STRUCS (K SM ACS BST NONO "AUX" (NL <>) S TEM TT NEW) + #DECL ((K) <LIST [REST NODE]> (BST) <LIST [REST SYMTAB]> (S) SYMTAB) + <MAPF <> + <FUNCTION (N "AUX" (RT <RESULT-TYPE .N>)) + #DECL ((N) NODE) + <COND (.ACS + <SET TEM + <GEN .N + <COND (<SET TT <ISTYPE-GOOD? .RT>> <DATUM .TT ANY-AC>) + (ELSE <DATUM ANY-AC ANY-AC>)>>> + <COND (.TT + <RET-TMP-AC <DATTYP .TEM> .TEM> + <PUT .TEM ,DATTYP .TT>)> + <COND (<TYPE? .NONO DATUM> + <COND (<OR <==? <DATVAL .NONO> <DATTYP .TEM>> + <==? <DATTYP .NONO> <DATTYP .TEM>>> + <SET NEW <DATUM <GETREG <>> <DATVAL .TEM>>> + <PUT <DATTYP .NEW> ,ACPROT T>)> + <COND (<OR <==? <DATVAL .NONO> <DATVAL .TEM>> + <==? <DATTYP .NONO> <DATVAL .TEM>>> + <COND (<ASSIGNED? NEW> + <PUT .NEW ,DATVAL <GETREG <>>> + <PUT <DATTYP .NEW> ,ACPROT <>>) + (ELSE + <SET NEW + <DATUM <DATTYP .TEM> <GETREG <>>>>)>)> + <SET TEM <MOVE:ARG .TEM .NEW>>)> + <MUNG-AC <DATVAL .TEM>> + <SET S <1 .BST>> + <COND (<TYPE? <ADDR-SYM .S> TEMPV> + <SET TT <CREATE-TMP .TT>> + <PUT .S + ,ADDR-SYM + <CHTYPE (.BSTB + .TT + <COND (<=? .AC-HACK '(FUNNY-STACK)> + <* <TOTARGS .FCN> -2>) + (ELSE 0)> + !.TMPS) + TEMPV>>)> + <PUT .S ,INACS .TEM> + <PUT .S ,STORED <>> + <COND (<TYPE? <SET TT <DATTYP .TEM>> AC> + <PUT .TT ,ACRESIDUE (.S !<ACRESIDUE .TT>)>)> + <PUT <SET TT <DATVAL .TEM>> ,ACRESIDUE (.S !<ACRESIDUE .TT>)> + <RET-TMP-AC .TEM> + <SET BST <REST .BST>>) + (ELSE + <RET-TMP-AC <STACK:ARGUMENT <GEN .N DONT-CARE>>> + <AND .SM <ADD:STACK 2>>)> + <COND (<AND <SET RT <STRUCTYP .RT>> + <NOT .ACS> + <OR <==? .RT LIST> <==? .RT TEMPLATE>>> + <SET NL T>) + (<NOT .RT> <SET NL T>)>> + .K> + <COND (.NL <EMIT '<`PUSH `P* [-1]>> <AND .SM <ADD:STACK PSLOT>>)> + .NL> + +<DEFINE KEEP-IN-ACS (BST K R? "AUX" D S PTYP) + #DECL ((BST) <LIST [REST SYMTAB]> (K) <LIST [REST NODE]>) + <MAPF <> + <FUNCTION (S N + "AUX" (D <INACS .S>) (PTYP <STRUCTYP <RESULT-TYPE .N>>) A1 A) + #DECL ((S) SYMTAB (D) <OR DATUM FALSE> (N) NODE (A) AC) + <COND (<N==? <NAME-SYM .S> DUMMY-MAPF> <MAPLEAVE>)> + <COND (<AND <NOT .D> + <OR .R? <AND <N==? .PTYP STRING> <N==? .PTYP BYTES>>>> + <SET D + <MOVE:ARG <LADDR .S <> <>> + <DATUM <COND (<OR <==? .PTYP STRING> + <==? .PTYP BYTES>> + ANY-AC) + (ELSE .PTYP)> + ANY-AC>>> + <PUT .S ,INACS <DATUM <DATTYP .D> <DATVAL .D>>> + <PUT <SET A <DATVAL .D>> ,ACRESIDUE (.S !<ACRESIDUE .A>)> + <COND (<TYPE? <SET A1 <DATTYP .D>> AC> + <PUT .A1 ,ACRESIDUE (.S !<ACRESIDUE .A1>)>)> + <PUT .S ,STORED <>> + <RET-TMP-AC .D>)>> + .BST + .K> + T> + +<DEFINE REST-STRUCS (BST K LV NR TG R? "AUX" DAT PTYP (CNT 0) TEM ACFLG) + #DECL ((BST) <LIST [REST SYMTAB]> (K) <LIST [REST NODE]> (CNT) FIX + (LV) LIST) + <REPEAT ((BST .BST)) + #DECL ((BST) <LIST [REST SYMTAB]>) + <COND (<OR <EMPTY? .BST> <N==? <NAME-SYM <1 .BST>> DUMMY-MAPF>> <RETURN>)> + <SET CNT <+ .CNT 1>> + <SET PTYP <STRUCTYP <RESULT-TYPE <1 .K>>>> + <COND (<SET TEM <MEMQ <1 .BST> .LV>> <SET DAT <2 .TEM>>) + (ELSE <SET DAT <LADDR <1 .BST> <> <>>>)> + <COND (<TYPE? <DATVAL .DAT> AC> <SET ACFLG T>) (ELSE <SET ACFLG <>>)> + <COND + (<==? .PTYP LIST> + <COND (.ACFLG + <EMIT <INSTRUCTION `HRRZ + <ACSYM <DATVAL .DAT>> + (<ADDRSYM <DATVAL .DAT>>)>> + <COND (<1? .NR> + <EMIT <INSTRUCTION `JUMPN <ACSYM <DATVAL .DAT>> .TG>>)>) + (ELSE + <EMIT <INSTRUCTION `HRRZ `@ !<ADDR:VALUE .DAT>>> + <EMIT <INSTRUCTION `MOVEM !<ADDR:VALUE .DAT>>> + <COND (<1? .NR> <EMIT <INSTRUCTION `JUMPN .TG>>)>)>) + (<OR <==? .PTYP VECTOR> <==? .PTYP TUPLE>> + <COND (.ACFLG + <EMIT <INSTRUCTION `ADD <ACSYM <DATVAL .DAT>> '[<2 (2)>]>> + <COND (<1? .NR> + <EMIT <INSTRUCTION `JUMPL <ACSYM <DATVAL .DAT>> .TG>>)>) + (ELSE + <EMIT '<`MOVE [<2 (2)>]>> + <EMIT <INSTRUCTION `ADDB !<ADDR:VALUE .DAT>>> + <COND (<1? .NR> <EMIT <INSTRUCTION `JUMPL .TG>>)>)>) + (<OR <==? .PTYP UVECTOR> <==? .PTYP STORAGE>> + <COND (.ACFLG + <COND (<1? .NR> + <EMIT <INSTRUCTION `AOBJN <ACSYM <DATVAL .DAT>> .TG>>) + (<EMIT <INSTRUCTION `ADD + <ACSYM <DATVAL .DAT>> + '[<1 (1)>]>>)>) + (ELSE + <EMIT '<`MOVE [<1 (1)>]>> + <EMIT <INSTRUCTION `ADDB !<ADDR:VALUE .DAT>>> + <COND (<1? .NR> <EMIT <INSTRUCTION `JUMPL .TG>>)>)>) + (<OR <==? .PTYP STRING> <==? .PTYP BYTES>> + <COND (.R? + <EMIT <INSTRUCTION `IBP !<ADDR:VALUE .DAT>>> + <EMIT <INSTRUCTION `SOS !<ADDR:TYPE .DAT>>>)> + <COND (<1? .NR> + <COND (<TYPE? <DATTYP .DAT> AC> + <EMIT <INSTRUCTION `TRNE <ACSYM <DATTYP .DAT>> -1>> + <BRANCH:TAG .TG>) + (ELSE + <EMIT <INSTRUCTION `HRRZ `O* !<ADDR:TYPE .DAT>>> + <EMIT <INSTRUCTION `JUMPN `O* .TG>>)>)>)> + <SET BST <REST .BST>> + <SET K <REST .K>>> + <REPEAT () + <COND (<L? <SET CNT <- .CNT 1>> 0> <RETURN>)> + <PUT <1 .BST> ,STORED T> + <PUT <1 .BST> ,INACS <>> + <SET BST <REST .BST>>>> + +<DEFINE FIND-FIRST-STRUC (DTEM STB FL "AUX" DAC (STKOFFS <>)) + #DECL ((DTEM) DATUM (DAC) AC (STB) LIST) + <COND (<AND .FL <SET STKOFFS <STACK:L .STB <2 .FRMS>>>>) + (ELSE + <MOVE:ARG <REFERENCE 524290> .DTEM> + <PUT .DTEM ,DATTYP <ADDRESS:PAIR |$TTP >> + <EMIT <INSTRUCTION `IMUL + <ACSYM <SET DAC <DATVAL .DTEM>>> + '`(P) >> + <EMIT <INSTRUCTION `SUBM `TP* <ADDRSYM .DAC>>>)> + .STKOFFS> + +<DEFINE DO-FINAL-SETUP (FAP SUBRC "AUX" (MAYBE-FALSE <>)) + #DECL ((FAP) NODE) + <COND (<NOT .SUBRC> + <RET-TMP-AC <STACK:ARGUMENT <GEN .FAP DONT-CARE>>>)> + <COND (<AND <NOT .SUBRC> + <OR <NOT .REASONABLE> <N==? <NODE-TYPE .FAP> ,GVAL-CODE>> + <SET MAYBE-FALSE <TYPE-OK? <RESULT-TYPE .FAP> FALSE>>> + <EMIT '<`PUSH `P* [0]>> + <ADD:STACK PSLOT> + <PCOUNTER 1> + <EMIT '<GETYP!-OP!-PACKAGE `O* -1 `(TP) >> + <EMIT '<`CAIN `O* <TYPE-CODE!-OP!-PACKAGE FALSE>>> + <EMIT '<`SETOM -1 `(P) >>) + (ELSE <PCOUNTER <COND (.SUBRC 0) (ELSE 1)>>)> + <ADD:STACK PSTACK> + .MAYBE-FALSE> + +<DEFINE DO-STACK-ARGS (MAYBE-FALSE DAT "AUX" TT (T1 <MAKE:TAG>) (T2 + <MAKE:TAG>)) + #DECL ((DAT) DATUM (T1 T2) ATOM) + <COND + (<N==? .DAT ,NO-DATUM> + <COND (.MAYBE-FALSE + <SET DAT <MOVE:ARG .DAT <DATUM ANY-AC ANY-AC>>> + <EMIT '<`SKIPGE -1 `(P) >> + <BRANCH:TAG .T1> + <STACK:ARGUMENT .DAT> + <COUNTP> + <BRANCH:TAG .T2> + <LABEL:TAG .T1> + <RET-TMP-AC <MOVE:ARG .DAT + <DATUM <SET TT <ADDRESS:C -1 '`(TP) >> .TT>>> + <LABEL:TAG .T2>) + (<RET-TMP-AC <STACK:ARGUMENT .DAT>> <COUNTP>)>)>> + +\ + +<DEFINE DO-FUNNY-LAST (N OFFS W "AUX" TT TYP) + #DECL ((N) NODE (OFFS) FIX) + <COND (<==? <NODE-SUBR .N> 5> <SET OFFS <- .OFFS 2>>)> + <SET TYP <ISTYPE-GOOD? <RESULT-TYPE <PARENT .N>>>> + <SET TT <ADDRESS:C .OFFS '`(TP) >> + <MOVE:ARG <DATUM <COND (.TYP .TYP) (ELSE .TT)> .TT> .W>> + +<SETG MINS + '![![`CAMGE `CAMLE `IMULM `ADDM !] + ![`CAMGE `CAMLE `FMPRM `FADRM !]!]> + +<DEFINE DO-FUNNY-HACK (DAT OFFS N FAP NN + "AUX" (COD <NODE-SUBR .FAP>) (LMOD <RESULT-TYPE .NN>) + (MOD <RESULT-TYPE .N>) ACSY) + #DECL ((OFFS) <LIST FIX LIST> (DAT) DATUM (COD) FIX (N FAP NN) NODE) + <COND (<==? .COD 5> + <RET-TMP-AC <MOVE:ARG .DAT <DATUM ,AC-C ,AC-D>>> + <REGSTO T> + <EMIT '<`MOVEI `E* 0>> + <EMIT '<`PUSHJ `P* |CICONS >> + <EMIT <INSTRUCTION `SKIPE <1 .OFFS> !<2 .OFFS> '`(TP) >> + <EMIT <INSTRUCTION `HRRM + `@ + `B* + <1 .OFFS> + !<2 .OFFS> + '`(TP) >> + <EMIT <INSTRUCTION `MOVEM `B* <1 .OFFS> !<2 .OFFS> '`(TP) >> + <SET OFFS <STFIXIT .OFFS '(-2)>> + <EMIT <INSTRUCTION `SKIPN <1 .OFFS> !<2 .OFFS> '`(TP) >> + <EMIT <INSTRUCTION `MOVEM `B* <1 .OFFS> !<2 .OFFS> '`(TP) >>) + (ELSE + <SET DAT <MOVE:ARG .DAT <DATUM .LMOD ANY-AC>>> + <SET MOD <OR <AND <==? .MOD FIX> 1> 2>> + <AND <==? .MOD 2> <==? .LMOD FIX> <SET DAT <GEN-FLOAT .DAT>>> + <SET ACSY <ACSYM <DATVAL .DAT>>> + <RET-TMP-AC .DAT> + <EMIT <INSTRUCTION <NTH <NTH ,MINS .MOD> .COD> + .ACSY + <1 .OFFS> + !<2 .OFFS> + '`(TP) >> + <COND (<L? .COD 3> + <EMIT <INSTRUCTION `MOVEM + .ACSY + <1 .OFFS> + !<2 .OFFS> + '`(TP) >>)>)> + T> + +<DEFINE DO-LAST (SUBRC MAYBE-FALSE WHERE "AUX" TG TG2) + <REGSTO T> + <COND (.MAYBE-FALSE + <EMIT '<`POP `P* `A >> + <EMIT '<`POP `P* 0>> + <EMIT <INSTRUCTION `JUMPL `O <SET TG <MAKE:TAG>>>> + <COND (.SUBRC <GOOD-CALL .SUBRC>) + (ELSE <EMIT '<ACALL!-OP!-PACKAGE `A* APPLY>>)> + <BRANCH:TAG <SET TG2 <MAKE:TAG>>> + <LABEL:TAG .TG> + <EMIT '<`POP `TP* `B >> + <EMIT '<`POP `TP* `A >> + <LABEL:TAG .TG2> + <SET WHERE <MOVE:ARG <FUNCTION:VALUE T> .WHERE>>) + (ELSE + <EMIT '<`POP `P* `A >> + <COND (.SUBRC <GOOD-CALL .SUBRC>) + (ELSE <EMIT '<ACALL!-OP!-PACKAGE `A* APPLY>>)> + <SET WHERE <MOVE:ARG <FUNCTION:VALUE T> .WHERE>>)>> + +<DEFINE GOOD-CALL (SBR "AUX" TP SB) + #DECL ((TP) LIST) + <COND (<AND <GASSIGNED? .SBR> + <TYPE? <SET SB ,.SBR> SUBR> + <SET TP <GET-TMPS .SB>> + <G=? <LENGTH .TP> 4> + <==? <4 .TP> STACK>> + <EMIT <INSTRUCTION `PUSHJ `P* <6 .TP>>>) + (ELSE <EMIT <INSTRUCTION ACALL!-OP!-PACKAGE `A* .SBR>>)>> + +<SETG SLOT-FIRST [<CHTYPE <MIN> FIX> <CHTYPE <MAX> FIX> 1 0]> + +<SETG FSLOT-FIRST [<MIN> <MAX> 1.0 0.0000000]> + +\ + +<DEFINE DO-FIRST-SETUP (FAP W ACS CHF ONES FLS + "AUX" (COD 0) + (TYP <ISTYPE? <RESULT-TYPE <PARENT .FAP>>>) DAT + TEM TT T1) + #DECL ((FAP) NODE (COD) FIX) + <COND + (<==? <NODE-TYPE .FAP> ,MFIRST-CODE> + <SET COD <NODE-SUBR .FAP>> + <COND (<==? .COD 5> + <STACK:ARGUMENT <REFERENCE <COND (.TYP <CHTYPE () .TYP>) + (ELSE ())>>> + <STACK:ARGUMENT <REFERENCE ()>> + <ADD:STACK 4> + <>) + (<NOT .ACS> + <STACK:ARGUMENT + <REFERENCE <COND (<==? .TYP FLOAT> <NTH ,FSLOT-FIRST .COD>) + (ELSE <NTH ,SLOT-FIRST .COD>)>>> + <ADD:STACK 2> + <>)>) + (<NODE-NAME .FAP> T) + (<NOT .ACS> + <RET-TMP-AC <STACK:ARGUMENT <REFERENCE <>>>> + <ADD:STACK 2> + <>)>> + +\ + +<DEFINE DO-FIRST-SETUP-2 (FAP W ACS CHF ONES FLS + "AUX" (COD 0) + (TYP <ISTYPE? <RESULT-TYPE <PARENT .FAP>>>) DAT + TEM TT T1) + #DECL ((FAP) NODE (COD) FIX (ACS) <OR FALSE SYMTAB>) + <COND + (<AND <NOT <NODE-NAME .FAP>> .FLS> <SET TEM <SET ACS <>>>) + (<==? <NODE-TYPE .FAP> ,MFIRST-CODE> + <SET COD <NODE-SUBR .FAP>> + <COND (<==? .COD 5> <SET TEM #FALSE (1)>) + (.ACS + <SET T1 + <MOVE:ARG <REFERENCE <COND (<==? .TYP FLOAT> + <NTH ,FSLOT-FIRST .COD>) + (ELSE <NTH ,SLOT-FIRST .COD>)>> + <GOODACS <PARENT .FAP> .W>>> + <SET TEM <>>) + (ELSE <SET TEM <>>)>) + (<NODE-NAME .FAP> <SET TEM T>) + (<AND .ACS <NOT .CHF>> + <SET DAT <GOODACS <PARENT .FAP> .W>> + <COND (<NOT .ONES> + <COND (<==? <SET TEM <DATTYP .DAT>> ANY-AC> + <PUT .DAT ,DATTYP <GETREG .DAT>>) + (<TYPE? .TEM AC> <SGETREG .TEM .DAT>)> + <COND (<==? <SET TEM <DATVAL .DAT>> ANY-AC> + <PUT .DAT ,DATVAL <GETREG .DAT>>) + (<TYPE? .TEM AC> <SGETREG .TEM .DAT>)>)> + <SET T1 .DAT> + <SET TEM <>>) + (.ACS + <SET T1 <MOVE:ARG <REFERENCE <>> <GOODACS <PARENT .FAP> .W>>> + <SET TEM <>>) + (ELSE <SET TEM <>>)> + <COND (<AND .ACS <NOT .TEM> <EMPTY? .TEM>> + <SET TT <CREATE-TMP .TYP>> + <PUT .ACS + ,ADDR-SYM + <CHTYPE (.BSTB + .TT + <COND (<=? .AC-HACK '(FUNNY-STACK)> + <* <TOTARGS .FCN> -2>) + (ELSE 0)> + !.TMPS) + TEMPV>> + <COND (<OR .CHF <NOT .ONES>> + <PUT .ACS ,INACS .T1> + <PUT .ACS ,STORED <>> + <PUT <SET TT <DATVAL .T1>> + ,ACRESIDUE + (.ACS !<ACRESIDUE .TT>)> + <COND (<AND <NOT .TYP> <TYPE? <DATTYP .T1> AC>> + <PUT <SET TT <DATTYP .T1>> + ,ACRESIDUE + (.ACS !<ACRESIDUE .TT>)>)>)> + <RET-TMP-AC .T1> + <>) + (ELSE .TEM)>> + +\ + +<DEFINE MPARGS-GEN (N W + "AUX" (MP .MPINFO) DAT TT ETAG + (STKD <STACK:L .STK <MAP-STSTR .MP>>) + (OFFS <FORM - <MAP-OFF .MP> !.STKD>)) + #DECL ((MP) + <VECTOR <LIST [REST NODE]> + DATUM + <OR FALSE ATOM> + <LIST [REST ATOM]> + ANY + <OR LIST FALSE> + FIX + LIST + LIST + LIST> + (STKD OFFS) + <PRIMTYPE LIST> + (DAT) + DATUM + (ETAG) + ATOM) + <COND (<NOT <MAP-STK .MP>> + <SET DAT <DATUM <SET TT <ADDRESS:C .OFFS '`(TP) >> .TT>> + <PUT .MP ,MAP-OFF <+ <MAP-OFF .MP> 2>>) + (<NOT <MAP-STOF .MP>> + <SET OFFS + <FORM + <MAP-OFF .MP> !<STACK:L .STK <MAP-STSTR .MP>>>> + <SET DAT + <DATUM <SET TT <SPEC-OFFPTR 0 <MAP-SRC .MP> VECTOR (.OFFS)>> + .TT>> + <PUT .MP ,MAP-OFF <+ <MAP-OFF .MP> 2>>) + (ELSE + <SET DAT + <DATUM <SET TT + <ADDRESS:C !<MAP-STOF .MP> + <COND (.AC-HACK `(FRM) ) (`(TB) )> + <COND (.AC-HACK <+ <* <TOTARGS .FCN> -2> 1>) + (0)>>> + .TT>>)> + <COND (<AND <MAP-STK .MP> <MAP-STOF .MP>> + <PUT .MP ,MAP-STOF (2 !<MAP-STOF .MP>)>)> + <SET W + <MOVE:ARG <STACKM <1 <MAP-STRS .MP>> + .DAT + <MAP-FR .MP> + <SET ETAG <1 <MAP-TAG .MP>>> + <MAP-POFF .MP>> + .W>> + <PUT .MP ,MAP-STRS <REST <MAP-STRS .MP>>> + <AND <EMPTY? <MAP-STRS .MP>> <RET-TMP-AC <MAP-SRC .MP>>> + <PUT .MP + ,MAP-TGL + ((.ETAG (<FORM - !<MAP-STKFX .MP>> !.STKD)) + !<MAP-TGL .MP>)> + <PUT .MP ,MAP-STKFX .STKD> + <PUT .MP ,MAP-TAG <REST <MAP-TAG .MP>>> + .W> + +\ + +<DEFINE STACKM (N SRC R? LBL POFF + "AUX" (STY <STRUCTYP <RESULT-TYPE .N>>) (COD 0) TT + (ETY <GET-ELE-TYPE <RESULT-TYPE .N> ALL>) SAC TEM) + #DECL ((N) NODE (SRC TEM) DATUM (SAC) AC (COD POFF) FIX) + <SET ETY <ISTYPE-GOOD? .ETY>> + <COND + (<OR <==? .STY TUPLE> <==? .STY VECTOR>> + <SET SAC + <DATVAL <SET TEM <MOVE:ARG .SRC <DATUM .STY ANY-AC> T>>>> + <EMIT <INSTRUCTION `JUMPGE <ACSYM .SAC> .LBL>> + <EMIT <INSTRUCTION `MOVE `O '[<2 (2)>]>> + <EMIT <INSTRUCTION `ADDM `O !<ADDR:VALUE .SRC>>> + <COND (.R? + <COND (<==? .STY TUPLE> <PUT .TEM ,DATTYP <DATTYP .SRC>>) + (ELSE .TEM)>) + (ELSE + <SET TT <OFFPTR 0 .TEM .STY>> + <COND (.ETY <DATUM .ETY .TT>) (ELSE <DATUM .TT .TT>)>)>) + (<==? .STY LIST> + <SET SAC + <DATVAL <SET TEM <MOVE:ARG .SRC <DATUM LIST ANY-AC> T>>>> + <EMIT <INSTRUCTION `SKIPL .POFF `(P) >> + <EMIT <INSTRUCTION `HRRZ <ACSYM .SAC> (<ADDRSYM .SAC>)>> + <EMIT <INSTRUCTION `JUMPE <ACSYM .SAC> .LBL>> + <EMIT <INSTRUCTION `MOVEM <ACSYM .SAC> !<ADDR:VALUE .SRC>>> + <MUNG-AC .SAC .TEM> + <COND (.R? .TEM) + (ELSE + <COND (<1? <SET COD <DEFERN <GET-ELE-TYPE <RESULT-TYPE .N> ALL>>>> + <EMIT <INSTRUCTION `MOVE <ACSYM .SAC> 1 (<ADDRSYM .SAC>)>>) + (<NOT <0? .COD>> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O (<ADDRSYM .SAC>)>> + <EMIT <INSTRUCTION `CAIN `O TDEFER!-OP!-PACKAGE>> + <EMIT <INSTRUCTION `MOVE <ACSYM .SAC> 1 (<ADDRSYM .SAC>)>>)> + <SET TT <OFFPTR 0 .TEM LIST>> + <DATUM <COND (.ETY .ETY) (ELSE .TT)> .TT>)>) + (<OR <==? .STY UVECTOR> <==? .STY STORAGE>> + <SET SAC + <DATVAL <SET TEM <MOVE:ARG .SRC <DATUM UVECTOR ANY-AC> T>>>> + <EMIT <INSTRUCTION `JUMPGE <ACSYM .SAC> .LBL>> + <EMIT <INSTRUCTION `MOVE `O '[<1 (1)>]>> + <EMIT <INSTRUCTION `ADDM `O !<ADDR:VALUE .SRC>>> + <COND (.R? .TEM) + (ELSE + <SET TT <OFFPTR -1 .TEM UVECTOR>> + <DATUM <COND (.ETY .ETY) (ELSE .TT)> .TT>)>) + (<OR <==? .STY STRING> <==? .STY BYTES>> + <EMIT <INSTRUCTION `HRRZ `O !<ADDR:TYPE .SRC>>> + <EMIT <INSTRUCTION `SOJL `O .LBL>> + <COND (.R? + <SET TEM <MOVE:ARG .SRC <DATUM ANY-AC ANY-AC> T>> + <EMIT <INSTRUCTION `HRRM `O !<ADDR:TYPE .SRC>>> + <EMIT <INSTRUCTION `IBP !<ADDR:VALUE .SRC>>> + .TEM) + (ELSE + <EMIT <INSTRUCTION `HRRM `O !<ADDR:TYPE .SRC>>> + <SET TEM <DATUM <COND (<==? .STY STRING> CHARACTER) + (ELSE FIX)> ANY-AC>> + <PUT .TEM ,DATVAL <GETREG .TEM>> + <EMIT <INSTRUCTION `ILDB + <ACSYM <DATVAL .TEM>> + !<ADDR:VALUE .SRC>>> + .TEM)>) + (ELSE ;"Don't know type of structure, much more hair." + <RET-TMP-AC <MOVE:ARG .SRC <FUNCTION:VALUE> T>> + <REGSTO T> + <SET TEM <FUNCTION:VALUE T>> + <PUT ,AC-D ,ACPROT T> + <EMIT '<`PUSHJ `P* |TYPSEG >> + <EMIT <INSTRUCTION `SKIPL .POFF '`(P) >> + <EMIT '<`XCT |INCR1 `(C) >> + <EMIT '<`XCT |TESTR `(C) >> + <BRANCH:TAG .LBL> + <COND (.R? + <EMIT '<`MOVE `A* |DSTORE>> + <EMIT '<`MOVE `B* `D >>) + (ELSE + <EMIT '<`XCT |TYPG `(C) >> + <EMIT '<`XCT |VALG `(C) >> + <EMIT '<`JSP `E* |CHKAB >>)> + <EMIT '<`MOVE `O |DSTORE>> + <EMIT <INSTRUCTION `MOVEM `O !<ADDR:TYPE .SRC>>> + <EMIT <INSTRUCTION `MOVEM `D* !<ADDR:VALUE .SRC>>> + <EMIT '<`SETZM |DSTORE>> + <PUT ,AC-D ,ACPROT <>> + .TEM)>> + +<DEFINE ISET (TYP S1 S2 R? TG CHF NRG TG2 + "AUX" (PTYP <STRUCTYP .TYP>) D1 A1 A2 COD D2 + (ETYP + <TYPE-AND <1 <DECL-SYM .S2>> <GET-ELE-TYPE .TYP ALL .R?>>) + TEM (TT <ISTYPE-GOOD? <1 <DECL-SYM .S2>>>) ET (BIND <>)) + #DECL ((S1 S2) SYMTAB (D1) <OR DATUM FALSE> (A1) AC (COD NR) FIX + (FSYM) <OR FALSE SYMTAB>) + <LVAL-UP .S1> + <SET D1 <INACS .S1>> + <COND (<AND <NOT .D1> <OR .R? <AND <N==? .PTYP STRING> <N==? .PTYP BYTES>>>> + <SET D1 + <MOVE:ARG <LADDR .S1 <> <>> + <DATUM <COND (<OR <==? .PTYP STRING> <==? .PTYP BYTES>> + ANY-AC) + (ELSE .PTYP)> + ANY-AC>>> + <PUT .S1 ,INACS <DATUM <DATTYP .D1> <DATVAL .D1>>> + <PUT <SET A1 <DATVAL .D1>> ,ACRESIDUE (.S1 !<ACRESIDUE .A1>)> + <RET-TMP-AC .D1>) + (<NOT .D1> <SET D1 <LADDR .S1 <> <>>>) + (ELSE <SET A1 <DATVAL .D1>>)> + <COND (<INACS .S1> <PUT .S1 ,STORED <>>)> + <COND (<OR .CHF <NOT <1? .NRG>>> + <RETURN-UP .INRAP .STK> + <COND (<==? .PTYP LIST> <EMIT <INSTRUCTION `JUMPE <ACSYM .A1> .TG>>) + (<OR <==? .PTYP VECTOR> + <==? .PTYP UVECTOR> + <==? .PTYP TUPLE> + <==? .PTYP STORAGE>> + <EMIT <INSTRUCTION `JUMPGE <ACSYM .A1> .TG>>) + (<TYPE? <SET A2 <DATTYP .D1>> AC> + <EMIT <INSTRUCTION `TRNN <ACSYM .A2> -1>> + <BRANCH:TAG .TG>) + (ELSE + <EMIT <INSTRUCTION `HRRZ `O* !<ADDR:TYPE .D1>>> + <EMIT <INSTRUCTION `JUMPE `O* .TG>>)>)> + <COND (<1? .NRG> + <LABEL:TAG .TG2> + <OR .PRE + <PROG () + <SALLOC:SLOTS <TMPLS .INRAP>> + <ADD:STACK <TMPLS .INRAP>> + <SET NTSLOTS (<FORM GVAL <TMPLS .INRAP>> !.NTSLOTS)> + <SET GSTK .STK> + <SET STK (0 !.STK)>>> + <AND .PRE <SET GSTK .STK> <SET STK (0 !.STK)>>)> + <COND (<TYPE? <ADDR-SYM .S2> TEMPV> + <SET TT <CREATE-TMP .TT>> + <PUT .S2 + ,ADDR-SYM + <CHTYPE (.BSTB + .TT + <COND (<=? .AC-HACK '(FUNNY-STACK)> + <* <TOTARGS .FCN> -2>) + (ELSE 0)> + !.TMPS) + TEMPV>>) + (ELSE <SET BIND T>)> + <COND + (.R? + <COND (.BIND <BINDUP .S2 <DATUM !.D1>>) + (ELSE <PUT .S2 ,INACS <SET D2 <DATUM !.D1>>>)>) + (ELSE + <COND (<NOT .BIND> + <COND (<TYPE? <DATTYP .D1> AC> <PUT <DATTYP .D1> ,ACPROT T>)> + <COND (<TYPE? <DATVAL .D1> AC> <PUT <DATVAL .D1> ,ACPROT T>)> + <COND (<SET ET <ISTYPE-GOOD? .ETYP>> + <PUT <SET D2 <DATUM .ET ANY-AC>> ,DATVAL <GETREG .D2>>) + (ELSE + <PUT <SET D2 <DATUM ANY-AC ANY-AC>> + ,DATTYP + <SET TEM <GETREG .D2>>> + <PUT .TEM ,ACPROT T> + <PUT .D2 ,DATVAL <GETREG .D2>> + <PUT .TEM ,ACPROT <>>)> + <COND (<TYPE? <DATVAL .D1> AC> <PUT <DATVAL .D1> ,ACPROT <>>)> + <COND (<TYPE? <DATTYP .D1> AC> <PUT <DATTYP .D1> ,ACPROT <>>)> + <PUT .S2 ,INACS .D2>) + (ELSE <SET ET <ISTYPE-GOOD? .ETYP>>)> + <COND + (<==? .PTYP LIST> + <COND (.BIND + <COND (<TYPE? <DATVAL .D1> AC> <PUT <DATVAL .D1> ,ACPROT T>)> + <SET TEM <GETREG <>>> + <COND (<TYPE? <DATVAL .D1> AC> <PUT <DATVAL .D1> ,ACPROT <>>)>) + (ELSE <SET TEM <DATVAL .D2>>)> + <COND (<NOT <0? <SET COD <DEFERN .ETYP>>>> + <COND (<1? .COD> + <EMIT <INSTRUCTION `MOVE <ACSYM .TEM> 1 (<ADDRSYM .A1>)>>) + (ELSE + <EMIT <INSTRUCTION `MOVE <ACSYM .TEM> <ADDRSYM .A1>>> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE + `O* + (<ADDRSYM .A1>)>> + <EMIT '<`CAIN `O* TDEFER!-OP!-PACKAGE>> + <EMIT <INSTRUCTION `MOVE + <ACSYM .TEM> + 1 + (<ADDRSYM .TEM>)>>)> + <SET A1 .TEM>)> + <COND (<NOT .BIND> + <COND (<NOT .ET> + <EMIT <INSTRUCTION `MOVE + <ACSYM <DATTYP .D2>> + (<ADDRSYM .A1>)>>)> + <EMIT <INSTRUCTION `MOVE + <ACSYM <DATVAL .D2>> + 1 + (<ADDRSYM .A1>)>>) + (ELSE + <SET TEM <OFFPTR 0 <DATUM LIST .A1> LIST>> + <BINDUP .S2 <DATUM .TEM .TEM>>)>) + (<OR <==? .PTYP VECTOR> <==? .PTYP TUPLE>> + <COND (.BIND + <SET TEM <OFFPTR 0 .D1 VECTOR>> + <BINDUP .S2 <DATUM .TEM .TEM>>) + (ELSE + <COND (<NOT .ET> + <EMIT <INSTRUCTION `MOVE + <ACSYM <DATTYP .D2>> + (<ADDRSYM .A1>)>>)> + <EMIT <INSTRUCTION `MOVE + <ACSYM <DATVAL .D2>> + 1 + (<ADDRSYM .A1>)>>)>) + (<OR <==? .PTYP UVECTOR> <==? .PTYP STORAGE>> + <COND (.BIND + <SET TEM <OFFPTR -1 .D1 .PTYP>> + <BINDUP .S2 + <COND (.ET <DATUM .ET .TEM>) (ELSE <DATUM .TEM .TEM>)>>) + (ELSE + <COND (<NOT .ET> + <EMIT <INSTRUCTION `HLRE + <ACSYM <DATTYP .D2>> + <ADDRSYM .A1>>> + <EMIT <INSTRUCTION `SUBM + <ACSYM .A1> + <ADDRSYM <DATTYP .D2>>>> + <EMIT <INSTRUCTION `MOVE + <ACSYM <DATTYP .D2>> + (<ADDRSYM <DATTYP .D2>>)>>)> + <EMIT <INSTRUCTION `MOVE + <ACSYM <DATVAL .D2>> + (<ADDRSYM .A1>)>>)>) + (<OR <==? .PTYP STRING> <==? .PTYP BYTES>> + <COND (.BIND + <COND (<TYPE? <DATTYP .D1> AC> <PUT <DATTYP .D1> ,ACPROT T>)> + <COND (<TYPE? <DATVAL .D1> AC> <PUT <DATVAL .D1> ,ACPROT T>)> + <SET A1 <GETREG <>>> + <EMIT <INSTRUCTION `ILDB <ACSYM .A1> !<ADDR:VALUE .D1>>> + <EMIT <INSTRUCTION `SOS !<ADDR:TYPE .D1>>> + <BINDUP .S2 <SET D2 <DATUM <COND (<==? .PTYP STRING> CHARACTER) + (ELSE FIX)> .A1>>> + <SET BIND <>> + <PUT .S2 ,INACS .D2> + <COND (<TYPE? <DATTYP .D1> AC> <PUT <DATTYP .D1> ,ACPROT <>>)> + <COND (<TYPE? <DATVAL .D1> AC> <PUT <DATVAL .D1> ,ACPROT <>>)>) + (ELSE + <EMIT <INSTRUCTION `ILDB + <ACSYM <DATVAL .D2>> + !<ADDR:VALUE .D1>>> + <EMIT <INSTRUCTION `SOS !<ADDR:TYPE .D1>>>)>)>)> + <COND (<NOT .BIND> + <COND (<TYPE? <DATTYP .D2> AC> + <PUT <SET A1 <DATTYP .D2>> + ,ACRESIDUE + (.S2 !<ACRESIDUE .A1>)>)> + <COND (<TYPE? <DATVAL .D2> AC> + <PUT <SET A1 <DATVAL .D2>> + ,ACRESIDUE + (.S2 !<ACRESIDUE .A1>)>)> + <PUT .S2 ,STORED <>> + <RET-TMP-AC .D2>)>> + +<DEFINE IISET (TYP SYM DAT R? + "AUX" (TT <ISTYPE-GOOD? <1 <DECL-SYM .SYM>>>) + (ETYP + <TYPE-AND <1 <DECL-SYM .SYM>> + <GET-ELE-TYPE .TYP ALL .R?>>) AC) + #DECL ((SYM) SYMTAB (DAT) DATUM) + <COND (<TYPE? <ADDR-SYM .SYM> TEMPV> + <SET TT <CREATE-TMP .TT>> + <PUT .SYM + ,ADDR-SYM + <CHTYPE (.BSTB + .TT + <COND (<=? .AC-HACK '(FUNNY-STACK)> + <* <TOTARGS .FCN> -2>) + (ELSE 0)> + !.TMPS) + TEMPV>>)> + <PUT .SYM + ,INACS + <SET DAT + <MOVE:ARG .DAT + <DATUM <COND (<ISTYPE-GOOD? .ETYP>) (ELSE ANY-AC)> + ANY-AC>>>> + <COND (<TYPE? <SET AC <DATTYP .DAT>> AC> + <PUT .AC ,ACRESIDUE (.SYM !<ACRESIDUE .AC>)>)> + <PUT <SET AC <DATVAL .DAT>> ,ACRESIDUE (.SYM !<ACRESIDUE .AC>)> + <PUT .SYM ,STORED <>> + <RET-TMP-AC .DAT>> + +<DEFINE DO-EVEN-FUNNIER-HACK (D1 S N FAP NN LV + "AUX" (COD <NODE-SUBR .FAP>) + (LMOD <RESULT-TYPE .NN>) + (MOD <RESULT-TYPE .N>) ACSY + (D2 <LADDR .S <> <>>)) + #DECL ((D1 D2 D3) DATUM (N FAP NN) NODE (COD) FIX) + <SET MOD <OR <AND <==? .MOD FIX> 1> 2>> + <AND <==? .MOD 2> <==? .LMOD FIX> <SET D1 <GENFLOAT .D1>>> + <SET ACSY <ACSYM <DATVAL .D1>>> + <RET-TMP-AC .D1> + <EMIT <INSTRUCTION <NTH <NTH ,MINS .MOD> .COD> + .ACSY + !<ADDR:VALUE .D2>>> + <COND (<L? .COD 3> + <COND (<TYPE? <DATVAL .D2> AC> + <EMIT <INSTRUCTION `MOVE + <ACSYM <DATVAL .D2>> + <ADDRSYM <DATVAL .D1>>>>) + (ELSE + <EMIT <INSTRUCTION `MOVEM .ACSY !<ADDR:VALUE + .D2>>>)>)>> + +\ + +<DEFINE HMAPFR (MNOD WHERE K + "AUX" XX (NTSLOTS .NTSLOTS) + (NTMPS + <COND (.PRE .TMPS) (<STACK:L .STK .BSTB>) (ELSE (0))>) + TEM (NSLOTS 0) (SPECD <>) STB (DTEM <DATUM FIX ANY-AC>) + (STKOFFS <>) (FAP <1 .K>) (INRAP <2 .K>) F? (POFF 0) + (ANY? <>) (NARG <LENGTH <SET K <REST .K 2>>>) START:TAG + (R? <==? <NODE-SUBR .MNOD> ,MAPR>) STRV (FF? <>) + (MAPEND <ILIST .NARG '<MAKE:TAG "MAP">>) (OSTK .STK) + (MAPLP <MAKE:TAG "MAP">) (MAPL2 <MAKE:TAG "MAP">) MAP:OFF + (SUBRC <AP? .FAP>) STOP (STK (0 !.STK)) (TMPS .TMPS) BTP + (BASEF .BASEF) (FRMS .FRMS) (MAYBE-FALSE <>) (OPRE .PRE) + (OTAG ()) DEST CD (AC-HACK .AC-HACK) + (EXIT <MAKE:TAG "MAPEX">) (APPLTAG <MAKE:TAG "MAPAP">) TT + GMF (OUTD .WHERE) OUTSAV CHF (FLS <==? .WHERE FLUSHED>) + (RTAG <MAKE:TAG "MAP">) (NEED-INT T) FSYM OS NS (DOIT T) + RV GSTK) + #DECL ((NTSLOTS) <SPECIAL LIST> (DTEM) DATUM + (SPECD) <SPECIAL <OR FALSE ATOM>> (TEM) <OR ATOM DATUM> (OFFS) FIX + (TMPS) <SPECIAL LIST> (POFF NSLOTS NARG) <SPECIAL FIX> (FAP) NODE + (BASEF MNOD INRAP) <SPECIAL NODE> (K) <LIST [REST NODE]> + (MAPEND) <LIST [REST ATOM]> (MAP:OFF) ATOM + (EXIT MAPLP RTAG APPLTAG) <SPECIAL ATOM> (OSTK) LIST + (DEST CD) <SPECIAL <OR ATOM DATUM>> (FRMS) <SPECIAL LIST> + (STOP STRV STB BTP STK GSTK) <SPECIAL LIST> + (AC-HACK START:TAG) <SPECIAL ANY> + (GMF MAYBE-FALSE ANY?) <SPECIAL ANY> (FSYM) SYMTAB) + <PUT .INRAP ,SPECS-START <- <SPECS-START .INRAP> .TOT-SPEC>> + <PROG ((PRE .PRE)) + #DECL ((PRE) <SPECIAL ANY>) + <COND (<AND <NOT <EMPTY? .K>> + <MAPF <> + <FUNCTION (Z) + <AND <TYPE-OK? <RESULT-TYPE .Z> + '<PRIMTYPE LIST>> + <MAPLEAVE <>>> + T> + .K>> + <SET NEED-INT <>>)> + <COND (<AND <NOT <AND <EMPTY? .K> <NODE-NAME .FAP>>> + <OR <==? <NODE-NAME .FAP> <>> + <AND <==? <NODE-TYPE .FAP> ,MFIRST-CODE> + <N==? <NODE-SUBR .FAP> 5>> + .SUBRC> + <OR <EMPTY? .K> + <==? <NAME-SYM <1 <BINDING-STRUCTURE .INRAP>>> + DUMMY-MAPF>>> + <SET GMF T>) + (ELSE <SET GMF <>>)> + <COND (<AND <NOT <EMPTY? .K>> + <L=? <MAPF ,MIN + <FUNCTION (N) + #DECL ((N) NODE) + <MINL <RESULT-TYPE .N>>> + .K> + 0>> + <SET CHF T>) + (ELSE <SET CHF <>>)> + <SET DEST <SET OUTD <COND (.FLS FLUSHED) (ELSE <GOODACS .MNOD .WHERE>)>>> + <OR .PRE <EMIT-PRE <NOT <OR <ACTIVATED .INRAP> <0? <SSLOTS .BASEF>>>>>> + <SET STOP .STK> + <SET STK (0 !.STK)> + <SET F? + <DO-FIRST-SETUP + .FAP + .DEST + <COND (.GMF + <SET FSYM <1 <BINDING-STRUCTURE .INRAP>>> + <PUT .INRAP ,BINDING-STRUCTURE <REST <BINDING-STRUCTURE .INRAP>>> + .FSYM)> + .CHF + <1? .NARG> + .FLS>> + <AND .GMF <NOT .FLS> <INACS .FSYM> <SET OUTD <INACS .FSYM>>> + <OR .F? <SET FF? <==? <NODE-TYPE .FAP> ,MFIRST-CODE>>> + <COND (<AND .GMF .CHF <NOT .FLS>> <PREFER-DATUM .WHERE>)> + <SET ANY? <PUSH-STRUCS .K T .GMF <BINDING-STRUCTURE .INRAP> .WHERE>> + <COND (.GMF <KEEP-IN-ACS <BINDING-STRUCTURE .INRAP> .K .R?>)> + <COND (<AND .GMF .CHF <NOT .FLS>> <UNPREFER>)> + <DO-FIRST-SETUP-2 .FAP .DEST <COND (.GMF .FSYM)> .CHF <1? .NARG> .FLS> + <BEGIN-FRAME <TMPLS .INRAP> <ACTIVATED .INRAP> <PRE-ALLOC .INRAP>> + <SET TMPS <COND (.PRE .NTMPS) (ELSE <STACK:L .STK <2 .FRMS>>)>> + <SET STK (0 !.STK)> + <SET STB .STK> + <SET STK (0 !.STK)> + <COND (.F? <SET MAYBE-FALSE <DO-FINAL-SETUP .FAP .SUBRC>>)> + <PROG-START-AC .INRAP> + <LABEL:TAG .MAPLP> + <COND (<AND .F? <NOT .GMF>> + <SET STKOFFS + <FIND-FIRST-STRUC + .DTEM .STB <AND <NOT .PRE> <NOT <ACTIVATED .INRAP>>>>>)> + <AND <ACTIVATED .INRAP> <ACT:INITIAL> <ADD:STACK 2>> + <SET STK (0 !.STK)> + <SET STRV .STK> + <OR .PRE + <AND .GMF <1? .NARG>> + <PROG () + <SALLOC:SLOTS <TMPLS .INRAP>> + <ADD:STACK <TMPLS .INRAP>> + <COND (<NOT .PRE> + <SET NTSLOTS (<FORM GVAL <TMPLS .INRAP>> !.NTSLOTS)>)> + <COND (.GMF <SET GSTK .STK> <SET STK (0 !.STK)>)>>> + <AND .PRE .GMF <NOT <1? .NARG>> <SET GSTK .STK> <SET STK (0 !.STK)>> + <SET POFF <COND (.MAYBE-FALSE -2) (.F? -1) (ELSE 0)>> + <COND (<AND .GMF <OR .CHF <NOT <1? .NARG>>> <NOT .FLS>> <LVAL-UP .FSYM>)> + <REPEAT ((KK .K) (BS <BINDING-STRUCTURE .INRAP>) + (BST + <COND + (<EMPTY? .BS> ()) + (ELSE + <MAPR <> + <FUNCTION (S) + #DECL ((S) <LIST SYMTAB>) + <COND (<N==? <NAME-SYM <1 .S>> DUMMY-MAPF> + <MAPLEAVE .S>) + (ELSE ())>> + .BS>)>) (OFFSET (<- 1 <* .NARG 2>> ())) TEM + (TOFF (0 ())) (GOFF '(0))) + #DECL ((BST) <LIST [REST SYMTAB]> (TOFF OFFSET) <LIST FIX LIST> + (KK) <LIST [REST NODE]>) + <COND + (<EMPTY? .KK> + <AND .GMF <NOT <1? .NARG>> <NOT .FF?> <NOT .FLS> <RET-TMP-AC .OUTD>> + <COND (<AND .F? <NOT .STKOFFS>> <RET-TMP-AC .DTEM>)> + <MAPF <> + <FUNCTION (SYM) + #DECL ((SYM) SYMTAB) + <APPLY <NTH ,MBINDERS <CODE-SYM .SYM>> .SYM>> + .BST> + <RETURN>) + (ELSE + <SET RV <TYPE? <ADDR-SYM <1 .BST>> TEMPV>> + <COND (.GMF) + (.F? + <COND (.STKOFFS + <SET TEM + <ADDRESS:C .STKOFFS + <COND (.AC-HACK `(FRM) ) (`(TB) )> + <COND (.AC-HACK 1) (ELSE 0)>>> + <OR .RV <SET STKOFFS <+ .STKOFFS 2>>>) + (ELSE + <SET TEM + <SPEC-OFFPTR <1 .OFFSET> + .DTEM + VECTOR + (!<2 .OFFSET> + !<STACK:L .STK .STRV>)>> + <SET OFFSET + <STFIXIT .OFFSET + (2 + <- <1 .TOFF>> + <FORM - 0 !<2 .TOFF>>)>>)>) + (ELSE + <SET TEM + <ADDRESS:C <FORM - <1 .OFFSET> !<STACK:L .STK .STRV>> + '`(TP) + !<2 .OFFSET>>> + <SET OFFSET <STFIXIT .OFFSET (2)>>)> + <IF <==? <CODE-SYM <1 .BST>> 4> + <MESSAGE ERROR "NOT IMPLEMENTED MAPF/R TUPLES ">> + <SET OTAG + ((<1 .MAPEND> + <COND (.GMF (<FORM + !.GOFF>)) + ((<FORM - 0 <1 .TOFF> !<2 .TOFF>> + <1 <SET TOFF <STFIXIT (0 ()) <STACK:L .STK .STRV>>>> + !<2 .TOFF>))>) + !.OTAG)> + <COND (.GMF + <ISET <RESULT-TYPE <1 .KK>> + <1 .BS> + <1 .BST> + .R? + <1 .MAPEND> + .CHF + .NARG + .MAPL2> + <SET BS <REST .BS>> + <SET GOFF <STACK:L .STK .GSTK>>) + (.RV + <RETURN-UP .INRAP .STK> + <IISET <RESULT-TYPE <1 .KK>> + <1 .BST> + <STACKM <1 .KK> <DATUM .TEM .TEM> .R? <1 .MAPEND> .POFF> + .R?>) + (ELSE + <BINDUP <1 .BST> + <STACKM <1 .KK> + <DATUM .TEM .TEM> + .R? + <1 .MAPEND> + .POFF>>)> + <SET MAPEND <REST .MAPEND>> + <SET KK <REST .KK>> + <SET BST <REST .BST>>)>> + <COND + (<AND .GMF <OR .CHF <NOT <1? .NARG>>> <NOT .FLS> <NOT .FF?>> + <PROG ((S .FSYM)) + <PUT .S ,STORED T> + <COND (<INACS .S> + <COND (<TYPE? <DATTYP <INACS .S>> AC> + <FLUSH-RESIDUE <DATTYP <INACS .S>> .S>)> + <COND (<TYPE? <DATVAL <INACS .S>> AC> + <FLUSH-RESIDUE <DATVAL <INACS .S>> .S>)> + <PUT .S ,INACS <>>)>>)> + <COND (<AND .GMF <NOT .CHF> <1? .NARG> <NOT .FLS>> <LVAL-UP .FSYM>)> + <OR .PRE + <0? <SET NSLOTS <SSLOTS .INRAP>>> + <PROG () + <SALLOC:SLOTS .NSLOTS> + <ADD:STACK .NSLOTS> + <EMIT-PRE <SET PRE T>>>> + <AND <ACTIVATED .INRAP> <ACT:FINAL>> + <SET BTP .STK> + <OR .OPRE <SET BASEF .INRAP>> + <SET STK (0 !.STK)> + <AND .NEED-INT <CALL-INTERRUPT>> + <COND + (<AND .R? + <NOT .F?> + <NOT .FF?> + .FLS + <1? .NARG> + <BLT-HACK <KIDS .INRAP> + <BINDING-STRUCTURE .INRAP> + <MINL <RESULT-TYPE <1 .K>>>>> + <SET DOIT <>>) + (<OR .F? .FF?> + <SET TEM <SEQ-GEN <KIDS .INRAP> <GOODACS .INRAP DONT-CARE> T>>) + (<NOT .FLS> + <SET TEM + <SEQ-GEN + <KIDS .INRAP> + <COND (.GMF .OUTD) + (ELSE + <DATUM <SET TT + <ADDRESS:C <FORM - + -1 + <* 2 .NARG> + !<STACK:L .STK .STRV>> + '`(TP) >> + .TT>)> + T>> + <SET OUTD .TEM>) + (ELSE <RET-TMP-AC <SET TEM <SEQ-GEN <KIDS .INRAP> FLUSHED T>>>)> + <COND + (<AND .DOIT <N==? .TEM ,NO-DATUM>> + <COND (<ACTIVATED .INRAP> <PROG:END> <LABEL:OFF .MAP:OFF>) + (<OR .OPRE .F?> + <AND .SPECD + <OR .OPRE <SET TEM <MOVE:ARG .TEM <DATUM ,AC-A ,AC-B>>>>> + <POP:LOCS .STK .STRV> + <UNBIND:FUNNY <SPECS-START .INRAP> !.NTSLOTS>) + (ELSE <UNBIND:LOCS .STK .STB>)> + <COND + (.F? <DO-STACK-ARGS .MAYBE-FALSE .TEM>) + (<AND .GMF .FF?> + <OR .PRE + <PROG () + <SET NTSLOTS <REST <SET NS .NTSLOTS>>> + <SET OS .STK> + <SET STK .STB>>> + <DO-EVEN-FUNNIER-HACK .TEM + .FSYM + .MNOD + .FAP + .INRAP + <LOOP-VARS .INRAP>>) + (<AND .GMF <NOT .FLS>> + <OR .PRE + <PROG () + <SET NTSLOTS <REST <SET NS .NTSLOTS>>> + <SET STK .STB>>> + <RET-TMP-AC .TEM> + <PUT .FSYM ,INACS .TEM> + <PUT .FSYM ,STORED <>> + <COND (<TYPE? <DATTYP .TEM> AC> + <PUT <DATTYP .TEM> + ,ACRESIDUE + (.FSYM !<ACRESIDUE <DATTYP .TEM>>)>)> + <PUT <DATVAL .TEM> ,ACRESIDUE (.FSYM !<ACRESIDUE <DATVAL .TEM>>)> + <PUT .FSYM ,STORED <>> + <COND + (<NOT <MEMQ .FSYM <LOOP-VARS .INRAP>>> + <REPEAT ((L <LOOP-VARS .INRAP>) LL) + #DECL ((L) LIST (LL) DATUM) + <COND (<EMPTY? .L> <RETURN>)> + <COND (<TYPE? <DATVAL <SET LL <LINACS-SLOT .L>>> AC> + <PUT <DATVAL .LL> ,ACPROT T>)> + <COND (<TYPE? <DATTYP .LL> AC> + <PUT <DATTYP .LL> ,ACPROT T>)> + <SET L <REST .L ,LOOPVARS-LENGTH>>> + <PUT + .INRAP + ,LOOP-VARS + (.FSYM + <PROG (R R2 D) + <SET D + <DATUM + <COND (<ISTYPE-GOOD? <RESULT-TYPE .MNOD>>) + (<AND <TYPE? .WHERE DATUM> + <TYPE? <SET R <DATTYP .WHERE>> AC> + <NOT <ACPROT .R>>> + <PUT <COND (<==? .R <DATVAL .TEM>> .R) + (ELSE <SGETREG .R <>>)> + ,ACPROT + T>) + (ELSE <PUT <SET R <GETREG <>>> ,ACPROT T>)> + <COND (<AND <TYPE? .WHERE DATUM> + <TYPE? <SET R2 <DATVAL .WHERE>> AC> + <NOT <ACPROT .R2>>> + <COND (<==? .R2 <DATVAL .TEM>> .R2) + (ELSE <SGETREG .R2 <>>)>) + (ELSE <SET R2 <GETREG <>>>)>>> + <COND (<AND <ASSIGNED? R>> + <TYPE? .R AC> + <PUT .R ,ACPROT <>>)> + .D> + !<LOOP-VARS .INRAP>)> + <REPEAT ((L <LOOP-VARS .INRAP>) LL) + #DECL ((L) LIST (LL) DATUM) + <COND (<EMPTY? .L> <RETURN>)> + <COND (<TYPE? <DATVAL <SET LL <LINACS-SLOT .L>>> AC> + <PUT <DATVAL .LL> ,ACPROT <>>)> + <COND (<TYPE? <DATTYP .LL> AC> + <PUT <DATTYP .LL> ,ACPROT <>>)> + <SET L <REST .L ,LOOPVARS-LENGTH>>>)>) + (.FF? <DO-FUNNY-HACK .TEM (<* .NARG -2> ()) .MNOD .FAP .INRAP>)> + <COND (.ANY? <EMIT <INSTRUCTION `SETZM .POFF '`(P) >>)> + <OR .PRE + <AND .GMF <NOT .FLS>> + <AND .GMF .FF?> + <PROG () + <SET NTSLOTS <REST <SET NS .NTSLOTS>>> + <SET STK .STB>>>)> + <COND + (.DOIT + <AGAIN-UP .INRAP <AND .GMF <1? .NARG>>> + <LABEL:TAG .RTAG> + <COND (.GMF + <REST-STRUCS <BINDING-STRUCTURE .INRAP> + .K + <LOOP-VARS .INRAP> + .NARG + .MAPL2 + .R?>)> + <COND (<NOT <AND .GMF <1? .NARG>>> <BRANCH:TAG .MAPLP>)> + <GEN-TAGS .OTAG .SPECD> + <COND (<AND .GMF <NOT .PRE>> <SET STK .GSTK> <SET NTSLOTS .NS>)> + <COND (<AND .GMF <NOT <1? .NARG>>> + <COND (<OR .OPRE .F?> + <POP:LOCS .STK .STRV> + <UNBIND:FUNNY <SPECS-START .INRAP> !.NTSLOTS>) + (ELSE <UNBIND:LOCS .STK .STB>)>)> + <MAPF <> + <FUNCTION (N) + #DECL ((N) NODE) + <COND (<NOT <ISTYPE? <STRUCTYP <RESULT-TYPE .N>>>> + <EMIT '<`SETZM |DSTORE >> + <MAPLEAVE>)>> + .K>) + (ELSE <GEN-TAGS .OTAG .SPECD>)> + <CLEANUP-STATE .INRAP> + <LABEL:TAG .APPLTAG> + <COND + (<TYPE? .DEST DATUM> + <SET CD + <COND (.F? <DO-LAST .SUBRC .MAYBE-FALSE <DATUM !.DEST>>) + (<AND .FF? .GMF> + <MOVE:ARG <LADDR .FSYM <> <>> <DATUM !.DEST>>) + (.FF? <DO-FUNNY-LAST .FAP <- -1 <* 2 .NARG>> <DATUM !.DEST>>) + (.GMF <MOVE:ARG .OUTD <DATUM !.DEST>>) + (ELSE + <MOVE:ARG + <DATUM <SET TT <ADDRESS:C <- -1 <* 2 .NARG>> '`(TP) >> .TT> + <DATUM !.DEST>>)>> + <ACFIX .DEST .CD> + <AND <ISTYPE? <DATTYP .DEST>> + <TYPE? <DATTYP .CD> AC> + <RET-TMP-AC <DATTYP .CD> .CD>>) + (.F? <DO-LAST .SUBRC .MAYBE-FALSE <FUNCTION:VALUE>>) + (<AND .FF? .GMF> <MOVE:ARG .OUTD <FUNCTION:VALUE>>) + (<AND .GMF .FF?> <MOVE:ARG .OUTD <FUNCTION:VALUE>>) + (.FF? <DO-FUNNY-LAST .FAP <- -1 <* 2 .NARG>> <FUNCTION:VALUE>>)> + <POP:LOCS .STB .STOP> + <LABEL:TAG .EXIT>> + <COND (<ASSIGNED? CD> + <AND <TYPE? <DATTYP .DEST> AC> <FIX-ACLINK <DATTYP .DEST> .DEST .CD>> + <AND <TYPE? <DATVAL .DEST> AC> + <FIX-ACLINK <DATVAL .DEST> .DEST .CD>>)> + <SET STK .OSTK> + <SET XX <MOVE:ARG .DEST .WHERE>> + <END-FRAME> + .XX> + +<DEFINE BLT-HACK (K B LN "AUX" N N1 AC EA D1 D2 TY TT (TG <MAKE:TAG>)) + <COND (<AND <==? <LENGTH .K> 1> + <==? <NODE-TYPE <SET N <1 .K>>> ,PUT-CODE> + <==? <LENGTH <SET K <KIDS .N>>> 3> + <==? <NODE-TYPE <SET N1 <2 .K>>> ,QUOTE-CODE> + <==? <NODE-NAME .N1> 1> + <==? <NODE-TYPE <SET N1 <1 .K>>> ,LVAL-CODE> + <MEMQ <NODE-NAME .N1> .B> + <OR <==? <SET TT <STRUCTYP <RESULT-TYPE .N>>> UVECTOR> + <==? .TT VECTOR>> + <SET TY + <COND (<==? .TT VECTOR> + <SET TT T> + <OR <ISTYPE? <RESULT-TYPE <3 .K>>> ANY>) + (ELSE + <SET TT <>> + <ISTYPE? <RESULT-TYPE <3 .K>>>)>> + <OR <==? <NODE-TYPE <3 .K>> ,QUOTE-CODE> + <==? <NODE-TYPE <3 .K>> ,GVAL-CODE> + <AND <G=? <LENGTH <3 .K>> <INDEX ,SIDE-EFFECTS>> + <NOT <SIDE-EFFECTS <3 .K>>> + <NO-INTERFERE <3 .K> .B>>>> + <SET D1 + <GEN .N1 + <DATUM <COND (<ISTYPE? <RESULT-TYPE .N1>>) + (ELSE ANY-AC)> + ANY-AC>>> + <SET D2 <GEN <3 .K> DONT-CARE>> + <MOVE:ARG .D2 + <DATUM <COND (<AND .TT + <ISTYPE-GOOD? + <GET-ELE-TYPE + <RESULT-TYPE .N1> ALL>>>) + (.TT <OFFPTR 0 .D1 VECTOR>) + (ELSE .TY)> + <OFFPTR <COND (.TT 0) (ELSE -1)> + .D1 + <COND (.TT VECTOR) (ELSE UVECTOR)>>>> + <RET-TMP-AC .D2> + <DATTYP-FLUSH .D1> + <PUT .D1 ,DATTYP <COND (.TT VECTOR) (ELSE UVECTOR)>> + <TOACV .D1> + <PUT <SET AC <DATVAL .D1>> ,ACPROT T> + <MUNG-AC .AC .D1> + <SET EA <GETREG <>>> + <PUT .AC ,ACPROT <>> + <EMIT <INSTRUCTION `HLRE <ACSYM .EA> !<ADDR:VALUE .D1>>> + <EMIT <INSTRUCTION `SUBM <ACSYM .AC> <ADDRSYM .EA>>> + <COND (<G? .LN 1> + <EMIT <INSTRUCTION `HRLI <ACSYM .AC> (<ADDRSYM .AC>)>> + <EMIT <INSTRUCTION `ADDI + <ACSYM .AC> + <COND (.TT 2) (ELSE 1)>>>) + (.TT + <EMIT <INSTRUCTION `ADD <ACSYM .AC> '[<2 (2)>]>> + <EMIT <INSTRUCTION `JUMPGE <ACSYM .AC> .TG>> + <EMIT <INSTRUCTION `HRLI + <ACSYM .AC> + -2 + (<ADDRSYM .AC>)>>) + (ELSE + <EMIT <INSTRUCTION `AOBJP <ACSYM .AC> .TG>> + <EMIT <INSTRUCTION `HRLI + <ACSYM .AC> + -1 + (<ADDRSYM .AC>)>>)> + <EMIT <INSTRUCTION `BLT <ACSYM .AC> -1 (<ADDRSYM .EA>)>> + <LABEL:TAG .TG> + <RET-TMP-AC .D1> + T)>> + +<DEFINE NO-INTERFERE (N B) #DECL ((N) NODE (B) <LIST [REST SYMTAB]>) + <COND (<AND <==? <NODE-TYPE .N> ,LVAL-CODE> + <MEMQ <NODE-NAME .N> .B>> + <>) + (<MEMQ <NODE-TYPE .N> ,SNODES> T) + (<AND <==? <NODE-TYPE .N> ,COND-CODE> + <NOT <NO-INTERFERE <PREDIC .N> .B>>> <>) + (ELSE + <MAPF <> + <FUNCTION (N) #DECL ((N) NODE) + <COND (<NO-INTERFERE .N .B> T) + (ELSE <MAPLEAVE <>>)>> <KIDS .N>>)>> + +\ + +<DEFINE GEN-TAGS (TGS SPECD) + #DECL ((TGS) LIST (MNOD) NODE) + <MAPR <> + <FUNCTION (LL "AUX" (L <1 .LL>) (TG <1 .L>) (OFF <2 .L>)) + #DECL ((LL) <LIST LIST> (L) LIST (TG) ATOM (OFF) LIST) + <LABEL:TAG .TG> + <EMIT <INSTRUCTION DEALLOCATE .OFF>> + <COND + (<EMPTY? <REST .LL>> + <COND + (.SPECD + <COND (.PRE <UNBIND:FUNNY <SPECS-START <2 <KIDS .MNOD>>> !.NTSLOTS>) + (ELSE <EMIT '<`PUSHJ `P* |SSPECS >>)>)>)>> + .TGS>> + +<DEFINE MOPTG (SYM) #DECL ((SYM) SYMTAB) <BINDUP .SYM <INIT-SYM .SYM>>> + +<DEFINE MOPTG2 (SYM) #DECL ((SYM) SYMTAB) <BINDUP .SYM <REFERENCE:UNBOUND>>> + +<DEFINE NOTIMP (ARG) <MESSAGE ERROR "NOT IMPLEMENTED MAPF/R TUPLES">> + +<DEFINE MAPLEAVE-GEN (N W) + #DECL ((N) NODE (CD) DATUM (DEST) <OR DATUM ATOM>) + <COND (<ACTIVATED <2 <KIDS .MNOD>>> + <RET-TMP-AC <GEN <1 <KIDS .N>> .DEST>> + <VAR-STORE> + <PROG:END>) + (ELSE + <COND (<==? .DEST FLUSHED> + <RET-TMP-AC <GEN <1 <KIDS .N>> FLUSHED>> + <MAP:UNBIND .STOP .STOP> + <RETURN-UP .INRAP>) + (ELSE + <SET CD <GEN <1 <KIDS .N>> <DATUM !.DEST>>> + <MAP:UNBIND .STOP .STOP> + <RETURN-UP .INRAP> + <RET-TMP-AC .CD> + <ACFIX .DEST .CD>)> + <BRANCH:TAG .EXIT>)> + ,NO-DATUM> + +<DEFINE MAP:UNBIND (STOP STOP1) + #DECL ((MNOD) NODE) + <COND (.PRE + <POP:LOCS .STK .STOP1> + <UNBIND:FUNNY <SPECS-START <2 <KIDS .MNOD>>> !.NTSLOTS>) + (ELSE <UNBIND:LOCS .STK .STOP1>)>> + +\ + +<DEFINE MAPRET-STOP-GEN (N W + "AUX" (STA <STACKS .N>) (SG <SEGS .N>) (DWN '(0)) + (K <KIDS .N>) (LN <LENGTH .K>) (UNK <>) TEM DAT + (FAP <1 <KIDS .MNOD>>) FTG + (FF? <==? <NODE-TYPE .FAP> ,MFIRST-CODE>) + (LEAVE <==? <NODE-SUBR .N> ,MAPSTOP>) (OS .STK) + (FUZZY <* -2 .NARG>) (STK (0 !.STK)) AC-SY + (OOS .STK) (NS .NTSLOTS)) + #DECL ((N) NODE (K) <LIST [REST NODE]> (LN FUZZY STA) FIX (DWN) LIST + (DAT) DATUM (STK) <SPECIAL LIST> (OS) LIST) + <COND + (<AND <NOT .SG> <L? .LN 2>> + <OR <0? .LN> <SET DAT <GEN <1 .K> <GOODACS <1 .K> DONT-CARE>>>> + <MAP:UNBIND .STB .STRV> + <COND + (<NOT <0? .LN>> + <COND (<AND .GMF .FF?> + <SET NTSLOTS <REST .NTSLOTS>> + <SET STK .STB> + <DO-EVEN-FUNNIER-HACK + .DAT + <1 <BINDING-STRUCTURE .INRAP>> + .MNOD + .FAP + .INRAP + <LOOP-VARS .INRAP>>) + (.FF? <DO-FUNNY-HACK .DAT (.FUZZY ()) .MNOD .FAP <1 .K>>) + (ELSE <DO-STACK-ARGS .MAYBE-FALSE .DAT>)>)>) + (.FF? <DO-FUNNY-MAPRET .N .FUZZY .K .FAP>) + (ELSE + <MAPF <> + <FUNCTION (NOD "AUX" TG) + #DECL ((NOD) NODE) + <COND (<==? <NODE-TYPE .NOD> ,SEGMENT-CODE> + <RET-TMP-AC <GEN <1 <KIDS .NOD>> <FUNCTION:VALUE>>> + <REGSTO T> + <COND (.MAYBE-FALSE + <SET TG <MAKE:TAG>> + <EMIT '<`SKIPGE -1 `(P) >> + <BRANCH:TAG .TG>)> + <SEGMENT:STACK </ .STA 2> .UNK> + <COND (<NOT .UNK> + <ADD:STACK <- .STA>> + <ADD:STACK PSTACK> + <SET UNK T>)> + <AND .MAYBE-FALSE <LABEL:TAG .TG>>) + (ELSE + <COND (.MAYBE-FALSE + <SET TG <MAKE:TAG>> + <EMIT '<`SKIPGE -1 `(P) >> + <BRANCH:TAG .TG>)> + <RET-TMP-AC <STACK:ARGUMENT <GEN .NOD DONT-CARE>>> + <ADD:STACK 2> + <AND .MAYBE-FALSE <LABEL:TAG .TG>>)>> + .K> + <COND (<OR <ACTIVATED <2 <KIDS .MNOD>>> + <NOT <SET TEM <STACK:L .OS .STRV>>>> + <MESSAGE ERROR " NOT IMLEMENTED HAIRY MAPRET/STOP " .N>) + (ELSE + <COND (.SPECD <UNBIND:FUNNY <SPECS-START <2 <KIDS .MNOD>>>>)> + <COND (.MAYBE-FALSE + <SET FTG <MAKE:TAG>> + <EMIT '<`SKIPGE -1 `(P) >> + <BRANCH:TAG .FTG>)> + <SET AC-SY <GETREG <>>> + <COND (.UNK <EMIT <INSTRUCTION `POP `P* <ADDRSYM .AC-SY>>>) + (ELSE <EMIT <INSTRUCTION `MOVEI <ACSYM .AC-SY> </ .STA 2>>>)> + <EMIT <INSTRUCTION `ADDM <ACSYM .AC-SY> `(P) >> + <COND (<NOT <=? <SET DWN .TEM> '(0)>> + <EMIT <INSTRUCTION `ASH <ACSYM .AC-SY> 1>> + <EMIT <INSTRUCTION `HRLI <ACSYM .AC-SY> (<ADDRSYM .AC-SY>)>> + <EMIT <INSTRUCTION `SUBM `TP* <ADDRSYM .AC-SY>>> + <EMIT <INSTRUCTION `HRLI + <ACSYM .AC-SY> + <FORM - !.DWN> + '`(A) >> + <EMIT <INSTRUCTION `BLT + <ACSYM .AC-SY> + <FORM - !.DWN> + '`(TP) >> + <EMIT <INSTRUCTION `SUB `TP* [<FORM !.DWN .DWN>]>>)>)> + <AND .MAYBE-FALSE <LABEL:TAG .FTG>>)> + <OR .PRE <AND .GMF .FF?> <PROG () <SET NTSLOTS <REST .NTSLOTS>> <SET STK .STB>>> + <COND (.ANY? <EMIT <INSTRUCTION `SETZM .POFF '`(P) >>)> + <COND (.LEAVE <RETURN-UP .INRAP>) (<AGAIN-UP .INRAP>)> + <SET STK .OOS> + <SET NTSLOTS .NS> + <BRANCH:TAG <COND (.LEAVE .APPLTAG) (.GMF .RTAG) (ELSE .MAPLP)>> + ,NO-DATUM> + +\ + +<DEFINE DO-FUNNY-MAPRET (N OFFS K FAP "AUX" (NOFFS (.OFFS ()))) + #DECL ((N FAP) NODE (K) <LIST [REST NODE]> (OFFS) FIX) + <SET NOFFS + <STFIXIT .NOFFS (<FORM - 0 !<STACK:L .STK .STB>>)>> + <MAPF <> + <FUNCTION (NN "AUX" TG1 TG2 TT DAT (ANY? <>)) + #DECL ((NN) NODE (TG1 TG2) ATOM (DAT) DATUM (TT) ADDRESS:C) + <COND (<==? <NODE-TYPE .NN> ,SEG-CODE> + <SET ANY? <PUSH-STRUCS <KIDS .NN> <> <> () <>>> + <LABEL:TAG <SET TG1 <MAKE:TAG>>> + <SET DAT + <STACKM <1 <KIDS .NN>> + <DATUM <SET TT <ADDRESS:C -1 '`(TP) >> .TT> + <> + <SET TG2 <MAKE:TAG>> + 0>> + <DO-FUNNY-HACK .DAT <STFIXIT .NOFFS '(-2)> .MNOD .FAP .N> + <AND .ANY? <EMIT '<`SETZM `(P) >>> + <BRANCH:TAG .TG1> + <LABEL:TAG .TG2> + <AND .ANY? <EMIT '<`SUB `P* [<1 (1)>]>>> + <COND (<NOT <STRUCTYP <RESULT-TYPE <1 <KIDS .NN>>>>> + <EMIT '<`SETZM |DSTORE>>)> + <EMIT '<`SUB `TP* [<(2) 2>]>>) + (ELSE + <SET DAT <GEN .NN DONT-CARE>> + <VAR-STORE> + <DO-FUNNY-HACK .DAT .NOFFS .MNOD .FAP .NN>)>> + .K> + <MAP:UNBIND .STB .STRV>> + + + +<DEFINE AP? (N "AUX" AT) + #DECL ((N) NODE) + <AND <==? <NODE-TYPE .N> ,GVAL-CODE> + <==? <NODE-TYPE <SET N <1 <KIDS .N>>>> ,QUOTE-CODE> + <SET AT <NODE-NAME .N>> + <OR .REASONABLE + <AND <GASSIGNED? .AT> <TYPE? ,.AT SUBR RSUBR RSUBR-ENTRY>> + <AND <GASSIGNED? .AT> + <TYPE? ,.AT FUNCTION> + <OR <==? .AT .FCNS> + <AND <TYPE? .FCNS LIST> <MEMQ .AT .FCNS>>>>> + .AT>> + +<ENDPACKAGE> diff --git a/<mdl.comp>/mapps1.mud.207 b/<mdl.comp>/mapps1.mud.207 new file mode 100644 index 0000000..67cbd70 --- /dev/null +++ b/<mdl.comp>/mapps1.mud.207 @@ -0,0 +1,126 @@ +<PACKAGE "MAPPS1"> + +<ENTRY PMAPF-R> + +<USE "PASS1" "CHKDCL" "COMPDEC" "ADVMESS"> + +<DEFINE PMAPF-R (OB AP + "AUX" (NAME <1 .OB>) TT ITRF OBJ (RQRG 0) + (LN <LENGTH <SET OBJ <REST .OB>>>) FINALF TAPL (APL ()) + (DCL #DECL ()) (ARGL ()) (HATOM <>) (NN 0) TEM L2 L3 + (TRG 0)) + #DECL ((OBJ OB) <PRIMTYPE LIST> (LN NN) FIX + (DCL) DECL (ARGL APL) LIST (ITRF FINALF TT) NODE + (TRG RQRG) <SPECIAL FIX>) + <PROG () + <AND <SEG? <REST .OBJ>> + <COND (.VERBOSE + <VMESS "MAPF/MAPR cannot be open compiled due to SEGMENT." + .OB> T)(ELSE T)> + <RETURN <PSUBR-C .OB .AP>>> + <AND <L? .LN 2> + <MESSAGE ERROR "TOO FEW ARGS TO " .NAME .OBJ>> + <SET TT <NODEFM ,MAP-CODE .PARENT <> .NAME () .AP>> + <SET FINALF <PCOMP <1 .OBJ> .TT>> + <COND + (<OR <TYPE? <SET TAPL <2 .OBJ>> FUNCTION> + <AND <TYPE? .TAPL FORM> + <NOT <EMPTY? <SET APL <CHTYPE .TAPL LIST>>>> + <TYPE? <SET TEM <1 .APL>> ATOM> + <GASSIGNED? .TEM> + <==? ,.TEM ,FUNCTION> + <SET TAPL <REST .APL>>>> + <AND <EMPTY? <SET APL <CHTYPE .TAPL LIST>>> + <MESSAGE ERROR "EMPTY FUNCTION IN MAPF " .OBJ>> + <AND <TYPE? <1 .APL> ATOM> + <SET HATOM <1 .APL>> + <SET APL <REST .APL>>> + <AND <EMPTY? .APL> + <MESSAGE ERROR "MAPF FUNCTION HAS NO ARG LIST " .OBJ>> + <SET ARGL <1 .APL>> + <REPEAT ((I <+ <LENGTH <REST .OBJ 2>> 1>)) + <COND (<L? <SET I <- .I 1>> 0> <RETURN>)> + <SET ARGL (DUMMY-MAPF !.ARGL)>> + <SET APL <REST .APL>> + <AND <NOT <EMPTY? .APL>> + <TYPE? <1 .APL> DECL> + <SET DCL <1 .APL>> + <SET APL <REST .APL>>> + <AND <EMPTY? .APL> + <MESSAGE ERROR "MAPF FUNCTION HAS NO BODY " .OBJ>> + <PROG ((VARTBL .VARTBL)) #DECL ((VARTBL) <SPECIAL SYMTAB>) + <SET ITRF + <NODEPR ,MFCN-CODE + .TT + <OR <FIND:DECL VALUE .DCL> ANY> + <> + () + <> + <2 <GEN-D .ARGL .DCL .HATOM <>>> + .HATOM + .VARTBL>> + <COND + (<ACT-FIX .ITRF <BINDING-STRUCTURE .ITRF>> + <SET L3 <SET L2 ()>> + <PUT + .ITRF + ,BINDING-STRUCTURE + <REPEAT ((L <BINDING-STRUCTURE .ITRF>) (LL .L) (L1 .L) SYM) + #DECL ((L L1 LL) <LIST [REST SYMTAB]>) + <AND <EMPTY? .L> <RETURN .L1>> + <COND (<==? <CODE-SYM <SET SYM <1 .L>>> 1> + <SET L2 ("ACT" <NAME-SYM .SYM> !.L2)> + <SET L3 + ((<NAME-SYM .SYM>) + <COND (<SPEC-SYM .SYM> + <FORM SPECIAL <1 <DECL-SYM .SYM>>>) + (ELSE + <FORM UNSPECIAL <1 <DECL-SYM .SYM>>>)> + !.L3)> + <COND (<==? .L .L1> <SET L1 <REST .L1>>) + (ELSE <PUTREST .LL <REST .L>>)>)> + <SET L <REST <SET LL .L>>>>> + <SET APL (<FORM PROG .L2 <CHTYPE .L3 DECL> !.APL>)>)> + <PUT .ITRF + ,KIDS + <MAPF ,LIST <FUNCTION (O) <PCOMP .O .ITRF>> .APL>>>) + (<OR <AND <TYPE? .TAPL FIX> <==? .LN 3>> + <AND <TYPE? .TAPL FORM> + <==? <LENGTH <SET APL <CHTYPE .TAPL LIST>>> 2> + <TYPE? <SET TEM <1 .APL>> ATOM> + <==? ,.TEM ,GVAL> + <TYPE? <SET TEM <2 .APL>> ATOM> + <GASSIGNED? .TEM> + <OR <NOT <TYPE? ,.TEM FUNCTION>> + <==? .TEM .FCNS> + <AND <TYPE? .FCNS LIST> <MEMQ .TEM .FCNS>>>>> + <PUT .IND PTHIS-OBJECT ,PMARGS> + <SET ITRF + <COND (<TYPE? .TAPL FIX> <PCOMP <FORM NTH .IND .TAPL> .TT>) + (ELSE + <PCOMP <FORM <2 .APL> !<ILIST <- .LN 2> '.IND>> .TT>)>> + <PUT .IND PTHIS-OBJECT> + <MAPF <> + <FUNCTION (N) + #DECL ((N) NODE) + <AND <==? <NODE-TYPE .N> ,MARGS-CODE> + <PUT .N ,NODE-NAME <SET NN <+ .NN 1>>>>> + <KIDS .ITRF>> + <SET ITRF <NODEFM ,MPSBR-CODE .TT <> <> (.ITRF) <>>>) + (ELSE <SET ITRF <PCOMP .TAPL .TT>>)> + <PUT .TT + ,KIDS + (.FINALF + .ITRF + !<MAPF ,LIST <FUNCTION (O) <PCOMP .O .TT>> <REST .OBJ 2>>)> + .TT>> + +\ + +<DEFINE PMARGS (O) #DECL ((VALUE) NODE) <NODEFM ,MARGS-CODE .PARENT <> <> () <>>> + +<PUT ,MAPF PAPPLY-OBJECT ,PMAPF-R> + +<PUT ,MAPR PAPPLY-OBJECT ,PMAPF-R> + +<ENDPACKAGE> diff --git a/<mdl.comp>/mmqgen.mud.27 b/<mdl.comp>/mmqgen.mud.27 new file mode 100644 index 0000000..c870df3 --- /dev/null +++ b/<mdl.comp>/mmqgen.mud.27 @@ -0,0 +1,271 @@ +<PACKAGE "MMQGEN"> + +<ENTRY MEMQ-GEN> + +<USE "CODGEN" "COMCOD" "CACS" "CHKDCL" "COMPDEC"> + + +<DEFINE MEMQ-GEN (N W + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" (STR <2 <KIDS .N>>) (THING <1 <KIDS .N>>) + (TYP <RESULT-TYPE .STR>) (TPS <STRUCTYP .TYP>) + (TYP1 <COND (<ISTYPE? .TYP>) (ELSE .TPS)>) + (FLS <==? .W FLUSHED>) (SDIR .DIR) + (TTYP <RESULT-TYPE .THING>) (TAC <>) + (ETY <GET-ELE-TYPE .TYP ALL>) + (TWIN <TYPESAME .ETY .TTYP>) + (B2 + <COND (<AND .FLS .BRANCH> .BRANCH) (ELSE <MAKE:TAG>)>) + SAC NAC STRD NUMD DEAD (TWOW <>) TEM TY DAC DCOD + (B3 <MAKE:TAG>) (RW .W) (FC <0? <MINL .TYP>>) + (LP <MAKE:TAG>) B4 (DEADV <>)) + #DECL ((N STR THING) NODE (STRD NUMD) DATUM (DAC SAC NAC) AC (DCOD) FIX + (TPS TYP1 B2 B3 B4) ATOM (DEAD) <PRIMTYPE LIST> + (NK FLS DIR SDIR NOTF BRANCH) <OR FALSE ATOM>) + <SET W <GOODACS .N .W>> + <AND .NOTF <SET DIR <NOT .DIR>>> + <COND (<OR <==? .TPS STRING> <==? .TPS BYTES>> <SET TWOW T>)> + <SET TEM + <COND (<TYPE? .W DATUM> <GOODACS .N .W>) + (<AND .TWOW + <OR <AND <==? <NODE-TYPE .STR> ,LVAL-CODE> + <==? <LENGTH <SET DEAD <TYPE-INFO .STR>>> 2> + <NOT <2 .DEAD>> + <SET DEADV T>> + .FLS>> + DONT-CARE) + (.TWOW <DATUM ANY-AC ANY-AC>) + (ELSE <DATUM .TYP1 ANY-AC>)>> + <COND (<AND <NOT <SIDE-EFFECTS .N>> + <NOT <MEMQ <NODE-TYPE .STR> ,SNODES>> + <MEMQ <NODE-TYPE .THING> ,SNODES>> + <SET STRD <GEN .STR .TEM>> + <SET NUMD <GEN .THING DONT-CARE>>) + (ELSE + <SET NUMD + <GEN .THING + <COND (<AND <NOT <==? <NODE-TYPE .STR> ,QUOTE-CODE>> + <NOT .TWOW> + <SIDE-EFFECTS .STR>> + <GOODACS .THING <DATUM ANY-AC ANY-AC>>) + (ELSE DONT-CARE)>>> + <SET STRD <GEN .STR .TEM>>)> + <VAR-STORE <>> + <COND + (<NOT .TWIN> + <COND + (<SET TY <ISTYPE? .ETY>> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O !<ADDR:TYPE .NUMD>>> + <EMIT <INSTRUCTION `CAIE `O <FORM TYPE-CODE!-OP!-PACKAGE .TY>>> + <BRANCH:TAG <COND (.DIR .B3) (ELSE .B2)>> + <SET TWIN T>) + (<==? .TPS UVECTOR> + <EMIT <INSTRUCTION `HLRE + <ACSYM <SET SAC <GETREG <>>>> + !<ADDR:VALUE .STRD>>> + <PUT .SAC ,ACPROT T> + <TOACV .STRD> + <EMIT <INSTRUCTION `SUBM <ACSYM <DATVAL .STRD>> <ADDRSYM .SAC>>> + <PUT .SAC ,ACPROT <>> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE + <ACSYM .SAC> + (<ADDRSYM .SAC>)>> + <COND (<SET TEM <ISTYPE? .TTYP>> + <EMIT <INSTRUCTION `CAIE + <ACSYM .SAC> + <FORM TYPE-CODE!-OP!-PACKAGE .TEM>>>) + (ELSE + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O !<ADDR:TYPE .NUMD>>> + <EMIT <INSTRUCTION `CAIE `O (<ADDRSYM .SAC>)>>)> + <BRANCH:TAG <COND (.DIR .B3) (ELSE .B2)>> + <SET TWIN T>)>)> + <COND (<NOT .TWOW> + <TOACV .STRD> + <COND (<ISTYPE-GOOD? .TPS> + <DATTYP-FLUSH .STRD> + <PUT .STRD ,DATTYP .TPS>)>)> + <COND (<TYPE? <DATVAL .STRD> AC> + <PUT <SET SAC <DATVAL .STRD>> ,ACPROT T>)> + <COND (<NOT .TWOW> + <TOACV .NUMD> + <PUT <SET NAC <DATVAL .NUMD>> ,ACPROT T>)> + <COND (<ASSIGNED? SAC> <MUNG-AC .SAC .STRD>)> + <AND <TYPE? <DATTYP .STRD> AC> + <MUNG-AC <DATTYP .STRD> .STRD>> + <COND (<AND <NOT <ISTYPE? .TTYP>> + <NOT .TY> + <N==? .TPS UVECTOR> + <NOT .TWOW>> + <PUT <SET TAC <GETREG <>>> ,ACPROT T> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE + <ACSYM .TAC> + !<ADDR:TYPE .NUMD>>>)> + <COND (<ASSIGNED? SAC> <PUT .SAC ,ACPROT <>>)> + <COND (<NOT .TWOW> <PUT .NAC ,ACPROT <>>)> + <COND (<AND .BRANCH <NOT .FLS> .DIR <NOT .NOTF> <=? .W .STRD>> + <SET B2 .BRANCH>)> + <COND + (<==? .TPS LIST> + <COND (<G=? <SET DCOD <MIN <DEFERN .ETY> <DEFERN .TTYP>>> 1> + <SET DAC <GETREG <>>>)> + <COND (.FC + <EMIT <INSTRUCTION `JUMPE + <ACSYM .SAC> + <COND (.DIR .B3) (ELSE .B2)>>>)> + <LABEL:TAG .LP> + <COND (<0? .DCOD> <SET DAC .SAC>) + (<1? .DCOD> + <EMIT <INSTRUCTION `MOVE <ACSYM .DAC> 1 (<ADDRSYM .SAC>)>>) + (ELSE + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O (<ADDRSYM .SAC>)>> + <EMIT <INSTRUCTION `MOVE <ACSYM .DAC> <ADDRSYM .SAC>>> + <EMIT '<`CAIN `O TDEFER!-OP!-PACKAGE>> + <EMIT <INSTRUCTION `MOVE <ACSYM .DAC> 1 (<ADDRSYM .DAC>)>>)> + <CHECK-VAL 1 + .NAC + .DAC + .TAC + .TTYP + <COND (.DIR .B2) (ELSE .B3)> + .TWIN> + <EMIT <INSTRUCTION `HRRZ <ACSYM .SAC> (<ADDRSYM .SAC>)>> + <EMIT <INSTRUCTION `JUMPN <ACSYM .SAC> .LP>>) + (<==? .TPS UVECTOR> + <COND (.FC + <EMIT <INSTRUCTION `JUMPGE + <ACSYM .SAC> + <COND (.DIR .B3) (ELSE .B2)>>>)> + <LABEL:TAG .LP> + <CHECK-VAL 0 + .NAC + .SAC + .TAC + .TTYP + <COND (.DIR .B2) (ELSE .B3)> + .TWIN> + <EMIT <INSTRUCTION `AOBJN <ACSYM .SAC> .LP>>) + (<NOT .TWOW> + <COND (.FC + <EMIT <INSTRUCTION `JUMPGE + <ACSYM .SAC> + <COND (.DIR .B3) (ELSE .B2)>>>)> + <LABEL:TAG .LP> + <CHECK-VAL 1 + .NAC + .SAC + .TAC + .TTYP + <COND (.DIR .B2) (ELSE .B3)> + .TWIN> + <EMIT <INSTRUCTION `ADD <ACSYM .SAC> '[<2 (2)>]>> + <EMIT <INSTRUCTION `JUMPL <ACSYM .SAC> .LP>>) + (.FLS + <COND (<TYPE? <DATTYP .STRD> AC> + <COND (<AND <ACRESIDUE <SET SAC <DATTYP .STRD>>> + <G? <FREE-ACS T> 0>> + <EMIT <INSTRUCTION `MOVEI + <SET SAC <GETREG <>>> + (<ADDRSYM <DATTYP .STRD>>)>>) + (ELSE + <MUNG-AC .SAC .STRD> + <EMIT <INSTRUCTION `MOVEI <ACSYM .SAC> (<ADDRSYM .SAC>)>>)>) + (ELSE + <SET SAC <GETREG <>>> + <EMIT <INSTRUCTION `HRRZ <ACSYM .SAC> !<ADDR:TYPE .STRD>>>)> + <PUT .SAC ,ACPROT T> + <OR .DEADV + <TYPE? <DATVAL .STRD> TEMP> + <SET STRD <TOACV .STRD>>> + <PUT .SAC ,ACPROT <>> + <COND (.FC + <EMIT <INSTRUCTION `JUMPE + <ACSYM .SAC> + <COND (.DIR .B3) (ELSE .B2)>>>)> + <LABEL:TAG .LP> + <EMIT <INSTRUCTION `ILDB `O !<ADDR:VALUE .STRD>>> + <IMCHK (`CAMN `CAIN ) `O <DATVAL .NUMD>> + <BRANCH:TAG <COND (.DIR .B2) (ELSE .B3)>> + <EMIT <INSTRUCTION `SOJG <ACSYM .SAC> .LP>>) + (ELSE + <LABEL:TAG .LP> + <COND (<TYPE? <DATTYP .STRD> AC> + <EMIT <INSTRUCTION `TRNN <ACSYM <SET SAC <DATTYP .STRD>>> -1>> + <BRANCH:TAG <COND (.DIR .B3) (ELSE .B2)>>) + (ELSE + <EMIT <INSTRUCTION `HRRZ `O !<ADDR:TYPE .STRD>>> + <EMIT <INSTRUCTION `JUMPE `O <COND (.DIR .B3) (ELSE .B2)>>>)> + <EMIT <INSTRUCTION `MOVE `O !<ADDR:VALUE .STRD>>> + <EMIT '<`ILDB `O `O >> + <IMCHK '(`CAMN `CAIN ) `O <DATVAL .NUMD>> + <BRANCH:TAG <COND (.DIR .B2) (ELSE .B3)>> + <EMIT <INSTRUCTION `IBP !<ADDR:VALUE .STRD>>> + <COND (<TYPE? <DATTYP .STRD> AC> + <EMIT <INSTRUCTION `SOJA <ACSYM .SAC> .LP>>) + (ELSE + <EMIT <INSTRUCTION `SOS !<ADDR:TYPE .STRD>>> + <BRANCH:TAG .LP>)>)> + <AND .TAC <PUT .TAC ,ACPROT <>>> + <RET-TMP-AC .TAC> + <RET-TMP-AC .NUMD> + <COND (<AND .BRANCH .FLS> + <COND (<NOT .DIR> <BRANCH:TAG .B2> <LABEL:TAG .B3>) + (ELSE <LABEL:TAG .B3>)> + <RET-TMP-AC .STRD>) + (<OR .NOTF <NOT <==? <NOT .BRANCH> <NOT .DIR>>>> + <RET-TMP-AC .STRD> + <COND (<AND .NOTF .DIR> <BRANCH:TAG .B3>)> + <LABEL:TAG .B2> + <MOVE:ARG <REFERENCE .SDIR> .W> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B3>) + (ELSE + <COND (.BRANCH + <COND (<==? .B2 .BRANCH> + <LABEL:TAG .B3> + <SET W <MOVE:ARG .STRD .W>>) + (ELSE + <BRANCH:TAG .B3> + <LABEL:TAG .B2> + <SET W <MOVE:ARG .STRD .W>> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B3>)>) + (ELSE + <RET-TMP-AC .STRD> + <LABEL:TAG .B2> + <RET-TMP-AC <SET W <MOVE:ARG <REFERENCE <>> .W>>> + <COND (<TYPE? <DATTYP .STRD> AC> + <PUT <DATTYP .STRD> ,ACLINK (.STRD)>)> + <COND (<TYPE? <DATVAL .STRD> AC> + <PUT <DATVAL .STRD> ,ACLINK (.STRD)>)> + <COND (<=? .W .STRD> + <LABEL:TAG .B3> + <SET W <MOVE:ARG .STRD .W>>) + (ELSE + <BRANCH:TAG <SET B4 <MAKE:TAG>>> + <LABEL:TAG .B3> + <SET W <MOVE:ARG .STRD .W>> + <LABEL:TAG .B4>)>)>)> + <MOVE:ARG .W .RW>> + +<DEFINE CHECK-VAL (OFFS VAC SAC TAC TTYP BR TWIN) + #DECL ((OFFS) FIX (SAC VAC) AC (TAC) <OR AC FALSE>) + <COND (.TWIN + <EMIT <INSTRUCTION `CAMN <ACSYM .VAC> .OFFS (<ADDRSYM .SAC>)>> + <BRANCH:TAG .BR>) + (ELSE + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE + `O* + <- .OFFS 1> + (<ADDRSYM .SAC>)>> + <EMIT <INSTRUCTION + `CAIN + `O* + <COND (<SET TTYP <ISTYPE? .TTYP>> + <FORM TYPE-CODE!-OP!-PACKAGE .TTYP>) + (ELSE (<ADDRSYM .TAC>))>>> + <EMIT <INSTRUCTION `CAME <ACSYM .VAC> .OFFS (<ADDRSYM .SAC>)>> + <EMIT '<`SKIPA >> + <BRANCH:TAG .BR>)>> + +<ENDPACKAGE> +  \ No newline at end of file diff --git a/<mdl.comp>/mobyg.mud.8 b/<mdl.comp>/mobyg.mud.8 new file mode 100644 index 0000000..268084f --- /dev/null +++ b/<mdl.comp>/mobyg.mud.8 @@ -0,0 +1,196 @@ +<BLOAT 150000 5000 100 1500 100> +<SET REDEFINE T> +<RSUBR-LINK <>> +<GC-MON T> + +<USE "MLOAD"> + +<SETG DUMMY-FILE!-IMLOAD!-MLOAD!-PACKAGE "PS:<MDLLIB>DUMMY.NBIN"> + +<SETG LOAD-GBINS? T> + +<USE "MCLEAN"> + +<OR <LOOKUP "GLUE" <ROOT>> + <INSERT "GLUE" <ROOT>>> +<SET GLUE T> + +<FLOAD "PS:<MDLLIB>ELMER.FBIN"> +<USE "GLUE"> +<SETG GLUE-MAX-SPACE T> + +<SETG L-SEARCH-PATH (["SRC:<MDL.COMP>"] !,L-SEARCH-PATH)> +<FLOAD "SRC:<MDL.COMP>HELP.COMPIL"> + +<GUNASSIGN L-LOADER> + +<MOBY-LOAD "SRC:<MDL.COMP>SYMANA.NBIN"> + + +<MOBY-CLEAN SYMANA <>> + +<USE "CLEAN" "PURITY"> +<CLEANUP> +<FLUSH-CLEANUP> +<KILL:PURITY> + +<SETG PKGS ("SYMANA" "CARANA" "MAPANA" "NOTANA" "STRANA" "BITANA" + "BACKAN" "ADVMESS")> + +<PRINT <GC 0 T>> +<PRINT <GC 0 T>> + +<SETG SURVIVERS (SPEC-FLUSH!-ISYMANA!-SYMANA!-PACKAGE + TYPE-OK?!-CHKDCL!-PACKAGE +SUBR-ANA!-ISYMANA!-SYMANA!-PACKAGE +QUOTE-ANA!-ISYMANA!-SYMANA!-PACKAGE +FUNC-ANA!-ISYMANA!-SYMANA!-PACKAGE +SEGMENT-ANA!-ISYMANA!-SYMANA!-PACKAGE +FORM-AN!-ISYMANA!-SYMANA!-PACKAGE +PRG-REP-ANA!-ISYMANA!-SYMANA!-PACKAGE +SUBR-ANA!-ISYMANA!-SYMANA!-PACKAGE +COND-ANA!-ISYMANA!-SYMANA!-PACKAGE +COPY-AN!-ISYMANA!-SYMANA!-PACKAGE +RSUBR-ANA!-ISYMANA!-SYMANA!-PACKAGE +ISTRUC-ANA!-ISYMANA!-SYMANA!-PACKAGE +ISTRUC2-ANA!-ISYMANA!-SYMANA!-PACKAGE +READ-ANA!-ISYMANA!-SYMANA!-PACKAGE +READ2-ANA!-ISYMANA!-SYMANA!-PACKAGE +GET-ANA!-ISYMANA!-SYMANA!-PACKAGE +GET2-ANA!-ISYMANA!-SYMANA!-PACKAGE +MAPPER-AN!-ISYMANA!-SYMANA!-PACKAGE +MARGS-ANA!-ISYMANA!-SYMANA!-PACKAGE +ARITH-ANA!-ISYMANA!-SYMANA!-PACKAGE +ARITHP-ANA!-ISYMANA!-SYMANA!-PACKAGE +ARITHP-ANA!-ISYMANA!-SYMANA!-PACKAGE +ARITHP-ANA!-ISYMANA!-SYMANA!-PACKAGE +ARITH-ANA!-ISYMANA!-SYMANA!-PACKAGE +ABS-ANA!-ISYMANA!-SYMANA!-PACKAGE +FIX-ANA!-ISYMANA!-SYMANA!-PACKAGE +FLOAT-ANA!-ISYMANA!-SYMANA!-PACKAGE +MOD-ANA!-ISYMANA!-SYMANA!-PACKAGE +LENGTH-ANA!-ISYMANA!-SYMANA!-PACKAGE +EMPTY?-ANA!-ISYMANA!-SYMANA!-PACKAGE +NTH-ANA!-ISYMANA!-SYMANA!-PACKAGE +REST-ANA!-ISYMANA!-SYMANA!-PACKAGE +PUT-ANA!-ISYMANA!-SYMANA!-PACKAGE +PUTREST-ANA!-ISYMANA!-SYMANA!-PACKAGE +UNWIND-ANA!-ISYMANA!-SYMANA!-PACKAGE +FORM-F-ANA!-ISYMANA!-SYMANA!-PACKAGE +COPY-AN!-ISYMANA!-SYMANA!-PACKAGE +BACK-ANA!-ISYMANA!-SYMANA!-PACKAGE +TOP-ANA!-ISYMANA!-SYMANA!-PACKAGE +SUBSTRUC-ANA!-ISYMANA!-SYMANA!-PACKAGE +DEFAULT-GEN!-ICODGEN!-CODGEN!-PACKAGE +FORM-GEN!-ICODGEN!-CODGEN!-PACKAGE +PROG-REP-GEN!-ICODGEN!-CODGEN!-PACKAGE +SUBR-GEN!-ICODGEN!-CODGEN!-PACKAGE +COND-GEN!-ICODGEN!-CODGEN!-PACKAGE +LVAL-GEN!-ICODGEN!-CODGEN!-PACKAGE +SET-GEN!-ICODGEN!-CODGEN!-PACKAGE +OR-GEN!-ICODGEN!-CODGEN!-PACKAGE +AND-GEN!-ICODGEN!-CODGEN!-PACKAGE +RETURN-GEN!-ICODGEN!-CODGEN!-PACKAGE +COPY-GEN!-ICODGEN!-CODGEN!-PACKAGE +AGAIN-GEN!-ICODGEN!-CODGEN!-PACKAGE +GO-GEN!-ICODGEN!-CODGEN!-PACKAGE +ARITH-GEN!-ICODGEN!-CODGEN!-PACKAGE +RSUBR-GEN!-ICODGEN!-CODGEN!-PACKAGE +0-TEST!-ICODGEN!-CODGEN!-PACKAGE +NOT-GEN!-ICODGEN!-CODGEN!-PACKAGE +1?-GEN!-ICODGEN!-CODGEN!-PACKAGE +TEST-GEN!-ICODGEN!-CODGEN!-PACKAGE +==-GEN!-ICODGEN!-CODGEN!-PACKAGE +TYPE?-GEN!-ICODGEN!-CODGEN!-PACKAGE +LNTH-GEN!-ICODGEN!-CODGEN!-PACKAGE +MT-GEN!-ICODGEN!-CODGEN!-PACKAGE +REST-GEN!-ICODGEN!-CODGEN!-PACKAGE +NTH-GEN!-ICODGEN!-CODGEN!-PACKAGE +PUT-GEN!-ICODGEN!-CODGEN!-PACKAGE +PUTREST-GEN!-ICODGEN!-CODGEN!-PACKAGE +FLVAL-GEN!-ICODGEN!-CODGEN!-PACKAGE +FSET-GEN!-ICODGEN!-CODGEN!-PACKAGE +FGVAL-GEN!-ICODGEN!-CODGEN!-PACKAGE +FSETG-GEN!-ICODGEN!-CODGEN!-PACKAGE +STACKFORM-GEN!-ICODGEN!-CODGEN!-PACKAGE +MIN-MAX!-ICODGEN!-CODGEN!-PACKAGE +CHTYPE-GEN!-ICODGEN!-CODGEN!-PACKAGE +FIX-GEN!-ICODGEN!-CODGEN!-PACKAGE +FLOAT-GEN!-ICODGEN!-CODGEN!-PACKAGE +ABS-GEN!-ICODGEN!-CODGEN!-PACKAGE +MOD-GEN!-ICODGEN!-CODGEN!-PACKAGE +ID-GEN!-ICODGEN!-CODGEN!-PACKAGE +ASSIGNED?-GEN!-ICODGEN!-CODGEN!-PACKAGE +ISTRUC-GEN!-ICODGEN!-CODGEN!-PACKAGE +ISTRUC-GEN!-ICODGEN!-CODGEN!-PACKAGE +BITS-GEN!-ICODGEN!-CODGEN!-PACKAGE +GETBITS-GEN!-ICODGEN!-CODGEN!-PACKAGE +BITLOG-GEN!-ICODGEN!-CODGEN!-PACKAGE +PUTBITS-GEN!-ICODGEN!-CODGEN!-PACKAGE +ISUBR-GEN!-ICODGEN!-CODGEN!-PACKAGE +ID-GEN!-ICODGEN!-CODGEN!-PACKAGE +READ2-GEN!-ICODGEN!-CODGEN!-PACKAGE +SUBR-GEN!-ICODGEN!-CODGEN!-PACKAGE +IPUT-GEN!-ICODGEN!-CODGEN!-PACKAGE +IREMAS-GEN!-ICODGEN!-CODGEN!-PACKAGE +GET-GEN!-ICODGEN!-CODGEN!-PACKAGE +GET2-GEN!-ICODGEN!-CODGEN!-PACKAGE +IRSUBR-GEN!-ICODGEN!-CODGEN!-PACKAGE +MAPFR-GEN!-ICODGEN!-CODGEN!-PACKAGE +MPARGS-GEN!-ICODGEN!-CODGEN!-PACKAGE +MAPLEAVE-GEN!-ICODGEN!-CODGEN!-PACKAGE +MAPRET-STOP-GEN!-ICODGEN!-CODGEN!-PACKAGE +UNWIND-GEN!-ICODGEN!-CODGEN!-PACKAGE +GVAL-GEN!-ICODGEN!-CODGEN!-PACKAGE +SETG-GEN!-ICODGEN!-CODGEN!-PACKAGE +TAG-GEN!-ICODGEN!-CODGEN!-PACKAGE +PRINT-GEN!-ICODGEN!-CODGEN!-PACKAGE +MEMQ-GEN!-ICODGEN!-CODGEN!-PACKAGE +LENGTH?-GEN!-ICODGEN!-CODGEN!-PACKAGE +FORM-F-GEN!-ICODGEN!-CODGEN!-PACKAGE +INFO-GEN!-ICODGEN!-CODGEN!-PACKAGE +OBLIST?-GEN!-ICODGEN!-CODGEN!-PACKAGE +AS-NXT-GEN!-ICODGEN!-CODGEN!-PACKAGE +ASSOC-FIELD-GET!-ICODGEN!-CODGEN!-PACKAGE +ALL-REST-GEN!-ICODGEN!-CODGEN!-PACKAGE +LIST-BUILD!-ICODGEN!-CODGEN!-PACKAGE +SPEC-PUT-GEN!-ICODGEN!-CODGEN!-PACKAGE +BACK-GEN!-ICODGEN!-CODGEN!-PACKAGE +TOP-GEN!-ICODGEN!-CODGEN!-PACKAGE +SUBSTRUC-GEN!-ICODGEN!-CODGEN!-PACKAGE +ROT-GEN!-ICODGEN!-CODGEN!-PACKAGE +LSH-GEN!-ICODGEN!-CODGEN!-PACKAGE +BIT-TEST-GEN!-ICODGEN!-CODGEN!-PACKAGE +ENTROPY!-SYMANA!-PACKAGE +NORM-BAN!-SYMANA!-PACKAGE +NAUX-BAN!-SYMANA!-PACKAGE +TUP-BAN!-SYMANA!-PACKAGE +ARGS-BAN!-SYMANA!-PACKAGE +MENTROPY!-MAPANA!-PACKAGE +MAUX!-MAPANA!-PACKAGE +MAUX1!-MAPANA!-PACKAGE +MTUPLE!-MAPANA!-PACKAGE +MBAD!-MAPANA!-PACKAGE +MOPT!-MAPANA!-PACKAGE +MOPT2!-MAPANA!-PACKAGE +MNORM!-MAPANA!-PACKAGE +)> + + +<REPEAT ((A <ASSOCIATIONS>) RSB) + <COND (<==? <INDICATOR .A> ANALYSIS!-SYMANA!-PACKAGE> + <COND (<TYPE? <SET RSB <AVALUE .A>> RSUBR RSUBR-ENTRY> + <COND (<NOT <MEMQ <3 .RSB> ,SURVIVERS>> + <SETG SURVIVERS (<3 .RSB> !,SURVIVERS)>)>)>)> + <OR <SET A <NEXT .A>> <RETURN>>> + + + +<GROUP-GLUE SYMANA + <> + .OUTCHAN + ,PKGS + ,SURVIVERS> + +<MOBY-CLEAN SYMANA> + diff --git a/<mdl.comp>/mudhak.mud.2 b/<mdl.comp>/mudhak.mud.2 new file mode 100644 index 0000000..afa1c73 --- /dev/null +++ b/<mdl.comp>/mudhak.mud.2 @@ -0,0 +1,17 @@ + +<FLOAD "PS:<COMPIL>MUDREF.NBIN"> + +<DEFINE BEGIN-MHACK () + <SET READ-TABLE <SETG READ-TABLE + <COND (<GASSIGNED? READ-TABLE> ,READ-TABLE) + (ELSE <IVECTOR 128 0>)>>> + <PUT .READ-TABLE <+ <ASCII !"|> 1> ,MUDREFIN> + <PRINTTYPE MUDREF!-OP ,OUTPUT-MUDREF> + T> + +<DEFINE END-MHACK () + <PUT ,READ-TABLE <+ <ASCII !"|> 1> 0> + <PRINTTYPE MUDREF!-OP ,PRINT> + T> + + \ No newline at end of file diff --git a/<mdl.comp>/mudref.mud.1 b/<mdl.comp>/mudref.mud.1 new file mode 100644 index 0000000..32ab1b4 --- /dev/null +++ b/<mdl.comp>/mudref.mud.1 @@ -0,0 +1,135 @@ + + <NEWTYPE MUDREF!-OP WORD> + + + <TITLE MUDREFIN> + <DECLARE ("VALUE" MUDREF!-OP CHARACTER)> + <PUSH TP* (AB)> + <PUSH TP* 1(AB)> + <PUSHJ P* MUDR1> + <JRST FINIS> + + <INTERNAL-ENTRY MUDR1 1> + <SUBM M* (P)> + <SUB TP* [<2 (2)>]> ; "CLEAN OFF USELESS ARGUMENT" + <PUSH P* [0]> ; "NUMBER OF ARGUMENTS TO STRING" + <MOVSI A* <TYPE-CODE ATOM>> ; "GET CHANNEL AND PUSH IT" + <MOVE B* <MQUOTE INCHAN>> + <PUSHJ P* CILVAL> + <PUSH TP* A> + <PUSH TP* B> + <PUSH P* [0]> +LP1 <MOVE A* -1(TP)> + <MOVE B* (TP)> + <PUSHJ P* CNXTC1> + <CAIE B* <ASCII !"$>> + <CAIN B* <ASCII !".>> + <JRST LP3> + <CAIN B* <ASCII !"%>> + <JRST LP3> + <CAIG B* *132*> ; "Between 0 and Z?" + <CAIGE B* *57*> + <JRST LP2> + <CAILE B* *71*> ; "Skip if digit." + <CAILE B* *100*> ; "Skip if an upper case letter." +LP3 <SKIPA B* (TP)> ; "GET BACK CHANNEL" + <JRST LP2> + <PUSHJ P* CREDC1> + <MOVE A* (P)> + <TLNE A* *770000*> + <JRST LP1> + <LSH A* 6> + <SUBI B* *40*> + <DPB B* [<(*000600* ) A>]> + <MOVEM A* (P)> + <JRST LP1> +LP2 +ISYM <MOVSI C* (<CHTYPE <* *50* *50* *50* *50* *50* *50*> OPCODE>)> + <MOVEI B* 0> + <MOVE E* [<(*440600*) (P)>]> + +ISYM0 <ILDB A* E> + <JUMPE A* ISYM0> + <SUBI A* <- <ASCII !"0> 33>> + <CAIL A* <- <ASCII !"A> <ASCII !"0> -1>> + <SUBI A* <- <ASCII !"A> <ASCII !"0> *12*>> + <JUMPGE A* ISYM2> + <ADDI A* *61*> + <CAIN A* *60*> + <MOVEI A* *45*> +ISYM2 <IDIVI C* *50*> + <IMUL A* C> + <ADDM A* B> + <TLNE E* *770000*> + <JRST ISYM0> + +ISYM3 <MOVSI A* <TYPE-CODE MUDREF!-OP >> + <SUB P* [<2 (2)>]> + <JRST MPOPJ> + + + + <SUB-ENTRY OUTPUT-MUDREF ("VALUE" ANY MUDREF!-OP )> + <PUSH TP* (AB)> + <PUSH TP* 1 (AB)> + <PUSHJ P* IOUT> + <JRST FINIS> + + <INTERNAL-ENTRY IOUT 1> + <SUBM M* (P)> + <MOVSI A* <TYPE-CODE ATOM>> + <MOVE B* <MQUOTE OUTCHAN>> + <PUSHJ P* CILVAL> + <PUSH TP* A> + <PUSH TP* B> + <GETYP E* A> + <CAIE E* <TYPE-CODE CHANNEL>> + <JRST STARTP> + <MOVE E* 27 (B)> + <ADDI E* 7> + <CAMGE E* 25 (B)> + <JRST STARTP> + <MOVEI D* 13> ; "Carriage ret lf first" + <PUSHJ P* CPCH> + <MOVEI D* 10> + <MOVSI A* <TYPE-CODE CHANNEL>> + <MOVE B* (TP)> + <PUSHJ P* CPCH> + <MOVSI A* <TYPE-CODE CHANNEL>> + <MOVE B* (TP)> + +STARTP <MOVEI D* <ASCII !"|>> + <PUSHJ P* CPCH> +LPS <MOVE D* -2 (TP)> + <PUSHJ P* SPT1> + <POP TP* B> + <POP TP* A> + <MOVEI D* <ASCII !" >> + <PUSHJ P* CPCH> +LEAVE <SUB TP* [<2 (2)>]> + <JRST MPOPJ> + +SPT1 <SUBM M* (P)> +SPT2 <IDIVI D* *50*> + <HRLM E* (P)> + <JUMPE D* SPT3> + <JUMPE E* SPT2> + <PUSHJ P* SPT1> +SPT3 <HLRE D* (P)> + <ADDI D* <- <ASCII !"0> 1>> + <CAILE D* <ASCII !"9>> + <ADDI D* <- <ASCII !"A> <ASCII !"9> 1>> + <CAILE D* <ASCII !"Z>> + <SUBI D* <- <ASCII !"Z> <ASCII !"#> -1>> + <CAIN D* <ASCII !"#>> + <MOVEI D* <ASCII !".>> + <CAIN D* <ASCII !"/>> +SPC <MOVEI D* *40*> + <MOVE A* -1 (TP)> + <MOVE B* (TP)> + <PUSHJ P* CPCH> + <HRROS (P)> + <JRST MPOPJ> + + +  \ No newline at end of file diff --git a/<mdl.comp>/ncomfi.mud.2 b/<mdl.comp>/ncomfi.mud.2 new file mode 100644 index 0000000..4bb4bc2 --- /dev/null +++ b/<mdl.comp>/ncomfi.mud.2 @@ -0,0 +1,65 @@ + +<PACKAGE "FCOMPIL"> + +<BLOCK (<ROOT>)> + +COMPILE + +STATUS + +<ENDBLOCK> + +<ENTRY +PACKAGE-MODE +SURVIVORS +CAREFUL +REDO +SOURCE +GROUP-MODE +NILOBL +FAST-OUT +PRECOMPILED +TEMPNAME +EXCLUSIVE +DISOWN +MAX-SPACE +MACRO-COMPILE +MACRO-FLUSH +DESTROY +ERROR-LOGOUT +FCOMP +FILE-COMPILE> + +<USE "COMPDEC"> + +<DEFINE MODES-INIT () + <SET DEBUG-COMPILE <>> + <SET PACKAGE-MODE <>> + <SET SURVIVORS <>> + <SET REASONABLE T> + <SET GLUE T> + <SET CAREFUL T> + <SET REDO ()> + <SET SPECIAL <>> + <SET SOURCE <>> + <SET GROUP-MODE <>> + <SET NILOBL <>> + <SET FAST-OUT T> + <SET EXPFLOAD <>> + <UNASSIGN PRECOMPILED> + <UNASSIGN TEMPNAME> + <GUNASSIGN EXCLUSIVE> + <SET DISOWN T> + <SET MAX-SPACE <>> + <SET HAIRY-ANALYSIS T> + <SET MACRO-COMPILE <>> + <SET MACRO-FLUSH <>> + <SET DESTROY T> + <SET ERROR-LOGOUT T>> + + + +<FLOAD "COMFIL.MUD"> + +<MODES-INIT> +<ENDPACKAGE> \ No newline at end of file diff --git a/<mdl.comp>/newcmp.mud.1 b/<mdl.comp>/newcmp.mud.1 new file mode 100644 index 0000000..132ce2e --- /dev/null +++ b/<mdl.comp>/newcmp.mud.1 @@ -0,0 +1,43 @@ + + <TITLE NEWCOMP> + + <PSEUDO <SETG *SSNAM *400016*>> + <PSEUDO <SETG *RSNAM *16*>> + + <SETZB A* B> + <*SETM2 A*> + <MOVE A* [<*CLOSE >]> + <MOVEI O* *20*> + +LP <XCT A> + <ADD A* [<A*>]> + <SOJN O* LP> + <*SUSET [<(*RSNAM)A>]> + <MOVE B* [<SIXBIT "SYS1">]> + <*SUSET [<(*SSNAM)B>]> + <*OPEN A* MUDOPN> + <*VALUE> +SELFLD <*SUSET [<(*SSNAM)A>]> + <MOVSI P* STUFF> + <BLT P* P> + <JRST 1> + +MUDOPN <SIXBIT " $DSK"> + <SIXBIT "TS "> + <SIXBIT "NPCOMP"> + +STUFF <SIXBIT "NCOMP "> + <*CORE 1> + <*VALUE> + <*CALL *10*> + <*VALUE > + <*IOT A* A> + <*CLOSE A*> + <JRST @ A> + + <SETZ> + <SIXBIT "LOAD"> + <(*1000*) *777777*> + <SETZI 1> + +  \ No newline at end of file diff --git a/<mdl.comp>/newop.mud.1 b/<mdl.comp>/newop.mud.1 new file mode 100644 index 0000000..dd82d0f --- /dev/null +++ b/<mdl.comp>/newop.mud.1 @@ -0,0 +1,48 @@ +;"Define symbolic opcodes" + +<PACKAGE "OP" "IOP" 199 5> + +<BLOCK (<GET OP!-PACKAGE!- OBLIST>)> + +<NEWTYPE!- MUDREF WORD!-> +<NEWTYPE!- ADDRESS WORD!-> +<NEWTYPE!- OPCODE WORD!-> + +<SETG!- MCALL* #OPCODE *2000000000*> ;"Define UUO's" +<SETG!- ACALL* #OPCODE *3000000000*> + + + +;"Assembler psuedo-ops; defined in the assembler (CODING)" +PSEUDO MQUOTE DECLARE SUB-ENTRY GETYP MCALL ACALL TYPE-CODE +*INSERT SYMDEF TYPE-WORD ENTER INTGO VARIABLE ADDR HERE + + + + + <ENDBLOCK!-> + + + + ;"Define ac's" + + + +"Set up MUDDLE oblist: + Global symbols are, in general, internal MUDDLE addresses; + therefore they need to be 'fixed up' upon every loading" + + + +<COND (<LOOKUP "TTP" <GET MUDDLE OBLIST>> + <INSERT <REMOVE "TTP" <GET MUDDLE OBLIST>> <GET OP!-PACKAGE OBLIST>> + <INSERT <REMOVE "TDEFER" <GET MUDDLE OBLIST>> <GET OP!-PACKAGE OBLIST>>)> + +<MAPF <> <FUNCTION (L) <MAPF <> ,REMOVE .L> > <1 .OBLIST>> +<PUT IOP!-OP!-PACKAGE!- OBLIST> +<PUT <1 .OBLIST> OBLIST> +<ENDPACKAGE> + + + +  \ No newline at end of file diff --git a/<mdl.comp>/newrep.mud.60 b/<mdl.comp>/newrep.mud.60 new file mode 100644 index 0000000..4e998d0 --- /dev/null +++ b/<mdl.comp>/newrep.mud.60 @@ -0,0 +1,998 @@ +<PACKAGE "NEWREP"> + +<ENTRY PROG-REP-GEN RETURN-GEN AGAIN-GEN TAG-GEN GO-GEN CLEANUP-STATE + AGAIN-UP RETURN-UP PROG-START-AC> + +<USE "CODGEN" "COMCOD" "CACS" "CHKDCL" "COMPDEC" "CUP"> + +" Generate code for a poor innocent PROG or REPEAT." + + +" " + +<DEFINE PROG-REP-GEN (PNOD PWHERE + "AUX" (BSTB .BSTB) (NTSLOTS .NTSLOTS) XX (SPECD <>) + START:TAG (STB .STK) (STK (0 !.STK)) + (NTMPS + <COND (.PRE .TMPS) + (<STACK:L .STK .BSTB>) + (ELSE (0))>) (TMPS .TMPS) BTP (BASEF .BASEF) + EXIT EXIT:OFF AGAIN (FRMS .FRMS) (OPRE .PRE) DEST + (CD <>) (AC-HACK .AC-HACK) (K <KIDS .PNOD>) + (SPEC-LIST .SPEC-LIST) TEM (ONS .NTSLOTS) + (ORPNOD <AND <ASSIGNED? RPNOD> .RPNOD>) RPNOD + SACS) + #DECL ((NTSLOTS STB) <SPECIAL LIST> (BASEF PNOD RPNOD) <SPECIAL NODE> + (PWHERE DEST) <OR ATOM DATUM> (SPECD PRE) <SPECIAL ANY> + (STK FRMS) <SPECIAL LIST> (BTP NSTB) LIST + (AC-HACK) <SPECIAL <PRIMTYPE LIST>> (TMPS) <SPECIAL LIST> + (START:TAG) <SPECIAL ATOM> (K) <LIST [REST NODE]> + (SPEC-LIST) <SPECIAL LIST>) + <REGSTO <> <>> + <COND (<N==? <NODE-SUBR .PNOD> ,BIND> <SET RPNOD .PNOD>) + (.ORPNOD <SET RPNOD .ORPNOD>)> + <PUT .PNOD ,SPECS-START <- <SPECS-START .PNOD> .TOT-SPEC>> + <SET TMPS .NTMPS> + <BEGIN-FRAME <TMPLS .PNOD> <ACTIVATED .PNOD> <PRE-ALLOC .PNOD>> + <SET DEST + <COND (<==? .PWHERE FLUSHED> FLUSHED) + (ELSE <GOODACS .PNOD .PWHERE>)>> + <PROG ((PRE .PRE) (TOT-SPEC .TOT-SPEC)) + #DECL ((PRE) <SPECIAL ANY> (TOT-SPEC) <SPECIAL FIX>) + <OR .PRE + <EMIT-PRE <NOT <OR <ACTIVATED .PNOD> <0? <SSLOTS .BASEF>>>>>> + <COND (<ACTIVATED .PNOD> + <REGSTO T> + <SET TOT-SPEC 0> + <SET SPEC-LIST ()> + <ADD:STACK ,FRAMLN> + <SET FRMID <+ .FRMID 1>> + <PUT .FRMS 5 .NTSLOTS> + <SET FRMS + (.FRMID + <SET STK (0 !.STK)> + .PNOD + <COND (.PRE FUZZ) + (<STACK:L .STK <2 .FRMS>>) + (ELSE FUZZ)> + (<FORM GVAL <TMPLS .PNOD>>) + !.FRMS)> + <SET PRE <>> + <SET AC-HACK <>> + <SET BASEF .PNOD> + <SET NTSLOTS (<FORM GVAL <TMPLS .PNOD>>)> + <COND (<NOT <==? .PWHERE FLUSHED>> + <SET DEST <FUNCTION:VALUE>>)> + <BUILD:FRAME <SET EXIT:OFF <MAKE:TAG "EXIT">>> + <SET TMPS (2)> + <SET BSTB .STK>)> + <SET EXIT <MAKE:TAG "EXIT">> + <PUT .PNOD ,STK-B .STB> + <COND (<AND <NOT .PRE> <NOT <ACTIVATED .PNOD>>> + <SET NTSLOTS (<FORM GVAL <TMPLS .PNOD>> !.NTSLOTS)>)> + <BIND-CODE .PNOD> + <SET SPEC-LIST (.PNOD .SPECD <SPECS-START .PNOD> !.SPEC-LIST)> + <SET BTP .STK> + <OR .OPRE <SET BASEF .PNOD>> + <SET STK (0 !.STK)> + <COND (<OR <AGND .PNOD> <==? <NODE-SUBR .PNOD> ,REPEAT>> + <PROG-START-AC .PNOD>) + (ELSE <SET SACS <SAVE:RES>> <REGSTO <>>)> + <LABEL:TAG <SET AGAIN <MAKE:TAG "AGAIN">>> + <COND (<OR <AGND .PNOD> <==? <NODE-SUBR .PNOD> ,REPEAT>> + <CALL-INTERRUPT>)> + <PUT .PNOD ,BTP-B .BTP> + <PUT .PNOD ,DST .DEST> + <PUT .PNOD ,SPCS-X .SPECD> + <PUT .PNOD ,ATAG .AGAIN> + <PUT .PNOD ,RTAG .EXIT> + <PUT .PNOD ,PRE-ALLOC .PRE> + <COND (<OR <==? <NODE-SUBR .PNOD> ,REPEAT> <AGND .PNOD>> + <COND (<OR <==? <NODE-SUBR .PNOD> ,REPEAT> + <==? .DEST FLUSHED>> + <RET-TMP-AC <SET TEM <SEQ-GEN .K FLUSHED T T>>>) + (ELSE + <SET TEM <SET CD <SEQ-GEN .K .DEST T T>>> + <COND (<==? .TEM ,NO-DATUM> + <COND (<EMPTY? <CDST .PNOD>> + <SET CD ,NO-DATUM>) + (ELSE <SET CD <CDST .PNOD>>)>)>)>) + (ELSE + <COND (<==? .DEST FLUSHED> + <RET-TMP-AC <SET TEM <SEQ-GEN .K .DEST T>>> + <COND (<NOT <==? .TEM ,NO-DATUM>>)>) + (ELSE + <SET TEM <SET CD <SEQ-GEN .K .DEST T>>> + <COND (<==? .TEM ,NO-DATUM> + <COND (<EMPTY? <CDST .PNOD>> + <SET CD ,NO-DATUM>) + (ELSE <SET CD <CDST .PNOD>>)>)>)>)> + <OR <ASSIGNED? NPRUNE> <PUT .PNOD ,KIDS ()>> + <AND .CD <TYPE? .CD DATUM> <PROG () + <ACFIX .DEST .CD>>> + <COND (<AND <N==? <NODE-SUBR .PNOD> ,REPEAT> + <N==? .TEM ,NO-DATUM>> + <COND (<ACTIVATED .PNOD> <PROG:END>) + (.OPRE + <POP:LOCS .STK .STB> + <UNBIND:FUNNY <SPECS-START .PNOD> !.NTSLOTS>) + (ELSE <UNBIND:LOCS .STK .STB>)>) + (<==? <NODE-SUBR .PNOD> ,REPEAT> + <AGAIN-UP .PNOD> + <BRANCH:TAG .AGAIN>)> + <COND (<AND <N==? <NODE-SUBR .PNOD> ,REPEAT> <AGND .PNOD>> + <RETURN-UP .PNOD>)> + <COND (<AND <N==? <NODE-SUBR .PNOD> ,REPEAT> <NOT <AGND .PNOD>>> + <NON-LOOP-CLEANUP .PNOD> + <PROG ((STK .STB) (NTSLOTS .ONS)) + #DECL ((NTSLOTS STK) <SPECIAL LIST>) + <VAR-STORE>>)> + <COND (<OR <AGND .PNOD> <==? <NODE-SUBR .PNOD> ,REPEAT>> + <CLEANUP-STATE .PNOD>) + (ELSE <CHECK:VARS .SACS T>)> + <COND (<AND <==? <NODE-SUBR .PNOD> ,REPEAT> + <NOT <==? .DEST FLUSHED>>> + <MOVE:ARG .DEST .DEST>)> + <COND (<AND <TYPE? .DEST DATUM> + <ISTYPE? <DATTYP .DEST>> + .CD + <TYPE? <DATTYP .CD> AC>> + <RET-TMP-AC <DATTYP .CD> .CD>)> + <LABEL:TAG .EXIT> + <COND (<ACTIVATED .PNOD> <LABEL:OFF .EXIT:OFF>) + (ELSE <SET TEM .TOT-SPEC>)>> + <OR <ACTIVATED .PNOD> <SET TOT-SPEC .TEM>> + <SET STK .STB> + <COND (.CD + <AND <TYPE? <DATTYP .DEST> AC> + <FIX-ACLINK <DATTYP .DEST> .DEST .CD>> + <AND <TYPE? <DATVAL .DEST> AC> + <FIX-ACLINK <DATVAL .DEST> .DEST .CD>>)> + <SET XX <MOVE:ARG .DEST .PWHERE>> + <END-FRAME> + .XX> + +" " + +" Generate code for a RETURN." + +<DEFINE RETURN-GEN (NOD WHERE + "AUX" (SPECD .SPECD) N NN (CD1 <>) DEST (NF 0) + NOT-HANDLED-PROG (NT .NTSLOTS)) + #DECL ((NOD N RPNOD) NODE (WHERE) <OR ATOM DATUM> (CD1) <OR DATUM + FALSE> + (SPECD) <SPECIAL ANY> (NF) FIX) + <PROG () + <COND (<1? <LENGTH <KIDS .NOD>>> <SET N .RPNOD>) + (<SET NN <RET-AGAIN-ONLY <NODE-NAME <2 <KIDS .NOD>>>>> + <SET N .NN>) + (ELSE <RETURN <SUBR-GEN .NOD .WHERE>>)> + <SET NOT-HANDLED-PROG + <NOT <OR <==? <NODE-SUBR .N> ,REPEAT> + <AND <==? <NODE-SUBR .N> ,PROG> <AGND .N>>>>> + <COND (<==? <SET DEST <DST .N>> FLUSHED> + <RET-TMP-AC <GEN <1 <KIDS .NOD>> FLUSHED>>) + (ELSE + <PUT .N + ,CDST + <SET CD1 <GEN <1 <KIDS .NOD>> <DATUM !.DEST>>>> + <RET-TMP-AC .CD1> + <ACFIX <DST .N> .CD1>)> + <AND .NOT-HANDLED-PROG <VAR-STORE>> + <COND (<ACTIVATED .N> + <REPEAT ((L .FRMS)) + #DECL ((L) LIST) + <COND (<==? <3 .L> .N> <RETURN>)> + <AND <EMPTY? <SET L <REST .L 5>>> <RETURN>> + <SET NT <5 .L>> + <SET NF <+ .NF 1>>> + <GO:BACK:FRAMES .NF> + <OR .NOT-HANDLED-PROG <RETURN-UP .N>> + <PROG:END>) + (ELSE + <REPEAT ((LL .SPEC-LIST)) + #DECL ((LL) LIST) + <AND <2 .LL> <RETURN <SET SPECD T>>> + <AND <==? <1 .LL> .N> <RETURN>> + <SET LL <REST .LL 3>>> + <COND (<TYPE? .CD1 DATUM> + <COND (<TYPE? <DATTYP .CD1> AC> + <PUT <DATTYP .CD1> ,ACPROT T>)> + <COND (<TYPE? <DATVAL .CD1> AC> + <PUT <DATVAL .CD1> ,ACPROT T>)>)> + <COND (<PRE-ALLOC .N> + <POP:LOCS .STK <STK-B .N>> + <UNBIND:FUNNY <SPECS-START .N> !.NT>) + (ESLE <UNBIND:LOCS .STK <STK-B .N>>)> + <COND (<TYPE? .CD1 DATUM> + <COND (<TYPE? <DATTYP .CD1> AC> + <PUT <DATTYP .CD1> ,ACPROT <>>)> + <COND (<TYPE? <DATVAL .CD1> AC> + <PUT <DATVAL .CD1> ,ACPROT <>>)>)> + <OR .NOT-HANDLED-PROG + <PROG ((STB <STK-B .N>)) + #DECL ((STB) <SPECIAL LIST>) + <RETURN-UP .N>>> + <BRANCH:TAG <RTAG .N>>)> + ,NO-DATUM>> + +<DEFINE GO:BACK:FRAMES (NF) + #DECL ((NF) FIX) + <OR <0? .NF> + <REPEAT () + <EMIT '<`MOVE `TB* |OTBSAV `(TB) >> + <COND (<0? <SET NF <- .NF 1>>> <RETURN>)>>>> + +" " + +" Generate code for an AGAIN." + +<DEFINE AGAIN-GEN (NOD WHERE + "AUX" N NN (SPECD .SPECD) (PRE <>) NOT-HANDLED-PROG) + #DECL ((NOD N RPNOD) NODE (SPECD) <SPECIAL ANY>) + <PROG () + <COND (<EMPTY? <KIDS .NOD>> <SET N .RPNOD>) + (<SET NN <RET-AGAIN-ONLY <NODE-NAME <1 <KIDS .NOD>>>>> + <SET N .NN>) + (ELSE <VAR-STORE <>> <RETURN <SUBR-GEN .NOD .WHERE>>)> + <COND (<SET NOT-HANDLED-PROG + <NOT <OR <==? <NODE-SUBR .N> ,PROG> + <==? <NODE-SUBR .N> ,REPEAT> + <==? <NODE-SUBR .N> ,BIND>>>> + <VAR-STORE>)> + <COND (<N==? .N <1 .SPEC-LIST>> + <REPEAT ((L1 ()) (LL .SPEC-LIST)) + #DECL ((LL L1) LIST) + <AND <EMPTY? <SET L1 <REST .LL 3>>> <RETURN>> + <AND <2 .LL> <SET SPECD <3 .LL>>> + <COND (<==? <4 .LL> .N> + <RETURN <SET PRE <PRE-ALLOC <1 .LL>>>>) + (ELSE <SET LL .L1>)>>)> + <COND (.PRE <POP:LOCS .STK <BTP-B .N>> <UNBIND:FUNNY .SPECD !.NTSLOTS>) + (ELSE <UNBIND:LOCS .STK <BTP-B .N>>)> + <OR .NOT-HANDLED-PROG <PROG ((STK <BTP-B .N>)) #DECL ((STK) <SPECIAL LIST>) + <AGAIN-UP .N>>> + <BRANCH:TAG <ATAG .N>> + ,NO-DATUM>> + +" Generate code for a GO in a PROG/REPEAT." + +<DEFINE GO-GEN (NOD WHERE "AUX" (N <1 <KIDS .NOD>>) (RT <RESULT-TYPE .N>)) + #DECL ((NOD N) NODE (WHERE) <OR ATOM DATUM>) + <VAR-STORE> + <COND (<==? .RT ATOM> + <POP:LOCS .STK <BTP-B .RPNOD>> + <REGSTO T> + <BRANCH:TAG <UNIQUE:TAG <NODE-NAME <1 <KIDS .NOD>>> <>>>) + (ELSE + <RET-TMP-AC <STACK:ARGUMENT <GEN .N DONT-CARE>>> + <REGSTO T> + <EMIT '<MCALL!-OP!-PACKAGE 1 GO>>)> + ,NO-DATUM> + +<DEFINE TAG-GEN (NOD WHERE + "AUX" (ATM <UNIQUE:TAG <NODE-NAME <1 <KIDS .NOD>>> <>>)) + #DECL ((NOD) NODE) + <EMIT <INSTRUCTION `MOVEI `O .ATM>> + <EMIT '<`SUBI `O `(M) >> + <EMIT '<`PUSH `TP* <TYPE-WORD!-OP!-PACKAGE FIX>>> + <EMIT '<`PUSH `TP* 0>> + <REGSTO T> + <EMIT '<`PUSHJ `P* |MAKACT >> + <EMIT '<`PUSH `TP* `A >> + <EMIT '<`PUSH `TP* `B >> + <EMIT '<MCALL!-OP!-PACKAGE 2 TAG>> + <MOVE:ARG <FUNCTION:VALUE T> .WHERE>> + + +" Generate code to flush stack for leaving a PROG etc." + +<DEFINE PROG:UNBIND () + #DECL ((STK STB) LIST (PNOD) NODE) + <COND (.PRE + <POP:LOCS .STK .STB> + <UNBIND:FUNNY <SPECS-START .PNOD> !.NTSLOTS>) + (ELSE <UNBIND:LOCS .STK .STB>)>> + +" " + +"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." + +<DEFINE PROG-START-AC (PNOD "AUX" (PVARS ()) ONSYMT OPROG-AC OPOTLV) + #DECL ((PNOD) NODE) + <MAPF <> + <FUNCTION (AC "AUX" SYMT) + #DECL ((AC) AC) + <COND (<SET SYMT <CLEAN-AC .AC>> + <COND (<NOT <MEMQ .PNOD <PROG-AC .SYMT>>> + <SET ONSYMT <NUM-SYM .SYMT>> + <SMASH-NUM-SYM .SYMT> + <SET OPROG-AC <PROG-AC .SYMT>> + <SET OPOTLV <POTLV .SYMT>> + <PUT .SYMT ,POTLV <>> + <PUT .SYMT + ,PROG-AC + (.PNOD + TMP + <STORED .SYMT> + <DATUM <DATTYP <INACS .SYMT>> + <DATVAL <INACS .SYMT>>>)> + <SET PVARS + (.SYMT + .ONSYMT + .OPROG-AC + .OPOTLV + !.PVARS)>)>)>> + ,ALLACS> + <PUT .PNOD ,LOOP-VARS ()> + <PUT .PNOD ,AGAIN-STATES ()> + <PUT .PNOD ,RETURN-STATES ()> + <PUT .PNOD ,PROG-VARS .PVARS> + <VAR-STORE <>> + <REPEAT ((PTR .PVARS) SYMT) + <COND (<EMPTY? .PTR> <RETURN>)> + <SET SYMT <SYM-SLOT .PTR>> + <OR <STORED-SLOT <PROG-AC .SYMT>> + <PUT <PROG-AC .SYMT> ,NUM-SYM-SLOT <2 <NUM-SYM .SYMT>>>> + <SET PTR <REST .PTR ,LENGTH-PROG-VARS>>>> + +<DEFINE CLEAN-AC (AC "AUX" ACRES INAC OAC) + #DECL ((AC) AC (INAC) DATUM) + <COND + (<SET ACRES <ACRESIDUE .AC>> + <PUT .AC ,ACRESIDUE <>> + <MAPF <> + <FUNCTION (SYM) + <COND + (<TYPE? .SYM SYMTAB> + <MAPF <> + <FUNCTION (SYMT) + <COND (<N==? .SYMT .SYM> + <COND (<OR <NOT <TYPE? .SYMT SYMTAB>> + <STORED .SYMT>> + <SMASH-INACS .SYMT <>>) + (ELSE <STOREV .SYMT T>)>)>> + .ACRES> + <COND + (<AND <SET INAC <INACS .SYM>> + <OR <AND <==? <DATTYP .INAC> .AC> + <TYPE? <SET OAC <DATVAL .INAC>> AC>> + <AND <==? <DATVAL .INAC> .AC> + <TYPE? <SET OAC <DATTYP .INAC>> AC>>>> + <MAPF <> + <FUNCTION (SYMT) + <COND (<N==? .SYMT .SYM> + <COND (<OR <NOT <TYPE? .SYMT SYMTAB>> + <STORED .SYMT>> + <SMASH-INACS .SYMT <>>) + (ELSE <STOREV .SYMT T>)>)>> + <ACRESIDUE .OAC>> + <PUT .OAC ,ACRESIDUE (.SYM)>)> + <PUT .AC ,ACRESIDUE (.SYM)> + <MAPLEAVE <1 <ACRESIDUE .AC>>>) + (ELSE <SMASH-INACS .SYM <>> <>)>> + .ACRES>)>> + +<DEFINE AGAIN-UP (PNOD "OPTIONAL" (RET <>) "AUX" CSTATE) + #DECL ((PNOD) NODE (RET) <OR ATOM FALSE>) + <SET CSTATE <CURRENT-AC-STATE>> + <PUT .PNOD + ,AGAIN-STATES + (.CSTATE .CODE:PTR <STACK:INFO> .RET !<AGAIN-STATES .PNOD>)>> + +<DEFINE RETURN-UP (PNOD "OPTIONAL" (STK .STB) "AUX" CSTATE) + #DECL ((PNOD) NODE (STK) <SPECIAL LIST>) + <COND (<NOT <AND <OR <==? <NODE-SUBR .PNOD> ,PROG> + <==? <NODE-SUBR .PNOD> ,BIND>> + <NOT <AGND .PNOD>>>> + <SET CSTATE <CURRENT-AC-STATE .PNOD>> + <PUT .PNOD + ,RETURN-STATES + (.CSTATE + .CODE:PTR + <STACK:INFO> + T + !<RETURN-STATES .PNOD>)>)>> + +<DEFINE STACK:INFO () + (.FRMS .BSTB .NTSLOTS .STK)> +" " + +"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." + +<DEFINE CLEANUP-STATE (PNOD + "AUX" (LOOPVARS <LOOP-VARS .PNOD>) + (AGAIN-ST <AGAIN-STATES .PNOD>) + (RETURN-ST <RETURN-STATES .PNOD>)) + #DECL ((PNOD) NODE (RETURN-ST) <SPECIAL LIST>) + <FIXUP-STORES .AGAIN-ST> + <FIXUP-STORES .RETURN-ST> + <CLEANUP-VARS <PROG-VARS .PNOD>> + <LOOP-REPEAT .LOOPVARS .AGAIN-ST> + <LOOP-RETURN .RETURN-ST>> + +<DEFINE LOOP-REPEAT (LOOPVARS AGAIN-ST) + <REPEAT ((APTR .AGAIN-ST) REST-CODE-PTR) + #DECL ((APTR) + <LIST [REST REP-STATE <PRIMTYPE LIST> LIST <OR ATOM FALSE>]> + (REST-CODE-PTR) + LIST) + <COND (<EMPTY? .APTR> <RETURN>)> + <SET REST-CODE-PTR <REST <SAVED-CODE:PTR .APTR>>> + <LOOP-RESTORE <LIST !.LOOPVARS> + <SAVED-CODE:PTR .APTR> + <SAVED-AC-STATE .APTR> + <SAVED-STACK-STATE .APTR> + <SAVED-RET-FLAG .APTR>> + <COND + (<SAVED-RET-FLAG .APTR> + <SET RETURN-ST + (<SAVED-AC-STATE .APTR> + <MAPR <> + <FUNCTION (CP "AUX" (RCP <REST .CP>)) + #DECL ((CP) <LIST ANY> (RCP) LIST) + <COND (<==? .RCP .REST-CODE-PTR> + <MAPLEAVE .CP>)>> + <SAVED-CODE:PTR .APTR>> + <SAVED-STACK-STATE .APTR> + T + !.RETURN-ST)>)> + <SET APTR <REST .APTR ,LENGTH-CONTROL-STATE>>>> + +<DEFINE LOOP-RESTORE (LPV INST ACS STACK-INFO RET) + #DECL ((LPV INST STACK-INFO) <PRIMTYPE LIST> (ACS) REP-STATE + (RET) <OR ATOM FALSE>) + <PROG ((SCODE:PTR .INST) (BSTB <SAVED-BSTB .STACK-INFO>) + (FRMS <SAVED-FRMS .STACK-INFO>) + (NTSLOTS <SAVED-NTSLOTS .STACK-INFO>) + (STK <SAVED-STK .STACK-INFO>)) + #DECL ((NTSLOTS BSTB FRMS STK SCODE:PTR) <SPECIAL LIST>) + <STORE-SAVED-ACS .LPV .ACS> + <MOVE-AROUND-ACS .LPV .ACS .RET> + <GET-ACS-FROM-STACK .LPV .ACS>>> + +<DEFINE MOVE-AROUND-ACS (LPV ACS RET) + #DECL ((LPV) LIST (ACS) REP-STATE (RET) <OR ATOM FALSE>) + <REPEAT ((LPVP .LPV) CSYMT CINACS INAC) + #DECL ((SYMT) SYMTAB (CINACS) DATUM) + <COND (<EMPTY? .LPVP> <RETURN>)> + <SET CSYMT <LSYM-SLOT .LPVP>> + <SET CINACS <LINACS-SLOT .LPVP>> + <COND (<SET INAC <AC? .CSYMT .ACS>> + <PUT .LPVP ,LSYM-SLOT <>> + <COND (<OR <=? .INAC .CINACS> + <AND <TYPE? <DATTYP .CINACS> ATOM> + <==? <DATVAL .CINACS> <DATVAL .INAC>>>>) + (<TYPE? <DATTYP .CINACS> ATOM> + <ONE-EXCH-AC .CINACS + .INAC + .ACS + .CSYMT + .RET + .LPV>) + (<TWO-AC-EXCH .CINACS + .INAC + .ACS + .CSYMT + .RET + .LPV>)>)> + <SET LPVP <REST .LPVP ,LOOPVARS-LENGTH>>>> + +<DEFINE ONE-EXCH-AC (DEST-INAC CURR-INAC ACS CSYMT RET LPV + "AUX" (DEST-AC <DATVAL .DEST-INAC>) + (NOEXCH + <AND <NOT <AND .RET <ACLINK .DEST-AC>>> + <EMPTY? <NTH .ACS <ACNUM .DEST-AC>>>>)) + #DECL ((DEST-INAC CURR-INAC) <DATUM ANY AC> (ACS) REP-STATE + (DEST-AC) AC) + <SEMIT <INSTRUCTION <COND (.NOEXCH `MOVE ) (ELSE `EXCH )> + <ACSYM <DATVAL .DEST-INAC>> + <ADDRSYM <DATVAL .CURR-INAC>>>> + <SWAP-INAC <DATVAL .CURR-INAC> + <DATVAL .DEST-INAC> + .ACS + .CSYMT + .RET + .NOEXCH + .LPV>> + +<DEFINE TWO-AC-EXCH (DEST-INAC CURR-INAC ACS CSYMT RET LPV + "AUX" (DTAC <DATTYP .DEST-INAC>) + (DVAC <DATVAL .DEST-INAC>) + (TDONTEXCH + <AND <NOT <AND .RET <ACLINK .DTAC>>> + <NTH .ACS <ACNUM .DTAC>>>) + (VDONTEXCH + <AND <NOT <AND .RET <ACLINK .DVAC>>> + <NTH .ACS <ACNUM .DVAC>>>)) + #DECL ((DEST-INAC CURR-INAC) DATUM) + <COND + (<TYPE? <DATTYP .CURR-INAC> AC> + <COND + (<==? <DATTYP .CURR-INAC> .DTAC> + <ONE-EXCH-AC .DEST-INAC .CURR-INAC .ACS .CSYMT .RET .LPV>) + (<==? .DTAC <DATVAL .CURR-INAC>> + <SEMIT <INSTRUCTION <COND (.TDONTEXCH `MOVE ) (ELSE `EXCH )> + <ACSYM .DTAC> + <ADDRSYM <DATTYP .CURR-INAC>>>> + <SWAP-INAC <DATTYP .CURR-INAC> + <DATTYP .DEST-INAC> + .ACS + .CSYMT + .RET + .TDONTEXCH + .LPV> + <COND (<==? .DVAC <DATVAL .CURR-INAC>>) + (ELSE + <SEMIT <INSTRUCTION <COND (.VDONTEXCH `MOVE ) (ELSE `EXCH )> + <ACSYM .DVAC> + <ADDRSYM <DATVAL .CURR-INAC>>>> + <SWAP-INAC <DATVAL .CURR-INAC> + <DATVAL .DEST-INAC> + .ACS + .CSYMT + .RET + .VDONTEXCH + .LPV>)>) + (ELSE + <SEMIT <INSTRUCTION <COND (.TDONTEXCH `MOVE ) (ELSE `EXCH )> + <ACSYM .DTAC> + <ADDRSYM <DATTYP .CURR-INAC>>>> + <SWAP-INAC <DATTYP .CURR-INAC> + <DATTYP .DEST-INAC> + .ACS + .CSYMT + .RET + .TDONTEXCH + .LPV> + <COND (<==? <DATVAL .DEST-INAC> <DATVAL .CURR-INAC>>) + (ELSE + <SEMIT <INSTRUCTION <COND (.VDONTEXCH `MOVE ) (ELSE `EXCH )> + <ACSYM .DVAC> + <ADDRSYM <DATVAL .CURR-INAC>>>> + <SWAP-INAC <DATVAL .CURR-INAC> + <DATVAL .DEST-INAC> + .ACS + .CSYMT + .RET + .VDONTEXCH + .LPV>)>)>) + (<COND (<==? <DATVAL .CURR-INAC> .DVAC>) + (ELSE + <SEMIT <INSTRUCTION <COND (.VDONTEXCH `MOVE ) (ELSE `EXCH )> + <ACSYM .DVAC> + <ADDRSYM <DATVAL .CURR-INAC>>>> + <SWAP-INAC <DATVAL .CURR-INAC> + <DATVAL .DEST-INAC> + .ACS + .CSYMT + .RET + .VDONTEXCH + .LPV>)> + <SEMIT <INSTRUCTION `MOVE <ACSYM .DTAC> !<ADDR:TYPE .CURR-INAC>>>)>> + +" " + +<DEFINE CURRENT-AC-STATE ("OPTIONAL" (RETPNOD <>) "AUX" (BST ()) PAC) + #DECL ((VALUE) REP-STATE) + <COND (.RETPNOD <SET BST <BINDING-STRUCTURE .RETPNOD>>)> + <MAPF ,LIST + <FUNCTION (AC "AUX" (ACR <ACRESIDUE .AC>) (SACR ())) + <MAPF <> + <FUNCTION (SYMT) + <COND + (<AND <TYPE? .SYMT SYMTAB> <NOT <MEMQ .SYMT .BST>>> + <SET SACR + (.SYMT + <SINACS .SYMT> + <COND (<STORED .SYMT> + <OR <NOT <TYPE? <NUM-SYM .SYMT> LIST>> + <NOT <1 <NUM-SYM .SYMT>>> + <L? <LENGTH <NUM-SYM .SYMT>> 2> + <2 <NUM-SYM .SYMT>>>)> + <AND <SET PAC <PROG-AC .SYMT>> + <NOT <MEMQ .SYMT <LOOP-VARS <PROG-SLOT .PAC>>>>> + !.SACR)>)>> + .ACR> + .SACR> + ,ALLACS>> + + +<DEFINE LVAL-UP (SYMT "OPTIONAL" (PSLOT <PROG-AC .SYMT>) "AUX" PNAC) + #DECL ((SYMT) SYMTAB) + <COND + (<AND .PSLOT + <SET PNAC <PROG-SLOT .PSLOT>> + <NOT <MEMQ .SYMT <LOOP-VARS .PNAC>>>> + <COND (<INACS .SYMT> + <PUT .PNAC + ,LOOP-VARS + (.SYMT <INACS-SLOT .PSLOT> !<LOOP-VARS .PNAC>)> + <COND (<STORED-SLOT .PSLOT>) (<KILL-STORE <NUM-SYM-SLOT .PSLOT>>)> + <COND (<NOT <POTLV .SYMT>> <PUT .SYMT ,STORED <>>)> + <REPEAT ((PTR <PROG-VARS .PNAC>)) + #DECL ((PTR) LIST) + <COND (<EMPTY? .PTR> <RETURN>)> + <COND (<==? .SYMT <SYM-SLOT .PTR>> + <LVAL-UP .SYMT <SAVED-PROG-AC-SLOT .PTR>> + <RETURN>)> + <SET PTR <REST .PTR ,LENGTH-PROG-VARS>>>) + (ELSE <KILL-LOOP-AC .SYMT>)>)>> + +" " + +<DEFINE STORE-SAVED-ACS (LPV ACS "AUX" CINAC) + #DECL ((LPV) LIST (ACS) REP-STATE) + <MAPF <> + <FUNCTION (ONE-ACS AC) + #DECL ((ONE-ACS) LIST) + <REPEAT ((PTR .ONE-ACS) SYMT) + #DECL ((PTR) LIST (SYMT) SYMBOL) + <COND (<EMPTY? .PTR> <RETURN>) + (<AND <NOT <MEMQ <SET SYMT <CSYMT-SLOT .PTR>> .LPV>> + <NOT <AND <TYPE? <DATTYP <SET CINAC <CINACS-SLOT .PTR>>> + AC> + <==? .AC <DATTYP .CINAC>> + <TYPE? <DATVAL .CINAC> AC>>>> + <SPEC-STOREV .SYMT .CINAC <CSTORED-SLOT .PTR>> + <PUT .PTR ,CSTORED-SLOT T>)> + <SET PTR <REST .PTR ,LENGTH-CSTATE>>>> + .ACS + ,ALLACS>> + +<DEFINE AC? (SYMT ACS) + #DECL ((SYMT) SYMTAB (ACS) LIST) + <MAPF <> + <FUNCTION (AC) + #DECL ((AC) LIST) + <REPEAT ((PTR .AC)) + #DECL ((PTR) LIST) + <COND (<EMPTY? .PTR> <RETURN <>>)> + <COND (<==? <CSYMT-SLOT .PTR> .SYMT> + <MAPLEAVE <CINACS-SLOT .PTR>>)> + <SET PTR <REST .PTR ,LENGTH-CSTATE>>>> + .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." + +<DEFINE SWAP-INAC (AC1 AC2 ACS SYMT RET NOEXCH LPV + "AUX" (NUM1 <ACNUM .AC1>) (NUM2 <ACNUM .AC2>) SWDAT1 SWDAT2 + (ACL1 <ACLINK .AC1>) (ACL2 <ACLINK .AC2>) (PUTR ())) + #DECL ((AC1 AC2) AC (NUM1 NUM2) FIX (ACS) REP-STATE (RET) <OR ATOM FALSE> + (LPV) LIST) + <COND (<AND .RET <NOT .NOEXCH>> + <SWAP-DATUMS .ACL1 .AC1 .AC2> + <SWAP-DATUMS .ACL2 .AC2 .AC1> + <PUT .AC2 ,ACLINK .ACL1> + <PUT .AC1 ,ACLINK .ACL2>)> + <SET SWDAT1 <NTH .ACS .NUM1>> + <SET SWDAT2 <NTH .ACS .NUM2>> + <REPEAT ((PTR .SWDAT1) SUB-PTR) + #DECL ((PTR) LIST) + <COND (<EMPTY? .PTR> <RETURN>)> + <COND + (<AND + <SET SUB-PTR <MEMQ .AC1 <CINACS-SLOT .PTR>>> + <OR + <NOT .NOEXCH> + <==? .SYMT <CSYMT-SLOT .PTR>> + <REPEAT ((S <CSYMT-SLOT .PTR>) (LP .LPV) + (DV <==? .AC1 <DATVAL <CINACS-SLOT .PTR>>>)) + #DECL ((LP) LIST) + <COND (<EMPTY? .LP> <RETURN>)> + <COND (<==? <LSYM-SLOT .LP> .S> + <COND (.DV <RETURN <==? <DATVAL <LINACS-SLOT .LP>> .AC2>>) + (ELSE + <RETURN <==? <DATTYP <LINACS-SLOT .LP>> .AC2>>)>)> + <SET LP <REST .LP ,LOOPVARS-LENGTH>>>>> + <SET PUTR (.SUB-PTR .AC2 !.PUTR)>)> + <SET PTR <REST .PTR ,LENGTH-CSTATE>>> + <COND (<NOT .NOEXCH> + <REPEAT ((PTR .SWDAT2) SUB-PTR) + #DECL ((PTR) LIST) + <COND (<EMPTY? .PTR> <RETURN>)> + <COND (<SET SUB-PTR <MEMQ .AC2 <CINACS-SLOT .PTR>>> + <SET PUTR (.SUB-PTR .AC1 !.PUTR)>)> + <SET PTR <REST .PTR ,LENGTH-CSTATE>>>)> + <REPEAT () + <COND (<EMPTY? .PUTR> <RETURN>)> + <PUT <1 .PUTR> 1 <2 .PUTR>> + <SET PUTR <REST .PUTR 2>>> + <COND (<NOT .NOEXCH> <PUT .ACS .NUM1 .SWDAT2>)> + <PUT .ACS .NUM2 .SWDAT1>> + +<DEFINE SWAP-DATUMS (ACL ACOLD ACNEW) + #DECL ((ACL) <OR FALSE <LIST [REST DATUM]>>) + <MAPF <> + <FUNCTION (DAT "AUX" ACLTEM) + #DECL ((DAT) DATUM) + <COND (<SET ACLTEM <MEMQ .ACOLD .DAT>> + <PUT .ACLTEM 1 .ACNEW>) + (ELSE <MESSAGE INCONSISTENCY "BAD ACLINK">)>> + .ACL>> + +<DEFINE GET-ACS-FROM-STACK (LPV ACS) + #DECL ((LPV) LIST (ACS) REP-STATE) + <REPEAT ((LPVP .LPV) DAT DAT2) + #DECL ((LPVP) LIST (DAT) DATUM) + <COND (<EMPTY? .LPVP> <RETURN>)> + <COND (<LSYM-SLOT .LPVP> + <PUT <LSYM-SLOT .LPVP> ,INACS <>> + <SET DAT2 <LADDR <LSYM-SLOT .LPVP> <> <>>> + <SET DAT <LINACS-SLOT .LPVP>> + <COND (<TYPE? <DATTYP .DAT> AC> + <SEMIT <INSTRUCTION + `MOVE + <ACSYM <DATTYP .DAT>> + !<ADDR:TYPE .DAT2>>>)> + <SEMIT <INSTRUCTION `MOVE + <ACSYM <DATVAL .DAT>> + !<ADDR:VALUE .DAT2>>>)> + <SET LPVP <REST .LPVP ,LOOPVARS-LENGTH>>>> + +" " + +<DEFINE NON-LOOP-CLEANUP (N "AUX" (B <BINDING-STRUCTURE .N>)) + #DECL ((N) NODE (B) <LIST [REST SYMTAB]>) + <MAPF <> + <FUNCTION (S "AUX" (INA <INACS .S>)) + #DECL ((S) SYMTAB) + <COND (.INA + <COND (<TYPE? <DATTYP .INA> AC> + <FLUSH-RESIDUE <DATTYP .INA> .S>)> + <COND (<TYPE? <DATVAL .INA> AC> + <FLUSH-RESIDUE <DATVAL .INA> .S>)>)> + <PUT .S ,INACS <>> + <PUT .S ,STORED T>> + .B>> + +"ROUTINES TO HANDLE LOOP-RETURNS." + +<DEFINE LOOP-RETURN (RETINFO "AUX" LST) + #DECL ((LST RETINFO) LIST) + <MAPF <> + <FUNCTION (AC "AUX" ACR) + #DECL ((AC) AC) + <PUT .AC ,ACLINK <>> + <COND (<SET ACR <ACRESIDUE .AC>> + <MAPF <> + <FUNCTION (IT) <SMASH-INACS .IT <> <>>> + .ACR>)> + <PUT .AC ,ACRESIDUE <>>> + ,ALLACS> + <COND (<NOT <EMPTY? .RETINFO>> + <SET LST <MERGE-RETURNS .RETINFO>> + <REPEAT ((PTR .RETINFO)) + #DECL ((PTR) LIST) + <COND (<EMPTY? .PTR> <RETURN>)> + <MERGE-SINGLE-RETURN + <SAVED-AC-STATE .PTR> + <SAVED-CODE:PTR .PTR> + .LST + <SAVED-STACK-STATE .PTR>> + <SET PTR <REST .PTR ,LENGTH-CONTROL-STATE>>>)>> + +"ROUTINE TO FIGURE OUT A MERGE BETWEEN DIFFERENT RETURN POINTS. IN THE END A LIST OF + THINGS TO REMAIN IN AC'S ARE PRODUCED." + +<DEFINE MERGE-RETURNS (RETINFO "AUX" (ACKEEP ())) + #DECL ((ACKEEP) LIST + (RETINFO) <LIST [REST + REP-STATE + <PRIMTYPE LIST> + LIST + <OR ATOM FALSE>]>) + <REPEAT ((CNT 1) MERGER) + #DECL ((CNT) FIX) + <SET MERGER <LIST !<NTH <SAVED-AC-STATE .RETINFO> .CNT>>> + <COND (<NOT <EMPTY? .MERGER>> + <REPEAT ((PTR <REST .RETINFO ,LENGTH-CONTROL-STATE>)) + <COND (<EMPTY? .PTR> <RETURN>)> + <SET MERGER + <MERG-IT .MERGER + <NTH <SAVED-AC-STATE .PTR> .CNT>>> + <COND (<EMPTY? .MERGER> <RETURN>)> + <SET PTR <REST .PTR ,LENGTH-CONTROL-STATE>>>)> + <COND (<NOT <EMPTY? .MERGER>> <SET ACKEEP (!.MERGER !.ACKEEP)>)> + <COND (<G? <SET CNT <+ .CNT 1>> 5> <RETURN>)>> + .ACKEEP> + +"ROUTINE TO FIGURE OUT IF THINGS MERGE" + +<DEFINE MERG-IT (CURR-STATE NEW-STATE + "AUX" (OLD-STATE .CURR-STATE) SPTR INAC1 INAC2) + #DECL ((CURR-STATE NEW-STATE) LIST) + <COND (<AND <SET SPTR <MEMQ <CSYMT-SLOT .CURR-STATE> .NEW-STATE>> + <OR <=? <SET INAC1 <CINACS-SLOT .CURR-STATE>> + <SET INAC2 <CINACS-SLOT .SPTR>>> + <AND <==? <DATVAL .INAC1> <DATVAL .INAC2>> + <OR <AND <ISTYPE? <DATTYP .INAC1>> + <PUT .SPTR ,CINACS-SLOT .INAC1>> + <AND <ISTYPE? <DATTYP .INAC2>> + <PUT .CURR-STATE + ,CINACS-SLOT + .INAC2>>>>>> + <COND (<AND <CSTORED-SLOT .CURR-STATE> <CSTORED-SLOT .SPTR>>) + (<PUT .CURR-STATE ,CSTORED-SLOT <>> + <PUT .SPTR ,CSTORED-SLOT <>>)>) + (<SET CURR-STATE <REST .CURR-STATE ,LENGTH-CSTATE>>)> + <REPEAT ((PTR .CURR-STATE)) + #DECL ((PTR) LIST) + <COND (<EMPTY? .PTR> <RETURN>)> + <COND (<AND <SET SPTR <MEMQ <CSYMT-SLOT .PTR> .NEW-STATE>> + <=? <CINACS-SLOT .SPTR> <CINACS-SLOT .CURR-STATE>>> + <COND (<AND <CSTORED-SLOT .CURR-STATE> + <CSTORED-SLOT .SPTR>>) + (<PUT .CURR-STATE ,CSTORED-SLOT <>> + <PUT .SPTR ,CSTORED-SLOT <>>)>) + (ELSE ;"THIS ELSE USED TO B <CSTORED-STATE .CURR-STATE>" + <COND (<==? .PTR .CURR-STATE> + <SET OLD-STATE .CURR-STATE> + <SET CURR-STATE + <REST .CURR-STATE ,LENGTH-CSTATE>>) + (ELSE + <PUTREST <REST .OLD-STATE <- ,LENGTH-CSTATE 1>> + <REST .PTR ,LENGTH-CSTATE>> + <SET PTR .OLD-STATE>)>)> + <SET OLD-STATE .PTR> + <SET PTR <REST .PTR ,LENGTH-CSTATE>>> + .CURR-STATE> + +<DEFINE MERGE-SINGLE-RETURN (THISRETURN INS MERGEDRETURN STACK-INFO + "AUX" SYMT (MS ())) + #DECL ((INS THISRETURN MERGEDRETURN STACK-INFO) LIST + (MS) <LIST [REST SYMTAB]>) + <PROG ((SCODE:PTR .INS) (FRMS <SAVED-FRMS .STACK-INFO>) + (BSTB <SAVED-BSTB .STACK-INFO>) (NTSLOTS <SAVED-NTSLOTS .STACK-INFO>) + (STK <SAVED-STK .STACK-INFO>)) + #DECL ((FRMS BSTB NTSLOTS STK SCODE:PTR) <SPECIAL LIST>) + <MAPF <> + <FUNCTION (CP AC) + #DECL ((AC) AC) + <REPEAT () + <COND (<EMPTY? .CP> <RETURN>)> + <COND (<AND <NOT <MEMQ <SET SYMT <CSYMT-SLOT .CP>> + .MERGEDRETURN>> + <OR <==? .AC <DATVAL <CINACS-SLOT .CP>>> + <NOT <TYPE? <DATVAL <CINACS-SLOT .CP>> AC>>>> + <SPEC-STOREV .SYMT <CINACS-SLOT .CP> <CSTORED-SLOT .CP>> + <FLUSH-RESIDUE .AC .SYMT> + <SET MS (.SYMT !.MS)>) + (<MEMQ .SYMT .MS> <FLUSH-RESIDUE .AC .SYMT>) + (ELSE + <PUT .SYMT ,STORED <CSTORED-SLOT .CP>> + <SMASH-INACS .SYMT <CINACS-SLOT .CP>> + <SMASH-ITEM-INTO-DATUM .SYMT <CINACS-SLOT .CP>>)> + <SET CP <REST .CP ,LENGTH-CSTATE>>>> + .THISRETURN + ,ALLACS>>> + +<DEFINE SPEC-STOREV (SYMT INAC STORED) + <SMASH-INACS .SYMT .INAC> + <SMASH-ITEM-INTO-DATUM .SYMT .INAC> + <FLUSH-SYMTAB-FROM-AC .SYMT> + <COND (<TYPE? .SYMT SYMTAB> + <AND <NOT .STORED> + <MAPF <> + ,SEMIT + <PROG ((CODE:TOP (())) (CODE:PTR .CODE:TOP)) + #DECL ((CODE:TOP CODE:PTR) <SPECIAL LIST>) + <PUT .SYMT ,STORED <>> + <STOREV .SYMT> + <REST .CODE:TOP>>>> + <PUT .SYMT ,STORED T>)> + <SMASH-INACS .SYMT <>>> + +<DEFINE CLEANUP-SYMT (SYM) + #DECL ((SYM) SYMTAB) + <PUT .SYM ,PROG-AC <>> + <PUT .SYM ,NUM-SYM T>> + +<DEFINE SEMIT (FRM) + #DECL ((SCODE:PTR CODE:PTR) LIST) + <PUTREST .SCODE:PTR (.FRM !<REST .SCODE:PTR>)> + <COND (<==? .CODE:PTR .SCODE:PTR> <SET CODE:PTR <REST .CODE:PTR>>)> + <SET SCODE:PTR <REST .SCODE:PTR>>> + +" " + +<DEFINE FLUSH-SYMTAB-FROM-AC (SYMT "AUX" (INAC <SINACS .SYMT>) AC) + <COND (<TYPE? <SET AC <DATTYP .INAC>> AC> + <FLUSH-RESIDUE .AC .SYMT>)> + <COND (<TYPE? <SET AC <DATVAL .INAC>> AC> + <FLUSH-RESIDUE .AC .SYMT>)>> + +<DEFINE SMASH-ITEM-INTO-DATUM (SYM DAT "AUX" AC) + #DECL ((SYM) SYMBOL (DAT) DATUM) + <COND (<TYPE? <SET AC <DATTYP .DAT>> AC> + <OR <MEMQ .SYM <ACRESIDUE .AC>> + <PUT .AC ,ACRESIDUE (.SYM !<ACRESIDUE .AC>)>>)> + <COND (<TYPE? <SET AC <DATVAL .DAT>> AC> + <OR <MEMQ .SYM <ACRESIDUE .AC>> + <PUT .AC ,ACRESIDUE (.SYM !<ACRESIDUE .AC>)>>)>> + + +<DEFINE CLEANUP-VARS (VARLST) + #DECL ((VARLST) LIST) + <REPEAT ((PTR .VARLST) VAR) + <COND (<EMPTY? .PTR> <RETURN>)> + <PUT <SET VAR <SYM-SLOT .PTR>> + ,NUM-SYM + <SAVED-NUM-SYM-SLOT .PTR>> + <PUT .VAR ,PROG-AC <SAVED-PROG-AC-SLOT .PTR>> + <PUT .VAR ,POTLV <SAVED-POTLV-SLOT .PTR>> + <SET PTR <REST .PTR ,LENGTH-PROG-VARS>>>> + +<DEFINE FIXUP-STORES (STATE) + #DECL ((STATE) <LIST [REST REP-STATE <PRIMTYPE LIST> LIST <OR ATOM FALSE>]>) + <REPEAT ((PTR .STATE)) + #DECL ((PTR) <LIST [REST REP-STATE <PRIMTYPE LIST> LIST <OR ATOM FALSE>]>) + <COND (<EMPTY? .PTR> <RETURN>)> + <MAPR <> + <FUNCTION (STATE-ITEMS "AUX" SYMT PAC (STATE-ITEM <1 .STATE-ITEMS>)) + #DECL ((STATE-ITEMS) REP-STATE + (STATE-ITEM) + <LIST [REST SYMTAB DATUM <OR FALSE ATOM> <OR ATOM FALSE>]> + (PAC) <OR FALSE LIST> (SYMT) SYMTAB) + <REPEAT () + <COND (<EMPTY? .STATE-ITEM> <RETURN>)> + <SET SYMT <CSYMT-SLOT .STATE-ITEM>> + <COND (<OR <CPOTLV-SLOT .STATE-ITEM> + <N==? <CSTORED-SLOT .STATE-ITEM> T>> + <COND (<OR <AND <N==? <CSTORED-SLOT .STATE-ITEM> T> + <MEMQ <CSTORED-SLOT .STATE-ITEM> .KILL-LIST>> + <AND <CPOTLV-SLOT .STATE-ITEM> + <CSTORED-SLOT .STATE-ITEM> + <SET PAC <PROG-AC .SYMT>> + <MEMQ .SYMT <LOOP-VARS <PROG-SLOT .PAC>>> + <NOT <STORED-SLOT .PAC>>>> + <PUT .STATE-ITEM ,CSTORED-SLOT <>>)>)> + <COND (<AND <CPOTLV-SLOT .STATE-ITEM> + <OR <NOT <SET PAC <PROG-AC .SYMT>>> + <NOT <MEMQ .SYMT <LOOP-VARS <PROG-SLOT .PAC>>>>>> + <SET STATE-ITEM <REST .STATE-ITEM ,LENGTH-CSTATE>>) + (<RETURN>)>> + <COND + (<NOT <EMPTY? .STATE-ITEM>> + <REPEAT ((START-STATE .STATE-ITEM) + (STATE-ITEM <REST .STATE-ITEM ,LENGTH-CSTATE>)) + <COND (<EMPTY? .STATE-ITEM> <RETURN>)> + <SET SYMT <CSYMT-SLOT .STATE-ITEM>> + <COND + (<OR <CPOTLV-SLOT .STATE-ITEM> + <N==? <CSTORED-SLOT .STATE-ITEM> T>> + <COND (<OR <AND <N==? <CSTORED-SLOT .STATE-ITEM> T> + <MEMQ <CSTORED-SLOT .STATE-ITEM> .KILL-LIST>> + <AND <CPOTLV-SLOT .STATE-ITEM> + <CSTORED-SLOT .STATE-ITEM> + <SET PAC <PROG-AC .SYMT>> + <MEMQ .SYMT <LOOP-VARS <PROG-SLOT .PAC>>> + <NOT <STORED-SLOT .PAC>>>> + <PUT .STATE-ITEM ,CSTORED-SLOT <>>)>)> + <COND (<AND <CPOTLV-SLOT .STATE-ITEM> + <OR <NOT <SET PAC <PROG-AC .SYMT>>> + <NOT <MEMQ .SYMT <LOOP-VARS <PROG-SLOT .PAC>>>>>> + <PUTREST .START-STATE <REST .STATE-ITEM ,LENGTH-CSTATE>>)> + <SET STATE-ITEM <REST .STATE-ITEM ,LENGTH-CSTATE>> + <SET START-STATE <REST .START-STATE ,LENGTH-CSTATE>>>)> + <PUT .STATE-ITEMS 1 .STATE-ITEM>> + <SAVED-AC-STATE .PTR>> + <SET PTR <REST .PTR ,LENGTH-CONTROL-STATE>>>> + +<ENDPACKAGE> + \ No newline at end of file diff --git a/<mdl.comp>/nhelp.mud.4 b/<mdl.comp>/nhelp.mud.4 new file mode 100644 index 0000000..c3aba06 --- /dev/null +++ b/<mdl.comp>/nhelp.mud.4 @@ -0,0 +1,36 @@ +<NEWTYPE TOKEN VECTOR> + +<PUT SYMBOL DECL '<OR SYMTAB COMMON TEMP>> + +<REMOVE MUDREF!-OP!-PACKAGE> + +<NEWTYPE COMMON VECTOR '<VECTOR [4 ANY]>> + +<NEWTYPE MUDREF!-OP!-PACKAGE WORD> + +<SET REASONABLE T> +<SET HELP-COMPIL T> +<NEWTYPE SAVED-STATE + LIST + '<LIST [REST + <LIST AC + <OR FALSE <LIST [REST SYMTAB]>> + [REST <LIST SYMTAB ANY>]>]>> + +<NEWTYPE TEMPV LIST> + + +<OR <GASSIGNED? DISPATCH> <DEFINE DISPATCH ("ARGS" FOO) []>> +<SET GLUE!- T> + +<SETG IF!- ,AND> +<SETG TEMPLATE-NTH T> +<SETG TEMPLATE-PUT T> +<SETG IF-NOT!- ,OR> +<BLOCK (!.OBLIST <GET PACKAGE OBLIST>)> +<FLOAD "CMP:BOPHAC"> +<FLOAD "CMP:MUDHAK"> +<BEGIN-HACK "COMPIL"> +<BEGIN-MHACK> +<FLOAD "CMP:NN"> + \ No newline at end of file diff --git a/<mdl.comp>/nn.mud.1 b/<mdl.comp>/nn.mud.1 new file mode 100644 index 0000000..d3c1ccb --- /dev/null +++ b/<mdl.comp>/nn.mud.1 @@ -0,0 +1,332 @@ + +<SET REASONABLE!- T> + +<SETG INSTRUCTION ,FORM> + +<NEWTYPE TRANS + VECTOR + '<<PRIMTYPE VECTOR> NODE + <UVECTOR [7 FIX]> + <UVECTOR [7 FIX]>>> +<NEWTYPE IRSUBR LIST> + +<NEWTYPE NODE + VECTOR + '<VECTOR FIX + ANY + ANY + ANY + <LIST [REST NODE]> + FIX + <OR FALSE ATOM> + [REST + LIST + ANY + ANY + LIST + FIX + SYMTAB + FIX + FIX + <OR FALSE ATOM> + ATOM + ANY + LIST + LIST + ANY + ANY + ANY + ANY + ANY + ANY + ANY + <PRIMTYPE LIST> + FIX + FIX]>> + +"Offsets into pass 1 structure entities and functions to create same." + +<SETG NODE-TYPE 1> ; "Code specifying the node type." +<SETG PARENT 2> ; "Pointer to parent node." +<SETG RESULT-TYPE 3> ; "Type expression for result returned by code + generated by this node." +<SETG NODE-NAME 4> ; "Usually name of SUBR associated with this node." +<SETG KIDS 5> ; "List of sub-nodes for this node." +<SETG STACKS 6> ; "Amount of stack needed by this node." +<SETG SEGS 7> ; "Predicate: any segments among kids?" +<SETG TYPE-INFO 8> ; "Points to transient type info for this node." +<SETG SIDE-EFFECTS 9> ; "General info about side effects (format not yet firm.)" +<SETG RSUBR-DECLS 10> ; "Function only: final rsubr decls." +<SETG BINDING-STRUCTURE 11> + ; "Partially compiled arg list." +<SETG SPECS-START 12> ; "Offset to 1st special." +<SETG SYMTAB 13> ; "Pointer to local symbol table." +<SETG SSLOTS 14> ; "Number of specials." +<SETG USLOTS 15> ; "Number of unspecials." +<SETG ACTIVATED 16> ; "Predicate: any named activation?" +<SETG TMPLS 17> ; "Offset to unamed temps." +<SETG PRE-ALLOC 18> ; "Variable slots allocated in advance." +<SETG STK-B 19> ; "Base of stack at entry." +<SETG BTP-B 20> ; "Base of stack after bindings." +<SETG SPCS-X 21> ; "Predicate: any specials bound?" +<SETG DST 22> ; "Destination spec for value of node." +<SETG CDST 23> ; "Current destination used." +<SETG ATAG 24> ; "Label for local againing." +<SETG RTAG 25> ; "Label for local Returning." +<SETG ASSUM 26> ; "Node type assumptions." +<SETG AGND 27> ; "Predicate: Again possible?" +<SETG ACS 28> ; "Predicate: AC call possible? (if not false + ac structure)" +<SETG TOTARGS 29> ; "Total number of args (including optional)." +<SETG REQARGS 30> ; "Required arguemnts." + +<SETG CLAUSES ,KIDS> ; "For COND clauses." + +<SETG NODE-SUBR ,RSUBR-DECLS> + ; "For many nodes, the SUBR (not its name)." + +<SETG PREDIC ,NODE-NAME>; "For cond clause nodes, the predicate." + +<SETG ACCUM-TYPE ,DST> ; "Accumulated type from all returns etc." +<SETG DEAD-VARS ,CDST> +<SETG LIVE-VARS ,TYPE-INFO> +<SETG VSPCD ,ATAG> +<SETG INIT-DECL-TYPE ,RTAG> +<SETG LOOP-VARS 31> + +"Variables kept in acs thru loop." + +<SETG AGAIN-STATES 32> + +"States at agains" + +<SETG RETURN-STATES 33> + +"States at repeats." + +<SETG PROG-VARS 34> + +"Vars handled in this prog/repeat." + +;"Information used for merging states with prog-nodes" +<SETG USAGE-SYM 19> + +"How a variable is used in a loop." + +<NEWTYPE SYMTAB + VECTOR + '<VECTOR <PRIMTYPE VECTOR> + ATOM + <OR FALSE ATOM> + FIX + <OR ATOM FIX> + <OR FALSE ATOM> + LIST + ANY + ANY + FIX + <OR FALSE NODE> + <OR FALSE 'T> + <OR FALSE DATUM LIST> + <OR FALSE 'T> + <OR FALSE 'T> + LIST + ANY + ANY>> + + +<SETG NEXT-SYM 1> ; "Pointer to next symbol table entry." +<SETG NAME-SYM 2> ; "Name of variable." +<SETG SPEC-SYM 3> ; "Predicate: special?" +<SETG CODE-SYM 4> ; "Code specifying whether AUX, OPTIONAL etc." +<SETG ARGNUM-SYM 5> ; "If an argument, which one." +<SETG PURE-SYM 6> ; "Predicate: unchanged in function?" +<SETG DECL-SYM 7> ; "Decl for this variable." +<SETG ADDR-SYM 8> ; "Where do I live?" +<SETG INIT-SYM 9> ; "Predicate: initial value? if so what." +<SETG FRMNO 10> ; "ID of my frame." +<SETG RET-AGAIN-ONLY 11>; "Predicate: used only in AGAIN/RETURN?" +<SETG ASS? 12> ; "Predicate: used in ASSIGNED?" +<SETG INACS 13> ; "Predicate: currently in some AC?" +<SETG STORED 14> ; "Predicate: stored in slot?" +<SETG USED-AT-ALL 15> +<SETG DEATH-LIST 16> +<SETG CURRENT-TYPE 17> +<SETG COMPOSIT-TYPE 18> +<SETG PROG-AC ,CURRENT-TYPE> + +<SETG NUM-SYM ,COMPOSIT-TYPE> + +<SETG POTLV ,USED-AT-ALL> + + +<SETG GNEXT-SYM 1> ; "Next global symbol." +<SETG GNAME-SYM 2> +<SETG GDECL-SYM 3> + +<PUT CHANNEL DECL '<CHANNEL [12 ANY] [4 FIX]>> + +<PUT STRING DECL '<STRING [REST CHARACTER]>> + +<PUT OBLIST DECL '<UVECTOR [REST <LIST [REST ATOM]>]>> + +<PROG ((N 1)) <SETG CODVEC <MAPF ,UVECTOR <FUNCTION (ATM) <SETG .ATM .N> <SET N +<+ .N 1>> .ATM> ![FUNCTION-CODE QUOTE-CODE SEGMENT-CODE FORM-CODE PROG-CODE +SUBR-CODE COND-CODE BRANCH-CODE RSUBR-CODE LVAL-CODE SET-CODE OR-CODE AND-CODE +RETURN-CODE COPY-CODE GO-CODE AGAIN-CODE ARITH-CODE 0-TST-CODE NOT-CODE 1?-CODE +TEST-CODE EQ-CODE TY?-CODE LNTH-CODE MT-CODE NTH-CODE REST-CODE PUT-CODE +PUTR-CODE FLVAL-CODE FSET-CODE FGVAL-CODE FSETG-CODE MIN-MAX-CODE STACKFORM-CODE +CHTYPE-CODE ABS-CODE FIX-CODE FLOAT-CODE MOD-CODE ID-CODE ASSIGNED?-CODE +ISTRUC-CODE ISTRUC2-CODE BITS-CODE BITL-CODE GETBITS-CODE PUTBITS-CODE MAP-CODE +MFCN-CODE ISUBR-CODE READ-EOF-CODE READ-EOF2-CODE EOF-CODE GET-CODE GET2-CODE +IPUT-CODE IREMAS-CODE IRSUBR-CODE MARGS-CODE MPSBR-CODE MAPLEAVE-CODE +MAPRET-STOP-CODE UNWIND-CODE GVAL-CODE SETG-CODE SEG-CODE LENGTH?-CODE TAG-CODE +MFIRST-CODE PRINT-CODE MEMQ-CODE FORM-F-CODE INFO-CODE +OBLIST?-CODE AS-NXT-CODE AS-IT-IND-VAL-CODE + ALL-REST-CODE + CASE-CODE SUBSTRUC-CODE BACK-CODE TOP-CODE COPY-LIST-CODE + PUT-SAME-CODE ROT-CODE LSH-CODE BIT-TEST-CODE SPARE1-CODE + SPARE2-CODE + SPARE3-CODE + SPARE4-CODE!]>> <SETG COMP-TYPES .N>> + +<SETG PREDV <IUVECTOR ,COMP-TYPES 0>> + +<MAPF <> <FUNCTION (N) <PUT ,PREDV .N 1>> ![,0-TST-CODE ,1?-CODE ,NOT-CODE , +TEST-CODE ,EQ-CODE ,TY?-CODE ,MT-CODE ,OR-CODE ,AND-CODE ,ASSIGNED?-CODE , +ISUBR-CODE ,NTH-CODE ,MEMQ-CODE ,LENGTH?-CODE ,OBLIST?-CODE ,AS-NXT-CODE!]> + +<GDECL (REGS ATIME) FIX (ALLACS) <UVECTOR [5 AC] [REST AC]> + (ACO AC-A AC-B AC-C AC-D AC-E AC-F AC-G AC-H LAST-AC LAST-AC-1) AC> + +<SETG COMMON-DATUM 5> + +<MANIFEST TMPFRM TMPNO THOME TUSERS DATTYP DATVAL ADDRSYM ACSYM ACLINK ACAGE + ACNUM ACPROT AC1SYM ACRESIDUE ACPREF ACINUSE TMPAC COMMON-DATUM + POTLV> + +<MAPF <> ,MANIFEST ,CODVEC> + +<MANIFEST TOT-MODES RESTS RMODES COMP-TYPES +GDECL-SYM GNAME-SYM GNEXT-SYM FRMNO INIT-SYM ADDR-SYM TOTARGS REQARGS +DECL-SYM PURE-SYM ARGNUM-SYM CODE-SYM SPEC-SYM NAME-SYM NEXT-SYM PREDIC +NODE-SUBR CLAUSES ACS TMPLS ACTIVATED USLOTS SSLOTS SYMTAB SPECS-START +BINDING-STRUCTURE RSUBR-DECLS SEGS STACKS KIDS NODE-NAME RESULT-TYPE PARENT +NODE-TYPE SIDE-EFFECTS RET-AGAIN-ONLY ASS? INACS STORED DST CDST ACCUM-TYPE +INIT-DECL-TYPE VSPCD AGND ASSUM RTAG ATAG SPCS-X BTP-B STK-B PRE-ALLOC +USED-AT-ALL CURRENT-TYPE DEATH-LIST COMPOSIT-TYPE AGAIN-STATES RETURN-STATES +PROG-VARS LOOP-VARS PROG-AC NUM-SYM TYPE-INFO USAGE-SYM LIVE-VARS +DEAD-VARS> + +<GDECL (DOITS) <UVECTOR [9 ANY]> (RDOIT SDOIT) <UVECTOR [7 ANY]> + (BANALS) <UVECTOR [13 ANY]> (ANALYZERS) VECTOR + (BINDERS) UVECTOR (GENERATORS) VECTOR> + + + + + + +<SETG DATTYP 1> + +<SETG DATVAL 2> + + +<NEWTYPE TEMP VECTOR '<VECTOR SCL FIX>> + +<NEWTYPE SAVED-STATE + LIST + '<LIST [REST + <LIST AC + <OR FALSE <LIST [REST SYMTAB]>> + [REST <LIST SYMTAB ANY>]>]>> + +<SETG TMPNO 1> + +<SETG TUSERS 2> + +<SETG DATTYP 1> + +<SETG DATVAL 2> + +<SETG ADDRSYM 1> + +<SETG ACSYM 2> + +<SETG ACLINK 3> + +<SETG ACAGE 4> + +<SETG ACNUM 5> + +<SETG ACPROT 6> + +<SETG AC1SYM 7> + +<SETG ACRESIDUE 8> + +<SETG ACPREF 9> + +<SETG ACINUSE 10> + +<NEWTYPE AC + VECTOR + '<VECTOR <PRIMTYPE WORD> + <PRIMTYPE WORD> + <OR <LIST [REST DATUM]> FALSE> + FIX + FIX + <OR FALSE ATOM> + <PRIMTYPE WORD> + <OR LIST FALSE> + <OR FALSE ATOM> + <OR FALSE ATOM>>> + + +<NEWTYPE DATUM LIST '<<PRIMTYPE LIST> + <OR ATOM <PRIMTYPE LIST> <PRIMTYPE VECTOR>> + <OR ATOM <PRIMTYPE LIST> <PRIMTYPE VECTOR>>>> + +<NEWTYPE OFFPTR LIST '<LIST FIX DATUM ATOM>> + +<NEWTYPE ADDRESS:PAIR LIST> + +<SETG ALLACS + <MAPF ,UVECTOR + <FUNCTION (N1 N2 N N+1 NAME) + <SETG .NAME <CHTYPE [.N1 .N2 <> 0 .N <> .N+1 <> <> <>] AC>>> + ![`A `B `C `D `E!] + ![`A* `B* `C* `D* `E*!] + ![1 2 3 4 5!] + ![`B* `C* `D* `E* `PVP*!] + ![AC-A AC-B AC-C AC-D AC-E!]>> + +<COND (<NOT <GASSIGNED? DATUM>> + <SETG DATUM <RSUBR [#CODE ![] DATUM #DECL ("VALUE" DATUM ANY ANY)]>>)> + +<COND (<NOT <GASSIGNED? GEN>> + <SETG GEN <RSUBR [#CODE ![] GEN #DECL ("VALUE" DATUM NODE <OR ATOM DATUM>)]>>)> + +<COND (<NOT <GASSIGNED? GETREG>> + <SETG GETREG <RSUBR [#CODE ![] GETREG #DECL ("VALUE" AC ANY)]>>)> + +<COND (<NOT <GASSIGNED? SGETREG>> + <SETG SGETREG <RSUBR [#CODE ![] SGETREG #DECL ("VALUE" AC AC ANY)]>>)> + +<COND (<NOT <GASSIGNED? MINL>> + <SETG MINL <RSUBR [#CODE ![] MINL #DECL ("VALUE"FIX ANY)]>>)> + +<COND (<NOT <GASSIGNED? TOACV>> + <SETG TOACV <RSUBR [#CODE ![] TOACV #DECL ("VALUE" DATUM DATUM)]>>)> + +<COND (<NOT <GASSIGNED? TOACT>> + <SETG TOACT <RSUBR [#CODE ![] TOACT #DECL ("VALUE" DATUM DATUM)]>>)> + +<GDECL (INS1) UVECTOR +(ASTATE) <UVECTOR [REST <UVECTOR [REST FIX]>]> (SNODES SNODES1) <UVECTOR [REST FIX]> +(CMSUBRS 0SUBRS) <UVECTOR ATOM [REST ATOM]> +(SKIPS) <UVECTOR [REST <LIST [REST <PRIMTYPE WORD>]>]> +(0JMPS) <UVECTOR [REST <PRIMTYPE WORD>]>> + + +  \ No newline at end of file diff --git a/<mdl.comp>/nnupda.mud.1 b/<mdl.comp>/nnupda.mud.1 new file mode 100644 index 0000000..7aa3530 --- /dev/null +++ b/<mdl.comp>/nnupda.mud.1 @@ -0,0 +1,110 @@ +<SETG ANALYZERS + <DISPATCH ,SUBR-ANA + (,QUOTE-CODE ,QUOTE-ANA) + (,FUNCTION-CODE ,FUNC-ANA) + (,SEGMENT-CODE ,SEGMENT-ANA) + (,FORM-CODE ,FORM-AN) + (,PROG-CODE ,PRG-REP-ANA) + (,SUBR-CODE ,SUBR-ANA) + (,COND-CODE ,COND-ANA) + (,COPY-CODE ,COPY-AN) + (,RSUBR-CODE ,RSUBR-ANA) + (,ISTRUC-CODE ,ISTRUC-ANA) + (,ISTRUC2-CODE ,ISTRUC2-ANA) + (,READ-EOF-CODE ,READ-ANA) + (,READ-EOF2-CODE ,READ2-ANA) + (,GET-CODE ,GET-ANA) + (,GET2-CODE ,GET2-ANA) + (,MAP-CODE ,MAPPER-AN) + (,MARGS-CODE ,MARGS-ANA) + (,ARITH-CODE ,ARITH-ANA) + (,TEST-CODE ,ARITHP-ANA) + (,0-TST-CODE ,ARITHP-ANA) + (,1?-CODE ,ARITHP-ANA) + (,MIN-MAX-CODE ,ARITH-ANA) + (,ABS-CODE ,ABS-ANA) + (,FIX-CODE ,FIX-ANA) + (,FLOAT-CODE ,FLOAT-ANA) + (,MOD-CODE ,MOD-ANA) + (,LNTH-CODE ,LENGTH-ANA) + (,MT-CODE ,EMPTY?-ANA) + (,NTH-CODE ,NTH-ANA) + (,REST-CODE ,REST-ANA) + (,PUT-CODE ,PUT-ANA) + (,PUTR-CODE ,PUTREST-ANA) + (,UNWIND-CODE ,UNWIND-ANA) + (,FORM-F-CODE ,FORM-F-ANA)>> +<SETG GENERATORS + <DISPATCH ,DEFAULT-GEN + (,FORM-CODE ,FORM-GEN) + (,PROG-CODE ,PROG-REP-GEN) + (,SUBR-CODE ,SUBR-GEN) + (,COND-CODE ,COND-GEN) + (,LVAL-CODE ,LVAL-GEN) + (,SET-CODE ,SET-GEN) + (,OR-CODE ,OR-GEN) + (,AND-CODE ,AND-GEN) + (,RETURN-CODE ,RETURN-GEN) + (,COPY-CODE ,COPY-GEN) + (,AGAIN-CODE ,AGAIN-GEN) + (,GO-CODE ,GO-GEN) + (,ARITH-CODE ,ARITH-GEN) + (,RSUBR-CODE ,RSUBR-GEN) + (,0-TST-CODE ,0-TEST) + (,NOT-CODE ,NOT-GEN) + (,1?-CODE ,1?-GEN) + (,TEST-CODE ,TEST-GEN) + (,EQ-CODE ,==-GEN) + (,TY?-CODE ,TYPE?-GEN) + (,LNTH-CODE ,LNTH-GEN) + (,MT-CODE ,MT-GEN) + (,REST-CODE ,REST-GEN) + (,NTH-CODE ,NTH-GEN) + (,PUT-CODE ,PUT-GEN) + (,PUTR-CODE ,PUTREST-GEN) + (,FLVAL-CODE ,FLVAL-GEN) + (,FSET-CODE ,FSET-GEN) + (,FGVAL-CODE ,FGVAL-GEN) + (,FSETG-CODE ,FSETG-GEN) + (,STACKFORM-CODE ,STACKFORM-GEN) + (,MIN-MAX-CODE ,MIN-MAX) + (,CHTYPE-CODE ,CHTYPE-GEN) + (,FIX-CODE ,FIX-GEN) + (,FLOAT-CODE ,FLOAT-GEN) + (,ABS-CODE ,ABS-GEN) + (,MOD-CODE ,MOD-GEN) + (,ID-CODE ,ID-GEN) + (,ASSIGNED?-CODE ,ASSIGNED?-GEN) + (,ISTRUC-CODE ,ISTRUC-GEN) + (,ISTRUC2-CODE ,ISTRUC-GEN) + (,BITS-CODE ,BITS-GEN) + (,GETBITS-CODE ,GETBITS-GEN) + (,BITL-CODE ,BITLOG-GEN) + (,PUTBITS-CODE ,PUTBITS-GEN) + (,ISUBR-CODE ,ISUBR-GEN) + (,EOF-CODE ,ID-GEN) + (,READ-EOF2-CODE ,READ2-GEN) + (,READ-EOF-CODE ,SUBR-GEN) + (,IPUT-CODE ,IPUT-GEN) + (,IREMAS-CODE ,IREMAS-GEN) + (,GET-CODE ,GET-GEN) + (,GET2-CODE ,GET2-GEN) + (,IRSUBR-CODE ,IRSUBR-GEN) + (,MAP-CODE ,MAPFR-GEN) + (,MARGS-CODE ,MPARGS-GEN) + (,MAPLEAVE-CODE ,MAPLEAVE-GEN) + (,MAPRET-STOP-CODE ,MAPRET-STOP-GEN) + (,UNWIND-CODE ,UNWIND-GEN) + (,GVAL-CODE ,GVAL-GEN) + (,SETG-CODE ,SETG-GEN) + (,TAG-CODE ,TAG-GEN) + (,PRINT-CODE ,PRINT-GEN) + (,MEMQ-CODE ,MEMQ-GEN) + (,LENGTH?-CODE ,LENGTH?-GEN) + (,FORM-F-CODE ,FORM-F-GEN) + (,INFO-CODE ,INFO-GEN) + (,OBLIST?-CODE ,OBLIST?-GEN) + (,AS-NXT-CODE ,AS-NXT-GEN) + (,AS-IT-IND-VAL-CODE ,ASSOC-FIELD-GET) + (,ALL-REST-CODE ,ALL-REST-GEN)>> +  \ No newline at end of file diff --git a/<mdl.comp>/notana.mud.116 b/<mdl.comp>/notana.mud.116 new file mode 100644 index 0000000..39dbc9e --- /dev/null +++ b/<mdl.comp>/notana.mud.116 @@ -0,0 +1,132 @@ +<PACKAGE "NOTANA"> + +<ENTRY NOT-ANA TYPE?-ANA ==?-ANA> + +<USE "SYMANA" "CHKDCL" "COMPDEC" "CARANA" "ADVMESS"> + + +" This module contains analysis and generation functions for +NOT, TYPE? and ==?. See SYMANA for more details about ANALYSIS and +CODGEN for more detali abour code generation. +" + +"Analyze NOT usage make sure arg can be FALSE." + +<DEFINE NOT-ANA (NOD RTYP + "AUX" TEM (FLG <==? .PRED <PARENT .NOD>>) (STR .TRUTH) + (SUNT .UNTRUTH)) + #DECL ((NOD) NODE) + <PROG ((PRED <AND .FLG .NOD>) (TRUTH ()) (UNTRUTH ())) + #DECL ((PRED) <SPECIAL ANY> (TRUTH UNTRUTH) <SPECIAL LIST>) + <COND (<SET TEM <SEGFLUSH .NOD .RTYP>> <SET FLG <>>) + (ELSE + <OR <1? <LENGTH <KIDS .NOD>>> + <MESSAGE ERROR "WRONG NUMBER OF ARGS TO NOT " .NOD>> + <SET TEM <ANA <1 <KIDS .NOD>> ANY>> + <PUT .NOD ,NODE-TYPE ,NOT-CODE> + <SET TEM + <COND (<==? <ISTYPE? .TEM> FALSE> + <TYPE-OK? ATOM .RTYP>) + (<TYPE-OK? .TEM FALSE> + <TYPE-OK? '<OR FALSE ATOM> .RTYP>) + (ELSE <TYPE-OK? FALSE .RTYP>)>> + <SET STR .UNTRUTH> + <SET SUNT .TRUTH>)>> + <COND (.FLG + <SET TRUTH (!.STR !.TRUTH)> + <SET UNTRUTH (!.SUNT !.UNTRUTH)>)> + .TEM> + +<PUT ,NOT ANALYSIS ,NOT-ANA> + +" Analyze N==? and ==? usage. Complain if types differ such that + the args can never be ==?." + +<DEFINE ==?-ANA (NOD RTYP + "AUX" (K <KIDS .NOD>) + (WHON <AND <==? .PRED <PARENT .NOD>> .NOD>) (WHO ()) + (GLN .NOD) (GLE ())) + #DECL ((NOD) NODE (K) <LIST [REST NODE]> (WHON GLN) <SPECIAL NODE> + (WHO GLE) <SPECIAL LIST>) + <COND (<SEGFLUSH .NOD .RTYP>) + (ELSE + <ARGCHK 2 <LENGTH .K> ==?> + <ANA <1 .K> ANY> + <ANA <2 .K> ANY> + <PUT .NOD ,NODE-TYPE ,EQ-CODE> + <COND (<AND <==? <ISTYPE? <RESULT-TYPE <1 .K>>> FIX> + <==? <ISTYPE? <RESULT-TYPE <2 .K>>> FIX>> + <PUT .NOD ,NODE-TYPE ,TEST-CODE> + <HACK-BOUNDS .WHO .GLE .NOD .K>)> + <TYPE-OK? '<OR FALSE ATOM> .RTYP>)>> + +<PUT ,==? ANALYSIS ,==?-ANA> + +<PUT ,N==? ANALYSIS ,==?-ANA> + +" Ananlyze TYPE? usage warn about any potential losers by using +TYPE-OK?. " + +<DEFINE TYPE?-ANA (NOD RTYP + "AUX" (K <KIDS .NOD>) (LN <LENGTH .K>) ITYP (ALLGOOD T) + (WHO ()) (FTYP ()) (FNOK <>) + (WHON <AND <==? .PRED <PARENT .NOD>> .NOD>) TTYP) + #DECL ((NOD) NODE (K) <LIST [REST NODE]> (LN) FIX (ITYP) ANY + (ALLGOOD) <OR FALSE ATOM> (WHON) <SPECIAL <OR NODE FALSE>> + (WHO) <SPECIAL LIST> (FTYP) LIST) + <COND + (<SEGFLUSH .NOD .RTYP>) + (ELSE + <OR <G? .LN 1> + <MESSAGE ERROR "TOO FEW ARGS TO TYPE? " .NOD>> + <SET ITYP <EANA <1 .K> ANY TYPE?>> + <MAPF <> + <FUNCTION (N "AUX" FLG) + #DECL ((N) NODE) + <PROG () + <EANA .N ATOM TYPE?> + <OR <==? <NODE-TYPE .N> ,QUOTE-CODE> + <RETURN <SET ALLGOOD <>>>> + <OR <MEMQ <NODE-NAME .N> <ALLTYPES>> + <MESSAGE ERROR + "ARG TO TYPE? NOT A TYPE " + .NOD>> + <AND <TYPE-OK? <NODE-NAME .N> .ITYP> + <SET FTYP (<NODE-NAME .N> !.FTYP)>>>> + <REST .K>> + <COND (<AND .ALLGOOD <NOT <EMPTY? .FTYP>>> + <SET TTYP + <COND (<EMPTY? <REST .FTYP>> <1 .FTYP>) + (ELSE <CHTYPE (OR !.FTYP) FORM>)>> + <PUT .NOD ,NODE-TYPE ,TY?-CODE> + <SET FNOK <NOT <TYPE-OK? <FORM NOT .TTYP> .ITYP>>> + <MAPF <> + <FUNCTION (L "AUX" (FLG <1 .L>) (SYM <2 .L>)) + #DECL ((L) <LIST <OR ATOM FALSE> SYMTAB> (SYM) SYMTAB) + <SET TRUTH + <ADD-TYPE-LIST .SYM + .TTYP + .TRUTH + .FLG + <REST .L 2>>> + <OR .FNOK + <SET UNTRUTH + <ADD-TYPE-LIST .SYM + <FORM NOT .TTYP> + .UNTRUTH + .FLG + <REST .L 2>>>>> + .WHO>) + (.ALLGOOD <PUT .NOD ,NODE-TYPE ,TY?-CODE>) + (ELSE + <AND .VERBOSE <ADDVMESS .NOD ("Not open compiled.")>> + <PUT .NOD ,NODE-TYPE ,ISUBR-CODE>)>)> + <TYPE-OK? <COND (<NOT .ALLGOOD> '<OR FALSE ATOM>) + (<EMPTY? .FTYP> FALSE) + (.FNOK ATOM) + (ELSE '<OR FALSE ATOM>)> + .RTYP>> + +<PUT ,TYPE? ANALYSIS ,TYPE?-ANA> + +<ENDPACKAGE> \ No newline at end of file diff --git a/<mdl.comp>/notgen.mud.119 b/<mdl.comp>/notgen.mud.119 new file mode 100644 index 0000000..121989c --- /dev/null +++ b/<mdl.comp>/notgen.mud.119 @@ -0,0 +1,330 @@ +<PACKAGE "NOTGEN"> + +<ENTRY NOT-GEN TYPE?-GEN ==-GEN> + +<USE "CODGEN" "COMCOD" "CHKDCL" "CACS" "COMPDEC"> + + +" Generate NOT code. This is done in a variety of ways. + 1) If NOTs arg is a predicate itself and this is a predicate usage + (flagged by BRANCH arg), just pass through setting the NOTF arg. + 2) If NOTs arg is a predicate but a value is needed, + set up a predicate like situation and return NOT of the normal + value. + 3) Else just compile and complement result." + +<DEFINE NOT-GEN (NOD WHERE + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR T) + "AUX" (P <1 <KIDS .NOD>>) (RW .WHERE) + (PF <PRED? <NODE-TYPE .P>>) T1 T2 TT (FLG <>)) + #DECL ((NOD P) NODE (TT) DATUM) + <SET WHERE <GOODACS .NOD .WHERE>> + <SET NOTF <NOT .NOTF>> + <COND (<AND .BRANCH .PF> + <SET WHERE + <APPLY <NTH ,GENERATORS <NODE-TYPE .P>> + .P + <COND (<==? .RW FLUSHED> FLUSHED) (ELSE .WHERE)> + .NOTF + .BRANCH + .DIR>>) + (<AND .BRANCH <==? .RW FLUSHED>> + <AND .NOTF <SET DIR <NOT .DIR>>> + <SET WHERE <GEN .P .WHERE>> + <VAR-STORE <>> + <D:B:TAG .BRANCH .WHERE .DIR <RESULT-TYPE .P>>) + (.BRANCH + <SET TT <GEN .P DONT-CARE>> + <VAR-STORE <>> + <SET T1 <MAKE:TAG>> + <D:B:TAG .T1 .TT .DIR <RESULT-TYPE .P>> + <RET-TMP-AC .TT> + <SET WHERE <MOVE:ARG <REFERENCE .DIR> .WHERE>> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .T1>) + (<==? .RW FLUSHED> <SET WHERE <GEN .P FLUSHED>>) + (<OR <SET FLG <==? <ISTYPE? <RESULT-TYPE .NOD>> FALSE>> + <NOT <TYPE-OK? <RESULT-TYPE .NOD> FALSE>>> + <GEN .P FLUSHED> + <SET WHERE <MOVE:ARG <REFERENCE <NOT .FLG>> .WHERE>>) + (.PF + <SET T1 <MAKE:TAG>> + <SET T2 <MAKE:TAG>> + <APPLY <NTH ,GENERATORS <NODE-TYPE .P>> + .P + FLUSHED + .NOTF + .T1 + .DIR> + <MOVE:ARG <REFERENCE <>> .WHERE> + <BRANCH:TAG .T2> + <LABEL:TAG .T1> + <RET-TMP-AC .WHERE> + <MOVE:ARG <REFERENCE T> .WHERE> + <LABEL:TAG .T2>) + (ELSE + <SET T1 <MAKE:TAG>> + <SET T2 <MAKE:TAG>> + <SET TT <GEN .P DONT-CARE>> + <VAR-STORE <>> + <D:B:TAG .T1 .TT T <RESULT-TYPE .P>> + <RET-TMP-AC .TT> + <MOVE:ARG <REFERENCE T> .WHERE> + <BRANCH:TAG .T2> + <LABEL:TAG .T1> + <RET-TMP-AC .WHERE> + <MOVE:ARG <REFERENCE <>> .WHERE> + <LABEL:TAG .T2>)> + <MOVE:ARG .WHERE .RW>> + +<DEFINE PRED? (N) #DECL ((N) FIX) <1? <NTH ,PREDV .N>>> + +" Generate code for ==?. If types are the same then just compare values, +otherwise generate a full comparison." + +<DEFINE ==-GEN (NOD WHERE + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" (K <KIDS .NOD>) REG REG2 B2 T2OK T2 T1 + (T1OK <ISTYPE? <RESULT-TYPE <1 .K>>>) + (TYPSAM + <AND <==? .T1OK + <SET T2OK <ISTYPE? <RESULT-TYPE <2 .K>>>>> + .T1OK>) (RW .WHERE) (SDIR .DIR) + (FLS <==? .RW FLUSHED>) INA) + #DECL ((NOD) NODE (K) <LIST [REST NODE]>) + <COND (<==? <NODE-SUBR .NOD> ,N==?> <SET NOTF <NOT .NOTF>>)> + <AND <NOT .TYPSAM> + .T1OK + .T2OK + <MESSAGE WARNING + " ARGS CAN NEVER BE EQUAL " + <NODE-NAME .NOD> + " " + .NOD>> + <COND (<OR <==? <NODE-TYPE <SET T1 <1 .K>>> ,QUOTE-CODE> + <AND <NOT <SIDE-EFFECTS .NOD>> + <N==? <NODE-TYPE <SET T2 <2 .K>>> ,QUOTE-CODE> + <MEMQ <NODE-TYPE .T1> ,SNODES> + <OR <N==? <NODE-TYPE .T2> ,LVAL-CODE> + <AND <==? <NODE-TYPE .T1> ,LVAL-CODE> + <SET INA <INACS <NODE-NAME .T2>>> + <TYPE? <DATVAL .INA> AC>>>>> + <PUT .K 1 <2 .K>> + <PUT .K 2 .T1> + <SET T1 .T1OK> + <SET T1OK .T2OK> + <SET T2OK .T1>)> + <SET WHERE <UPDATE-WHERE .NOD .WHERE>> + <SET REG + <COND (<ISTYPE-GOOD? .T1OK> <DATUM .T1OK ANY-AC>) + (ELSE <DATUM ANY-AC ANY-AC>)>> + <SET REG2 DONT-CARE> + <COND (.BRANCH + <AND .NOTF <SET DIR <NOT .DIR>>> + <GEN-EQTST .REG + .REG2 + <1 .K> + <2 .K> + .T1OK + .T2OK + <COND (.FLS .DIR) (ELSE <NOT .DIR>)> + .TYPSAM + <COND (.FLS .BRANCH) (ELSE <SET B2 <MAKE:TAG>>)>> + <COND (<NOT .FLS> + <SET RW + <MOVE:ARG <MOVE:ARG <REFERENCE .SDIR> .WHERE> .RW>> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2> + .RW)>) + (ELSE + <SET BRANCH <MAKE:TAG>> + <GEN-EQTST .REG + .REG2 + <1 .K> + <2 .K> + .T1OK + .T2OK + .NOTF + .TYPSAM + .BRANCH> + <MOVE:ARG <REFERENCE T> .WHERE> + <RET-TMP-AC .WHERE> + <BRANCH:TAG <SET B2 <MAKE:TAG>>> + <LABEL:TAG .BRANCH> + <MOVE:ARG <REFERENCE <>> .WHERE> + <LABEL:TAG .B2> + <MOVE:ARG .WHERE .RW>)>> + +<DEFINE GEN-EQTST (R11 R21 N1 N2 T1 T2 DIR TYPS BR "AUX" (TMP <>) AC R1 R2) + #DECL ((N1 N2) NODE (R1 R2) DATUM (AC) AC) + <SET R1 <GEN .N1 .R11>> + <SET R2 <GEN .N2 .R21>> + <VAR-STORE <>> + <COND (<TYPE? <DATVAL .R1> AC>) + (<TYPE? <DATVAL .R2> AC> + <SET R11 .R1> + <SET R1 .R2> + <SET R2 .R11> + <SET R11 .T1> + <SET T1 .T2> + <SET T2 .R11>)> + <TOACV .R1> + <AND <TYPE? <DATVAL .R2> AC> + <PUT <SET TMP <DATVAL .R2>> ,ACPROT T>> + <PUT <DATVAL .R1> ,ACPROT T> + <COND (.TYPS + <IMCHK <COND (.DIR '(`CAMN `CAIN )) (ELSE '(`CAME `CAIE ))> + <ACSYM <DATVAL .R1>> + <DATVAL .R2>>) + (ELSE + <COND (.T2 + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O !<ADDR:TYPE .R1>>>) + (.T1 + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O !<ADDR:TYPE .R2>>>) + (ELSE + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O !<ADDR:TYPE .R2>>> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE + <ACSYM <SET AC <GETREG <>>>> + !<ADDR:TYPE .R1>>>)> + <IMCHK '(`CAMN `CAIN ) <ACSYM <DATVAL .R1>> <DATVAL .R2>> + <EMIT <INSTRUCTION + `CAIE + `O + <COND (.T1 <FORM TYPE-CODE!-OP!-PACKAGE .T1>) + (.T2 <FORM TYPE-CODE!-OP!-PACKAGE .T2>) + (ELSE (<ADDRSYM .AC>))>>> + <AND .DIR <EMIT '<`SKIPA >>>)> + <BRANCH:TAG .BR> + <RET-TMP-AC .R1> + <RET-TMP-AC .R2> + <AND <TYPE? .TMP AC> <PUT .TMP ,ACPROT <>>>> + +" Generate TYPE? code for all various cases." + +<DEFINE TYPE?-GEN (NOD WHERE + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" B2 REG (RW .WHERE) (K <KIDS .NOD>) (SDIR .DIR) + (FLS <==? .RW FLUSHED>) B3 (TEST? T)) + #DECL ((NOD) NODE (K) <LIST [REST NODE]> (REG) DATUM + (WHERE BRANCH B2 B3) ANY) + <COND (<==? <RESULT-TYPE .NOD> FALSE> + <MESSAGE WARNING "TYPE? NEVER TRUE " .NOD> + <SET TEST? #FALSE (1)>) + (<NOT <TYPE-OK? <RESULT-TYPE .NOD> FALSE>> + <MESSAGE WARNING "TYPE? ALWAYS TRUE " .NOD> + <SET TEST? #FALSE (2)>)> + ;"Type of false indicates always true or false" + <SET REG + <GEN <1 .K> <COND (<AND <NOT .TEST?> .FLS> FLUSHED) (ELSE DONT-CARE)>>> + <AND .NOTF <SET DIR <NOT .DIR>>> + <SET K <REST .K>> + <VAR-STORE <>> + <COND (<OR .TEST? + <AND <NOT .FLS> <NOT <EMPTY? <REST .K>>> <==? <1 .TEST?> 2>>> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O* !<ADDR:TYPE .REG>>>)> + <RET-TMP-AC .REG> + <COND + (<AND .BRANCH .FLS> ;"In a COND, OR or AND?" + <AND <NOT <EMPTY? <REST .K>>> <NOT .DIR> <SET B2 <MAKE:TAG>>> + <REPEAT () + <COND + (<EMPTY? <REST .K>> + <COND (.TEST? <TYPINS .DIR <1 .K>>)> + <COND (<OR .TEST? + <AND .DIR <==? <1 .TEST?> 2>> + <AND <NOT .DIR> <==? <1 .TEST?> 1>>> + <BRANCH:TAG .BRANCH>)> + <AND <ASSIGNED? B2> <LABEL:TAG .B2>> + <RETURN>) + (ELSE + <COND (.TEST? + <TYPINS <> <1 .K>> + <TYPINS T <2 .K>> + <BRANCH:TAG <COND (.DIR .BRANCH) (ELSE .B2)>>)> + <COND (<EMPTY? <SET K <REST .K 2>>> + <COND (<OR <AND <NOT .DIR> .TEST?> + <AND <NOT .TEST?> + <OR <AND .DIR <==? <1 .TEST?> 2>> + <AND <NOT .DIR> + <==? <1 .TEST?> 1>>>>> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2>)> + <RETURN>)>)>>) + (<AND .FLS <NOT .TEST?> <NOT .BRANCH>>) + (<OR .NOTF <NOT <==? <NOT .BRANCH> <NOT .DIR>>>> + <SET WHERE <GOODACS .NOD .WHERE>> + <SET B2 <MAKE:TAG>> + <SET B3 <MAKE:TAG>> + <COND (.TEST? + <REPEAT () + <COND (<EMPTY? <REST .K>> + <TYPINS <COND (.BRANCH <NOT .DIR>) (ELSE .DIR)> + <1 .K>> + <RETURN>) + (ELSE + <TYPINS <> <1 .K>> + <TYPINS T <2 .K>> + <COND (<EMPTY? <SET K <REST .K 2>>> + <AND <N==? <NOT .BRANCH> .DIR> + <EMIT '<`SKIPA >>> + <RETURN>)>)> + <BRANCH:TAG <OR <AND .BRANCH .NOTF .B3> .B2>>> + <BRANCH:TAG .B2> + <LABEL:TAG .B3> + <COND (.BRANCH + <MOVE:ARG <REFERENCE .SDIR> .WHERE> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2>) + (ELSE <TRUE-FALSE .NOD .BRANCH .WHERE>)>) + (ELSE + <COND (.BRANCH + <COND (<OR <AND .DIR <==? <1 .TEST?> 2>> + <AND <NOT .DIR> <==? <1 .TEST?> 1>>> + <MOVE:ARG <REFERENCE .SDIR> .WHERE> + <BRANCH:TAG .BRANCH>)>) + (ELSE <MOVE:ARG <==? <1 .TEST?> 2> .WHERE>)>)>) + (ELSE + <SET WHERE <GOODACS .NOD .WHERE>> + <SET B2 <MAKE:TAG>> + <SET REG <REG? ATOM .WHERE>> + <COND + (<OR .TEST? <AND <G=? <LENGTH .K> 2> <==? <1 .TEST?> 2>>> + <MAPR <> + <FUNCTION (TYL "AUX" (TY <1 .TYL>)) + <COND (<NOT <AND <NOT .TEST?> <EMPTY? <REST .TYL>>>> + <TYPINS <> .TY> + <BRANCH:TAG <SET B3 <MAKE:TAG>>>)> + <MOVE:ARG <REFERENCE <NODE-NAME .TY>> .REG> + <COND (<EMPTY? <REST .TYL>> + <LABEL:TAG .B2> + <RET-TMP-AC <MOVE:ARG .REG .WHERE>> + <COND (.BRANCH + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B3>) + (ELSE + <BRANCH:TAG <SET B2 <MAKE:TAG>>> + <LABEL:TAG .B3> + <MOVE:ARG <REFERENCE <>> .WHERE> + <LABEL:TAG .B2>)>) + (ELSE + <RET-TMP-AC .REG> + <BRANCH:TAG .B2> + <LABEL:TAG .B3>)>> + .K>) + (ELSE + <COND + (.BRANCH + <COND (<OR <AND .DIR <==? <1 .TEST?> 2>> + <AND <NOT .DIR> <==? <1 .TEST?> 1>>> + <MOVE:ARG <REFERENCE <AND .DIR <NODE-NAME <1 .K>>>> .WHERE> + <BRANCH:TAG .BRANCH>)>) + (ELSE <MOVE:ARG <REFERENCE <AND .DIR <NODE-NAME <1 .K>>>> .WHERE>)>)>)> + <MOVE:ARG .WHERE .RW>> + +<DEFINE TYPINS (DIR N) + #DECL ((N) NODE) + <EMIT <INSTRUCTION <COND (.DIR `CAIN ) (ELSE `CAIE )> + <FORM TYPE-CODE!-OP!-PACKAGE <NODE-NAME .N>>>>> + +<ENDPACKAGE> + \ No newline at end of file diff --git a/<mdl.comp>/nprint.mud.21 b/<mdl.comp>/nprint.mud.21 new file mode 100644 index 0000000..cdc6250 --- /dev/null +++ b/<mdl.comp>/nprint.mud.21 @@ -0,0 +1,207 @@ +<PACKAGE "NPRINT"> + +<ENTRY NODE-COMPLAIN NODE-PRINT> + +<USE "COMPDEC"> + +<DEFINE NODE-COMPLAIN (N "OPTIONAL" (MAX 80) "AUX" (P .N) TEM) + #DECL ((N) NODE (MAX) FIX (P) <OR VECTOR NODE>) + <REPEAT ((OPP .P)) + <AND <EMPTY? .OPP> <RETURN>> + <OR <NODE-PRINT .OPP .N .MAX T> <RETURN>> + <OR <TYPE? <SET TEM <PARENT <SET P .OPP>>> NODE> + <RETURN>> + <OR <MEMQ .OPP <KIDS <SET OPP .TEM>>> + <RETURN>>> + <NODE-PRINT .P .N .MAX>> + +<DEFINE NODE-PRINT (N + "OPTIONAL" (LOSER <>) (MAX 80) (FLAT <>) + "AUX" (OUTC .OUTCHAN) + (OUTCHAN + <OPEN "PRINT" "INT:" <COND (.FLAT ,NF) (ELSE ,NP)>>) + (NCHS 0)) + #DECL ((MAX) <SPECIAL FIX> (NCHS) <SPECIAL ANY> + (OUTCHAN OUTC) <SPECIAL CHANNEL> + (LOSER) <SPECIAL <OR FALSE NODE>>) + <PUT .OUTCHAN 13 <- <13 .OUTC> 2>> + <COND (<PROG NACT () + #DECL ((NACT) <SPECIAL ACTIVATION>) + <NPRINT .N> + <>> + <OR .FLAT <PRINC " ..." .OUTC>> + <SET NCHS <>>)> + <OR .FLAT <TERPRI .OUTC>> + <CLOSE .OUTCHAN> + .NCHS> + +<DEFINE NF (CH) + <COND (<L? <SET MAX <- .MAX 1>> 0> <RETURN T .NACT>)> + <SET NCHS <+ .NCHS 1>>> + +<DEFINE NP (CH) #DECL ((CH) CHARACTER) + <COND (<L? <SET MAX <- .MAX 1>> 0> <RETURN T .NACT>)> + <PRINC .CH .OUTC>> + +<DEFINE NPRINT (N "AUX" (COD <NODE-TYPE .N>) TC (FLG <==? .N .LOSER>)) + #DECL ((N) NODE (COD TC) FIX) + <AND .FLG <PRINC " **** ">> + <COND (<OR <==? .COD ,FUNCTION-CODE> <==? .COD ,MFCN-CODE>> + <PRINC "<FUNCTION "> + <PRNARGL <BINDING-STRUCTURE .N> <RESULT-TYPE .N> <>> + <PRINC " "> + <SEQ-PRINT <KIDS .N>> + <PRINC ">">) + (<==? .COD ,PROG-CODE> + <PRINC "<"> + <PRIN1 <NODE-NAME .N>> + <PRINC " "> + <PRNARGL <BINDING-STRUCTURE .N> <RESULT-TYPE .N> T> + <PRINC " "> + <SEQ-PRINT <KIDS .N>> + <PRINC ">">) + (<==? .COD ,MFIRST-CODE> + <PRINC <NTH ,MAP-SPEC-PRINT <NODE-SUBR .N>>>) + (<==? .COD ,MPSBR-CODE> + <PRINC ","> + <OR <AND <EMPTY? <KIDS .N>> some-subr> + <PRIN1 <NODE-NAME <1 <KIDS .N>>>>>) + (<==? .COD ,COPY-CODE> + <PRINC <NTH ,ST-CHRS + <SET TC + <LENGTH <MEMQ <NODE-NAME .N> + '![UVECTOR VECTOR LIST!]>>>>> + <SEQ-PRINT <KIDS .N>> + <PRINC <NTH ,EN-CHRS .TC>>) + (<OR <==? .COD ,SEG-CODE> <==? .COD ,SEGMENT-CODE>>) + (<==? .COD ,BRANCH-CODE> + <PRINC "("> + <NPRINT <PREDIC .N>> + <COND (<NOT <EMPTY? <CLAUSES .N>>> + <PRINC " "> + <SEQ-PRINT <CLAUSES .N>>)> + <PRINC ")">) + (<==? .COD ,QUOTE-CODE> + <AND <TYPE? <NODE-NAME .N> VECTOR UVECTOR LIST FORM> + <PRINC !"'>> + <PRIN1 <NODE-NAME .N>>) + (<OR <==? .COD ,SET-CODE> <==? .COD ,FSET-CODE>> + <PRINC "<"> + <PRIN1 SET> + <PRINC " "> + <SEQ-PRINT <KIDS .N>> + <PRINC ">">) + (<OR <MEMQ .COD ,LGV> + <AND <==? .COD ,SUBR-CODE> + <OR <AND <==? <NODE-SUBR .N> ,LVAL> + <SET COD ,FLVAL-CODE>> + <AND <==? <NODE-SUBR .N> ,GVAL> + <SET COD ,FGVAL-CODE>>>>> + <COND (<OR <==? .COD ,LVAL-CODE> <==? .COD ,FLVAL-CODE>> + <PRINC !".>) + (ELSE <PRINC !",>)> + <COND (<TYPE? <NODE-NAME .N> SYMTAB> + <PRIN1 <NAME-SYM <NODE-NAME .N>>>) + (ELSE <OR <AND <EMPTY? <KIDS .N>> some-atom> + <NPRINT <1 <KIDS .N>>>>)>) + (<==? <NODE-NAME .N> INTH> + <PRINC "<"> + <OR <EMPTY? <KIDS .N>> <NPRINT <2 <KIDS .N>>>> + <PRINC " "> + <OR <EMPTY? <KIDS .N>> <NPRINT <1 <KIDS .N>>>> + <PRINC ">">) + (ELSE + <PRINC "<"> + <PRINC <NODE-NAME .N>> + <PRINC " "> + <SEQ-PRINT <KIDS .N>> + <PRINC ">">)> + <AND .FLG <PRINC " **** ">>> + +<SETG MAP-SPEC-PRINT [",+" ",-" ",*" ",/" ",LIST"]> + +<SETG LGV + ![,LVAL-CODE ,FLVAL-CODE ,GVAL-CODE ,FGVAL-CODE!]> + +<SETG ST-CHRS ["(" "[" "!["]> + +<SETG EN-CHRS [")" "]" "!]"]> + +<DEFINE SEQ-PRINT (L) #DECL ((L) <LIST [REST NODE]>) + <COND (<NOT <EMPTY? .L>> + <NPRINT <1 .L>> + <COND (<NOT <EMPTY? <SET L <REST .L>>>> + <MAPF <> + <FUNCTION (N) + #DECL ((N) NODE) + <PRINC " "> + <NPRINT .N>> + .L>)>)>> + +<DEFINE PRNARGL (B R "OPTIONAL" (INAUX <>) "AUX" (INOPT <>) (DC ()) (FIRST T)) + #DECL ((B) <LIST [REST SYMTAB]> (DC) LIST) + <PRINC "("> + <MAPF <> + <FUNCTION (SYM "AUX" (COD <CODE-SYM .SYM>)) + #DECL ((SYM) SYMTAB (COD) FIX) + <OR .FIRST <PRINC " ">> + <SET FIRST <>> + <COND (<==? .COD 1> + <PRINC "\"NAME\" "> + <PRIN1 <NAME-SYM .SYM>>) + (<L=? .COD 3> + <COND (<NOT .INAUX> + <SET INAUX T> + <PRINC "\"AUX\" ">)> + <COND (<==? .COD 2> + <PRINC "("> + <PRIN1 <NAME-SYM .SYM>> + <PRINC " "> + <NPRINT <INIT-SYM .SYM>> + <PRINC ")">) + (ELSE <PRIN1 <NAME-SYM .SYM>>)>) + (<==? .COD 4> + <PRINC "\"TUPLE\" "> + <PRIN1 <NAME-SYM .SYM>>) + (<==? .COD 5> + <PRINC "\"ARGS\" "> + <PRIN1 <NAME-SYM .SYM>>) + (<L=? .COD 9> + <COND (<NOT .INOPT> + <SET INOPT T> + <PRINC "\"OPTIONAL\" ">)> + <COND (<L=? .COD 7> + <PRINC "("> + <AND <==? .COD 6> <PRINC "'">> + <PRIN1 <NAME-SYM .SYM>> + <PRINC " "> + <NPRINT <INIT-SYM .SYM>> + <PRINC ")">) + (ELSE + <AND <==? .COD 8> <PRINC "'">> + <PRIN1 <NAME-SYM .SYM>>)>) + (<==? .COD 10> + <PRINC "\"CALL\" "> + <PRIN1 <NAME-SYM .SYM>>) + (<==? .COD 11> + <PRINC "\"BIND\" "> + <PRIN1 <NAME-SYM .SYM>>) + (ELSE + <AND <==? .COD 12> <PRINC "'">> + <PRIN1 <NAME-SYM .SYM>>)> + <COND (<N==? <1 <DECL-SYM .SYM>> ANY> + <SET DC + ((<NAME-SYM .SYM>) + <1 <DECL-SYM .SYM>> + !.DC)>)>> + .B> + <COND (<AND .R <N==? .R ANY>> <SET DC ('(VALUE) .R !.DC)>)> + <PRINC ")"> + <COND (<NOT <EMPTY? .DC>> <PRINC " "> <PRIN1 <CHTYPE .DC DECL>>)>> + + + + + +<ENDPACKAGE> + \ No newline at end of file diff --git a/<mdl.comp>/pass1.mud.45 b/<mdl.comp>/pass1.mud.45 new file mode 100644 index 0000000..241f431 --- /dev/null +++ b/<mdl.comp>/pass1.mud.45 @@ -0,0 +1,1145 @@ +<PACKAGE "PASS1"> + +<ENTRY PASS1 PCOMP PMACRO PAPPLY-OBJECT PAPPLY-TYPE PTHIS-OBJECT PTHIS-TYPE + GEN-D ACT-FIX FIND:DECL SEG? PSUBR-C> + +<USE "CHKDCL" "COMPDEC" "CDRIVE"> + + +" This file contains the first pass of the MUDDLE compiler. +The functions therein take a MUDDLE function and build a more detailed +model of it. Each entity in the function is represented by an object +of type NODE. The entire function is represented by the functions node +and it points to the rest of the nodes for the function." + +" Nodes vary in complexity and size depending on what they represent. +A function or prog/repeat node is contains more information than a node +for a quoted object. All nodes have some fields in common to allow +general programs to traverse the model." + +" The model built by PASS1 is used by the analyzer (SYMANA), the +variable allocator (VARANA) and the code generator (CODGEN). In some +cases the analyzers and generators for certain classes of SUBRs are +together in their own files (e.g. CARITH, STRUCT, ISTRUC)." + +" This the top level program for PASS1. It takes a function as +input and returns the data structure representing the model." + +<DEFINE PASS1 (FUNC + "OPTIONAL" (NAME <>) (JUSTDCL <>) (RNAME .NAME) + "AUX" RESULT (VARTBL ,LVARTBL) (DCL #DECL ()) (ARGL ()) + (HATOM <>) (TT ()) (FCN .FUNC) TEM (RQRG 0) (TRG 0) INAME) + #DECL ((FUNC) FUNCTION (VARTBL) <SPECIAL SYMTAB> + (RQRG TRG) <SPECIAL FIX> (FCN) <PRIMTYPE LIST> (ARGL TT) LIST + (RESULT) <SPECIAL NODE> (INAME) <UVECTOR [REST ATOM]>) + <AND <EMPTY? .FCN> <MESSAGE ERROR " EMPTY FUNCTION ">> + <AND <TYPE? <1 .FCN> ATOM> + <SET HATOM <1 .FCN>> + <SET FCN <REST .FCN>>> + <AND <EMPTY? .FCN> <MESSAGE ERROR " NO ARG LIST ">> + <SET ARGL <1 .FCN>> + <SET FCN <REST .FCN>> + <COND (<AND <NOT <EMPTY? .FCN>> <TYPE? <1 .FCN> DECL>> + <SET DCL <1 .FCN>> + <SET FCN <REST .FCN>>)> + <AND <EMPTY? .FCN> <MESSAGE ERROR " NO BODY ">> + <COND (<SET TEM <GET .RNAME .IND>> + <SET RESULT .TEM> + <SET VARTBL <SYMTAB .RESULT>>) + (ELSE + <SET TT <GEN-D .ARGL .DCL .HATOM>> + <SET INAME + <IUVECTOR <- .TRG .RQRG -1> '<MAKE:TAG <PNAME .NAME>>>> + <SET RESULT + <NODEF ,FUNCTION-CODE + () + <FIND:DECL VALUE .DCL> + .INAME + () + <1 .TT> + <2 .TT> + .HATOM + .VARTBL + <COND (<==? <LENGTH .TT> 3> <3 .TT>)> + .TRG + .RQRG>> + <ACT-FIX .RESULT <2 .TT>> + <PUT .RNAME .IND .RESULT> + <PUT .RESULT + ,RSUBR-DECLS + ("VALUE" <RESULT-TYPE .RESULT> !<RSUBR-DECLS .RESULT>)>)> + <OR .JUSTDCL + <PUT .RESULT + ,KIDS + <MAPF ,LIST <FUNCTION (O) <PCOMP .O .RESULT>> .FCN>>> + .RESULT> + +" This function (and others on this page) take an arg list and +decls and parses them producing 3 things. + + 1) An RSUBR decl list. + + 2) A machine readable binding specification. + + 3) Possibly an AC call spec. + +Atoms are also entered into the symbol table." + +<DEFINE GEN-D (ARGL DCL HATOM "OPTIONAL" (ACS:TOP <COND (.GLUE '(() STACK)) (T (()))>) + "AUX" (SVTBL .VARTBL) (ACS:BOT <CHTYPE .ACS:TOP LIST>) (NACS 1) + (RES:TOP (())) (RES:BOT .RES:TOP) (ARGN 1) (BNDL:TOP (())) + (BNDL:BOT .BNDL:TOP) (MODE ,TOT-MODES) (DOIT ,INIT-D) + (ST <>) T T1 SVT (IX 0) TIX VIX) + #DECL ((ACS:BOT RES:BOT BNDL:TOP BNDL:BOT) <SPECIAL LIST> (RES:TOP) LIST + (ACS:TOP) <SPECIAL <PRIMTYPE LIST>> (NACS ARGN) <SPECIAL FIX> + (VIX) <VECTOR [REST STRING]> (MODE) <SPECIAL <VECTOR [REST STRING]>> + (IX) FIX (DOIT) <SPECIAL ANY> (ARGL) LIST (SVTBL SVT) SYMTAB + (DCL) <SPECIAL <PRIMTYPE LIST>>) + <REPEAT () + <AND <EMPTY? .ARGL> <RETURN>> + <COND (<SET T1 <TYPE? <SET T <1 .ARGL>> ATOM FORM LIST>> + <SET ST <>> + <APPLY .DOIT .T .T1>) + (<TYPE? .T STRING> + <AND .ST <MESSAGE ERROR " TWO DECL STRINGS IN A ROW ">> + <SET ST T> + <OR <SET TIX <MEMBER .T .MODE>> + <MESSAGE ERROR " UNRECOGNIZED STRING IN DECL " .T>> + <SET VIX .TIX> + <SET MODE <REST .MODE <NTH ,RESTS <SET IX <LENGTH .VIX>>>>> + <SET DOIT <NTH ,DOITS .IX>> + <COND (<OR <L? .IX 5> <G? .IX 8>>) + (ELSE <PUT-RES (<COND (<=? <1 .ARGL> "OPT"> + "OPTIONAL") + (ELSE <1 .ARGL>)>)>)>) + (ELSE <MESSAGE ERROR " BAD THING IN DECL " .T>)> + <SET ARGL <REST .ARGL>>> + <AND .HATOM <ACT-D .HATOM <TYPE .HATOM>>> + <REPEAT (DC DC1) + #DECL ((DC1) FORM (DC) ANY (VARTBL) <SPECIAL SYMTAB>) + <COND (<EMPTY? .DCL> <RETURN>) + (<EMPTY? <REST .DCL>> <MESSAGE ERROR "DECL LIST AT END OF DECL">)> + <SET DC <2 .DCL>> + <COND (<AND <TYPE? .DC FORM> + <SET DC1 .DC> + <==? <LENGTH .DC1> 2> + <OR <==? <1 .DC1> SPECIAL> <==? <1 .DC1> UNSPECIAL>>> + <SET DC <2 .DC1>>)> + <MAPF <> + <FUNCTION (ATM) + <OR <==? .ATM VALUE> + <SRCH-SYM .ATM> + <ADDVAR .ATM T -1 0 T (.DC) <> <>>>> + <CHTYPE <1 .DCL> LIST>> + <SET DCL <REST .DCL 2>>> + <SET SVT .VARTBL> + <SET VARTBL .SVTBL> + <COND (<N==? .SVTBL .SVT> + <REPEAT ((SV .SVT)) + #DECL ((SV) SYMTAB) + <COND (<==? <NEXT-SYM .SV> .SVTBL> + <PUT .SV ,NEXT-SYM .VARTBL> + <SET VARTBL .SVT> + <RETURN>) + (ELSE <SET SV <NEXT-SYM .SV>>)>>)> + <AND <L? <SET TRG <- .ARGN 1>> 0> <SET RQRG -1>> + <COND (<OR <NOT .ACS:TOP> <=? .ACS:TOP '(() STACK)>> + <REPEAT ((BB ()) B (CHNG T) (N1 0) (N2 0) TEM) + #DECL ((BB B) <LIST [REST SYMTAB]> (N1 N2) FIX (TEM) SYMTAB) + <COND (<EMPTY? .BB> + <OR .CHNG <RETURN>> + <SET CHNG <>> + <SET N1 0> + <SET B .BNDL:TOP> + <SET BB <REST .B>> + <AGAIN>)> + <COND (<NOT <0? <SET N2 <ARGNUM-SYM <SET TEM <1 .BB>>>>>> + <COND (<G? .N1 .N2> + <PUT .BB 1 <1 .B>> + <PUT .B 1 .TEM> + <SET CHNG T>) + (ELSE <SET N1 .N2>)>) + (ELSE <SET BB ()> <AGAIN>)> + <SET B <REST .B>> + <SET BB <REST .BB>>>)> + (<REST .RES:TOP> + <REST .BNDL:TOP> + !<COND (.ACS:TOP (<REST .ACS:TOP>)) (ELSE ())!>)> + + +<DEFINE SRCH-SYM (ATM "AUX" (TB .VARTBL)) + #DECL ((ATM) ATOM (TB) <PRIMTYPE VECTOR>) + <REPEAT () + <AND <EMPTY? .TB> <RETURN <>>> + <AND <==? .ATM <NAME-SYM .TB>> <RETURN .TB>> + <SET TB <NEXT-SYM .TB>>>> + +"Vector of legal strings in decl list." + +<SETG TOT-MODES + ["BIND" + "CALL" + "OPT" + "OPTIONAL" + "ARGS" + "TUPLE" + "AUX" + "EXTRA" + "ACT" + "NAME"]> + +"Amount to rest off decl vector after each encounter." + +<SETG RESTS ![1 2 1 2 1 2 1 2 1 1!]> + +"This function used for normal args when \"BIND\" and \"CALL\" still possible." + +<DEFINE INIT-D (OBJ TYP) #DECL ((MODE) <VECTOR STRING>) + <SET MODE <REST .MODE>> <INIT1-D .OBJ .TYP>> + +"This function for normal args when \"CALL\" still possible." + +<DEFINE INIT1-D (OBJ TYP) + #DECL ((MODE) <VECTOR STRING>) + <SET MODE <REST .MODE>> + <SET DOIT ,NORM-D> + <NORM-D .OBJ .TYP>> + +"Handle a normal argument or quoted normal argument." + +<DEFINE NORM-D (OBJ TYP) #DECL ((TYP) ATOM (RQRG ARGN) FIX (DCL) DECL) + <AND <==? .TYP LIST> + <MESSAGE ERROR " LIST NOT IN OPT OR AUX " .OBJ>> + <SET RQRG <+ .RQRG 1>> + <COND (<==? .TYP ATOM> + <PUT-RES (<PUT-DCL 13 .OBJ <><FIND:DECL .OBJ .DCL> T>)>) + (<SET OBJ <QUOTCH .OBJ>> + <PUT-RES ("QUOTE" <PUT-DCL 12 .OBJ <> <FIND:DECL .OBJ .DCL> T>)>)> + <SET ARGN <+ .ARGN 1>>> + +"Handle \"BIND\" decl." + +<DEFINE BIND-D (OBJ TYP "AUX" DC) #DECL ((TYP) ATOM (ARGN) FIX (DCL) DECL) + <SET ACS:TOP <>> + <OR <==? .TYP ATOM> <MESSAGE ERROR " BAD BIND " .OBJ>> + <SET DC <PUT-DCL 11 .OBJ <> <FIND:DECL .OBJ .DCL> T>> + <TYPE-ATOM-OK? .DC ENVIRONMENT .OBJ> + <SET DOIT ,INIT1-D>> + +"Handle \"CALL\" decl." + +<DEFINE CALL-D (OBJ TYP "AUX" DC) #DECL ((TYP) ATOM (RQRG ARGN) FIX (DCL) DECL) + <SET RQRG <+ .RQRG 1>> + <OR <==? .TYP ATOM> <MESSAGE ERROR " BAD CALL " .OBJ>> + <PUT-RES (<SET DC <PUT-DCL 10 .OBJ <> <FIND:DECL .OBJ .DCL> T>>)> + <TYPE-ATOM-OK? .DC FORM .OBJ> + <SET ARGN <+ .ARGN 1>> + <SET DOIT ,ERR-D>> + +"Flush on extra atoms after \"CALL\", \"ARGS\" etc." + +<DEFINE ERR-D (OBJ TYPE) <MESSAGE ERROR " BAD SYNTAX ARGLIST " .OBJ>> + +"Handle \"OPTIONAL\" decl." + +<DEFINE OPT-D (OBJ TYP "AUX" DC OBJ1) + #DECL ((TYP) ATOM (ARGN) FIX (DCL) DECL) + <COND (.ACS:TOP <SET ACS:TOP '(() STACK)>)> ;"Temporary until know how to win." + <COND (<==? .TYP ATOM> + <PUT-RES (<PUT-DCL 9 .OBJ <><FIND:DECL .OBJ .DCL> <>>)>) + (<==? .TYP FORM> + <SET OBJ <QUOTCH .OBJ>> + <PUT-RES ("QUOTE" <PUT-DCL 8 .OBJ <> <FIND:DECL .OBJ .DCL> <>>)>) + (<TYPE? <SET OBJ1 <LISTCH .OBJ>> ATOM> + <PUT-RES (<PAUX .OBJ1 <2 <CHTYPE .OBJ LIST>> <FIND:DECL .OBJ1 .DCL> 7>)>) + (<TYPE? .OBJ1 FORM> + <SET OBJ1 <QUOTCH .OBJ1>> + <PUT-RES ("QUOTE" + <PAUX .OBJ1 <2 <CHTYPE .OBJ LIST>> <FIND:DECL .OBJ1 .DCL> 6>)>) + (ELSE <MESSAGE ERROR "BAD USE OF OPTIONAL " .OBJ>)> + <SET ARGN <+ .ARGN 1>>> + +"Handle \"ARGS\" decl." + +<DEFINE ARGS-D (OBJ TYP "AUX" DC) + #DECL ((TYP) ATOM (RQRG ARGN) FIX (DCL) DECL (BNDL:BOT) <LIST SYMTAB>) + <COND (.ACS:TOP <SET ACS:TOP '(() STACK)>)> ;"Temporary until know how to win." + <OR <==? .TYP ATOM> <MESSAGE ERROR " BAD ARGS " .OBJ>> + <PUT-RES (<SET DC <PUT-DCL 5 .OBJ <> <FIND:DECL .OBJ .DCL> <>>>)> + <TYPE-ATOM-OK? .DC LIST .OBJ> + <SET DOIT ,ERR-D> + <SET ARGN <+ .ARGN 1>>> + +"Handle \"TUPLE\" decl." + +<DEFINE TUP-D (OBJ TYP "AUX" DC) + #DECL ((TYP) ATOM (ARGN) FIX (DCL) DECL) + <OR <==? .TYP ATOM> <MESSAGE ERROR " BAD TUPLE " .OBJ>> + <COND (<1? .ARGN> <SET ARGN 0> <SET ACS:TOP '(() STACK)>) + (ELSE <SET ACS:TOP <>>)> + <PUT-RES (<SET DC <PUT-DCL 4 .OBJ <> <FIND:DECL .OBJ .DCL> <>>>)> + <TYPE-ATOM-OK? .DC TUPLE .OBJ> + <SET DOIT ,ERR-D>> + + +"Handle \"AUX\" decl." + +<DEFINE AUX-D (OBJ TYP "AUX" DC OBJ1) + #DECL ((TYP) ATOM (ARGN) FIX (DCL) DECL) + <AND <==? .TYP FORM> <MESSAGE ERROR " QUOTED AUX " .OBJ>> + <COND (<==? .TYP ATOM> + <PUT-DCL 3 .OBJ <> <FIND:DECL .OBJ .DCL> <>>) + (<TYPE? <SET OBJ1 <LISTCH .OBJ>> ATOM> + <PAUX .OBJ1 <2 .OBJ> <FIND:DECL .OBJ1 .DCL> 2>) + (ELSE <MESSAGE ERROR " QUOTED AUX " .OBJ>)>> + +"Handle \"NAME\" and \"ACT\" decl." + +<DEFINE ACT-D (OBJ TYP "AUX" DC) + #DECL ((TYP) ATOM (ARGN) FIX (DCL) DECL) + <OR <==? .TYP ATOM> + <MESSAGE ERROR " BAD ACTIVATION " .OBJ>> + <SET DC <PUT-DCL 1 .OBJ <> <FIND:DECL .OBJ .DCL> <>>> + <TYPE-ATOM-OK? .DC ACTIVATION .OBJ>> + +"Fixup activation atoms after node generated." + +<DEFINE ACT-FIX (N L "AUX" (FLG <>)) #DECL ((N) NODE (L) <LIST [REST SYMTAB]>) + <REPEAT (SYM) #DECL ((SYM) SYMTAB) + <AND <EMPTY? .L> <RETURN .FLG>> + <COND (<AND <==? <CODE-SYM <SET SYM <1 .L>>> 1> + <SET FLG T> + <NOT <SPEC-SYM .SYM>>> + <PUT .SYM ,RET-AGAIN-ONLY .N>)> + <SET L <REST .L>>>> + +"Table of varius decl handlers." + +<SETG DOITS + ![,ACT-D ,ACT-D ,AUX-D ,AUX-D ,TUP-D ,ARGS-D ,OPT-D ,OPT-D ,CALL-D + ,BIND-D!]> + +<GDECL (DOITS) UVECTOR (TOT-MODES) <VECTOR [REST STRING]> (RESTS) <UVECTOR [REST FIX]>> + +"Check for quoted arguments." + +<DEFINE QUOTCH (OB) #DECL ((OB) FORM (VALUE) ATOM) + <COND (<AND <==? <LENGTH .OB> 2> + <==? <1 .OB> QUOTE> + <TYPE? <2 .OB> ATOM>> + <2 .OB>) + (ELSE <MESSAGE ERROR " BAD FORM IN ARGLIST " .OB> T)>> + +"Chech for (arg init) or ('arg init)." + +<DEFINE LISTCH (OB) #DECL ((OB) LIST) + <COND (<AND <==? <LENGTH .OB> 2> + <OR <TYPE? <1 .OB> ATOM> + <AND <TYPE? <1 .OB> FORM> <QUOTCH <1 .OB>>>>> + <1 .OB>) + (ELSE <MESSAGE ERROR " BAD LIST IN ARGLIST " .OB> T)>> + +"Add a decl to RSUBR decls and update AC call spec." + +<DEFINE PUT-RES (L "AUX" TY) + #DECL ((L) LIST (NACS) FIX (ACS:BOT RES:BOT) LIST) + <PROG () + <SET RES:BOT <REST <PUTREST .RES:BOT .L> <LENGTH .L>>> + <COND (<AND .ACS:TOP <OR <G? .NACS 5> <=? .ACS:TOP '(() STACK)>>> + <SET ACS:TOP '(() STACK)> <RETURN>)> + <COND (<AND .ACS:TOP + <REPEAT () + <COND (<EMPTY? .L><RETURN <>>) + (<TYPE? <SET TY <1 .L>> STRING> + <SET L <REST .L>>) + (ELSE <RETURN T>)>>> + <COND (<SET TY <ISTYPE-GOOD? .TY>> + <SET ACS:BOT <REST <PUTREST .ACS:BOT + ((.TY <NTH ,ALLACS .NACS>))>>> + <SET NACS <+ .NACS 1>>) + (<L? <SET NACS <+ .NACS 2>> 7> + <SET ACS:BOT <REST <PUTREST .ACS:BOT + ((<NTH ,ALLACS <- .NACS 2>> + <NTH ,ALLACS <- .NACS 1>>))>>>) + (ELSE <SET ACS:TOP '(() STACK)>)>)> + T>> + +"Add code to set up a certain kind of argument." + +<DEFINE PUT-DCL (COD ATM VAL DC COM "AUX" SPC DC1 TT SYM) + #DECL ((DC1) FORM (ATM) ATOM (BNDL:BOT BNDL:TOP TT) LIST (COD) FIX + (SYM) SYMTAB) + <COND (<AND <TYPE? .DC FORM> + <SET DC1 .DC> + <==? <LENGTH .DC1> 2> + <OR <SET SPC <==? <1 .DC1> SPECIAL>> + <==? <1 .DC1> UNSPECIAL>>> + <SET DC <2 .DC1>>) + (ELSE <SET SPC .GLOSP>)> + <SET SYM <ADDVAR .ATM .SPC .COD .ARGN T (.DC) <> .VAL>> + <COND (<AND .COM <NOT <SPEC-SYM .SYM>>> ;"Can specials commute?" + <SET TT <REST .BNDL:TOP>> + <PUTREST .BNDL:TOP (.SYM !.TT)> + <AND <EMPTY? .TT> <SET BNDL:BOT <REST .BNDL:TOP>>>) + (ELSE <SET BNDL:BOT <REST <PUTREST .BNDL:BOT (.SYM)>>>)> + .DC> + +"Find decl associated with a variable, if none, use ANY." + +<DEFINE FIND:DECL (ATM "OPTIONAL" (DC .DECLS)) + #DECL ((DC) <PRIMTYPE LIST> (ATM) ATOM) + <REPEAT (TT) + #DECL ((TT) LIST) + <AND <OR <EMPTY? .DC> <EMPTY? <SET TT <REST .DC>>>> + <RETURN ANY>> + <COND (<NOT <TYPE? <1 .DC> LIST>> + <MESSAGE ERROR " BAD DECL LIST " .DC>)> + <AND <MEMQ .ATM <CHTYPE <1 .DC> LIST>> <RETURN <1 .TT>>> + <SET DC <REST .TT>>>> + +"Add an AUX variable spec to structure." + +<DEFINE PAUX (ATM OBJ DC NTUP "AUX" EV TT) + #DECL ((EV TT) NODE (TUP NTUP) FIX (ATM) ATOM) + <COND (<AND <TYPE? .OBJ FORM> + <NOT <EMPTY? .OBJ>> + <OR <==? <1 .OBJ> TUPLE> <==? <1 .OBJ> ITUPLE>>> + <SET TT + <NODEFM <COND (<==? <1 .OBJ> TUPLE> ,COPY-CODE) + (ELSE ,ISTRUC-CODE)> + () + TUPLE + <1 .OBJ> + () + ,<1 .OBJ>>> + <COND (<==? <NODE-TYPE .TT> ,ISTRUC-CODE> + <SET EV + <PCOMP <COND (<==? <LENGTH .OBJ> 3> <3 .OBJ>) + (ELSE #LOSE *000000000000*)> + .TT>> + <COND (<==? <NODE-TYPE .EV> ,QUOTE-CODE> + <SET EV <PCOMP <NODE-NAME .EV> .TT>> + ;"Reanalyze it." + <PUT .TT ,NODE-TYPE ,ISTRUC2-CODE>)> + <PUT .TT ,KIDS (<PCOMP <2 .OBJ> .TT> .EV)>) + (ELSE + <PUT .TT + ,KIDS + <MAPF ,LIST + <FUNCTION (O) <PCOMP .O .TT>> + <REST .OBJ>>>)>) + (ELSE <SET TT <PCOMP .OBJ ()>>)> + <PUT-DCL .NTUP .ATM .TT .DC <>>> + +"Main dispatch function during pass1." + +<DEFINE PCOMP (OBJ PARENT) + #DECL ((PARENT) <SPECIAL ANY> (VALUE) NODE) + <APPLY <OR <GET .OBJ PTHIS-OBJECT> + <GET <TYPE .OBJ> PTHIS-TYPE> + ,PDEFAULT> + .OBJ>> + +"Build a node for <> or #FALSE ()." + +<DEFINE FALSE-QT (O) + #DECL ((VALUE) NODE) + <NODE1 ,QUOTE-CODE .PARENT FALSE <> ()>> + +<PUT '<> PTHIS-OBJECT ,FALSE-QT> + +"Build a node for ()." + +<DEFINE NIL-QT (O) #DECL ((VALUE) NODE) + <NODE1 ,QUOTE-CODE .PARENT LIST () ()>> + +<PUT () PTHIS-OBJECT ,NIL-QT> + +"Build a node for a LIST, VECTOR or UVECTOR." + +<DEFINE PCOPY (OBJ "AUX" (TT <NODEFM ,COPY-CODE .PARENT <TYPE .OBJ> <TYPE .OBJ> () <>>)) + #DECL ((VALUE) NODE (TT) NODE) + <PUT .TT ,KIDS + <MAPF ,LIST <FUNCTION (O) <PCOMP .O .TT>> .OBJ>>> + +<PUT VECTOR PTHIS-TYPE ,PCOPY> + +<PUT UVECTOR PTHIS-TYPE ,PCOPY> + +<PUT LIST PTHIS-TYPE ,PCOPY> + +"Build a node for unknown things." + +<DEFINE PDEFAULT (OBJ) #DECL ((VALUE) NODE) + <NODE1 ,QUOTE-CODE .PARENT <TYPE .OBJ> .OBJ ()>> + +"Further analyze a FORM and build appropriate node." + +<DEFINE PFORM (OBJ) #DECL ((OBJ) <FORM ANY> (VALUE) NODE) + <PROG APPLICATION ((APPLY <1 .OBJ>)) + #DECL ((APPLICATION) <SPECIAL ACTIVATION> + (APPLY) <SPECIAL ANY>) + <APPLY <OR <GET .APPLY PAPPLY-OBJECT> + <GET <TYPE .APPLY> PAPPLY-TYPE> + ,PAPDEF> + .OBJ .APPLY>>> + +<PUT FORM PTHIS-TYPE ,PFORM> + +"Build a SEGMENT node." + +<DEFINE SEG-FCN (OBJ "AUX" (TT <NODE1 ,SEGMENT-CODE .PARENT <> <> ()>)) + #DECL ((TT VALUE PARENT) NODE) + <PUT .TT ,KIDS (<PFORM <CHTYPE .OBJ FORM>>)>> + +<PUT SEGMENT PTHIS-TYPE ,SEG-FCN> + +"Analyze a form or the form <ATM .....>" + +<DEFINE ATOM-FCN (OB AP) #DECL ((AP) ATOM (VALUE) NODE) + <COND (<GASSIGNED? .AP> + <SET APPLY ,.AP> + <AGAIN .APPLICATION>) + (<ASSIGNED? .AP> + <MESSAGE WARNING " LOCAL VALUE USED FOR " .AP> + <SET APPLY ..AP> + <AGAIN .APPLICATION>) + (.REASONABLE + <PSUBR-C .OB DUMMY>) + (ELSE <MESSAGE WARNING " NO VALUE FOR " .AP> + <PAPDEF .OB .AP>)>> + +<PUT ATOM PAPPLY-TYPE ,ATOM-FCN> + +"Expand MACRO and process result." + +<DEFINE PMACRO (OBJ AP "AUX" ERR TEM) + <SET ERR <ON "ERROR" ,MACROERR 100>> ;"Turn On new Error" + <SET TEM <PROG MACACT () + #DECL ((MACACT) <SPECIAL ACTIVATION>) + <SETG MACACT .MACACT> + <EXPAND .OBJ>>> + <OFF .ERR> ;"Turn OFF new Error" + <COND (<TYPE? .TEM FUNNY> + <MESSAGE ERROR " MACRO EXPANSION LOSSAGE " !.TEM>) + (ELSE + <PCOMP .TEM .PARENT>)>> + +<NEWTYPE FUNNY VECTOR> +<PROG (X) ;"Find the real Valret Subr" + <COND (<TYPE? ,VALRET SUBR> <SETG REAL-VALRET ,VALRET>) + (<AND <GASSIGNED? <SET X <PARSE "OVALRET!-COMBAT!-">>> + <TYPE? ,.X SUBR>> + <SETG REAL-VALRET ,.X>) + (<NOT <GASSIGNED? REAL-VALRET>> <ERROR ',VALRET COMPILE>)>> +<PUT MACRO PAPPLY-TYPE ,PMACRO> + +<DEFINE MACROERR (FR "TUPLE" T) + #DECL ((T) TUPLE) + <COND (<AND <GASSIGNED? MACACT> <LEGAL? ,MACACT>> + <DISMISS <CHTYPE [!.T] FUNNY> ,MACACT>) + (ELSE <REAL-VALRET " ">)>> + +"Build a node for a form whose 1st element is a form (could be NTH)." + +<DEFINE PFORM-FORM (OBJ AP "AUX" TT) + #DECL ((TT) NODE (VALUE) NODE (OBJ) FORM) + <COND (<AND <==? <LENGTH .OBJ> 2> <NOT <SEG? .OBJ>>> + <SET TT <NODEFM ,FORM-F-CODE .PARENT <> .OBJ () .AP>> + <PUT .TT ,KIDS + <MAPF ,LIST <FUNCTION (O) <PCOMP .O .TT>> .OBJ>>) + (ELSE <PAPDEF .OBJ .AP>)>> + +<PUT FORM PAPPLY-TYPE ,PFORM-FORM> + +"Build a node for strange forms." + +<DEFINE PAPDEF (OBJ AP) #DECL ((VALUE) NODE) + <MESSAGE WARNING " FORM NOT BEING COMPILED " .OBJ> + <SPECIALIZE .OBJ> + <NODEFM ,FORM-CODE .PARENT <> .OBJ () .AP>> + +"For objects that require EVAL, make sure all atoms used are special." + +<DEFINE SPECIALIZE (OBJ "AUX" T1 T2 SYM OB) + #DECL ((T1) FIX (OB) FORM (T2) <OR FALSE SYMTAB>) + <COND (<AND <TYPE? .OBJ FORM SEGMENT> + <SET OB <CHTYPE .OBJ FORM>> + <OR <AND <==? <SET T1 <LENGTH .OB>> 2> + <==? <1 .OB> LVAL> + <TYPE? <SET SYM <2 .OB>> ATOM>> + <AND <==? .T1 3> + <==? <1 .OB> SET> + <TYPE? <SET SYM <2 .OB>> ATOM>>> + <SET T2 <SRCH-SYM .SYM>>> + <COND (<NOT <SPEC-SYM .T2>> + <MESSAGE NOTE " REDCLARED SPECIAL " .SYM> + <PUT .T2 ,SPEC-SYM T>)>)> + <COND (<MEMQ <PRIMTYPE .OBJ> '![FORM LIST UVECTOR VECTOR!]> + <MAPF <> ,SPECIALIZE .OBJ>)>> + +"Build a SUBR call node." + +<DEFINE PSUBR-C (OBJ AP "AUX" (TT <NODEFM ,SUBR-CODE .PARENT <> + <SUBR-NAME .AP <1 .OBJ>> () .AP>)) + #DECL ((TT) NODE (VALUE) NODE (OBJ) FORM) + <PUT .TT ,KIDS + <MAPF ,LIST <FUNCTION (O) <PCOMP .O .TT>> <REST .OBJ>>>> + +<PUT SUBR PAPPLY-TYPE ,PSUBR-C> + +<FLOAD "SBRNAM" "NBIN"> + +<DEFINE SUBR-NAME (THING DEFAULT) + <COND (<TYPE? .THING SUBR> <HACK-NAME .THING>) + (<TYPE? .THING RSUBR RSUBR-ENTRY> <2 .THING>) + (ELSE .DEFAULT)>> + +<DEFINE FIX-FCN (OBJ AP "AUX" TT (LN <LENGTH .OBJ>)) + #DECL ((TT VALUE) NODE (OBJ) FORM) + <OR <==? .LN 2> <==? .LN 3> + <MESSAGE ERROR " BAD APPLICATION OF A NUMBER ">> + <SET TT <NODEFM ,SUBR-CODE .PARENT <> <COND (<==? .LN 2> INTH)(ELSE IPUT)> + () <COND (<==? .LN 2> ,NTH) (ELSE ,PUT)>>> + <PUT .TT ,KIDS (<PCOMP <2 .OBJ> .TT><PCOMP .AP .TT> + !<COND (<==? .LN 2> ()) (ELSE (<PCOMP <3 .OBJ> .TT>))>)>> + +<PUT FIX PAPPLY-TYPE ,FIX-FCN> + +<PUT OFFSET PAPPLY-TYPE ,FIX-FCN> + +"PROG/REPEAT node." + +<DEFINE PPROG-REPEAT (OBJ AP + "AUX" (NAME <1 .OBJ>) TT (DCL #DECL ()) (HATOM <>) ARGL + (VARTBL .VARTBL)) + #DECL ((OBJ) <PRIMTYPE LIST> (TT) NODE (VALUE) NODE (DCL) DECL + (ARGL) LIST (VARTBL) <SPECIAL SYMTAB>) + <AND <EMPTY? <SET OBJ <REST .OBJ>>> + <MESSAGE ERROR " EMPTY " .NAME>> + <AND <TYPE? <1 .OBJ> ATOM> + <SET HATOM <1 .OBJ>> + <SET OBJ <REST .OBJ>>> + <SET ARGL <1 .OBJ>> + <SET OBJ <REST .OBJ>> + <AND <NOT <EMPTY? .OBJ>> + <TYPE? <1 .OBJ> DECL> + <SET DCL <1 .OBJ>> + <SET OBJ <REST .OBJ>>> + <AND <EMPTY? .OBJ> <MESSAGE ERROR " NO DODY FOR " .NAME>> + <SET TT + <NODEPR ,PROG-CODE + .PARENT + <FIND:DECL VALUE .DCL> + .NAME + () + .AP + <2 <GEN-D <COND (<AND <NOT <EMPTY? .ARGL>> + <TYPE? <1 .ARGL> STRING>> + .ARGL) + (ELSE ("AUX" !.ARGL))> + .DCL + .HATOM>> + .HATOM + .VARTBL>> + <ACT-FIX .TT <BINDING-STRUCTURE .TT>> + <PUT .TT + ,KIDS + <MAPF ,LIST <FUNCTION (O) <PCOMP .O .TT>> .OBJ>> + .TT> + +<PUT ,PROG PAPPLY-OBJECT ,PPROG-REPEAT> + +<PUT ,REPEAT PAPPLY-OBJECT ,PPROG-REPEAT> + +<PUT ,BIND PAPPLY-OBJECT ,PPROG-REPEAT> + +"Unwind compiler." + +<DEFINE UNWIND-FCN (OBJ AP "AUX" (TT <NODEFM ,UNWIND-CODE .PARENT <> + <1 .OBJ> () .AP>)) + #DECL ((PARENT VALUE TT) NODE (OBJ) FORM) + <COND (<==? <LENGTH .OBJ> 3> + <PUT .TT ,KIDS (<PCOMP <2 .OBJ> .TT> <PCOMP <3 .OBJ> .TT>)>) + (ELSE <MESSAGE ERROR "WRONG # OF ARGS TO UNWIND " .OBJ>)>> + +<PUT ,UNWIND PAPPLY-OBJECT ,UNWIND-FCN> + +"Build a node for a COND." + +<DEFINE COND-FCN (OBJ AP "AUX" (PARENT <NODECOND ,COND-CODE .PARENT <> COND ()>)) + #DECL ((PARENT) <SPECIAL NODE> (OBJ) <FORM ANY> (VALUE) NODE) + <PUT .PARENT ,KIDS + <MAPF ,LIST + <FUNCTION (CLA "AUX" (TT <NODEB ,BRANCH-CODE .PARENT <> <> ()>)) + #DECL ((TT) NODE) + <COND (<AND <TYPE? .CLA LIST> <NOT <EMPTY? .CLA>>> + <PUT .TT ,PREDIC <PCOMP <1 .CLA> .TT>> + <PUT .TT ,CLAUSES + <MAPF ,LIST + <FUNCTION (O) <PCOMP .O .TT>> + <REST .CLA>>>) + (ELSE <MESSAGE ERROR "BAD COND" .OBJ>)>> + <REST .OBJ>>>> + +<PUT ,COND PAPPLY-OBJECT ,COND-FCN> + +<PUT ,AND PAPPLY-OBJECT <GET SUBR PAPPLY-TYPE>> + +<PUT ,OR PAPPLY-OBJECT <GET SUBR PAPPLY-TYPE>> + +<PUT ,STACKFORM PAPPLY-OBJECT <GET SUBR PAPPLY-TYPE>> + +"Build a node for '<-object>-." + +<DEFINE QUOTE-FCN (OBJ AP "AUX" (TT <NODE1 ,QUOTE-CODE .PARENT <> () ()>)) + #DECL ((TT VALUE) NODE (OBJ) FORM) + <COND (<NOT <EMPTY? <REST .OBJ>>> + <PUT .TT ,RESULT-TYPE <TYPE <2 .OBJ>>> + <PUT .TT ,NODE-NAME <2 .OBJ>>)>> + +<PUT ,QUOTE PAPPLY-OBJECT ,QUOTE-FCN> + +"Build a node for a call to an RSUBR." + +<DEFINE RSUBR-FCN (OBJ AP "AUX" (PARENT <NODEFM ,RSUBR-CODE .PARENT <><1 .OBJ> () .AP>)) + #DECL ((OBJ) FORM (AP) <OR RSUBR-ENTRY RSUBR> (PARENT) <SPECIAL NODE> + (VALUE) NODE) + <COND (<AND <G? <LENGTH .AP> 2> + <TYPE? <3 .AP> DECL>> + <PUT .PARENT ,KIDS <PRSUBR-C <1 .OBJ> .OBJ <3 .AP>>> + <PUT .PARENT ,TYPE-INFO + <MAPF ,LIST + <FUNCTION (X) <RESULT-TYPE .X>> <KIDS .PARENT>>>) + (ELSE <PSUBR-C .OBJ .AP>)>> + +<PUT RSUBR PAPPLY-TYPE ,RSUBR-FCN> + +<PUT RSUBR-ENTRY PAPPLY-TYPE <GET RSUBR PAPPLY-TYPE>> + +<DEFINE INTERNAL-RSUBR-FCN (OBJ AP + "AUX" (PARENT <NODEFM ,IRSUBR-CODE .PARENT <> + <1 .OBJ> () .AP>)) + #DECL ((OBJ) FORM (AP) IRSUBR (PARENT) <SPECIAL NODE>) + <PUT .PARENT ,KIDS <PRSUBR-C <1 .OBJ> .OBJ <1 .AP>>> + <PUT .PARENT ,TYPE-INFO + <MAPF ,LIST + <FUNCTION (X) <RESULT-TYPE .X>> <KIDS .PARENT>>>> + +<PUT IRSUBR PAPPLY-TYPE ,INTERNAL-RSUBR-FCN> + +"Predicate: any segments in this object?" + +<DEFINE SEG? (OB) #DECL ((OB) <PRIMTYPE LIST>) + <REPEAT () + <AND <EMPTY? .OB> <RETURN <>>> + <AND <TYPE? <1 .OB> SEGMENT> <RETURN T>> + <SET OB <REST .OB>>>> + + +"Analyze a call to an RSUBR with decls checking number of args and types wherever + possible." + +<DEFINE PRSUBR-C (NAME OBJ RDCL + "AUX" (DOIT ,INIT-R) (SEGSW <>) (SGD '<>) (SGP '(1)) SGN + (IX 0) DC (RM ,RMODES) (ARG-NUMBER 0) (KDS (())) + (TKDS .KDS) RMT (OB <REST .OBJ>) (ST <>)) + #DECL ((TKDS KDS) <SPECIAL LIST> (OB) LIST (OBJ) <SPECIAL <PRIMTYPE LIST>> + (RM) <SPECIAL <VECTOR [REST STRING]>> (ARG-NUMBER) FIX + (RDCL) <SPECIAL <PRIMTYPE LIST>> (DOIT SEGSW) <SPECIAL ANY> (IX) FIX + (NAME) <SPECIAL ANY> (SGD) FORM (SGP) <LIST ANY> (SGN) NODE) + <REPEAT RSB () + #DECL ((RSB) <SPECIAL ACTIVATION>) + <COND + (<NOT <EMPTY? .RDCL>> + <COND (<NOT <EMPTY? .RM>> + <SET DC <1 .RDCL>> + <SET RDCL <REST .RDCL>>)> + <COND + (<TYPE? .DC STRING> + <COND (<=? .DC "OPT"> <SET DC "OPTIONAL">)> + <OR <SET RMT <MEMBER .DC .RM>> + <MESSAGE ERROR "BAD STRING IN RSUBR DECL " .NAME>> + <SET RM .RMT> + <SET DOIT <NTH ,RDOIT <SET IX <LENGTH .RM>>>> + <SET ST <APPLY <NTH ,SDOIT .IX> .ST>> + <COND (<EMPTY? .RM> ;"TUPLE seen." + <SET DC <GET-ELE-TYPE <1 .RDCL> ALL>>)>) + (<COND + (<EMPTY? .OB> + <AND <L? <LENGTH .RM> 4> <RETURN <REST .TKDS>>> + <MESSAGE ERROR " TOO FEW ARGS TO " .NAME>) + (.SEGSW + <SET ST <>> + <COND (<EMPTY? .RM> + <PUTREST .SGP ([REST .DC])> + <PUT .SGN ,RESULT-TYPE <TYPE-AND <RESULT-TYPE .SGN> .SGD>> + <RETURN <REST .TKDS>>) + (ELSE <SET SGP <REST <PUTREST .SGP (.DC)>>>)>) + (<TYPE? <1 .OB> SEGMENT> + <SET KDS + <REST <PUTREST .KDS (<SET SGN <SEGCHK <1 .OB>>>)>>> + <COND + (<EMPTY? <REST .OB>> + <COND (<EMPTY? .RM> + <PUT .SGN + ,RESULT-TYPE + <SEGCH1 .DC <RESULT-TYPE .SGN> <1 .OB>>> + <RETURN <REST .TKDS>>) + (ELSE <SET SEGSW T>)>) + (ELSE + <PUTREST + .KDS + <MAPF ,LIST + <FUNCTION (O "AUX" TT) + <SET TT <PCOMP .O .PARENT>> + <COND + (<EMPTY? .RM> + <COND + (<==? <NODE-TYPE .TT> ,SEGMENT-CODE> + <OR <TYPE-OK? <RESULT-TYPE <1 <KIDS .TT>>> + <FORM STRUCTURED [REST .DC]>> + <MESSAGE ERROR "BAD ARG TO " .NAME .OB>>) + (ELSE + <OR <TYPE-OK? <RESULT-TYPE .TT> .DC> + <MESSAGE ERROR "BAD ARG TO " .NAME .OB>> + <OR <RESULT-TYPE .TT> <PUT .TT ,RESULT-TYPE .DC>>)>)> + .TT> + <REST .OB>>> + <RETURN <REST .TKDS>>)> + <SET SGP + <REST <CHTYPE <SET SGD <FORM STRUCTURED .DC>> LIST>>> + <SET ST <>> + <AGAIN>) + (<SET KDS <REST <PUTREST .KDS (<APPLY .DOIT .DC .OB>)>>> + <SET OB <REST .OB>> + <SET ARG-NUMBER <+ .ARG-NUMBER 1>> + <SET ST <>>)>)>) + (<EMPTY? .OB> <RETURN <REST .TKDS>>) + (.SEGSW + <PUT .SGN + ,RESULT-TYPE + <COND (<RESULT-TYPE .SGN> <TYPE-AND <RESULT-TYPE .SGN> .SGD>) + (ELSE .SGD)>> + <RETURN <REST .TKDS>>) + (ELSE <MESSAGE ERROR " TOO MANY ARGS TO " .NAME>)>>> + + +<DEFINE SQUOT (F) T> + +"Flush one possible decl away." + +<DEFINE CHOPPER (F) #DECL ((RM) <VECTOR [REST STRING]>) + <AND .F <MESSAGE ERROR " 2 STRINGS IN ROW IN DCL ">> + <SET RM <REST .RM>> + T> + +"Handle Normal arg when \"VALUE\" still possible." + +<DEFINE INIT-R (DC OB) + #DECL ((RM) <VECTOR [REST STRING]>) + <SET RM <REST .RM 2>> <SET DOIT ,INIT1-R> <INIT1-R .DC .OB>> + +"Handle Normal arg when \"CALL\" still possible." + +<DEFINE INIT2-R (DC OB) + #DECL ((RM) <VECTOR [REST STRING]>) + <SET RM <REST .RM>> <SET DOIT ,INIT1-R> <INIT1-R .DC .OB>> + +"Handle normal arg." + +<DEFINE INIT1-R (DC OB "AUX" TT) #DECL ((TT) NODE (OB) LIST) + <OR <TYPE-OK? + <RESULT-TYPE + <SET TT <PCOMP <1 .OB> .PARENT>>> .DC> + <MESSAGE ERROR "BAD ARG TO " .NAME>> + <OR <RESULT-TYPE .TT><PUT .TT ,RESULT-TYPE .DC>> + .TT> + +"Handle \"QUOTE\" arg." + +<DEFINE QINIT-R (DC OB "AUX" TT) #DECL ((TT) NODE (OB) LIST) + <OR <TYPE-OK? + <RESULT-TYPE + <SET TT + <NODE1 ,QUOTE-CODE .PARENT <TYPE <1 .OB>> + <1 .OB> ()>>> .DC> + <MESSAGE ERROR "BAD ARG TO " .NAME>> + <SET DOIT ,INIT1-R> + .TT> + +"Handle \"CALL\" decl." + +<DEFINE CAL-R (DC OB "AUX" TT) #DECL ((TKDS KDS) LIST (TT) NODE) + <OR <TYPE-OK? + <RESULT-TYPE + <SET TT + <NODE1 ,QUOTE-CODE .PARENT FORM .OBJ ()>>> .DC> + <MESSAGE ERROR "BAD ARG TO " .NAME>> + <PUTREST .KDS (.TT)> + <RETURN <REST .TKDS> .RSB>> + +"Handle \"ARGS\" decl." + +<DEFINE ARGS-R (DC OB "AUX" TT) #DECL ((TT) NODE (KDS TKDS) LIST) + <OR <TYPE-OK? + <RESULT-TYPE + <SET TT + <NODE1 ,QUOTE-CODE .PARENT LIST .OB ()>>> .DC> + <MESSAGE "BAD CALL TO " .NAME>> + <PUTREST .KDS (.TT)> + <RETURN <REST .TKDS> .RSB>> + +"Handle \"TUPLE\" decl." + +<DEFINE TUPL-R (DC OB "AUX" TT) #DECL ((OB) LIST (TT) NODE) + <OR <TYPE-OK? <RESULT-TYPE <SET TT <PCOMP <1 .OB> .PARENT>>> .DC> + <MESSAGE ERROR "BAD ARG TO " .NAME>> + <OR <RESULT-TYPE .TT> <PUT .TT ,RESULT-TYPE .DC>> + .TT> + +"Handle stuff with segments in arguments." + +<DEFINE SEGCHK (OB "AUX" TT) #DECL ((TT) NODE) + <OR <TYPE-OK? <RESULT-TYPE <SET TT <PCOMP .OB .PARENT>>> STRUCTURED> + <MESSAGE ERROR "BAD SEGMENT GOODIE. " .OB>> + .TT> + + +<DEFINE SEGCH1 (DC RT OB) + <OR <TYPE-AND .RT <FORM STRUCTURED [REST .DC]>> + <MESSAGE ERROR "BAD ARG TO " .NAME .OB>>> + +"Handle \"VALUE\" chop decl and do the rest." + +<DEFINE VAL-R (F) #DECL ((RDCL) <PRIMTYPE LIST> (PARENT) NODE) + <CHOPPER .F> + <PUT .PARENT ,RESULT-TYPE <1 .RDCL>> + <SET DOIT ,INIT2-R> + <SET F <TYPE? <1 .RDCL> STRING>> + <SET RDCL <REST .RDCL>> .F> + +<DEFINE ERR-R (DC OB) + <MESSAGE INCONISTANCY "SHOULDN'T GET HERE ">> + +<SETG RMODES ["VALUE" "CALL" "QUOTE" "OPTIONAL" "QUOTE" "ARGS" "TUPLE"]> + +<SETG RDOIT ![,TUPL-R ,ARGS-R ,QINIT-R ,INIT1-R ,QINIT-R ,CAL-R ,ERR-R!]> + +<SETG SDOIT ![,CHOPPER ,CHOPPER ,SQUOT ,CHOPPER ,SQUOT ,CHOPPER ,VAL-R!]> + +<GDECL (RMODES) <VECTOR [REST STRING]> (RDOIT SDOIT) UVECTOR> + +"Create a node for a call to a function." + +<DEFINE PFUNC (OB AP "AUX" TEM NAME) + #DECL ((OB) <PRIMTYPE LIST> (VALUE) NODE) + <COND (<TYPE? <1 .OB> ATOM> + <COND (<OR <==? <1 .OB> .FCNS> + <AND <TYPE? .FCNS LIST> <MEMQ <1 .OB> <CHTYPE .FCNS LIST>>>> + <RSUBR-CALL2 ,<1 .OB> <1 .OB> .OB>) + (<SET TEM <GET <1 .OB> RSUB-DEC>> + <RSUBR-CALL3 .TEM <1 .OB> .OB>) + (.REASONABLE <PSUBR-C .OB DUMMY>) + (ELSE + <MESSAGE WARNING "UNCOMPILED FUNCTION CALLED " <1 .OB>> + <PAPDEF .OB ,<1 .OB>>)>) + (<TYPE? <1 .OB> FUNCTION> + <SET NAME <MAKE:TAG "ANONF">> + <ANONF .NAME <1 .OB>> + <RSUBR-CALL1 ,.NAME .NAME .OB>)>> + +"Call compiler recursively to compile anonymous function." + +<DEFINE ANONF (NAME BODY "AUX" (INT? <>) T GROUP-NAME) + #DECL ((INT? GROUP-NAME) <SPECIAL <OR FALSE ATOM>> (VALUE) NODE) + <MESSAGE NOTE " COMPILING ANONYMOUS FUNCTION "> + <SETG .NAME .BODY> + <APPLY ,COMP2 .NAME T> ; "Use APPLY to avoid compilation probs." + <SET T ,.NAME> + <MESSAGE NOTE " FINISHED ANONYMOUS FUNCTION "> + <GUNASSIGN .NAME> + <NODE1 ,QUOTE-CODE .PARENT RSUBR .T ()>> + +"#FUNCTION (....) compiler -- call ANONF." + +<DEFINE FCN-FCN (OB "AUX" (NAME <MAKE:TAG "ANONF">)) <ANONF .NAME .OB>> + +<PUT FUNCTION PTHIS-TYPE ,FCN-FCN> + +<PUT FUNCTION PAPPLY-TYPE ,PFUNC> + +"<FUNCTION (..) ....> compiler -- call ANONF." + +<DEFINE FCN-FCN1 (OB AP "AUX" (NAME <MAKE:TAG "ANONF">)) + #DECL ((OB) <PRIMTYPE LIST>) + <ANONF .NAME <CHTYPE <REST .OB> FUNCTION>>> + +<PUT ,FUNCTION PAPPLY-OBJECT ,FCN-FCN1> + +"Handle RSUBR that is really a function." + +<DEFINE RSUBR-CALL2 (BODY NAME OBJ "AUX" ACF + (PARENT <NODEFM ,RSUBR-CODE .PARENT <> .NAME () .BODY>)) + #DECL ((PARENT) <SPECIAL NODE> (VALUE) NODE) + <PUT .PARENT + ,KIDS + <PRSUBR-C .NAME .OBJ <RSUBR-DECLS <SET ACF <PASS1 .BODY .NAME T .NAME>>>>> + <PUT .PARENT ,TYPE-INFO + <MAPF ,LIST + <FUNCTION (X) <RESULT-TYPE .X>> <KIDS .PARENT>>>> + +"Handle an RSUBR that is already an RSUBR." + +<DEFINE RSUBR-CALL1 (BODY NAME OBJ "AUX" + (PARENT <NODEFM ,RSUBR-CODE .PARENT <> .NAME () .BODY>)) + #DECL ((BODY) <PRIMTYPE LIST> (PARENT) <SPECIAL NODE> + (VALUE) NODE) + <PUT .PARENT ,KIDS <PRSUBR-C .NAME .OBJ <3 .BODY>>> + <PUT .PARENT ,TYPE-INFO + <MAPF ,LIST + <FUNCTION (X) <RESULT-TYPE .X>> <KIDS .PARENT>>>> + +<DEFINE RSUBR-CALL3 (DC NAME OBJ "AUX" + (PARENT <NODEFM ,RSUBR-CODE .PARENT <> .NAME () FOO>)) + #DECL ((PARENT) <SPECIAL NODE> + (VALUE) NODE) + <PUT .PARENT ,KIDS <PRSUBR-C .NAME .OBJ .DC>> + <PUT .PARENT ,TYPE-INFO + <MAPF ,LIST + <FUNCTION (X) <RESULT-TYPE .X>> <KIDS .PARENT>>>> + + +;"ILIST, ISTRING, IVECTOR AND IUVECTOR" + +<DEFINE PLIST (O A) <PSTRUC .O .A ILIST LIST>> + +<PUT ,ILIST PAPPLY-OBJECT ,PLIST> + +<DEFINE PIVECTOR (O A) <PSTRUC .O .A IVECTOR VECTOR>> + +<PUT ,IVECTOR PAPPLY-OBJECT ,PIVECTOR> + +<DEFINE PISTRING (O A) <PSTRUC .O .A ISTRING STRING>> + +<PUT ,ISTRING PAPPLY-OBJECT ,PISTRING> + +<DEFINE PIUVECTOR (O A) <PSTRUC .O .A IUVECTOR UVECTOR>> + +<PUT ,IUVECTOR PAPPLY-OBJECT ,PIUVECTOR> + +<DEFINE PIFORM (O A) <PSTRUC .O .A IFORM FORM>> + +<PUT ,IFORM PAPPLY-OBJECT ,PIFORM> + +<DEFINE PIBYTES (O A) <PSTRUC .O .A IBYTES BYTES>> + +<PUT ,IBYTES PAPPLY-OBJECT ,PIBYTES> + +<DEFINE PSTRUC (OBJ AP NAME TYP "AUX" (TT <NODEFM ,ISTRUC-CODE .PARENT .TYP .NAME + () ,.NAME>) + (LN <LENGTH .OBJ>) N EV SIZ) + #DECL ((VALUE N EV TT) NODE (LN) FIX (OBJ) <PRIMTYPE LIST>) + <COND (<SEG? .OBJ><PSUBR-C .OBJ .AP>) + (ELSE + <COND (<==? .NAME IBYTES> + <COND (<L=? .LN 2> <ARGCHK 2 3 .NAME>) + (<G? .LN 4> <ARGCHK .LN 4 .NAME>)>) + (<1? .LN><ARGCHK 1 2 .NAME>) + (<G? .LN 3><ARGCHK .LN 3 .NAME>)> + <COND (<==? .NAME IBYTES> + <SET SIZ <PCOMP <2 .OBJ> .TT>> + <SET OBJ <REST .OBJ>> + <SET LN <- .LN 1>>)> + <SET N <PCOMP <2 .OBJ> .TT>> + <SET EV <PCOMP <COND (<==? .LN 3> <3 .OBJ>) + (<==? .TYP STRING> <ASCII 0>) + (<==? .TYP BYTES> 0) + (ELSE #LOSE 0)> .TT>> + <COND (<==? <NODE-TYPE .EV> ,QUOTE-CODE> + <SET EV <PCOMP <NODE-NAME .EV> .TT>> ;"Reanalyze it." + <PUT .TT ,NODE-TYPE ,ISTRUC2-CODE>)> + <PUT .TT ,RESULT-TYPE .TYP> + <COND (<ASSIGNED? SIZ> <PUT .TT ,KIDS (.SIZ .N .EV)>) + (ELSE <PUT .TT ,KIDS (.N .EV)>)>)>> + + + +"READ, READCHR, READSTRING, NEXTCHR, READB, GET, GETL, GETPROP, GETPL" + +<PUT ,READ PAPPLY-OBJECT <FUNCTION (O A) <CHANFCNS .O .A READ 2 ANY>>> + +<PUT ,GC-READ PAPPLY-OBJECT <FUNCTION (O A) <CHANFCNS .O .A GC-READ 2 ANY>>> + +<PUT ,READCHR PAPPLY-OBJECT <FUNCTION (O A) <CHANFCNS .O .A READCHR 2 ANY>>> + +<PUT ,NEXTCHR PAPPLY-OBJECT <FUNCTION (O A) <CHANFCNS .O .A NEXTCHR 2 ANY>>> + +<PUT ,READB PAPPLY-OBJECT <FUNCTION (O A) <CHANFCNS .O .A READB 3 ANY>>> + +<PUT ,READSTRING + PAPPLY-OBJECT + <FUNCTION (O A) <CHANFCNS .O .A READSTRING 4 ANY>>> + +<DEFINE CHANFCNS (OBJ AP NAME ARGN TYP "AUX" TT (LN <LENGTH .OBJ>) N (TEM 0)) + #DECL ((VALUE) NODE (TT) NODE (N) <LIST [REST NODE]> + (LN) FIX (TEM ARGN) FIX (OBJ) <PRIMTYPE LIST>) + <COND (<OR <SEG? .OBJ> <L? <- .LN 1> .ARGN>> + <PSUBR-C .OBJ .AP>) + (ELSE + <SET TT <NODEFM ,READ-EOF-CODE .PARENT .TYP .NAME () ,.NAME>> + <SET N + <MAPF ,LIST + <FUNCTION (OB "AUX" (EV <PCOMP .OB .TT>)) + #DECL ((EV) NODE) + <COND (<==? <SET TEM <+ .TEM 1>> .ARGN> + <COND (<==? <NODE-TYPE .EV> ,QUOTE-CODE> + <SET EV <PCOMP <NODE-NAME .EV> .TT>> + <PUT .TT ,NODE-TYPE ,READ-EOF2-CODE>)> + <SET EV + <NODE1 ,EOF-CODE .TT + <RESULT-TYPE .EV> <> (.EV)>>)> + .EV> + <REST .OBJ>>> + <PUT .TT ,KIDS .N>)>> + +<PUT ,GET PAPPLY-OBJECT <FUNCTION (O A) <GETFCNS .O .A GET>>> + +<PUT ,GETL PAPPLY-OBJECT <FUNCTION (O A) <GETFCNS .O .A GETL>>> + +<PUT ,GETPROP PAPPLY-OBJECT <FUNCTION (O A) <GETFCNS .O .A GETPROP>>> + +<PUT ,GETPL PAPPLY-OBJECT <FUNCTION (O A) <GETFCNS .O .A GETPL>>> + +<DEFINE GETFCNS (OBJ AP NAME "AUX" EV TEM T2 (LN <LENGTH .OBJ>) TT) + #DECL ((OBJ) FORM (LN) FIX (TT VALUE TEM T2 EV) NODE) + <COND (<OR <AND <N==? .LN 4> + <N==? .LN 3>> <SEG? .OBJ>> + <PSUBR-C .OBJ .AP>) + (ELSE + <SET TT <NODEFM ,GET-CODE .PARENT ANY .NAME () ,.NAME>> + <SET TEM <PCOMP <2 .OBJ> .TT>> + <SET T2 <PCOMP <3 .OBJ> .TT>> + <COND (<==? .LN 3> + <PUT .TT ,NODE-TYPE ,GET2-CODE> + <PUT .TT ,KIDS (.TEM .T2)>) + (ELSE + <SET EV <PCOMP <4 .OBJ> .TT>> + <COND (<==? <NODE-TYPE .EV> ,QUOTE-CODE> + <SET EV <PCOMP <NODE-NAME .EV> .TT>> + <PUT .TT ,NODE-TYPE ,GET2-CODE>)> + <PUT .TT ,KIDS (.TEM .T2 .EV)>)> + .TT)>> + +<DEFINE ARGCHK (GIV REQ NAME "AUX" (HI .REQ) (LO .REQ)) + #DECL ((GIV) FIX (REQ HI LO) <OR <LIST FIX FIX> FIX>) + <COND (<TYPE? .REQ LIST> + <SET HI <2 .REQ>> + <SET LO <1 .REQ>>)> + <COND (<L? .GIV .LO> + <MESSAGE ERROR "TOO FEW ARGS TO " .NAME>) + (<G? .GIV .HI> + <MESSAGE ERROR "TOO MANY ARGS TO " .NAME>)> T> + +<ENDPACKAGE> + diff --git a/<mdl.comp>/pcomp.load.13 b/<mdl.comp>/pcomp.load.13 new file mode 100644 index 0000000..508e9a9 --- /dev/null +++ b/<mdl.comp>/pcomp.load.13 @@ -0,0 +1,176 @@ +<SNAME "MDL.COMP"> + +<LINK '<ERRET T> "" <ROOT>> + +<PACKAGE "COMPDEC"> +<OR <ASSIGNED? PURE!-> <SET PURE!- T>> +<ENTRY BEGIN-HACK BEGIN-MHACK> +<LINK OP!-PACKAGE!- "OP" <2 .OBLIST>> + +<FLOAD "PS:<COMPIL>NEWOP.MUD"> +<FLOAD "PS:<COMPIL>BOPHAC.MUD"> +<FLOAD "PS:<COMPIL>MUDHAK.MUD"> + +<BEGIN-HACK "BTB"> + +<BEGIN-MHACK> + +<REMOVE "OP" <1 .OBLIST>> + +<ENDPACKAGE> + +<BLOCK (<ROOT>)> + +<SETG EXPERIMENTAL T> +<SET TEMPLATE-DATA T> + +GLUE PGLUE + +<COND (<NOT <ASSIGNED? SILENT!->><SET SILENT!- <>>)> + +<COND (<NOT .SILENT> <PRINC " LOADING MUDDLE COMPILER "> <TERPRI>)> +<ENDBLOCK> + +<BLOAT 100000 5000 100 1500 100> + +<PROG ((GLUE <COND (<ASSIGNED? GLUE> .GLUE)>)) #DECL ((GLUE) <SPECIAL ANY>) +<FLOAD "PS:<COMPIL>ASSEM.FBIN">> + +<PACKAGE "CODING" "IC"> + +<FLOAD "PS:<COMPIL>ATOSQ.NBIN"> +<SETG ONLY-FAST-OUTPUT T> + +<ENDPACKAGE> + +<SETG L-NOISY <>> +<SETG L-NO-DEFER T> + +<FLOAD "PS:<COMPIL>CONNECT-DIR.NBIN"> + +<CONNECT-DIR "PS:<COMPIL>"> + +<USE "MACROS" "SORTX" "DOW" "DATIME" "TIMFCN" "NOW" "DFL" "FINDATOM"> + +<CONNECT-DIR "SRC:<MDL.COMP>"> + +<PACKAGE "COMPDEC"> + +<LINK ASSEMBLE1!-CODING!-PACKAGE "ASSEMBLE1" <1 .OBLIST>> + +<FLOAD "PS:<COMPIL>WOFCH.FBIN"> +<FLOAD "PS:<COMPIL>POPWR2.FBIN"> + +<SETG DEATH T> + +<ENDPACKAGE> + +<FLOAD "COMPDE.FBIN"> +<FLOAD "BIGANA.FBIN"> + +<USE "PASS1" "CODGEN" "SYMANA" "CHKDCL" "MAPPS1" "CUP" "MAPANA" "MAPGEN" + "VARANA" "CARANA" "NEWREP" "BACKAN" "CBACK" "COMSUB" "CARGEN" "CONFOR" + "CDRIVE" "CPRINT" "COMTEM" "NOTANA" "NOTGEN" "STRANA" "STRGEN" "ALLR" + "LNQGEN" "MMQGEN" "ISTRUC" "INFCMP" "BITTST" "BITANA" "BITSGEN" "BUILDL" + "SPCGEN" "ADVMES" "CACS" "COMCOD" "NPRINT" "CASE" "PEEPH"> + + +<MAPF <> <FUNCTION (ATM "AUX" (O <OBLIST? .ATM>)) <INSERT <REMOVE .ATM> .O>> + '(LOGOUT ERROR ERRET QUIT COND AGAIN REP TAG REDEFINE VALRET T)> + +<PACKAGE "DUMP-C"> + +<USE "COMPDEC"> + +<DEFINE DUMP-COMP!- (N + "OPTIONAL" (GCQ T) (SN <SNAME>) UNM + "AUX" CH (SR .READ-TABLE)) + <UNASSIGN <GUNASSIGN READ-TABLE>> + <SETG OQ ,QUIT> + <SNAME ""> + <COND (<=? <FSAVE .N .GCQ> "SAVED"> + <SNAME .SN> + <SET READ-TABLE <SETG READ-TABLE .SR>>) + (<AND <OR <=? <SET UNM <UNAME>> "CLR"> + <=? .UNM "BTB"> + <=? .UNM "BKD"> + <=? .UNM "LIM"> + <=? .UNM "TAA">> + <OR <=? <SET SN <SNAME>> "COMPIL"> + <=? .SN "MDL.COMP">>> + <BEGIN-HACK "COMPIL"><BEGIN-MHACK> <RSUBR-LINK <>> + <PRINC "` and | hacks enabled. Rsubr-Link <>"> <CRLF>) + (ELSE + <SET SN <SNAME>> + <COND (<SET CH <OPEN "READ" <COND (<=? .UNM "COMBAT"> + "PCOMP.PLAN.-2") + ("PCOMP.PLAN")>>> + <LOAD .CH> + <QUIT>) + (ELSE + <CRLF>)>)> + <PRINC "MUDDLE COMPILER NOW READY."> + <CRLF> + T> + +<ENDPACKAGE> + +<INSERT <REMOVE COMPILE> <ROOT>> + +<INSERT <REMOVE COMPILE-GROUP> <ROOT>> + +<PACKAGE "COMPDEC"> + +<ENTRY DC UDC> +<LINK '<DC> "" <ROOT>> + +<DEFINE DC () +<USE-TOTAL "PASS1" "CODGEN" "SYMANA" "CHKDCL" "MAPPS1" "CUP" "MAPANA" "MAPGEN" + "VARANA" "CARANA" "NEWREP" "BACKAN" "CBACK" "COMSUB" "CARGEN" "CONFOR" + "CDRIVE" "CPRINT" "COMTEM" "NOTANA" "NOTGEN" "STRANA" "STRGEN" "ALLR" + "LNQGEN" "MMQGEN" "ISTRUC" "INFCMP" "BITTST" "BITANA" "BITSGEN" "BUILDL" + "SPCGEN" "ADVMES" "CACS" "COMCOD" "NPRINT" "CASE" "PEEPH" "COMPDEC">> + +<DC> + +<DEFINE C ("OPTIONAL" (N 0)) <PRT <REST .CODE:TOP .N>>> + +<PRIN-SET> + + +<FLOAD "PS:<COMPIL>PRIMHK.NBIN"> + +<FLOAD "PS:<COMPIL>PRNTYP"> + +<SETG EXPERIMENTAL T> + +<DEFINE UDC () +<DROP "PASS1" "CODGEN" "SYMANA" "CHKDCL" "MAPPS1" "CUP" "MAPANA" "MAPGEN" + "VARANA" "CARANA" "NEWREP" "BACKAN" "CBACK" "COMSUB" "CARGEN" "CONFOR" + "CDRIVE" "CPRINT" "COMTEM" "NOTANA" "NOTGEN" "STRANA" "STRGEN" "ALLR" + "LNQGEN" "MMQGEN" "ISTRUC" "INFCMP" "BITTST" "BITANA" "BITSGEN" "BUILDL" + "SPCGEN" "ADVMES" "CACS" "COMCOD" "NPRINT" "CASE" "PEEPH" "COMPDEC">> + +<ENDPACKAGE> + +<FLOAD "NCOMFI.MUD"> + +<PROG () <PRINC "Peep Hole optimizer enabled?"> + <SET PEEP!-PEEPH!-PACKAGE <ERROR>> + <CRLF> + <PRINC "KILL-COMP disabled"> + <CRLF> + <SETG KILL-COMP!-IFCOMPIL!-FCOMPIL!-PACKAGE ,TIME>> + +<DROP "MACROS" "SORTX" "DOW" "DATIME" "TIMFCN"> + +<DROP "PASS1" "CODGEN" "SYMANA" "CHKDCL" "MAPPS1" "CUP" "MAPANA" "MAPGEN" + "VARANA" "CARANA" "NEWREP" "BACKAN" "CBACK" "COMSUB" "CARGEN" "CONFOR" + "CDRIVE" "CPRINT" "COMTEM" "NOTANA" "NOTGEN" "STRANA" "STRGEN" "ALLR" + "LNQGEN" "MMQGEN" "ISTRUC" "INFCMP" "BITTST" "BITANA" "BITSGEN" "BUILDL" + "SPCGEN" "ADVMES" "CACS" "COMCOD" "NPRINT" "CASE" "PEEPH"> + +<RSUBR-LINK <>> +<USE "FCOMPIL"> +<SET DISOWN <>> + \ No newline at end of file diff --git a/<mdl.comp>/pcomp.pure.3 b/<mdl.comp>/pcomp.pure.3 new file mode 100644 index 0000000..69bf57f --- /dev/null +++ b/<mdl.comp>/pcomp.pure.3 @@ -0,0 +1,13 @@ +PGLUE!- +<SET PURE!- <SET SILENT!- <SET GLUE T>>> +<FLOAD "CMP:PCOMP.LOAD"> +<CONNECT-DIR "PS:<CLR>"> +<FLOAD "<CLR>CLEAN.MUD"> +<USE "CLEAN" "PURITY"> +<CLEANUP> +<CONNECT-DIR "SRC:<MDL.COMP>"> +<PROG ((FOO ,PURELST) (OUTCHAN <OPEN "PRINT" "FOO.OUT">)) + <GROUP-PURIFY FOO> + <UNASSIGN <REMOVE FOO>> + <FLUSH-CLEANUP> + <KILL:PURITY>> diff --git a/<mdl.comp>/pdmp.part.2 b/<mdl.comp>/pdmp.part.2 new file mode 100644 index 0000000..e3b64fb --- /dev/null +++ b/<mdl.comp>/pdmp.part.2 @@ -0,0 +1,29 @@ +CONN CMP: + + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "CODGEN.NBIN"> +<QUIT> +RES . + + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "STRGEN.NBIN"> +<QUIT> +RES . + + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "INFCMP.NBIN"> +<QUIT> +RES . + + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "NEWREP.NBIN"> +<QUIT> +RES . diff --git a/<mdl.comp>/pdmp.save.6 b/<mdl.comp>/pdmp.save.6 new file mode 100644 index 0000000000000000000000000000000000000000..9cb22a618fcd340da9dccee4557754e5f9e49208 GIT binary patch literal 184300 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 P$$_67_{o89Iq-h~7}3Bn literal 0 HcmV?d00001 diff --git a/<mdl.comp>/pdmp.xxfile.2 b/<mdl.comp>/pdmp.xxfile.2 new file mode 100644 index 0000000..75df133 --- /dev/null +++ b/<mdl.comp>/pdmp.xxfile.2 @@ -0,0 +1,279 @@ +CONN CMP: + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "ADVMES.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "ALLR.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "BACKAN.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "BITANA.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "BITSGE.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "BITTST.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "BUILDL.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "CACS.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "CACS.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "CARANA.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "CARGEN.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "CASE.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "CBACK.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "CDUP.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "CHKDCL.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "CODGEN.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "COMCOD.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "COMPDE.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "COMSUB.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "CUP.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "CUP.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "GETORD.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "INFCMP.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "INFCMP.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "ISTRUC.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "LNQGEN.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "MAPANA.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "MAPGEN.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "MAPPS1.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "MMQGEN.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "MMQGEN.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "NEWREP.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "NOTANA.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "NOTGEN.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "NPRINT.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "PASS1.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "PEEPH.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "PRCOD.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "PRNTYP.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "PUREQ.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "SBRNAM.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "STRANA.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "STRGEN.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "SUBRTY.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "SYMANA.NBIN"> +<QUIT> +RES . + +MDL105 +<RESTORE "PDMP"> +<DUMP-EM "VARANA.NBIN"> +<QUIT> +RES . + + diff --git a/<mdl.comp>/peeph.mud.92 b/<mdl.comp>/peeph.mud.92 new file mode 100644 index 0000000..3851ae2 --- /dev/null +++ b/<mdl.comp>/peeph.mud.92 @@ -0,0 +1,807 @@ +<PACKAGE "PEEPH"> + +<ENTRY PEEP PRT> + +<USE "COMPDEC"> + +"PEEPHOLE OPTIMIZER: IT WILL DO SEVERAL TYPES OF OPTIMIZATIONS ON THE + CODE OUTPUT BY THE COMPILER. THIS INCLUDES REMOVING UNREACHABLE CODE + REMOVE THE COPYING OF SIMILAR CODE AND OTHER MINOR OPTIMIZATIONS." + +<SETG INSTRUCTION ,FORM> + +<BLOCK (<ROOT>)> + +TMP + +<ENDBLOCK> + +<SETG SKIP-TBL ![4 5 6 7 0 1 2 3!]> + +<SETG TEST-TBL ![2 3 0 1!]> + +<MANIFEST SKIP-TBL TEST-TBL> + +<NEWTYPE LNODE VECTOR '<VECTOR LIST LIST <OR FALSE TUPLE> ATOM>> + +<SETG LABLS-LN 1> + +<SETG JUMPS-LN 2> + +<SETG CODE-LN 3> + +<SETG NAME-LN 4> + +<NEWTYPE NULL LIST> + +<SETG NULL-INST <CHTYPE () NULL>> + +<NEWTYPE JUMP-INS + LIST + '<LIST <PRIMTYPE WORD> FIX <OR 'T FALSE> <OR FALSE LNODE>>> + +<SETG INS-JMP 1> + +<SETG COND-JMP 2> + +<SETG UNCON-JMP 3> + +<SETG WHERE-JMP 4> + +<NEWTYPE SKIP-INS LIST '<LIST <PRIMTYPE WORD> + FIX + <OR 'T FALSE> + <OR 'T FALSE>>> + +<SETG INS-SKP 1> + +<SETG COND-SKP 2> + +<SETG TEST-SKP 3> + +<SETG UNCON-SKP 4> + +<MANIFEST LABLS-LN + JUMPS-LN + CODE-LN + NAME-LN + NULL-INST + INS-JMP + COND-JMP + UNCON-JMP + WHERE-JMP + INS-SKP + COND-SKP + TEST-SKP + UNCON-SKP> + +"CODE RANGES" + +<SETG JRST1 172> + +<SETG LOW-SKP1 192> + +<SETG HI-SKP1 207> + +<SETG LOW-JMP1 208> + +<SETG HI-JMP1 215> + +<SETG LO-SKP2 216> + +<SETG HI-SKP2 223> + +<SETG LO-JMP2 224> + +<SETG HI-JMP2 255> + +<SETG LO-TST1 384> + +<SETG HI-TST1 447> + +<MANIFEST JRST1 + LOW-SKP1 + HI-SKP1 + LOW-JMP1 + HI-JMP1 + LO-SKP2 + HI-SKP2 + LO-JMP2 + HI-JMP2 + LO-TST1 + HI-TST1> + +\ + +"PEEP STARTS BY BUILDING A CODE STRUCTURE WITH SKIPS AND JUMPS REPLACED BY THERE + EXPANDED INS-TYPES AND WITH JUMPS AND THIER LABELS LINKED UP WITH THE USE OF LNODES." + +<DEFINE PEEP (XCOD + "TUPLE" COD + "AUX" QXD (MODLN (())) NNCOD (LABNUM 0) (NUMLABS 0) (NNUMLABS 0) + NLN (LN <LENGTH .COD>) XD QD (SLABS ()) (TOPCOD .COD) + TEMP) + #DECL ((XCOD) LIST (SLABS MODLN) <SPECIAL LIST> (LABNUM) <SPECIAL FIX> + (NLN LN) FIX (NUMLABS NNUMLABS) <SPECIAL FIX>) + <REPEAT TG-FND ((CPTR .COD) AT) + #DECL ((CPTR) TUPLE) + <COND (<EMPTY? .CPTR> <RETURN>) + (<OR <TYPE? <SET AT <1 .CPTR>> ATOM> + <AND <TYPE? .AT FORM> + <==? <1 .AT> INTERNAL-ENTRY!-OP!-PACKAGE> + <SET AT <2 .AT>>> + <SET AT <PSEUDO? .AT>>> + <PUTREST <REST .MODLN <- <LENGTH .MODLN> 1>> + (<SET AT <CHTYPE [(.AT) () .CPTR .AT] LNODE>>)> + <SET NUMLABS <+ .NUMLABS 1>> + <REPEAT (IN) + <AND <EMPTY? <SET CPTR <REST .CPTR>>> + <RETURN T .TG-FND>> + <COND (<TYPE? <SET IN <1 .CPTR>> ATOM> + <PUT .AT ,LABLS-LN (.IN !<LABLS-LN .AT>)> + <SET NNUMLABS <+ .NNUMLABS 1>> + <PUT .CPTR 1 ,NULL-INST>) + (<RETURN>)>>) + (<SET CPTR <REST .CPTR>>)>> + <SET MODLN <REST .MODLN>> + <MAPR <> + <FUNCTION (RCOD "AUX" QD (INST <1 .RCOD>)) + #DECL ((QD) <OR FALSE LNODE> (RCOD) TUPLE) + <COND + (<TYPE? .INST FORM> + <SET INST <INSTYPE .INST>> + <COND (<TYPE? .INST JUMP-INS> + <SET XD <FIND-LAB <REST .INST 4>>> + <SET QD <COND (.XD <FIND-NOD .MODLN .XD>)>> + <AND .XD + <PROG FFA () + <COND (.QD + <PUT .INST ,WHERE-JMP .QD> + <PUT .RCOD 1 .INST> + <PUT .QD + ,JUMPS-LN + <ADDON (.RCOD) <JUMPS-LN .QD>>>) + (<SET QD <CHTYPE [(.XD) () <> .XD] LNODE>> + <SET MODLN (.QD !.MODLN)> + <AGAIN .FFA>)>>>) + (ELSE + <COND (<AND <SET XD <NFIND-LAB .INST>> + <SET XD <FIND-NOD .MODLN .XD>>> + <SET INST <MUNG-LAB .INST <NAME-LN .XD>>> + <SET SLABS (.XD !.SLABS)>)> + <PUT .RCOD 1 .INST>)>)>> + .COD> + <PROG REOPT ((NLABLS ()) (REDO <>)) + #DECL ((NLABLS) <SPECIAL LIST> (REDO) <SPECIAL <OR STRING FALSE ATOM>>) + <MAPR <> + <FUNCTION (NCOD "AUX" QD (INST <1 .NCOD>) (NNCOD .NCOD)) + #DECL ((NNCOD NCOD) TUPLE) + <COND + (<TYPE? .INST JUMP-INS> + <REPEAT (TMP AOJ-FLG NEWLAB) + <COND (<NOT <SET TMP <CODE-LN <WHERE-JMP .INST>>>> <RETURN>)> + <SET QD <NEXTS .TMP>> + <COND + (<AND <NOT <G? <INS-JMP .INST> ,LO-JMP2>> + <REPEAT ((NC .NNCOD)) + <COND (<==? .NC .TOPCOD> <RETURN>)> + <SET NC <BACK .NC>> + <COND (<NOT <TYPE? <1 .NC> ATOM NULL>> + <RETURN <NOT <SKIPPABLE <1 .NC>>>>)>> + <REPEAT ((NC .NNCOD)) + <COND (<EMPTY? <SET NC <REST .NC>>> <RETURN <>>) + (<==? .TMP .NC> <RETURN>) + (<NOT <TYPE? <1 .NC> ATOM NULL>> + <RETURN <==? .NC .TMP>>)>>> + <DEL-JUMP-LN .NNCOD> + <PUT .NNCOD 1 ,NULL-INST> + <SET REDO "REMOVED JUMP CHAINING"> + <RETURN>) + (<AND <TYPE? .QD JUMP-INS> <UNCON-JMP .QD>> + <COND (<NOT <AND <SET AOJ-FLG <G? <INS-JMP .QD> ,LO-JMP2>> + <OR <G? <INS-JMP .INST> ,LO-JMP2> + <NOT <UNCON-JMP .INST>>>>> + <DEL-JUMP-LN .NNCOD> + <SET NEWLAB <ADDON (.NNCOD) <JUMPS-LN <WHERE-JMP .QD>>>> + <COND (.AOJ-FLG + <PUT .NNCOD + 1 + <SET INST <CHTYPE <SUBSTRUC .QD> JUMP-INS>>>) + (ELSE + <PUT .INST ,WHERE-JMP <WHERE-JMP .QD>> + <PUT <WHERE-JMP .QD> ,JUMPS-LN .NEWLAB>)> + <SET REDO "REMOVED JUMP CHAINING">) + (<RETURN>)>) + (<RETURN>)>> + <COND + (<AND + <NOT <UNCON-JMP .INST>> + <REPEAT ((NC .NCOD)) + <COND + (<EMPTY? .NC> <RETURN <>>) + (<TYPE? <1 <SET NC <REST .NC>>> NULL>) + (<AND <TYPE? <1 <SET TEMP .NC>> JUMP-INS> + <==? <INS-JMP <1 .NC>> ,JRST1>> + <RETURN <==? <NEXTS <REST .NC> T> + <NEXTS <CODE-LN <WHERE-JMP .INST>> T>>>) + (ELSE <RETURN <>>)>> + <NOT <SKIPPABLE <BACKS .NCOD .TOPCOD <> 1>>>> + <DEL-JUMP-LN .NCOD> + <PUT .INST ,WHERE-JMP <WHERE-JMP <1 .TEMP>>> + <DEL-JUMP-LN .TEMP> + <PUT .TEMP 1 ,NULL-INST> + <PUT <WHERE-JMP .INST> + ,JUMPS-LN + <ADDON (.NCOD) <JUMPS-LN <WHERE-JMP .INST>>>> + <PUT .INST ,COND-JMP <NTH ,SKIP-TBL <+ <COND-JMP .INST> 1>>> + <SET REDO "OPTIMIZED CONDITIONAL JUMP/NON-COND JUMP">)>) + (<TYPE? .INST SKIP-INS> + <AND + <NOT <UNCON-SKP .INST>> + <REPEAT () + <COND + (<EMPTY? <SET NCOD <REST .NCOD>>> <RETURN>) + (<AND <OR <AND <TYPE? <SET QD <1 .NCOD>> SKIP-INS> + <NOT <TEST-SKP .QD>> + <UNCON-SKP .QD> + <NOT <TYPE? <BACKS .NCOD .TOPCOD <> 2> + SKIP-INS>>> + <AND <TYPE? .QD JUMP-INS> + <==? <INS-JMP .QD> ,JRST1> + <==? <REST <CODE-LN <WHERE-JMP .QD>>> + <NEXTS <REST .NCOD> T 2>> + <NOT <TYPE? <BACKS .NCOD .TOPCOD <> 2> SKIP-INS>> + <DEL-JUMP-LN .NCOD>>> + <PUT <BACKS .NCOD .TOPCOD T 1> 1 ,NULL-INST> + <PUT .NCOD 1 .INST> + <CHANGE-COND .INST> + <SET REDO "SKIP-CHAIN OPTIMIZATION"> + <RETURN>>) + (<NOT <TYPE? .QD NULL>> <RETURN>)>>> + <AND <TYPE? <SET XD <1 .NCOD>> JUMP-INS> + <NOT <TYPE? <BACKS .NCOD .TOPCOD <> 2> SKIP-INS>> + <UNCON-JMP .XD> + <SET QXD <WHERE-JMP .XD>> + <TYPE? <NEXTS <REST .NCOD>> SKIP-INS> + <TYPE? <SET XD <NEXTS <REST .NCOD> <> 2>> JUMP-INS> + <UNCON-JMP .XD> + <==? <WHERE-JMP .XD> .QXD> + <DEL-JUMP-LN .NCOD> + <PUT .NCOD 1 ,NULL-INST> + <CHANGE-COND .INST> + <SET REDO "OPTIMIZING CONDITIONAL JUMPS">>) + (<AND + <TYPE? .INST FORM> + <OR <==? <1 .INST> `ADDI > <==? <1 .INST> `SUBI >> + <==? <LENGTH .INST> 3> + <==? <3 .INST> 1> + <REPEAT (TEM) + <COND (<EMPTY? .NCOD> <RETURN>)> + <SET NCOD <REST .NCOD>> + <COND + (<TYPE? <SET QD <1 .NCOD>> JUMP-INS> + <COND + (<OR <==? <INS-JMP .QD> ,JRST1> + <AND <G=? <INS-JMP .QD> ,LOW-JMP1> + <L=? <INS-JMP .QD> ,HI-JMP1> + <G=? <LENGTH .QD> 5> + <==? <2 .INST> <5 .QD>>>> + <PUT <BACK .NCOD> 1 ,NULL-INST> + <PUT + .NCOD + 1 + <SET TEM + <INSTYPE + <INSTRUCTION + <COND + (<==? <INS-JMP .QD> ,JRST1> + <COND (<==? <1 .INST> `ADDI > `AOJA ) (ELSE `SOJA )>) + (<==? <1 .INST> `ADDI > + <CHTYPE <PUTBITS 0 + <BITS 9 27> + <+ <CHTYPE <INS-JMP .QD> FIX> 16>> + OPCODE!-OP!-PACKAGE>) + (ELSE + <CHTYPE <PUTBITS 0 + <BITS 9 27> + <+ <CHTYPE <INS-JMP .QD> FIX> 32>> + OPCODE!-OP!-PACKAGE>)> + <2 .INST> + <OR <AND <WHERE-JMP .QD> <NAME-LN <WHERE-JMP .QD>>> + <NFIND-LAB <REST .QD 4>>>>>>> + <PUT .TEM ,WHERE-JMP <WHERE-JMP .QD>> + <SET REDO "ADDI OR SUBI FOLLOWED BY A JUMP"> + <RETURN <>>) + (<RETURN>)>) + (<TYPE? .QD NULL>) + (<RETURN>)>>> + <SET NCOD .NNCOD> + <REPEAT () + <AND <==? .NCOD .TOPCOD> <RETURN>> + <SET NCOD <BACK .NCOD>> + <COND + (<TYPE? <SET QD <1 .NCOD>> NULL>) + (<TYPE? .QD ATOM> + <SET QD <FIND-NOD .MODLN .QD>> + <COND + (<MAPF <> + <FUNCTION (X) + <COND (<NOT <OR <TYPE? <1 .X> NULL> + <==? <INS-JMP <1 .X>> ,JRST1>>> + <MAPLEAVE <>>) + (T)>> + <JUMPS-LN .QD>> + <SET REDO "JUMP TO AN ADDI OR SUBI"> + <PUT .NCOD 1 <1 .NNCOD>> + <PUT .NNCOD 1 <NAME-LN .QD>> + <MAPF <> + <FUNCTION (X + "AUX" (IT + <COND (<==? <1 .INST> `ADDI > `AOJA ) + (ELSE `SOJA )>)) + <PUT + .X + 1 + <PUT <INSTYPE <INSTRUCTION + .IT <2 .INST> <NAME-LN .QD>>> + ,WHERE-JMP + .QD>>> + <JUMPS-LN .QD>>)> + <RETURN>) + (<RETURN>)>>) + (<AND <TYPE? .INST FORM> + <==? <1 .INST> DEALLOCATE> + <TYPE? <SET XD <1 <REST .NCOD>>> FORM> + <==? <1 .XD> DEALLOCATE>> + <PUT .NCOD 1 ,NULL-INST> + <PUT .XD 2 (!<2 .XD> !<2 .INST>)>)>> + .COD> + <MAPF <> + <FUNCTION (LN "AUX" (COMPS <JUMPS-LN .LN>)) + #DECL ((LN) LNODE) + <COND + (<NOT <EMPTY? .COMPS>> + <SET COMPS + <MAPF ,LIST + <FUNCTION (CMP) + #DECL ((CMP) TUPLE) + <COND (<AND <UNCON-JMP <1 .CMP>> + <==? <INS-JMP <1 .CMP>> ,JRST1>> + <MAPRET .CMP>) + (<MAPRET>)>> + .COMPS>> + <AND <CODE-LN .LN> <CROSS-OPT .TOPCOD <CODE-LN .LN> !.COMPS>> + <SET COMPS <JUMPS-LN .LN>> + <SET COMPS + <MAPF ,LIST + <FUNCTION (CMP) + #DECL ((CMP) TUPLE) + <COND (<AND <UNCON-JMP <1 .CMP>> + <==? <INS-JMP <1 .CMP>> ,JRST1>> + <MAPRET .CMP>) + (<MAPRET>)>> + .COMPS>> + <MAPR <> + <FUNCTION (CMP) + #DECL ((CMP) LIST) + <CROSS-OPT .TOPCOD <1 .CMP> !<REST .CMP>>> + .COMPS>)>> + .MODLN> + <SET MODLN <CLEAN-IT-UP .MODLN>> + <MAPR <> + <FUNCTION (NCOD "AUX" (INST <1 .NCOD>)) + #DECL ((NCOD) TUPLE) + <COND + (<AND <OR <AND <TYPE? .INST JUMP-INS> <UNCON-JMP .INST>> + <AND <TYPE? .INST FORM> + <==? <1 .INST> `JRST > + <NOT <=? <2 .INST> '.HERE!-OP!-PACKAGE>>>> + <REPEAT ((NC <BACK .NCOD>)) + <COND (<TYPE? <1 .NC> ATOM NULL> + <COND (<==? .NC .TOPCOD> <RETURN T>) + (<SET NC <BACK .NC>>)>) + (<RETURN <NOT <SKIPPABLE <1 .NC>>>>)>>> + <REPEAT () + <COND + (<EMPTY? <SET NCOD <REST .NCOD>>> <RETURN>) + (<OR + <TYPE? <SET QD <1 .NCOD>> ATOM> + <AND <TYPE? .QD FORM> + <OR <==? <1 .QD> INTERNAL-ENTRY!-OP!-PACKAGE> + <PSEUDO? .QD> + <AND <TYPE? <1 .QD> ATOM> + <OR <FIND-NOD .MODLN <1 .QD>> + <NOT <GASSIGNED? <1 .QD>>>>>>> + <MAPF <> + <FUNCTION (LN) + #DECL ((LN) LNODE) + <COND (<AND <NOT <EMPTY? <JUMPS-LN .LN>>> + <==? <CODE-LN .LN> .NCOD>> + <MAPLEAVE>)>> + .MODLN>> + <RETURN>) + (<TYPE? .QD NULL>) + (ELSE + <COND (<TYPE? <1 .NCOD> JUMP-INS> <DEL-JUMP-LN .NCOD>)> + <PUT .NCOD 1 ,NULL-INST> + <SET REDO "FLUSH UNREACHABLE CODE">)>>)>> + .COD> + <SET MODLN <FLUSH-LABELS .MODLN>> + <REPEAT FFY ((PTR1 <REST .COD <- <LENGTH .COD> 1>>) + (PTR2 <REST .COD <- <LENGTH .COD> 1>>) XD) + #DECL ((PTR2 PTR1) TUPLE) + <MAPF <> + <FUNCTION (X) <COND (<==? <2 .X> .PTR1> <PUT .X 2 .PTR2>)>> + .NLABLS> + <COND (<TYPE? <SET XD <1 .PTR1>> NULL>) + (<PUT .PTR2 1 .XD> + <COND (<TYPE? .XD ATOM> + <AND <SET XD <FIND-NOD .MODLN .XD>> + <PUT .XD ,CODE-LN .PTR2>>) + (<TYPE? .XD JUMP-INS> + <PUT <MEMQ .PTR1 <JUMPS-LN <WHERE-JMP .XD>>> + 1 + .PTR2>)> + <SET PTR2 <BACK .PTR2>>)> + <COND (<==? .PTR1 .TOPCOD> + <REPEAT () + <COND (<==? .PTR2 .TOPCOD> + <PUT .PTR2 1 ,NULL-INST> + <RETURN T .FFY>) + (<PUT .PTR2 1 ,NULL-INST> + <SET PTR2 <BACK .PTR2>>)>>) + (<SET PTR1 <BACK .PTR1>>)>> + <REPEAT (P1 (PTR1 .COD) (PTR2 .COD)) + <COND (<EMPTY? .PTR1> + <MAPR <> <FUNCTION (X) <PUT .X 1 ,NULL-INST>> .PTR2> + <RETURN>)> + <MAPF <> + <FUNCTION (X) + <COND (<==? <2 .X> .PTR1> + <SET NNUMLABS <- .NNUMLABS 1>> + <PUT .PTR2 1 <1 .X>> + <PUT <FIND-NOD .MODLN <1 .X>> ,CODE-LN .PTR2> + <SET PTR2 <REST .PTR2>>)>> + .NLABLS> + <COND (<TYPE? <SET P1 <1 .PTR1>> NULL>) + (ELSE + <COND (<NOT .REDO> <PUT .PTR2 1 <INSFIX .P1>>) + (<PUT .PTR2 1 .P1>)> + <COND (<TYPE? .P1 ATOM> + <AND <SET XD <FIND-NOD .MODLN .P1>> + <PUT .XD ,CODE-LN .PTR2>>) + (<TYPE? .P1 JUMP-INS> + <PUT <MEMQ .PTR1 <JUMPS-LN <WHERE-JMP .P1>>> + 1 + .PTR2>)> + <SET PTR2 <REST .PTR2>>)> + <SET PTR1 <REST .PTR1>>> + <COND (.REDO <SET NLABLS ()> <SET REDO <>> <AGAIN .REOPT>) + (ELSE + <SET NLN + <REPEAT ((N 0)) + <COND (<EMPTY? .COD> <RETURN .N>) + (<TYPE? <1 .COD> NULL>) + (ELSE + <PUT .XCOD 1 <1 .COD>> + <SET NNCOD .XCOD> + <SET XCOD <REST .XCOD>> + <SET N <+ .N 1>>)> + <SET COD <REST .COD>>>> + <OR <EMPTY? .NNCOD> <PUTREST .NNCOD ()>>)>> + <COND (<AND <ASSIGNED? PEEP> .PEEP> + <PEEP-PRINT .LN .NLN .NUMLABS .NNUMLABS>)>> + +\ + +<DEFINE INSTYPE (INST "AUX" AT QX QY) + #DECL ((QX) <PRIMTYPE WORD>) + <COND + (<AND <TYPE? .INST FORM> + <TYPE? <SET AT <1 .INST>> OPCODE!-OP!-PACKAGE> + <SET QX <CHTYPE <GETBITS .AT <BITS 9 27>> FIX>> + <OR <==? .QX ,JRST1> + <AND <G=? .QX ,LOW-SKP1> <L=? .QX ,HI-JMP2>>>> + <SET QY <CHTYPE <GETBITS .QX <BITS 6 3>> FIX>> + <COND (<AND <OR <==? .QX ,JRST1> <AND <N==? .QY 24> <0? <MOD .QY 2>>>> + <NOT <0? <SET QY <CHTYPE <GETBITS .QX <BITS 3>> FIX>>>>> + <CHTYPE (.QX .QY <==? .QY 4> <> !<REST .INST>) JUMP-INS>) + (<NOT <0? <SET QY <CHTYPE <GETBITS .QX <BITS 3>> FIX>>>> + <CHTYPE (.QX .QY <> <==? .QY 4> !<REST .INST>) SKIP-INS>) + (.INST)>) + (<AND <ASSIGNED? QX> + <G=? .QX ,LO-TST1> + <L=? .QX ,HI-TST1> + <NOT <0? <SET QY <CHTYPE <GETBITS .QX <BITS 2 1>> FIX>>>>> + <CHTYPE (.QX .QY T <==? .QY 2> !<REST <CHTYPE .INST LIST>>) + SKIP-INS>) + (.INST)>> + +<DEFINE NFIND-LAB (INST) + <COND (<TYPE? .INST ATOM> .INST) + (<MONAD? .INST> <>) + (<MAPF <> + <FUNCTION (X) + <COND (<SET X <NFIND-LAB .X>> <MAPLEAVE .X>)>> + .INST>)>> + +<DEFINE FIND-NOD (MD AT) + #DECL ((MD) LIST (AT) ATOM) + <MAPF <> + <FUNCTION (X) + #DECL ((X) LNODE) + <COND (<MEMQ .AT <LABLS-LN .X>> <MAPLEAVE .X>)>> + .MD>> + +<DEFINE INSFIX (X "AUX" XD) + <COND + (<TYPE? .X JUMP-INS> + <INSTRUCTION + <CHTYPE <PUTBITS #WORD *000000000000* + <BITS 9 27> + <CHTYPE <ORB <ANDB <INS-JMP .X> 504> <COND-JMP .X>> FIX>> + OPCODE!-OP!-PACKAGE> + !<COND (<==? <LENGTH <SET XD <REST .X 4>>> 2> + (<1 .XD> <NAME-LN <WHERE-JMP .X>>)) + (ELSE (<NAME-LN <WHERE-JMP .X>>))>>) + (<TYPE? .X SKIP-INS> + <INSTRUCTION + <COND (<TEST-SKP .X> + <CHTYPE <PUTBITS #WORD *000000000000* + <BITS 9 27> + <CHTYPE <ORB <ANDB <INS-SKP .X> 505> + <* <COND-SKP .X> 2>> + FIX>> + OPCODE!-OP!-PACKAGE>) + (ELSE + <CHTYPE <PUTBITS #WORD *000000000000* + <BITS 9 27> + <CHTYPE <ORB <ANDB <INS-SKP .X> 504> + <COND-SKP .X>> + FIX>> + OPCODE!-OP!-PACKAGE>)> + !<REST .X 4>>) + (ELSE .X)>> + +<DEFINE PRT (X) + #DECL ((X) STRUCTURED) + <MAPF <> + <FUNCTION (X) + <COND (<TYPE? .X ATOM>) (ELSE <PRINC " ">)> + <PRIN1 .X> + <CRLF>> + .X>> + +<DEFINE CROSS-OPT (TOPCOD NCOD "TUPLE" COMPS "AUX" NEWLN) + #DECL ((TOPCOD NCOD) TUPLE (COMPS) TUPLE (MODLN NLABS) LIST) + <REPEAT (QD LABL (CNT 0) (NEEDLABEL T)) + #DECL ((CNT) FIX (COMPS) TUPLE) + <AND <==? .NCOD .TOPCOD> <RETURN>> + <SET NCOD <BACK .NCOD>> + <MAPR <> + <FUNCTION (XD "AUX" (XR <1 .XD>)) + #DECL ((XD) TUPLE (XR) <OR TUPLE NULL>) + <COND (<TYPE? .XR NULL>) + (<==? .XR .TOPCOD>) + (ELSE + <REPEAT () + <PUT .XD 1 <SET XR <BACK .XR>>> + <SET CNT -1> + <COND (<TYPE? <1 .XR> NULL>) (<RETURN>)>>)>> + .COMPS> + <COND (<0? .CNT> <RETURN>) (<SET CNT 0>)> + <COND (.NEEDLABEL <SET LABL <MAKE:LABEL>> <SET NEEDLABEL <>>)> + <SET NEWLN <CHTYPE [(.LABL) () .NCOD .LABL] LNODE>> + <SET QD <1 .NCOD>> + <COND (<OR <SKIPPABLE <1 <BACK .NCOD>>> <SKIPPABLE <1 .NCOD>>> <RETURN>)> + <MAPR <> + <FUNCTION (NPCOD "AUX" (NNCOD <1 .NPCOD>) ITEM) + #DECL ((NPCOD) TUPLE (NNCOD) <OR NULL TUPLE>) + <COND (<TYPE? .NNCOD NULL>) + (<SET ITEM <1 .NNCOD>> + <COND (<AND <N==? .NCOD .NNCOD> <=? .ITEM .QD>> + <SET NEEDLABEL T> + <COND (<TYPE? <1 .NNCOD> JUMP-INS> + <DEL-JUMP-LN .NNCOD>)> + <COND (<==? .NCOD <NEXTS <REST .NNCOD> T>> + <PUT .NNCOD 1 ,NULL-INST>) + (ELSE + <PUT .NNCOD + 1 + <CHTYPE (,JRST1 4 T .NEWLN .LABL) + JUMP-INS>> + <PUT .NEWLN + ,JUMPS-LN + (.NNCOD !<JUMPS-LN .NEWLN>)>)> + <SET REDO "CROSS-OPTIMIZATION"> + <SET CNT -1>) + (<PUT .NPCOD 1 ,NULL-INST>)>)>> + .COMPS> + <COND (<NOT <0? .CNT>> + <SET NLABLS ((.LABL .NCOD) !.NLABLS)> + <SET MODLN (.NEWLN !.MODLN)>)> + <COND (<0? .CNT> <RETURN>) (<SET CNT 0>)>>> + +<DEFINE FF (X) #DECL ((X) STRUCTURED) <MAPF <> ,& .X> <CRLF>> + +"ROUTINE TO DETERMINE WHETHER AN INSTRUCTION CAN SKIP" + +<DEFINE HACK-PRINT (X) <PRIN1 <INSFIX .X>>> + +<DEFINE SKIPPABLE (INST) + <OR <TYPE? .INST SKIP-INS> + <AND <TYPE? .INST FORM> + <OR <==? <1 .INST> `XCT > + <==? <1 .INST> `PUSHJ > + <AND <G=? <LENGTH .INST> 2> + <MEMBER '.HERE!-OP!-PACKAGE .INST>>>>>> + +"ROUTINE TO DELETE A JUMP-LN FROM AN LNODE." + +<DEFINE DEL-JUMP-LN (COD "AUX" XD QD (JMP <1 .COD>)) + #DECL ((JMP) JUMP-INS (COD) TUPLE (XD QD) <OR FALSE LIST>) + <COND (<SET XD <MEMQ .COD + <SET QD <JUMPS-LN <CHTYPE <WHERE-JMP .JMP> + LNODE>>>>> + <COND (<==? .QD .XD> <PUT <CHTYPE <WHERE-JMP .JMP> LNODE> + ,JUMPS-LN <REST .XD>>) + (ELSE + <PUTREST <REST .QD <- <LENGTH .QD> <LENGTH .XD> 1>> + <REST .XD>>)> + T)>> + +<DEFINE CHANGE-COND (INST) + #DECL ((INST) SKIP-INS) + <PUT .INST + ,COND-SKP + <COND (<TEST-SKP .INST> <NTH ,TEST-TBL <+ <COND-SKP .INST> 1>>) + (<NTH ,SKIP-TBL <+ <COND-SKP .INST> 1>>)>>> + +<DEFINE MAKE:LABEL ("AUX" XX) #DECL ((LABNUM) FIX) + <OR <LOOKUP <SET XX + <STRING "OPT" <UNPARSE <SET LABNUM <+ .LABNUM 1>>>>> + <GET TMP OBLIST>> + <INSERT .XX <GET TMP OBLIST>>>> + +<DEFINE NEXTS (XX "OPTIONAL" (XT <>) (NN 1) "AUX" XR) + #DECL ((XX) TUPLE (NN) FIX) + <REPEAT () + <COND (<TYPE? <SET XR <1 .XX>> NULL ATOM>) + (<0? <SET NN <- .NN 1>>> <RETURN .XR>)> + <AND <EMPTY? <SET XX <REST .XX>>> + <SET XX <BACK .XX>> + <RETURN .XR>>> + <COND (.XT .XX) (ELSE .XR)>> + +<DEFINE BACKS (XX TOPCOD "OPTIONAL" (XT <>) (NN 1) "AUX" XR) + #DECL ((XX TOPCOD) TUPLE (NN) FIX) + <REPEAT () + <AND <==? <SET XX <BACK .XX>> .TOPCOD> <RETURN .XR>> + <COND (<TYPE? <SET XR <1 .XX>> NULL ATOM>) + (<0? <SET NN <- .NN 1>>> <RETURN .XR>)>> + <COND (.XT .XX)(ELSE .XR)>> + + +<DEFINE ADDON (AD OB) + #DECL ((AD OB) <PRIMTYPE LIST>) + <COND (<EMPTY? .OB> .AD) + (ELSE <PUTREST <REST .OB <- <LENGTH .OB> 1>> .AD> .OB)>> + +<DEFINE FIND-LAB (INST) + <MAPF <> + <FUNCTION (X) <COND (<TYPE? .X ATOM> <MAPLEAVE .X>)>> + .INST>> + +<DEFINE PSEUDO? (AT) + #DECL ((VALUE) <OR ATOM FALSE>) + <AND <TYPE? .AT FORM> + <==? <1 .AT> PSEUDO!-OP!-PACKAGE> + <==? <LENGTH .AT> 2> + <TYPE? <SET AT <2 .AT>> FORM> + <==? <LENGTH .AT> 3> + <==? <1 .AT> SETG> + <=? <3 .AT> '<ANDB 262143 <CHTYPE .HERE!-OP!-PACKAGE FIX>>> + <2 .AT>>> + +<DEFINE MUNG-LAB (INST ATM) + <COND (<TYPE? .INST ATOM> .ATM) + (<MONAD? .INST> <>) + (ELSE + <MAPR <> + <FUNCTION (IN "AUX" (OB <1 .IN>)) + <COND (<SET OB <MUNG-LAB .OB .ATM>> + <PUT .IN 1 .OB> + <MAPLEAVE <>>)>> + .INST> + .INST)>> + +<PRINTTYPE SKIP-INS ,HACK-PRINT> + +<PRINTTYPE JUMP-INS ,HACK-PRINT> + +<DEFINE PEEP-PRINT (LN NLN NUMLABS NNUMLABS) + <COND (<NOT <ASSIGNED? OUTL>> + <PRINC "Peephole "> + <SET LN <- .LN .NUMLABS>> + <SET NLN <- .NLN .NUMLABS <- .NNUMLABS>>> + <PRIN1 <FIX <* 100 </ <FLOAT <- .LN .NLN>> .LN>>>> + <PRINC "% "> + <PRIN1 .LN> + <PRINC "/"> + <PRIN1 .NLN>) + (ELSE + <PRINLC "Peephole "> + <SET LN <- .LN .NUMLABS>> + <SET NLN <- .NLN .NUMLABS <- .NNUMLABS>>> + <PRINL1 <FIX <* 100 </ <FLOAT <- .LN .NLN>> .LN>>>> + <PRINLC "% "> + <PRINL1 .LN> + <PRINLC "/"> + <PRINL1 .NLN>)>> + +<DEFINE CLEAN-IT-UP (MDLN) + #DECL ((MDLN) <LIST [REST LNODE]>) + <MAPF <> + <FUNCTION (LND "AUX" JMP FIN-LNODE) + #DECL ((LND) LNODE) + <COND + (<OR <AND <TYPE? <SET JMP <1 <CODE-LN .LND>>> JUMP-INS> + <UNCON-JMP .JMP> + <SET FIN-LNODE <FIND-END-OF-CHAIN .JMP>>> + <AND <TYPE? <SET JMP <1 <BACK <CODE-LN .LND>>>> ATOM> + <SET JMP <FIND-NOD .MDLN .JMP>> + <==? <CODE-LN .JMP> <BACK <CODE-LN .LND>>> + <SET FIN-LNODE .JMP>>> + <MAPF <> + <FUNCTION (JMPL "AUX" JMP) + #DECL ((JMPL) TUPLE (JMP) JUMP-INS) + <DEL-JUMP-LN .JMPL> + <SET JMP <1 .JMPL>> + <PUT .JMP ,WHERE-JMP .FIN-LNODE> + <PUT .FIN-LNODE + ,JUMPS-LN + <ADDON (.JMPL) <JUMPS-LN .FIN-LNODE>>>> + <JUMPS-LN .LND>>)>> + .MDLN> + <FLUSH-LABELS .MDLN>> + +<DEFINE FIND-END-OF-CHAIN (JMP "AUX" (DEFAULT <WHERE-JMP .JMP>)) + #DECL ((JMP) JUMP-INS) + <REPEAT (NJMP) + <COND (<TYPE? <SET NJMP <1 <CODE-LN <WHERE-JMP .JMP>>>> + JUMP-INS> + <SET DEFAULT <WHERE-JMP .JMP>> + <SET JMP .NJMP>) + (<RETURN .DEFAULT>)>>> + +<DEFINE FLUSH-LABELS (MODLN "AUX" (TEM ())) + #DECL ((MODLN) LIST (SLABS) <LIST [REST LNODE]> (NLABLS) <LIST [REST LIST]> + (NNUMLABS) FIX) + <MAPR <> + <FUNCTION (Y "AUX" (X <1 .Y>)) #DECL ((Y) <LIST LNODE [REST LNODE]> + (X) LNODE) + <COND (<AND <NOT <MEMQ .X .SLABS>> + <EMPTY? <JUMPS-LN .X>> + <CODE-LN .X>> + <REPEAT ((N .NLABLS) N1 (LL <LABLS-LN .X>)) + #DECL ((N1 N) <LIST [REST LIST]> + (LL) <LIST [REST ATOM]>) + <AND <EMPTY? .N> <RETURN>> + <COND (<MEMQ <1 <1 .N>> .LL> + <COND (<==? .N .NLABLS> + <SET NLABLS <REST .NLABLS>>) + (ELSE <PUTREST .N1 <REST .N>>)> + <RETURN>)> + <SET N <REST <SET N1 .N>>>> + <COND (<==? .Y .MODLN> <SET MODLN <REST .MODLN>>) + (ELSE <PUTREST .TEM <REST .Y>> <SET Y .TEM>)> + <COND (<==? <NAME-LN .X> <1 <CODE-LN .X>>> + <PUT <CODE-LN .X> 1 ,NULL-INST> + <SET NNUMLABS <+ .NNUMLABS 1>>)> + <SET REDO "FLUSH REDUNDANT LABELS">)> + <SET TEM .Y>> + .MODLN> + .MODLN> + +<ENDPACKAGE> + \ No newline at end of file diff --git a/<mdl.comp>/peeph.record.92 b/<mdl.comp>/peeph.record.92 new file mode 100644 index 0000000..ddf81ed --- /dev/null +++ b/<mdl.comp>/peeph.record.92 @@ -0,0 +1,276 @@ +Compilation record for: SRC:<MDL.COMP>PEEPH.MUD.92;P777752;ADM +Output file: SRC:<MDL.COMP>PEEPH.NBIN.92 +File loaded. +Functions ordered. +COMPILING INSTYPE!-IPEEPH!-PEEPH!-PACKAGE +===== Computed decl of variable: QX!-IPEEPH!-PEEPH!-PACKAGE is: FIX +===== Computed decl of variable: QY!-IPEEPH!-PEEPH!-PACKAGE is: FIX +Peephole 3% 144/139 +Job done in: 12 / 22 + COMPILING NFIND-LAB!-IPEEPH!-PEEPH!-PACKAGE +===== Non-specific structure for MAPF/R: **** .INST!-IPEEPH!-PEEPH!-PACKAGE ** +** + type is: STRUCTURED + **** <MAPF #FALSE () <FUNCTION ("AUX" X) #DECL ((VALUE) FALSE) <COND (<SET X + ... +Peephole 4% 67/64 +Job done in: 5 / 9 + COMPILING FIND-NOD!-IPEEPH!-PEEPH!-PACKAGE +Peephole 0% 45/45 +Job done in: 5 / 7 +COMPILING INSFIX!-IPEEPH!-PEEPH!-PACKAGE +===== Computed decl of variable: XD!-IPEEPH!-PEEPH!-PACKAGE is: LIST +===== Not open compiled because type is: <OR FALSE +LNODE!-IPEEPH!-PEEPH!-PACKAGE> +<LIST <1 .XD!-IPEEPH!-PEEPH!-PACKAGE> **** <NTH <4 .X> 4> **** > +===== Not open compiled because type is: <OR FALSE +LNODE!-IPEEPH!-PEEPH!-PACKAGE> +(ELSE <LIST **** <NTH <4 .X> 4> **** >) +Peephole 0% 112/111 +Job done in: 7 / 9 + COMPILING PRT!-PEEPH!-PACKAGE +===== Non-specific structure for MAPF/R: **** .X **** + type is: STRUCTURED + **** <MAPF #FALSE () <FUNCTION ("AUX" X) #DECL ((VALUE) ATOM) <COND (<TYPE? . + ... +===== External variable being referenced: OUTCHAN +<COND (<TYPE? .X ATOM>) (ELSE <PRINC " " **** .OUTCHAN **** >)> +===== External variable being referenced: OUTCHAN +<PRIN1 .X **** .OUTCHAN **** > +===== External variable being referenced: OUTCHAN +<CRLF **** .OUTCHAN **** > +Peephole 0% 66/66 +Job done in: 6 / 7 + COMPILING FF!-IPEEPH!-PEEPH!-PACKAGE +===== Non-specific structure for MAPF/R: <MAPF #FALSE () ,& **** .X **** > + type is: STRUCTURED + **** <MAPF #FALSE () ,& .X> **** +===== External variable being referenced: OUTCHAN +<CRLF **** .OUTCHAN **** > +Peephole 0% 44/44 +Job done in: 2 / 3 + COMPILING HACK-PRINT!-IPEEPH!-PEEPH!-PACKAGE +===== External variable being referenced: OUTCHAN +<FUNCTION (X) <PRIN1 <INSFIX .X> **** .OUTCHAN **** >> +Peephole 0% 26/26 +Job done in: 1 / 2 + COMPILING SKIPPABLE!-IPEEPH!-PEEPH!-PACKAGE +Peephole 8% 61/56 +Job done in: 6 / 7 + COMPILING DEL-JUMP-LN!-IPEEPH!-PEEPH!-PACKAGE +===== Computed decl of variable: QD!-IPEEPH!-PEEPH!-PACKAGE is: LIST +Peephole 0% 79/79 +Job done in: 6 / 8 +COMPILING CHANGE-COND!-IPEEPH!-PEEPH!-PACKAGE +Peephole 2% 42/41 +Job done in: 2 / 3 + COMPILING MAKE:LABEL!-IPEEPH!-PEEPH!-PACKAGE +===== Computed decl of variable: XX!-IPEEPH!-PEEPH!-PACKAGE is: STRING +===== External variable being referenced: LABNUM!-IPEEPH!-PEEPH!-PACKAGE +<+ **** .LABNUM!-IPEEPH!-PEEPH!-PACKAGE **** 1> +===== External variable being SET: LABNUM!-IPEEPH!-PEEPH!-PACKAGE + **** <SET LABNUM!-IPEEPH!-PEEPH!-PACKAGE <+ .LABNUM!-IPEEPH!-PEEPH!-PACKAGE 1 + ... +Peephole 0% 66/66 +Job done in: 2 / 3 + COMPILING NEXTS!-IPEEPH!-PEEPH!-PACKAGE +Peephole 1% 62/61 +Job done in: 5 / 7 + COMPILING CROSS-OPT!-IPEEPH!-PEEPH!-PACKAGE +===== Computed decl of variable: NEWLN!-IPEEPH!-PEEPH!-PACKAGE is: +LNODE!-IPEEPH!-PEEPH!-PACKAGE +===== Computed decl of variable: LABL!-IPEEPH!-PEEPH!-PACKAGE is: ATOM +===== Computed decl of variable: NEEDLABEL!-IPEEPH!-PEEPH!-PACKAGE is: <OR +ATOM FALSE> +===== External variable being SET: REDO + **** <SET REDO "CROSS-OPTIMIZATION"> **** +===== External variable being referenced: NLABLS!-IPEEPH!-PEEPH!-PACKAGE + **** .NLABLS!-IPEEPH!-PEEPH!-PACKAGE **** +===== External variable being SET: NLABLS!-IPEEPH!-PEEPH!-PACKAGE + **** <SET NLABLS!-IPEEPH!-PEEPH!-PACKAGE (<LIST .LABL!-IPEEPH!-PEEPH!-PACKAGE + ... +===== External variable being referenced: MODLN!-IPEEPH!-PEEPH!-PACKAGE + **** .MODLN!-IPEEPH!-PEEPH!-PACKAGE **** +===== External variable being SET: MODLN!-IPEEPH!-PEEPH!-PACKAGE + **** <SET MODLN!-IPEEPH!-PEEPH!-PACKAGE <LIST .NEWLN!-IPEEPH!-PEEPH!-PACKAGE + ... +===== Frame being generated. + **** <FUNCTION (TOPCOD!-IPEEPH!-PEEPH!-PACKAGE NCOD!-IPEEPH!-PEEPH!-PACKAGE +" ... +Peephole 3% 300/290 +Job done in: 44 / 59 + COMPILING BACKS!-IPEEPH!-PEEPH!-PACKAGE +Peephole 5% 59/56 +Job done in: 2 / 3 + COMPILING ADDON!-IPEEPH!-PEEPH!-PACKAGE +Peephole 0% 33/33 +Job done in: 5 / 7 + COMPILING FIND-LAB!-IPEEPH!-PEEPH!-PACKAGE +===== Non-specific structure for MAPF/R: **** .INST!-IPEEPH!-PEEPH!-PACKAGE ** +** + type is: STRUCTURED + **** <MAPF #FALSE () <FUNCTION ("AUX" X) #DECL ((VALUE) FALSE) <COND (<TYPE? + ... +Peephole 7% 53/49 +Job done in: 2 / 3 + COMPILING PSEUDO?!-IPEEPH!-PEEPH!-PACKAGE +Peephole 13% 97/84 +Job done in: 6 / 7 +COMPILING MUNG-LAB!-IPEEPH!-PEEPH!-PACKAGE +===== Non-specific structure for MAPF/R: **** .INST!-IPEEPH!-PEEPH!-PACKAGE ** +** + type is: STRUCTURED + **** <MAPR #FALSE () <FUNCTION ("AUX" IN (OB!-IPEEPH!-PEEPH!-PACKAGE <NTH .IN + ... +===== Not open compiled because type is: <STRUCTURED ANY> + **** <NTH .IN 1> **** +===== Not open compiled because type is: <STRUCTURED ANY> + **** <PUT .IN 1 .OB!-IPEEPH!-PEEPH!-PACKAGE> **** +Peephole 1% 86/85 +Job done in: 6 / 11 + COMPILING PEEP-PRINT!-IPEEPH!-PEEPH!-PACKAGE +===== External reference to LVAL: OUTL!-IPEEPH!-PEEPH!-PACKAGE +<NOT **** <ASSIGNED? OUTL!-IPEEPH!-PEEPH!-PACKAGE> **** > +===== External variable being referenced: OUTCHAN +<PRINC "Peephole " **** .OUTCHAN **** > +===== Arithmetic can't open compile because: <- **** .LN!-IPEEPH!-PEEPH!-PACKA +GE **** .NUMLABS!-IPEEPH!-PEEPH!-PACKAGE> + is of type: <OR FIX FLOAT> + **** <- .LN!-IPEEPH!-PEEPH!-PACKAGE .NUMLABS!-IPEEPH!-PEEPH!-PACKAGE> **** +===== Arithmetic can't open compile because: <- .LN!-IPEEPH!-PEEPH!-PACKAGE ** +** .NUMLABS!-IPEEPH!-PEEPH!-PACKAGE **** > + is of type: <OR FIX FLOAT> + **** <- .LN!-IPEEPH!-PEEPH!-PACKAGE .NUMLABS!-IPEEPH!-PEEPH!-PACKAGE> **** +===== Arithmetic can't open compile because: **** .NLN!-IPEEPH!-PEEPH!-PACKAGE + **** + is of type: <OR FIX FLOAT> + **** <- .NLN!-IPEEPH!-PEEPH!-PACKAGE .NUMLABS!-IPEEPH!-PEEPH!-PACKAGE <- . +NNU ... +===== Arithmetic can't open compile because: **** .NUMLABS!-IPEEPH!-PEEPH!-PAC +KAGE **** + is of type: <OR FIX FLOAT> + **** <- .NLN!-IPEEPH!-PEEPH!-PACKAGE .NUMLABS!-IPEEPH!-PEEPH!-PACKAGE <- . +NNU ... +===== Arithmetic can't open compile because: **** <- .NNUMLABS!-IPEEPH!-PEEPH! +-PACKAGE> **** + is of type: <OR FIX FLOAT> + **** <- .NLN!-IPEEPH!-PEEPH!-PACKAGE .NUMLABS!-IPEEPH!-PEEPH!-PACKAGE <- . +NNU ... +===== Arithmetic can't open compile because: <- **** .LN!-IPEEPH!-PEEPH!-PACKA +GE **** .NLN!-IPEEPH!-PEEPH!-PACKAGE> + is of type: <OR FIX FLOAT> + **** <- .LN!-IPEEPH!-PEEPH!-PACKAGE .NLN!-IPEEPH!-PEEPH!-PACKAGE> **** +===== Arithmetic can't open compile because: <- .LN!-IPEEPH!-PEEPH!-PACKAGE ** +** .NLN!-IPEEPH!-PEEPH!-PACKAGE **** > + is of type: <OR FIX FLOAT> + **** <- .LN!-IPEEPH!-PEEPH!-PACKAGE .NLN!-IPEEPH!-PEEPH!-PACKAGE> **** +===== Arithmetic can't open compile because: **** .LN!-IPEEPH!-PEEPH!-PACKAGE +**** + is of type: <OR FIX FLOAT> + **** </ <FLOAT <- .LN!-IPEEPH!-PEEPH!-PACKAGE .NLN!-IPEEPH!-PEEPH!-PACKAGE>> + ... +===== Arithmetic can't open compile because: **** </ <FLOAT <- .LN!-IPEEPH!-PE +EPH!-PACKAGE .NLN!-IPEEPH!-PEEPH!-PACKAGE>> + ... + is of type: <OR FIX FLOAT> + **** <* 100 </ <FLOAT <- .LN!-IPEEPH!-PEEPH!-PACKAGE . +NLN!-IPEEPH!-PEEPH!-PAC ... +===== External variable being referenced: OUTCHAN + **** .OUTCHAN **** +===== External variable being referenced: OUTCHAN +<PRINC "% " **** .OUTCHAN **** > +===== External variable being referenced: OUTCHAN +<PRIN1 .LN!-IPEEPH!-PEEPH!-PACKAGE **** .OUTCHAN **** > +===== External variable being referenced: OUTCHAN +<PRINC "/" **** .OUTCHAN **** > +===== External variable being referenced: OUTCHAN +<PRIN1 .NLN!-IPEEPH!-PEEPH!-PACKAGE **** .OUTCHAN **** > +===== Arithmetic can't open compile because: <- **** .LN!-IPEEPH!-PEEPH!-PACKA +GE **** .NUMLABS!-IPEEPH!-PEEPH!-PACKAGE> + is of type: <OR FIX FLOAT> + **** <- .LN!-IPEEPH!-PEEPH!-PACKAGE .NUMLABS!-IPEEPH!-PEEPH!-PACKAGE> **** +===== Arithmetic can't open compile because: <- .LN!-IPEEPH!-PEEPH!-PACKAGE ** +** .NUMLABS!-IPEEPH!-PEEPH!-PACKAGE **** > + is of type: <OR FIX FLOAT> + **** <- .LN!-IPEEPH!-PEEPH!-PACKAGE .NUMLABS!-IPEEPH!-PEEPH!-PACKAGE> **** +===== Arithmetic can't open compile because: **** .NLN!-IPEEPH!-PEEPH!-PACKAGE + **** + is of type: <OR FIX FLOAT> + **** <- .NLN!-IPEEPH!-PEEPH!-PACKAGE .NUMLABS!-IPEEPH!-PEEPH!-PACKAGE <- . +NNU ... +===== Arithmetic can't open compile because: **** .NUMLABS!-IPEEPH!-PEEPH!-PAC +KAGE **** + is of type: <OR FIX FLOAT> + **** <- .NLN!-IPEEPH!-PEEPH!-PACKAGE .NUMLABS!-IPEEPH!-PEEPH!-PACKAGE <- . +NNU ... +===== Arithmetic can't open compile because: **** <- .NNUMLABS!-IPEEPH!-PEEPH! +-PACKAGE> **** + is of type: <OR FIX FLOAT> + **** <- .NLN!-IPEEPH!-PEEPH!-PACKAGE .NUMLABS!-IPEEPH!-PEEPH!-PACKAGE <- . +NNU ... +===== Arithmetic can't open compile because: <- **** .LN!-IPEEPH!-PEEPH!-PACKA +GE **** .NLN!-IPEEPH!-PEEPH!-PACKAGE> + is of type: <OR FIX FLOAT> + **** <- .LN!-IPEEPH!-PEEPH!-PACKAGE .NLN!-IPEEPH!-PEEPH!-PACKAGE> **** +===== Arithmetic can't open compile because: <- .LN!-IPEEPH!-PEEPH!-PACKAGE ** +** .NLN!-IPEEPH!-PEEPH!-PACKAGE **** > + is of type: <OR FIX FLOAT> + **** <- .LN!-IPEEPH!-PEEPH!-PACKAGE .NLN!-IPEEPH!-PEEPH!-PACKAGE> **** +===== Arithmetic can't open compile because: **** .LN!-IPEEPH!-PEEPH!-PACKAGE +**** + is of type: <OR FIX FLOAT> + **** </ <FLOAT <- .LN!-IPEEPH!-PEEPH!-PACKAGE .NLN!-IPEEPH!-PEEPH!-PACKAGE>> + ... +===== Arithmetic can't open compile because: **** </ <FLOAT <- .LN!-IPEEPH!-PE +EPH!-PACKAGE .NLN!-IPEEPH!-PEEPH!-PACKAGE>> + ... + is of type: <OR FIX FLOAT> + **** <* 100 </ <FLOAT <- .LN!-IPEEPH!-PEEPH!-PACKAGE . +NLN!-IPEEPH!-PEEPH!-PAC ... +Peephole 0% 180/180 +Job done in: 15 / 18 + COMPILING FIND-END-OF-CHAIN!-IPEEPH!-PEEPH!-PACKAGE +===== Computed decl of variable: DEFAULT is: <OR FALSE +LNODE!-IPEEPH!-PEEPH!-PACKAGE> +===== Not open compiled because type is: <OR FALSE +LNODE!-IPEEPH!-PEEPH!-PACKAGE> +<NTH **** <NTH <4 .JMP!-IPEEPH!-PEEPH!-PACKAGE> 3> **** 1> +===== Not open compiled because type is: STRUCTURED + **** <NTH <NTH <4 .JMP!-IPEEPH!-PEEPH!-PACKAGE> 3> 1> **** +Peephole 4% 46/44 +Job done in: 6 / 7 + COMPILING FLUSH-LABELS!-IPEEPH!-PEEPH!-PACKAGE +===== Computed decl of variable: TEM!-IPEEPH!-PEEPH!-PACKAGE is: LIST +===== External variable being referenced: SLABS!-IPEEPH!-PEEPH!-PACKAGE +<NOT <MEMQ .X **** .SLABS!-IPEEPH!-PEEPH!-PACKAGE **** >> +===== External variable being referenced: NLABLS!-IPEEPH!-PEEPH!-PACKAGE + **** .NLABLS!-IPEEPH!-PEEPH!-PACKAGE **** +===== External variable being referenced: NLABLS!-IPEEPH!-PEEPH!-PACKAGE +<==? .N!-IPEEPH!-PEEPH!-PACKAGE **** .NLABLS!-IPEEPH!-PEEPH!-PACKAGE **** > +===== External variable being referenced: NLABLS!-IPEEPH!-PEEPH!-PACKAGE +<REST **** .NLABLS!-IPEEPH!-PEEPH!-PACKAGE **** 1> +===== External variable being SET: NLABLS!-IPEEPH!-PEEPH!-PACKAGE + **** <SET NLABLS!-IPEEPH!-PEEPH!-PACKAGE <REST . +NLABLS!-IPEEPH!-PEEPH!-PACKAG ... +===== External variable being referenced: NNUMLABS!-IPEEPH!-PEEPH!-PACKAGE +<+ **** .NNUMLABS!-IPEEPH!-PEEPH!-PACKAGE **** 1> +===== External variable being SET: NNUMLABS!-IPEEPH!-PEEPH!-PACKAGE + **** <SET NNUMLABS!-IPEEPH!-PEEPH!-PACKAGE <+ . +NNUMLABS!-IPEEPH!-PEEPH!-PACKA ... +===== External variable being SET: REDO + **** <SET REDO "FLUSH REDUNDANT LABELS"> **** +Peephole 0% 150/149 +Job done in: 18 / 21 + COMPILING CLEAN-IT-UP!-IPEEPH!-PEEPH!-PACKAGE +===== Not open compiled because type is: <OR FALSE TUPLE> + **** <NTH <3 .LND!-IPEEPH!-PEEPH!-PACKAGE> 1> **** +===== Not open compiled because type is: STRUCTURED + **** <NTH <BACK <3 .LND!-IPEEPH!-PEEPH!-PACKAGE> 1> 1> **** +===== Not open compiled because type is: STRUCTURED + **** <NTH .FIN-LNODE!-IPEEPH!-PEEPH!-PACKAGE 2> **** +===== Not open compiled because type is: #FALSE () + **** <PUT .FIN-LNODE!-IPEEPH!-PEEPH!-PACKAGE 2 <ADDON <LIST . +JMPL!-IPEEPH!-PE ... +Peephole 0% 164/164 +Job done in: 13 / 15 + \ No newline at end of file diff --git a/<mdl.comp>/ppcomp.save.5 b/<mdl.comp>/ppcomp.save.5 new file mode 100644 index 0000000000000000000000000000000000000000..fe70cd0acee9efb82a5163b998b73ed097c9a70a GIT binary patch literal 670668 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%0D~z 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 literal 0 HcmV?d00001 diff --git a/<mdl.comp>/prntyp.mud.5 b/<mdl.comp>/prntyp.mud.5 new file mode 100644 index 0000000..3c3f140 --- /dev/null +++ b/<mdl.comp>/prntyp.mud.5 @@ -0,0 +1,59 @@ +<PACKAGE "PRNTYP"> + +<ENTRY SYMTAB-PRINT AC-PRINT> + +<USE "COMPDEC"> + +<DEFINE SYMTAB-PRINT (SYM "AUX" TT TEM (OUTCHAN .OUTCHAN)) + #DECL ((SYM) SYMTAB) + <PRINC "#SYMTAB ["> + <PRIN1 <NAME-SYM .SYM>> + <PRINC " "> + <COND (<SET TT <INACS .SYM>> + <PRINC "#DATUM ("> + <COND (<TYPE? <SET TEM <DATTYP .TT>> AC> + <PRIN1 <ACSYM .TEM>>) + (<TYPE? .TEM ATOM> <PRIN1 .TEM>) + (<TYPE? .TEM TEMP> + <PRIN1 <TMPNO .TEM>>) + (ELSE <ERROR LOSING-SYMTAB!-ERRORS>)> + <PRINC " "> + <COND (<TYPE? <SET TEM <DATVAL .TT>> AC> + <PRIN1 <ACSYM .TEM>>) + (ELSE <ERROR LOSING-SYMTAB!-ERRORS>)> + <PRINC ")">)> + <PRINC "]">> + +<DEFINE AC-PRINT (AC "AUX" TT TEM (OUTCHAN .OUTCHAN)) + #DECL ((AC) AC) + <PRINC "#AC ["> + <PRIN1 <ACSYM .AC>> + <PRINC " "> + <OR <ACLINK .AC> <DATUM-PRINT <ACLINK .AC>>> + <MAPF <> <FUNCTION (S) + <PRINC " "> + <COND (<TYPE? .S SYMTAB> <PRIN1 <NAME-SYM .S>>) + (ELSE <PRIN1 <TYPE .S>>)>> + <ACRESIDUE .AC>> + <PRINC "]">> + +<DEFINE DATUM-PRINT (TT "AUX" TEM) + <COND (.TT + <PRINC "#DATUM ("> + <COND (<TYPE? <SET TEM <DATTYP .TT>> AC> + <PRIN1 <ACSYM .TEM>>) + (<TYPE? .TEM ATOM> <PRIN1 .TEM>) + (<TYPE? .TEM TEMP> + <PRIN1 <TMPNO .TEM>>) + (ELSE <ERROR LOSING-SYMTAB!-ERRORS>)> + <PRINC " "> + <COND (<TYPE? <SET TEM <DATVAL .TT>> AC> + <PRIN1 <ACSYM .TEM>>) + (ELSE <ERROR LOSING-SYMTAB!-ERRORS>)> + <PRINC ")">)>> +<PRINTTYPE AC ,AC-PRINT> + +<PRINTTYPE SYMTAB ,SYMTAB-PRINT> + +<ENDPACKAGE> +  \ No newline at end of file diff --git a/<mdl.comp>/rest.gen.1 b/<mdl.comp>/rest.gen.1 new file mode 100644 index 0000000..e0aefba --- /dev/null +++ b/<mdl.comp>/rest.gen.1 @@ -0,0 +1,177 @@ + + + <TITLE REST-GEN> + + <DECLARE ("VALUE" DATUM!-COMPDEC!-PACKAGE NODE!-COMPDEC!-PACKAGE ANY)> + <PUSH TP* (AB) > + <PUSH TP* (AB) 1> + <PUSH TP* (AB) 2> + <PUSH TP* (AB) 3> + <PUSHJ P* TAG1> + <JRST |FINIS > +TAG1 <SUBM M* (P) > ; 6 + <PUSH TP* [0]> ; [4] + <PUSH TP* [0]> ; [5] + <PUSH TP* [0]> ; [6] + <PUSH TP* [0]> ; [7] + <MOVE B* (TP) -6> ; (1) + <PUSH TP* <TYPE-WORD LIST>> ; [8] + <PUSH TP* (B) 9> ; [9] + <MOVE D* (TP) > ; (9) + <MOVE PVP* (D) 1> + <PUSH TP* (PVP) 4> ; [10] + <PUSH TP* (PVP) 5> ; [11] + <PUSH TP* (TP) -1> ; (10) [12] + <PUSH TP* (TP) -1> ; (11) [13] + <MCALL 1 STRUCTYP> + <PUSH TP* A> ; [12] + <PUSH TP* B> ; [13] + <MOVE B* (TP) -4> ; (9) + <HRRZ D* (B) > + <PUSH TP* <MQUOTE %<TYPE-W NODE!-COMPDEC!-PACKAGE VECTOR>>>; [14] + <PUSH TP* (D) 1> ; [15] + <PUSH TP* <MQUOTE %<TYPE-W NODE!-COMPDEC!-PACKAGE VECTOR>>>; [16] + <PUSH TP* (B) 1> ; [17] + <PUSH TP* (TP) -1> ; (16) [18] + <PUSH TP* (TP) -1> ; (17) [19] + <MCALL 1 NTH-REST-PUT?> + <PUSH TP* A> ; [18] + <PUSH TP* B> ; [19] + <MOVE B* (TP) -4> ; (15) + <MOVE D* (B) 1> + <CAIE D* 2 > + <JRST TAG2> + <MOVE PVP* <MQUOTE T> -1> + <MOVE TVP* <MQUOTE T>> + <JRST TAG3> +TAG2 <MOVE PVP* <TYPE-WORD FALSE>> ; 41 + <MOVEI TVP* 0> +TAG3 <PUSH TP* PVP> ; 43 [20] + <PUSH TP* TVP> ; [21] + <SKIPL (TP) > ; (21) + <JRST TAG4> + <MOVE PVP* (B) 7> + <JRST TAG5> +TAG4 <MOVEI PVP* 0> ; 49 +TAG5 <PUSH TP* <TYPE-WORD FIX>> ; 50 [22] + <PUSH TP* PVP> ; [23] + <PUSH TP* (B) 4> ; [24] + <PUSH TP* (B) 5> ; [25] + <MCALL 1 GET-RANGE> + <PUSH TP* A> ; [24] + <PUSH TP* B> ; [25] + <INTGO> + <PUSH TP* <MQUOTE %<TYPE-W NODE!-COMPDEC!-PACKAGE VECTOR>>>; [26] + <PUSH TP* (TP) -25> ; (1) [27] + <MCALL 1 FIND-COMMON> + <MOVEM A* (TP) -19> ; (6) + <MOVEM B* (TP) -18> ; (7) + <JUMPGE B* TAG6> + <PUSH TP* A> ; [26] + <PUSH TP* B> ; [27] + <MCALL 1 GET-COMMON-DATUM> + <PUSH TP* A> ; [26] + <PUSH TP* B> ; [27] + <PUSH TP* (TP) -25> ; (2) [28] + <PUSH TP* (TP) -25> ; (3) [29] + <MCALL 2 MOVE:ARG> + <MOVEM A* (TP) -21> ; (4) + <MOVEM B* (TP) -20> ; (5) + <JRST TAG7> +TAG6 <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; 76 [26] + <PUSH TP* <MQUOTE COMMON-SUB>> ; [27] + <PUSH TP* <TYPE-WORD FALSE>> ; [28] + <PUSH TP* [0]> ; [29] + <PUSH TP* <MQUOTE (<OR FALSE COMMON!-COMPDEC!-PACKAGE>)> -1>; [30] + <PUSH TP* <MQUOTE (<OR FALSE COMMON!-COMPDEC!-PACKAGE>)>>; [31] + <PUSHJ P* |SPECBN > + <MOVE B* <MQUOTE %<RGLOC RESTERS T>>> + <ADD B* |GLOTOP 1> + <MOVE D* <MQUOTE %<RGLOC STYPES!-COMPDEC!-PACKAGE T>>> + <ADD D* |GLOTOP 1> + <MOVE PVP* <TYPE-WORD UVECTOR>> + <MOVE TVP* (D) 1> + <MOVE D* (TP) -18> ; (13) + <JUMPGE TVP* TAG8> +TAG10 <CAMN D* (TVP) > ; 91 + <JRST TAG9> + <AOBJN TVP* TAG10> +TAG8 <MOVE D* <TYPE-WORD FALSE>> ; 94 + <MOVEI PVP* 0> + <JRST TAG11> +TAG9 <MOVE D* <TYPE-WORD UVECTOR>> ; 97 + <MOVE PVP* TVP> +TAG11 <HLRE D* PVP> ; 99 + <MOVNS O* D> + <MOVE PVP* (B) 1> + <JUMPLE D* |CERR1 > + <ASH D* A> + <HRLI D* (D) 0> + <ADD D* PVP> + <CAILE D* -1 > + <JRST |CERR2 > + <PUSH TP* (D) -2> ; [32] + <PUSH TP* (D) -1> ; [33] + <PUSH TP* <MQUOTE %<TYPE-W NODE!-COMPDEC!-PACKAGE VECTOR>>>; [34] + <PUSH TP* (TP) -33> ; (1) [35] + <PUSH TP* (TP) -33> ; (2) [36] + <PUSH TP* (TP) -33> ; (3) [37] + <PUSH TP* (TP) -27> ; (10) [38] + <PUSH TP* (TP) -27> ; (11) [39] + <PUSH TP* (TP) -27> ; (12) [40] + <PUSH TP* (TP) -27> ; (13) [41] + <PUSH TP* (TP) -21> ; (20) [42] + <PUSH TP* (TP) -21> ; (21) [43] + <PUSH TP* (TP) -21> ; (22) [44] + <PUSH TP* (TP) -21> ; (23) [45] + <MOVE B* (TP) -36> ; (9) + <PUSH TP* <MQUOTE %<TYPE-W NODE!-COMPDEC!-PACKAGE VECTOR>>>; [46] + <PUSH TP* (B) 1> ; [47] + <PUSH TP* (TP) -33> ; (14) [48] + <PUSH TP* (TP) -33> ; (15) [49] + <PUSH TP* <MQUOTE T> -1> ; [50] + <PUSH TP* <MQUOTE T>> ; [51] + <PUSH TP* <TYPE-WORD FALSE>> ; [52] + <PUSH TP* [0]> ; [53] + <PUSH TP* (TP) -29> ; (24) [54] + <PUSH TP* (TP) -29> ; (25) [55] + <MCALL *14* APPLY> + <MOVE D* (TP) -3> ; (28) + <MOVE PVP* (TP) -2> ; (29) + <SUB TP* [<(6) 6>]> + <PUSHJ P* |SSPECS > + <MOVEM A* (TP) -21> ; (4) + <MOVEM B* (TP) -20> ; (5) + <MOVEM D* (TP) -19> ; (6) + <MOVEM PVP* (TP) -18> ; (7) +TAG7 <PUSH TP* <MQUOTE REST> -1> ; 142 [26] + <PUSH TP* <MQUOTE REST>> ; [27] + <PUSH TP* (TP) -11> ; (16) [28] + <PUSH TP* (TP) -11> ; (17) [29] + <PUSH TP* (TP) -23> ; (6) [30] + <PUSH TP* (TP) -23> ; (7) [31] + <PUSH TP* (TP) -29> ; (2) [32] + <PUSH TP* (TP) -29> ; (3) [33] + <PUSH TP* (TP) -29> ; (4) [34] + <PUSH TP* (TP) -29> ; (5) [35] + <PUSH TP* (TP) -15> ; (20) [36] + <PUSH TP* (TP) -15> ; (21) [37] + <PUSH TP* (TP) -15> ; (22) [38] + <PUSH TP* (TP) -15> ; (23) [39] + <PUSH TP* (TP) -27> ; (12) [40] + <PUSH TP* (TP) -27> ; (13) [41] + <PUSH TP* (TP) -23> ; (18) [42] + <PUSH TP* (TP) -23> ; (19) [43] + <MCALL *11* HACK-COMMON> + <MOVE B* (TP) -20> ; (5) + <SUB TP* [<(26) 26>]> + <MOVE A* <MQUOTE %<TYPE-W DATUM!-COMPDEC!-PACKAGE LIST>>> + <JRST |MPOPJ > + <0> + <(*47*) -1> + <(6) 6> + <(26) 26> + <(2) 6> + <(*65523*) *200067*> + <0> + <(1) 2> diff --git a/<mdl.comp>/rhack.mud.1 b/<mdl.comp>/rhack.mud.1 new file mode 100644 index 0000000..c51e009 --- /dev/null +++ b/<mdl.comp>/rhack.mud.1 @@ -0,0 +1,56 @@ +<BLOCK (<ROOT>)> +COMBAT +<ENDBLOCK> + +<DEFINE COMBAT-HACKER ("AUX" CH) + <COND (<NOT <GASSIGNED? PLANNED!-COMBAT!->> + <REALTIMER 20>) + (<AND <=? ,PLANNED!-COMBAT!- "RIOT"> + <SET CH <OPEN "READ" "MUDSYS;T.PRINT >">>> + <OFF "REALT"> + <REALTIMER 0> + <CLOSE .CH> + <SETG FR& <FUNCTION ("TUPLE" T) T>> + <ERROR "Rioting is no longer available, please use Plans">) + (ELSE + <OFF "REALT"> + <REALTIMER 0>)>> + + +<DEFINE HACKER (A B) + <COND (<==? .A <ASCII 4>> <SETG DONT-HACK-ME T>)> + <QUITTER .A .B>> + +<DEFINE RHACK () + <OFF "CHAR" ,INCHAN> + <COND (,DONT-HACK-ME + <SETG DONT-HACK-ME <>> + <ON "CHAR" ,QUITTER 8 0 ,INCHAN> + <REALTIMER 0> + <OFF "REALT">) + (ELSE + <REALTIMER 0> + <OFF "REALT"> + <MPV-IN-GC>)>> + + + +<SETG MPV-IN-GC + <FIXUP!-RSUBRS '[ +#CODE ![23852220422 23852482567 23849036821 23852220423 268671802 23085677464 +10223615 -262143 6718806673 0 2!] + MPV-IN-GC + #DECL ("VALUE" ANY) + ""] + '(51 + $TLOSE!-MUDDLE + 224256 + (3) + GC + 236346 + (5) + FINIS!-MUDDLE + 228248 + (6))>> + +  \ No newline at end of file diff --git a/<mdl.comp>/sbrnam.mud.1 b/<mdl.comp>/sbrnam.mud.1 new file mode 100644 index 0000000..d6cc393 --- /dev/null +++ b/<mdl.comp>/sbrnam.mud.1 @@ -0,0 +1,20 @@ + + + <TITLE HACK-NAME> + <DECLARE ("VALUE" ATOM SUBR)> + <PUSH TP* (AB)> + <PUSH TP* 1(AB)> + <PUSHJ P* IHACK-NAME> + <JRST FINIS> + + <INTERNAL-ENTRY IHACK-NAME 1> + <SUBM M* (P)> + <MOVSI A* <TYPE-CODE ATOM>> + <HRRZ B* (TP)> + <MOVE B* @ -1 (B)> + <SUB TP* [<2 (2)>]> + <JRST MPOPJ> + + + + \ No newline at end of file diff --git a/<mdl.comp>/spcgen.mud.2 b/<mdl.comp>/spcgen.mud.2 new file mode 100644 index 0000000000000000000000000000000000000000..1eaeb83e0a55839cf89d9a888c9b00507ee3fb70 GIT binary patch literal 2829 zcmb_e>u(xI5T65V&ct@8-;GswaA`uC!@f6nsq6U69pD7G6P%OSZo-GUDoUm3Dm9Lu z;a~5}@^GW1Qls`HhMC>j-_CP)b32h&edg5z-0VixdeGk7#awPDXvdu+>_$PgOk-l` zuuD4C&}SWDylR*K8qfS{lbNtZb3-QbgDP>|xHG})2624?hY!+79{@<}iroO15Q#ZK zQp^dGW-hI4^kM1|WT#8p$L9dNI-_i4pPgf-H@HAK4;izO%^JtEG^5yAm{M$jG|uOV z<cO?dUs^DpCNQh+0W3a(KFs5E0&|!m!s1<=&Vr1aWEZa`GX$5V&F#Llh||5nxn4_P zo|PAc9&<~~k#csp3@T*6gEB2WVbk6legbz{?;gqouw9~=qWltIiwTPoHfUl5Kr0kG zfxKe(27mI{qOb*MUou08y}{YYG+GM;pTYg!;1d1b;EMNnha3a7Ir4Ic@#X}9{RF1W z(>|10{AxtVY2hHxPTwLk=rx1hO!l~9@fuUS5&3q_@mruQv`RMi1|QhV?LslN0nDky ztxzPBkqexFC2fzA!m}m=eBiuEI7@`bER-pTsK79ilzmd>Ku~aquzgu&mrxM1PfgnQ zXrR1i<&CVT-5Sn%GT}+{TXJ7own|hMIFE!p%_Nt=(pC=AKVh3du}0;?rY*0QxIk)@ z5Ot6ADg-S2XrP?H@|Mgiatx3sBC3g3tQZkxL9AdG-f#kL%m#7CtZY5yvEedCX62z? zszimEA;M5AnoqlNVTvu^h-?WmN!igTTOx1&N6Ik6fyl61lm*}{2)9;Oi+yR;Xi{9% zJsM+kUl)q$NN_#kl7GzVFQ3Wk>3_~DTks<z-<W<M-X62L7KQjNhh#;uM@A-?<Kp*A zbTSMlfKQMFRt4cIp5dat;3~fSxL$Ic<fUPfxqC#taAsCH$!i9c3Ppn^*p^FHUMwi7 zGZrO@#kGI2c3e^ta7biP=o0|OyDtu&VciQaMJFq^%IAw9<6dAt&e)IlU(^-cx)&VD z%iGrdI1qO@R^s$|$H*j#SP>E8_6kLVj^W?tiY7JZfIli)I?_x&DCm<w%EL_2q-tlC z6caIfJ`vL(?ZGSs8K&mq`LC~d8GSNHC+h7b@g3bFO)PCb_nL>nCVK57Y=?e;z84?1 z(2K(s)(&1i#IRP2;?8Ke)(L_#T}@aI;!aRU&-Xiz1p)@GgP4Zf7>8c<Id+1$9JeA; zMsL51F&;h-s&UxC=0P{c?|0&(C@8-e!SdKHZ->!gT&BCO6}HP{$gN%&(e)P;%3)L} zk8ji$VaMMkl}^1GR`C%M#8@Z~h0!L$ui^H)=!b3E!s`SR<sV4-6(YxIjmf(2oo+|h ze?-y(i%?bG&UjFX;0eeLIEMKMhB2+4oFpgbD|vVfb8FI!P!5dad*@f*Cg8%HEXl*M zR^^-U;{G0w!Dwv%z&>>@4rM6AoxC(B^!&nhGlV-1tO&9C`o`D;I!2a-Sl6}d-xFeI zK<YytQVm!KIyN>~#e!T3PT?-y-TSrc_dCg%N(s->73lxmoh@EG0hk_wE;QGR$*%xY zLKIIAukGWG*X<tE+kyWC>r@cCxW#|CLkU4;{7?~7SUAybT{BHID;3u=Rl9<kqg#ff zo2sg!rn{PBI<D$kShg+I&~4jLHPkfAsA#(8>S(Km>$tk5p<&pnY8bA8re&L^?dVzs z%LYvnq+{5q8K!MJhHE>hRcK7t9m{mkP-)yzEuGLv#kCDxbyPG>jf|)`8kxb`s%F`? zjk>8>uI6g0iS%<U$1c3u6|UbtoVfD1d>^DaFw~e0z9vURyqP3^B+>0Uek9$#M7WDT zd_w5uz}=n^j|=K-m=T@LjhO;UV4AvfT^w4p;orJ*Y{_Rjl)IFE4@IAdW_yKfuE_1A zZmB}}o0L;Vh?8;}iQ_^L{=yd&!q`4hAcYgVqN%Q9tEi%-o4RX`V;i*nQL7Son!djP Di>T}d literal 0 HcmV?d00001 diff --git a/<mdl.comp>/strana.mud.362 b/<mdl.comp>/strana.mud.362 new file mode 100644 index 0000000..7bf5030 --- /dev/null +++ b/<mdl.comp>/strana.mud.362 @@ -0,0 +1,537 @@ +<PACKAGE "STRANA"> + +<ENTRY LENGTH-ANA EMPTY?-ANA LENGTH?-ANA NTH-ANA REST-ANA PUT-ANA PUTREST-ANA + MEMQ-ANA NTH-REST-ANA> + +<USE "SYMANA" "CHKDCL" "COMPDEC" "ADVMESS"> + +"Structure hackers for the compiler (analyzers)" + +<DEFINE LNTH-MT-ANA (NOD RTYP COD + "AUX" (K <KIDS .NOD>) (LN <LENGTH .K>) TEM (WHO ()) + (WHON + <AND <OR <AND <==? .COD ,LNTH-CODE> + <ASSIGNED? GLN> + <ANCEST .GLN <PARENT .NOD>>> + <AND <==? .PRED <PARENT .NOD>> + <==? .COD ,MT-CODE>>> + .NOD>)) + #DECL ((NOD) NODE (LN COD) FIX (K) <LIST [REST NODE]> + (WHO) <SPECIAL LIST> (WHON) <SPECIAL <OR NODE FALSE>>) + <COND (<SEGFLUSH .NOD .RTYP>) + (ELSE + <ARGCHK .LN 1 <NODE-NAME .NOD>> + <SET TEM <EANA <1 .K> STRUCTURED <NODE-NAME .NOD>>> + <COND (<SET TEM <STRUCTYP .TEM>> <PUT .NOD ,NODE-TYPE .COD>) + (ELSE + <COND (.VERBOSE + <ADDVMESS .NOD + ("Not open compiled because type is: " + <RESULT-TYPE <1 .K>>)>)> + <PUT .NOD ,NODE-TYPE ,ISUBR-CODE>)>)> + <COND (<==? .COD ,MT-CODE> + <MAPF <> + <FUNCTION (L "AUX" (SYM <2 .L>) (FLG <1 .L>)) + #DECL ((L) <LIST <OR FALSE ATOM> SYMTAB> + (SYM) SYMTAB) + '<SET TRUTH + <ADD-TYPE-LIST .SYM + '<STRUCTURED [REST + <NOT ANY>]> + .TRUTH + .FLG + <REST .L 2>>> + <SET UNTRUTH + <ADD-TYPE-LIST + .SYM + '<STRUCTURED ANY> + .UNTRUTH + .FLG + <REST .L 2>>> + T> + .WHO>) + (ELSE <SET GLE .WHO>)> + <TYPE-OK? <COND (<==? <NODE-SUBR .NOD> ,LENGTH> <FORM FIX (0 ,PLUSINF)>) + (ELSE '<OR FALSE ATOM>)> + .RTYP>> + +<DEFINE ANCEST (N1 N2) + #DECL ((N1 N2) NODE) + <REPEAT () + <COND (<==? .N1 .N2> <RETURN>)> + <OR <==? <NODE-TYPE .N2> ,SET-CODE> <RETURN <>>> + <COND (<TYPE? <PARENT .N2> NODE> <SET N2 <PARENT .N2>>) + (ELSE <RETURN <>>)>>> + +<DEFINE LENGTH-ANA (N R) <LNTH-MT-ANA .N .R ,LNTH-CODE>> + +<PUT ,LENGTH ANALYSIS ,LENGTH-ANA> + +<DEFINE EMPTY?-ANA (N R) <LNTH-MT-ANA .N .R ,MT-CODE>> + +<PUT ,EMPTY? ANALYSIS ,EMPTY?-ANA> + +<DEFINE LENGTH?-ANA (NOD RTYP + "AUX" (K <KIDS .NOD>) TEM (WHO ()) + (WHON <AND <==? .PRED <PARENT .NOD>> .NOD>)) + #DECL ((NOD) NODE (K) <LIST [REST NODE]> (WHON) <SPECIAL ANY> + (WHO) <SPECIAL LIST>) + <COND + (<SEGFLUSH .NOD .RTYP>) + (ELSE + <ARGCHK <LENGTH .K> 2 LENGTH?> + <SET TEM <EANA <1 .K> STRUCTURED LENGTH?>> + <SET WHON <>> + <EANA <2 .K> FIX LENGTH?> + <COND (<==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> ;"Constant 2d arg?" + <MAPF <> + <FUNCTION (L "AUX" (SYM <2 .L>) (FLG <1 .L>)) + #DECL ((L) <LIST ANY SYMTAB> (SYM) SYMTAB) + <SET UNTRUTH + <ADD-TYPE-LIST .SYM + <FORM STRUCTURED + [<NODE-NAME <2 .K>> ANY]> + .TRUTH + .FLG + <REST .L 2>>>> + .WHO>)> + <COND (<SET TEM <STRUCTYP .TEM>> + <PUT .NOD ,NODE-TYPE ,LENGTH?-CODE>) + (ELSE + <COND (.VERBOSE + <ADDVMESS .NOD + ("Not open compiled because type is: " + <RESULT-TYPE <1 .K>>)>)> + <PUT .NOD ,NODE-TYPE ,ISUBR-CODE>)> + <TYPE-OK? <FORM OR <FORM FIX + (0 + <COND (<==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> + <NODE-NAME .NOD>) + (ELSE ,PLUSINF)>)> + FALSE> + .RTYP>)>> + +<PUT ,LENGTH? ANALYSIS ,LENGTH?-ANA> + +<DEFINE NTH-REST-ANA (NOD RTYP COD + "OPTIONAL" (TF <>) + "AUX" (K <KIDS .NOD>) (LN <LENGTH .K>) TS VAL TPS + (RV <OR .TF <==? <NODE-NAME .NOD> INTH>>) + (SVWHO ()) + (NM <COND (.RV NTH) (ELSE <NODE-NAME .NOD>)>) XX + (OWHON <AND <==? .WHON <PARENT .NOD>> .NOD>) NUMB) + #DECL ((COD NUMB LN) FIX (NOD WHON PRED) NODE (K) <LIST [REST NODE]> + (WHO SVWHO) LIST) + <SET VAL + <PROG ((WHO ()) (WHON <>)) + #DECL ((WHON) <SPECIAL ANY> (WHO) <SPECIAL LIST>) + <COND + (<SEGFLUSH .NOD .RTYP>) + (ELSE + <COND (<1? .LN> + <PUT .NOD + ,KIDS + <SET K (<1 .K> <NODE1 ,QUOTE-CODE .NOD FIX 1 ()>)>>) + (ELSE <ARGCHK .LN 2 <NODE-NAME .NOD>>)> + <COND (.RV + <OR .TF <SET TF <EANA <2 .K> '<OR FIX OFFSET> .NM>>> + <SET WHON .NOD> + <SET TS <EANA <1 .K> STRUCTURED .NM>>) + (ELSE + <SET WHON .NOD> + <SET TS <EANA <1 .K> STRUCTURED .NM>> + <SET WHON <>> + <OR .TF <SET TF <EANA <2 .K> '<OR FIX OFFSET> .NM>>>)> + <COND (<AND <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> <==? <ISTYPE? .TF> OFFSET>> + <SET TS <TYPE-AND .TS <GET-DECL <NODE-NAME <2 .K>>>>> + <PUT <1 .K> ,RESULT-TYPE .TS>)> + <SET TPS <STRUCTYP .TS>> + <COND (<AND .TPS <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE>> + <SET SVWHO .WHO>)> + <COND + (<AND .TPS + <OR <==? <ISTYPE? .TF> FIX> + <AND <==? <ISTYPE? .TF> OFFSET> + <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE>>> + <N==? <ISTYPE? .TS> TEMPLATE> + <OR <NOT <==? .TPS TEMPLATE>> + <AND <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> <ISTYPE? .TS>>>> + <PUT .NOD ,NODE-TYPE .COD>) + (ELSE + <AND <==? .COD ,NTH-CODE> <PUT .NOD ,NODE-NAME NTH>> + <COND (.VERBOSE + <ADDVMESS .NOD ("Not open compiled because type is: " .TS)>)> + <PUT .NOD ,NODE-TYPE ,ISUBR-CODE>)> + <TYPE-OK? + <GET-ELE-TYPE + .TS + <COND (<==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> + <SET NUMB + <COND (<==? <ISTYPE? .TF> OFFSET> + <INDEX <NODE-NAME <2 .K>>>) + (ELSE <NODE-NAME <2 .K>>)>>) + (ELSE ALL)> + <==? <NODE-SUBR .NOD> ,REST>> + .RTYP>)>>> + <MAPF <> + <FUNCTION (L "AUX" (SYM <2 .L>) (FL <1 .L>) T1 T2) + #DECL ((L) <LIST ANY SYMTAB [REST ATOM FIX]> (SYM) SYMTAB) + <SET XX (.NM .NUMB !<REST .L 2>)> + <SET-CURRENT-TYPE + .SYM + <TYPE-AND <GET-CURRENT-TYPE .SYM> <TYPE-NTH-REST .VAL .XX>>> + <COND (.OWHON <SET WHO ((.FL .SYM !.XX) !.WHO)>)> + <COND (<AND <==? .PRED <PARENT .NOD>> + <SET T1 <TYPE-OK? .VAL FALSE>> + <SET T2 <TYPE-OK? .VAL '<NOT FALSE>>>> + <SET TRUTH <ADD-TYPE-LIST .SYM .T2 .TRUTH .FL .XX>> + <SET UNTRUTH + <ADD-TYPE-LIST .SYM .T1 .UNTRUTH .FL .XX>>)>> + .SVWHO> + <COND (<AND <==? .TPS LIST> + <OR <==? <NODE-TYPE <1 .K>> ,LVAL-CODE> + <==? <NODE-TYPE <1 .K>> ,SET-CODE>> + <LOOK-FOR .NOD <1 .K> <2 .K> <==? <NODE-SUBR .NOD> ,REST>>> + <PUT .NOD ,NODE-TYPE ,ALL-REST-CODE>) + (<AND <==? .TPS LIST> + <==? .COD ,REST-CODE> + <GASSIGNED? PUT-SAME-CODE> + <==? <NODE-TYPE <1 .K>> ,PUTR-CODE> + <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> + <==? .NUMB 1>> + <PUT .NOD ,NODE-TYPE ,PUTR-CODE>)> + .VAL> + +<DEFINE LOOK-FOR (MN N1 N RFLG "AUX" TT K (S ()) (SS (() () ()))) + #DECL ((S) <LIST [REST NODE]> (N MN N1) NODE (TT) <OR FALSE NODE> + (K) <LIST [REST NODE]>) + <REPEAT () + <COND (<==? <NODE-TYPE .N1> ,LVAL-CODE> + <SET S (.N1 !.S)> + <RETURN>) + (<==? <NODE-TYPE .N1> ,SET-CODE> + <SET S (.N1 !.S)> + <SET N1 <2 <KIDS .N1>>>) + (ELSE <RETURN>)>> + <AND <OR <AND .RFLG + <SET TT <SET-SEARCH .N ,ARITH-CODE .S .SS>> + <==? <NODE-SUBR <SET N .TT>> ,-> + <==? <LENGTH <SET K <KIDS .N>>> 2> + <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> + <==? <NODE-NAME <2 .K>> 1> + <SET N <1 .K>>> + <NOT .RFLG>> + <SET TT <SET-SEARCH .N ,LNTH-CODE .S <REST .SS>>> + <SET TT + <SET-SEARCH <1 <KIDS .TT>> ,LVAL-CODE .S <REST .SS 2>>> + <SMEMQ <NODE-NAME .TT> .S> + <PUT .MN ,TYPE-INFO .SS>>> + +<DEFINE SET-SEARCH (N C S SS "AUX" (L ())) + #DECL ((N) NODE (C) FIX (S) <LIST [REST NODE]> (L SS) LIST) + <REPEAT () + <COND (<==? .C <NODE-TYPE .N>> <PUT .SS 1 .L> <RETURN .N>)> + <COND (<OR <N==? <NODE-TYPE .N> ,SET-CODE> + <SMEMQ <NODE-NAME .N> .S>> + <RETURN <>>)> + <SET L (.N !.L)> + <SET N <2 <KIDS .N>>>>> + +<DEFINE SMEMQ (SYM L) + #DECL ((SYM) SYMTAB (L) LIST) + <MAPR <> + <FUNCTION (LL "AUX" (N <1 .LL>)) + #DECL ((N) NODE) + <COND (<==? <NODE-NAME .N> .SYM> <MAPLEAVE .LL>)>> + .L>> + +<DEFINE NTH-ANA (N R) <NTH-REST-ANA .N .R ,NTH-CODE>> + +<PUT ,NTH ANALYSIS ,NTH-ANA> + +<DEFINE REST-ANA (N R) <NTH-REST-ANA .N .R ,REST-CODE>> + +<PUT ,REST ANALYSIS ,REST-ANA> + +<DEFINE PUT-ANA (NOD RTYP + "OPTIONAL" (TF <>) + "AUX" (K <KIDS .NOD>) (LN <LENGTH .K>) (TS ANY) TV (TPS <>) VAL + (SVWHO ()) WHICH NS TVO TEM (P ()) TFF NUMB + (RV <OR .TF <==? <NODE-NAME .NOD> IPUT>>) + (NM <COND (.RV PUT) (ELSE <NODE-NAME .NOD>)>)) + #DECL ((NOD) NODE (K) <LIST [REST NODE]> (LN NUMB) FIX (WHO P SVWHO) LIST) + <SET VAL + <PROG ((WHO ()) (WHON <>)) + #DECL ((WHO) <SPECIAL LIST> (WHON) <SPECIAL <OR FALSE NODE>>) + <COND + (<SEGFLUSH .NOD .RTYP>) + (<==? .LN 2> + <EANA <1 .K> ANY <NODE-NAME .NOD>> + <EANA <2 .K> ANY <NODE-NAME .NOD>> + <COND (<AND .VERBOSE <==? <NODE-SUBR .NOD> ,PUT>> + <ADDVMESS .NOD ("PUT being used to remove association.")>)> + <PUT .NOD ,NODE-TYPE ,IREMAS-CODE>) + (ELSE + <ARGCHK .LN 3 <NODE-NAME .NOD>> + <COND (.RV + <SET WHON <>> + <OR .TF <SET TF <SET TFF <ANA <2 .K> ANY>>>> + <SET WHON .NOD> + <SET TS <ANA <1 .K> <OR <AND .TF STRUCTURED> ANY>>> + <SET WHON <>>) + (ELSE + <SET WHON .NOD> + <SET TS <ANA <1 .K> ANY>> + <SET WHON <>> + <OR .TF <SET TFF <SET TF <ANA <2 .K> ANY>>>>)> + <SET TV <ANA <3 .K> ANY>> + <COND (<AND <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> <==? <ISTYPE? .TF> OFFSET>> + <SET TS <TYPE-AND .TS <GET-DECL <NODE-NAME <2 .K>>>>> + <PUT <1 .K> ,RESULT-TYPE .TS>)> + <AND <TYPE-OK? .TS '<NOT STRUCTURED>> <SET TS <>>> + <OR <AND <OR <==? <ISTYPE? .TF> FIX> + <AND <==? <ISTYPE? .TF> OFFSET> + <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE>>> + <==? <NODE-SUBR .NOD> ,PUT>> + <SET TF <>>> + <SET NS + <COND (<AND .TF .TS <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE>> + <SET WHICH + <COND (<==? <ISTYPE? .TF> FIX> <NODE-NAME <2 .K>>) + (ELSE <INDEX <NODE-NAME <2 .K>>>)>> + <FORM STRUCTURED + !<COND (<1? .WHICH> (.TV)) + (ELSE ([<- .WHICH 1> ANY] .TV))>>) + (ELSE <SET WHICH ALL> '<STRUCTURED [REST ANY]>)>> + <COND + (<AND .TS .TF <NOT <EMPTY? .WHO>>> + <SET NS + <MAPF ,TYPE-MERGE + <FUNCTION (L "AUX" (S <2 .L>) (ND <1 <DECL-SYM .S>>)) + #DECL ((L) <LIST ANY SYMTAB> (S) SYMTAB) + <SET ND <DECL-DOWN .ND !<REST .L 2>>> + <OR <TYPE-OK? .ND .NS> <MESSAGE ERROR "BAD ARG TO PUT" .NOD>> + <SET ND + <TYPE-AND + <TYPE-AND + <GET-ELE-TYPE .ND .WHICH <> .TV> + <TOP-TYPE <DECL-DOWN <GET-CURRENT-TYPE .S> !<REST .L 2>>>> + .ND>>> + .WHO>> + <SET TV <TYPE-AND .TV <GET-ELE-TYPE .NS .WHICH>>>) + (<NOT <EMPTY? .WHO>> <SET TV ANY>)> + <AND .TS + <PUT <1 .K> ,RESULT-TYPE <SET TS <TYPE-AND <TOP-TYPE .NS> .TS>>>> + <COND (.TS + <SET TVO <GET-ELE-TYPE .TS .WHICH>> + <SET TS <GET-ELE-TYPE .TS .WHICH <> .TV>>)> + <COND (<AND .TS .TF <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE>> + <SET SVWHO .WHO>)> + <COND (<AND .TS .TF> + <PUT .NOD ,SIDE-EFFECTS (.NOD !<SIDE-EFFECTS .NOD>)>)> + <COND + (<AND .TS + .TF + <SET TPS <STRUCTYP .TS>> + <OR <==? <ISTYPE? .TF> FIX> <==? <ISTYPE? .TF> OFFSET>> + <N==? <ISTYPE? .TS> TEMPLATE> + <OR <NOT <==? .TPS TEMPLATE>> + <AND <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> <ISTYPE? .TS>>> + <OR <NOT <==? .TPS LIST>> + <0? <SET TEM <DEFERN .TV>>> + <AND <==? .TEM 1> <1? <DEFERN .TVO>>>>> + <PUT .NOD ,NODE-TYPE ,PUT-CODE> + <COND (<==? <NODE-TYPE <1 .K>> ,QUOTE-CODE> + <MESSAGE ERROR " ATTEMPT TO MUNG QUOTED OBJECT " .NOD>)>) + (ELSE + <COND + (<AND .VERBOSE <==? <NODE-SUBR .NOD> ,PUT>> + <ADDVMESS + .NOD + <COND + (.TF + <COND (<==? .TPS LIST> ("Not open compiled because of defer.")) + (ELSE ("Not open compiled because type is: " .TS))>) + (<NOT <TYPE-OK? .TFF FIX>> + ("PUT used for association manipulation.")) + (ELSE + ("PUT maybe structure or association. Type of 1st arg is: " + .TS + " and that of 2d arg is: " + .TFF))>>)> + <PUT .NOD ,NODE-TYPE ,IPUT-CODE>)>)> + <PUT-FLUSH <OR .TPS ALL>> + <TYPE-OK? <COND (.TS .TS) (ELSE ANY)> .RTYP>>> + <COND + (<==? <NODE-TYPE .NOD> ,PUT-CODE> + <MAPF <> + <FUNCTION (L "AUX" (SYM <2 .L>)) + #DECL ((L) <LIST ANY SYMTAB [REST ATOM FIX]> (SYM) SYMTAB) + <SET-CURRENT-TYPE + .SYM + <PUT-TYPE-HACK <GET-CURRENT-TYPE .SYM> + .TS + <LPR <REST .L 2>> + .WHICH + 0>>> + .SVWHO>)> + <COND (<AND <==? <NODE-TYPE .NOD> ,PUT-CODE> + <GASSIGNED? PUT-SAME-CODE> + <MEMQ .TPS '![LIST VECTOR UVECTOR TUPLE!]> + <MAPF <> + <FUNCTION (N) + <COND (<AND <G=? <LENGTH .N> + <INDEX ,SIDE-EFFECTS>> + <SIDE-EFFECTS .N>> + <MAPLEAVE <>>) + (ELSE T)>> + .K> + <MEMQ <NODE-TYPE <3 .K>> ,HACK-NODES> + <==? <ISTYPE? <RESULT-TYPE <3 .K>>> FIX> + <NOT <EMPTY? <SET TEM <KIDS <3 .K>>>>> + <NOT <OR <==? <NODE-SUBR <3 .K>> ,/> + <AND <==? <NODE-SUBR <3 .K>> ,-> + <NOT <AND <==? <LENGTH .TEM> 2> + <==? <NODE-NAME <2 .TEM>> 1>>>>>> + <MAPR <> + <FUNCTION (L "AUX" (N <1 .L>)) + <COND (<AND <==? <NODE-TYPE .N> ,NTH-CODE> + <SAME-OBJ <1 .K> <1 <KIDS .N>>> + <SAME-OBJ <2 .K> <2 <KIDS .N>>>> + <COND (<NOT <EMPTY? .P>> + <PUTREST .P <REST .L>> + <SET TEM (.N !.TEM)>)> + <MAPLEAVE>)> + <SET P .L> + <>> + .TEM>> + <PUT <3 .K> ,KIDS .TEM> + <PUT .NOD ,NODE-TYPE ,PUT-SAME-CODE>)> + .VAL> + +<DEFINE PUT-TYPE-HACK (TY TS L WHICH EX) + #DECL ((L) <LIST [REST FIX ATOM]>) + <COND (<EMPTY? .L> .TS) + (<AND <EMPTY? <REST .L 2>> <==? <2 .L> REST>> + <GET-ELE-TYPE + .TY + <+ <1 .L> .WHICH> + <> + <PUT-TYPE-HACK <GET-ELE-TYPE .TS .WHICH> + .TS + <REST .L 2> + .WHICH + 0>>) + (<==? <2 .L> REST> + <PUT-TYPE-HACK .TY .TS <REST .L 2> .WHICH <1 .L>>) + (ELSE + <GET-ELE-TYPE + .TY + <+ <1 .L> .EX> + <> + <PUT-TYPE-HACK <GET-ELE-TYPE .TY <+ <1 .L> .EX>> + .TS + <REST .L 2> + .WHICH + 0>>)>> + +<DEFINE LPR (L) + #DECL ((L) LIST) + <COND (<EMPTY? .L> .L) (ELSE (!<LPR <REST .L>> <1 .L>))>> + +<SETG HACK-NODES ![,ABS-CODE ,ARITH-CODE!]> + +<PUT ,PUT ANALYSIS ,PUT-ANA> + +<PUT ,PUTPROP ANALYSIS ,PUT-ANA> + +<DEFINE SAME-OBJ (N1 N2) + #DECL ((N1 N2) NODE) + <COND (<==? <NODE-TYPE .N1> <NODE-TYPE .N2>> + <COND (<MEMQ <NODE-TYPE .N1> ,SNODES> + <==? <NODE-NAME .N1> <NODE-NAME .N2>>) + (ELSE + <MAPF <> + <FUNCTION (N3 N4) + <COND (<SAME-OBJ .N3 .N4>) + (ELSE <MAPLEAVE <>>)>> + <KIDS .N1> + <KIDS .N2>>)>)>> + +<DEFINE DECL-DOWN ("TUPLE" TUP "AUX" (ND <1 .TUP>) (LN <- <LENGTH .TUP> 1>)) + #DECL ((TUP) TUPLE (LN) FIX) + <REPEAT () + <COND (<L? .LN 2> <RETURN .ND>) + (ELSE + <SET ND + <GET-ELE-TYPE + .ND + <NTH .TUP <+ .LN 1>> + <==? <NTH .TUP .LN> REST>>>)> + <SET LN <- .LN 2>>>> + +<DEFINE DECL-UP (NX L) + #DECL ((L) LIST) + <REPEAT ((FIRST T) (NUM 0)) + #DECL ((NUM) FIX (L) LIST) + <COND (<EMPTY? .L> <RETURN .NX>)> + <COND (<==? <1 .L> NTH> + <SET NX + <FORM STRUCTURED + !<COND (<0? <SET NUM <+ .NUM <2 .L> -1>>> ()) + (<1? .NUM> (ANY)) + (ELSE ([.NUM ANY]))> + .NX>> + <SET NUM 0> + <SET FIRST <>>) + (.FIRST <SET NX <REST-DECL .NX <2 .L>>>) + (ELSE <SET NUM <+ .NUM <2 .L>>>)> + <SET L <REST .L 2>>>> + +<DEFINE PUTREST-ANA (NOD RTYP "AUX" (K <KIDS .NOD>) T1 T2) + #DECL ((NOD) NODE (K) <LIST [REST NODE]>) + <COND (<==? <NODE-SUBR .NOD> ,REST> <REST-ANA .NOD .RTYP>) + (<SEGFLUSH .NOD .RTYP> + <PUT .NOD ,SIDE-EFFECTS (.NOD !<SIDE-EFFECTS .NOD>)> + <TYPE-OK? '<PRIMTYPE LIST> .RTYP>) + (ELSE + <ARGCHK <LENGTH .K> 2 PUTREST> + <SET T1 <EANA <1 .K> '<PRIMTYPE LIST> PUTREST>> + <SET T2 <EANA <2 .K> '<PRIMTYPE LIST> PUTREST>> + <COND (<==? <NODE-TYPE <1 .K>> ,QUOTE-CODE> + <MESSAGE ERROR " ATTEMPT TO MUNG QUOTED OBJECT " .NOD>)> + <PUT .NOD ,NODE-TYPE ,PUTR-CODE> + <PUT .NOD ,SIDE-EFFECTS (.NOD !<SIDE-EFFECTS .NOD>)> + <TYPE-OK? .T1 .RTYP>)>> + +<PUT ,PUTREST ANALYSIS ,PUTREST-ANA> + +<DEFINE MEMQ-ANA (N R "AUX" (K <KIDS .N>) TYP VTYP STYP ETY) + #DECL ((N) NODE (K) <LIST [REST NODE]>) + <COND + (<SEGFLUSH .N .R>) + (ELSE + <ARGCHK <LENGTH .K> 2 MEMQ> + <SET VTYP <EANA <1 .K> ANY MEMQ>> + <SET TYP <EANA <2 .K> STRUCTURED MEMQ>> + <COND (<NOT <TYPE-OK? .VTYP <SET ETY <GET-ELE-TYPE .TYP ALL>>>> + <MESSAGE WARNING "MEMQ NEVER TRUE " .N>)> + <COND (<AND <SET STYP <STRUCTYP .TYP>> <N==? .STYP TEMPLATE>> + <PUT .N ,NODE-TYPE ,MEMQ-CODE>) + (ELSE + <COND (.VERBOSE <ADDVMESS .N ("Not open compiled because type is: " + .TYP)>)> + <PUT .N ,NODE-TYPE ,ISUBR-CODE>)> + <TYPE-OK? <TYPE-MERGE FALSE + <COND (<AND .ETY <N==? .ETY ANY>> + <FORM <COND (.STYP) (STRUCTURED)> + [REST .ETY]>) + (.STYP) + (STRUCTURED)>> + .R>)>> + +<PUT ,MEMQ ANALYSIS ,MEMQ-ANA> + +<ENDPACKAGE> + + \ No newline at end of file diff --git a/<mdl.comp>/strgen.mud.33 b/<mdl.comp>/strgen.mud.33 new file mode 100644 index 0000000..f2c7640 --- /dev/null +++ b/<mdl.comp>/strgen.mud.33 @@ -0,0 +1,1867 @@ +<PACKAGE "STRGEN"> + +<ENTRY NTH-GEN REST-GEN PUT-GEN LNTH-GEN MT-GEN PUTREST-GEN IPUT-GEN + IREMAS-GEN FLUSH-COMMON-SYMT COMMUTE-STRUC DEFER-IT PUT-COMMON-DAT + LIST-LNT-SPEC RCHK> + +<USE "CODGEN" "CACS" "COMCOD" "CHKDCL" "COMPDEC" "SPCGEN" "COMTEM" "CARGEN"> + +<GDECL (PATTRNS) + <UVECTOR [REST <LIST [REST <OR ATOM LIST>]>]> + (RESTERS NTHERS PUTTERS) + VECTOR + (STYPES) + <UVECTOR [REST ATOM]>> + +<DEFINE PREG? (TYP TRY "AUX" (FTYP <ISTYPE? .TYP>)) + <COND (.FTYP <REG? .FTYP .TRY>) (ELSE <REG? TUPLE .TRY> + ;"Fool REG? into not losing.")>> + + +<DEFINE LIST-LNT-SPEC (N W NF BR DI NUM + "AUX" (K <KIDS .N>) REG RAC (FLS <==? .W FLUSHED>) + (B2 <COND (<AND .BR .FLS> .BR) (ELSE <MAKE:TAG>)>) + (SDIR .DI) (B3 <>) B4 F1 F2 F3 + (SBR <NODE-NAME .N>) TT) + #DECL ((N) NODE (NUM) FIX (RAC) AC (K) <LIST [REST NODE]>) + <SET REG + <GEN <SET TT <1 <KIDS <COND (<==? <NODE-TYPE <1 .K>> ,QUOTE-CODE> <2 .K>) + (ELSE <1 .K>)>>>> + <COND (<SET TT <ISTYPE? <RESULT-TYPE .TT>>> <DATUM .TT ANY-AC>) + (ELSE DONT-CARE)>>> + <SET RAC <DATVAL <SET REG <TOACV .REG>>>> + <DATTYP-FLUSH .REG> + <AND .NF <SET DI <NOT .DI>>> + <SET DI <COND (<AND .BR <NOT .FLS>> <NOT .DI>) (ELSE .DI)>> + <AND .DI <SET SBR <FLIP .SBR>>> + <VAR-STORE <>> + <SET F1 <MEMQ .SBR '![==? G? G=? 1? 0?!]>> + <SET F2 <MEMQ .SBR '![G? G=?!]>> + <SET F3 <MEMQ .SBR '![L? L=?!]>> + <COND (<OR <==? .SBR L=?> <==? .SBR G?>> <SET NUM <- .NUM 1>>)> + <COND (<L=? .NUM 2> + <REPEAT ((FLG T) (RAC1 .RAC)) + <EMIT <INSTRUCTION + <COND (<OR <NOT <0? .NUM>> <NOT .F1>> `JUMPE ) + (ELSE `JUMPN )> + <ACSYM .RAC> + <COND (<0? .NUM> .B2) + (.F3 .B2) + (<OR .F2 <NOT .F1>> + <OR .B3 <SET B3 <MAKE:TAG>>>) + (ELSE .B2)>>> + <COND (<L? <SET NUM <- .NUM 1>> 0> + <AND .B3 <LABEL:TAG .B3>> + <RETURN>)> + <COND (<AND .FLG <ACRESIDUE .RAC> + <G? <CHTYPE <FREE-ACS T> FIX> 0>> + <SET RAC <GETREG <>>>) + (.FLG <MUNG-AC .RAC .REG>) + (ELSE <SET RAC1 .RAC>)> + <SET FLG <>> + <EMIT <INSTRUCTION `HRRZ + <ACSYM .RAC> + (<ADDRSYM .RAC1>)>>>) + (ELSE + <MUNG-AC .RAC .REG> + <EMIT <INSTRUCTION `MOVEI + `O + <COND (<OR .F2 .F3> <+ .NUM 1>) (ELSE .NUM)>>> + <LABEL:TAG <SET B4 <MAKE:TAG>>> + <EMIT <INSTRUCTION `JUMPE + <ACSYM .RAC> + <COND (<AND <NOT .F3> <OR .F2 <NOT .F1>>> + <OR .B3 <SET B3 <MAKE:TAG>>>) + (ELSE .B2)>>> + <EMIT <INSTRUCTION `HRRZ <ACSYM .RAC> (<ADDRSYM .RAC>)>> + <EMIT <INSTRUCTION `SOJG `O .B4>> + <COND (<OR .F3 .F2> <AND .B3 <BRANCH:TAG .B2>>) + (ELSE + <EMIT <INSTRUCTION <COND (.F1 `JUMPN ) (ELSE `JUMPE )> + <ACSYM .RAC> + .B2>>)> + <COND (.B3 <LABEL:TAG .B3>)>)> + <PUT .RAC ,ACPROT <>> + <RET-TMP-AC .REG> + <COND (<NOT .BR> <TRUE-FALSE .N .B2 .W>) + (<NOT .FLS> + <SET W <MOVE:ARG <REFERENCE .SDIR> .W>> + <BRANCH:TAG .BR> + <LABEL:TAG .B2> + .W)>> + +<DEFINE LNTH-GEN (NOD WHERE + "AUX" (STRN <1 <KIDS .NOD>>) T1 T2 STR + (ITYP <RESULT-TYPE .STRN>) (TYP <STRUCTYP .ITYP>) RAC + REG (NEGOK <>) (*2OK <>) (HWOK <>) (SWOK <>) TR TRIN + TROUT (MUNG <>)) + #DECL ((STRN NOD) NODE (K) <LIST [REST NODE]> (STR REG) DATUM (RAC) AC + (T1 T2) ATOM (TRIN TROUT) <UVECTOR [7 FIX]> (TRANSFORM) TRANS) + <COND (<AND <ASSIGNED? TRANSFORM> + <==? <PARENT .NOD> <1 <SET TR .TRANSFORM>>>> + <SET TROUT <3 .TR>> + <SET NEGOK <NOT <0? <1 <SET TRIN <2 .TR>>>>>> + <SET *2OK + <AND <OR <==? .TYP VECTOR> <==? .TYP TUPLE>> + <OR <1? <4 .TRIN>> + <AND <==? 2 <4 .TRIN>> <==? 2 <5 .TRIN>>> + <AND <NOT .NEGOK> + <==? 2 <4 .TRIN>> + <==? <5 .TRIN> -2> + <SET NEGOK T>>>>> + <SET HWOK <==? 2 <6 .TRIN>>> + <SET SWOK <NOT <0? <7 .TRIN>>>>)> + <SET STR <GEN .STRN DONT-CARE>> + <RET-TMP-AC <SET RAC <DATVAL <SET REG <REG? FIX .WHERE T>>>> + .REG> + <MUNG-AC .RAC .REG> + <COND + (<==? .TYP LIST> + <MOVE:ARG .STR .REG> + <RET-TMP-AC <DATTYP .REG> .REG> + <PUT .REG ,DATTYP FIX> + <EMIT '<`MOVSI 0 *400000*>> + <LABEL:TAG <SET T1 <MAKE:TAG>>> + <EMIT <INSTRUCTION `JUMPE <ACSYM .RAC> <SET T2 <MAKE:TAG>>>> + <EMIT <INSTRUCTION `HRRZ <ACSYM .RAC> (<ADDRSYM .RAC>)>> + <EMIT <INSTRUCTION `AOBJN 0 .T1>> + <LABEL:TAG .T2> + <EMIT <INSTRUCTION `HRRZ <ACSYM .RAC> 0>>) + (<==? <TYPEPRIM .TYP> TEMPLATE> + <SGETREG .RAC .REG> + <PUT .RAC ,ACPROT T> + <GET:TEMPLATE:LENGTH <ISTYPE? .ITYP> .STR .RAC> + <RET-TMP-AC .STR>) + (<MEMQ .TYP '![UVECTOR VECTOR TUPLE STORAGE!]> + <SGETREG .RAC .REG> + <PUT .RAC ,ACPROT T> + <COND (.SWOK <PUT .TROUT 7 1> <PUT .TROUT 6 1>) + (.HWOK + <PUT .TROUT 6 1> + <SET MUNG T> + <EMIT <INSTRUCTION `HLRZ <ACSYM .RAC> !<ADDR:VALUE .STR>>>) + (ELSE + <EMIT <INSTRUCTION `HLRE <ACSYM .RAC> !<ADDR:VALUE .STR>>> + <SET MUNG T>)> + <COND (.NEGOK <COND (<N==? <5 .TRIN> -2> <PUT .TROUT 1 1>)>) + (ELSE + <COND (.MUNG <EMIT <INSTRUCTION `MOVNS <ADDRSYM .RAC>>>) + (ELSE + <EMIT <INSTRUCTION `MOVN + <ACSYM .RAC> + !<ADDR:VALUE .STR>>>)> + <SET MUNG T>)> + <OR <==? .TYP UVECTOR> + <==? .TYP STORAGE> + <COND (.*2OK + <PUT .TROUT 4 2> + <PUT .TROUT 5 <COND (<1? <4 .TRIN>> 2) (ELSE <5 .TRIN>)>>) + (ELSE + <COND (<NOT .MUNG> + <EMIT <INSTRUCTION `MOVE + <ACSYM .RAC> + !<ADDR:VALUE .STR>>>)> + <EMIT <INSTRUCTION `ASH <ACSYM .RAC> -1>> + <SET MUNG T>)>> + <COND (<NOT .MUNG> + <RET-TMP-AC .REG> + <DATTYP-FLUSH .STR> + <PUT .STR ,DATTYP FIX> + <SET REG .STR>) + (ELSE <RET-TMP-AC .STR>)>) + (ELSE + <SGETREG .RAC .REG> + <PUT .RAC ,ACPROT T> + <EMIT <INSTRUCTION `HRRZ <ACSYM .RAC> !<ADDR:TYPE .STR>>> + <RET-TMP-AC .STR>)> + <PUT .RAC ,ACPROT <>> + <MOVE:ARG .REG .WHERE>> + + +<DEFINE MT-GEN (NOD WHERE + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" (STRN <1 <KIDS .NOD>>) RAC STR (ITYP <RESULT-TYPE .STRN>) + (SDIR .DIR) (TYP <STRUCTYP .ITYP>) + (FLS <==? .WHERE FLUSHED>) + (B2 <COND (<AND .BRANCH .FLS> .BRANCH) (ELSE <MAKE:TAG>)>) + (TEMP? <==? <TYPEPRIM .TYP> TEMPLATE>)) + #DECL ((STR) DATUM (STRN NOD) NODE (RAC) AC (B2) ATOM + (BRANCH) <OR ATOM FALSE>) + <COND (.TEMP? + <SET STR <GEN .STRN DONT-CARE>> + <TOACV .STR> + <PUT <CHTYPE <DATVAL .STR> AC> ,ACPROT T> + <GET:TEMPLATE:LENGTH <ISTYPE? .ITYP> + .STR + <SET RAC <GETREG <>>>> + <PUT <CHTYPE <DATVAL .STR> AC> ,ACPROT <>> + <RET-TMP-AC .STR> + <SET STR <DATUM FIX .RAC>> + <PUT .RAC ,ACLINK (.STR !<ACLINK .RAC>)>) + (<AND <SET ITYP <ISTYPE-GOOD? .ITYP>> <G? <CHTYPE <FREE-ACS T> FIX> 0>> + <SET STR <GEN .STRN <DATUM .ITYP ANY-AC>>>) + (ELSE <SET STR <GEN .STRN DONT-CARE>>)> + <AND .NOTF <SET DIR <NOT .DIR>>> + <SET DIR + <COND (<AND .BRANCH <NOT .FLS>> <NOT .DIR>) (ELSE .DIR)>> + <VAR-STORE <>> + <COND (<AND <TYPE? <DATVAL .STR> AC> <N==? .TYP STRING> <N==? .TYP BYTES>> + <SET RAC <DATVAL .STR>> + <COND (<OR <==? .TYP LIST> .TEMP?> + <EMIT <INSTRUCTION <COND (.DIR `JUMPE ) (ELSE `JUMPN )> + <ACSYM .RAC> + .B2>>) + (ELSE + <EMIT <INSTRUCTION <COND (.DIR `JUMPGE ) (ELSE `JUMPL )> + <ACSYM .RAC> + .B2>>)>) + (<AND <TYPE? <DATTYP .STR> AC> <OR <==? .TYP STRING> <==? .TYP BYTES>>> + <SET RAC <DATTYP .STR>> + <EMIT <INSTRUCTION <COND (.DIR `TRNN ) (ELSE `TRNE )> + <ACSYM .RAC> + -1>> + <BRANCH:TAG .B2>) + (ELSE + <COND (<==? .TYP LIST> + <EMIT <INSTRUCTION <COND (.DIR `SKIPN ) (ELSE `SKIPE )> + !<ADDR:VALUE .STR>>> + <BRANCH:TAG .B2>) + (<OR <==? .TYP STRING> <==? .TYP BYTES>> + <EMIT <INSTRUCTION `HRRZ !<ADDR:TYPE .STR>>> + <EMIT <INSTRUCTION <COND (.DIR `JUMPE ) (ELSE `JUMPN )> + .B2>>) + (ELSE + <EMIT <INSTRUCTION <COND (.DIR `SKIPL ) (ELSE `SKIPGE )> + !<ADDR:VALUE .STR>>> + <BRANCH:TAG .B2>)>)> + <RET-TMP-AC .STR> + <COND (<NOT .BRANCH> <TRUE-FALSE .NOD .B2 .WHERE>) + (<NOT .FLS> + <SET WHERE <MOVE:ARG <REFERENCE .SDIR> .WHERE>> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2> + .WHERE)>> + + +<DEFINE REST-GEN (NOD WHERE + "AUX" (K <KIDS .NOD>) (TYP <RESULT-TYPE <1 .K>>) + (TPS <STRUCTYP .TYP>) (2ARG <2 .K>) (1ARG <1 .K>) + (NRP <NTH-REST-PUT? .1ARG>) + (NUMKN <==? <NODE-TYPE .2ARG> ,QUOTE-CODE>) + (NUM <COND (.NUMKN <NODE-NAME .2ARG>) (ELSE 0)>) + (NR <GET-RANGE <RESULT-TYPE .2ARG>>) W TEM) + #DECL ((NOD) NODE (K) <LIST NODE NODE> (TPS) ATOM (NUM) FIX) + <COND (<SET TEM <FIND-COMMON .NOD>> + <SET W <MOVE:ARG <GET-COMMON-DATUM .TEM> .WHERE>>) + (<PROG ((COMMON-SUB <>)) + #DECL ((COMMON-SUB) <SPECIAL <OR FALSE COMMON>>) + <SET W + <APPLY <NTH ,RESTERS + <LENGTH <CHTYPE <MEMQ .TPS ,STYPES> UVECTOR>>> + .NOD + .WHERE + .TYP + .TPS + .NUMKN + .NUM + <1 .K> + .2ARG + T + <> + .NR>> + <SET TEM .COMMON-SUB>>)> + <HACK-COMMON REST + .1ARG + .TEM + .WHERE + .W + .NUMKN + .NUM + .TPS + .NRP> + .W> + +<DEFINE VEC-REST (NOD WHERE TYP TPS NUMKN NUM STRNOD NUMNOD R? RV NR + "AUX" (ML <MINL .TYP>) N SAC STR (MP <MPCNT .TPS>) NUMN + (ONO .NO-KILL) (NO-KILL .ONO) (LCAREFUL .CAREFUL) + (W2 + <COND (.R? DONT-CARE) + (ELSE + <REG? <COND (<SET TYP <ISTYPE? .TYP>>) + (ELSE .TPS)> + .WHERE>)>)) + #DECL ((NOD NUMNOD STRNOD) NODE (STR NUMN) DATUM (ML N MP NUM) FIX + (SAC) AC (NUMNK R? RV) <OR ATOM FALSE> + (NR) <OR FALSE <LIST FIX FIX>> (WHERE W2) <OR ATOM DATUM> + (NO-KILL) <SPECIAL LIST>) + <SET RV <COMMUTE-STRUC .RV .STRNOD .NUMNOD>> + <COND (.NUMKN + <COND (<L? .NUM 0> + <MESSAGE ERROR "ARG OUT OF RANGE " <NODE-NAME .NOD>>) + (<0? .NUM> + <SET STR <GEN .STRNOD .W2>> + <COND (<AND .LCAREFUL <NOT .R?> <0? .ML>> + <TOACV .STR> + <RCHK <DATVAL .STR> .R?>)> + <COND (<NOT <AND .TYP <NOT .R?>>> + <TOACV .STR> + <MUNG-AC <DATVAL .STR> .STR>)>) + (ELSE + <TOACV <SET STR <GEN .STRNOD .W2>>> + <MUNG-AC <SET SAC <DATVAL .STR>> .STR> + <EMIT <INSTRUCTION `ADD + <ACSYM .SAC> + [<FORM (<SET N <* .NUM .MP>>) .N>]>> + <AND .LCAREFUL + <COND (.R? <G? .NUM .ML>) (ELSE <G=? .NUM .ML>)> + <RCHK .SAC .R?>>)>) + (ELSE + <COND (.RV + <SET NUMN <GEN .NUMNOD <REG? FIX .WHERE>>> + <SET STR <GEN .STRNOD DONT-CARE>>) + (ELSE + <SET STR <GEN .STRNOD DONT-CARE>> + <SET NUMN <GEN .NUMNOD <REG? FIX .WHERE>>>)> + <DELAY-KILL .NO-KILL .ONO> + <TOACV .NUMN> + <PUT <SET SAC <DATVAL .NUMN>> ,ACPROT T> + <MUNG-AC .SAC .NUMN> + <PUT .SAC ,ACPROT T> + <TOACV .STR> + <AND .LCAREFUL + <NOT <AND .NR + <COND (.R? <G=? <1 .NR> 0>) + (ELSE <G? <1 .NR> 0>)>>> + <EMIT <INSTRUCTION <COND (.R? `JUMPL ) (ELSE `JUMPLE )> + <ACSYM .SAC> + |CERR1 >>> + <OR <1? .MP> <EMIT <INSTRUCTION `ASH <ACSYM .SAC> 1>>> + <EMIT <INSTRUCTION `HRLI <ACSYM .SAC> (<ADDRSYM .SAC>)>> + <EMIT <INSTRUCTION `ADD <ACSYM .SAC> !<ADDR:VALUE .STR>>> + <RET-TMP-AC <DATTYP .NUMN> .NUMN> + <PUT .NUMN ,DATTYP <DATTYP .STR>> + <COND (<TYPE? <DATTYP .STR> AC> + <PUT <DATTYP .STR> + ,ACLINK + (.NUMN !<ACLINK <DATTYP .STR>>)>)> + <RET-TMP-AC .STR> + <PUT .SAC ,ACPROT <>> + <SET STR .NUMN> + <AND .LCAREFUL + <NOT <AND .NR <L=? <2 .NR> .ML>>> + <RCHK .SAC T>>)> + <COND (<NOT <==? .TPS TUPLE>> + <COND (<OR .R? .TYP> + <RET-TMP-AC <DATTYP .STR> .STR> + <PUT .STR ,DATTYP <COND (.R? .TPS) (ELSE .TYP)>>)>)> + <MOVE:ARG .STR .WHERE>> + +<DEFINE LIST-REST (NOD WHERE TYP TPS NUMKN NUM STRNOD NUMNOD R? RV NR + "OPTIONAL" (PAC <>) PN (SAME? <>) + "AUX" (ONO .NO-KILL) (NO-KILL .ONO) + (RR + <AND .PAC <NOT .SAME?> + <COMMUTE-STRUC <> .PN .NUMNOD> + <COMMUTE-STRUC <> .PN .STRNOD>>) VN + (NNUMKN .NUMKN) (NUMK <>) (NCAREFUL .CAREFUL) (FLAC <>) + STR SAC SAC1 (TYP1 <COND (<ISTYPE? .TYP>) (ELSE LIST)>) + NUMN NAC (T1 <MAKE:TAG>) (T2 <MAKE:TAG>) NTHCASE TEM + (ONE-OR-TWO-HRRZS <>) (PSTR <>) HI LO (REDEF <>)) + #DECL ((PN NOD STRNOD NUMNOD) NODE (STR NUMN VN) DATUM (T1 T2 TYP1 TPS) ATOM + (SAC SAC1 NAC) AC (NUM NTHCASE) FIX (NO-KILL) <SPECIAL LIST> + (R? RR RV NUMK NUMKN NNUMKN) <OR ATOM FALSE> (WHERE) <OR ATOM DATUM> + (PAC) <OR ATOM FALSE AC> (PSTR) <OR DATUM FALSE> (HI LO) FIX + (NR) <OR FALSE <LIST FIX FIX>>) + <COND (.PAC + <COND (<1? <CHTYPE <DEFERN <RESULT-TYPE .PN>> FIX>> <SET REDEF T>) + (<AND .NUMKN <1? <CHTYPE <DEFERN <GET-ELE-TYPE .TYP <+ .NUM 1>>> FIX>>> + <SET REDEF T>) + (<1? <CHTYPE <DEFERN <GET-ELE-TYPE .TYP ALL>> FIX>> <SET REDEF T>)>)> + <SET RV <AND <NOT .SAME?> <COMMUTE-STRUC .RV .NUMNOD .STRNOD>>> + <COND (.NR + <COND (<==? <SET LO <1 .NR>> <SET HI <2 .NR>>> <SET NUMKN T>) + (ELSE <SET NNUMKN T>)> + <SET NUM .HI> + <AND <NOT .NUMKN> + <L=? .NUM <MINL .TYP>> + <COND (.R? <G=? .LO 0>) (ELSE <G? .LO 0>)> + <SET NUMK T>> + <COND (<AND <G=? .LO 0> <L=? .NUM <MINL .TYP>>> + <SET NCAREFUL <>>)>)> + <SET NTHCASE + <+ <COND (.R? 0) (ELSE 12)> + <COND (<AND .NR <G? .LO 0> <G? .HI <MINL .TYP>>> 2) + (ELSE 0)> + <COND (<AND .NR + <OR <COND (.R? <G=? .LO 0>) (ELSE <G? .LO 0>)> + <L=? .NUM <MINL .TYP>>>> + 1) + (ELSE 0)> + <COND (<AND .NR + <L=? .NUM <MINL .TYP>> + <COND (.R? <L? .LO 0>) (ELSE <L=? .LO 0>)>> + 1) + (ELSE 0)> + <COND (<OR <AND <NOT .NUMK> <NOT .NUMKN>> + <AND .NCAREFUL + <G? <COND (.R? .NUM) (ELSE <+ .NUM 1>)> + <MINL .TYP>>>> + 0) + (ELSE 1)> + <COND (<NOT .NUMKN> 8) + (<AND <NOT .NUMK> <SET FLAC <0? .NUM>>> 0) + (<AND <NOT .NUMK> <SET FLAC <1? .NUM>>> 2) + (<AND <NOT .NUMK> <SET FLAC <==? .NUM 2>>> 4) + (ELSE 6)>>> + <COND (<OR <AND <G? .NTHCASE 1> <L? .NTHCASE 6>> + <AND <G? .NTHCASE 13> <L? .NTHCASE 18>>> + <SET ONE-OR-TWO-HRRZS T>)> + <COND + (.RR + <PREFER-DATUM .WHERE> + <SET VN + <GEN + .PN + <COND + (<SET TEM + <AND + <NOT .REDEF> + <OR <ISTYPE? <RESULT-TYPE .PN>> + <ISTYPE? + <TYPE-MERGE <GET-ELE-TYPE <RESULT-TYPE .STRNOD> + <COND (.NUMKN <+ .NUM 1>) (ELSE ALL)>> + <GET-ELE-TYPE <RESULT-TYPE .NOD> + <COND (.NUMKN <+ .NUM 1>) + (ELSE ALL)>>>>>>> + <DATUM .TEM ANY-AC>) + (ELSE <DATUM ANY-AC ANY-AC>)>>> + <SET PUT-COMMON-DAT .VN>)> + <COND (.RV + <OR .NUMKN + .FLAC + <SET NUMN <GEN .NUMNOD <DATUM FIX ANY-AC>>>> + <SET STR + <GEN .STRNOD + <COND (.PAC <PREG? .TYP .WHERE>) + (ELSE <REG? .TYP1 .WHERE>)>>>) + (ELSE + <SET STR + <GEN .STRNOD + <COND (.PAC <PREG? .TYP .WHERE>) + (ELSE <REG? .TYP1 .WHERE>)>>> + <OR .FLAC + .NUMKN + <SET NUMN <GEN .NUMNOD <DATUM FIX ANY-AC>>>>)> + <COND (<OR .RR <NOT .PAC>> <DELAY-KILL .NO-KILL .ONO>)> + <TOACV .STR> + <COND (<AND .PAC + <SET PAC <CHTYPE <DATVAL .STR> AC>> + <PUT .PAC ,ACPROT T> + <NOT <==? .WHERE FLUSHED>> + <OR <G? .NTHCASE 13> .REDEF>> + <PUT <SET SAC <GETREG <SET PSTR <DATUM .TYP1 LIST>>>> + ,ACPROT + T> + <PUT .PSTR ,DATVAL .SAC> + <OR .ONE-OR-TWO-HRRZS + <EMIT <INSTRUCTION `MOVEI <ACSYM .SAC> (<ADDRSYM .PAC>)>>>) + (ELSE <SET SAC <DATVAL .STR>>)> + <PUT .SAC ,ACPROT T> + <COND (<AND .NUMKN <NOT .FLAC>> + <SET NAC + <DATVAL <SET NUMN + <MOVE:ARG <REFERENCE .NUM> <DATUM FIX ANY-AC>>>>>) + (<NOT .FLAC> <TOACV .NUMN> <SET NAC <DATVAL .NUMN>>)> + <COND (<AND <NOT .PSTR> + <ISTYPE? .TYP> + <ACRESIDUE .SAC> + .ONE-OR-TWO-HRRZS + <NOT <AND <TYPE? .WHERE DATUM> <==? <DATVAL .WHERE> .SAC>>> + <G? <CHTYPE <FREE-ACS T> FIX> 0>> + <SET SAC1 <GETREG <>>> + <AND .PAC <SET PAC .SAC1>>) + (<AND .PSTR .ONE-OR-TWO-HRRZS> + <SET SAC1 .SAC> + <SET SAC .PAC>) + (ELSE <SET SAC1 .SAC>)> + <PUT .SAC ,ACPROT <>> + <AND .PAC <PUT <CHTYPE .PAC AC> ,ACPROT <>>> + <AND <==? .SAC .SAC1> + <NOT <L=? .NTHCASE 1>> + <N==? .NTHCASE 12> + <N==? .NTHCASE 13> + <MUNG-AC .SAC <COND (.PSTR .PSTR) (ELSE .STR)>>> + <AND <ASSIGNED? NAC> <MUNG-AC .NAC .NUMN>> + <MAPF <> + <FUNCTION (APAT) + #DECL ((APAT) <OR ATOM LIST>) + <COND (<TYPE? .APAT ATOM> + <LABEL:TAG <COND (<==? .APAT T1> .T1) (ELSE .T2)>>) + (<EMPTY? .APAT> T) + (ELSE + <EMIT <MAPF ,INSTRUCTION + <FUNCTION (ITM) + <COND (<==? .ITM A11> <ACSYM .SAC>) + (<==? .ITM IA11> (<ADDRSYM .SAC>)) + (<==? .ITM A1> <ACSYM .SAC1>) + (<==? .ITM A2> <ACSYM .NAC>) + (<==? .ITM IA1> (<ADDRSYM .SAC1>)) + (<==? .ITM IA2> (<ADDRSYM .NAC>)) + (<==? .ITM T1> .T1) + (<==? .ITM T2> .T2) + (ELSE .ITM)>> + .APAT>>)>> + <NTH ,PATTRNS <+ .NTHCASE 1>>> + <OR .FLAC <RET-TMP-AC .NUMN>> + <COND (<AND <NOT .PSTR> <N==? .SAC .SAC1>> + <RET-TMP-AC .STR> + <SET STR <DATUM .TYP1 .SAC1>> + <PUT .SAC1 ,ACLINK (.STR)>)> + <COND + (<AND .SAME? .PAC> <SPEC-GEN .PN <OR .PSTR .STR> LIST 0>) + (.PAC + <COND + (<NOT .RR> + <SET VN + <GEN + .PN + <COND + (<SET TEM + <AND + <NOT .REDEF> + <OR + <ISTYPE? <RESULT-TYPE .PN>> + <ISTYPE? + <TYPE-MERGE <GET-ELE-TYPE <RESULT-TYPE .STRNOD> + <COND (.NUMKN <+ .NUM 1>) (ELSE ALL)>> + <GET-ELE-TYPE <RESULT-TYPE .NOD> + <COND (.NUMKN <+ .NUM 1>) + (ELSE ALL)>>>>>>> + <DATUM .TEM ANY-AC>) + (ELSE <DATUM ANY-AC ANY-AC>)>>> + <SET PUT-COMMON-DAT .VN>)> + <DELAY-KILL .NO-KILL .ONO> + <COND (.PSTR <TOACV .PSTR> <SET SAC <DATVAL .PSTR>>) + (ELSE <TOACV .STR> <SET SAC <DATVAL .STR>>)> + <COND (.REDEF + <MUNG-AC .SAC> + <EMIT <INSTRUCTION `MOVE <ACSYM .SAC> 1 (<ADDRSYM .SAC>)>> + <TOACT .VN> + <SET PUT-COMMON-DAT .VN> + <EMIT <INSTRUCTION `MOVEM <ACSYM <CHTYPE <DATTYP .VN> AC>> + (<ADDRSYM .SAC>)>>) + (<OR <NOT .TEM> + <NOT <==? .TEM + <ISTYPE? + <GET-ELE-TYPE <RESULT-TYPE .STRNOD> + <COND (.NUMKN <+ .NUM 1>) + (ELSE ALL)>>>>>> + <TOACT .VN> + <SET PUT-COMMON-DAT .VN> + <EMIT <INSTRUCTION `HLLM <ACSYM <CHTYPE <DATTYP .VN> AC>> + (<ADDRSYM .SAC>)>>)> + <TOACV .VN> + <SET PUT-COMMON-DAT .VN> + <EMIT <INSTRUCTION `MOVEM + <ACSYM <CHTYPE <DATVAL .VN> AC>> + 1 + (<ADDRSYM .SAC>)>> + <RET-TMP-AC .VN> + <RET-TMP-AC .PSTR> + <PUT <CHTYPE .PAC AC> ,ACPROT <>>) + (<AND .R? <N==? <ISTYPE? .TYP> LIST>> + <DATTYP-FLUSH .STR> + <PUT .STR ,DATTYP LIST>)> + <MOVE:ARG .STR .WHERE>> + +<SETG PATTRNS + '![() + () + ((`JUMPE A11 |CERR2 ) (`HRRZ A1 IA11)) + ((`HRRZ A1 IA11)) + ((`JUMPE A11 |CERR2 ) + (`HRRZ A1 IA11) + (`JUMPE A1 |CERR2 ) + (`HRRZ A1 IA1)) + ((`HRRZ A1 IA11) (`HRRZ A1 IA1)) + (T1 + (`JUMPE A1 |CERR2 ) + (`HRRZ A1 IA1) + (#OPCODE!-OP!-PACKAGE 33151778816 A2 T1)) + (T1 (`HRRZ A1 IA1) (#OPCODE!-OP!-PACKAGE 33151778816 A2 T1)) + ((`JUMPL A2 |CERR1 ) + (`JUMPE A2 T2) + T1 + (`JUMPE A1 |CERR2 ) + (`HRRZ A1 IA1) + (#OPCODE!-OP!-PACKAGE 33151778816 A2 T1) + T2) + ((`JUMPE A2 T2) + T1 + (`HRRZ A1 IA1) + (#OPCODE!-OP!-PACKAGE 33151778816 A2 T1) + T2) + ((`JUMPE A2 T2) + T1 + (`JUMPE A1 |CERR2 ) + (`HRRZ A1 IA1) + (#OPCODE!-OP!-PACKAGE 33151778816 A2 T1) + T2) + (T1 + (`JUMPE A1 |CERR2 ) + (`HRRZ A1 IA1) + (#OPCODE!-OP!-PACKAGE 33151778816 A2 T1)) + ((`JUMPE A1 |CERR2 )) + () + ((`JUMPE A11 |CERR2 ) (`HRRZ A1 IA11) (`JUMPE A1 |CERR2 )) + ((`HRRZ A1 IA11)) + ((`JUMPE A11 |CERR2 ) + (`HRRZ A1 IA11) + (`JUMPE A1 |CERR2 ) + (`HRRZ A1 IA1) + (`JUMPE A1 |CERR2 )) + ((`HRRZ A1 IA11) (`HRRZ A1 IA1)) + (T1 + (`JUMPE A1 |CERR2 ) + (`HRRZ A1 IA1) + (#OPCODE!-OP!-PACKAGE 33151778816 A2 T1) + (`JUMPE A1 |CERR2 )) + (T1 (`HRRZ A1 IA1) (#OPCODE!-OP!-PACKAGE 33151778816 A2 T1)) + ((`JUMPLE A2 |CERR2 ) + (`SOJE A2 T2) + T1 + (`JUMPE A1 |CERR2 ) + (`HRRZ A1 IA1) + (#OPCODE!-OP!-PACKAGE 33151778816 A2 T1) + T2 + (`JUMPE A1 |CERR2 )) + ((`SOJE A2 T2) + T1 + (`HRRZ A1 IA1) + (#OPCODE!-OP!-PACKAGE 33151778816 A2 T1) + T2) + ((`JUMPLE A2 |CERR1 ) + (`SOJE A2 T2) + T1 + (`HRRZ A1 IA1) + (#OPCODE!-OP!-PACKAGE 33151778816 A2 T1) + T2) + ((`SOJE A2 T2) + T1 + (`JUMPE A1 |CERR2 ) + (`HRRZ A1 IA1) + (#OPCODE!-OP!-PACKAGE 33151778816 A2 T1) + T2 + (`JUMPE A1 |CERR2 ))!]> + +<DEFINE RCHK (AC RORN) + #DECL ((AC) AC (RORN) <OR FALSE ATOM>) + <COND (.RORN + <EMIT <INSTRUCTION `CAILE <ACSYM .AC> -1>> + <BRANCH:TAG |CERR2 >) + (ELSE <EMIT <INSTRUCTION `JUMPGE <ACSYM .AC> |CERR2 >>)>> + +<DEFINE NTH-GEN (NOD WHERE + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" (K <KIDS .NOD>) W2 B2 (SDIR .DIR) + (TYP <RESULT-TYPE <1 .K>>) (TPS <STRUCTYP .TYP>) W + (2ARG <2 .K>) (NUMKN <==? <NODE-TYPE .2ARG> ,QUOTE-CODE>) + (NUM <COND (.NUMKN <COND (<TYPE? <NODE-NAME .2ARG> + OFFSET> + <INDEX <NODE-NAME .2ARG>>) + (ELSE <NODE-NAME .2ARG>)>) (ELSE 1)>) + (COD <LENGTH <CHTYPE <MEMQ .TPS ,STYPES> UVECTOR>>) FLS + (NR <GET-RANGE <RESULT-TYPE .2ARG>>) (TEM <>) + (1ARG <1 .K>) (NRP <NTH-REST-PUT? .1ARG>) NDAT + (DONE <>)) + #DECL ((NOD) NODE (K) <LIST NODE NODE> (TPS) ATOM (NUM COD) FIX + (NDAT) DATUM) + <COND (.NUMKN <PUT .2ARG ,NODE-NAME .NUM>)> + <COND (<AND .BRANCH <NOT <NTH-PRED .COD>>> + <SET W <UPDATE-WHERE .NOD .WHERE>>) + (ELSE <SET W .WHERE>)> + <COND (<SET TEM <FIND-COMMON .NOD>> + <SET W <MOVE:ARG <GET-COMMON-DATUM .TEM> .W>> + <SET DONE T>) + (<AND <SET TEM <FIND-COMMON-REST-NODE .NOD>> + <SET W <LOC-COMMON .TEM .NOD .TPS .1ARG .2ARG .W>>> + <SET DONE T>)> + <PROG ((COMMON-SUB <>)) + #DECL ((COMMON-SUB) + <SPECIAL <OR FALSE COMMON <LIST [REST COMMON]>>>) + <SET W + <COND (<AND <NOT .DONE> <NTH-PRED .COD>> + <APPLY <NTH ,NTHERS .COD> + .NOD + .WHERE + .TYP + .TPS + .NUMKN + .NUM + <1 .K> + .2ARG + .NOTF + .BRANCH + .DIR + .NR>) + (.BRANCH + <AND .NOTF <SET DIR <NOT .DIR>>> + <COND (<NOT .DONE> + <SET W + <APPLY <NTH ,NTHERS .COD> + .NOD + .W + .TYP + .TPS + .NUMKN + .NUM + <1 .K> + .2ARG + .NR>>)> + <VAR-STORE <>> + <OR <SET FLS + <OR <==? .WHERE FLUSHED> + <AND <NOT .NOTF> + <OR <==? .WHERE DONT-CARE> + <=? .W .WHERE>>>>> + <SET DIR <NOT .DIR>>> + <D:B:TAG <COND (.FLS .BRANCH) + (ELSE <SET B2 <MAKE:TAG>>)> + .W + .DIR + <RESULT-TYPE .NOD>> + <SET W2 + <MOVE:ARG <COND (.NOTF + <RET-TMP-AC .W> + <REFERENCE .SDIR>) + (ELSE .W)> + .WHERE>> + <COND (<NOT .FLS> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2>)> + .W2) + (<NOT .DONE> + <APPLY <NTH ,NTHERS .COD> + .NOD + .WHERE + .TYP + .TPS + .NUMKN + .NUM + <1 .K> + .2ARG + .NR>) + (ELSE .W)>> + <SET TEM .COMMON-SUB>> + <COND (<NOT .DONE> + <HACK-COMMON NTH .1ARG .TEM .WHERE .W .NUMKN .NUM .TPS .NRP>)> + .W> + +<DEFINE VEC-NTH (NOD WHERE TYP TPS NUMKN NUM STRNOD NUMNOD NR + "AUX" STRN (MP <MPCNT .TPS>) (RV <==? <NODE-NAME .NOD> INTH>) + STR (TYPR <ISTYPE-GOOD? <RESULT-TYPE .NOD>>)) + #DECL ((NOD STRNOD NUMNOD) NODE (NUM MP) FIX (STR) DATUM + (WHERE) <OR ATOM DATUM> (TYPR RV NUMKN) <OR FALSE ATOM>) + <COND (<NOT <G? .NUM 0>> <MESSAGE ERROR "ARG OUT OF RANGE " NTH>) + (<AND .NUMKN + <OR <NOT .CAREFUL> <NOT <G? .NUM <MINL .TYP>>>>> + <SET STR + <VEC-REST .NOD + DONT-CARE + .TYP + .TPS + T + 0 + .STRNOD + .NUMNOD + <> + .RV + .NR>> + <SET STRN <OFFPTR <+ <* <- .NUM 1> .MP> -2 .MP> .STR .TPS>>) + (ELSE + <SET STR + <VEC-REST .NOD + DONT-CARE + .TYP + .TPS + .NUMKN + <- .NUM 1> + .STRNOD + .NUMNOD + <> + .RV + .NR>> + <SET STRN + <OFFPTR <- <COND (.NUMKN .MP) (ELSE 0)> 2> .STR .TPS>>)> + <MOVE:ARG <DATUM <COND (.TYPR .TYPR) (ELSE .STRN)> .STRN> + .WHERE>> + +<DEFINE LIST-NTH (NOD WHERE TYP TPS NUMKN NUM STRNOD NUMNOD NR + "AUX" STRN STR (ITYP <ISTYPE-GOOD? <RESULT-TYPE .NOD>>)) + #DECL ((NOD STRNOD NUMNOD) NODE (NUM COD) FIX (STR) DATUM (SAC) AC + (WHERE) <OR DATUM ATOM> (ITYP) <OR ATOM FALSE>) + <SET STR + <LIST-REST .NOD + DONT-CARE + .TYP + .TPS + .NUMKN + <- .NUM 1> + .STRNOD + .NUMNOD + <> + <==? <NODE-NAME .NOD> INTH> + .NR>> + <SET STR <DEFER-IT .NOD .STR>> + <SET STRN <OFFPTR 0 .STR LIST>> + <MOVE:ARG <DATUM <COND (.ITYP .ITYP) (ELSE .STRN)> .STRN> + .WHERE>> + +<DEFINE STRING-REST (N W TYP TPS NK NUM STRN NUMN R? RV NR + "OPTIONAL" (VN <>) + "AUX" STRD VD ND SACT SSAC SAC (ML <MINL .TYP>) + (BSYZ <GETBSYZ .TYP>) NWDS NCHRS (ONO .NO-KILL) + (NO-KILL .ONO) TEM (LCAREFUL .CAREFUL) + (OT <COND (<==? .TPS STRING> CHARACTER) (ELSE FIX)>) + (RR + <AND .VN + <COMMUTE-STRUC <> .VN .NUMN> + <COMMUTE-STRUC <> .VN .STRN>>) + (STAY-MEM + <AND .R? + <==? <NODE-TYPE .STRN> ,LVAL-CODE> + <NOT <EMPTY? <SET TEM <PARENT .N>>>> + <==? <NODE-TYPE <CHTYPE .TEM NODE>> ,SET-CODE> + <==? <NODE-NAME .STRN> <NODE-NAME <CHTYPE .TEM NODE>>>>) + (W2 + <COND (<AND .R? <NOT .STAY-MEM>> <REG? .TPS .W>) + (<AND .VN <NOT .RR>> <DATUM ANY-AC ANY-AC>) + (ELSE DONT-CARE)>) (FLS <==? .W FLUSHED>) + SSTRD) + #DECL ((N NUMN STRN) NODE (STRD SSTRD ND VD) DATUM (NUM ML NWDS NCHRS) FIX + (SACT SSAC SAC) AC (NO-KILL) <SPECIAL LIST> + (NR) <OR FALSE <LIST FIX FIX>> (VN) <OR NODE FALSE> + (BSYZ) <OR FIX FALSE>) + <COND (.RR <SET VD <GEN .VN <DATUM .OT ANY-AC>>> <SET PUT-COMMON-DAT .VD>)> + <COND + (.NK + <COND + (<L? .NUM 0> <MESSAGE ERROR " ARG OUT OF RANGE " <NODE-NAME .N> .N>) + (<0? .NUM> + <SET STRD <GEN .STRN .W2>> + <COND (<AND .LCAREFUL <NOT .R?> <0? .ML>> + <EMIT <INSTRUCTION `HRRZ !<ADDR:TYPE .STRD>>> + <EMIT <INSTRUCTION `JUMPE |CERR2 >>)> + <COND (<NOT <AND .TYP <NOT .R?>>> + <TOACV .STRD> + <MUNG-AC <DATVAL .STRD> .STRD>)> + <COND (.VN + <COND (<NOT .RR> + <SET PUT-COMMON-DAT + <SET VD <GEN .VN <DATUM .OT ANY-AC>>>>)> + <COND (<AND .FLS <TYPE? <DATVAL .STRD> AC>> + <TOACV .STRD> + <MUNG-AC <SET SAC <DATVAL .STRD>> .STRD> + <TOACV .VD> + <EMIT <INSTRUCTION `IDPB + <ACSYM <CHTYPE <DATVAL .VD> AC>> + !<ADDR:VALUE .STRD>>>) + (ELSE + <EMIT <INSTRUCTION `MOVE `O !<ADDR:VALUE .STRD>>> + <EMIT <INSTRUCTION `IDPB <ACSYM <CHTYPE <DATVAL .VD> AC>> `O>>)>)>) + (ELSE + <SET STRD <GEN .STRN .W2>> + <COND (<OR <TYPE? <DATTYP .STRD> AC> <TYPE? <DATVAL .STRD> AC>> + <SET STAY-MEM <>>)> + <COND (<AND .VN <NOT .RR>> + <SET VD <GEN .VN <DATUM .OT ANY-AC>>> + <SET PUT-COMMON-DAT .VD>)> + <DELAY-KILL .NO-KILL .ONO> + <COND + (<AND .LCAREFUL <COND (.R? <G? .NUM .ML>) (ELSE <G=? .NUM .ML>)>> + <COND (<AND .R? <NOT .STAY-MEM>> + <TOACT .STRD> + <MUNG-AC <SET SACT <DATTYP .STRD>>>)> + <COND (<TYPE? <DATTYP .STRD> AC> + <EMIT <INSTRUCTION `MOVEI `O (<ADDRSYM <DATTYP .STRD>>)>>) + (ELSE <EMIT <INSTRUCTION `HRRZ `O !<ADDR:TYPE .STRD>>>)> + <COND (<1? .NUM> + <EMIT <INSTRUCTION <COND (.R? `SOJL ) (ELSE `SOJLE )> |CERR2 >>) + (ELSE + <EMIT <INSTRUCTION `SUBI `O .NUM>> + <EMIT <INSTRUCTION <COND (.R? `JUMPL ) (ELSE `JUMPLE )> + `O + |CERR2 >>)> + <COND (.R? + <COND (<TYPE? <DATTYP .STRD> AC> + <EMIT <INSTRUCTION `HRR <ACSYM <DATTYP .STRD>> `O >>) + (ELSE + <EMIT <INSTRUCTION `HRRM `O !<ADDR:TYPE .STRD>>>)>)>) + (<AND <1? .NUM> .R?> + <COND (<NOT .STAY-MEM> + <TOACT .STRD> + <MUNG-AC <SET SACT <DATTYP .STRD>> .STRD>)> + <EMIT <INSTRUCTION #OPCODE!-OP!-PACKAGE 33285996544 + !<ADDR:TYPE .STRD>>>) + (<AND .R? <NOT .STAY-MEM>> + <TOACT .STRD> + <MUNG-AC <SET SACT <DATTYP .STRD>> .STRD> + <EMIT <INSTRUCTION `SUBI <ACSYM .SACT> .NUM>>) + (.R? + <EMIT <INSTRUCTION `MOVNI `O .NUM>> + <EMIT <INSTRUCTION `ADDM `O !<ADDR:TYPE .STRD>>>)> + <COND (<OR <NOT .R?> <NOT .STAY-MEM>> + <TOACV .STRD> + <SET SAC <DATVAL .STRD>>) + (<TYPE? <DATVAL .STRD> AC> <SET SAC <DATVAL .STRD>>)> + <COND (<AND <NOT .FLS> .VN> + <SET SSAC <PUT .SAC ,ACPROT T>> + <SET SAC <GETREG <>>> + <EMIT <INSTRUCTION `MOVE <ACSYM .SAC> <ADDRSYM .SSAC>>> + <SET SSTRD <DATUM <DATTYP .STRD> .SAC>> + <PUT .SSAC ,ACPROT <>>) + (ELSE <SET SSTRD .STRD>)> + <COND + (.BSYZ + <SET NWDS </ 36 .BSYZ>> + <SET NCHRS <MOD .NUM .NWDS>> + <SET NWDS </ .NUM .NWDS>> + <COND (<AND <ASSIGNED? SAC> <NOT .FLS>> <MUNG-AC .SAC .SSTRD>)> + <COND (<NOT <0? .NWDS>> + <COND (<ASSIGNED? SAC> + <EMIT <INSTRUCTION `ADDI <ACSYM .SAC> .NWDS>>) + (ELSE + <EMIT <INSTRUCTION `MOVEI `O .NWDS>> + <EMIT <INSTRUCTION `ADDM `O !<ADDR:VALUE + .SSTRD>>>)>)> + <REPEAT () + <COND (<L? <SET NCHRS <- .NCHRS 1>> 0> <RETURN>)> + <EMIT <INSTRUCTION `IBP `O !<ADDR:VALUE .SSTRD>>>>) + (ELSE + <SET TEM <STRINGER .NUM .STRD .SSTRD>> + <COND (.TEM <SET SSTRD <RSTRING .SSTRD .TEM .STAY-MEM>>) + (<1? .NUM> + <COND (<TYPE? <DATVAL .SSTRD> AC> + <MUNG-AC <DATVAL .SSTRD> .SSTRD>)> + <EMIT <INSTRUCTION `IBP !<ADDR:VALUE .SSTRD>>>) + (ELSE + <COND (<TYPE? <DATVAL .SSTRD> AC> + <MUNG-AC <DATVAL .SSTRD> .SSTRD>)> + <REPEAT () + <COND (<L? <SET NUM <- .NUM 1>> 0> <RETURN>)> + <EMIT <INSTRUCTION `IBP !<ADDR:VALUE .SSTRD>>>>)>)> + <COND (.VN + <PUT .SAC ,ACPROT T> + <TOACV .VD> + <PUT .SAC ,ACPROT <>> + <EMIT <INSTRUCTION `IDPB <ACSYM <CHTYPE <DATVAL .VD> AC>> + <ADDRSYM .SAC>>>) + (ELSE <SET STRD .SSTRD>)>)>) + (ELSE + <SET RV <COMMUTE-STRUC .RV .NUMN .STRN>> + <COND (.RV + <SET ND <GEN .NUMN <REG? FIX .W>>> + <SET STRD <GEN .STRN DONT-CARE>>) + (<NOT <SIDE-EFFECTS .N>> + <SET STRD <GEN .STRN DONT-CARE>> + <SET ND <GEN .NUMN <REG? FIX .W>>>) + (ELSE + <SET STRD <GEN .STRN <DATUM ANY-AC ANY-AC>>> + <SET ND <GEN .NUMN <DATUM FIX ANY-AC>>>)> + <COND (<OR <TYPE? <DATVAL .STRD> AC> <TYPE? <DATTYP .STRD> AC>> + <SET STAY-MEM <>>)> + <COND (<AND .VN <NOT .RR>> + <SET VD <GEN .VN <DATUM .OT ANY-AC>>> + <SET PUT-COMMON-DAT .VD>)> + <DELAY-KILL .NO-KILL .ONO> + <TOACV .ND> + <COND (<AND .LCAREFUL + <OR <NOT .NR> + <COND (.R? <L? <1 .NR> 0>) (ELSE <L=? <1 .NR> 0>)>>> + <EMIT <INSTRUCTION <COND (.R? `JUMPL ) (ELSE `JUMPLE )> + <ACSYM <CHTYPE <DATVAL .ND> AC>> + |CERR1 >>)> + <COND (<OR .R? <AND .LCAREFUL <OR <NOT .NR> <G? <2 .NR> .ML>>>> + <EMIT <INSTRUCTION `HRRZ `O !<ADDR:TYPE .STRD>>> + <COND (<TYPE? <DATVAL .ND> AC> + <EMIT <INSTRUCTION `SUBI `O (<ADDRSYM <DATVAL .ND>>)>>) + (ELSE <EMIT <INSTRUCTION `SUB `O !<ADDR:VALUE .ND>>>)> + <COND (<AND .LCAREFUL <OR <NOT .NR> <G? <2 .NR> .ML>>> + <EMIT <INSTRUCTION `JUMPL `O |CERR2 >>)> + <COND (<AND .STAY-MEM <NOT <TYPE? <DATTYP .STRD> AC>>> + <EMIT <INSTRUCTION `HRRM `O !<ADDR:TYPE .STRD>>>) + (.R? + <TOACT .STRD> + <MUNG-AC <DATTYP .STRD> .STRD> + <EMIT <INSTRUCTION `HRR <ACSYM <CHTYPE <DATTYP .STRD> AC>> `O >>)>)> + <COND (.BSYZ + <SET BSYZ </ 36 .BSYZ>> + <TOACV .ND> + <PUT <SET SAC <DATVAL .ND>> ,ACPROT T> + <MUNG-AC .SAC .ND> + <COND (<==? .SAC ,LAST-AC> + <SGETREG <SET SAC ,LAST-AC-1> <>> + <PUT <SET SACT ,LAST-AC> ,ACPROT <>> + <EMIT <INSTRUCTION `MOVE + <ACSYM ,LAST-AC-1> + <ADDRSYM ,LAST-AC>>>) + (ELSE + <SGETREG <SET SACT <NTH ,ALLACS <+ <ACNUM .SAC> 1>>> <>> + <PUT .SAC ,ACPROT <>>)> + <EMIT <INSTRUCTION `IDIVI <ACSYM .SAC> .BSYZ>>) + (ELSE <SET SAC <STRINGER <> .ND .STRD>>)> + <RET-TMP-AC .ND> + <COND (<AND .VN <NOT .FLS>> + <PUT <SET SACT <NTH ,ALLACS <+ <ACNUM <PUT .SAC ,ACPROT T>> 1>>> + ,ACPROT + T> + <SET SSAC <GETREG <>>> + <EMIT <INSTRUCTION `MOVE <ACSYM .SSAC> !<ADDR:VALUE .STRD>>> + <PUT .SAC ,ACPROT <>> + <PUT .SACT ,ACPROT <>> + <RSTRING <DATUM <DATTYP .STRD> .SSAC> .SAC .STAY-MEM>) + (ELSE <SET STRD <RSTRING .STRD .SAC .STAY-MEM>>)> + <COND (.VN + <COND (.FLS + <TOACV .VD> + <EMIT <INSTRUCTION `DPB + <ACSYM <CHTYPE <DATVAL .VD> AC>> + !<ADDR:VALUE .STRD>>>) + (ELSE + <PUT .SSAC ,ACPROT T> + <TOACV .VD> + <PUT .SSAC ,ACPROT <>> + <EMIT <INSTRUCTION `DPB + <ACSYM <CHTYPE <DATVAL .VD> AC>> + <ADDRSYM .SSAC>>>)>)>)> + <COND (.VN <RET-TMP-AC .VD>)> + <COND (.STAY-MEM <SET STORE-SET T> .STRD) (ELSE <MOVE:ARG .STRD .W>)>> + +<DEFINE STRING-NTH (N W TYP TPS NK NUM STRN NUMN NR "AUX" STRD RES) + #DECL ((N STRN) NODE (STRD) DATUM (RES) <DATUM ATOM AC>) + <PREFER-DATUM .W> + <SET STRD + <STRING-REST .N + DONT-CARE + .TYP + .TPS + .NK + <- .NUM 1> + .STRN + .NUMN + <> + <==? <NODE-NAME .N> INTH> + .NR>> + <SET RES + <DATUM <COND (<==? .TPS STRING> CHARACTER) + (ELSE FIX)> + <COND (<AND <TYPE? .W DATUM> <TYPE? <DATVAL .W> AC>> + <SGETREG <DATVAL .W> <>>) + (ELSE <GETREG <>>)>>> + <PUT <DATVAL .RES> ,ACLINK (.RES !<ACLINK <DATVAL .RES>>)> + <COND (.NK <TOACV .STRD> <MUNG-AC <DATVAL .STRD> .STRD>)> + <RET-TMP-AC .STRD> + <EMIT <INSTRUCTION <COND (.NK `ILDB ) (ELSE `LDB )> + <ACSYM <DATVAL .RES>> + !<ADDR:VALUE .STRD>>> + <MOVE:ARG .RES .W>> + +<DEFINE STRING-PUT (N W TYP TPS NK NUM STRN NUMN VN NR SAME? + "AUX" STRD RES (ONO .NO-KILL) (NO-KILL .ONO)) + #DECL ((NO-KILL) <SPECIAL LIST> (NR) <OR FALSE <LIST FIX FIX>>) + <STRING-REST .N + .W + .TYP + .TPS + .NK + <- .NUM 1> + .STRN + .NUMN + <> + <> + .NR + .VN>> + +<DEFINE STRINGER (NUM ND STRD "AUX" SAC SACT) + #DECL ((STRD ND) DATUM (NUM) <OR FALSE FIX> (SAC SACT) AC) + <COND (<AND .NUM <L? .NUM 5>> <>) + (ELSE + <PUT <SET SAC + <COND (<AND <NOT .NUM> <TYPE? <DATVAL .ND> AC>> + <MUNG-AC <DATVAL .ND> .ND> + <DATVAL .ND>) + (ELSE <GETREG <>>)>> + ,ACPROT + T> + <COND (<==? .SAC ,LAST-AC> + <SET SAC <SGETREG ,LAST-AC-1 <>>> + <PUT <SET SACT ,LAST-AC> ,ACPROT <>> + <SGETREG ,LAST-AC <>>) + (ELSE + <SET SACT <SGETREG <NTH ,ALLACS <+ <ACNUM .SAC> 1>> <>>>)> + <PUT .SAC ,ACPROT <>> + <EMIT <INSTRUCTION `LDB + <ACSYM .SACT> + [<FORM (98688) !<ADDR:VALUE .STRD>>]>> + <EMIT '<`MOVEI `O 36>> + <EMIT <INSTRUCTION `IDIVM `O <ADDRSYM .SACT>>> + <COND (.NUM <EMIT <INSTRUCTION `MOVEI <ACSYM .SAC> .NUM>>) + (<==? .SAC <DATVAL .ND>>) + (ELSE + <PUT .SAC ,ACPROT T> + <EMIT <INSTRUCTION `MOVE + <ACSYM .SAC> + !<ADDR:VALUE .ND>>> + <PUT .SAC ,ACPROT <>>)> + <EMIT <INSTRUCTION `IDIV <ACSYM .SAC> <ADDRSYM .SACT>>> + .SAC)>> + +<DEFINE RSTRING (ST SAC STAY-MEM "AUX" (SAC1 <NTH ,ALLACS <+ <ACNUM .SAC> 1>>)) + #DECL ((SAC SAC1) AC (ST) DATUM) + <COND (<AND <TYPE? <DATVAL .ST> AC> <NOT <ACRESIDUE <DATVAL .ST>>>> + <MUNG-AC <DATVAL .ST> .ST> + <EMIT <INSTRUCTION `ADD <ACSYM <CHTYPE <DATVAL .ST> AC>> <ADDRSYM .SAC>>> + <SET SAC <DATVAL .ST>>) + (.STAY-MEM + <EMIT <INSTRUCTION `ADDM <ACSYM .SAC> !<ADDR:VALUE .ST>>>) + (ELSE + <EMIT <INSTRUCTION `ADD <ACSYM .SAC> !<ADDR:VALUE .ST>>> + <RET-TMP-AC <DATVAL .ST> .ST> + <PUT .ST ,DATVAL .SAC> + <PUT .SAC ,ACLINK (.ST !<ACLINK .SAC>)>)> + <EMIT <INSTRUCTION `JUMPE <ACSYM .SAC1> '.HERE!-OP!-PACKAGE 3>> + <EMIT <INSTRUCTION `IBP !<ADDR:VALUE .ST>>> + <EMIT <INSTRUCTION `SOJG <ACSYM .SAC1> '.HERE!-OP!-PACKAGE -1>> + .ST> + +<SETG RESTERS + [,STRING-REST + ,STRING-REST + ,STRING-REST + ,VEC-REST + ,VEC-REST + ,VEC-REST + ,VEC-REST + ,LIST-REST]> + +<SETG STYPES ![LIST TUPLE VECTOR UVECTOR STORAGE STRING BYTES TEMPLATE!]> + +<DEFINE NTH-PRED (C) #DECL ((C) FIX) <==? .C 1>> + +<SETG NTHERS + [<AND <GASSIGNED? TEMPLATE-NTH> ,TEMPLATE-NTH> + ,STRING-NTH + ,STRING-NTH + ,VEC-NTH + ,VEC-NTH + ,VEC-NTH + ,VEC-NTH + ,LIST-NTH]> + +<DEFINE PUT-GEN (NOD WHERE "OPTIONAL" (SAME? <>) + "AUX" (K <KIDS .NOD>) (TYP <RESULT-TYPE <1 .K>>) + (TPS <STRUCTYP .TYP>) (2ARG <2 .K>) + (NUMKN <==? <NODE-TYPE .2ARG> ,QUOTE-CODE>) + (NUM <COND (.NUMKN <COND (<TYPE? <NODE-NAME .2ARG> + OFFSET> + <INDEX <NODE-NAME .2ARG>>) + (ELSE <NODE-NAME .2ARG>)>) (ELSE 1)>) + (NR <GET-RANGE <RESULT-TYPE .2ARG>>) TEM W (1ARG <1 .K>) + (NRP <NTH-REST-PUT? <1 .K>>) PUT-COMMON-DAT) + #DECL ((NOD) NODE (K) <LIST NODE NODE NODE> (NUM) FIX + (PUT-COMMON-DAT) <SPECIAL DATUM> (W) DATUM) + <COND (.NUMKN <PUT .2ARG ,NODE-NAME .NUM>)> + <COND (<AND <==? .WHERE FLUSHED> + <SET TEM <FIND-COMMON-REST-NODE .NOD>> + <OR <NOT .CAREFUL> <NOT <MEMQ .TPS '[UVECTOR STORAGE]>>>> + <SET W + <COMMON-CLOBBER .TEM + .NOD + <3 .K> + <NODE-NAME .2ARG> + .1ARG + .TPS + .SAME?>> + <SET TEM <>> + <KILL-COMMON .TPS>) + (ELSE + <KILL-COMMON .TPS> + <PROG ((COMMON-SUB <>)) + #DECL ((COMMON-SUB) <SPECIAL <OR FALSE COMMON>>) + <SET W + <APPLY <NTH ,PUTTERS <LENGTH <CHTYPE <MEMQ .TPS ,STYPES> + UVECTOR>>> + .NOD + .WHERE + .TYP + .TPS + .NUMKN + .NUM + <1 .K> + .2ARG + <3 .K> + .NR + .SAME?>> + <SET TEM .COMMON-SUB>> + <OR <==? <TYPEPRIM .TPS> TEMPLATE> + <AND <TYPE? <DATTYP .W> AC> + <MEMQ <DATTYP .W> .PUT-COMMON-DAT>> + <AND <TYPE? <DATVAL .W> AC> + <MEMQ <DATVAL .W> .PUT-COMMON-DAT>> + <HACK-COMMON NTH + .1ARG + .TEM + .PUT-COMMON-DAT + .PUT-COMMON-DAT + .NUMKN + .NUM + .TPS + .NRP> + <HACK-COMMON NTH + .1ARG + .TEM + .PUT-COMMON-DAT + .PUT-COMMON-DAT + .NUMKN + .NUM + .TPS + .NRP>>)> + <COND (.TEM + <OR <==? <TYPEPRIM .TPS> TEMPLATE> + <AND <TYPE? <DATTYP .W> AC> + <MEMQ <DATTYP .W> .PUT-COMMON-DAT>> + <AND <TYPE? <DATVAL .W> AC> + <MEMQ <DATVAL .W> .PUT-COMMON-DAT>> + <HACK-COMMON NTH + .1ARG + .TEM + .PUT-COMMON-DAT + .PUT-COMMON-DAT + .NUMKN + .NUM + .TPS + .NRP> + <HACK-COMMON NTH + .1ARG + .TEM + .PUT-COMMON-DAT + .PUT-COMMON-DAT + .NUMKN + .NUM + .TPS + .NRP>>)> + .W> + +<DEFINE VEC-PUT (N W TYP TPS NK NUM SNOD NNOD VNOD NR SAME? + "AUX" VN (ONO .NO-KILL) (NO-KILL .ONO) + (RV <AND <NOT .SAME?> <COMMUTE-STRUC <> .NNOD .SNOD>>) + (RR + <AND <NOT .SAME?> + <COMMUTE-STRUC <> .VNOD .SNOD> + <COMMUTE-STRUC <> .VNOD .NNOD>>) (MP <MPCNT .TPS>) + (NN 0) NAC SAC STR NUMN TEM (CFLG 0)) + #DECL ((N SNOD NNOD VNOD) NODE (NUM NN MP CFLG) FIX (SAC NAC) AC + (NUMN STR VN) DATUM (NO-KILL) <SPECIAL LIST> + (NR) <OR FALSE <LIST FIX FIX>>) + <COND (.NK + <COND (<NOT <G? .NUM 0>> <MESSAGE ERROR "ARG OUT OF RANGE " PUT>) + (<OR <NOT .CAREFUL> <L=? .NUM <MINL .TYP>> <1? <SET CFLG .NUM>>> + <COND (.RR + <SET VN <GEN .VNOD DONT-CARE>> + <SET PUT-COMMON-DAT .VN> + <SET STR <GEN .SNOD <PREG? .TYP .W>>> + <AND <1? .CFLG> <RCHK <DATVAL .STR> <>>>) + (ELSE + <SET STR <GEN .SNOD <PREG? .TYP .W>>> + <AND <1? .CFLG> <RCHK <DATVAL .STR> <>>> + <OR .SAME? + <SET PUT-COMMON-DAT + <SET VN <GEN .VNOD DONT-CARE>>>>)> + <DELAY-KILL .NO-KILL .ONO> + <COND (.SAME? <SPEC-GEN .VNOD .STR .TPS .NUM>) + (ELSE <DATCLOB .VNOD .VN .NUM .MP .STR .TYP T>)> + <MOVE:ARG .STR .W>) + (ELSE + <COND (.RR + <SET VN <GEN .VNOD DONT-CARE>> + <SET PUT-COMMON-DAT .VN> + <SET SAC <DATVAL <SET STR <GEN .SNOD <PREG? .TYP .W>>>>> + <MUNG-AC .SAC .STR>) + (ELSE + <SET STR <GEN .SNOD <PREG? .TYP .W>>> + <OR .SAME? + <SET PUT-COMMON-DAT <SET VN <GEN .VNOD DONT-CARE>>>> + <SET SAC <DATVAL <SET STR <TOACV .STR>>>> + <MUNG-AC .SAC .STR>)> + <DELAY-KILL .NO-KILL .ONO> + <EMIT <INSTRUCTION `ADD + <ACSYM .SAC> + [<FORM <SET NN <* <- .NUM 1> .MP>> (.NN)>]>> + <RCHK .SAC <>> + <COND (.SAME? <SPEC-GEN .VNOD .STR .TPS 1>) + (ELSE <DATCLOB .VNOD .VN 1 .MP .STR .TYP T .NUM>)> + <SET SAC <DATVAL <TOACV .STR>>> + <OR <==? .W FLUSHED> + <EMIT <INSTRUCTION `SUB + <ACSYM .SAC> + [<FORM .NN (.NN)>]>>> + <MOVE:ARG .STR .W>)>) + (ELSE + <COND (.RR <SET VN <GEN .VNOD DONT-CARE>> <SET PUT-COMMON-DAT .VN>)> + <COND (.RV + <PREFER-DATUM <SET STR <PREG? .TYP .W>>> + <SET NUMN <GEN .NNOD <DATUM FIX ANY-AC>>> + <SET STR <GEN .SNOD .STR>> + <TOACV .NUMN> + <SET NAC <DATVAL .NUMN>>) + (ELSE + <SET STR <GEN .SNOD <PREG? .TYP .W>>> + <SET NAC <DATVAL <SET NUMN <GEN .NNOD <DATUM FIX ANY-AC>>>>>)> + <COND (.RR <DELAY-KILL .NO-KILL .ONO>)> + <TOACV .STR> + <SET SAC <DATVAL .STR>> + <MUNG-AC .NAC .NUMN> + <AND .CAREFUL + <NOT <AND .NR <G? <1 .NR> 0>>> + <EMIT <INSTRUCTION `JUMPLE <ACSYM .NAC> |CERR1 >>> + <OR <1? .MP> <EMIT <INSTRUCTION `ASH <ACSYM .NAC> 1>>> + <EMIT <INSTRUCTION `HRLI <ACSYM .NAC> (<ADDRSYM .NAC>)>> + <EMIT <INSTRUCTION `ADD <ACSYM .NAC> <ADDRSYM .SAC>>> + <AND .CAREFUL <NOT <AND .NR <L=? <2 .NR> <MINL .TYP>>>> <RCHK .NAC T>> + <RET-TMP-AC <DATTYP .NUMN> .NUMN> + <COND (<==? .TPS TUPLE> + <PUT .NUMN ,DATTYP <DATTYP .STR>> + <COND (<TYPE? <DATTYP .STR> AC> + <PUT <SET SAC <DATTYP .STR>> + ,ACLINK + (.NUMN !<ACLINK .SAC>)>)>) + (ELSE <PUT .NUMN ,DATTYP .TPS>)> + <COND (<NOT .RR> + <DELAY-KILL .NO-KILL .ONO> + <OR .SAME? + <SET PUT-COMMON-DAT <SET VN <GEN .VNOD DONT-CARE>>>>)> + <COND (.SAME? <SPEC-GEN .VNOD .NUMN .TPS 0>) + (ELSE <DATCLOB .VNOD .VN 0 .MP .NUMN .TYP <>>)> + <RET-TMP-AC .NUMN> + <MOVE:ARG .STR .W>)>> + +<DEFINE LIST-PUT (N W TYP TPS NK NUM SNOD NNOD VNOD NR SAME?) + #DECL ((N SNOD NNOD NOD) NODE (NUM) FIX) + <LIST-REST .N + .W + .TYP + .TPS + .NK + <- .NUM 1> + .SNOD + .NNOD + <> + <> + .NR + T + .VNOD .SAME?>> + +<SETG PUTTERS + [<AND <GASSIGNED? TEMPLATE-PUT> ,TEMPLATE-PUT> + ,STRING-PUT + ,STRING-PUT + ,VEC-PUT + ,VEC-PUT + ,VEC-PUT + ,VEC-PUT + ,LIST-PUT]> + +<DEFINE DATCLOB (VNOD N O TY N2 TP NK + "OPTIONAL" (RN .O) + "AUX" (ETYP <GET-ELE-TYPE .TP <COND (.NK .RN) (ELSE ALL)>>) + (VTYP <RESULT-TYPE .VNOD>) TT TEM) + #DECL ((N) DATUM (O RN TY) FIX (N2) DATUM (VNOD) NODE) + <SET O <+ <* <- .O 1> .TY> -2 .TY>> + <COND + (<1? .TY> + <COND + (<AND .CAREFUL <NOT <TYPESAME .ETYP .VTYP>>> + <COND (<SET TT <ISTYPE? .ETYP>> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O !<ADDR:TYPE .N>>> + <EMIT <INSTRUCTION `CAIE `O <FORM TYPE-CODE!-OP!-PACKAGE .TT>>> + <BRANCH:TAG |CERR3 >) + (<SET TT <ISTYPE? .VTYP>> + <TOACV .N2> + <GETUVT <DATVAL .N2> ,ACO T> + <EMIT <INSTRUCTION `CAIE `O <FORM TYPE-CODE!-OP!-PACKAGE .TT>>> + <BRANCH:TAG |CERR3 >) + (ELSE + <PUT <SET TT <GETREG <>>> ,ACPROT T> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE + <ACSYM .TT> + !<ADDR:TYPE .N>>> + <TOACV .N2> + <GETUVT <DATVAL .N2> ,ACO T> + <EMIT <INSTRUCTION `CAIE `O (<ADDRSYM .TT>)>> + <BRANCH:TAG |CERR3 > + <PUT .TT ,ACPROT <>>)> + <MOVE:ARG .N <DATUM DONT-CARE <OFFPTR .O .N2 UVECTOR>>>) + (ELSE + <MOVE:ARG .N <DATUM DONT-CARE <OFFPTR .O .N2 UVECTOR>>>)>) + (ELSE + <MOVE:ARG .N + <COND (<AND <SET ETYP <ISTYPE-GOOD? .ETYP>> + <TYPESAME .ETYP .VTYP>> + <DATUM .ETYP <OFFPTR .O .N2 VECTOR>>) + (ELSE <DATUM <SET TEM <OFFPTR .O .N2 VECTOR>> .TEM>)>>)>> + +<DEFINE MPCNT (TY) + #DECL ((TY) ATOM) + <COND (<OR <==? .TY UVECTOR> <==? .TY STORAGE>> 1) + (ELSE 2)>> + +<DEFINE IPUT-GEN (NOD WHERE + "AUX" (OS .STK) (STK (0 !.STK)) PINDIC (K <KIDS .NOD>) PITEM) + #DECL ((NOD) NODE (K) <LIST NODE NODE NODE> (PITEM PINDIC) DATUM + (STK) <SPECIAL LIST>) + <SET PITEM <GEN <1 .K> <DATUM ,AC-A ,AC-B>>> + <SET PINDIC <GEN <2 .K> <DATUM ,AC-C ,AC-D>>> + <RET-TMP-AC <STACK:ARGUMENT <GEN <3 .K> DONT-CARE>>> + <ADD:STACK 2> + <SET PITEM <MOVE:ARG .PITEM <DATUM ,AC-A ,AC-B>>> + <RET-TMP-AC <MOVE:ARG .PINDIC <DATUM ,AC-C ,AC-D>>> + <RET-TMP-AC .PITEM> + <REGSTO T> + <EMIT <INSTRUCTION `PUSHJ `P* <COND (<==? <NODE-SUBR .NOD> ,PUT> |CIPUT) + (ELSE |CIPUTP)>>> + <SET STK .OS> + <MOVE:ARG <FUNCTION:VALUE T> .WHERE>> + +<DEFINE IREMAS-GEN (NOD WHERE "AUX" (K <KIDS .NOD>) PINDIC PITEM) + #DECL ((NOD) NODE (K) <LIST NODE NODE> (PINDIC PITEM) DATUM) + <SET PITEM <GEN <1 .K> <DATUM ,AC-A ,AC-B>>> + <SET PINDIC <GEN <2 .K> <DATUM ,AC-C ,AC-D>>> + <SET PITEM <MOVE:ARG .PITEM <DATUM ,AC-A ,AC-B>>> + <RET-TMP-AC <MOVE:ARG .PINDIC <DATUM ,AC-C ,AC-D>>> + <RET-TMP-AC .PITEM> + <REGSTO T> + <EMIT <INSTRUCTION `PUSHJ `P* |CIREMA >> + <MOVE:ARG <FUNCTION:VALUE T> .WHERE>> + +<DEFINE PUTREST-GEN (NOD WHERE + "AUX" ST1 ST2 (K <KIDS .NOD>) (FLG T) N CD (ONO .NO-KILL) + (NO-KILL .ONO) (2RET <>)) + #DECL ((NOD N) NODE (K) <LIST NODE NODE> (ST1 ST2) DATUM + (NO-KILL) <SPECIAL LIST> (ONO) LIST) + <COND (<==? <NODE-SUBR .NOD> ,REST> + <SET NOD <1 .K>> + <SET K <KIDS .NOD>> + <SET 2RET T>)> ;"Really <REST <PUTREST ...." + <COND (<AND <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> + <==? <NODE-NAME <2 .K>> ()>> + <SET ST1 <GEN <1 .K> <UPDATE-WHERE .NOD .WHERE>>>) + (<AND <NOT <SIDE-EFFECTS? <1 .K>>> + <NOT <SIDE-EFFECTS? <2 .K>>> + <MEMQ <NODE-TYPE <1 .K>> ,SNODES>> + <AND <==? <NODE-TYPE <SET N <1 .K>>> ,LVAL-CODE> + <COND (<==? <LENGTH <SET CD <TYPE-INFO .N>>> 2> <2 .CD>) + (ELSE T)> + <SET CD <NODE-NAME .N>> + <NOT <MAPF <> + <FUNCTION (LL) + #DECL ((LL) <LIST SYMTAB ANY>) + <AND <==? .CD <1 .LL>> <MAPLEAVE>>> + .NO-KILL>> + <SET NO-KILL ((.CD <>) !.NO-KILL)>> + <SET ST2 + <GEN <2 .K> + <COND (.2RET <GOODACS <2 .K> .WHERE>) + (ELSE <DATUM LIST ANY-AC>)>>> + <SET ST1 + <GEN <1 .K> + <COND (.2RET DONT-CARE) + (ELSE <UPDATE-WHERE .NOD .WHERE>)>>> + <DELAY-KILL .NO-KILL .ONO>) + (ELSE + <SET ST1 + <GEN <1 .K> + <GOODACS .NOD + <COND (<OR <==? .WHERE FLUSHED> .2RET> + DONT-CARE) + (ELSE .WHERE)>>>> + <SET ST2 <GEN <2 .K> <DATUM LIST ANY-AC>>>)> + <KILL-COMMON LIST> + <AND .CAREFUL + <G? 1 <MINL <RESULT-TYPE <1 .K>>>> + <COND (<TYPE? <DATVAL .ST1> AC> + <EMIT <INSTRUCTION `JUMPE <ACSYM <DATVAL .ST1>> |CERR2 >>) + (ELSE + <EMIT <INSTRUCTION `SKIPN !<ADDR:VALUE .ST1>>> + <BRANCH:TAG |CERR2 >)>> + <AND <ASSIGNED? ST2> <TOACV .ST2>> + <OR <TYPE? <DATVAL .ST1> AC> <SET FLG <>>> + <COND (<ASSIGNED? ST2> + <COND (.FLG + <EMIT <INSTRUCTION `HRRM + <ACSYM <CHTYPE <DATVAL .ST2> AC>> + (<ADDRSYM <CHTYPE <DATVAL .ST1> AC>>)>>) + (ELSE + <EMIT <INSTRUCTION `HRRM + <ACSYM <CHTYPE <DATVAL .ST2> AC>> + `@ + !<ADDR:VALUE .ST1>>>)> + <RET-TMP-AC <COND (.2RET .ST1) (ELSE .ST2)>>) + (ELSE + <COND (.FLG + <EMIT <INSTRUCTION `HLLZS (<ADDRSYM <CHTYPE <DATVAL .ST1> AC>>)>>) + (ELSE + <EMIT <INSTRUCTION `HLLZS `@ !<ADDR:VALUE .ST1>>>)>)> + <MOVE:ARG <COND (.2RET .ST2) (ELSE .ST1)> .WHERE>> + +<DEFINE SIDE-EFFECTS? (N) + #DECL ((N) NODE) + <AND <N==? <NODE-TYPE .N> ,QUOTE-CODE> <SIDE-EFFECTS .N>>> + +<DEFINE COMMUTE-STRUC (RV NUMNOD STRNOD "AUX" N (L .NO-KILL) CD (FLG T)) + #DECL ((NO-KILL) LIST (NUMNOD STRNOD) NODE (L) LIST) + <COND + (<OR <AND <NOT .RV> + <OR <AND <==? <NODE-TYPE .NUMNOD> ,QUOTE-CODE> + <NOT <SET FLG <>>>> + <NOT <SIDE-EFFECTS .NUMNOD>>> + <MEMQ <SET CD <NODE-TYPE <SET N .STRNOD>>> ,SNODES>> + <AND .RV + <OR <AND <==? <NODE-TYPE .STRNOD> ,QUOTE-CODE> + <NOT <SET FLG <>>>> + <NOT <SIDE-EFFECTS .STRNOD>>> + <NOT <MEMQ <SET CD <NODE-TYPE <SET N .NUMNOD>>> ,SNODES>>>> + <COND (<AND .FLG + <==? .CD ,LVAL-CODE> + <COND (<==? <LENGTH <SET CD <TYPE-INFO .N>>> 2> <2 .CD>) + (ELSE T)> + <SET CD <NODE-NAME .N>> + <NOT <MAPF <> + <FUNCTION (LL) + #DECL ((LL) <LIST SYMTAB ANY>) + <AND <==? .CD <1 .LL>> <MAPLEAVE>>> + .L>>> + <SET NO-KILL ((.CD <>) !.L)>)> + <NOT .RV>) + (ELSE .RV)>> + + +<DEFINE DEFER-IT (NOD STR "AUX" SAC SAC1 STR1 COD) + #DECL ((STR STR1) DATUM (NOD) NODE (SAC SAC1) AC (COD) FIX) + <COND + (<1? <SET COD <DEFERN <RESULT-TYPE .NOD>>>> + <COND (<AND <ACRESIDUE + <SET SAC + <DATVAL <SET STR <MOVE:ARG .STR <REG? LIST .STR>>>>>> + <NOT <0? <CHTYPE <FREE-ACS T> FIX>>>> + <SET SAC1 <GETREG <SET STR1 <DATUM LIST ANY-AC>>>> + <PUT .STR1 ,DATVAL .SAC1> + <EMIT <INSTRUCTION `MOVE <ACSYM .SAC1> 1 (<ADDRSYM .SAC>)>> + <RET-TMP-AC .STR> + <SET STR .STR1>) + (ELSE + <MUNG-AC .SAC .STR> + <EMIT <INSTRUCTION `MOVE <ACSYM .SAC> 1 (<ADDRSYM .SAC>)>>)>) + (<AND <NOT <0? .COD>> + <G? <CHTYPE <FREE-ACS T> FIX> 0> + <ACRESIDUE <SET SAC <DATVAL .STR>>> + <MAPF <> + <FUNCTION (ITEM) + #DECL ((ITEM) SYMBOL) + <COND (<AND <TYPE? .ITEM SYMTAB> <NOT <STORED .ITEM>>> + <MAPLEAVE T>)>> + <ACRESIDUE .SAC>>> + <SET SAC + <DATVAL <SET STR <MOVE:ARG .STR <REG? LIST .STR>>>>> + <SET SAC1 <GETREG <SET STR1 <DATUM LIST ANY-AC>>>> + <PUT .STR1 ,DATVAL .SAC1> + <EMIT <INSTRUCTION `MOVEI <ACSYM .SAC1> (<ADDRSYM .SAC>)>> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O (<ADDRSYM .SAC>)>> + <EMIT <INSTRUCTION `CAIN `O TDEFER!-OP!-PACKAGE>> + <EMIT <INSTRUCTION `MOVE <ACSYM .SAC1> 1 (<ADDRSYM .SAC1>)>> + <RET-TMP-AC .STR> + <SET STR .STR1>) + (<NOT <0? .COD>> + <SET SAC + <DATVAL <SET STR <MOVE:ARG .STR <REG? LIST .STR>>>>> + <MUNG-AC .SAC .STR> + <EMIT <INSTRUCTION GETYP!-OP!-PACKAGE `O (<ADDRSYM .SAC>)>> + <EMIT <INSTRUCTION `CAIN `O TDEFER!-OP!-PACKAGE>> + <EMIT <INSTRUCTION `MOVE <ACSYM .SAC> 1 (<ADDRSYM .SAC>)>>)> + .STR> + +\ + +"ROUTINES TO DO COMMON SUBEXPRESSION HACKING IN SIMPLE CASES + (CURRENTLY NTH REST)." + +"ROUTINE TO CREATE A COMMON" + +<DEFINE COMMON (CODE SYMT OBJ PTYP DAT) + #DECL ((CODE) ATOM (SYMT) <OR SYMTAB COMMON> (OBJ) FIX) + <CHTYPE [.CODE .SYMT .OBJ .PTYP .DAT] COMMON>> + +"THIS ROUTINE BUILDS A CANONACAILZED COMMON. THIS ROUTINE CAN RETURN + EITHER A COMMON OR A LIST OF COMMONS." + +<DEFINE BUILD-COMMON (CODE COMSYMT ITEM PTYP DAT "AUX" INAC COMM COMT CUR-COM) + #DECL ((CODE) ATOM (COMSYMT) <OR SYMTAB COMMON LIST> (ITEM) FIX + (CUR-COM) <OR COMMON <LIST [REST COMMON]>>) + <COND (<TYPE? .COMSYMT LIST> + <REPEAT ((PTR .COMSYMT) (CLIST ())) + <COND (<EMPTY? .PTR> + <RETURN <COND (<1? <LENGTH .CLIST>> <1 .CLIST>) + (.CLIST)>>)> + <SET CUR-COM <BUILD-COMMON .CODE <1 .PTR> .ITEM .PTYP .DAT>> + <COND (<TYPE? .CUR-COM COMMON> + <SET CLIST (.CUR-COM !.CLIST)>) + (<PUTREST <REST .CUR-COM <- <LENGTH .CUR-COM> 1>> + .CLIST>)> + <SET PTR <REST .PTR>>>) + (<TYPE? .COMSYMT SYMTAB> + <COND (<AND <SET INAC <INACS .COMSYMT>> + <SET COMM <FIND-COMMON-AC <DATVAL .INAC>>>> + <SET COMT <BUILD-COMMON .CODE .COMM .ITEM .PTYP .DAT>> + <COND (<TYPE? .COMT LIST> + (<COMMON .CODE .COMSYMT .ITEM .PTYP .DAT> !.COMT)) + (ELSE + (<COMMON .CODE .COMSYMT .ITEM .PTYP .DAT> .COMT))>) + (<COMMON .CODE .COMSYMT .ITEM .PTYP .DAT>)>) + (ELSE + <COND (<==? <COMMON-TYPE .COMSYMT> REST> + (<COMMON .CODE .COMSYMT .ITEM .PTYP .DAT> + <COMMON .CODE + <COMMON-SYMT .COMSYMT> + <+ .ITEM <COMMON-ITEM .COMSYMT>> + .PTYP + .DAT>)) + (<COMMON .CODE .COMSYMT .ITEM .PTYP .DAT>)>)>> + +"ROUTINE TO FIND A COMMON GIVEN A NODE" + +<DEFINE FIND-COMMON (NOD "OPTIONAL" (NAME <>) (NUM <>)) + #DECL ((NOD) NODE) + <PROG RTPNT () + <MAPF <> + <FUNCTION (AC "AUX" ACR) + #DECL ((AC) AC) + <COND + (<SET ACR <ACRESIDUE .AC>> + <MAPF <> + <FUNCTION (ITEM) + <COND (<AND <TYPE? .ITEM COMMON> + <COND (.NAME + <SPEC-COMMON-EQUAL + .NAME .NOD .NUM .ITEM>) + (<COMMON-EQUAL .NOD .ITEM>)>> + <RETURN .ITEM .RTPNT>)>> + .ACR>)>> + ,ALLACS>>> + +"ROUTINE TO SEE IF A COMMON AND A NODE ARE EQUAL" + +<DEFINE COMMON-EQUAL (NODE COM) + #DECL ((NODE) <OR NODE SYMTAB> (COM) <OR SYMTAB COMMON>) + <COND (<==? .NODE .COM>) + (<NOT <OR <TYPE? .NODE SYMTAB> <TYPE? .COM SYMTAB>>> + <AND <EQCODE .NODE .COM> + <EQNUM .NODE .COM> + <EQKIDS .NODE .COM>>)>> + +"ROUTINE TO SEE IF THE CODES OF THE COMMONS ARE EQUAL" + +<DEFINE EQCODE (NODE COM "OPTIONAL" (NT <NODE-TYPE .NODE>)) + #DECL ((NODE) NODE (COM) COMMON) + <OR <AND <==? .NT ,NTH-CODE> <==? <COMMON-TYPE .COM> NTH>> + <AND <==? .NT ,REST-CODE> <==? <COMMON-TYPE .COM> REST>>>> + +"ROUTINE TO SEE IF THE NUMBERS OF A COMMON AND A NODE ARE EQUAL" + +<DEFINE EQNUM (NODE COM "OPTIONAL" (NUM <NODE-NAME <2 <KIDS .NODE>>>)) + #DECL ((NODE) NODE (COM) COMMON) + <==? <COMMON-ITEM .COM> .NUM>> + +"ROUTINE TO SEE IF THE KIDS OF A COMMON AND A NODE ARE EQUAL" + +<DEFINE EQKIDS (NODE COM "OPTIONAL" (KID <1 <KIDS .NODE>>)) + #DECL ((NODE) NODE (COM) COMMON) + <COMMON-EQUAL <COND (<SYMTAB? .KID T>) (.KID)> + <COMMON-SYMT .COM>>> + +"ROUTINE TO FLUSH COMMONS IF PUTS OR PUTRESTS COME ALONG + IF TYP IS FALSE THEN KILL ALL COMMONS. + OTHERWISE KILL THOSE COMMONS WHICH ARE TYE SAME TYPE AS TYP OR UNKNOWN." + +<DEFINE KILL-COMMON (PTYP) + #DECL ((TYP) <OR FALSE ATOM>) + <MAPF <> + <FUNCTION (AC "AUX" ACR) + #DECL ((AC) AC) + <COND (<SET ACR <ACRESIDUE .AC>> + <PUT .AC ,ACRESIDUE <FLUSH-COMMONS .ACR .PTYP>>)>> + ,ALLACS>> + +"FLUSH-COMMONS IS USED TO FLUSH ALL THE COMMONS FROM AN AC" + +<DEFINE FLUSH-COMMONS FC (ACR PTYP) + #DECL ((TYP) <OR ATOM FALSE> (ACR) LIST) + <REPEAT () + <COND (<FLUSH? <1 .ACR> .PTYP> + <COND (<EMPTY? <SET ACR <REST .ACR>>> <RETURN <> .FC>)>) + (<RETURN .ACR>)>> + <REPEAT ((PTR <REST .ACR>) (TOPACR .ACR)) + <COND (<EMPTY? .PTR> <RETURN .TOPACR>)> + <COND (<FLUSH? <1 .PTR> .PTYP> <PUTREST .ACR <REST .PTR>>)> + <SET ACR <REST .ACR>> + <SET PTR <REST .PTR>>>> + +"FLUSH? SEES IF A COMMON SHOULD BE FLUSHED" + +<DEFINE FLUSH? (COM PTYP) + <OR <NOT .PTYP> + <AND <TYPE? .COM COMMON> + <==? <COMMON-PRIMTYPE .COM> .PTYP>>>> + +"FLUSH-COMMON-SYMT IS USED TO FLUSH THE COMMONS ASSOCATED WITH A GIVEN SYMTAB" + +<DEFINE FLUSH-COMMON-SYMT (SYMT) + #DECL ((SYMT) SYMTAB) + <MAPF <> + <FUNCTION (AC "AUX" ACR) + #DECL ((AC) AC) + <SET ACR + <COND (<SET ACR <ACRESIDUE .AC>> + <COND (<EQSYMT <1 .ACR> .SYMT> <REST .ACR>) + (<REPEAT ((PTR <REST .ACR>) (SACR .ACR)) + <COND (<EMPTY? .PTR> <RETURN .SACR>)> + <COND (<EQSYMT <1 .PTR> .SYMT> + <PUTREST .ACR <REST .PTR>> + <RETURN .SACR>)> + <SET PTR <REST .PTR>> + <SET ACR <REST .ACR>>>)>)>> + <PUT .AC ,ACRESIDUE <COND (<EMPTY? .ACR> <>) (ELSE .ACR)>>> + ,ALLACS>> + +<DEFINE EQSYMT (ITEM SYMT "AUX" COM) + <COND (<TYPE? .ITEM COMMON> + <OR <==? <SET COM <COMMON-SYMT .ITEM>> .SYMT> + <EQSYMT .COM .SYMT>>)>> + +"SEE IF NODE CONTAINS SYMTABS" + +<DEFINE SYMTAB? (NOD "OPTIONAL" (SRCHCOM <>)) + #DECL ((NOD) NODE) + <COND (<OR <==? <NODE-TYPE .NOD> ,LVAL-CODE> + <AND <NOT .SRCHCOM> <==? <NODE-TYPE .NOD> ,SET-CODE>>> + <NODE-NAME .NOD>)>> + +"SEE IF THIS IS A NTH OR REST OR PUT CODE" + +<DEFINE NTH-REST-PUT? (NOD "AUX" (COD <NODE-TYPE .NOD>)) + #DECL ((NOD) NODE) + <OR <==? .COD ,PUT-CODE> + <==? .COD ,REST-CODE> + <==? .COD ,NTH-CODE>>> + +"SMASH A COMMON INTO AN DATUM" + +<DEFINE SMASH-COMMON (COM DAT "AUX" AC) + #DECL ((DAT) DATUM (COM) COMMON) + <COND (<TYPE? <SET AC <DATTYP .DAT>> AC> + <OR <MEMQ .COM <ACRESIDUE .AC>> + <PUT .AC ,ACRESIDUE (.COM !<ACRESIDUE .AC>)>>)> + <COND (<TYPE? <SET AC <DATVAL .DAT>> AC> + <OR <MEMQ .COM <ACRESIDUE .AC>> + <PUT .AC ,ACRESIDUE (.COM !<ACRESIDUE .AC>)>>)> + <PUT .COM ,COMMON-DATUM <DATUM !.DAT>>> + +<DEFINE HACK-COMMON (COD 2NARGNOD TEM WHERE W NUMKN NUM PTYP NRP + "AUX" (COM-ITEM <>) COM) + #DECL ((W) DATUM) + <COND (<AND <N==? .WHERE FLUSHED> <TYPE? <DATVAL .W> AC> .NUMKN> + <COND (<SET COM-ITEM <SYMTAB? .2NARGNOD>>) + (.NRP <SET COM-ITEM .TEM>)> + <COND (.COM-ITEM + <SET COM <BUILD-COMMON .COD .COM-ITEM .NUM .PTYP .W>> + <COND (<TYPE? .COM LIST> + <MAPF <> <FUNCTION (X) <SMASH-COMMON .X .W>> .COM>) + (<SMASH-COMMON .COM .W>)> + <SET COMMON-SUB .COM>)>)>> + +<DEFINE FIND-COMMON-AC (AC) + <COND (<TYPE? .AC AC> + <MAPF <> + <FUNCTION (ITEM) + <COND (<TYPE? .ITEM COMMON> <MAPLEAVE .ITEM>)>> + <ACRESIDUE .AC>>)>> + +<DEFINE FIND-COMMON-REST-NODE (NOD "AUX" (K <KIDS .NOD>)) + #DECL ((NOD) NODE (K) <LIST [REST NODE]>) + <AND <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> + <FIND-COMMON <1 .K> + REST + <- <CHTYPE <NODE-NAME <2 .K>> FIX> 1>>>> + +<DEFINE SPEC-COMMON-EQUAL (NAME KID NUM COM) + #DECL ((NAME) ATOM (NUM) FIX (KID) NODE (COM) COMMON) + <AND <==? <COMMON-TYPE .COM> .NAME> + <EQNUM .KID .COM .NUM> + <EQKIDS .KID .COM .KID>>> + +<DEFINE COMMON-CLOBBER (TEM NOD VAL NUM OBJ TPS SAME? + "AUX" TSM (NDAT <COMMON-DATUM .TEM>) + (ETYP <GET-ELE-TYPE .OBJ .NUM>) + (VTYP <RESULT-TYPE .VAL>) ODAT VDAT AC) + #DECL ((VDAT ODAT NDAT) DATUM (TEM) COMMON (NOD) NODE (NUM) FIX + (VAL OBJ) NODE) + <SET TSM + <OR <TYPESAME .ETYP .VTYP> + <MEMQ .TPS '![STORAGE UVECTOR STRING!]>>> + <SET ODAT <DATUM .TPS <DATVAL .NDAT>>> + <COND (<AND <NOT .TSM> <TYPE? <SET AC <DATTYP .NDAT>> AC>> <SGETREG .AC .ODAT>)> + <COND (<TYPE? <SET AC <DATVAL .NDAT>> AC> <SGETREG .AC .ODAT>)> + <OR .SAME? + <SET VDAT + <GEN .VAL + <DATUM <COND (<NOT .TSM> ANY-AC) (FLUSHED)> ANY-AC>>>> + <COND (.SAME? <SPEC-GEN .VAL .ODAT .TPS 0>) + (ELSE + <PUT <CHTYPE <DATVAL .VDAT> AC> ,ACPROT T> + <COND (<NOT .TSM> <PUT <CHTYPE <DATTYP .VDAT> AC> ,ACPROT T>)> + <COND (<NOT <TYPE? <DATVAL .ODAT> AC>> <TOACV .ODAT>)> + <PUT <CHTYPE <DATVAL .VDAT> AC> ,ACPROT <>> + <COND (<NOT .TSM> <PUT <CHTYPE <DATTYP .VDAT> AC> ,ACPROT <>>)> + <COND (<NOT .TSM> + <EMIT <INSTRUCTION <COND (<=? .TPS LIST> `HLLM ) (ELSE `MOVEM )> + <ACSYM <CHTYPE <DATTYP .VDAT> AC>> + (<ADDRSYM <CHTYPE <DATVAL .ODAT> AC>>)>>)> + <COND (<==? .TPS STRING> + <EMIT <INSTRUCTION `IDPB + <ACSYM <CHTYPE <DATVAL .VDAT> AC>> + <ADDRSYM <CHTYPE <DATVAL .ODAT> AC>>>>) + (<EMIT <INSTRUCTION `MOVEM + <ACSYM <CHTYPE <DATVAL .VDAT> AC>> + 1 + (<ADDRSYM <CHTYPE <DATVAL .ODAT> AC>>)>>)>)> + <RET-TMP-AC .VDAT> + <RET-TMP-AC .ODAT> + ,NO-DATUM> + +<DEFINE LOC-COMMON (TEM NOD TPS 1ARG 2ARG WHERE "AUX" W NDAT) + #DECL ((TEM) COMMON (NOD 1ARG 2ARG) NODE (WHERE W) <OR ATOM DATUM> + (NDAT) DATUM) + <COND (<AND <N==? .WHERE FLUSHED> <N==? .TPS STRING>> + <MOVE:ARG + <DATUM <OFFPTR 0 <SET NDAT <GET-COMMON-DATUM .TEM>> .TPS> + <OFFPTR 0 .NDAT .TPS>> + .WHERE>)>> + + +<DEFINE GET-COMMON-DATUM (COM "AUX" TEM DAT) + #DECL ((COM) COMMON (DAT) DATUM) + <SET DAT <DATUM !<COMMON-DATUM .COM>>> + <COND (<TYPE? <SET TEM <DATTYP .DAT>> AC> + <PUT .TEM ,ACLINK (.DAT !<ACLINK .TEM>)>)> + <PUT <SET TEM <CHTYPE <DATVAL .DAT> AC>> ,ACLINK (.DAT !<ACLINK .TEM>)> + .DAT> + +<ENDPACKAGE> diff --git a/<mdl.comp>/subrty.mud.61 b/<mdl.comp>/subrty.mud.61 new file mode 100644 index 0000000..692d3d8 --- /dev/null +++ b/<mdl.comp>/subrty.mud.61 @@ -0,0 +1,252 @@ +<PACKAGE "SUBRTY"> + +<ENTRY SUBRS TEMPLATES> + +<USE "COMPDEC" "CHKDCL"> + + +; "Functions to decide arg dependent types." + +<DEFINE FIRST-ARG ("TUPLE" T) <1 .T>> + +<DEFINE SECOND-ARG ("TUPLE" T) <2 .T>> + +<DEFINE LOC-FCN (STR "OPTIONAL" N + "AUX" (TEM <MEMQ <ISTYPE? .STR> + ![UVECTOR VECTOR ASOC TUPLE STRING LIST!]>)) + <COND (.TEM <NTH '![LOCL LOCS LOCA LOCAS LOCV LOCU!] <LENGTH .TEM>>) + (ELSE ANY)>> + +<DEFINE MAPF-VALUE ("TUPLE" T) ANY> + +<DEFINE MEM-VALUE (ITEM STR "AUX" TEM) + <COND (<SET TEM <ISTYPE? .STR>> <FORM OR FALSE <TYPEPRIM .TEM>>) + (ELSE STRUCTURED)>> + +<DEFINE SPFIRST-ARG ("TUPLE" T "AUX" TEM) + <COND (<SET TEM <STRUCTYP <1 .T>>> + <COND (<==? .TEM TUPLE> VECTOR)(ELSE .TEM)>)>> + + +<DEFINE PFIRST-ARG ("TUPLE" T "AUX" TEM) + <COND (<SET TEM <STRUCTYP <1 .T>>>) + (ELSE ANY)>> + +; "Data structure specifying return types and # of args to common subrs." + +<SETG SUBR-DATA + ![(,*!- ANY '<OR FIX FLOAT> () STACK <> |CTIMES) + (,+!- ANY '<OR FIX FLOAT> () STACK <> |CPLUS) + (,/!- ANY '<OR FIX FLOAT> () STACK <> |CDIVID) + (,-!- ANY '<OR FIX FLOAT> () STACK <> |CMINUS) + (,0?!- 1 '<OR ATOM FALSE>) + (,1?!- 1 '<OR ATOM FALSE>) + (,1STEP!- 1 PROCESS) + (,==?!- 2 '<OR ATOM FALSE>) + (,=?!- 2 '<OR ATOM FALSE> () ((,AC-A ,AC-B) (,AC-C ,AC-D)) T |CIEQUA) + (,ABS!- 1 '<OR FIX FLOAT>) + (,ACCESS!- 2 CHANNEL) + (,ALLTYPES!- 0 '<VECTOR [REST ATOM]>) + (,ANDB!- ANY WORD) + (,APPLY!- ANY ANY) + (,APPLYTYPE!- '(1 2) '<OR FALSE ATOM APPLICABLE>) + (,ARGS!- 1 TUPLE () ((,AC-A ,AC-B)) <> |CARGS) + (,ASCII!- 1 '<OR CHARACTER FIX>) + (,ASSIGNED?!- '(1 2) '<OR ATOM FALSE> () ((ATOM ,AC-B)) T |CASSQ) + (,ASSOCIATIONS!- 0 ASOC) + (,AT!- '(1 2) ,LOC-FCN (1) ((,AC-A ,AC-B) (FIX ,AC-C)) <> |CIAT) + (,ATAN!- 1 FLOAT () ((,AC-A ,AC-B)) <> |CATAN) + (,ATOM!- 1 ATOM () ((,AC-A ,AC-B)) <> |CATOM) + (,AVALUE!- 1 ANY) + (,BACK!- '(1 2) ,PFIRST-ARG (1) ((,AC-A ,AC-B) (FIX ,AC-C)) <> |CIBACK) + (,BITS!- '(1 2) BITS) + (,BLOAT!- '(0 15) FIX) + (,BLOCK!- 1 '<LIST [REST OBLIST]>) + (,BOUND?!- '(1 2) '<OR ATOM FALSE>) + (,BREAK-SEQ!- 2 PROCESS) + (,CHANLIST!- 0 '<LIST [REST CHANNEL]>) + (,CHANNEL!- '(0 6) CHANNEL) + (,CHTYPE!- 2 ANY) + (,CHUTYPE!- 2 UVECTOR () ((UVECTOR ,AC-A) (ATOM ,AC-B)) <> |CCHUTY) + (,CLOSE!- 1 CHANNEL) + (,CONS!- 2 LIST () ((,AC-C ,AC-D) (LIST ,AC-E)) <> |CICONS) + (,COS!- 1 FLOAT () ((,AC-A ,AC-B)) <> |CCOS) + (,CRLF 1 ATOM () ((,AC-A ,AC-B)) <> |CICRLF) + (,DISABLE!- 1 IHEADER) + ;(,DISPLAY!- 2 ANY) + (,ECHOPAIR!- 2 CHANNEL) + (,EMPTY?!- 1 '<OR FALSE ATOM> () ((,AC-A ,AC-B)) T |CEMPTY) + (,ENABLE!- 1 IHEADER) + (,ENDBLOCK!- 0 '<LIST [REST OBLIST]>) + (,EQVB!- ANY WORD) + ;(,ERASE!- '(1 2) ANY) + (,ERRET!- '(0 2) ANY) + (,ERRORS!- 0 OBLIST) + (,EVAL!- '(1 2) ANY) + (,EVALTYPE!- '(1 2) '<OR FALSE ATOM APPLICABLE>) + (,EVENT!- '(1 3) IHEADER) + (,EXP!- 1 FLOAT () ((,AC-A ,AC-B)) <> |CEXP) + (,FIX!- 1 FIX () ((,AC-A ,AC-B)) <> |CFIX) + (,FLATSIZE!- 3 '<OR FALSE FIX> () ((,AC-A ,AC-B) (FIX ,AC-D) (FIX ,AC-C)) + T |CIFLTZ) + (,FLOAD!- '(0 5) STRING) ;"\"DONE\"" + (,FLOAT!- 1 FLOAT () ((,AC-A ,AC-B)) <> |CFLOAT) + (,FORM!- ANY FORM () STACK <> |IIFORM) + (,FRAME!- '(0 1) FRAME (#LOSE 0) ((,AC-A ,AC-B)) <> |CFRAME) + ;(,FREE!- 1 STORAGE) + (,FREE-RUN!- 1 <OR FALSE PROCESS>) + (,FUNCT!- 1 ATOM () ((,AC-A ,AC-B)) <> |CFUNCT) + (,G=?!- 2 '<OR ATOM FALSE> () ((,AC-A ,AC-B)(,AC-C ,AC-D)) T |CGEQ) + (,G?!- 2 '<OR ATOM FALSE> () ((,AC-A ,AC-B)(,AC-C ,AC-D)) T |CGQ) + (,GASSIGNED?!- 1 '<OR FALSE ATOM> () ((ATOM ,AC-B)) T |CGASSQ) + (,GC!- '(0 3) FIX) + (,GET!- '(2 3) ANY () ((,AC-A ,AC-B) (,AC-C ,AC-D)) T |CIGET) + (,GETBITS!- 2 WORD) + (,GETL!- '(2 3) LOCAS () ((,AC-A ,AC-B)(,AC-C ,AC-D)) T |CIGETL) + (,GETPROP!- '(2 3) ANY) + (,GLOC!- '(1 2) LOCD () ((ATOM ,AC-B)) <> |CGLOC) + (,GO!- 1 ANY) + (,MULTI-SECTION!- '(0 1) ANY) + (,GUNASSIGN!- 1 ATOM) + (,GVAL!- 1 ANY) + (,HANDLER!- '(2 3) HANDLER) + (,IFORM!- '(1 2) FORM) + (,ILIST!- '(1 2) LIST) + (,IMAGE!- '(1 2) FIX) + (,IN!- 1 ANY () ((,AC-A ,AC-B)) <> |CIN) + (,INDICATOR!- 1 ANY) + (,INSERT!- 2 ATOM () ((,AC-A ,AC-B) (OBLIST ,AC-C)) <> |CINSER) + (,INT-LEVEL!- '(0 1) FIX) + (,INTERRUPT!- ANY '<OR FALSE ATOM>) + (,INTERRUPTS!- 0 OBLIST) + (,ISTRING!- '(1 2) STRING) + (,ITEM!- 1 ANY) + (,ITUPLE!- '(1 2) TUPLE) + (,IUVECTOR!- '(1 2) UVECTOR) + (,IVECTOR!- '(1 2) VECTOR) + (,L=?!- 2 '<OR FALSE ATOM> () ((,AC-A ,AC-B)(,AC-C ,AC-D)) T |CLEQ) + (,L?!- 2 '<OR FALSE ATOM> () ((,AC-A ,AC-B)(,AC-C ,AC-D)) T |CLQ) + (,LEGAL?!- 1 '<OR FALSE ATOM> () ((,AC-A ,AC-B)) T |CILEGQ) + (,LENGTH!- 1 FIX () ((,AC-A ,AC-B)) <> |CILNT) + (,LENGTH? 2 '<OR FALSE FIX> () ((,AC-A ,AC-B) (FIX ,AC-C)) T |CILNQ) + (,LINK!- '(2 3) ,FIRST-ARG) + (,LIST!- ANY LIST () STACK <> |IILIST) + (,LISTEN!- ANY ANY) + (,LLOC!- '(1 2) LOCD () ((ATOM ,AC-B)) <> |CLLOC) + (,LOAD!- '(1 2) STRING) + (,LOG!- 1 FLOAT () ((,AC-A ,AC-B)) <> |CLOG) + (,LOGOUT!- 0 FALSE) + (,LOOKUP!- 2 '<OR ATOM FALSE> () ((,AC-A ,AC-B) (OBLIST ,AC-C)) + T |CLOOKU) + (,LVAL!- '(1 2) ANY) + (,MAIN!- 0 PROCESS) + (,MAPF!- ANY ,MAPF-VALUE) + (,MAPR!- ANY ,MAPF-VALUE) + (,MAX!- ANY '<OR FIX FLOAT> () STACK <> |CMAX) + (,ME!- 0 PROCESS) + (,MEMBER!- 2 ,MEM-VALUE () ((,AC-A ,AC-B)(,AC-C ,AC-D)) T |CIMEMB) + (,MEMQ!- 2 ,MEM-VALUE () ((,AC-A ,AC-B)(,AC-C ,AC-D)) T |CIMEMQ) + (,MIN!- ANY '<OR FIX FLOAT> () STACK <> |CMIN) + (,MOBLIST!- '(0 2) OBLIST) + (,MOD!- 2 '<OR FIX FLOAT>) + (,MONAD?!- 1 '<OR ATOM FALSE> () ((,AC-A ,AC-B)) T |CIMON) + (,N==?!- 2 '<OR FALSE ATOM>) + (,N=?!- 2 '<OR FALSE ATOM> () ((,AC-A ,AC-B)(,AC-C ,AC-D)) T |CINEQU) + (,NETACC!- 1 CHANNEL) + (,NETS!- 1 CHANNEL) + (,NETSTATE!- 1 '<UVECTOR [3 FIX]>) + (,NEWTYPE!- '(2 3) ATOM) + (,NEXT!- 1 '<OR ASOC FALSE>) + (,NEXTCHR!- 1 ANY () ((,AC-A ,AC-B)) <> |CNXTC1) + (,NOT!- 1 '<OR ATOM FALSE>) + (,NTH!- '(1 2) ANY (1) ((,AC-A ,AC-B) (FIX ,AC-C)) <> |CINTH) + (,OBLIST?!- 1 '<OR FALSE OBLIST>) + (,OFF!- '(1 2) '<OR HANDLER IHEADER FALSE>) + (,ON!- '(3 5) HANDLER) + (,OPEN!- '(0 6) '<OR CHANNEL FALSE>) + (,ORB!- ANY WORD) + (,PARSE!- '(0 5) ANY) + (,PNAME!- 1 STRING () ((ATOM ,AC-A)) <> |CIPNAM) + (,PRIMTYPE!- 1 ATOM () ((,AC-A DONT-CARE)) <> |CPTYPE) + (,PRINC!- '(1 2) ,FIRST-ARG) + (,PRIN1!- '(1 2) ,FIRST-ARG) + (,PRINT!- '(1 2) ,FIRST-ARG) + (,PRINTB!- 2 UVECTOR) + (,PRINTTYPE!- '(1 2) '<OR FALSE ATOM APPLICABLE>) + (,PROCESS!- 1 PROCESS) + (,PUT!- '(2 3) ANY) + (,PUTBITS!- '(2 3) ,FIRST-ARG) + (,PUTPROP!- '(2 3) ANY) + (,PUTREST!- 2 ,FIRST-ARG) + (,QUIT!- 0 FALSE) + (,QUITTER!- 2 ANY) + (,RANDOM!- '(0 2) FIX () () <> |CRAND) + (,READ!- '(0 4) ANY) + (,READB!- '(2 3) FIX) + (,READCHR!- 1 ANY () ((,AC-A ,AC-B)) <> |CREDC1) + (,REMOVE!- '(1 2) '<OR ATOM FALSE> (0) ((,AC-A ,AC-B)(OBLIST ,AC-C)) + <> |CIRMV) + (,RENAME!- '(1 9) '<OR ATOM FALSE CHANNEL>) + (,RESET!- 1 '<OR FALSE CHANNEL>) + (,REST!- '(1 2) ,PFIRST-ARG (1) ((,AC-A ,AC-B) (FIX ,AC-C)) <> |CIREST) + (,RESTORE!- '(1 4) ANY) + (,RESUME!- '(1 2) ANY) + (,RESUMER!- '(0 1) '<OR FALSE PROCESS>) + (,RETRY!- '(0 1) ANY) + (,RETURN!- '(1 2) ANY) + (,ROOT!- 0 OBLIST) + (,RSUBR!- 1 RSUBR) + (,SAVE!- '(0 4) STRING) + (,SET!- '(2 3) ,SECOND-ARG) + (,SETG!- 2 ,SECOND-ARG) + (,SETLOC!- 2 ,SECOND-ARG) + (,SIN!- 1 FLOAT () ((,AC-A ,AC-B)) <> |CSIN) + (,SNAME!- '(0 1) STRING) + (,SORT!- ANY ,SECOND-ARG) + (,SPNAME 1 STRING () ((ATOM ,AC-B)) <> |CSPNAM) + (,SQRT!- 1 FLOAT () ((,AC-A ,AC-B)) <> |CSQRT) + (,STATE!- 1 ATOM) + ;(,STORE!- 1 STORAGE) + (,STRCOMP!- 2 FIX () ((,AC-A ,AC-B)(,AC-C ,AC-D)) <> |ISTRCM) + (,STRING!- ANY STRING () STACK <> |CISTNG) + (,STRUCTURED?!- 1 '<OR FALSE ATOM> () ((,AC-A DONT-CARE)) T |CISTRU) + (,SUBSTRUC!- ANY ,SPFIRST-ARG () STACK <> |CSBSTR) + (,SUICIDE!- '(1 2) ANY) + (,TAG!- 1 TAG) + (,TERPRI!- 1 FALSE () ((,AC-A ,AC-B)) <> |CITERP) + (,TIME!- ANY FLOAT) + (,TOP!- 1 ,PFIRST-ARG () ((,AC-A ,AC-B)) <> |CITOP) + (,TTYECHO!- 2 CHANNEL) + (,TUPLE!- ANY TUPLE) + (,TYI!- '(0 1) CHARACTER) + (,TYPE!- 1 ATOM () ((,AC-A DONT-CARE)) <> |CITYPE) + (,TYPE-C '(1 2) TYPE-C (ANY) ((ATOM ,AC-B)(ATOM ,AC-C)) <> |CTYPEC) + (,TYPE-W '(1 3) TYPE-W (ANY 0) ((ATOM ,AC-B)(ATOM ,AC-C)(FIX ,AC-D)) <> + |CTYPEW) + (,TYPE?!- ANY '<OR ATOM FALSE> () STACK T |CTYPEQ) + (,TYPEPRIM!- 1 ATOM () ((ATOM ,AC-B)) <> |CTYPEP) + (,UNASSIGN!- '(1 2) ATOM) + (,UNPARSE!- 2 STRING () ((,AC-A ,AC-B) (FIX ,AC-C)) <> |CIUPRS) + (,UTYPE!- 1 ATOM () ((UVECTOR ,AC-B)) <> |CUTYPE) + (,UVECTOR!- ANY UVECTOR () STACK <> |CIUVEC) + (,VALID-TYPE? 1 '<OR FALSE TYPE-C> () ((ATOM ,AC-B)) T |CVTYPE) + (,VALRET!- 1 FALSE) + (,VALUE!- 1 ANY) + (,VECTOR!- ANY VECTOR () STACK <> |CIVEC) + (,XORB!- ANY WORD)!]> + +<SETG SUBRS <MAPF ,UVECTOR 1 ,SUBR-DATA>> + +<SETG TEMPLATES <MAPF ,UVECTOR ,REST ,SUBR-DATA>> + +<PROG (I) + <SETG TEMPLATES + <IUVECTOR <SET I <LENGTH ,TEMPLATES>> + '<PROG ((T <NTH ,TEMPLATES .I>)) + <SET I <- .I 1>> .T>>>> + +<SETG SUBR-DATA ()> + +<REMOVE SUBR-DATA> + +<ENDPACKAGE> diff --git a/<mdl.comp>/symana.mud.70 b/<mdl.comp>/symana.mud.70 new file mode 100644 index 0000000..b76945f --- /dev/null +++ b/<mdl.comp>/symana.mud.70 @@ -0,0 +1,1835 @@ +<PACKAGE "SYMANA"> + + +<ENTRY ANA EANA SET-CURRENT-TYPE TYPE-NTH-REST WHO TMPS GET-TMP TRUTH UNTRUTH SEGFLUSH + KILL-REM BUILD-TYPE-LIST ANALYSIS GET-CURRENT-TYPE ADD-TYPE-LIST PUT-FLUSH WHON + SAVE-SURVIVORS SEQ-AN ARGCHK ASSUM-OK? FREST-L-D-STATE HTMPS ORUPC APPLTYP + MSAVE-L-D-STATE SHTMPS RESET-VARS STMPS ASSERT-TYPES SAVE-L-D-STATE + MUNG-L-D-STATE NORM-BAN SUBR-C-AN ENTROPY NAUX-BAN TUP-BAN ARGS-BAN + SPEC-FLUSH LIFE MANIFESTQ> + +<USE "CHKDCL" "SUBRTY" "COMPDEC" "STRANA" "CARANA" "BITANA" "NOTANA" "ADVMESS" "MAPANA"> + +" This is the main file associated with the type analysis phase of +the compilation. It is called by calling FUNC-ANA with the main data structure +pointer. ANA is the FUNCTION that dispatches to the various special handlers +and the SUBR call analyzer further dispatches for specific functions." + +" Many analyzers for specific SUBRs appear in their own files +(CARITH, STRUCT etc.). Currently no special hacks are done for TYPE?, EMPTY? etc. +in COND, ANDS and ORS." + +" All analysis functions are called with 2 args, a NODE and a desired +type specification. These args are usually called NOD and RTYP or +N and R." + +" ANA is the main analysis dispatcher (see ANALYZERS at the end of + this file for its dispatch table." + +<GDECL (TEMPLATES SUBRS) UVECTOR> + +<DEFINE ANA (NOD RTYP "AUX" (P <PARENT .NOD>) TT TEM) + #DECL ((NOD) NODE (P) ANY (TEM TT) <OR FALSE LIST>) + <COND (<G=? <LENGTH .NOD> <INDEX ,SIDE-EFFECTS>> + <PUT .NOD ,SIDE-EFFECTS <>>)> + <PUT .NOD + ,RESULT-TYPE + <APPLY <NTH ,ANALYZERS <NODE-TYPE .NOD>> .NOD .RTYP>> + <AND <N==? <NODE-TYPE .NOD> ,QUOTE-CODE> + <SET TEM <SIDE-EFFECTS .NOD>> + <TYPE? .P NODE> + <PUT .P + ,SIDE-EFFECTS + <COND (<EMPTY? .TEM> <SIDE-EFFECTS .P>) + (<EMPTY? <SET TT <SIDE-EFFECTS .P>>> .TEM) + (<OR <AND <TYPE? .TEM LIST> + <NOT <EMPTY? .TEM>> + <==? <1 .TEM> ALL>> + <AND <TYPE? .TT LIST> + <NOT <EMPTY? .TT>> + <==? <1 .TT> ALL>>> + (ALL)) + (ELSE + <PUTREST <REST .TEM <- <LENGTH .TEM> 1>> .TT> + .TEM)>>> + <RESULT-TYPE .NOD>> + +<DEFINE ARGCHK (GIV REQ NAME "AUX" (HI .REQ) (LO .REQ)) + #DECL ((GIV) FIX (REQ HI LO) <OR <LIST FIX FIX> FIX>) + <COND (<TYPE? .REQ LIST> + <SET HI <2 .REQ>> + <SET LO <1 .REQ>>)> + <COND (<L? .GIV .LO> + <MESSAGE ERROR "TOO FEW ARGS TO " .NAME>) + (<G? .GIV .HI> + <MESSAGE ERROR "TOO MANY ARGS TO " .NAME>)> T> + +<DEFINE EANA (NOD RTYP NAME) + #DECL ((NOD) NODE) + <OR <ANA .NOD .RTYP> + <MESSAGE ERROR "BAD ARGUMENT TO " .NAME .NOD>>> + +" FUNC-ANA main entry to analysis phase. Analyzes bindings then body." + +<DEFINE FUNC-ANA ANA-ACT (N R + "AUX" (ANALY-OK + <COND (<ASSIGNED? ANALY-OK> .ANALY-OK) + (ELSE T)>) (OV .VERBOSE)) + #DECL ((ANA-ACT) <SPECIAL ACTIVATION> (ANALY-OK) <SPECIAL ANY>) + <COND (.VERBOSE <PUTREST <SET VERBOSE .OV> ()>)> + <FUNC-AN1 .N .R>> + +<DEFINE FUNC-AN1 (FCN RTYP + "AUX" (VARTBL <SYMTAB .FCN>) (TMPS 0) (HTMPS 0) (TRUTH ()) + (UNTRUTH ()) (WHO ()) (WHON <>) (PRED <>) TEM (LIFE ()) + (USE-COUNT 0) (BACKTRACK 0)) + #DECL ((FCN) <SPECIAL NODE> (VARTBL) <SPECIAL SYMTAB> + (TMPS BACKTRACK USE-COUNT HTMPS) <SPECIAL FIX> + (LIFE TRUTH UNTRUTH) <SPECIAL LIST> + (WHO PRED WHON) <SPECIAL ANY>) + <RESET-VARS .VARTBL> + <BIND-AN <BINDING-STRUCTURE .FCN>> + <OR <SET RTYP <TYPE-OK? .RTYP <INIT-DECL-TYPE .FCN>>> + <MESSAGE ERROR "FUNCTION RETURNS WRONG TYPE " <NODE-NAME .FCN>>> + <PROG ((ACT? <ACTIV? <BINDING-STRUCTURE .FCN> T>) (OV .VERBOSE)) + <COND (.VERBOSE <PUTREST <SET VERBOSE .OV> ()>)> + <PUT .FCN ,AGND <>> + <PUT .FCN ,LIVE-VARS ()> + <SET LIFE ()> + <PUT .FCN ,ASSUM <BUILD-TYPE-LIST .VARTBL>> + <PUT .FCN ,ACCUM-TYPE <COND (.ACT? .RTYP) (ELSE NO-RETURN)>> + <SET TEM <SEQ-AN <KIDS .FCN> <INIT-DECL-TYPE .FCN>>> + <COND (.ACT? <SPEC-FLUSH> <PUT-FLUSH ALL>)> + <OR <NOT <AGND .FCN>> + <ASSUM-OK? <ASSUM .FCN> <AGND .FCN>> + <AGAIN>>> + <PUT .FCN ,ASSUM ()> + <PUT .FCN ,DEAD-VARS ()> + <OR .TEM + <MESSAGE ERROR " RETURNED VALUE VIOLATES VALUE DECL OF " .RTYP>> + <PUT .FCN ,RESULT-TYPE <TYPE-MERGE <ACCUM-TYPE .FCN> .TEM>> + <PUT <RSUBR-DECLS .FCN> 2 <TASTEFUL-DECL <RESULT-TYPE .FCN>>> + <RESULT-TYPE .FCN>> + +" BIND-AN analyze binding structure for PROGs, FUNCTIONs etc." + +<DEFINE BIND-AN (BNDS "AUX" COD) + #DECL ((BNDS) <LIST [REST SYMTAB]> (COD) FIX) + <REPEAT (SYM) + #DECL ((SYM) SYMTAB) + <AND <EMPTY? .BNDS> <RETURN>> + <PUT <SET SYM <1 .BNDS>> ,COMPOSIT-TYPE ANY> + <PUT .SYM ,CURRENT-TYPE <>> + <APPLY <NTH ,BANALS <SET COD <CODE-SYM .SYM>>> .SYM> + <SET BNDS <REST .BNDS>>>> + +" ENTROPY ignore call and return." + +<DEFINE ENTROPY (SYM) T> + +<DEFINE TUP-BAN (SYM) #DECL ((SYM) SYMTAB) + <COND (<NOT .ANALY-OK> + <PUT .SYM ,COMPOSIT-TYPE <1 <DECL-SYM .SYM>>> + <PUT .SYM ,CURRENT-TYPE ANY>) + (<N==? <ISTYPE? <1 <DECL-SYM .SYM>>> TUPLE> + <PUT .SYM ,COMPOSIT-TYPE TUPLE> + <PUT .SYM ,CURRENT-TYPE TUPLE>) + (ELSE + <PUT .SYM ,CURRENT-TYPE <1 <DECL-SYM .SYM>>> + <PUT .SYM ,COMPOSIT-TYPE <1 <DECL-SYM .SYM>>>)>> + +" Analyze AUX and OPTIONAL intializations." + +<DEFINE NORM-BAN (SYM "AUX" (VARTBL <NEXT-SYM .SYM>) TEM COD) + #DECL ((VARTBL) <SPECIAL SYMTAB> (SYM) SYMTAB (COD) FIX) + <OR <SET TEM <ANA <INIT-SYM .SYM> <1 <DECL-SYM .SYM>>>> + <MESSAGE ERROR "BAD AUX/OPT INIT " <NAME-SYM .SYM> + <INIT-SYM .SYM> + "DECL MISMATCH" + <RESULT-TYPE <INIT-SYM .SYM>> + <1 <DECL-SYM .SYM>>>> + <COND (<AND .ANALY-OK + <OR <G? <SET COD <CODE-SYM .SYM>> 9> + <L? .COD 6>>> + <COND (<NOT <SAME-DECL? .TEM <1 <DECL-SYM .SYM>>>> + <PUT .SYM ,CURRENT-TYPE .TEM>)> + <PUT .SYM ,COMPOSIT-TYPE .TEM>) + (ELSE + <PUT .SYM ,COMPOSIT-TYPE <1 <DECL-SYM .SYM>>> + <PUT .SYM ,CURRENT-TYPE <1 <DECL-SYM .SYM>>>)>> + +" ARGS-BAN analyze ARGS decl (change to OPTIONAL in some cases)." + +<DEFINE ARGS-BAN (SYM) + #DECL ((SYM) SYMTAB) + <PUT .SYM ,INIT-SYM <NODE1 ,QUOTE-CODE () LIST () ()>> + <PUT .SYM ,CODE-SYM 7> + <COND (.ANALY-OK <PUT .SYM ,COMPOSIT-TYPE LIST>) + (ELSE <PUT .SYM ,COMPOSIT-TYPE <1 <DECL-SYM .SYM>>>)> + <COND (<AND .ANALY-OK <NOT <SAME-DECL? LIST <1 <DECL-SYM .SYM>>>>> + <PUT .SYM ,CURRENT-TYPE LIST>) + (<NOT .ANALY-OK> <PUT .SYM ,CURRENT-TYPE ANY>)>> + +<DEFINE NAUX-BAN (SYM) + #DECL ((SYM) SYMTAB) + <PUT .SYM ,COMPOSIT-TYPE + <COND (.ANALY-OK NO-RETURN) (ELSE <1 <DECL-SYM .SYM>>)>> + <PUT .SYM ,CURRENT-TYPE <COND (.ANALY-OK NO-RETURN)(ELSE ANY)>>> + +" VECTOR of binding analyzers." + +<SETG BANALS + ![,ENTROPY + ,NORM-BAN + ,NAUX-BAN + ,TUP-BAN + ,ARGS-BAN + ,NORM-BAN + ,NORM-BAN + ,ENTROPY + ,ENTROPY + ,ENTROPY + ,ENTROPY + ,ENTROPY + ,ENTROPY!]> + +" SEQ-AN analyze a sequence of NODES discarding values until the last." + +<DEFINE SEQ-AN (L FTYP "OPTIONAL" (INP <>)) + #DECL ((L) <LIST [REST NODE]> (FTYP) ANY) + <COND (<EMPTY? .L> <MESSAGE INCONSISTENCY "EMPTY KIDS LIST ">) + (ELSE + <REPEAT (TT N) + <AND .INP + <==? <NODE-TYPE <1 .L>> ,QUOTE-CODE> + <==? <RESULT-TYPE <1 .L>> ATOM> + <RESET-VARS .VARTBL>> + <OR <SET TT + <ANA <SET N <1 .L>> + <COND (<EMPTY? <SET L <REST .L>>> .FTYP) + (ELSE ANY)>>> + <RETURN <>>> + <COND (<==? .TT NO-RETURN> + <COND (<AND .VERBOSE <NOT <EMPTY? .L>>> + <ADDVMESS <PARENT .N> + ("This object ends a sequence of forms" + .N " because it never returns")>)> + <RETURN NO-RETURN>)> + <AND <EMPTY? .L> <RETURN .TT>>>)>> + +" ANALYZE ASSIGNED? usage." + +<DEFINE ASSIGNED?-ANA (NOD RTYP "AUX" (TEM <KIDS .NOD>) TT T1 T2) + #DECL ((TT NOD) NODE (T1) SYMTAB (TEM) <LIST [REST NODE]>) + <COND (<EMPTY? .TEM> <MESSAGE ERROR "NO ARGS ASSIGNED? " .NOD>) + (<SEGFLUSH .NOD .RTYP>) + (ELSE + <EANA <SET TT <1 .TEM>> ATOM ASSIGNED?> + <COND (<AND <EMPTY? <REST .TEM>> + <==? <NODE-TYPE .TT> ,QUOTE-CODE> + <SET T2 <SRCH-SYM <NODE-NAME .TT>>> + <NOT <==? <CODE-SYM <SET T1 .T2>> -1>>> + <PUT .NOD ,NODE-TYPE ,ASSIGNED?-CODE> + <PUT .NOD ,NODE-NAME .T1> + <PUT .T1 ,ASS? T> + <PUT .T1 ,USED-AT-ALL T> + <REVIVE .NOD .T1>) + (<==? <LENGTH .TEM> 2> + <EANA <2 .TEM> '<OR <PRIMTYPE FRAME> PROCESS> ASSIGNED?>) + (<EMPTY? <REST .TEM>> + <COND (<AND .VERBOSE <==? <NODE-TYPE .TT> ,QUOTE-CODE>> + <ADDVMESS .NOD + ("External reference to LVAL: " + <NODE-NAME .TT>)>)> + <PUT .NOD ,NODE-TYPE ,ISUBR-CODE>) + (ELSE <MESSAGE ERROR "TOO MANY ARGS TO ASSIGNED?" .NOD>)>)> + <TYPE-OK? '<OR ATOM FALSE> .RTYP>> + +<PUT ,ASSIGNED? ANALYSIS ,ASSIGNED?-ANA> + +" ANALYZE LVAL usage. Become either direct reference or PUSHJ" + +<DEFINE LVAL-ANA (NOD RTYP "AUX" TEM ITYP (TT <>) T1 T2 T3) + #DECL ((NOD) NODE (TEM) <LIST [REST NODE]> (T1) SYMTAB (WHO) LIST + (USE-COUNT) FIX) + <COND + (<EMPTY? <SET TEM <KIDS .NOD>>> <MESSAGE ERROR "NO ARGS TO LVAL " .NOD>) + (<SEGFLUSH .NOD .RTYP>) + (<AND <OR <AND <TYPE? <NODE-NAME .NOD> SYMTAB> <SET TT <NODE-NAME .NOD>>> + <AND <EANA <1 .TEM> ATOM LVAL> + <EMPTY? <REST .TEM>> + <==? <NODE-TYPE <1 .TEM>> ,QUOTE-CODE> + <==? <RESULT-TYPE <1 .TEM>> ATOM> + <SET TT <SRCH-SYM <NODE-NAME <1 .TEM>>>>>> + <COND (<==? .WHON <PARENT .NOD>> <SET WHO ((<> .TT) !.WHO)>) (ELSE T)> + <PROG () + <SET ITYP <GET-CURRENT-TYPE .TT>> + T> + <COND (<AND <==? .PRED <PARENT .NOD>> + <SET T2 <TYPE-OK? .ITYP FALSE>> + <SET T3 <TYPE-OK? .ITYP '<NOT FALSE>>>> + <SET TRUTH <ADD-TYPE-LIST .TT .T3 .TRUTH <>>> + <SET UNTRUTH <ADD-TYPE-LIST .TT .T2 .UNTRUTH <>>>) + (ELSE T)> + <NOT <==? <CODE-SYM <SET T1 .TT>> -1>>> + <PUT .NOD ,NODE-TYPE ,LVAL-CODE> + <COND (<==? <USAGE-SYM .T1> 0> + <PUT .T1 ,USAGE-SYM <SET USE-COUNT <+ .USE-COUNT 1>>>)> + <REVIVE .NOD .T1> + <PUT .T1 ,RET-AGAIN-ONLY <>> + <PUT .T1 ,USED-AT-ALL T> + <PUT .NOD ,NODE-NAME .T1> + <SET ITYP <TYPE-OK? .ITYP .RTYP>> + <AND .ITYP <SET-CURRENT-TYPE .T1 .ITYP>> + .ITYP) + (<EMPTY? <REST .TEM>> + <COND + (<AND .VERBOSE <==? <NODE-TYPE <1 .TEM>> ,QUOTE-CODE>> + <ADDVMESS .NOD + ("External variable being referenced: " <NODE-NAME <1 .TEM>>)>)> + <PUT .NOD ,NODE-TYPE ,FLVAL-CODE> + <AND .TT <PUT .NOD ,NODE-NAME <SET T1 .TT>>> + <COND (.TT <TYPE-OK? <1 <DECL-SYM .T1>> .RTYP>) + (.CAREFUL ANY) + (ELSE .RTYP)>) + (<AND <==? <LENGTH .TEM> 2> + <EANA <2 .TEM> '<OR <PRIMTYPE FRAME> PROCESS> LVAL>> + ANY) + (ELSE <MESSAGE ERROR "BAD CALL TO LVAL " .NOD>)>> + +<PUT ,LVAL ANALYSIS ,LVAL-ANA> + +" SET-ANA analyze uses of SET." + +<DEFINE SET-ANA (NOD RTYP + "AUX" (TEM <KIDS .NOD>) (LN <LENGTH .TEM>) T1 T2 T11 + (WHON .WHON) (PRED .PRED) OTYP T3 XX) + #DECL ((NOD) NODE (TEM) <LIST [REST NODE]> (LN) FIX (T1) SYMTAB + (WHON PRED) <SPECIAL ANY> (WHO) LIST) + <PUT .NOD ,SIDE-EFFECTS (.NOD !<SIDE-EFFECTS .NOD>)> + <COND + (<SEGFLUSH .NOD .RTYP>) + (<L? .LN 2> <MESSAGE ERROR "TOO FEW ARGS TO SET " .NOD>) + (<AND <OR <AND <TYPE? <NODE-NAME .NOD> SYMTAB> <SET T11 <NODE-NAME .NOD>>> + <AND <EANA <1 .TEM> ATOM SET> + <==? .LN 2> + <==? <NODE-TYPE <1 .TEM>> ,QUOTE-CODE> + <==? <RESULT-TYPE <1 .TEM>> ATOM> + <SET T11 <SRCH-SYM <NODE-NAME <1 .TEM>>>>>> + <COND (<==? .WHON <PARENT .NOD>> + <SET WHON .NOD> + <SET WHO ((T .T11) !.WHO)>) + (ELSE T)> + <COND (<==? .PRED <PARENT .NOD>> <SET PRED .NOD>) (ELSE T)> + <OR <SET T2 <ANA <2 .TEM> <1 <DECL-SYM <SET T1 .T11>>>>> + <MESSAGE ERROR "DECL VIOLATION " <NAME-SYM .T1> .NOD>>> + <PUT .T1 ,PURE-SYM <>> + <SET XX <1 <DECL-SYM .T1>>> + <SET OTYP <OR <CURRENT-TYPE .T1> ANY>> + <COND (<AND <==? <CODE-SYM .T1> -1> .VERBOSE> + <ADDVMESS .NOD ("External variable being SET: " <NAME-SYM .T1>)>)> + <COND (<SET OTYP <TYPESAME .OTYP .T2>> <PUT .NOD ,TYPE-INFO (.OTYP <>)>) + (ELSE <PUT .NOD ,TYPE-INFO (<> <>)>)> + <PUT .NOD + ,NODE-TYPE + <COND (<==? <CODE-SYM .T1> -1> ,FSET-CODE) (ELSE ,SET-CODE)>> + <PUT .NOD ,NODE-NAME .T1> + <MAKE-DEAD .NOD .T1> + <SET-CURRENT-TYPE .T1 .T2> + <PUT .T1 ,USED-AT-ALL T> + <COND (<AND <==? .PRED .NOD> + <SET OTYP <TYPE-OK? .T2 '<NOT FALSE>>> + <SET T3 <TYPE-OK? .T2 FALSE>>> + <SET TRUTH <ADD-TYPE-LIST .T1 .OTYP .TRUTH T>> + <SET UNTRUTH <ADD-TYPE-LIST .T1 .T3 .UNTRUTH T>>)> + <TYPE-OK? .T2 .RTYP>) + (<L? .LN 4> + <SET T11 <ANA <2 .TEM> ANY>> + <COND (<==? .LN 2> + <COND (<AND .VERBOSE <==? <NODE-TYPE <1 .TEM>> ,QUOTE-CODE>> + <ADDVMESS .NOD + ("External variable being SET: " + <NODE-NAME <1 .TEM>>)>)> + <PUT .NOD ,NODE-TYPE ,FSET-CODE>) + (ELSE <EANA <3 .TEM> '<OR <PRIMTYPE FRAME> PROCESS> SET>)> + <TYPE-OK? .T11 .RTYP>) + (ELSE <MESSAGE ERROR "BAD CALL TO SET " <NODE-NAME <1 .TEM>> .NOD>)>> + +<PUT ,SET ANALYSIS ,SET-ANA> + +<DEFINE MUNG-L-D-STATE (V) #DECL ((V) <OR VECTOR SYMTAB>) + <REPEAT () <COND (<TYPE? .V VECTOR> <RETURN>)> + <PUT .V ,DEATH-LIST ()> + <SET V <NEXT-SYM .V>>>> + +<DEFINE MRESTORE-L-D-STATE (L1 L2 V) + <RESTORE-L-D-STATE .L1 .V> + <RESTORE-L-D-STATE .L2 .V T>> + +<DEFINE FREST-L-D-STATE (L) + #DECL ((L) LIST) + <MAPF <> + <FUNCTION (LL) + #DECL ((LL) <LIST SYMTAB <LIST [REST NODE]>>) + <COND (<NOT <2 <TYPE-INFO <1 <2 .LL>>>>> + <PUT <1 .LL> ,DEATH-LIST <2 .LL>>)>> + .L>> + +<DEFINE RESTORE-L-D-STATE (L V "OPTIONAL" (FLG <>)) + #DECL ((L) <LIST [REST <LIST SYMTAB LIST>]> (V) <OR SYMTAB VECTOR>) + <OR .FLG + <REPEAT (DL) + #DECL ((DL) <LIST [REST NODE]>) + <COND (<TYPE? .V VECTOR> <RETURN>)> + <COND (<AND <NOT <EMPTY? <SET DL <DEATH-LIST .V>>>> + <NOT <2 <TYPE-INFO <1 .DL>>>>> + <PUT .V ,DEATH-LIST ()>)> + <SET V <NEXT-SYM .V>>>> + <REPEAT (S DL) + #DECL ((DL) <LIST NODE> (S) SYMTAB) + <COND (<EMPTY? .L> <RETURN>)> + <SET S <1 <1 .L>>> + <AND .FLG + <REPEAT () + <COND (<==? .S .V> <RETURN>) (<TYPE? .V VECTOR> <RETURN>)> + <PUT .V + ,DEATH-LIST + <MAPF ,LIST + <FUNCTION (N) + #DECL ((N) NODE) + <COND (<==? <NODE-TYPE .N> ,SET-CODE> + <MAPRET>) + (ELSE .N)>> + <DEATH-LIST .V>>> + <SET V <NEXT-SYM .V>>>> + <COND (<NOT <2 <TYPE-INFO <1 <SET DL <2 <1 .L>>>>>>> + <PUT .S + ,DEATH-LIST + <COND (.FLG <LMERGE <DEATH-LIST .S> .DL>) (ELSE .DL)>>)> + <SET L <REST .L>>>> + +<DEFINE SAVE-L-D-STATE (V) + #DECL ((V) <OR VECTOR SYMTAB>) + <REPEAT ((L (())) (LP .L) DL) + #DECL ((L LP) LIST (DL) <LIST [REST NODE]>) + <COND (<TYPE? .V VECTOR> <RETURN <REST .L>>)> + <COND (<AND <NOT <EMPTY? <SET DL <DEATH-LIST .V>>>> + <NOT <2 <CHTYPE <TYPE-INFO <1 .DL>> LIST>>>> + <SET LP <REST <PUTREST .LP ((.V .DL))>>>)> + <SET V <NEXT-SYM .V>>>> + +<DEFINE MSAVE-L-D-STATE (L V) + #DECL ((V) <OR VECTOR SYMTAB> (L) LIST) + <REPEAT ((L (() !.L)) (LR .L) (LP <REST .L>) DL S TEM) + #DECL ((L LP LR TEM) LIST (S) SYMTAB (DL) <LIST [REST NODE]>) + <COND (<EMPTY? .LP> + <PUTREST .L <SAVE-L-D-STATE .V>> + <RETURN <REST .LR>>) + (<TYPE? .V VECTOR> <RETURN <REST .LR>>) + (<AND <NOT <EMPTY? <SET DL <DEATH-LIST .V>>>> + <NOT <2 <TYPE-INFO <1 .DL>>>>> + <COND (<==? <SET S <1 <1 .LP>>> .V> + <SET TEM <LMERGE <2 <1 .LP>> .DL>> + <COND (<EMPTY? .TEM> + <PUTREST .L <SET LP <REST .LP>>>) + (ELSE + <PUT <1 .LP> 2 .TEM> + <SET LP <REST <SET L .LP>>>)>) + (ELSE + <PUTREST .L <SET L ((.V .DL))>> + <PUTREST .L .LP>)>) + (<==? .V <1 <1 .LP>>> <SET LP <REST <SET L .LP>>>)> + <SET V <NEXT-SYM .V>>>> + +<DEFINE LMERGE (L1 L2) + #DECL ((L1 L2) <LIST [REST NODE]>) + <SET L1 + <MAPF ,LIST + <FUNCTION (N) + <COND (<OR <2 <TYPE-INFO .N>> + <AND <==? <NODE-TYPE .N> ,SET-CODE> + <NOT <MEMQ .N .L2>>>> + <MAPRET>)> + .N> + .L1>> + <SET L2 + <MAPF ,LIST + <FUNCTION (N) + <COND (<OR <2 <TYPE-INFO .N>> + <==? <NODE-TYPE .N> ,SET-CODE> + <MEMQ .N .L1>> + <MAPRET>)> + .N> + .L2>> + <COND (<EMPTY? .L1> .L2) + (ELSE <PUTREST <REST .L1 <- <LENGTH .L1> 1>> .L2> .L1)>> + +<DEFINE MAKE-DEAD (N SYM) #DECL ((N) NODE (SYM) SYMTAB) + <PUT .SYM ,DEATH-LIST (.N)>> + +<DEFINE KILL-REM (L V) + #DECL ((L) <LIST [REST SYMTAB]> (V) <OR SYMTAB VECTOR>) + <REPEAT ((L1 ())) + #DECL ((L1) LIST) + <COND (<TYPE? .V VECTOR> <RETURN .L1>)> + <COND (<AND <NOT <SPEC-SYM .V>> + <N==? <CODE-SYM .V> -1> + <MEMQ .V .L>> + <SET L1 (.V !.L1)>)> + <SET V <NEXT-SYM .V>>>> + +<DEFINE SAVE-SURVIVORS (LS LI "OPTIONAL" (FLG <>)) + #DECL ((LS) <LIST [REST <LIST SYMTAB LIST>]> (LI) <LIST [REST SYMTAB]>) + <MAPF <> + <FUNCTION (LL) + <COND (<MEMQ <1 .LL> .LI> + <MAPF <> + <FUNCTION (N) + #DECL ((N) NODE) + <PUT <TYPE-INFO .N> 2 T>> + <2 .LL>>) + (.FLG <PUT <1 .LL> ,DEATH-LIST <2 .LL>>)>> + .LS>> + +<DEFINE REVIVE (NOD SYM "AUX" (L <DEATH-LIST .SYM>)) + #DECL ((L) <LIST [REST NODE]> (SYM) SYMTAB (NOD) NODE) + <COND (<AND <NOT <SPEC-SYM .SYM>> <N==? <CODE-SYM .SYM> -1>> + <COND (<EMPTY? .L> <SET LIFE (.SYM !.LIFE)>) + (ELSE + <MAPF <> <FUNCTION (N) #DECL ((N) NODE) <PUT <TYPE-INFO .N> 2 T>> + ;"Temporary kludge." + .L>)> + <PUT .SYM ,DEATH-LIST (.NOD)> + <PUT .NOD ,TYPE-INFO (<> <>)>)>> + +" Ananlyze a FORM that could really be an NTH." + +<DEFINE FORM-F-ANA (NOD RTYP "AUX" (K <KIDS .NOD>) (OBJ <NODE-NAME .NOD>) TYP) + #DECL ((NOD) NODE (K) <LIST [REST NODE]>) + <COND (<==? <ISTYPE? <SET TYP <ANA <1 .K> APPLICABLE>>> FIX> + <PUT .NOD ,KIDS (<2 .K> <1 .K> !<REST .K 2>)> + <COND (<==? <LENGTH .K> 2> + <SET RTYP <NTH-REST-ANA .NOD .RTYP ,NTH-CODE .TYP>>) + (ELSE + <SET RTYP <PUT-ANA .NOD .RTYP ,PUT-CODE .TYP>>)> + <PUT .NOD ,NODE-SUBR <NODE-TYPE .NOD>> + <PUT .NOD ,KIDS .K> + <PUT .NOD ,NODE-NAME .OBJ> + <PUT .NOD ,NODE-TYPE ,FORM-F-CODE> + .RTYP) + (ELSE + <SPECIALIZE <NODE-NAME .NOD>> + <SPEC-FLUSH> + <PUT-FLUSH ALL> + <PUT .NOD ,SIDE-EFFECTS (ALL)> + <TYPE-OK? <RESULT-TYPE .NOD> .RTYP>)>> + +" Further analyze a FORM." + +<DEFINE FORM-AN (NOD RTYP) + #DECL ((NOD) NODE) + <APPLY <OR <GET <NODE-SUBR .NOD> ANALYSIS> + <GET <TYPE <NODE-SUBR .NOD>> TANALYSIS> + <FUNCTION (N R) + #DECL ((N) NODE) + <SPEC-FLUSH> + <PUT-FLUSH ALL> + <PUT .N ,SIDE-EFFECTS (ALL)> + <TYPE-OK? <RESULT-TYPE .N> .R>>> + .NOD + .RTYP>> + +"Determine if an ATOM is mainfest." + +<DEFINE MANIFESTQ (ATM) + #DECL ((ATM) ATOM) + <AND <MANIFEST? .ATM> + <GASSIGNED? .ATM> + <NOT <TYPE? ,.ATM SUBR>> + <NOT <TYPE? ,.ATM RSUBR>>>> + +" Search for a decl associated with a local value." + +<DEFINE SRCH-SYM (ATM "AUX" (TB .VARTBL)) + #DECL ((ATM) ATOM (TB) <PRIMTYPE VECTOR>) + <REPEAT () + <AND <EMPTY? .TB> <RETURN <>>> + <AND <==? .ATM <NAME-SYM .TB>> <RETURN .TB>> + <SET TB <NEXT-SYM .TB>>>> + +" Here to flush decls of specials for an external function call." + +<DEFINE SPEC-FLUSH () <FLUSHER <>>> + +" Here to flush decls when a PUT, PUTREST or external call happens." + +<DEFINE PUT-FLUSH (TYP) <FLUSHER .TYP>> + +<DEFINE FLUSHER (FLSFLG "AUX" (V .VARTBL)) + #DECL ((SYM) SYMTAB (V) <OR SYMTAB VECTOR>) + <COND + (.ANALY-OK + <REPEAT (SYM TEM) + #DECL ((SYM) SYMTAB) + <COND + (<AND <CURRENT-TYPE <SET SYM .V>> + <OR <AND <SPEC-SYM .SYM> <NOT .FLSFLG>> + <AND .FLSFLG + <N==? <CURRENT-TYPE .V> NO-RETURN> + <TYPE-OK? <CURRENT-TYPE .V> STRUCTURED> + <OR <==? .FLSFLG ALL> + <NOT <SET TEM <STRUCTYP <CURRENT-TYPE .V>>>> + <==? .TEM .FLSFLG>>>>> + <SET-CURRENT-TYPE + .SYM <FLUSH-FIX-TYPE .SYM <CURRENT-TYPE .SYM> .FLSFLG>>)> + <COND (<==? <USAGE-SYM .SYM> 0> <PUT .SYM ,USAGE-SYM <>>)> + <COND (<EMPTY? <SET V <NEXT-SYM .V>>> <RETURN>)>>) + (ELSE + <REPEAT (SYM) + #DECL ((SYM) SYMTAB) + <COND (<==? <USAGE-SYM <SET SYM .V>> 0> <PUT .SYM ,USAGE-SYM <>>)> + <COND (<EMPTY? <SET V <NEXT-SYM .V>>> <RETURN>)>>)>> + +<DEFINE FLUSH-FIX-TYPE (SYM TY FLG "AUX" TEM) + #DECL ((SYM) SYMTAB) + <OR <AND .FLG + <SET TEM <TOP-TYPE <TYPE-OK? .TY STRUCTURED>>> + <TYPE-OK? <COND (<SET TY <TYPE-OK? .TY '<NOT STRUCTURED>>> + <TYPE-MERGE .TEM .TY>) + (ELSE .TEM)> + <1 <DECL-SYM .SYM>>>> + <1 <DECL-SYM .SYM>>>> + + +" Punt forms with segments in them." + +<DEFINE SEGFLUSH (NOD RTYP) + #DECL ((NOD) NODE (L) <LIST [REST NODE]>) + <COND (<REPEAT ((L <KIDS .NOD>)) + <AND <EMPTY? .L> <RETURN <>>> + <AND <==? <NODE-TYPE <1 .L>> ,SEGMENT-CODE> <RETURN T>> + <SET L <REST .L>>> + <COND (.VERBOSE + <ADDVMESS .NOD + ("Not open compiled due to SEGMENT.")>)> + <SUBR-C-AN .NOD .RTYP>)>> + +" STACKFORM analyzer." + +<DEFINE STACKFORM-ANA (NOD RTYP "AUX" (K <KIDS .NOD>) TEM STFTYP TT) + #DECL ((NOD TT) NODE (K) <LIST [REST NODE]>) + <MESSAGE WARNING "STACKFORM IS HAZARDOUS TO YOUR CODE!"> + <PUT .NOD ,NODE-TYPE ,STACKFORM-CODE> + <ARGCHK <LENGTH .K> 3 STACKFORM> + <ANA <SET TT <1 .K>> ANY> + <SET STFTYP <APPLTYP .TT>> + <ANA <2 .K> ANY> + <SET TEM <ANA <3 .K> ANY>> + <OR <TYPE-OK? .TEM FALSE> + <MESSAGE WARNING " STACKFORM CAN'T STOP " .NOD>> + <PUT .NOD ,SIDE-EFFECTS (ALL)> + <PUT-FLUSH ALL> + <SPEC-FLUSH> + <TYPE-OK? .STFTYP .RTYP>> + +<PUT ,STACKFORM ANALYSIS ,STACKFORM-ANA> + +" Determine if the arg to STACKFORM is a SUBR." + +<DEFINE APPLTYP (NOD "AUX" (NT <NODE-TYPE .NOD>) ATM TT) + #DECL ((ATM) ATOM (NOD TT) NODE (NT) FIX) + <COND (<==? .NT ,GVAL-CODE> ;"<STACKFORM ,FOO ..." + <COND (<AND <==? <NODE-TYPE <SET TT <1 <KIDS .NOD>>>> + ,QUOTE-CODE> + <GASSIGNED? <SET ATM <NODE-NAME .TT>>> + <TYPE? ,.ATM SUBR>> + <SUBR-TYPE ,.ATM>) + (ELSE ANY)>) + (ELSE ANY) ;"MAY TRY OTHERS LATER ">> + +" Return type returned by a SUBR." + +<DEFINE SUBR-TYPE (SUB "AUX" TMP) + #DECL ((SUB) SUBR) + <SET TMP <2 <GET-TMP .SUB>>> + <COND (<TYPE? .TMP ATOM FORM> .TMP) (ELSE ANY)>> + +" Access the SUBR data base for return type." + +<DEFINE GET-TMP (SUB "AUX" (LS <MEMQ .SUB ,SUBRS>)) + #DECL ((VALUE) <LIST ANY ANY>) + <COND (.LS <NTH ,TEMPLATES <LENGTH .LS>>) + (ELSE '(ANY ANY))>> + +" GVAL analyzer." + +<DEFINE GVAL-ANA (NOD RTYP "AUX" (K <KIDS .NOD>) (LN <LENGTH .K>) TEM TT TEM1) + #DECL ((NOD TEM) NODE (TT) <VECTOR VECTOR ATOM ANY> (LN) FIX) + <COND (<SEGFLUSH .NOD .RTYP>) + (ELSE + <ARGCHK .LN 1 GVAL> + <PUT .NOD ,NODE-TYPE ,FGVAL-CODE> + <EANA <1 .K> ATOM GVAL> + <COND (<AND <==? <NODE-TYPE <SET TEM <1 .K>>> ,QUOTE-CODE> + <==? <RESULT-TYPE .TEM> ATOM>> + <PUT .NOD ,NODE-TYPE ,GVAL-CODE> + <COND (<MANIFEST? <SET TEM1 <NODE-NAME .TEM>>> + <PUT .NOD ,NODE-TYPE ,QUOTE-CODE> + <PUT .NOD ,NODE-NAME ,.TEM1> + <PUT .NOD ,KIDS ()> + <TYPE-OK? <GEN-DECL ,.TEM1> .RTYP>) + (<AND <GBOUND? .TEM1> <SET TEM1 <GET-DECL <GLOC .TEM1>>>> + <TYPE-OK? .TEM .RTYP>) + (ELSE <TYPE-OK? ANY .RTYP>)>) + (ELSE <TYPE-OK? ANY .RTYP>)>)>> + +<PUT ,GVAL ANALYSIS ,GVAL-ANA> + +" Analyze SETG usage." + +<DEFINE SETG-ANA (NOD RTYP "AUX" (K <KIDS .NOD>) (LN <LENGTH .K>) TEM TT T1 TTT) + #DECL ((NOD TEM) NODE (K) <LIST [REST NODE]> (LN) FIX (TT) VECTOR) + <COND (<SEGFLUSH .NOD .RTYP>) + (ELSE + <ARGCHK .LN 2 SETG> + <PUT .NOD ,NODE-TYPE ,FSETG-CODE> + <EANA <SET TEM <1 .K>> ATOM SETG> + <PUT .NOD ,SIDE-EFFECTS (.NOD !<SIDE-EFFECTS .NOD>)> + <COND (<==? <NODE-TYPE .TEM> ,QUOTE-CODE> + <AND <MANIFEST? <SET TTT <NODE-NAME .TEM>>> + <MESSAGE WARNING + "ATTEMPT TO SETG MANIFEST VARIABLE " + .TTT .NOD>> + <PUT .NOD ,NODE-TYPE ,SETG-CODE> + <COND (<AND <GBOUND? .TTT> + <SET T1 <GET-DECL <GLOC .TTT>>>> + <OR <ANA <2 .K> .T1> + <MESSAGE ERROR + " GLOBAL DECL VIOLATION " + .TTT .NOD>> + <TYPE-OK? .T1 .RTYP>) + (ELSE + <SET TTT <ANA <2 .K> ANY>> + <TYPE-OK? .TTT .RTYP>)>) + (ELSE + <SET TTT <ANA <2 .K> ANY>> + <TYPE-OK? .TTT .RTYP>)>)>>> + +<PUT ,SETG ANALYSIS ,SETG-ANA> + +<DEFINE BUILD-TYPE-LIST (V) + #DECL ((V) <OR VECTOR SYMTAB> (VALUE) LIST) + <COND (.ANALY-OK + <REPEAT ((L (())) (LP .L) TEM) + #DECL ((L LP) LIST) + <COND (<EMPTY? .V> <RETURN <REST .L>>) + (<N==? <CODE-SYM .V> -1> + <SET TEM <GET-CURRENT-TYPE .V>> + <SET LP <REST <PUTREST .LP ((.V .TEM T))>>>)> + <SET V <NEXT-SYM .V>>>) (ELSE ())>> + +<DEFINE RESET-VARS (V "OPTIONAL" (VL '[]) (FLG <>)) + #DECL ((V VL) <OR SYMTAB VECTOR>) + <REPEAT () + <COND (<==? .V .VL> <SET FLG T>)> + <COND (<EMPTY? .V> <RETURN>) + (<NOT .FLG> + <PUT .V ,CURRENT-TYPE <>> + <PUT .V ,COMPOSIT-TYPE ANY>)> + <PUT .V ,USAGE-SYM 0> + <PUT .V ,DEATH-LIST ()> + <SET V <NEXT-SYM .V>>>> + +<DEFINE GET-CURRENT-TYPE (SYM) + #DECL ((SYM) SYMTAB) + <OR <AND .ANALY-OK <CURRENT-TYPE .SYM>> <1 <DECL-SYM .SYM>>>> + +<DEFINE SET-CURRENT-TYPE (SYM ITYP "AUX" (OTYP <1 <DECL-SYM .SYM>>)) + #DECL ((SYM) SYMTAB) + <COND (<AND .ANALY-OK + <N==? <CODE-SYM .SYM> -1> + <NOT <SAME-DECL? <TYPE-AND .ITYP .OTYP> .OTYP>>> + <PUT .SYM ,CURRENT-TYPE .ITYP> + <PUT .SYM + ,COMPOSIT-TYPE + <TYPE-MERGE .ITYP <COMPOSIT-TYPE .SYM>>>) + (ELSE + <PUT .SYM ,CURRENT-TYPE <>> + <PUT .SYM ,COMPOSIT-TYPE .OTYP>)>> + +<DEFINE ANDUPC (V L) + #DECL ((V) <OR VECTOR SYMTAB> (L) <LIST [REST <LIST SYMTAB ANY ANY>]>) + <REPEAT () + <COND (<EMPTY? .V> <RETURN>)> + <COND (<CURRENT-TYPE .V> + <SET L <ADD-TYPE-LIST .V <CURRENT-TYPE .V> .L T>>)> + <SET V <NEXT-SYM .V>>> + .L> + +<DEFINE ANDUP (FROM TO) + #DECL ((TO FROM) <LIST [REST <LIST SYMTAB ANY ANY>]>) + <MAPF <> + <FUNCTION (L) <SET TO <ADD-TYPE-LIST <1 .L> <2 .L> .TO T>>> + .FROM> + .TO> + +<DEFINE ORUPC (V L "AUX" WIN) + #DECL ((V) <OR VECTOR SYMTAB> (L) <LIST [REST <LIST SYMTAB ANY ANY>]>) + <COND + (.ANALY-OK + <REPEAT () + <COND (<TYPE? .V VECTOR> <RETURN>)> + <SET WIN <>> + <MAPF <> + <FUNCTION (LL) #DECL ((LL) <LIST SYMTAB <OR ATOM FORM SEGMENT> ANY>) + <COND (<==? <1 .LL> .V> + <PUT .LL 2 <TYPE-MERGE <2 .LL> <GET-CURRENT-TYPE .V>>> + <PUT .LL 3 T> + <MAPLEAVE <SET WIN T>>)>> + .L> + <COND (<AND <NOT .WIN> + <CURRENT-TYPE .V>> + <SET L ((.V <1 <DECL-SYM .V>> T) !.L)>)> + <SET V <NEXT-SYM .V>>>)> + .L> + +<DEFINE ORUP (FROM TO "AUX" NDECL) + #DECL ((TO FROM) <LIST [REST <LIST SYMTAB <OR ATOM FORM SEGMENT> <OR ATOM FALSE>>]> + (NDECL) <OR ATOM FORM SEGMENT>) + <MAPF <> + <FUNCTION (L "AUX" (SYM <1 .L>) (WIN <>)) + <MAPF <> + <FUNCTION (LL) + <COND (<==? <1 .LL> .SYM> + <SET NDECL <TYPE-MERGE <2 .LL> <2 .L>>> + <PUT .LL 2 .NDECL> + <PUT .LL 3 <3 .LL>> + <MAPLEAVE <SET WIN T>>)>> + .TO> + <COND (<NOT .WIN> + <SET TO + ((.SYM + <TYPE-MERGE <GET-CURRENT-TYPE .SYM> <2 .L>> + <3 .L>) + !.TO)>)>> + .FROM> + .TO> + +<DEFINE ASSERT-TYPES (L) + #DECL ((L) <LIST [REST <LIST SYMTAB ANY ANY>]>) + <MAPF <> + <FUNCTION (LL) <SET-CURRENT-TYPE <1 .LL> <2 .LL>>> + .L>> + +<DEFINE ADD-TYPE-LIST (SYM NDECL INF MUNG + "OPTIONAL" (NTH-REST ()) + "AUX" (WIN <>) (OD <GET-CURRENT-TYPE .SYM>)) + #DECL ((SYM) SYMTAB (INF) LIST (NTH-REST) <LIST [REST ATOM FIX]> + (NDECL) <OR ATOM FALSE FORM SEGMENT> (MUNG) <OR ATOM FALSE>) + <COND (.ANALY-OK + <SET NDECL <TYPE-NTH-REST .NDECL .NTH-REST>> + <MAPF <> + <FUNCTION (L) + #DECL ((L) <LIST SYMTAB ANY>) + <COND (<==? <1 .L> .SYM> + <SET NDECL + <COND (.MUNG <TYPE-AND .NDECL .OD>) + (ELSE <TYPE-AND .NDECL <2 .L>>)>> + <PUT .L 2 .NDECL> + <PUT .L 3 .MUNG> + <MAPLEAVE <SET WIN T>>)>> + .INF> + <COND (<NOT .WIN> + <SET NDECL <TYPE-AND .NDECL .OD>> + <SET INF ((.SYM .NDECL .MUNG) !.INF)>)>)> + .INF> + +<DEFINE TYPE-NTH-REST (NDECL NTH-REST) #DECL ((NTH-REST) <LIST [REST ATOM FIX]>) + <REPEAT ((FIRST T) (NUM 0)) + #DECL ((NUM) FIX) + <COND (<EMPTY? .NTH-REST> <RETURN .NDECL>)> + <COND (<==? <1 .NTH-REST> NTH> + <SET NDECL + <FORM STRUCTURED + !<COND (<0? <SET NUM + <+ .NUM <2 .NTH-REST> -1>>> + ()) + (<1? .NUM> (ANY)) + (ELSE ([.NUM ANY]))> + .NDECL>> + <SET NUM 0> + <SET FIRST <>>) + (.FIRST <SET NDECL <REST-DECL .NDECL <2 .NTH-REST>>>) + (ELSE <SET NUM <+ .NUM <2 .NTH-REST>>>)> + <SET NTH-REST <REST .NTH-REST 2>>>> + +" AND/OR analyzer. Called from AND-ANA and OR-ANA." + +<DEFINE BOOL-AN (NOD RTYP ORER + "AUX" (L <KIDS .NOD>) FTYP FTY + (RTY + <COND (<TYPE-OK? .RTYP FALSE> .RTYP) + (ELSE <FORM OR .RTYP FALSE>)>) + (FLG <==? .PRED <PARENT .NOD>>) (SINF ()) STR SUNT + (FIRST T) FNOK NFNOK PASS) + #DECL ((NOD) NODE (L) <LIST [REST NODE]> (ORER RTYP) ANY (FTYP) FORM + (STR SINF SUNT) LIST) + <PROG ((TRUTH ()) (UNTRUTH ()) (PRED .NOD) L-D) + #DECL ((TRUTH UNTRUTH) <SPECIAL LIST> (PRED) <SPECIAL ANY> (L-D) LIST) + <COND + (<EMPTY? .L> <SET FTYP <TYPE-OK? FALSE .RTYP>>) + (ELSE + <SET FTY + <MAPR ,TYPE-MERGE + <FUNCTION (N + "AUX" (LAST <EMPTY? <REST .N>>) TY) + #DECL ((N) <LIST NODE>) + <COND (<AND .LAST <NOT .FLG>> <SET PRED <>>)> + <SET TY <ANA <1 .N> <COND (.LAST .RTYP) (.ORER .RTY) (ELSE ANY)>>> + <SET FNOK + <OR <==? .TY NO-RETURN> <NOT <TYPE-OK? .TY FALSE>>>> + <SET NFNOK <==? FALSE <ISTYPE? .TY>>> + <SET PASS <COND (.ORER .NFNOK) (ELSE .FNOK)>> + <COND (<NOT .TY> + <SET TY ANY> + <MESSAGE WARNING " OR/AND MAY RETURN WRONG TYPE " <1 .N>>)> + <COND (<COND (.ORER .FNOK) (ELSE .NFNOK)> + ;"This must end the AND/OR" + <COND (<AND .VERBOSE <NOT .LAST>> + <ADDVMESS .NOD + ("This object prematurely ends AND/OR: " + <1 .N> " its type is: " .TY)>)> + <SET LAST T>)> + <COND (<AND <N==? .TY NO-RETURN> <OR .LAST <NOT .PASS>>> + <COND (.FIRST + <SET L-D <SAVE-L-D-STATE .VARTBL>> + <SET SINF + <ANDUP <COND (.ORER .TRUTH) (ELSE .UNTRUTH)> + <BUILD-TYPE-LIST .VARTBL>>>) + (ELSE + <SET L-D <MSAVE-L-D-STATE .L-D .VARTBL>> + <SET SINF + <ORUP <COND (.ORER .TRUTH) (ELSE .UNTRUTH)> + <ORUPC .VARTBL .SINF>>>)> + <SET FIRST <>>)> + <ASSERT-TYPES <COND (.ORER .UNTRUTH) (ELSE .TRUTH)>> + <SET TRUTH <SET UNTRUTH ()>> + <OR .FIRST <RESTORE-L-D-STATE .L-D .VARTBL>> + <COND (<==? .TY NO-RETURN> + <OR .LAST + <MESSAGE WARNING + "UNREACHABLE AND/OR CLAUSE " + <1 .N>>> + <SET FLG <>> + <ASSERT-TYPES .SINF> + <MAPSTOP NO-RETURN>) + (.LAST + <COND (.FLG + <SET STR + <COND (.ORER .SINF) + (ELSE <BUILD-TYPE-LIST .VARTBL>)>> + <SET SUNT + <COND (.ORER <BUILD-TYPE-LIST .VARTBL>) + (ELSE .SINF)>>)> + <ASSERT-TYPES <ORUPC .VARTBL .SINF>> + <MAPSTOP .TY>) + (<AND .ORER .NFNOK> <MAPRET>) + (.ORER .TY) + (.FNOK <MAPRET>) + (ELSE FALSE)>> + .L>> + <COND (<AND .FNOK .ORER> <SET FTY <TYPE-OK? .FTY '<NOT FALSE>>>)>)>> + <COND (.FLG <SET TRUTH .STR> <SET UNTRUTH .SUNT>)> + .FTY> + +<DEFINE AND-ANA (NOD RTYP) + #DECL ((NOD) NODE) + <PUT .NOD ,NODE-TYPE ,AND-CODE> + <BOOL-AN .NOD .RTYP <>>> + +<PUT ,AND ANALYSIS ,AND-ANA> + +<DEFINE OR-ANA (NOD RTYP) + #DECL ((NOD) NODE) + <PUT .NOD ,NODE-TYPE ,OR-CODE> + <BOOL-AN .NOD .RTYP T>> + +<PUT ,OR ANALYSIS ,OR-ANA> + +" COND analyzer." + +<DEFINE CASE-ANA (N R) <COND-CASE .N .R T>> + +<DEFINE COND-ANA (N R) <COND-CASE .N .R <>>> + +<DEFINE COND-CASE (NOD RTYP CASE? + "AUX" (L <KIDS .NOD>) (FIRST T) (LAST <>) TT FNOK NFNOK STR + SUNT (FIRST1 T) PRAT (DFLG <>) TST-TYP SVWHO) + #DECL ((NOD) NODE (L) <LIST [REST NODE]> (RTYP) ANY) + <PROG ((TRUTH ()) (UNTRUTH ()) (TINF1 ()) (TINF ()) L-D L-D1) + #DECL ((TRUTH UNTRUTH) <SPECIAL LIST> (TINF1 TINF L-D L-D1) LIST) + <COND + (<EMPTY? .L> <TYPE-OK? FALSE .RTYP>) + (ELSE + <COND (.CASE? + <SET PRAT <NODE-NAME <1 <KIDS <1 .L>>>>> + <PROG ((WHON .NOD) (WHO ())) + #DECL ((WHO) <SPECIAL LIST> (WHON) <SPECIAL NODE>) + <SET TST-TYP <EANA <2 .L> ANY CASE>> + <SET SVWHO .WHO>> + <SET L <REST .L 2>>)> + <SET TT + <MAPR ,TYPE-MERGE + <FUNCTION (BRN "AUX" (BR <1 .BRN>) (PRED .BR) (EC T)) + #DECL ((BRN) <LIST NODE> (BR) NODE (PRED) <SPECIAL + <OR NODE FALSE>>) + <COND (<AND .CASE? <==? <NODE-TYPE .BR> ,QUOTE-CODE> <SET DFLG T>> + <MAPRET>)> + <OR <PREDIC .BR> <MESSAGE ERROR "EMPTY COND CLAUSE " .BR>> + <SET UNTRUTH <SET TRUTH ()>> + <SET LAST <EMPTY? <REST .BRN>>> + <SET TT + <COND (<NOT <EMPTY? <CLAUSES .BR>>> <SET EC <>> ANY) + (.LAST .RTYP) + (ELSE <TYPE-MERGE .RTYP FALSE>)>> + <SET TT + <COND (.CASE? + <SPEC-ANA <NODE-NAME <CHTYPE <PREDIC .BR> NODE>> + .PRAT + .TST-TYP + .TT + .DFLG + .BR + .SVWHO>) + (ELSE <ANA <PREDIC .BR> .TT>)>> + <SET DFLG <SET PRED <>>> + <SET FNOK <OR <==? .TT NO-RETURN> <NOT <TYPE-OK? .TT FALSE>>>> + <SET NFNOK <==? <ISTYPE? .TT> FALSE>> + <COND + (.VERBOSE + <COND + (.NFNOK + <ADDVMESS + .NOD + ("Cond predicate always FALSE: " + <PREDIC .BR> + !<COND (<EMPTY? <CLAUSES .BR>> ()) + (ELSE (" and non-reachable code in clause."))>)>)> + <COND + (<AND .FNOK <NOT .LAST>> + <ADDVMESS + .NOD + ("Cond ended prematurely because predicate always true: " + <PREDIC .BR> + " type of value: " + .TT)>)>)> + <COND (<NOT <OR .FNOK <AND <NOT .LAST> .NFNOK>>> + <SET L-D <SAVE-L-D-STATE .VARTBL>> + <COND (.FIRST + <SET TINF <ANDUP .UNTRUTH <BUILD-TYPE-LIST .VARTBL>>>) + (ELSE + <SET TINF <ANDUP .UNTRUTH <ORUPC .VARTBL .TINF>>>)> + <ASSERT-TYPES .TRUTH> + <SET FIRST <>>)> + <COND (<NOT .NFNOK> + <OR .EC <SET TT <SEQ-AN <CLAUSES .BR> .RTYP>>> + <COND (<N==? .TT NO-RETURN> + <COND (.FIRST1 + <SET TINF1 <BUILD-TYPE-LIST .VARTBL>> + <SET L-D1 <SAVE-L-D-STATE .VARTBL>>) + (ELSE + <SET TINF1 <ORUPC .VARTBL .TINF1>> + <SET L-D1 <MSAVE-L-D-STATE .L-D1 .VARTBL>>)> + <SET FIRST1 <>>)> + <OR .FIRST <RESTORE-L-D-STATE .L-D .VARTBL>> + <COND (.LAST + <AND <NOT .FNOK> <SET TT <TYPE-MERGE .TT FALSE>>>) + (.EC <SET TT <TYPE-OK? .TT '<NOT FALSE>>>)>) + (.NFNOK <SET TT FALSE>)> + <COND (<OR .LAST .FNOK> + <COND (.FNOK + <ASSERT-TYPES .TINF1> + <OR .FIRST1 <RESTORE-L-D-STATE .L-D1 .VARTBL>>) + (ELSE + <COND (.FIRST1 + <ASSERT-TYPES .TINF> + <OR .FIRST <RESTORE-L-D-STATE .L-D .VARTBL>>) + (ELSE + <ASSERT-TYPES <ORUP .TINF .TINF1>> + <MRESTORE-L-D-STATE .L-D1 .L-D .VARTBL>)>)> + <MAPSTOP .TT>) + (ELSE <ASSERT-TYPES .TINF> .TT)>> + .L>>)>> + .TT> + + +<DEFINE SPEC-ANA (CONST PRED-NAME OTYPE RTYP DFLG NOD WHO "AUX" TEM PAT) + #DECL ((NOD) NODE) + <SET PAT + <COND (<TYPE? .CONST LIST> + <COND (<==? .PRED-NAME ==?> <GEN-DECL <1 .CONST>>) + (<==? .PRED-NAME TYPE?> <TYPE-MERGE !.CONST>) + (ELSE + <MAPF ,TYPE-MERGE + <FUNCTION (X) <FORM PRIMTYPE .X>> + .CONST>)>) + (ELSE + <COND (<==? .PRED-NAME ==?> <GEN-DECL .CONST>) + (<==? .PRED-NAME TYPE?> .CONST) + (ELSE <FORM PRIMTYPE .CONST>)>)>> + <COND (.DFLG + <PUT .NOD ,RESULT-TYPE <SET TEM <TYPE-OK? ATOM .RTYP>>> + .TEM) + (ELSE + <COND (<AND <N==? .PRED-NAME ==?> + <N==? .OTYPE ANY> + <NOT <TYPE-OK? <FORM NOT .PAT> .OTYPE>>> + <SET TEM ATOM>) + (<TYPE-OK? .OTYPE .PAT> <SET TEM '<OR FALSE ATOM>>) + (ELSE <SET TEM FALSE>)> + <MAPF <> + <FUNCTION (L "AUX" (FLG <1 .L>) (SYM <2 .L>)) + #DECL ((L) <LIST <OR ATOM FALSE> SYMTAB> + (SYM) SYMTAB) + <SET TRUTH + <ADD-TYPE-LIST .SYM + .PAT + .TRUTH + .FLG + <REST .L 2>>> + <OR <==? .TEM ATOM> + <SET UNTRUTH + <ADD-TYPE-LIST + .SYM + <FORM NOT .PAT> + .UNTRUTH + .FLG + <REST .L 2>>>>> + .WHO> + <PUT .NOD ,RESULT-TYPE <SET TEM <TYPE-OK? .TEM .RTYP>>> + .TEM)>> + +" PROG/REPEAT analyzer. Hacks bindings and sets up info for GO/RETURN/AGAIN + analyzers." + +<DEFINE PRG-REP-ANA (PPNOD PRTYP + "AUX" (OV .VARTBL) (VARTBL <SYMTAB .PPNOD>) TT L-D + (OPN <AND <ASSIGNED? PNOD> .PNOD>) PNOD) + #DECL ((PNOD) <SPECIAL NODE> (VARTBL) <SPECIAL SYMTAB> (OV) SYMTAB (L-D) LIST + (PPNOD) NODE) + <COND (<N==? <NODE-SUBR .PPNOD> ,BIND> <SET PNOD .PPNOD>) + (.OPN <SET PNOD .OPN>)> + <PROG ((TMPS 0) (HTMPS 0) (ACT? <ACTIV? <BINDING-STRUCTURE .PPNOD> T>)) + #DECL ((TMPS HTMPS) <SPECIAL FIX>) + <BIND-AN <BINDING-STRUCTURE .PPNOD>> + <SET L-D <SAVE-L-D-STATE .VARTBL>> + <RESET-VARS .VARTBL .OV T> + <OR <SET PRTYP <TYPE-OK? .PRTYP <INIT-DECL-TYPE .PPNOD>>> + <MESSAGE ERROR "PROG RETURNS WRONG TYPE ">> + <PUT .PPNOD ,RESULT-TYPE .PRTYP> + <PROG ((STMPS .TMPS) (SHTMPS .HTMPS) (LL .LIFE) (OV .VERBOSE)) + #DECL ((STMPS SHTMPS) FIX (LL LIFE) LIST) + <COND (.VERBOSE <PUTREST <SET VERBOSE .OV> ()>)> + <MUNG-L-D-STATE .VARTBL> + <SET LIFE .LL> + <PUT .PPNOD ,AGND <>> + <PUT .PPNOD ,DEAD-VARS ()> + <PUT .PPNOD ,VSPCD ()> + <PUT .PPNOD ,LIVE-VARS ()> + <SET TMPS .STMPS> + <SET HTMPS .SHTMPS> + <PUT .PPNOD ,ASSUM <BUILD-TYPE-LIST .VARTBL>> + <PUT .PPNOD ,ACCUM-TYPE NO-RETURN> + <SET TT + <SEQ-AN <KIDS .PPNOD> + <COND (<N==? <NODE-SUBR .PPNOD> ,REPEAT> .PRTYP) + (ELSE ANY)>>> + <AND .ACT? <PROG () + <SPEC-FLUSH> + <PUT-FLUSH ALL>>> + <OR <AND <N==? <NODE-SUBR .PPNOD> ,REPEAT> <NOT <AGND .PPNOD>>> + <ASSUM-OK? + <ASSUM .PPNOD> + <COND (<N==? <NODE-SUBR .PPNOD> ,REPEAT> <AGND .PPNOD>) + (<AGND .PPNOD> + <ORUPC .VARTBL <CHTYPE <AGND .PPNOD> LIST>>) + (ELSE <BUILD-TYPE-LIST .VARTBL>)>> + <AGAIN>>> + <COND (<==? <NODE-SUBR .PPNOD> ,REPEAT> + <COND (<AGND .PPNOD> + <PUT .PPNOD + ,LIVE-VARS + <MSAVE-L-D-STATE <LIVE-VARS .PPNOD> .VARTBL>>) + (ELSE <PUT .PPNOD ,LIVE-VARS <SAVE-L-D-STATE .VARTBL>>)>)> + <SAVE-SURVIVORS .L-D .LIFE T> + <SAVE-SURVIVORS <LIVE-VARS .PPNOD> .LIFE> + <OR .TT + <MESSAGE " ERROR PROG VALUE VIOLATES VALUE DECL OF " + .PRTYP + .PPNOD>> + <COND (<NOT <OR <==? .TT NO-RETURN> <==? <NODE-SUBR .PPNOD> ,REPEAT>>> + <PUT .PPNOD + ,DEAD-VARS + <MSAVE-L-D-STATE <DEAD-VARS .PPNOD> .VARTBL>> + <COND (<N==? <ACCUM-TYPE .PPNOD> NO-RETURN> + <ASSERT-TYPES <ORUPC .VARTBL <VSPCD .PPNOD>>>)>) + (<N==? <ACCUM-TYPE .PPNOD> NO-RETURN> + <ASSERT-TYPES <VSPCD .PPNOD>>)> + <FREST-L-D-STATE <DEAD-VARS .PPNOD>> + <SET LIFE <KILL-REM .LIFE .OV>> + <PUT .PPNOD + ,ACCUM-TYPE + <COND (.ACT? <PUT .PPNOD ,SIDE-EFFECTS (ALL)> .PRTYP) + (<==? <NODE-SUBR .PPNOD> ,REPEAT> <ACCUM-TYPE .PPNOD>) + (ELSE <TYPE-MERGE .TT <ACCUM-TYPE .PPNOD>>)>>> + <ACCUM-TYPE .PPNOD>> + +" Determine if assumptions made for this loop are still valid." + +<DEFINE ASSUM-OK? (AS TY "AUX" (OK? T)) + #DECL ((TY AS) <LIST [REST <LIST SYMTAB ANY ANY>]>) + <COND + (.ANALY-OK + <MAPF <> + <FUNCTION (L "AUX" (SYM <1 .L>) (TT <>)) + #DECL ((L) <LIST SYMTAB <OR ATOM FORM SEGMENT>>) + <COND + (<N==? <2 .L> ANY> + <MAPF <> + <FUNCTION (LL) + <COND (<AND <SET TT <==? <1 .LL> .SYM>> + <N=? <2 .L> <2 .LL>> + <OR <==? <2 .L> NO-RETURN> + <TYPE-OK? <2 .LL> <NOTIFY <2 .L>>>>> + <COND (.OK? <SET BACKTRACK <+ .BACKTRACK 1>>)> + <SET OK? <>> + <AND <GASSIGNED? DEBUGSW> + ,DEBUGSW + <PRIN1 <NAME-SYM .SYM>> + <PRINC " NOT OK current type: "> + <PRIN1 <2 .LL>> + <PRINC " assumed type: "> + <PRIN1 <2 .L>> + <TERPRI>>)> + <AND .TT + <PUT .L 2 <TYPE-MERGE <2 .LL> <2 .L>>> + <MAPLEAVE>>> + .TY>)>> + .AS> + <COND (<NOT .OK?> <ASSERT-TYPES .AS>)>)> + .OK?> + +<DEFINE NOTIFY (D) + <COND (<AND <TYPE? .D FORM> <==? <LENGTH .D> 2> <==? <1 .D> NOT>> + <2 .D>) + (ELSE <FORM NOT .D>)>> + +" Analyze RETURN from a PROG/REPEAT. Check with PROGs final type." + +<DEFINE RETURN-ANA (NOD RTYP "AUX" (TT <KIDS .NOD>) N (LN <LENGTH .TT>) TEM) + #DECL ((NOD) NODE (TT) <LIST [REST NODE]> (LN) FIX (N) <OR NODE FALSE>) + <COND (<G? .LN 2> + <MESSAGE ERROR "TOO MANY ARGS TO RETURN " .NOD>) + (<OR <AND <==? .LN 2> <SET N <ACT-CHECK <2 .TT>>>> + <AND <L=? .LN 1> <SET N <PROGCHK RETURN>>>> + <SET N <CHTYPE .N NODE>> + <AND <0? .LN> + <PUT .NOD + ,KIDS + <SET TT (<NODE1 ,QUOTE-CODE .NOD ATOM T ()>)>>> + <SET TEM <EANA <1 .TT> <INIT-DECL-TYPE .N> RETURN>> + <COND (<==? <ACCUM-TYPE .N> NO-RETURN> + <PUT .N ,VSPCD <BUILD-TYPE-LIST <SYMTAB .N>>> + <PUT .N ,DEAD-VARS <SAVE-L-D-STATE .VARTBL>>) + (ELSE + <PUT .N ,VSPCD <ORUPC <SYMTAB .N> <VSPCD .N>>> + <PUT .N + ,DEAD-VARS + <MSAVE-L-D-STATE <DEAD-VARS .N> .VARTBL>>)> + <PUT .N ,ACCUM-TYPE <TYPE-MERGE .TEM <ACCUM-TYPE .N>>> + <PUT .NOD ,NODE-TYPE ,RETURN-CODE> + NO-RETURN) + (ELSE <SUBR-C-AN .NOD ANY>)>> + +<PUT ,RETURN ANALYSIS ,RETURN-ANA> + +<DEFINE ACT-CHECK (N "AUX" SYM RAO N1) + #DECL ((N N1) NODE (SYM) <OR SYMTAB FALSE> (RAO VALUE) <OR FALSE NODE>) + <COND (<OR <AND <==? <NODE-TYPE .N> ,LVAL-CODE> + <TYPE? <NODE-NAME .N> SYMTAB> + <PURE-SYM <SET SYM <NODE-NAME .N>>> + <==? <CODE-SYM .SYM> 1>> + <AND <==? <NODE-TYPE .N> ,SUBR-CODE> + <==? <NODE-SUBR .N> ,LVAL> + <==? <LENGTH <KIDS .N>> 1> + <==? <NODE-TYPE <SET N1 <1 <KIDS .N>>>> ,QUOTE-CODE> + <TYPE? <NODE-NAME .N1> ATOM> + <SET SYM <SRCH-SYM <NODE-NAME .N1>>> + <PURE-SYM .SYM> + <==? <CODE-SYM .SYM> 1>>> + <SET RAO <RET-AGAIN-ONLY <CHTYPE .SYM SYMTAB>>> + <EANA .N ACTIVATION AGAIN-RETURN> + <PUT <CHTYPE .SYM SYMTAB> ,RET-AGAIN-ONLY .RAO> + .RAO)>> + +" AGAIN analyzer." + +<DEFINE AGAIN-ANA (NOD RTYP "AUX" (TEM <KIDS .NOD>) N) + #DECL ((NOD) NODE (TEM) <LIST [REST NODE]> (N) <OR FALSE NODE>) + <COND (<OR <AND <EMPTY? .TEM> <SET N <PROGCHK AGAIN>>> + <AND <EMPTY? <REST .TEM>> <SET N <ACT-CHECK <1 .TEM>>>>> + <PUT .NOD ,NODE-TYPE ,AGAIN-CODE> + <SET N <CHTYPE .N NODE>> + <COND (<AGND .N> + <PUT .N ,LIVE-VARS + <MSAVE-L-D-STATE <LIVE-VARS .N> .VARTBL>>) + (ELSE <PUT .N ,LIVE-VARS <SAVE-L-D-STATE .VARTBL>>)> + <PUT .N + ,AGND + <COND (<NOT <AGND .N>> <BUILD-TYPE-LIST <SYMTAB .N>>) + (ELSE <ORUPC <SYMTAB .N> <AGND .N>>)>> + NO-RETURN) + (<EMPTY? <REST .TEM>> + <OR <ANA <1 .TEM> ACTIVATION> + <MESSAGE ERROR "WRONG TYPE FOR AGAIN " .NOD>> + ANY) + (ELSE <MESSAGE ERROR "TOO MANY ARGS TO AGAIN " .NOD>)>> + +<PUT ,AGAIN ANALYSIS ,AGAIN-ANA> + +" Analyze losing GOs." + +<DEFINE GO-ANA (NOD RTYP "AUX" (TEM <KIDS .NOD>) N RT) + #DECL ((NOD N) NODE (TEM) <LIST [REST NODE]>) + <MESSAGE WARGINING "GO/TAG NOT REALLY SUPPORTED."> + <COND (<1? <LENGTH .TEM>> + <SET RT <EANA <SET N <1 .TEM>> '<OR TAG ATOM> GO>> + <COND (<OR <AND <==? <NODE-TYPE .N> ,QUOTE-CODE> + <==? .RT ATOM> + <PROGCHK GO>> + <==? .RT TAG>> + <AND <==? .RT ATOM> .ANALY-OK + <PROG () <SET ANALY-OK <>> <AGAIN .ANA-ACT>>> + <PUT .NOD ,NODE-TYPE ,GO-CODE> NO-RETURN) + (ELSE <MESSAGE ERROR "BAD ARG TO GO " .NOD>)>) + (ELSE <MESSAGE ERROR "WRONG NO. OF ARGS TO GO " .NOD>)>> + +<PUT ,GO ANALYSIS ,GO-ANA> + +<DEFINE TAG-ANA (NOD RTYP "AUX" (K <KIDS .NOD>) N) + #DECL ((PNOD N NOD) NODE (K) <LIST [REST NODE]>) + <MESSAGE WARGINING "GO/TAG NOT REALLY SUPPORTED."> + <COND (<1? <LENGTH .K>> + <PROGCHK TAG> + <AND .ANALY-OK <PROG () <SET ANALY-OK <>> <AGAIN .ANA-ACT>>> + <PUT .PNOD ,ACTIVATED T> + <EANA <SET N <1 .K>> ATOM TAG> + <COND (<AND <==? <NODE-TYPE .N> ,QUOTE-CODE> + <==? <RESULT-TYPE .N> ATOM>> + <PUT .NOD ,NODE-TYPE ,TAG-CODE> TAG) + (ELSE <MESSAGE ERROR "BAD ARG TO TAG " .NOD>)>)>> + +<PUT ,TAG ANALYSIS ,TAG-ANA> + +" If not in PROG/REPEAT complain about NAME." + +<DEFINE PROGCHK (NAME) + <OR <ASSIGNED? PNOD> + <MESSAGE ERROR "NOT IN PROG/REPEAT " .NAME>> + .PNOD> + +" Dispatch to special handlers for SUBRs. Or use standard." + +<DEFINE SUBR-ANA (NOD RTYP) + #DECL ((NOD) NODE) + <APPLY <GET <NODE-SUBR .NOD> ANALYSIS ',SUBR-C-AN> + .NOD + .RTYP>> + +" Hairy SUBR call analyzer. Also looks for internal calls." + +<DEFINE SUBR-C-AN (NOD RTYP + "AUX" (ARGS 0) (TYP ANY) + (TMPL <GET-TMP <NODE-SUBR .NOD>>) (NRGS1 <1 .TMPL>) + (ARGACS + <COND (<AND <G? <LENGTH .TMPL> 4> + <NOT <==? <4 .TMPL> STACK>>> + <4 .TMPL>)>)) + #DECL ((NOD) <SPECIAL NODE> (ARGS) <SPECIAL FIX> + (TYP NRGS1 ARGACS) <SPECIAL ANY> (TMPL) <SPECIAL LIST>) + <MAPF + <FUNCTION ("TUPLE" T "AUX" NARGS (TL <LENGTH .TMPL>) TEM (NARGS1 .NRGS1) (N .NOD) + (TPL .TMPL) (RGS .ARGS)) + #DECL ((T) TUPLE (ARGS RGS TL) FIX + (TMPL TPL) <LIST ANY ANY [REST LIST ANY ANY ANY]> (N NOD) NODE + (NARGS) <LIST FIX FIX>) + <SET TYP <2 .TPL>> + <SPEC-FLUSH> + <PUT-FLUSH ALL> + <COND + (<SEGS .N> + <COND (<TYPE? .TYP ATOM FORM>) (ELSE <SET TYP ANY>)> + <COND (<AND <G? .TL 2> <NOT .ARGACS>> + <PUT .N ,NODE-TYPE ,ISUBR-CODE>)>) + (ELSE + <COND + (<TYPE? .NARGS1 FIX> + <ARGCHK .RGS .NARGS1 <NODE-NAME .N>>) + (<TYPE? .NARGS1 LIST> + <AND <G? .RGS <2 <SET NARGS .NARGS1>>> + <MESSAGE ERROR " TOO MANY ARGS TO " <NODE-NAME .N> .N>> + <AND <L? .RGS <1 .NARGS>> + <MESSAGE ERROR " TOO FEW ARGS TO " <NODE-NAME .N> .N>> + <AND <G? .TL 2> + <G? .RGS <+ <1 .NARGS> <LENGTH <3 .TPL>>>> + <SET TL 0>> ;"Dont handle funny calls to things like LLOC." + <COND (<AND <L? .RGS <2 .NARGS>> <G? .TL 2>> + ;"For funny cases like LLOC." + <SET TEM + <MAPF ,LIST + <FUNCTION (DEF) + <NODE1 ,QUOTE-CODE + .NOD + <TYPE .DEF> + .DEF + ()>> + <REST <3 .TPL> <- .RGS <1 .NARGS>>>>> + <SET RGS <2 .NARGS>> + <COND (<EMPTY? <KIDS .N>> <PUT .N ,KIDS .TEM>) + (ELSE + <PUTREST <REST <KIDS .N> <- <LENGTH <KIDS .N>> 1>> + .TEM>)>)>)> + <COND (<TYPE? .TYP ATOM FORM>) + (ELSE <SET TYP <APPLY .TYP !.T>>)> + <COND (<G? .TL 2> ;"Short call exists?." + <OR <==? <4 .TPL> STACK> <SET RGS 0>> + <PUT .NOD ,NODE-TYPE ,ISUBR-CODE>)> + <SET ARGS .RGS>)>> + <FUNCTION (N "AUX" TYP) + #DECL ((N NOD) NODE (ARGS) FIX (ARGACS) <PRIMTYPE LIST>) + <COND (<==? <NODE-TYPE .N> ,SEGMENT-CODE> + <EANA <1 <KIDS .N>> STRUCTURED SEGMENT> + <PUT .NOD ,SEGS T> + ANY) + (ELSE + <SET ARGS <+ .ARGS 1>> + <SET TYP <ANA .N ANY>> + <COND (<AND <NOT <SEGS .NOD>> .ARGACS <NOT <EMPTY? .ARGACS>>> + <SET ARGACS <REST .ARGACS>>)> + .TYP)>> + <KIDS .NOD>> + <PUT .NOD ,SIDE-EFFECTS (ALL)> + <PUT .NOD ,STACKS <* .ARGS 2>> + <TYPE-OK? .TYP .RTYP>> + +<DEFINE SEGMENT-ANA (NOD RTYP) <MESSAGE ERROR "ILLEGAL SEGMENT " .NOD>> + +" Analyze VECTOR, UVECTOR and LIST builders." + +<DEFINE COPY-AN (NOD RTYP + "AUX" (ARGS 0) (RT <ISTYPE? <RESULT-TYPE .NOD>>) (K <KIDS .NOD>) N + (LWIN <==? .RT LIST>) NN COD) + #DECL ((NOD N) NODE (ARGS) FIX (K) <LIST [REST NODE]>) + <COND + (<NOT <EMPTY? .K>> + <REPEAT (DC STY PTY TEM TT (SG <>) (FRM <FORM .RT>) + (FRME <CHTYPE .FRM LIST>) (GOTDC <>)) + #DECL ((FRM) FORM (FRME) <LIST ANY>) + <COND (<EMPTY? .K> + <COND (<==? .RT LIST> + <RETURN <SET RT + <COND (<EMPTY? <REST .FRM>> <1 .FRM>) + (ELSE .FRM)>>>)> + <COND (.DC <PUTREST .FRME ([REST .DC])>) + (.STY <PUTREST .FRME ([REST .STY])>) + (.PTY <PUTREST .FRME ([REST <FORM PRIMTYPE .PTY>])>)> + <RETURN <SET RT .FRM>>) + (<OR <==? <SET COD <NODE-TYPE <SET N <1 .K>>>> ,SEGMENT-CODE> + <==? .COD ,SEG-CODE>> + <SET TEM + <GET-ELE-TYPE <EANA <1 <KIDS .N>> STRUCTURED SEGMENT> + ALL>> + <PUT .NOD ,SEGS T> + <COND (<NOT .SG> <SET GOTDC <>>)> + <SET SG T> + <COND (<AND .LWIN + <MEMQ <STRUCTYP <RESULT-TYPE <1 <KIDS .N>>>> + '![LIST VECTOR UVECTOR TUPLE!]>>) + (ELSE <SET LWIN <>>)>) + (ELSE <SET ARGS <+ .ARGS 2>> <SET TEM <ANA .N ANY>>)> + <COND (<NOT .GOTDC> + <SET GOTDC T> + <SET PTY + <COND (<SET STY <ISTYPE? <SET DC .TEM>>> + <TYPEPRIM .STY>)>>) + (<OR <NOT .DC> <N==? .DC .TEM>> + <SET DC <>> + <COND (<OR <N==? <SET TT <ISTYPE? .TEM>> .STY> <NOT .STY>> + <SET STY <>> + <COND (<AND .PTY + <==? .PTY <AND .TT <TYPEPRIM .TT>>>>) + (ELSE <SET PTY <>>)>)>)> + <COND (<NOT .SG> <SET FRME <REST <PUTREST .FRME (.TEM)>>>)> + <SET K <REST .K>>>)> + <PUT .NOD ,RESULT-TYPE .RT> + <PUT .NOD ,STACKS .ARGS> + <COND + (<AND <GASSIGNED? COPY-LIST-CODE> .LWIN> + <MAPF <> + <FUNCTION (N) + #DECL ((N) NODE) + <COND (<==? <NODE-TYPE .N> ,SEGMENT-CODE> + <PUT .N ,NODE-TYPE ,SEG-CODE>)>> + <KIDS .NOD>> + <COND (<AND <==? <LENGTH <SET K <KIDS .NOD>>> 1> + <==? <NODE-TYPE <1 .K>> ,SEG-CODE> + <==? <STRUCTYP <RESULT-TYPE <SET NN <1 <KIDS <1 .K>>>>>> LIST>> + <COND (<NOT <EMPTY? <PARENT .NOD>>> + <MAPR <> + <FUNCTION (L "AUX" (N <1 .L>)) + #DECL ((N) NODE (L) <LIST [REST NODE]>) + <COND (<==? .NOD .N> + <PUT .L 1 .NN> + <MAPLEAVE>)>> + <KIDS <CHTYPE <PARENT .NOD> NODE>>>)> + <PUT .NN ,PARENT <CHTYPE <PARENT .NOD> NODE>> + <SET RT <RESULT-TYPE .NN>>) + (ELSE <PUT .NOD ,NODE-TYPE ,COPY-LIST-CODE>)>) + (ELSE + <MAPF <> + <FUNCTION (N) + #DECL ((N) NODE) + <COND (<==? <NODE-TYPE .N> ,SEG-CODE> + <PUT .N ,NODE-TYPE ,SEGMENT-CODE>)>> + <KIDS .NOD>> + <PUT .NOD ,NODE-TYPE ,COPY-CODE>)> + <TYPE-OK? .RT .RTYP>> + +" Analyze quoted objects, for structures hack type specs." + +<DEFINE QUOTE-ANA (NOD RTYP) + #DECL ((NOD) NODE) + <TYPE-OK? <GEN-DECL <NODE-NAME .NOD>> .RTYP>> + +<DEFINE QUOTE-ANA2 (NOD RTYP) + #DECL ((NOD) NODE) + <COND (<1? <LENGTH <KIDS .NOD>>> + <PUT .NOD ,NODE-TYPE ,QUOTE-CODE> + <PUT .NOD ,NODE-NAME <1 <KIDS .NOD>>> + <PUT .NOD ,KIDS ()> + <TYPE-OK? <RESULT-TYPE .NOD> .RTYP>) + (ELSE <MESSAGE ERROR "BAD CALL TO QUOTE ">)>> + +<PUT ,QUOTE ANALYSIS ,QUOTE-ANA2> + +<DEFINE IRSUBR-ANA (NOD RTYP) + <RSUBRC-ANA .NOD .RTYP <>>> + +" Analyze a call to an RSUBR." + +<DEFINE RSUBR-ANA (NOD RTYP "AUX" ACST RN) + #DECL ((NOD RN FCN) NODE) + <COND (<AND <TYPE? <NODE-SUBR .NOD> FUNCTION> + <SET ACST <ACS <SET RN <GET <NODE-NAME .NOD> .IND>>>> + <OR <ASSIGNED? GROUP-NAME> <==? .FCN .RN>>> + <RSUBRC-ANA .NOD .RTYP .ACST>) + (ELSE <RSUBRC-ANA .NOD .RTYP <>>)>> + +<DEFINE RSUBRC-ANA (NOD RTYP ACST "AUX" (ARGS 0)) + #DECL ((NOD N) NODE (ACST) <PRIMTYPE LIST> (ARGS) FIX) + <AND <=? .ACST '(STACK)> <SET ACST <>>> + <MAPF <> + <FUNCTION (ARG RT) + #DECL ((ARG NOD) NODE) + <COND (<==? <NODE-TYPE .ARG> ,SEGMENT-CODE> + <EANA <1 <KIDS .ARG>> .RT SEGMENT> + <PUT .NOD ,SEGS T>) + (ELSE + <EANA .ARG .RT <NODE-NAME .NOD>> + <COND (<AND <NOT <SEGS .NOD>> .ACST> + <SET ACST <REST .ACST>>)> + <SET ARGS <+ .ARGS 1>>)>> + <KIDS .NOD> <TYPE-INFO .NOD>> + <SPEC-FLUSH> + <PUT-FLUSH ALL> + <OR .ACST <PUT .NOD ,STACKS <* .ARGS 2>>> + <PUT .NOD ,SIDE-EFFECTS (ALL)> + <TYPE-OK? <RESULT-TYPE .NOD> .RTYP>> + +" Analyze CHTYPE, in some cases do it at compile time." + +<DEFINE CHTYPE-ANA (NOD RTYP "AUX" (K <KIDS .NOD>) NTN NT OBN OB) + #DECL ((NOD OBN NTN) NODE (K) <LIST [REST NODE]> (NT) ATOM) + <COND (<SEGFLUSH .NOD .RTYP>) + (ELSE + <ARGCHK <LENGTH .K> 2 CHTYPE> + <SET OB <ANA <SET OBN <1 .K>> ANY>> + <EANA <SET NTN <2 .K>> ATOM CHTYPE> + <COND (<==? <NODE-TYPE .NTN> ,QUOTE-CODE> + <OR <MEMQ <SET NT <NODE-NAME .NTN>> <ALLTYPES>> + <MESSAGE ERROR " 2D ARG CHTYPE NOT A TYPE " .NT .NOD>> + <OR <TYPE-OK? .OB <FORM PRIMTYPE <TYPEPRIM .NT>>> + <MESSAGE ERROR + " PRIMTYPES DIFFER CHTYPE" + .OB + .NT .NOD>> + <COND (<==? <NODE-TYPE .OBN> ,QUOTE-CODE> + <PUT .NOD ,NODE-TYPE ,QUOTE-CODE> + <PUT .NOD ,KIDS ()> + <PUT .NOD + ,NODE-NAME + <CHTYPE <NODE-NAME .OBN> .NT>>) + (ELSE <PUT .NOD ,NODE-TYPE ,CHTYPE-CODE>)> + <PUT .NOD ,RESULT-TYPE .NT> + <TYPE-OK? .NT .RTYP>) + (ELSE + <COND (.VERBOSE + <ADDVMESS .NOD + ("Can't open compile CHTYPE.")>)> + <TYPE-OK? ANY .RTYP>)>)>> + +<PUT ,CHTYPE ANALYSIS ,CHTYPE-ANA> + +" Analyze use of ASCII sometimes do at compile time." + +<DEFINE ASCII-ANA (NOD RTYP "AUX" (K <KIDS .NOD>) ITM TYP TEM) + #DECL ((NOD ITM) NODE (K) <LIST [REST NODE]>) + <COND (<SEGFLUSH .NOD .RTYP>) + (ELSE + <ARGCHK <LENGTH .K> 1 ASCII> + <SET TYP <EANA <SET ITM <1 .K>> '<OR FIX CHARACTER> ASCII>> + <COND (<==? <NODE-TYPE .ITM> ,QUOTE-CODE> + <PUT .NOD ,NODE-TYPE ,QUOTE-CODE> + <PUT .NOD ,NODE-NAME <SET TEM <ASCII <NODE-NAME .ITM>>>> + <PUT .NOD ,RESULT-TYPE <TYPE .TEM>> + <PUT .NOD ,KIDS ()>) + (<==? <ISTYPE? .TYP> FIX> + <PUT .NOD ,NODE-TYPE ,CHTYPE-CODE> + <PUT .NOD ,RESULT-TYPE CHARACTER>) + (<==? .TYP CHARACTER> + <PUT .NOD ,NODE-TYPE ,CHTYPE-CODE> + <PUT .NOD ,RESULT-TYPE FIX>) + (ELSE + <PUT .NOD ,RESULT-TYPE '<OR FIX CHARACTER>>)> + <TYPE-OK? <RESULT-TYPE .NOD> .RTYP>)>> + +<PUT ,ASCII ANALYSIS ,ASCII-ANA> + +<DEFINE UNWIND-ANA (NOD RTYP"AUX" (K <KIDS .NOD>) ITYP) + #DECL ((NOD) NODE (K) <LIST [REST NODE]>) + <SET ITYP <EANA <1 .K> ANY UNWIND>> + <EANA <2 .K> ANY UNWIND> + <TYPE-OK? .ITYP .RTYP>> + +" Analyze ISTRING/ILIST/IVECTOR/IUVECTOR in cases of known and unknown last arg." + +<DEFINE ISTRUC-ANA (N R "AUX" (K <KIDS .N>) FM NUM TY (NEL REST) SIZ) + #DECL ((N FM NUM) NODE) + <COND (<==? <NODE-SUBR .N> ,IBYTES> + <EANA <1 .K> FIX <NODE-NAME .N>> + <COND (<==? <NODE-TYPE <1 .K>> ,QUOTE-CODE> + <SET SIZ <NODE-NAME <1 .K>>>)> + <SET K <REST .K>>)> + <EANA <SET NUM <1 .K>> FIX <NODE-NAME .N>> + <SET TY + <EANA <SET FM <2 .K>> + <COND (<==? <NODE-NAME .FM> ISTRING> CHARACTER) + (<==? <NODE-NAME .FM> IBYTES> FIX) + (ELSE ANY)> + <NODE-NAME .N>>> + <COND (<TYPE-OK? .TY '<OR FORM LIST VECTOR UVECTOR>> + <MESSAGE WARNING "UNCERTAIN USE OF " <NODE-NAME .N> .N> + <SPEC-FLUSH> + <PUT-FLUSH ALL>) + (ELSE <PUT .N ,NODE-TYPE ,ISTRUC2-CODE>)> + <COND (<==? <NODE-TYPE .NUM> ,QUOTE-CODE> <SET NEL <NODE-NAME .NUM>>)> + <AND <TYPE-OK? .TY FORM> <SET TY ANY>> + <TYPE-OK? <COND (<==? <NODE-SUBR .N> ,IBYTES> + <COND (<ASSIGNED? SIZ> + <COND (<TYPE? .NEL FIX> <FORM BYTES .SIZ .NEL>) + (ELSE <FORM BYTES .SIZ>)>) + (ELSE BYTES)>) + (ELSE + <FORM <ISTYPE? <RESULT-TYPE .N>> + [.NEL .TY] + !<COND (<==? .TY ANY> ()) + (ELSE ([REST .TY]))>>)> + .R>> + +<DEFINE ISTRUC2-ANA (N R "AUX" (K <KIDS .N>) GD NUM TY (NEL REST) SIZ) + #DECL ((N NUM GD) NODE) + <COND (<==? <NODE-SUBR .N> ,IBYTES> + <EANA <1 .K> FIX <NODE-NAME .N>> + <COND (<==? <NODE-TYPE <1 .K>> ,QUOTE-CODE> + <SET SIZ <NODE-NAME <1 .K>>>)> + <SET K <REST .K>>)> + <EANA <SET NUM <1 .K>> FIX <NODE-NAME .N>> + <SET TY + <EANA <SET GD <2 .K>> + <COND (<==? <NODE-SUBR .N> ,ISTRING> CHARACTER) + (<==? <NODE-SUBR .N> ,IBYTES> FIX) + (ELSE ANY)> + <NODE-NAME .N>>> + <COND (<==? <NODE-TYPE .NUM> ,QUOTE-CODE> <SET NEL <NODE-NAME .NUM>>)> + <TYPE-OK? <COND (<==? <NODE-SUBR .N> ,IBYTES> + <COND (<ASSIGNED? SIZ> + <COND (<TYPE? .NEL FIX> <FORM BYTES .SIZ .NEL>) + (ELSE <FORM BYTES .SIZ>)>) + (ELSE BYTES)>) + (ELSE + <FORM <ISTYPE? <RESULT-TYPE .N>> + [.NEL .TY] + !<COND (<==? .TY ANY> ()) + (ELSE ([REST .TY]))>>)> + .R>> + +" Analyze READ type SUBRS in two cases (print uncertain usage message maybe?)" + +<DEFINE READ-ANA (N R) + #DECL ((N) NODE) + <MAPF <> + <FUNCTION (NN "AUX" TY) + #DECL ((NN N) NODE) + <COND (<==? <NODE-TYPE .NN> ,EOF-CODE> + <SPEC-FLUSH> <PUT-FLUSH ALL> + <SET TY <EANAQ <1 <KIDS .NN>> ANY <NODE-NAME .N> .N>> + <COND (<TYPE-OK? .TY + '<OR FORM LIST VECTOR UVECTOR>> + <MESSAGE WARNING + " UNCERTAIN USE OF " + <NODE-NAME .N> .N>) + (ELSE <PUT .N ,NODE-TYPE ,READ-EOF2-CODE>)>) + (ELSE <EANA .NN ANY <NODE-NAME .N>>)>> + <KIDS .N>> + <SPEC-FLUSH><PUT-FLUSH ALL> + <TYPE-OK? ANY .R>> + +<DEFINE READ2-ANA (N R) + #DECL ((N) NODE) + <MAPF <> + <FUNCTION (NN) + #DECL ((NN N) NODE) + <COND (<==? <NODE-TYPE .NN> ,EOF-CODE> + <EANAQ <1 <KIDS .NN>> ANY <NODE-NAME .N> .N>) + (ELSE <EANA .NN ANY <NODE-NAME .N>>)>> + <KIDS .N>> + <SPEC-FLUSH><PUT-FLUSH ALL> + <TYPE-OK? ANY .R>> + +<DEFINE GET-ANA (N R "AUX" TY (K <KIDS .N>) (NAM <NODE-NAME .N>)) + #DECL ((N) NODE (K) <LIST NODE NODE NODE>) + <EANA <1 .K> ANY .NAM> + <EANA <2 .K> ANY .NAM> + <SET TY <EANAQ <3 .K> ANY .NAM .N>> + <COND (<TYPE-OK? .TY '<OR LIST VECTOR UVECTOR FORM>> + <MESSAGE WARNING "UNCERTAIN USE OF " .NAM .N> + <SPEC-FLUSH> <PUT-FLUSH ALL>) + (ELSE <PUT .N ,NODE-TYPE ,GET2-CODE>)> + <TYPE-OK? ANY .R>> + +<DEFINE GET2-ANA (N R "AUX" (K <KIDS .N>) (NAM <NODE-NAME .N>) (LN <LENGTH .K>)) + #DECL ((N) NODE (K) <LIST NODE NODE [REST NODE]> (LN) FIX) + <EANA <1 .K> ANY .NAM> + <EANA <2 .K> ANY .NAM> + <COND (<==? .LN 3> <EANAQ <3 .K> ANY .NAM .N>)> + <TYPE-OK? ANY .R>> + +<DEFINE EANAQ (N R NAM INOD "AUX" SPCD) + #DECL ((N) NODE (SPCD) LIST) + <SET SPCD <BUILD-TYPE-LIST .VARTBL>> + <SET R <EANA .N .R .NAM>> + <ASSERT-TYPES <ORUPC .VARTBL .SPCD>> + .R> + +<DEFINE USE-REG () + #DECL ((TMPS HTMPS) FIX) + <COND (<0? ,REGS> + <AND <G? <SET TMPS <+ .TMPS 2>> .HTMPS> <SET HTMPS .TMPS>>) + (ELSE <SETG REGS <- ,REGS 1>>)>> + +<DEFINE UNUSE-REG () + #DECL ((TMPS) FIX) + <COND (<==? ,REGS 5> <SET TMPS <- .TMPS 2>>) + (ELSE <SETG REGS <+ ,REGS 1>>)>> + +<DEFINE REGFLS () + #DECL ((TMPS HTMPS) FIX) + <AND <G? <SET TMPS <+ .TMPS <* <- 5 ,REGS> 2>>> .HTMPS> + <SET HTMPS .TMPS>> + <SETG REGS 5>> + +<DEFINE ACTIV? (BST NOACT) + #DECL ((BST) <LIST [REST SYMTAB]>) + <REPEAT () + <AND <EMPTY? .BST> <RETURN <>>> + <AND <==? <CODE-SYM <1 .BST>> 1> + <OR <NOT .NOACT> + <NOT <RET-AGAIN-ONLY <1 .BST>>> + <SPEC-SYM <1 .BST>>> + <RETURN T>> + <SET BST <REST .BST>>>> + +<DEFINE SAME-DECL? (D1 D2) <OR <=? .D1 .D2> <NOT <TYPE-OK? .D2 <NOTIFY .D1>>>>> + +<DEFINE SPECIALIZE (OBJ "AUX" T1 T2 SYM OB) + #DECL ((T1) FIX (OB) FORM (T2) <OR FALSE SYMTAB>) + <COND (<AND <TYPE? .OBJ FORM SEGMENT> + <SET OB <CHTYPE .OBJ FORM>> + <OR <AND <==? <SET T1 <LENGTH .OB>> 2> + <==? <1 .OB> LVAL> + <TYPE? <SET SYM <2 .OB>> ATOM>> + <AND <==? .T1 3> + <==? <1 .OB> SET> + <TYPE? <SET SYM <2 .OB>> ATOM>>> + <SET T2 <SRCH-SYM .SYM>>> + <COND (<NOT <SPEC-SYM .T2>> + <MESSAGE NOTE " REDCLARED SPECIAL " .SYM> + <PUT .T2 ,SPEC-SYM T>)>)> + <COND (<MEMQ <PRIMTYPE .OBJ> '![FORM LIST UVECTOR VECTOR!]> + <MAPF <> ,SPECIALIZE .OBJ>)>> + +<COND (<GASSIGNED? ARITH-ANA> + <SETG ANALYZERS + <DISPATCH ,SUBR-ANA + (,QUOTE-CODE ,QUOTE-ANA) + (,FUNCTION-CODE ,FUNC-ANA) + (,SEGMENT-CODE ,SEGMENT-ANA) + (,FORM-CODE ,FORM-AN) + (,PROG-CODE ,PRG-REP-ANA) + (,SUBR-CODE ,SUBR-ANA) + (,COND-CODE ,COND-ANA) + (,COPY-CODE ,COPY-AN) + (,RSUBR-CODE ,RSUBR-ANA) + (,ISTRUC-CODE ,ISTRUC-ANA) + (,ISTRUC2-CODE ,ISTRUC2-ANA) + (,READ-EOF-CODE ,READ-ANA) + (,READ-EOF2-CODE ,READ2-ANA) + (,GET-CODE ,GET-ANA) + (,GET2-CODE ,GET2-ANA) + (,MAP-CODE ,MAPPER-AN) + (,MARGS-CODE ,MARGS-ANA) + (,ARITH-CODE ,ARITH-ANA) + (,TEST-CODE ,ARITHP-ANA) + (,0-TST-CODE ,ARITHP-ANA) + (,1?-CODE ,ARITHP-ANA) + (,MIN-MAX-CODE ,ARITH-ANA) + (,ABS-CODE ,ABS-ANA) + (,FIX-CODE ,FIX-ANA) + (,FLOAT-CODE ,FLOAT-ANA) + (,MOD-CODE ,MOD-ANA) + (,LNTH-CODE ,LENGTH-ANA) + (,MT-CODE ,EMPTY?-ANA) + (,NTH-CODE ,NTH-ANA) + (,REST-CODE ,REST-ANA) + (,PUT-CODE ,PUT-ANA) + (,PUTR-CODE ,PUTREST-ANA) + (,UNWIND-CODE ,UNWIND-ANA) + (,FORM-F-CODE ,FORM-F-ANA) + (,IRSUBR-CODE ,IRSUBR-ANA) + (,ROT-CODE ,ROT-ANA) + (,LSH-CODE ,LSH-ANA) + (,BIT-TEST-CODE ,BIT-TEST-ANA) + (,CASE-CODE ,CASE-ANA) + (,COPY-LIST-CODE ,COPY-AN)>>)> + +<ENDPACKAGE> diff --git a/<mdl.comp>/syntax.macro.1 b/<mdl.comp>/syntax.macro.1 new file mode 100644 index 0000000..8e85e79 --- /dev/null +++ b/<mdl.comp>/syntax.macro.1 @@ -0,0 +1,54 @@ +1<[..D:^I..D? A A A A A A A A A A A A A A A A A A A A A A A A A A A A | A AA A A ( ) A A A A AA A AA AA AA AA AA AA AA AA AA AA A ( A ) A A AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA ( / ) A A A AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA ( A ) A A ? +FVYACC ===> SYNTAX CONVERTER RUNNING. +[0[1J:K +:Sint (*act[])() { + "EFVLOSSAGE act0;' [  +:S-1}; +"EFVLOSSAGE act END0;'] +:Sint r1[] { + "EFVLOSSAGE r10;' ![ +:S-1};"EFVLOSSAGE r1 END0;'] +:Sint r2[] { + "EFVLOSSAGE r20;' ![ +:S-1};"EFVLOSSAGE r2 END0;'] +:Schar *sterm[] { + "EFVLOSSAGE sterm0;' [ +:S0};"EFVLOSSAGE sterm END0;'] +:Schar *snterm[] { + "EFVLOSSAGE snterm0;' [ +:S0};"EFVLOSSAGE snterm END0;'] +:Sint g[] { + "EFVLOSSAGE g0;' ![ +:S-1};"EFVLOSSAGE g END0;'] +:Sint pg[] { + "EFVLOSSAGE pg0;' ![ +:S-1};"EFVLOSSAGE pg END0;'] +:Sint sq[] { + "EFVLOSSAGE sq0;' ![ +:S-1};"EFVLOSSAGE sq END0;'] +:Sint nbpw {"EFVLOSSAGE npbw0;'  +:S};"EFVLOSSAGE npbw END0;' +:Sint nwpbt {"EFVLOSSAGE nwpbt0;'  +:S};"EFVLOSSAGE nwpbt END0;' +:Sint a[] { + "EFVLOSSAGE a0;' ![ +:S-1};"EFVLOSSAGE a END0;'] +:Sint pa[] { + "EFVLOSSAGE pa0;' ![ +:S-1};"EFVLOSSAGE pa END0;']]> +.,ZK +J<:S,"{U0 !'! Q0; R +Q0+1"ED' +Q0+2"EC.U0 :S","EFVLOSSAGE string0;'3R !'! + Q0,.FSBOUND-Z+(BJ<:S"\; !'! RI\C>WZJZ)FSBOUNDWCD' +Q0+3"EFLR'> +JS<:S]0+1;2RDI<>> +<J:S +ar;:S{"EFVLOSSAGE ar start0;'.U0RFLRQ0,.-1X1 0,.K +:S"EFVLOSSAGE act AGAIN0;':Sar"EFVLOSSAGE ar END0;' +-2DFWK FQ1+(FSHPOS)-(FSWIDTH)"GI + ' G1> +JI<SETG TABLES!-SYNTAX!-PACKAGE!- + #TABLES!-SYNTAX!-PACKAGE!- [ +S-DDJ]1]0]..D FVDONE +> \ No newline at end of file diff --git a/<mdl.comp>/temp.getord.1 b/<mdl.comp>/temp.getord.1 new file mode 100644 index 0000000000000000000000000000000000000000..4a8bca4ea2f2e362b707329307f086397700a902 GIT binary patch literal 1111 zcmbV~?`zs%5XUc?8r#)1tFXcb<<U8&QyYzm$-p^dk|t^65ByQ2;#Nvw!ro*r$}Bki z*LRnwD{a>odmztq_k1t+Ja^BBF&ul1p*?akWyVa`HqSF<uj`FG!>64%;5aPRU4Uph zo<pn%LPC@-7XTW=uMEH?89%|0W8uuz=$9hQAwg4WE4)8qb2zB900a_t86QCWUm@aJ z2!M~Q943`sV*(ZvAdNS;$>kI}2}Ixkk`UW-J8!IThg@!2d7_+mmTiW0<+B%tKen^1 z(Hl^m#;Dh!_0;f(HX6;%PJx|{yXMI2bxH0R=AehhjL|_aXi_ZWM(QuE795ZZj$B>- z2+(*Lx^0i8zu)C1AOM#KXgdqx=UoAS4^=B8`8{|A5cV0&ufJ<8NGvw)q5n1)Tw`rv za1&q3=vs7-hA|v^PS>`+kmq0}xHj3z+G36VctlF+@r!OkGSg~Bt7&z)rm3u|DVnZn zx~^B4T$ihgo|!e91jl_m`UCp{=`am*m?=kd-!RV&hfZg4jHP>~@6m$XaO83&<OU!6 zDQ>>4R`kS)34gR&U0K3v_0gKc&h!egVo9Wm)ZIz)1F9~m?i`Y&#w2WFOd>KEc8Fs< zrc$zkP*mCoied>u>5>-#K3^k;1dmAY?1b>(Kh#zc;;H@p6HF0~h@0o@e9VyV4a06f zSPL_1ALV@j3SJ4v7L>?spDuqjg4@=H8+7x*tq!R$cneCz%@&lky8$J_=zl<YzUIHs c)U~Rtsui6n@+VcUDQdmKR2dy5A|_7b4{SNM$p8QV literal 0 HcmV?d00001 diff --git a/<mdl.comp>/terst.gen.1 b/<mdl.comp>/terst.gen.1 new file mode 100644 index 0000000..9cf1ba4 --- /dev/null +++ b/<mdl.comp>/terst.gen.1 @@ -0,0 +1,129 @@ +<PACKAGE "CARGEN"> + +<ENTRY ARITH-GEN ABS-GEN FLOAT-GEN FIX-GEN MOD-GEN ROT-GEN LSH-GEN 1?-GEN + GEN-FLOAT GENFLOAT MIN-MAX PRED:BRANCH:GEN 0-TEST FLIP TEST-GEN> + +<USE "CACS" "CODGEN" "CHKDCL" "COMCOD" "COMPDEC" "CONFOR" "STRGEN"><DEFINE TEST-GEN (NOD WHERE + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" (K <1 <KIDS .NOD>>) (K2 <2 <KIDS .NOD>>) REGT REGT2 + (S <SW? <NODE-NAME .NOD>>) TRANSFORM ATYP ATYP2 B2 + (SDIR .DIR) (RW .WHERE) TRANS1 (FLS <==? .RW FLUSHED>) + TEM (ONO .NO-KILL) (NO-KILL .ONO) + "ACT" TA) + #DECL ((NOD K K2) NODE (REGT) DATUM (TRANSFORM) <SPECIAL TRANS> + (TRANS1) TRANS (NO-KILL) <SPECIAL LIST>) + <SET WHERE + <COND (<==? .WHERE FLUSHED> FLUSHED) + (ELSE <UPDATE-WHERE .NOD .WHERE>)>> + <COND (<OR <==? <NODE-TYPE .K2> ,QUOTE-CODE> + <AND <NOT <MEMQ <NODE-TYPE .K> ,SNODES>> + <NOT <SIDE-EFFECTS .NOD>> + <MEMQ <NODE-TYPE .K2> ,SNODES>>> + <COND (<AND <==? <NODE-TYPE .K> ,LVAL-CODE> + <COND (<==? <LENGTH <SET TEM <TYPE-INFO .K>>> 2> <2 .TEM>) + (ELSE T)> + <SET TEM <NODE-NAME .K>> + <NOT <MAPF <> + <FUNCTION (LL) + <AND <==? <1 .LL> .TEM> <MAPLEAVE>>> + .NO-KILL>>> + <SET NO-KILL ((<NODE-NAME .K> <>) !.NO-KILL)>)> + <SET K .K2> + <SET K2 <1 <KIDS .NOD>>> + <PUT .NOD ,NODE-NAME <FLOP <NODE-NAME .NOD>>>)> + <SET ATYP <ISTYPE? <RESULT-TYPE .K2>>> + <SET ATYP2 <ISTYPE-GOOD? <RESULT-TYPE .K>>> + <SET REGT + <DATUM <COND (.ATYP .ATYP) (ELSE ANY-AC)> ANY-AC>> + <SET REGT2 + <COND (<OR <==? <NODE-TYPE .K> ,QUOTE-CODE> + <NOT <SIDE-EFFECTS .K2>>> + DONT-CARE) + (.ATYP2 <DATUM .ATYP2 ANY-AC>) + (ELSE <DATUM ANY-AC ANY-AC>)>> + <COND (<N==? <NODE-TYPE .K> ,QUOTE-CODE> + <COND (<OR <==? .ATYP FLOAT> <==? .ATYP2 FLOAT>>) + (ELSE + <SET TRANSFORM <MAKE-TRANS .NOD 1 1 0 1 1 <+ 2 <- .S>> .S>> + <PUT <2 .TRANSFORM> 6 1> + <PUT <2 .TRANSFORM> 7 0>)> + <SET REGT2 <GEN .K .REGT2>> + <COND (<ASSIGNED? TRANSFORM> + <SET TRANS1 .TRANSFORM> + <SET TRANSFORM <UPDATE-TRANS .NOD .TRANS1>>)> + <COND (<TYPE? <DATVAL .REGT2> AC> + <SET REGT <GEN .K2 DONT-CARE>> + <COND (<TYPE? <DATVAL .REGT2> AC> + <PUT .NOD ,NODE-NAME <FLOP <NODE-NAME .NOD>>> + <SET TEM .REGT> + <SET REGT .REGT2> + <SET REGT2 .TEM> + <COND (<ASSIGNED? TRANSFORM> + <SET TEM .TRANS1> + <SET TRANS1 .TRANSFORM> + <SET TRANSFORM .TEM>)> + <SET TEM .ATYP> + <SET ATYP .ATYP2> + <SET ATYP2 .TEM>) + (ELSE <TOACV .REGT>)>) + (ELSE <SET REGT <GEN .K2 .REGT>>)>) + (ELSE + <COND (<OR <==? .ATYP FIX> + <0? <NODE-NAME .K>> + <1? <NODE-NAME .K>>> + <SET TRANSFORM <MAKE-TRANS .NOD 1 1 0 1 1 <+ 2 <- .S>> .S>>)> + <COND (<==? .ATYP FIX> + <PUT <PUT <2 .TRANSFORM> 2 1> 3 <FIX <NODE-NAME .K>>>)> + <COND (<LN-LST .K2> <SET REGT ,NO-DATUM>) + (ELSE + <SET REGT <GEN .K2 .REGT>> + <DATTYP-FLUSH .REGT> + <PUT .REGT ,DATTYP .ATYP>)> + <RETURN + <TEST-DISP .NOD + .WHERE + .NOTF + .BRANCH + .DIR + .REGT + <COND (<ASSIGNED? TRANSFORM> + <DO-TRANS <FIX <NODE-NAME .K>> .TRANSFORM>) + (ELSE <NODE-NAME .K>)> + <AND <ASSIGNED? TRANSFORM> <NOT <0? <1 <3 .TRANSFORM>>>>>> + .TA>)> + <DELAY-KILL .NO-KILL .ONO> + <AND <ASSIGNED? TRANSFORM> + <CONFORM .REGT .REGT2 .TRANSFORM .TRANS1> + <PUT .NOD ,NODE-NAME <FLOP <NODE-NAME .NOD>>>> + <COND (.BRANCH + <AND .NOTF <SET DIR <NOT .DIR>>> + <VAR-STORE <>> + <GEN-COMP2 <NODE-NAME .NOD> + .ATYP2 + .ATYP + .REGT2 + .REGT + <COND (.FLS .DIR) (ELSE <NOT .DIR>)> + <COND (.FLS .BRANCH) (ELSE <SET B2 <MAKE:TAG>>)>> + <COND (<NOT .FLS> + <SET RW <MOVE:ARG <MOVE:ARG <REFERENCE .SDIR> .WHERE> .RW>> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2> + .RW)>) + (ELSE + <VAR-STORE <>> + <GEN-COMP2 <NODE-NAME .NOD> + .ATYP2 + .ATYP + .REGT2 + .REGT + .NOTF + <SET BRANCH <MAKE:TAG>>> + <MOVE:ARG <REFERENCE T> .WHERE> + <RET-TMP-AC .WHERE> + <BRANCH:TAG <SET B2 <MAKE:TAG>>> + <LABEL:TAG .BRANCH> + <MOVE:ARG <REFERENCE <>> .WHERE> + <LABEL:TAG .B2> + <MOVE:ARG .WHERE .RW>)>> +<ENDPACKAGE> \ No newline at end of file diff --git a/<mdl.comp>/test.gen.3 b/<mdl.comp>/test.gen.3 new file mode 100644 index 0000000..3eef8e8 --- /dev/null +++ b/<mdl.comp>/test.gen.3 @@ -0,0 +1,230 @@ +<PACKAGE "STRGEN"> + +<ENTRY NTH-GEN REST-GEN PUT-GEN LNTH-GEN MT-GEN PUTREST-GEN IPUT-GEN + IREMAS-GEN FLUSH-COMMON-SYMT COMMUTE-STRUC DEFER-IT PUT-COMMON-DAT + LIST-LNT-SPEC RCHK> + +<USE "CODGEN" "CACS" "COMCOD" "CHKDCL" "COMPDEC" "SPCGEN" "COMTEM" "CARGEN"> +<DEFINE PUTREST-GEN (NOD WHERE + "AUX" ST1 ST2 (K <KIDS .NOD>) (FLG T) N CD (ONO .NO-KILL) + (NO-KILL .ONO) (2RET <>)) + #DECL ((NOD N) NODE (K) <LIST NODE NODE> (ST1 ST2) DATUM + (NO-KILL) <SPECIAL LIST> (ONO) LIST) + <COND (<==? <NODE-SUBR .NOD> ,REST> + <SET NOD <1 .K>> + <SET K <KIDS .NOD>> + <SET 2RET T>)> ;"Really <REST <PUTREST ...." + <COND (<AND <==? <NODE-TYPE <2 .K>> ,QUOTE-CODE> + <==? <NODE-NAME <2 .K>> ()>> + <SET ST1 <GEN <1 .K> <UPDATE-WHERE .NOD .WHERE>>>) + (<AND <NOT <SIDE-EFFECTS? <1 .K>>> + <NOT <SIDE-EFFECTS? <2 .K>>> + <MEMQ <NODE-TYPE <1 .K>> ,SNODES>> + <AND <==? <NODE-TYPE <SET N <1 .K>>> ,LVAL-CODE> + <COND (<==? <LENGTH <SET CD <TYPE-INFO .N>>> 2> <2 .CD>) + (ELSE T)> + <SET CD <NODE-NAME .N>> + <NOT <MAPF <> + <FUNCTION (LL) + #DECL ((LL) <LIST SYMTAB ANY>) + <AND <==? .CD <1 .LL>> <MAPLEAVE>>> + .NO-KILL>> + <SET NO-KILL ((.CD <>) !.NO-KILL)>> + <SET ST2 + <GEN <2 .K> + <COND (.2RET <GOODACS <2 .K> .WHERE>) + (ELSE <DATUM LIST ANY-AC>)>>> + <SET ST1 + <GEN <1 .K> + <COND (.2RET DONT-CARE) + (ELSE <UPDATE-WHERE .NOD .WHERE>)>>> + <DELAY-KILL .NO-KILL .ONO>) + (ELSE + <SET ST1 + <GEN <1 .K> + <GOODACS .NOD + <COND (<OR <==? .WHERE FLUSHED> .2RET> + DONT-CARE) + (ELSE .WHERE)>>>> + <SET ST2 <GEN <2 .K> <DATUM LIST ANY-AC>>>)> + <KILL-COMMON LIST> + <AND .CAREFUL + <G? 1 <MINL <RESULT-TYPE <1 .K>>>> + <COND (<TYPE? <DATVAL .ST1> AC> + <EMIT <INSTRUCTION `JUMPE <ACSYM <DATVAL .ST1>> |CERR2 >>) + (ELSE + <EMIT <INSTRUCTION `SKIPN !<ADDR:VALUE .ST1>>> + <BRANCH:TAG |CERR2 >)>> + <AND <ASSIGNED? ST2> <TOACV .ST2>> + <OR <TYPE? <DATVAL .ST1> AC> <SET FLG <>>> + <COND (<ASSIGNED? ST2> + <COND (.FLG + <EMIT <INSTRUCTION `HRRM + <ACSYM <CHTYPE <DATVAL .ST2> AC>> + (<ADDRSYM <CHTYPE <DATVAL .ST1> AC>>)>>) + (ELSE + <EMIT <INSTRUCTION `HRRM + <ACSYM <CHTYPE <DATVAL .ST2> AC>> + `@ + !<ADDR:VALUE .ST1>>>)> + <RET-TMP-AC <COND (.2RET .ST1) (ELSE .ST2)>>) + (ELSE + <COND (.FLG + <EMIT <INSTRUCTION `HLLZS (<ADDRSYM <CHTYPE <DATVAL .ST1> AC>>)>>) + (ELSE + <EMIT <INSTRUCTION `HLLZS `@ !<ADDR:VALUE .ST1>>>)>)> + <MOVE:ARG <COND (.2RET .ST2) (ELSE .ST1)> .WHERE>> + +<PUT ,GENERATORS ,PUTREST-CODE ,PUTREST-GEN> +<DEFINE FLUSH-COMMON-SYMT (SYMT) + #DECL ((SYMT) SYMTAB) + <MAPF <> + <FUNCTION (AC "AUX" ACR) + #DECL ((AC) AC) + <SET ACR + <COND (<SET ACR <ACRESIDUE .AC>> + <COND (<EQSYMT <1 .ACR> .SYMT> <REST .ACR>) + (<REPEAT ((PTR <REST .ACR>) (SACR .ACR)) + <COND (<EMPTY? .PTR> <RETURN .SACR>)> + <COND (<EQSYMT <1 .PTR> .SYMT> + <PUTREST .ACR <REST .PTR>> + <RETURN .SACR>)> + <SET PTR <REST .PTR>> + <SET ACR <REST .ACR>>>)>)>> + <PUT .AC ,ACRESIDUE <COND (<EMPTY? .ACR> <>) (ELSE .ACR)>>> + ,ALLACS>> + +<ENDPACKAGE> +<PACKAGE "CARGEN"> + +<ENTRY ARITH-GEN ABS-GEN FLOAT-GEN FIX-GEN MOD-GEN ROT-GEN LSH-GEN 1?-GEN + GEN-FLOAT GENFLOAT MIN-MAX PRED:BRANCH:GEN 0-TEST FLIP TEST-GEN> + +<USE "CACS" "CODGEN" "CHKDCL" "COMCOD" "COMPDEC" "CONFOR" "STRGEN"> + +<DEFINE TEST-GEN (NOD WHERE + "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>) + "AUX" (K <1 <KIDS .NOD>>) (K2 <2 <KIDS .NOD>>) REGT REGT2 + (S <SW? <NODE-NAME .NOD>>) TRANSFORM ATYP ATYP2 B2 + (SDIR .DIR) (RW .WHERE) TRANS1 (FLS <==? .RW FLUSHED>) + TEM (ONO .NO-KILL) (NO-KILL .ONO) + "ACT" TA) + #DECL ((NOD K K2) NODE (REGT) DATUM (TRANSFORM) <SPECIAL TRANS> + (TRANS1) TRANS (NO-KILL) <SPECIAL LIST>) + <SET WHERE + <COND (<==? .WHERE FLUSHED> FLUSHED) + (ELSE <UPDATE-WHERE .NOD .WHERE>)>> + <COND (<OR <==? <NODE-TYPE .K2> ,QUOTE-CODE> + <AND <NOT <MEMQ <NODE-TYPE .K> ,SNODES>> + <NOT <SIDE-EFFECTS .NOD>> + <MEMQ <NODE-TYPE .K2> ,SNODES>>> + <COND (<AND <==? <NODE-TYPE .K> ,LVAL-CODE> + <COND (<==? <LENGTH <SET TEM <TYPE-INFO .K>>> 2> <2 .TEM>) + (ELSE T)> + <SET TEM <NODE-NAME .K>> + <NOT <MAPF <> + <FUNCTION (LL) + <AND <==? <1 .LL> .TEM> <MAPLEAVE>>> + .NO-KILL>>> + <SET NO-KILL ((<NODE-NAME .K> <>) !.NO-KILL)>)> + <SET K .K2> + <SET K2 <1 <KIDS .NOD>>> + <PUT .NOD ,NODE-NAME <FLOP <NODE-NAME .NOD>>>)> + <SET ATYP <ISTYPE? <RESULT-TYPE .K2>>> + <SET ATYP2 <ISTYPE-GOOD? <RESULT-TYPE .K>>> + <SET REGT + <DATUM <COND (.ATYP .ATYP) (ELSE ANY-AC)> ANY-AC>> + <SET REGT2 + <COND (<OR <==? <NODE-TYPE .K> ,QUOTE-CODE> + <NOT <SIDE-EFFECTS .K2>>> + DONT-CARE) + (.ATYP2 <DATUM .ATYP2 ANY-AC>) + (ELSE <DATUM ANY-AC ANY-AC>)>> + <COND (<N==? <NODE-TYPE .K> ,QUOTE-CODE> + <COND (<OR <==? .ATYP FLOAT> <==? .ATYP2 FLOAT>>) + (ELSE + <SET TRANSFORM <MAKE-TRANS .NOD 1 1 0 1 1 <+ 2 <- .S>> .S>> + <PUT <2 .TRANSFORM> 6 1> + <PUT <2 .TRANSFORM> 7 0>)> + <SET REGT2 <GEN .K .REGT2>> + <COND (<ASSIGNED? TRANSFORM> + <SET TRANS1 .TRANSFORM> + <SET TRANSFORM <UPDATE-TRANS .NOD .TRANS1>>)> + <COND (<TYPE? <DATVAL .REGT2> AC> + <SET REGT <GEN .K2 DONT-CARE>> + <COND (<TYPE? <DATVAL .REGT2> AC> + <PUT .NOD ,NODE-NAME <FLOP <NODE-NAME .NOD>>> + <SET TEM .REGT> + <SET REGT .REGT2> + <SET REGT2 .TEM> + <COND (<ASSIGNED? TRANSFORM> + <SET TEM .TRANS1> + <SET TRANS1 .TRANSFORM> + <SET TRANSFORM .TEM>)> + <SET TEM .ATYP> + <SET ATYP .ATYP2> + <SET ATYP2 .TEM>) + (ELSE <TOACV .REGT>)>) + (ELSE <SET REGT <GEN .K2 .REGT>>)>) + (ELSE + <COND (<OR <==? .ATYP FIX> + <0? <NODE-NAME .K>> + <1? <NODE-NAME .K>>> + <SET TRANSFORM <MAKE-TRANS .NOD 1 1 0 1 1 <+ 2 <- .S>> .S>>)> + <COND (<==? .ATYP FIX> + <PUT <PUT <2 .TRANSFORM> 2 1> 3 <FIX <NODE-NAME .K>>>)> + <COND (<LN-LST .K2> <SET REGT ,NO-DATUM>) + (ELSE + <SET REGT <GEN .K2 .REGT>> + <DATTYP-FLUSH .REGT> + <PUT .REGT ,DATTYP .ATYP>)> + <RETURN + <TEST-DISP .NOD + .WHERE + .NOTF + .BRANCH + .DIR + .REGT + <COND (<ASSIGNED? TRANSFORM> + <DO-TRANS <FIX <NODE-NAME .K>> .TRANSFORM>) + (ELSE <NODE-NAME .K>)> + <AND <ASSIGNED? TRANSFORM> <NOT <0? <1 <3 .TRANSFORM>>>>>> + .TA>)> + <DELAY-KILL .NO-KILL .ONO> + <AND <ASSIGNED? TRANSFORM> + <CONFORM .REGT .REGT2 .TRANSFORM .TRANS1> + <PUT .NOD ,NODE-NAME <FLOP <NODE-NAME .NOD>>>> + <COND (.BRANCH + <AND .NOTF <SET DIR <NOT .DIR>>> + <VAR-STORE <>> + <GEN-COMP2 <NODE-NAME .NOD> + .ATYP2 + .ATYP + .REGT2 + .REGT + <COND (.FLS .DIR) (ELSE <NOT .DIR>)> + <COND (.FLS .BRANCH) (ELSE <SET B2 <MAKE:TAG>>)>> + <COND (<NOT .FLS> + <SET RW <MOVE:ARG <MOVE:ARG <REFERENCE .SDIR> .WHERE> .RW>> + <BRANCH:TAG .BRANCH> + <LABEL:TAG .B2> + .RW)>) + (ELSE + <VAR-STORE <>> + <GEN-COMP2 <NODE-NAME .NOD> + .ATYP2 + .ATYP + .REGT2 + .REGT + .NOTF + <SET BRANCH <MAKE:TAG>>> + <MOVE:ARG <REFERENCE T> .WHERE> + <RET-TMP-AC .WHERE> + <BRANCH:TAG <SET B2 <MAKE:TAG>>> + <LABEL:TAG .BRANCH> + <MOVE:ARG <REFERENCE <>> .WHERE> + <LABEL:TAG .B2> + <MOVE:ARG .WHERE .RW>)>> + +<PUT ,GENERATORS ,TEST-CODE ,TEST-GEN> +<ENDPACKAGE> \ No newline at end of file diff --git a/<mdl.comp>/undassm.crud.2 b/<mdl.comp>/undassm.crud.2 new file mode 100644 index 0000000..ad3346a --- /dev/null +++ b/<mdl.comp>/undassm.crud.2 @@ -0,0 +1,4329 @@ +<DEFINE MERGE-STATE (STATV) + #DECL ((STATV) SAVED-STATE) + <MAPF <> + <FUNCTION (STATV + "AUX" (AC <1 .STATV>) (DATS <REST .STATV 2>) + (STATAC <ACRESIDUE .AC>) (NINACS ()) (NRES ())) + #DECL ((STATV) <LIST AC ANY [REST <LIST SYMBOL ANY>]> + (AC) AC (DATS) <LIST [REST <LIST SYMBOL ANY>]> + (STATAC) <OR FALSE <LIST [REST SYMBOL]>> + (NRES) <LIST [REST SYMBOL]> + (NINACS) <LIST [REST <LIST SYMBOL ANY>]>) + <MAPF <> + <FUNCTION (ACX + "AUX" (SYMT <1 .ACX>) (INAC <2 .ACX>) (OINAC <SINACS .SYMT>) + (TEM <>) (PMERG T)) + #DECL ((ACX) <LIST SYMBOL ANY> + (SYMT) SYMBOL + (INAC OINAC) <PRIMTYPE LIST>) + <COND (<TYPE? .SYMT SYMTAB> + <COND (<STORED .SYMT> + <PUT .SYMT + ,STORED + <GET-STORED .SYMT <3 .ACX> <4 .ACX>>>)> + <COND (<AND <SS-POTENT-SLOT .ACX> <NOT <PROG-AC .SYMT>>> + <SET PMERG <>>)>)> + <COND + (<AND <MEMQ .SYMT .STATAC> + .OINAC + .INAC + .PMERG + <==? <DATVAL .INAC> <DATVAL .OINAC>> + <OR <==? <DATTYP .INAC> <DATTYP .OINAC>> + <AND <TYPE? .SYMT SYMTAB> + <SET TEM + <ISTYPE? <1 <CHTYPE <DECL-SYM .SYMT> + LIST>>>> + <OR <==? <DATTYP .INAC> .TEM> + <==? <DATTYP .OINAC> .TEM>>>>> + <SET NRES (.SYMT !.NRES)> + <SET NINACS + ((.SYMT <DATUM <OR .TEM <DATTYP .INAC>> <DATVAL .INAC>>) + !.NINACS)> + <COND (<AND .TEM + <OR <TYPE? <SET TEM <DATTYP .INAC>> AC> + <TYPE? <SET TEM <DATTYP .OINAC>> AC>>> + <FLUSH-RESIDUE .TEM .SYMT>)>)> + <COND (<AND .OINAC + <OR <==? .AC <DATTYP .OINAC>> + <==? .AC <DATVAL .OINAC>>>> + <SMASH-INACS .SYMT <> <>>)>> + .DATS> + <MAPF <> + <FUNCTION (SYMT) + #DECL ((SYMT) SYMBOL) + <SMASH-INACS .SYMT <> <>>> + <ACRESIDUE .AC>> + <PUT .AC ,ACRESIDUE <COND (<NOT <EMPTY? .NRES>> .NRES)>> + <MAPF <> + <FUNCTION (SYMB "AUX" (SYMT <1 .SYMB>) (ELEIN <2 .SYMB>)) + #DECL ((SYMT) SYMBOL) + <SMASH-INACS .SYMT .ELEIN>> + .NINACS>> + .STATV>> + + <TITLE MERGE-STATE> + + <DECLARE ("VALUE" <OR COMMON!-COMPDEC!-PACKAGE FALSE +SYMTAB!-COMPDEC!-PACKAGE TEMP!-COMPDEC!-PACKAGE> SAVED-STATE!-COMPDEC!-PACKAGE)> + <PUSH TP* (AB) > + <PUSH TP* (AB) 1> + <PUSHJ P* TAG1> + <JRST |FINIS > +TAG1 <SUBM M* (P) > ; 4 + <PUSH TP* <MQUOTE %<TYPE-W SAVED-STATE!-COMPDEC!-PACKAGE LIST>>>; [2] + <PUSH TP* [0]> ; [3] + <INTGO> + <MOVE B* (TP) -2> ; (1) + <MOVEM B* (TP) > ; (3) + <MOVE A* <TYPE-WORD FALSE>> + <MOVEI B* 0> + <MOVE D* (TP) > ; (3) + <JUMPE D* TAG2> +TAG25 <PUSH TP* [0]> ; 15 [4] + <PUSH TP* [0]> ; [5] + <MOVE PVP* (D) 1> + <PUSH TP* <MQUOTE %<TYPE-W AC!-COMPDEC!-PACKAGE VECTOR>>>; [6] + <PUSH TP* (PVP) 1> ; [7] + <HRRZ TVP* (PVP) > + <HRRZ TVP* (TVP) > + <PUSH TP* <TYPE-WORD LIST>> ; [8] + <PUSH TP* TVP> ; [9] + <MOVE SP* (TP) -2> ; (7) + <PUSH TP* (SP) 14> ; [10] + <PUSH TP* (SP) 15> ; [11] + <PUSH TP* <TYPE-WORD LIST>> ; [12] + <PUSH TP* [0]> ; [13] + <PUSH TP* <TYPE-WORD LIST>> ; [14] + <PUSH TP* [0]> ; [15] + <SKIPGE |INTFLG > + <TAG3> + <MOVE B* (TP) -6> ; (9) + <MOVEM D* (TP) -12> ; (3) + <JUMPE B* TAG4> +TAG17 <PUSH TP* <TYPE-WORD LIST>> ; 36 [16] + <PUSH TP* [0]> ; [17] + <PUSH TP* [0]> ; [18] + <PUSH TP* [0]> ; [19] + <MOVE E* (B) 1> + <PUSH TP* (E) > ; [20] + <PUSH TP* (E) 1> ; [21] + <HRRZ TVP* (E) > + <PUSH TP* (TVP) > ; [22] + <PUSH TP* (TVP) 1> ; [23] + <PUSH TP* (TP) -3> ; (20) [24] + <PUSH TP* (TP) -3> ; (21) [25] + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (TP) -21> ; (4) + <MOVEM B* (TP) -20> ; (5) + <MOVEM E* (TP) -8> ; (17) + <MCALL 1 SINACS> + <PUSH TP* A> ; [24] + <PUSH TP* B> ; [25] + <PUSH TP* <TYPE-WORD FALSE>> ; [26] + <PUSH TP* [0]> ; [27] + <PUSH TP* <MQUOTE T> -1> ; [28] + <PUSH TP* <MQUOTE T>> ; [29] + <INTGO> + <GETYP O* (TP) -9> ; (20) + <CAIE O* <MQUOTE %<TYPE-C SYMTAB!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG5> + <MOVE B* (TP) -8> ; (21) + <SKIPL (B) 27> + <JRST TAG6> + <PUSH TP* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>>; [30] + <PUSH TP* B> ; [31] + <MOVE D* (TP) -14> ; (17) + <JUMPE D* |CERR2 > + <HRRZ PVP* (D) > + <JUMPE PVP* |CERR2 > + <HRRZ PVP* (PVP) > + <JUMPE PVP* |CERR2 > + <PUSH TP* (PVP) > ; [32] + <PUSH TP* (PVP) 1> ; [33] + <MOVEI PVP* 3 > +TAG7 <JUMPE D* |CERR2 > ; 78 + <HRRZ D* (D) > + <SOJG PVP* TAG7> + <JUMPE D* |CERR2 > + <PUSH TP* (D) > ; [34] + <PUSH TP* (D) 1> ; [35] + <MOVE O* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>> + <MOVEM O* (TP) -17> ; (18) + <MOVEM B* (TP) -16> ; (19) + <MCALL 3 GET-STORED> + <MOVE D* (TP) -10> ; (19) + <MOVEM A* (D) 26> + <MOVEM B* (D) 27> +TAG6 <MOVE B* (TP) -12> ; 91 (17) + <MOVEI D* 3 > +TAG8 <JUMPE B* |CERR2 > ; 93 + <HRRZ B* (B) > + <SOJG D* TAG8> + <JUMPE B* |CERR2 > + <GETYP O* (B) 0> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE B* (B) 1> + <GETYP O* (B) 0> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG5> + <MOVE B* (TP) -8> ; (21) + <GETYP O* (B) 32> + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG5> + <MOVE B* <TYPE-WORD FALSE>> + <MOVEI D* 0> + <MOVEM B* (TP) -1> ; (28) + <MOVEM D* (TP) > ; (29) +TAG5 <MOVE B* (TP) -18> ; 111 (11) + <MOVE D* (TP) -8> ; (21) + <GETYP PVP* (TP) -9> ; (20) + <JUMPE B* TAG9> +TAG11 <GETYP O* (B) 0> ; 115 + <CAIN O* (PVP) 0> + <CAME D* (B) 1> + <SKIPA O> + <JRST TAG10> + <HRRZ B* (B) > + <JUMPN B* TAG11> + <JRST TAG9> +TAG10 <GETYP O* (TP) -5> ; 123 (24) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG9> + <GETYP O* (TP) -7> ; (22) + <CAIE O* <TYPE-CODE FALSE>> + <SKIPL (TP) > ; (29) + <JRST TAG9> + <MOVE B* (TP) -6> ; (23) + <HRRZ D* (B) > + <MOVE PVP* (D) > + <MOVE TVP* (D) 1> + <MOVE D* (TP) -4> ; (25) + <HRRZ A* (D) > + <GETYP O* (A) 0> + <GETYP C* PVP> + <CAMN TVP* (A) 1> + <CAIE O* (C) 0> + <JRST TAG9> + <MOVE E* (B) > + <MOVE C* (B) 1> + <GETYP O* (D) 0> + <GETYP A* E> + <CAMN C* (D) 1> + <CAIE O* (A) 0> + <SKIPA O> + <JRST TAG12> + <GETYP O* (TP) -9> ; (20) + <CAIE O* <MQUOTE %<TYPE-C SYMTAB!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG9> + <MOVE A* (TP) -8> ; (21) + <MOVE SP* (A) 13> + <JUMPE SP* |CERR2 > + <GETYP O* (SP) 0> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE SP* (SP) 1> + <PUSH TP* (SP) > ; [30] + <PUSH TP* (SP) 1> ; [31] + <MCALL 1 ISTYPE?> + <MOVEM A* (TP) -3> ; (26) + <MOVEM B* (TP) -2> ; (27) + <GETYP O* A> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG9> + <MOVE D* (TP) -6> ; (23) + <MOVE PVP* (D) > + <MOVE TVP* (D) 1> + <GETYP O* A> + <GETYP E* PVP> + <CAMN TVP* B> + <CAIE O* (E) 0> + <SKIPA O> + <JRST TAG12> + <MOVE C* (TP) -4> ; (25) + <MOVE E* (C) > + <MOVE SP* (C) 1> + <GETYP O* A> + <GETYP C* E> + <CAMN SP* B> + <CAIE O* (C) 0> + <JRST TAG9> +TAG12 <MOVE E* (TP) -14> ; 183 (15) + <MOVE C* (TP) -9> ; (20) + <MOVE D* (TP) -8> ; (21) + <PUSHJ P* |C1CONS > + <MOVE C* (TP) -9> ; (20) + <MOVE D* (TP) -8> ; (21) + <MOVEI E* 0> + <MOVEM B* (TP) -14> ; (15) + <PUSHJ P* |C1CONS > + <MOVEM B* (TP) -12> ; (17) + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (TP) -11> ; (18) + <MOVEM B* (TP) -10> ; (19) + <MOVE D* (TP) -3> ; (26) + <MOVE PVP* (TP) -2> ; (27) + <GETYP O* D> + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG13> + <MOVE TVP* (TP) -6> ; (23) + <MOVE D* (TVP) > + <MOVE PVP* (TVP) 1> +TAG13 <PUSH TP* D> ; 204 [30] + <PUSH TP* PVP> ; [31] + <MOVE D* (TP) -8> ; (23) + <HRRZ PVP* (D) > + <PUSH TP* (PVP) > ; [32] + <PUSH TP* (PVP) 1> ; [33] + <MCALL 2 DATUM> + <MOVE C* A> + <MOVE D* B> + <MOVEI E* 0> + <PUSHJ P* |C1CONS > + <HRRM B* @ (TP) -10> ; (19) + <MOVEM B* (TP) -10> ; (19) + <MOVE C* <TYPE-WORD LIST>> + <MOVE D* (TP) -12> ; (17) + <MOVEI E* 0> + <PUSHJ P* |C1CONS > + <MOVEM B* (TP) -12> ; (17) + <MOVE D* (TP) -16> ; (13) + <HRRM D* @ B> + <MOVE B* (TP) -12> ; (17) + <MOVEM B* (TP) -16> ; (13) + <GETYP O* (TP) -3> ; (26) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG9> + <MOVE D* (TP) -6> ; (23) + <MOVE PVP* (D) > + <MOVE TVP* (D) 1> + <MOVEM PVP* (TP) -3> ; (26) + <MOVEM TVP* (TP) -2> ; (27) + <GETYP O* PVP> + <CAIN O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG14> + <MOVE D* (TP) -4> ; (25) + <MOVE C* (D) > + <MOVE E* (D) 1> + <MOVEM C* (TP) -3> ; (26) + <MOVEM E* (TP) -2> ; (27) + <GETYP O* C> + <CAIE O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG9> +TAG14 <PUSH TP* (TP) -3> ; 245 (26) [30] + <PUSH TP* (TP) -3> ; (27) [31] + <PUSH TP* (TP) -11> ; (20) [32] + <PUSH TP* (TP) -11> ; (21) [33] + <MCALL 2 FLUSH-RESIDUE> +TAG9 <GETYP O* (TP) -5> ; 250 (24) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG15> + <MOVE B* (TP) -4> ; (25) + <MOVE D* (B) > + <MOVE PVP* (B) 1> + <GETYP O* D> + <CAMN PVP* (TP) -22> ; (7) + <CAIE O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <SKIPA O> + <JRST TAG16> + <HRRZ B* (B) > + <MOVE TVP* (B) > + <MOVE E* (B) 1> + <GETYP O* TVP> + <CAMN E* (TP) -22> ; (7) + <CAIE O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG15> +TAG16 <PUSH TP* (TP) -9> ; 268 (20) [30] + <PUSH TP* (TP) -9> ; (21) [31] + <PUSH TP* <TYPE-WORD FALSE>> ; [32] + <PUSH TP* [0]> ; [33] + <PUSH TP* <TYPE-WORD FALSE>> ; [34] + <PUSH TP* [0]> ; [35] + <MCALL 3 SMASH-INACS> +TAG15 <SUB TP* [<(14) 14>]> ; 275 + <MOVE B* (TP) -10> ; (5) + <HRRZ B* (B) > + <JUMPN B* TAG17> +TAG4 <MOVE B* (TP) -8> ; 279 (7) + <MOVE D* (B) 14> + <MOVE PVP* (B) 15> + <JUMPE PVP* TAG18> +TAG19 <MOVE TVP* (PVP) > ; 283 + <MOVE A* (PVP) 1> + <SKIPGE |INTFLG > + <SAVAC O* [<(*71500*) 4>]> + <PUSH TP* TVP> ; [16] + <PUSH TP* A> ; [17] + <PUSH TP* <TYPE-WORD FALSE>> ; [18] + <PUSH TP* [0]> ; [19] + <PUSH TP* <TYPE-WORD FALSE>> ; [20] + <PUSH TP* [0]> ; [21] + <MOVEM D* (TP) -17> ; (4) + <MOVEM PVP* (TP) -16> ; (5) + <MCALL 3 SMASH-INACS> + <MOVE D* (TP) -11> ; (4) + <MOVE PVP* (TP) -10> ; (5) + <HRRZ PVP* (PVP) > + <JUMPN PVP* TAG19> +TAG18 <MOVE B* (TP) > ; 300 (15) + <JUMPN B* TAG20> + <MOVE D* <TYPE-WORD FALSE>> + <MOVEI PVP* 0> + <JRST TAG21> +TAG20 <MOVE D* <TYPE-WORD LIST>> ; 305 + <MOVE PVP* B> +TAG21 <MOVE TVP* (TP) -8> ; 307 (7) + <MOVEM D* (TVP) 14> + <MOVEM PVP* (TVP) 15> + <MOVE C* (TP) -2> ; (13) + <MOVE A* <TYPE-WORD FALSE>> + <MOVEI B* 0> + <JUMPE C* TAG22> +TAG24 <MOVE E* (C) 1> ; 314 + <PUSH TP* (E) > ; [16] + <PUSH TP* (E) 1> ; [17] + <HRRZ E* (E) > + <GETYP O* (E) 0> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE E* (E) 1> + <PUSH TP* (E) > ; [18] + <PUSH TP* (E) 1> ; [19] + <SKIPGE |INTFLG > + <TAG23> + <PUSH TP* (TP) -3> ; (16) [20] + <PUSH TP* (TP) -3> ; (17) [21] + <PUSH TP* (TP) -3> ; (18) [22] + <PUSH TP* (TP) -3> ; (19) [23] + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (TP) -19> ; (4) + <MOVEM C* (TP) -18> ; (5) + <MCALL 2 SMASH-INACS> + <SUB TP* [<(4) 4>]> + <MOVE C* (TP) -10> ; (5) + <HRRZ C* (C) > + <JUMPN C* TAG24> +TAG22 <SUB TP* [<(12) 12>]> ; 337 + <HRRZ O* @ (TP) > ; (3) + <MOVEM O* (TP) > ; (3) + <JUMPN O* TAG25> +TAG2 <SUB TP* [<(4) 4>]> ; 341 + <JRST |MPOPJ > + <0> +TAG3 <*120012*> ; 344 + <(*121500*) 0> + <IMULI TB* (TP) -9> ; (-10) + <IMULI TB* (B) 0> + <IMULI TB* (B) 0> + <IMULI TB* (B) 32> + <IMULI TB* (B) 0> + <IMULI TB* (TP) -5> ; (-6) + <IMULI TB* (TP) -7> ; (-8) + <IMULI TB* (A) 0> + <IMULI TB* 6 > + <IMULI TB* (D) 0> + <IMULI TB* 5 > + <IMULI TB* (SP) 0> + <IMULI TB* 1 > + <IMULI TB* 4 > + <IMULI TB* (TP) -3> ; (-4) + <IMULI TB* 3 > + <IMULI TB* 7 > + <(14) 14> + <(*71500*) 4> + <IMULI TB* (E) 0> +TAG23 <(*12*) 0> ; 366 + <FSB O* O> + <(4) 4> + <(12) 12> + <(1) 4> + <(*61661*) *632265*> + <0> + <(1) 2> + + +<DEFINE RESTORE-STATE (STATV + "OPTIONAL" (NORET T) + "AUX" (MUNGED-SYMS ()) PA OACR) + #DECL ((STATV) SAVED-STATE (PA) <OR FALSE <LIST NODE>> (OACR) <OR FALSE LIST>) + <MAPF <> + <FUNCTION (ACLST + "AUX" (AC <1 .ACLST>) (SMT <2 .ACLST>) (SYMT <REST .ACLST 2>)) + #DECL ((ACLST) + <LIST AC + <OR FALSE <LIST [REST SYMBOL]>> + [REST <LIST SYMBOL ANY>]> + (SYMT) + <LIST [REST <LIST SYMBOL ANY>]> + (AC) + AC + (SMT) + <OR FALSE <LIST [REST SYMBOL]>>) + <AND .SMT <EMPTY? .SMT> <SET SMT <>>> + <MAPF <> + <FUNCTION (ST) + <OR <MEMQ .ST .MUNGED-SYMS> <SMASH-INACS .ST <> <>>>> + <ACRESIDUE .AC>> + <AND .SMT <SET SMT <LIST !.SMT>>> + <SET OACR <ACRESIDUE .AC>> + <PUT .AC ,ACRESIDUE .SMT> + <MAPF <> + <FUNCTION (SYMB "AUX" (SYMT <1 .SYMB>) (INAC <2 .SYMB>)) + #DECL ((SYMB) <LIST SYMBOL ANY> (SYMT) SYMBOL) + <COND (<TYPE? .SYMT SYMTAB> + <PUT .SYMT + ,STORED + <GET-STORED .SYMT <3 .SYMB> <4 .SYMB>>> + <COND (<SET PA <PROG-AC .SYMT>> + <AND <STORED .SYMT> + <NOT <MEMQ .SYMT <LOOP-VARS <1 .PA>>>> + <NOT .NORET> + <NOT <MEMQ .SYMT .OACR>> + <KILL-LOOP-AC .SYMT> + <FLUSH-RESIDUE .AC .SYMT> + <SET INAC <>>>) + (<4 .SYMB> + <FLUSH-RESIDUE .AC .SYMT> + <SET INAC <>>)>)> + <OR <MEMQ .SYMT .MUNGED-SYMS> + <SET MUNGED-SYMS (.SYMT !.MUNGED-SYMS)>> + <SMASH-INACS .SYMT .INAC>> + .SYMT>> + .STATV>> + + <TITLE RESTORE-STATE> + + <DECLARE ("VALUE" <OR COMMON!-COMPDEC!-PACKAGE FALSE +SYMTAB!-COMPDEC!-PACKAGE TEMP!-COMPDEC!-PACKAGE> SAVED-STATE!-COMPDEC!-PACKAGE +"OPTIONAL" ANY)> + <MOVE A* AB> +TAG1 <PUSH TP* (AB) > ; 1 + <PUSH TP* (AB) 1> + <ADD AB* [<(2) 2>]> + <JUMPL AB* TAG1> + <HLRES A> + <ASH A* -1 > + <ADDI A* TAG2> + <PUSHJ P* @ (A) 1 > + <JRST |FINIS > + <TAG3> +TAG2 <TAG4> ; 11 +TAG4 <PUSH TP* <MQUOTE T> -1> ; 12 [2] + <PUSH TP* <MQUOTE T>> ; [3] +TAG3 <SUBM M* (P) > ; 14 + <PUSH TP* [0]> ; [4] + <PUSH TP* [0]> ; [5] + <PUSH TP* <MQUOTE %<TYPE-W SAVED-STATE!-COMPDEC!-PACKAGE LIST>>>; [6] + <PUSH TP* [0]> ; [7] + <PUSH TP* <TYPE-WORD LIST>> ; [8] + <PUSH TP* [0]> ; [9] + <INTGO> + <MOVE B* (TP) -8> ; (1) + <MOVEM B* (TP) -2> ; (7) + <MOVE A* <TYPE-WORD FALSE>> + <MOVEI B* 0> + <MOVE D* (TP) -2> ; (7) + <JUMPE D* TAG5> +TAG29 <PUSH TP* [0]> ; 29 [10] + <PUSH TP* [0]> ; [11] + <MOVE PVP* (D) 1> + <PUSH TP* <MQUOTE %<TYPE-W AC!-COMPDEC!-PACKAGE VECTOR>>>; [12] + <PUSH TP* (PVP) 1> ; [13] + <HRRZ TVP* (PVP) > + <PUSH TP* (TVP) > ; [14] + <PUSH TP* (TVP) 1> ; [15] + <HRRZ TVP* (PVP) > + <HRRZ TVP* (TVP) > + <PUSH TP* <TYPE-WORD LIST>> ; [16] + <PUSH TP* TVP> ; [17] + <SKIPGE |INTFLG > + <TAG6> + <MOVEM D* (TP) -10> ; (7) + <GETYP O* (TP) -3> ; (14) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG7> + <MOVE B* (TP) -2> ; (15) + <JUMPN B* TAG7> + <MOVE C* <TYPE-WORD FALSE>> + <MOVEI E* 0> + <MOVEM C* (TP) -3> ; (14) + <MOVEM E* (TP) -2> ; (15) +TAG7 <MOVE B* (TP) -4> ; 53 (13) + <MOVE D* (B) 14> + <MOVE PVP* (B) 15> + <JUMPE PVP* TAG8> +TAG12 <MOVE A* PVP> ; 57 + <GETYP O* (PVP) 0> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE A* (A) 1> + <MOVE TVP* (A) > + <MOVE A* (A) 1> + <SKIPGE |INTFLG > + <SAVAC O* [<(*71500*) 4>]> + <MOVEM D* (TP) -7> ; (10) + <MOVEM PVP* (TP) -6> ; (11) + <MOVE C* (TP) -8> ; (9) + <GETYP E* TVP> + <JUMPE C* TAG9> +TAG11 <GETYP O* (C) 0> ; 70 + <MOVE SP* C> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE SP* (SP) 1> + <GETYP O* (SP) 0> + <CAIN O* (E) 0> + <CAME A* (SP) 1> + <SKIPA O> + <JRST TAG10> + <HRRZ C* (C) > + <JUMPN C* TAG11> +TAG9 <PUSH TP* TVP> ; 81 [18] + <PUSH TP* A> ; [19] + <PUSH TP* <TYPE-WORD FALSE>> ; [20] + <PUSH TP* [0]> ; [21] + <PUSH TP* <TYPE-WORD FALSE>> ; [22] + <PUSH TP* [0]> ; [23] + <MCALL 3 SMASH-INACS> +TAG10 <MOVE D* (TP) -7> ; 88 (10) + <MOVE PVP* (TP) -6> ; (11) + <HRRZ PVP* (PVP) > + <JUMPN PVP* TAG12> +TAG8 <GETYP O* (TP) -3> ; 92 (14) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG13> + <MOVE A* (TP) -3> ; (14) + <MOVE B* (TP) -2> ; (15) + <PUSH P* [0]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <POP P* A> + <PUSHJ P* |IILIST > + <MOVEM A* (TP) -3> ; (14) + <MOVEM B* (TP) -2> ; (15) +TAG13 <MOVE B* (TP) -4> ; 104 (13) + <MOVE D* (B) 14> + <MOVE PVP* (B) 15> + <MOVE O* (TP) -3> ; (14) + <MOVEM O* (B) 14> + <MOVE O* (TP) -2> ; (15) + <MOVEM O* (B) 15> + <MOVE TVP* (TP) > ; (17) + <MOVE A* <TYPE-WORD FALSE>> + <MOVEI B* 0> + <MOVEM D* (TP) -13> ; (4) + <MOVEM PVP* (TP) -12> ; (5) + <JUMPE TVP* TAG14> +TAG28 <PUSH TP* <TYPE-WORD LIST>> ; 117 [18] + <PUSH TP* [0]> ; [19] + <PUSH TP* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>>; [20] + <PUSH TP* [0]> ; [21] + <MOVE E* (TVP) 1> + <PUSH TP* (E) > ; [22] + <PUSH TP* (E) 1> ; [23] + <HRRZ C* (E) > + <GETYP O* (C) 0> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE C* (C) 1> + <PUSH TP* (C) > ; [24] + <PUSH TP* (C) 1> ; [25] + <SKIPGE |INTFLG > + <TAG15> + <MOVEM E* (TP) -6> ; (19) + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (TP) -15> ; (10) + <MOVEM TVP* (TP) -14> ; (11) + <GETYP O* (TP) -3> ; (22) + <CAIE O* <MQUOTE %<TYPE-C SYMTAB!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG16> + <MOVE B* (TP) -2> ; (23) + <PUSH TP* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>>; [26] + <PUSH TP* B> ; [27] + <JUMPE E* |CERR2 > + <HRRZ C* (E) > + <JUMPE C* |CERR2 > + <HRRZ C* (C) > + <JUMPE C* |CERR2 > + <PUSH TP* (C) > ; [28] + <PUSH TP* (C) 1> ; [29] + <MOVEI C* 3 > +TAG17 <JUMPE E* |CERR2 > ; 150 + <HRRZ E* (E) > + <SOJG C* TAG17> + <JUMPE E* |CERR2 > + <PUSH TP* (E) > ; [30] + <PUSH TP* (E) 1> ; [31] + <MOVEM B* (TP) -10> ; (21) + <MCALL 3 GET-STORED> + <MOVE D* (TP) -4> ; (21) + <MOVEM A* (D) 26> + <MOVEM B* (D) 27> + <MOVE D* (TP) -2> ; (23) + <MOVE PVP* (D) 32> + <MOVE TVP* (D) 33> + <GETYP O* PVP> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG18> + <JUMPGE B* TAG16> + <MOVE C* (TVP) 1> + <ADD C* [<(60) 60>]> + <JUMPGE C* |CERR2 > + <MOVE E* (C) 1> + <JUMPE E* TAG19> +TAG20 <GETYP O* (E) 0> ; 173 + <CAIN O* <MQUOTE %<TYPE-C SYMTAB!-COMPDEC!-PACKAGE VECTOR>>> + <CAME D* (E) 1> + <SKIPA O> + <JRST TAG16> + <HRRZ E* (E) > + <JUMPN E* TAG20> +TAG19 <GETYP O* (TP) -23> ; 180 (2) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG16> + <MOVE C* (TP) -20> ; (5) + <JUMPE C* TAG21> +TAG22 <GETYP O* (C) 0> ; 185 + <CAIN O* <MQUOTE %<TYPE-C SYMTAB!-COMPDEC!-PACKAGE VECTOR>>> + <CAME D* (C) 1> + <SKIPA O> + <JRST TAG16> + <HRRZ C* (C) > + <JUMPN C* TAG22> +TAG21 <PUSH TP* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>>; 192 [26 +] + <PUSH TP* D> ; [27] + <MCALL 1 KILL-LOOP-AC> + <JUMPGE B* TAG16> + <PUSH TP* <MQUOTE %<TYPE-W AC!-COMPDEC!-PACKAGE VECTOR>>>; [26] + <PUSH TP* (TP) -13> ; (13) [27] + <PUSH TP* (TP) -5> ; (22) [28] + <PUSH TP* (TP) -5> ; (23) [29] + <MCALL 2 FLUSH-RESIDUE> + <JUMPGE B* TAG16> + <JRST TAG23> +TAG18 <MOVE C* (TP) -6> ; 203 (19) + <MOVEI E* 3 > +TAG24 <JUMPE C* |CERR2 > ; 205 + <HRRZ C* (C) > + <SOJG E* TAG24> + <JUMPE C* |CERR2 > + <GETYP O* (C) 0> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE C* (C) 1> + <GETYP O* (C) 0> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG16> + <PUSH TP* <MQUOTE %<TYPE-W AC!-COMPDEC!-PACKAGE VECTOR>>>; [26] + <PUSH TP* (TP) -13> ; (13) [27] + <PUSH TP* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>>; [28] + <PUSH TP* D> ; [29] + <MCALL 2 FLUSH-RESIDUE> +TAG23 <MOVE B* <TYPE-WORD FALSE>> ; 220 + <MOVEI D* 0> + <MOVEM B* (TP) -1> ; (24) + <MOVEM D* (TP) > ; (25) +TAG16 <MOVE B* (TP) -16> ; 224 (9) + <MOVE D* (TP) -2> ; (23) + <GETYP PVP* (TP) -3> ; (22) + <JUMPE B* TAG25> +TAG27 <GETYP O* (B) 0> ; 228 + <CAIN O* (PVP) 0> + <CAME D* (B) 1> + <SKIPA O> + <JRST TAG26> + <HRRZ B* (B) > + <JUMPN B* TAG27> +TAG25 <MOVE E* (TP) -16> ; 235 (9) + <MOVE C* (TP) -3> ; (22) + <MOVE D* (TP) -2> ; (23) + <PUSHJ P* |C1CONS > + <MOVEM A* (TP) -17> ; (8) + <MOVEM B* (TP) -16> ; (9) +TAG26 <PUSH TP* (TP) -3> ; 241 (22) [26] + <PUSH TP* (TP) -3> ; (23) [27] + <PUSH TP* (TP) -3> ; (24) [28] + <PUSH TP* (TP) -3> ; (25) [29] + <MCALL 2 SMASH-INACS> + <SUB TP* [<(8) 8>]> + <MOVE TVP* (TP) -6> ; (11) + <HRRZ TVP* (TVP) > + <JUMPN TVP* TAG28> +TAG14 <SUB TP* [<(8) 8>]> ; 250 + <HRRZ O* @ (TP) -2> ; (7) + <MOVEM O* (TP) -2> ; (7) + <JUMPN O* TAG29> +TAG5 <SUB TP* [<(10) 10>]> ; 254 + <JRST |MPOPJ > + <(2) 2> + <0> +TAG6 <*120012*> ; 258 + <(*120000*) 0> + <IMULI TB* (TP) -3> ; (-4) + <IMULI TB* (PVP) 0> + <(*71500*) 4> + <IMULI TB* 7 > + <IMULI TB* (C) 0> + <IMULI TB* (SP) 0> +TAG15 <*1204*> ; 266 + <(*120000*) 0> + <IMULI TB* 6 > + <(60) 60> + <IMULI TB* (E) 0> + <IMULI TB* (TP) -23> ; (-24) + <IMULI TB* (C) 0> + <IMULI TB* (C) 0> + <IMULI TB* (B) 0> + <(8) 8> + <(10) 10> + <(2) *16*> + <(1) *14*> + <(*65523*) *200604*> + <0> + <(2) 2> + + +<DEFINE ASSERT-TYPES (L) + #DECL ((L) <LIST [REST <LIST SYMTAB ANY ANY>]>) + <MAPF <> + <FUNCTION (LL) <SET-CURRENT-TYPE <1 .LL> <2 .LL>>> + .L>> + + <TITLE ASSERT-TYPES> + + <DECLARE ("VALUE" <OR FALSE SYMTAB!-COMPDEC!-PACKAGE> <LIST [REST <LIST +SYMTAB!-COMPDEC!-PACKAGE ANY ANY>]>)> + <PUSH TP* (AB) > + <PUSH TP* (AB) 1> + <PUSHJ P* TAG1> + <JRST |FINIS > +TAG1 <SUBM M* (P) > ; 4 + <PUSH TP* <TYPE-WORD LIST>> ; [2] + <PUSH TP* [0]> ; [3] + <INTGO> + <MOVE B* (TP) -2> ; (1) + <MOVEM B* (TP) > ; (3) + <MOVE A* <TYPE-WORD FALSE>> + <MOVEI B* 0> + <MOVE D* (TP) > ; (3) + <JUMPE D* TAG2> +TAG3 <MOVE PVP* (D) 1> ; 15 + <SKIPGE |INTFLG > + <SAVAC O* [*120012*]> + <PUSH TP* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>>; [4] + <PUSH TP* (PVP) 1> ; [5] + <HRRZ PVP* (PVP) > + <GETYP O* (PVP) 0> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE PVP* (PVP) 1> + <PUSH TP* (PVP) > ; [6] + <PUSH TP* (PVP) 1> ; [7] + <MOVEM D* (TP) -4> ; (3) + <MCALL 2 SET-CURRENT-TYPE> + <HRRZ O* @ (TP) > ; (3) + <MOVEM O* (TP) > ; (3) + <JUMPN O* TAG3> +TAG2 <SUB TP* [<(4) 4>]> ; 31 + <JRST |MPOPJ > + <0> + <*120012*> + <IMULI TB* (PVP) 0> + <(4) 4> + <(1) 4> + <(*50753*) *202076*> + <0> + <(1) 2> + + +<DEFINE SAME-DECL? (D1 D2) <OR <=? .D1 .D2> <NOT <TYPE-OK? .D2 <NOTIFY .D1>>>>> + + <TITLE SAME-DECL?> + + <DECLARE ("VALUE" <OR ATOM FALSE> ANY ANY)> + <PUSH TP* (AB) > ; [0] + <PUSH TP* (AB) 1> ; [1] + <PUSH TP* (AB) 2> ; [2] + <PUSH TP* (AB) 3> ; [3] + <PUSHJ P* TAG1> + <JRST |FINIS > +TAG1 <SUBM M* (P) > ; 6 + <INTGO> + <MOVE A* (TP) -3> ; (0) + <MOVE B* (TP) -2> ; (1) + <MOVE C* (TP) -1> ; (2) + <MOVE D* (TP) > ; (3) + <PUSHJ P* |CIEQUA > + <JRST TAG2> + <JRST TAG3> +TAG2 <PUSH TP* (TP) -1> ; 16 (2) [4] + <PUSH TP* (TP) -1> ; (3) [5] + <PUSH TP* (TP) -5> ; (0) [6] + <PUSH TP* (TP) -5> ; (1) [7] + <MCALL 1 NOTIFY> + <PUSH TP* A> ; [6] + <PUSH TP* B> ; [7] + <MCALL 2 TYPE-OK?> + <GETYP O* A> + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG4> + <MOVE A* <MQUOTE T> -1> + <MOVE B* <MQUOTE T>> + <JRST TAG3> +TAG4 <MOVE A* <TYPE-WORD FALSE>> ; 30 + <MOVEI B* 0> +TAG3 <SUB TP* [<(4) 4>]> ; 32 + <JRST |MPOPJ > + <IMULI TB* 1 > + <(4) 4> + <(2) 6> + <(*66261*) *202777*> + <0> + <(1) 2> + + +<DEFINE AC? (SYMT ACS) + #DECL ((SYMT) SYMTAB (ACS) LIST) + <MAPF <> + <FUNCTION (AC) + #DECL ((AC) LIST) + <REPEAT ((PTR .AC)) + #DECL ((PTR) LIST) + <COND (<EMPTY? .PTR> <RETURN <>>)> + <COND (<==? <CSYMT-SLOT .PTR> .SYMT> + <MAPLEAVE <CINACS-SLOT .PTR>>)> + <SET PTR <REST .PTR ,LENGTH-CSTATE>>>> + .ACS>> + + <TITLE AC?> + + <DECLARE ("VALUE" ANY SYMTAB!-COMPDEC!-PACKAGE LIST)> + <PUSH TP* (AB) > + <PUSH TP* (AB) 1> + <PUSH TP* (AB) 2> + <PUSH TP* (AB) 3> + <PUSHJ P* TAG1> + <JRST |FINIS > +TAG1 <SUBM M* (P) > ; 6 + <PUSH TP* <TYPE-WORD LIST>> ; [4] + <PUSH TP* [0]> ; [5] + <INTGO> + <MOVE B* (TP) -2> ; (3) + <MOVEM B* (TP) > ; (5) + <MOVE A* <TYPE-WORD FALSE>> + <MOVEI B* 0> + <MOVE D* (TP) > ; (5) + <JUMPE D* TAG2> +TAG8 <MOVE PVP* (D) 1> ; 17 + <SKIPGE |INTFLG > + <SAVAC O* [*120012*]> + <PUSH TP* <TYPE-WORD LIST>> ; [6] + <PUSH TP* [0]> ; [7] + <MOVEM D* (TP) -2> ; (5) +TAG7 <SKIPGE |INTFLG > ; 23 + <SAVAC O* [*120012*]> + <JUMPN PVP* TAG3> + <MOVEI B* 0> + <SUB TP* [<(2) 2>]> + <JRST TAG4> +TAG3 <MOVEM PVP* (TP) > ; 29 (7) + <GETYP O* (PVP) 0> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE PVP* (PVP) 1> + <MOVE B* (PVP) > + <MOVE TVP* (PVP) 1> + <GETYP O* B> + <CAMN TVP* (TP) -6> ; (1) + <CAIE O* <MQUOTE %<TYPE-C SYMTAB!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG5> + <MOVE E* (TP) > ; (7) + <JUMPE E* |CERR2 > + <HRRZ E* (E) > + <JUMPE E* |CERR2 > + <GETYP O* (E) 0> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE E* (E) 1> + <MOVE A* (E) > + <MOVE B* (E) 1> + <SUB TP* [<(2) 2>]> + <JRST TAG2> +TAG5 <MOVE E* (TP) > ; 50 (7) + <MOVEI C* 4 > +TAG6 <JUMPE E* |CERR2 > ; 52 + <HRRZ E* (E) > + <SOJG C* TAG6> + <MOVE PVP* E> + <JRST TAG7> +TAG4 <MOVE A* <TYPE-WORD FALSE>> ; 57 + <HRRZ O* @ (TP) > ; (5) + <MOVEM O* (TP) > ; (5) + <JUMPN O* TAG8> +TAG2 <SUB TP* [<(6) 6>]> ; 61 + <JRST |MPOPJ > + <0> + <*120012*> + <(2) 2> + <IMULI TB* (PVP) 0> + <IMULI TB* 2 > + <IMULI TB* (E) 0> + <(6) 6> + <(2) 6> + <(*50507*) *650000*> + <0> + <(1) 2> + + +<DEFINE FIXUP-STORES (STATE) + #DECL ((STATE) <LIST [REST REP-STATE <PRIMTYPE LIST> LIST <OR ATOM FALSE>]>) + <REPEAT ((PTR .STATE)) + <COND (<EMPTY? .PTR> <RETURN>)> + <MAPR <> + <FUNCTION (STATE-ITEMS "AUX" SYMT PAC (STATE-ITEM <1 .STATE-ITEMS>)) + <REPEAT () + <COND (<EMPTY? .STATE-ITEM> <RETURN>)> + <SET SYMT <CSYMT-SLOT .STATE-ITEM>> + <COND (<OR <CPOTLV-SLOT .STATE-ITEM> + <N==? <CSTORED-SLOT .STATE-ITEM> T>> + <COND (<OR <AND <N==? <CSTORED-SLOT .STATE-ITEM> T> + <MEMQ <CSTORED-SLOT .STATE-ITEM> .KILL-LIST>> + <AND <CPOTLV-SLOT .STATE-ITEM> + <CSTORED-SLOT .STATE-ITEM> + <SET PAC <PROG-AC .SYMT>> + <MEMQ .SYMT <LOOP-VARS <PROG-SLOT .PAC>>> + <NOT <STORED-SLOT .PAC>>>> + <PUT .STATE-ITEM ,CSTORED-SLOT <>>)>)> + <COND (<AND <CPOTLV-SLOT .STATE-ITEM> + <OR <NOT <SET PAC <PROG-AC .SYMT>>> + <NOT <MEMQ .SYMT <LOOP-VARS <PROG-SLOT .PAC>>>>>> + <SET STATE-ITEM <REST .STATE-ITEM ,LENGTH-CSTATE>>) + (<RETURN>)>> + <COND + (<NOT <EMPTY? .STATE-ITEM>> + <REPEAT ((START-STATE .STATE-ITEM) + (STATE-ITEM <REST .STATE-ITEM ,LENGTH-CSTATE>)) + <COND (<EMPTY? .STATE-ITEM> <RETURN>)> + <SET SYMT <CSYMT-SLOT .STATE-ITEM>> + <COND + (<OR <CPOTLV-SLOT .STATE-ITEM> + <N==? <CSTORED-SLOT .STATE-ITEM> T>> + <COND (<OR <AND <N==? <CSTORED-SLOT .STATE-ITEM> T> + <MEMQ <CSTORED-SLOT .STATE-ITEM> .KILL-LIST>> + <AND <CPOTLV-SLOT .STATE-ITEM> + <CSTORED-SLOT .STATE-ITEM> + <SET PAC <PROG-AC .SYMT>> + <MEMQ .SYMT <LOOP-VARS <PROG-SLOT .PAC>>> + <NOT <STORED-SLOT .PAC>>>> + <PUT .STATE-ITEM ,CSTORED-SLOT <>>)>)> + <COND (<AND <CPOTLV-SLOT .STATE-ITEM> + <OR <NOT <SET PAC <PROG-AC .SYMT>>> + <NOT <MEMQ .SYMT <LOOP-VARS <PROG-SLOT .PAC>>>>>> + <PUTREST .START-STATE <REST .STATE-ITEM ,LENGTH-CSTATE>>)> + <SET STATE-ITEM <REST .STATE-ITEM ,LENGTH-CSTATE>> + <SET START-STATE <REST .START-STATE ,LENGTH-CSTATE>>>)> + <PUT .STATE-ITEMS 1 .STATE-ITEM>> + <SAVED-AC-STATE .PTR>> + <SET PTR <REST .PTR ,LENGTH-CONTROL-STATE>>>> + + <TITLE FIXUP-STORES> + + <DECLARE ("VALUE" ATOM <LIST [REST REP-STATE!-COMPDEC!-PACKAGE <PRIMTYPE +LIST> LIST <OR ATOM FALSE>]>)> + <PUSH TP* (AB) > + <PUSH TP* (AB) 1> + <PUSHJ P* TAG1> + <JRST |FINIS > +TAG1 <SUBM M* (P) > ; 4 + <INTGO> + <PUSH TP* <TYPE-WORD LIST>> ; [2] + <PUSH TP* (TP) -1> ; (1) [3] +TAG31 <INTGO> ; 9 + <MOVE B* (TP) > ; (3) + <JUMPN B* TAG2> + <MOVE B* <MQUOTE T>> + <SUB TP* [<(2) 2>]> + <JRST TAG3> +TAG2 <PUSH TP* <TYPE-WORD FALSE>> ; 16 [4] + <PUSH TP* [0]> ; [5] + <GETYP O* (B) 0> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE B* (B) 1> + <PUSH TP* (B) > ; [6] + <PUSH TP* (B) 1> ; [7] + <PUSH P* [-1]> +TAG29 <MOVEI O* 6 > ; 24 + <PUSHJ P* |NTPALO > + <MOVE A* (TP) -7> ; (6) + <MOVE B* (TP) -6> ; (7) + <PUSHJ P* |TYPSEG > + <SKIPL (P) > + <XCT (C) |INCR1 > + <XCT (C) |TESTR > + <JRST TAG4> + <MOVE A* |DSTORE > + <MOVE B* D> + <MOVE O* |DSTORE > + <MOVEM O* (TP) -7> ; (6) + <MOVEM D* (TP) -6> ; (7) + <SETZM |DSTORE > + <MOVEI C* 1 > + <MOVEM A* (TP) -5> ; (8) + <MOVEM B* (TP) -4> ; (9) + <PUSHJ P* |CINTH > + <PUSH TP* A> ; [14] + <PUSH TP* B> ; [15] + <INTGO> + <PUSH TP* [0]> ; [16] + <PUSH TP* [0]> ; [17] +TAG16 <INTGO> ; 49 + <MOVE A* (TP) -5> ; (12) + <MOVE B* (TP) -4> ; (13) + <PUSHJ P* |CEMPTY > + <JRST TAG5> +TAG13 <SUB TP* [<(2) 2>]> ; 55 + <JRST TAG6> +TAG5 <MOVE A* (TP) -5> ; 57 (12) + <MOVE B* (TP) -4> ; (13) + <MOVEI C* 1 > + <PUSHJ P* |CINTH > + <MOVEM A* (TP) -7> ; (10) + <MOVEM B* (TP) -6> ; (11) + <MOVE A* (TP) -5> ; (12) + <MOVE B* (TP) -4> ; (13) + <MOVEI C* 4 > + <PUSHJ P* |CINTH > + <GETYP O* A> + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG7> + <MOVE A* (TP) -5> ; (12) + <MOVE B* (TP) -4> ; (13) + <MOVEI C* 3 > + <PUSHJ P* |CINTH > + <GETYP O* A> + <CAMN B* <MQUOTE T>> + <CAIE O* <TYPE-CODE ATOM>> + <SKIPA O> + <JRST TAG8> +TAG7 <MOVE A* (TP) -5> ; 79 (12) + <MOVE B* (TP) -4> ; (13) + <MOVEI C* 3 > + <PUSHJ P* |CINTH > + <GETYP O* A> + <CAMN B* <MQUOTE T>> + <CAIE O* <TYPE-CODE ATOM>> + <SKIPA O> + <JRST TAG9> + <MOVE A* (TP) -5> ; (12) + <MOVE B* (TP) -4> ; (13) + <MOVEI C* 3 > + <PUSHJ P* |CINTH > + <MOVEM A* (TP) -1> ; (16) + <MOVEM B* (TP) > ; (17) + <MOVE B* <MQUOTE KILL-LIST!-CACS!-PACKAGE>> + <PUSHJ P* |CILVAL > + <MOVE C* A> + <MOVE D* B> + <MOVE A* (TP) -1> ; (16) + <MOVE B* (TP) > ; (17) + <PUSHJ P* |CIMEMQ > + <SKIPA O> + <JRST TAG10> +TAG9 <MOVE A* (TP) -5> ; 103 (12) + <MOVE B* (TP) -4> ; (13) + <MOVEI C* 4 > + <PUSHJ P* |CINTH > + <GETYP O* A> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG8> + <MOVE A* (TP) -5> ; (12) + <MOVE B* (TP) -4> ; (13) + <MOVEI C* 3 > + <PUSHJ P* |CINTH > + <GETYP O* A> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG8> + <MOVE B* (TP) -6> ; (11) + <MOVE D* (B) 32> + <MOVE PVP* (B) 33> + <MOVEM D* (TP) -5> ; (12) + <MOVEM PVP* (TP) -4> ; (13) + <GETYP O* D> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG8> + <MOVE A* D> + <MOVE B* PVP> + <MOVEI C* 1 > + <PUSHJ P* |CINTH > + <ADD B* [<(60) 60>]> + <JUMPGE B* |CERR2 > + <MOVE D* (B) 1> + <MOVE B* (TP) -6> ; (11) + <GETYP PVP* (TP) -7> ; (10) + <JUMPE D* TAG8> +TAG12 <GETYP O* (D) 0> ; 135 + <MOVE TVP* D> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE TVP* (TVP) 1> + <GETYP O* (TVP) 0> + <CAIN O* (PVP) 0> + <CAME B* (TVP) 1> + <SKIPA O> + <JRST TAG11> + <HRRZ D* (D) > + <JUMPN D* TAG12> + <JRST TAG8> +TAG11 <MOVE A* (TP) -5> ; 147 (12) + <MOVE B* (TP) -4> ; (13) + <MOVEI C* 3 > + <PUSHJ P* |CINTH > + <GETYP O* A> + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG8> +TAG10 <MOVE A* (TP) -5> ; 154 (12) + <MOVE B* (TP) -4> ; (13) + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 3 > + <PUSH TP* <TYPE-WORD FALSE>> ; [18] + <PUSH TP* [0]> ; [19] + <PUSHJ P* |CIPUT > +TAG8 <MOVE A* (TP) -5> ; 161 (12) + <MOVE B* (TP) -4> ; (13) + <MOVEI C* 4 > + <PUSHJ P* |CINTH > + <GETYP O* A> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG13> + <MOVE B* (TP) -6> ; (11) + <MOVE D* (B) 32> + <MOVE PVP* (B) 33> + <MOVEM D* (TP) -5> ; (12) + <MOVEM PVP* (TP) -4> ; (13) + <GETYP O* D> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG14> + <MOVE A* D> + <MOVE B* PVP> + <MOVEI C* 1 > + <PUSHJ P* |CINTH > + <ADD B* [<(60) 60>]> + <JUMPGE B* |CERR2 > + <MOVE D* (B) 1> + <MOVE B* (TP) -6> ; (11) + <GETYP PVP* (TP) -7> ; (10) + <JUMPE D* TAG14> +TAG15 <GETYP O* (D) 0> ; 186 + <MOVE TVP* D> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE TVP* (TVP) 1> + <GETYP O* (TVP) 0> + <CAIN O* (PVP) 0> + <CAME B* (TVP) 1> + <SKIPA O> + <JRST TAG13> + <HRRZ D* (D) > + <JUMPN D* TAG15> +TAG14 <MOVE A* (TP) -5> ; 197 (12) + <MOVE B* (TP) -4> ; (13) + <MOVEI C* 4 > + <PUSHJ P* |CIREST > + <MOVEM A* (TP) -5> ; (12) + <MOVEM B* (TP) -4> ; (13) + <JRST TAG16> +TAG6 <MOVE A* (TP) -3> ; 204 (12) + <MOVE B* (TP) -2> ; (13) + <PUSHJ P* |CEMPTY > + <SKIPA O> + <JRST TAG17> + <PUSH TP* [0]> ; [16] + <PUSH TP* [0]> ; [17] + <PUSH TP* (TP) -5> ; (12) [18] + <PUSH TP* (TP) -5> ; (13) [19] + <MOVE A* (TP) -7> ; (12) + <MOVE B* (TP) -6> ; (13) + <MOVEI C* 4 > + <PUSHJ P* |CIREST > + <PUSH TP* A> ; [20] + <PUSH TP* B> ; [21] +TAG28 <INTGO> ; 219 + <MOVE A* (TP) -3> ; (18) + <MOVE B* (TP) -2> ; (19) + <PUSHJ P* |CEMPTY > + <JRST TAG18> + <SUB TP* [<(6) 6>]> + <JRST TAG17> +TAG18 <MOVE A* (TP) -3> ; 227 (18) + <MOVE B* (TP) -2> ; (19) + <MOVEI C* 1 > + <PUSHJ P* |CINTH > + <MOVEM A* (TP) -11> ; (10) + <MOVEM B* (TP) -10> ; (11) + <MOVE A* (TP) -3> ; (18) + <MOVE B* (TP) -2> ; (19) + <MOVEI C* 4 > + <PUSHJ P* |CINTH > + <GETYP O* A> + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG19> + <MOVE A* (TP) -3> ; (18) + <MOVE B* (TP) -2> ; (19) + <MOVEI C* 3 > + <PUSHJ P* |CINTH > + <GETYP O* A> + <CAMN B* <MQUOTE T>> + <CAIE O* <TYPE-CODE ATOM>> + <SKIPA O> + <JRST TAG20> +TAG19 <MOVE A* (TP) -3> ; 249 (18) + <MOVE B* (TP) -2> ; (19) + <MOVEI C* 3 > + <PUSHJ P* |CINTH > + <GETYP O* A> + <CAMN B* <MQUOTE T>> + <CAIE O* <TYPE-CODE ATOM>> + <SKIPA O> + <JRST TAG21> + <MOVE A* (TP) -3> ; (18) + <MOVE B* (TP) -2> ; (19) + <MOVEI C* 3 > + <PUSHJ P* |CINTH > + <MOVEM A* (TP) -5> ; (16) + <MOVEM B* (TP) -4> ; (17) + <MOVE B* <MQUOTE KILL-LIST!-CACS!-PACKAGE>> + <PUSHJ P* |CILVAL > + <MOVE C* A> + <MOVE D* B> + <MOVE A* (TP) -5> ; (16) + <MOVE B* (TP) -4> ; (17) + <PUSHJ P* |CIMEMQ > + <SKIPA O> + <JRST TAG22> +TAG21 <MOVE A* (TP) -3> ; 273 (18) + <MOVE B* (TP) -2> ; (19) + <MOVEI C* 4 > + <PUSHJ P* |CINTH > + <GETYP O* A> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG20> + <MOVE A* (TP) -3> ; (18) + <MOVE B* (TP) -2> ; (19) + <MOVEI C* 3 > + <PUSHJ P* |CINTH > + <GETYP O* A> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG20> + <MOVE B* (TP) -10> ; (11) + <MOVE D* (B) 32> + <MOVE PVP* (B) 33> + <MOVEM D* (TP) -9> ; (12) + <MOVEM PVP* (TP) -8> ; (13) + <GETYP O* D> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG20> + <MOVE A* D> + <MOVE B* PVP> + <MOVEI C* 1 > + <PUSHJ P* |CINTH > + <ADD B* [<(60) 60>]> + <JUMPGE B* |CERR2 > + <MOVE D* (B) 1> + <MOVE B* (TP) -10> ; (11) + <GETYP PVP* (TP) -11> ; (10) + <JUMPE D* TAG20> +TAG24 <GETYP O* (D) 0> ; 305 + <MOVE TVP* D> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE TVP* (TVP) 1> + <GETYP O* (TVP) 0> + <CAIN O* (PVP) 0> + <CAME B* (TVP) 1> + <SKIPA O> + <JRST TAG23> + <HRRZ D* (D) > + <JUMPN D* TAG24> + <JRST TAG20> +TAG23 <MOVE A* (TP) -9> ; 317 (12) + <MOVE B* (TP) -8> ; (13) + <MOVEI C* 3 > + <PUSHJ P* |CINTH > + <GETYP O* A> + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG20> +TAG22 <MOVE A* (TP) -3> ; 324 (18) + <MOVE B* (TP) -2> ; (19) + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 3 > + <PUSH TP* <TYPE-WORD FALSE>> ; [22] + <PUSH TP* [0]> ; [23] + <PUSHJ P* |CIPUT > +TAG20 <MOVE A* (TP) -3> ; 331 (18) + <MOVE B* (TP) -2> ; (19) + <MOVEI C* 4 > + <PUSHJ P* |CINTH > + <GETYP O* A> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG25> + <MOVE B* (TP) -10> ; (11) + <MOVE D* (B) 32> + <MOVE PVP* (B) 33> + <MOVEM D* (TP) -9> ; (12) + <MOVEM PVP* (TP) -8> ; (13) + <GETYP O* D> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG26> + <MOVE A* D> + <MOVE B* PVP> + <MOVEI C* 1 > + <PUSHJ P* |CINTH > + <ADD B* [<(60) 60>]> + <JUMPGE B* |CERR2 > + <MOVE D* (B) 1> + <MOVE B* (TP) -10> ; (11) + <GETYP PVP* (TP) -11> ; (10) + <JUMPE D* TAG26> +TAG27 <GETYP O* (D) 0> ; 356 + <MOVE TVP* D> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE TVP* (TVP) 1> + <GETYP O* (TVP) 0> + <CAIN O* (PVP) 0> + <CAME B* (TVP) 1> + <SKIPA O> + <JRST TAG25> + <HRRZ D* (D) > + <JUMPN D* TAG27> +TAG26 <MOVE A* (TP) -3> ; 367 (18) + <MOVE B* (TP) -2> ; (19) + <MOVEI C* 4 > + <PUSHJ P* |CIREST > + <SKIPN (TP) -4> ; (17) + <JRST |CERR2 > + <HRRM B* @ (TP) -4> ; (17) +TAG25 <MOVE A* (TP) -3> ; 374 (18) + <MOVE B* (TP) -2> ; (19) + <MOVEI C* 4 > + <PUSHJ P* |CIREST > + <MOVEM A* (TP) -3> ; (18) + <MOVEM B* (TP) -2> ; (19) + <MOVE A* (TP) -5> ; (16) + <MOVE B* (TP) -4> ; (17) + <MOVEI C* 4 > + <PUSHJ P* |CIREST > + <MOVEM A* (TP) -5> ; (16) + <MOVEM B* (TP) -4> ; (17) + <JRST TAG28> +TAG17 <MOVE A* (TP) -7> ; 387 (8) + <MOVE B* (TP) -6> ; (9) + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 1 > + <PUSH TP* (TP) -3> ; (12) [16] + <PUSH TP* (TP) -3> ; (13) [17] + <PUSHJ P* |CIPUT > + <SUB TP* [<(8) 8>]> + <SETZM (P) > + <JRST TAG29> +TAG4 <SUB TP* [<(6) 6>]> ; 397 + <SETZM |DSTORE > + <SUB TP* [<(4) 4>]> + <SUB P* [<(1) 1>]> + <MOVE B* (TP) > ; (3) + <MOVEI D* 4 > +TAG30 <JUMPE B* |CERR2 > ; 403 + <HRRZ B* (B) > + <SOJG D* TAG30> + <MOVEM B* (TP) > ; (3) + <JRST TAG31> +TAG3 <SUB TP* [<(2) 2>]> ; 408 + <MOVE A* <TYPE-WORD ATOM>> + <JRST |MPOPJ > + <(2) 2> + <0> + <IMULI TB* (B) 0> + <-1> + <IMULI TB* 1 > + <IMULI TB* 4 > + <(60) 60> + <IMULI TB* (TP) -7> ; (-8) + <IMULI TB* (D) 0> + <IMULI TB* (TVP) 0> + <(6) 6> + <IMULI TB* (TP) -11> ; (-12) + <(8) 8> + <(4) 4> + <(1) 1> + <(1) 4> + <(*54454*) *24755*> + <0> + <(1) 2> + +<DEFINE HMAPFR (MNOD WHERE K + "AUX" XX (NTSLOTS .NTSLOTS) + (NTMPS + <COND (.PRE .TMPS) (<STACK:L .STK .BSTB>) (ELSE (0))>) + TEM NSLOTS (SPECD <>) STB (DTEM <DATUM FIX ANY-AC>) + (STKOFFS <>) (FAP <1 .K>) (INRAP <2 .K>) F? (POFF 0) + (ANY? <>) (NARG <LENGTH <SET K <REST .K 2>>>) START:TAG + (R? <==? <NODE-SUBR .MNOD> ,MAPR>) STRV (FF? <>) + (MAPEND <ILIST .NARG '<MAKE:TAG "MAP">>) (OSTK .STK) + (MAPLP <MAKE:TAG "MAP">) (MAPL2 <MAKE:TAG "MAP">) MAP:OFF + (SUBRC <AP? .FAP>) STOP (STK (0 !.STK)) (TMPS .TMPS) BTP + (BASEF .BASEF) (FRMS .FRMS) (MAYBE-FALSE <>) (OPRE .PRE) + (OTAG ()) DEST CD (AC-HACK .AC-HACK) + (EXIT <MAKE:TAG "MAPEX">) (APPLTAG <MAKE:TAG "MAPAP">) TT + GMF (OUTD .WHERE) OUTSAV CHF (FLS <==? .WHERE FLUSHED>) + (RTAG <MAKE:TAG "MAP">) (NEED-INT T) FSYM OS NS (DOIT T) + RV GSTK) + #DECL ((NTSLOTS) <SPECIAL LIST> (DTEM) DATUM + (SPECD) <SPECIAL <OR FALSE ATOM>> (TEM) <OR ATOM DATUM> (OFFS) FIX + (TMPS) <SPECIAL LIST> (POFF NSLOTS NARG) <SPECIAL FIX> (FAP) NODE + (BASEF MNOD INRAP) <SPECIAL NODE> (K) <LIST [REST NODE]> + (MAPEND) <LIST [REST ATOM]> (MAP:OFF) ATOM + (EXIT MAPLP RTAG APPLTAG) <SPECIAL ATOM> (OSTK) LIST + (DEST CD) <SPECIAL <OR ATOM DATUM>> (FRMS) <SPECIAL LIST> + (STOP STRV STB BTP STK GSTK) <SPECIAL LIST> + (AC-HACK START:TAG) <SPECIAL ANY> + (GMF MAYBE-FALSE ANY?) <SPECIAL ANY> (FSYM) SYMTAB) + <PUT .INRAP ,SPECS-START <- <SPECS-START .INRAP> .TOT-SPEC>> + <PROG ((PRE .PRE)) + #DECL ((PRE) <SPECIAL ANY>) + <COND (<AND <NOT <EMPTY? .K>> + <MAPF <> + <FUNCTION (Z) + <AND <TYPE-OK? <RESULT-TYPE .Z> + '<PRIMTYPE LIST>> + <MAPLEAVE <>>> + T> + .K>> + <SET NEED-INT <>>)> + <COND (<AND <NOT <AND <EMPTY? .K> <NODE-NAME .FAP>>> + <OR <==? <NODE-NAME .FAP> <>> + <AND <==? <NODE-TYPE .FAP> ,MFIRST-CODE> + <N==? <NODE-SUBR .FAP> 5>> + .SUBRC> + <OR <EMPTY? .K> + <==? <NAME-SYM <1 <BINDING-STRUCTURE .INRAP>>> + DUMMY-MAPF>>> + <SET GMF T>) + (ELSE <SET GMF <>>)> + <COND (<AND <NOT <EMPTY? .K>> + <L=? <MAPF ,MIN + <FUNCTION (N) + #DECL ((N) NODE) + <MINL <RESULT-TYPE .N>>> + .K> + 0>> + <SET CHF T>) + (ELSE <SET CHF <>>)> + <SET DEST <SET OUTD <COND (.FLS FLUSHED) (ELSE <GOODACS .MNOD .WHERE>)>>> + <OR .PRE <EMIT-PRE <NOT <OR <ACTIVATED .INRAP> <0? <SSLOTS .BASEF>>>>>> + <SET STOP .STK> + <SET STK (0 !.STK)> + <SET F? + <DO-FIRST-SETUP + .FAP + .DEST + <COND (.GMF + <SET FSYM <1 <BINDING-STRUCTURE .INRAP>>> + <PUT .INRAP ,BINDING-STRUCTURE <REST <BINDING-STRUCTURE .INRAP>>> + .FSYM)> + .CHF + <1? .NARG> + .FLS>> + <OR .F? <SET FF? <==? <NODE-TYPE .FAP> ,MFIRST-CODE>>> + <SET ANY? <PUSH-STRUCS .K T .GMF <BINDING-STRUCTURE .INRAP>>> + <DO-FIRST-SETUP-2 .FAP .DEST <COND (.GMF .FSYM)> .CHF <1? .NARG> .FLS> + <AND .GMF <NOT .FLS> <INACS .FSYM> <SET OUTD <INACS .FSYM>>> + <BEGIN-FRAME <TMPLS .INRAP> <ACTIVATED .INRAP> <PRE-ALLOC .INRAP>> + <SET TMPS <COND (.PRE .NTMPS) (ELSE <STACK:L .STK <2 .FRMS>>)>> + <SET STK (0 !.STK)> + <SET STB .STK> + <SET STK (0 !.STK)> + <COND (.F? <SET MAYBE-FALSE <DO-FINAL-SETUP .FAP .SUBRC>>)> + <PROG-START-AC .INRAP> + <LABEL:TAG .MAPLP> + <COND (<AND .F? <NOT .GMF>> + <SET STKOFFS + <FIND-FIRST-STRUC + .DTEM .STB <AND <NOT .PRE> <NOT <ACTIVATED .INRAP>>>>>)> + <AND <ACTIVATED .INRAP> <ACT:INITIAL> <ADD:STACK 2>> + <SET STK (0 !.STK)> + <SET STRV .STK> + <OR .PRE + <AND .GMF <1? .NARG>> + <PROG () + <SALLOC:SLOTS <TMPLS .INRAP>> + <ADD:STACK <TMPLS .INRAP>> + <COND (<NOT .PRE> + <SET NTSLOTS (<FORM GVAL <TMPLS .INRAP>> !.NTSLOTS)>)> + <COND (.GMF <SET GSTK .STK> <SET STK (0 !.STK)>)>>> + <AND .PRE .GMF <NOT <1? .NARG>> <SET GSTK .STK> <SET STK (0 !.STK)>> + <SET POFF <COND (.MAYBE-FALSE -2) (.F? -1) (ELSE 0)>> + <COND (<AND .GMF <OR .CHF <NOT <1? .NARG>>> <NOT .FLS>> <LVAL-UP .FSYM>)> + <REPEAT ((KK .K) (BS <BINDING-STRUCTURE .INRAP>) + (BST + <COND + (<EMPTY? .BS> ()) + (ELSE + <MAPR <> + <FUNCTION (S) + #DECL ((S) <LIST SYMTAB>) + <COND (<N==? <NAME-SYM <1 .S>> DUMMY-MAPF> + <MAPLEAVE .S>) + (ELSE ())>> + .BS>)>) (OFFSET (<- 1 <* .NARG 2>> ())) TEM + (TOFF (0 ())) (GOFF '(0))) + #DECL ((BST) <LIST [REST SYMTAB]> (TOFF OFFSET) <LIST FIX LIST> + (KK) <LIST [REST NODE]>) + <COND + (<EMPTY? .KK> + <AND .GMF <NOT <1? .NARG>> <NOT .FF?> <NOT .FLS> <RET-TMP-AC .OUTD>> + <COND (<AND .F? <NOT .STKOFFS>> <RET-TMP-AC .DTEM>)> + <MAPF <> + <FUNCTION (SYM) + #DECL ((SYM) SYMTAB) + <APPLY <NTH ,MBINDERS <CODE-SYM .SYM>> .SYM>> + .BST> + <RETURN>) + (ELSE + <SET RV <TYPE? <ADDR-SYM <1 .BST>> TEMPV>> + <COND (.GMF) + (.F? + <COND (.STKOFFS + <SET TEM + <ADDRESS:C .STKOFFS + <COND (.AC-HACK `(FRM) ) (`(TB) )> + <COND (.AC-HACK 1) (ELSE 0)>>> + <OR .RV <SET STKOFFS <+ .STKOFFS 2>>>) + (ELSE + <SET TEM + <SPEC-OFFPTR <1 .OFFSET> + .DTEM + VECTOR + (!<2 .OFFSET> + !<STACK:L .STK .STRV>)>> + <OR .RV + <SET OFFSET + <STFIXIT .OFFSET + (2 + <- <1 .TOFF>> + <FORM - 0 !<2 .TOFF>>)>>>)>) + (ELSE + <SET TEM + <ADDRESS:C <FORM - <1 .OFFSET> !<STACK:L .STK .STRV>> + '`(TP) + !<2 .OFFSET>>> + <SET OFFSET <STFIXIT .OFFSET (2)>>)> + <AND <==? <CODE-SYM <1 .BST>> 4> + <MESSAGE ERROR "NOT IMPLEMENTED MAPF/R TUPLES ">> + <SET OTAG + ((<1 .MAPEND> + <COND (.GMF (<FORM + !.GOFF>)) + ((<FORM - 0 <1 .TOFF> !<2 .TOFF>> + <1 <SET TOFF <STFIXIT (0 ()) <STACK:L .STK .STRV>>>> + !<2 .TOFF>))>) + !.OTAG)> + <COND (.GMF + <ISET <RESULT-TYPE <1 .KK>> + <1 .BS> + <1 .BST> + .R? + <1 .MAPEND> + .CHF + .NARG + .MAPL2> + <SET BS <REST .BS>> + <SET GOFF <STACK:L .STK .GSTK>>) + (.RV + <RETURN-UP .INRAP .STK> + <IISET <RESULT-TYPE <1 .KK>> + <1 .BST> + <STACKM <1 .KK> <DATUM .TEM .TEM> .R? <1 .MAPEND> .POFF> + .R?>) + (ELSE + <BINDUP <1 .BST> + <STACKM <1 .KK> + <DATUM .TEM .TEM> + .R? + <1 .MAPEND> + .POFF>>)> + <SET MAPEND <REST .MAPEND>> + <SET KK <REST .KK>> + <SET BST <REST .BST>>)>> + <COND + (<AND .GMF <OR .CHF <NOT <1? .NARG>>> <NOT .FLS> <NOT .FF?>> + <PROG ((S .FSYM)) + <PUT .S ,STORED T> + <COND (<INACS .S> + <COND (<TYPE? <DATTYP <INACS .S>> AC> + <FLUSH-RESIDUE <DATTYP <INACS .S>> .S>)> + <COND (<TYPE? <DATVAL <INACS .S>> AC> + <FLUSH-RESIDUE <DATVAL <INACS .S>> .S>)> + <PUT .S ,INACS <>>)>>)> + <COND (<AND .GMF <NOT .CHF> <1? .NARG> <NOT .FLS>> <LVAL-UP .FSYM>)> + <OR .PRE + <0? <SET NSLOTS <SSLOTS .INRAP>>> + <PROG () + <SALLOC:SLOTS .NSLOTS> + <ADD:STACK .NSLOTS> + <EMIT-PRE <SET PRE T>>>> + <AND <ACTIVATED .INRAP> <ACT:FINAL>> + <SET BTP .STK> + <OR .OPRE <SET BASEF .INRAP>> + <SET STK (0 !.STK)> + <AND .NEED-INT <CALL-INTERRUPT>> + <COND + (<AND .R? + <NOT .F?> + <NOT .FF?> + .FLS + <1? .NARG> + <BLT-HACK <KIDS .INRAP> + <BINDING-STRUCTURE .INRAP> + <MINL <RESULT-TYPE <1 .K>>>>> + <SET DOIT <>>) + (<OR .F? .FF?> + <SET TEM <SEQ-GEN <KIDS .INRAP> <GOODACS .INRAP DONT-CARE> T>>) + (<NOT .FLS> + <SET TEM + <SEQ-GEN + <KIDS .INRAP> + <COND (.GMF .OUTD) + (ELSE + <DATUM <SET TT + <ADDRESS:C <FORM - + -1 + <* 2 .NARG> + !<STACK:L .STK .STRV>> + '`(TP) >> + .TT>)> + T>> + <SET OUTD .TEM>) + (ELSE <RET-TMP-AC <SET TEM <SEQ-GEN <KIDS .INRAP> FLUSHED T>>>)> + <COND + (<AND .DOIT <N==? .TEM ,NO-DATUM>> + <COND (<ACTIVATED .INRAP> <PROG:END> <LABEL:OFF .MAP:OFF>) + (<OR .OPRE .F?> + <AND .SPECD + <OR .OPRE <SET TEM <MOVE:ARG .TEM <DATUM ,AC-A ,AC-B>>>>> + <POP:LOCS .STK .STRV> + <UNBIND:FUNNY <SPECS-START .INRAP> !.NTSLOTS>) + (ELSE <UNBIND:LOCS .STK .STB>)> + <COND + (.F? <DO-STACK-ARGS .MAYBE-FALSE .TEM>) + (<AND .GMF .FF?> + <OR .PRE + <PROG () + <SET NTSLOTS <REST <SET NS .NTSLOTS>>> + <SET OS .STK> + <SET STK .STB>>> + <DO-EVEN-FUNNIER-HACK .TEM + .FSYM + .MNOD + .FAP + .INRAP + <LOOP-VARS .INRAP>>) + (<AND .GMF <NOT .FLS>> + <RET-TMP-AC .TEM> + <PUT .FSYM ,INACS .TEM> + <PUT .FSYM ,STORED <>> + <COND (<TYPE? <DATTYP .TEM> AC> + <PUT <DATTYP .TEM> + ,ACRESIDUE + (.FSYM !<ACRESIDUE <DATTYP .TEM>>)>)> + <PUT <DATVAL .TEM> ,ACRESIDUE (.FSYM !<ACRESIDUE <DATVAL .TEM>>)> + <PUT .FSYM ,STORED <>> + <COND + (<NOT <MEMQ .FSYM <LOOP-VARS .INRAP>>> + <REPEAT ((L <LOOP-VARS .INRAP>) LL) + #DECL ((L) LIST (LL) DATUM) + <COND (<EMPTY? .L> <RETURN>)> + <COND (<TYPE? <DATVAL <SET LL <LINACS-SLOT .L>>> AC> + <PUT <DATVAL .LL> ,ACPROT T>)> + <COND (<TYPE? <DATTYP .LL> AC> + <PUT <DATTYP .LL> ,ACPROT T>)> + <SET L <REST .L ,LOOPVARS-LENGTH>>> + <PUT + .INRAP + ,LOOP-VARS + (.FSYM + <PROG (R R2 D) + <SET D + <DATUM + <COND (<ISTYPE-GOOD? <RESULT-TYPE .MNOD>>) + (<AND <TYPE? .WHERE DATUM> + <TYPE? <SET R <DATTYP .WHERE>> AC> + <NOT <ACPROT .R>>> + <PUT <SGETREG .R <>> ,ACPROT T>) + (ELSE <PUT <SET R <GETREG <>>> ,ACPROT T>)> + <COND (<AND <TYPE? .WHERE DATUM> + <TYPE? <SET R2 <DATVAL .WHERE>> AC> + <NOT <ACPROT .R2>>> + <SGETREG .R2 <>>) + (ELSE <SET R2 <GETREG <>>>)>>> + <COND (<AND <ASSIGNED? R>> + <TYPE? .R AC> + <PUT .R ,ACPROT <>>)> + .D> + !<LOOP-VARS .INRAP>)> + <REPEAT ((L <LOOP-VARS .INRAP>) LL) + #DECL ((L) LIST (LL) DATUM) + <COND (<EMPTY? .L> <RETURN>)> + <COND (<TYPE? <DATVAL <SET LL <LINACS-SLOT .L>>> AC> + <PUT <DATVAL .LL> ,ACPROT <>>)> + <COND (<TYPE? <DATTYP .LL> AC> + <PUT <DATTYP .LL> ,ACPROT <>>)> + <SET L <REST .L ,LOOPVARS-LENGTH>>>)>) + (.FF? <DO-FUNNY-HACK .TEM (<* .NARG -2> ()) .MNOD .FAP .INRAP>)> + <COND (.ANY? <EMIT <INSTRUCTION `SETZM .POFF '`(P) >>)> + <OR .PRE + <AND .GMF .FF?> + <PROG () + <SET NTSLOTS <REST <SET NS .NTSLOTS>>> + <SET STK .STB>>>)> + <COND + (.DOIT + <AGAIN-UP .INRAP <AND .GMF <1? .NARG>>> + <LABEL:TAG .RTAG> + <COND (.GMF + <REST-STRUCS <BINDING-STRUCTURE .INRAP> + .K + <LOOP-VARS .INRAP> + .NARG + .MAPL2 + .R?>)> + <COND (<NOT <AND .GMF <1? .NARG>>> <BRANCH:TAG .MAPLP>)> + <GEN-TAGS .OTAG .SPECD> + <COND (<AND .GMF <NOT .PRE>> <SET STK .GSTK> <SET NTSLOTS .NS>)> + <COND (<AND .GMF <NOT <1? .NARG>>> + <COND (<OR .OPRE .F?> + <POP:LOCS .STK .STRV> + <UNBIND:FUNNY <SPECS-START .INRAP> !.NTSLOTS>) + (ELSE <UNBIND:LOCS .STK .STB>)>)> + <MAPF <> + <FUNCTION (N) + #DECL ((N) NODE) + <COND (<NOT <ISTYPE? <STRUCTYP <RESULT-TYPE .N>>>> + <EMIT '<`SETZM |DSTORE >> + <MAPLEAVE>)>> + .K>) + (ELSE <GEN-TAGS .OTAG .SPECD>)> + <CLEANUP-STATE .INRAP> + <LABEL:TAG .APPLTAG> + <COND + (<TYPE? .DEST DATUM> + <SET CD + <COND (.F? <DO-LAST .SUBRC .MAYBE-FALSE <DATUM !.DEST>>) + (<AND .FF? .GMF> + <MOVE:ARG <LADDR .FSYM <> <>> <DATUM !.DEST>>) + (.FF? <DO-FUNNY-LAST .FAP <- -1 <* 2 .NARG>> <DATUM !.DEST>>) + (.GMF <MOVE:ARG .OUTD <DATUM !.DEST>>) + (ELSE + <MOVE:ARG + <DATUM <SET TT <ADDRESS:C <- -1 <* 2 .NARG>> '`(TP) >> .TT> + <DATUM !.DEST>>)>> + <ACFIX .DEST .CD> + <AND <ISTYPE? <DATTYP .DEST>> + <TYPE? <DATTYP .CD> AC> + <RET-TMP-AC <DATTYP .CD> .CD>>) + (.F? <DO-LAST .SUBRC .MAYBE-FALSE <FUNCTION:VALUE>>) + (<AND .FF? .GMF> <MOVE:ARG .OUTD <FUNCTION:VALUE>>) + (<AND .GMF .FF?> <MOVE:ARG .OUTD <FUNCTION:VALUE>>) + (.FF? <DO-FUNNY-LAST .FAP <- -1 <* 2 .NARG>> <FUNCTION:VALUE>>)> + <POP:LOCS .STB .STOP> + <LABEL:TAG .EXIT>> + <COND (<ASSIGNED? CD> + <AND <TYPE? <DATTYP .DEST> AC> <FIX-ACLINK <DATTYP .DEST> .DEST .CD>> + <AND <TYPE? <DATVAL .DEST> AC> + <FIX-ACLINK <DATVAL .DEST> .DEST .CD>>)> + <SET STK .OSTK> + <SET XX <MOVE:ARG .DEST .WHERE>> + <END-FRAME> + .XX> + + <TITLE HMAPFR> + + <DECLARE ("VALUE" ANY NODE!-COMPDEC!-PACKAGE ANY <LIST [REST +NODE!-COMPDEC!-PACKAGE]>)> + <PUSH TP* (AB) > + <PUSH TP* (AB) 1> + <PUSH TP* (AB) 2> + <PUSH TP* (AB) 3> + <PUSH TP* (AB) 4> + <PUSH TP* (AB) 5> + <PUSHJ P* TAG1> + <JRST |FINIS > +TAG1 <SUBM M* (P) > ; 8 + <PUSH TP* [<(*35*) *10*>]> ; [6] + <PUSH TP* FRM> ; [7] + <MOVE FRM* TP> + <MOVEI O* *20* > + <PUSHJ P* |NTPALO > + <PUSH TP* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>>; [24] + <PUSH TP* [0]> ; [25] + <PUSH TP* [0]> ; [26] + <PUSH TP* [0]> ; [27] + <PUSH TP* [0]> ; [28] + <PUSH TP* [0]> ; [29] + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [30] + <PUSH TP* <MQUOTE MNOD!-IMAPGEN!-MAPGEN!-PACKAGE>>; [31] + <PUSH TP* (FRM) -7> ; (-7) [32] + <PUSH TP* (FRM) -6> ; (-6) [33] + <PUSH TP* <MQUOTE (NODE!-COMPDEC!-PACKAGE)> -1> ; [34] + <PUSH TP* <MQUOTE (NODE!-COMPDEC!-PACKAGE)>> ; [35] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [36] + <PUSH TP* <MQUOTE NTSLOTS!-IMAPGEN!-MAPGEN!-PACKAGE>>; [37] + <MOVE B* <MQUOTE NTSLOTS!-IMAPGEN!-MAPGEN!-PACKAGE>> + <PUSHJ P* |CILVAL > + <PUSH TP* A> ; [38] + <PUSH TP* B> ; [39] + <PUSH TP* <MQUOTE (LIST)> -1> ; [40] + <PUSH TP* <MQUOTE (LIST)>> ; [41] + <PUSHJ P* |SPECBN > + <MOVE B* <MQUOTE PRE!-IMAPGEN!-MAPGEN!-PACKAGE>> + <PUSHJ P* |CILVAL > + <GETYP O* A> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG2> + <MOVE B* <MQUOTE TMPS!-COMPDEC!-PACKAGE>> + <PUSHJ P* |CILVAL > + <JRST TAG3> +TAG2 <MOVE B* <MQUOTE STK!-IMAPGEN!-MAPGEN!-PACKAGE>> ; 44 + <PUSHJ P* |CILVAL > + <PUSH TP* A> ; [42] + <PUSH TP* B> ; [43] + <MOVE B* <MQUOTE BSTB!-IMAPGEN!-MAPGEN!-PACKAGE>> + <PUSHJ P* |CILVAL > + <PUSH TP* A> ; [44] + <PUSH TP* B> ; [45] + <MCALL 2 STACK:L> + <GETYP O* A> + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG3> + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 0> + <MOVEI E* 0> + <PUSHJ P* |C1CONS > +TAG3 <PUSH TP* A> ; 60 [42] + <PUSH TP* B> ; [43] + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [44] + <PUSH TP* <MQUOTE NSLOTS!-IMAPGEN!-MAPGEN!-PACKAGE>>; [45] + <PUSH TP* <TYPE-WORD UNBOUND>> ; [46] + <PUSH TP* [-1]> ; [47] + <PUSH TP* <MQUOTE (FIX)> -1> ; [48] + <PUSH TP* <MQUOTE (FIX)>> ; [49] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [50] + <PUSH TP* <MQUOTE SPECD!-IMAPGEN!-MAPGEN!-PACKAGE>>; [51] + <PUSH TP* <TYPE-WORD FALSE>> ; [52] + <PUSH TP* [0]> ; [53] + <PUSH TP* <MQUOTE (<OR FALSE ATOM>)> -1> ; [54] + <PUSH TP* <MQUOTE (<OR FALSE ATOM>)>> ; [55] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [56] + <PUSH TP* <MQUOTE STB!-IMAPGEN!-MAPGEN!-PACKAGE>> ; [57] + <PUSH TP* <TYPE-WORD UNBOUND>> ; [58] + <PUSH TP* [-1]> ; [59] + <PUSH TP* <MQUOTE (LIST)> -1> ; [60] + <PUSH TP* <MQUOTE (LIST)>> ; [61] + <PUSHJ P* |SPECBN > + <PUSH TP* <MQUOTE FIX> -1> ; [62] + <PUSH TP* <MQUOTE FIX>> ; [63] + <PUSH TP* <MQUOTE ANY-AC!-COMPDEC!-PACKAGE> -1> ; [64] + <PUSH TP* <MQUOTE ANY-AC!-COMPDEC!-PACKAGE>> ; [65] + <MCALL 2 DATUM> + <PUSH TP* A> ; [62] + <PUSH TP* B> ; [63] + <PUSH TP* <TYPE-WORD FALSE>> ; [64] + <PUSH TP* [0]> ; [65] + <MOVE B* (FRM) -2> ; (-2) + <JUMPE B* |CERR2 > + <PUSH TP* <MQUOTE %<TYPE-W NODE!-COMPDEC!-PACKAGE VECTOR>>>; [66] + <PUSH TP* (B) 1> ; [67] + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [68] + <PUSH TP* <MQUOTE INRAP!-IMAPGEN!-MAPGEN!-PACKAGE>>; [69] + <JUMPE B* |CERR2 > + <HRRZ D* (B) > + <JUMPE D* |CERR2 > + <PUSH TP* <MQUOTE %<TYPE-W NODE!-COMPDEC!-PACKAGE VECTOR>>>; [70] + <PUSH TP* (D) 1> ; [71] + <PUSH TP* <MQUOTE (NODE!-COMPDEC!-PACKAGE)> -1> ; [72] + <PUSH TP* <MQUOTE (NODE!-COMPDEC!-PACKAGE)>> ; [73] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [74] + <PUSH TP* <MQUOTE POFF!-IMAPGEN!-MAPGEN!-PACKAGE>>; [75] + <PUSH TP* <TYPE-WORD FIX>> ; [76] + <PUSH TP* [0]> ; [77] + <PUSH TP* <MQUOTE (FIX)> -1> ; [78] + <PUSH TP* <MQUOTE (FIX)>> ; [79] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [80] + <PUSH TP* <MQUOTE ANY?!-IMAPGEN!-MAPGEN!-PACKAGE>>; [81] + <PUSH TP* <TYPE-WORD FALSE>> ; [82] + <PUSH TP* [0]> ; [83] + <PUSH TP* <MQUOTE (ANY)> -1> ; [84] + <PUSH TP* <MQUOTE (ANY)>> ; [85] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [86] + <PUSH TP* <MQUOTE NARG!-IMAPGEN!-MAPGEN!-PACKAGE>>; [87] + <MOVE B* (FRM) -2> ; (-2) + <JUMPE B* |CERR2 > + <HRRZ B* (B) > + <JUMPE B* |CERR2 > + <HRRZ B* (B) > + <MOVE D* B> + <JRST TAG4> +TAG5 <HRR D* (D) -1> ; 129 +TAG4 <TRNE D* -1 > ; 130 + <AOBJP D* TAG5> + <HLRZS D> + <PUSH TP* <TYPE-WORD FIX>> ; [88] + <PUSH TP* D> ; [89] + <PUSH TP* <MQUOTE (FIX)> -1> ; [90] + <PUSH TP* <MQUOTE (FIX)>> ; [91] + <MOVEM B* (FRM) -2> ; (-2) + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [92] + <PUSH TP* <MQUOTE START:TAG!-IMAPGEN!-MAPGEN!-PACKAGE>>; [93] + <PUSH TP* <TYPE-WORD UNBOUND>> ; [94] + <PUSH TP* [-1]> ; [95] + <PUSH TP* <MQUOTE (ANY)> -1> ; [96] + <PUSH TP* <MQUOTE (ANY)>> ; [97] + <PUSHJ P* |SPECBN > + <MOVE B* (FRM) 26> ; (26) + <ADD B* [<(18) 18>]> + <JUMPGE B* |CERR2 > + <MOVE D* (B) > + <MOVE PVP* (B) 1> + <MOVE B* <MQUOTE %<RGLOC MAPR T>>> + <ADD B* |GLOTOP 1> + <GETYP O* (B) 0> + <GETYP TVP* D> + <CAMN PVP* (B) 1> + <CAIE O* (TVP) 0> + <JRST TAG6> + <MOVE B* <MQUOTE T> -1> + <MOVE TVP* <MQUOTE T>> + <JRST TAG7> +TAG6 <MOVE B* <TYPE-WORD FALSE>> ; 161 + <MOVEI TVP* 0> +TAG7 <PUSH TP* B> ; 163 [98] + <PUSH TP* TVP> ; [99] + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [100] + <PUSH TP* <MQUOTE STRV!-IMAPGEN!-MAPGEN!-PACKAGE>>; [101] + <PUSH TP* <TYPE-WORD UNBOUND>> ; [102] + <PUSH TP* [-1]> ; [103] + <PUSH TP* <MQUOTE (LIST)> -1> ; [104] + <PUSH TP* <MQUOTE (LIST)>> ; [105] + <PUSHJ P* |SPECBN > + <PUSH TP* <TYPE-WORD FALSE>> ; [106] + <PUSH TP* [0]> ; [107] + <PUSH P* (FRM) 82> ; (82) + <PUSH TP* <TYPE-WORD LIST>> ; [108] + <PUSH TP* [0]> ; [109] + <PUSH TP* <TYPE-WORD LIST>> ; [110] + <PUSH TP* [0]> ; [111] +TAG9 <SOSGE (P) > ; 179 + <JRST TAG8> + <PUSH TP* <MQUOTE "MAP"> -1> ; [112] + <PUSH TP* <MQUOTE "MAP">> ; [113] + <MCALL 1 MAKE:TAG> + <MOVE C* A> + <MOVE D* B> + <MOVEI E* 0> + <PUSHJ P* |CICONS > + <SKIPE (TP) > ; (111) + <HRRM B* @ (TP) > ; (111) + <MOVEM B* (TP) > ; (111) + <SKIPN (TP) -2> ; (109) + <MOVEM B* (TP) -2> ; (109) + <JRST TAG9> +TAG8 <MOVE B* (TP) -2> ; 194 (109) + <SUB TP* [<(4) 4>]> + <SUB P* [<(1) 1>]> + <PUSH TP* <TYPE-WORD LIST>> ; [108] + <PUSH TP* B> ; [109] + <MOVE B* <MQUOTE STK!-IMAPGEN!-MAPGEN!-PACKAGE>> + <PUSHJ P* |CILVAL > + <PUSH TP* A> ; [110] + <PUSH TP* B> ; [111] + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [112] + <PUSH TP* <MQUOTE MAPLP!-IMAPGEN!-MAPGEN!-PACKAGE>>; [113] + <PUSH TP* <MQUOTE "MAP"> -1> ; [114] + <PUSH TP* <MQUOTE "MAP">> ; [115] + <MCALL 1 MAKE:TAG> + <PUSH TP* A> ; [114] + <PUSH TP* B> ; [115] + <PUSH TP* <MQUOTE (ATOM)> -1> ; [116] + <PUSH TP* <MQUOTE (ATOM)>> ; [117] + <PUSHJ P* |SPECBN > + <PUSH TP* <MQUOTE "MAP"> -1> ; [118] + <PUSH TP* <MQUOTE "MAP">> ; [119] + <MCALL 1 MAKE:TAG> + <PUSH TP* A> ; [118] + <PUSH TP* B> ; [119] + <PUSH TP* (FRM) 59> ; (59) [120] + <PUSH TP* (FRM) 60> ; (60) [121] + <MCALL 1 AP?> + <PUSH TP* A> ; [120] + <PUSH TP* B> ; [121] + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [122] + <PUSH TP* <MQUOTE STOP!-IMAPGEN!-MAPGEN!-PACKAGE>>; [123] + <PUSH TP* <TYPE-WORD UNBOUND>> ; [124] + <PUSH TP* [-1]> ; [125] + <PUSH TP* <MQUOTE (LIST)> -1> ; [126] + <PUSH TP* <MQUOTE (LIST)>> ; [127] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [128] + <PUSH TP* <MQUOTE STK!-IMAPGEN!-MAPGEN!-PACKAGE>> ; [129] + <PUSH TP* <TYPE-WORD FIX>> ; [130] + <PUSH TP* [0]> ; [131] + <MOVE B* <MQUOTE STK!-IMAPGEN!-MAPGEN!-PACKAGE>> + <PUSHJ P* |CILVAL > + <PUSH P* [1]> + <MOVEI O* |SEGLST > + <PUSHJ P* |RCALL > + <SUB P* [<(1) 1>]> + <PUSH TP* A> ; [130] + <PUSH TP* B> ; [131] + <PUSH TP* <MQUOTE (LIST)> -1> ; [132] + <PUSH TP* <MQUOTE (LIST)>> ; [133] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [134] + <PUSH TP* <MQUOTE TMPS!-COMPDEC!-PACKAGE>> ; [135] + <MOVE B* <MQUOTE TMPS!-COMPDEC!-PACKAGE>> + <PUSHJ P* |CILVAL > + <PUSH TP* A> ; [136] + <PUSH TP* B> ; [137] + <PUSH TP* <MQUOTE (LIST)> -1> ; [138] + <PUSH TP* <MQUOTE (LIST)>> ; [139] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [140] + <PUSH TP* <MQUOTE BTP!-IMAPGEN!-MAPGEN!-PACKAGE>> ; [141] + <PUSH TP* <TYPE-WORD UNBOUND>> ; [142] + <PUSH TP* [-1]> ; [143] + <PUSH TP* <MQUOTE (LIST)> -1> ; [144] + <PUSH TP* <MQUOTE (LIST)>> ; [145] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [146] + <PUSH TP* <MQUOTE BASEF!-IMAPGEN!-MAPGEN!-PACKAGE>>; [147] + <MOVE B* <MQUOTE BASEF!-IMAPGEN!-MAPGEN!-PACKAGE>> + <PUSHJ P* |CILVAL > + <PUSH TP* A> ; [148] + <PUSH TP* B> ; [149] + <PUSH TP* <MQUOTE (NODE!-COMPDEC!-PACKAGE)> -1> ; [150] + <PUSH TP* <MQUOTE (NODE!-COMPDEC!-PACKAGE)>> ; [151] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [152] + <PUSH TP* <MQUOTE FRMS!-IMAPGEN!-MAPGEN!-PACKAGE>>; [153] + <MOVE B* <MQUOTE FRMS!-IMAPGEN!-MAPGEN!-PACKAGE>> + <PUSHJ P* |CILVAL > + <PUSH TP* A> ; [154] + <PUSH TP* B> ; [155] + <PUSH TP* <MQUOTE (LIST)> -1> ; [156] + <PUSH TP* <MQUOTE (LIST)>> ; [157] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [158] + <PUSH TP* <MQUOTE MAYBE-FALSE!-IMAPGEN!-MAPGEN!-PACKAGE>>; [159] + <PUSH TP* <TYPE-WORD FALSE>> ; [160] + <PUSH TP* [0]> ; [161] + <PUSH TP* <MQUOTE (ANY)> -1> ; [162] + <PUSH TP* <MQUOTE (ANY)>> ; [163] + <PUSHJ P* |SPECBN > + <MOVE B* <MQUOTE PRE!-IMAPGEN!-MAPGEN!-PACKAGE>> + <PUSHJ P* |CILVAL > + <PUSH TP* A> ; [164] + <PUSH TP* B> ; [165] + <PUSH TP* <TYPE-WORD LIST>> ; [166] + <PUSH TP* [0]> ; [167] + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [168] + <PUSH TP* <MQUOTE DEST!-IMAPGEN!-MAPGEN!-PACKAGE>>; [169] + <PUSH TP* <TYPE-WORD UNBOUND>> ; [170] + <PUSH TP* [-1]> ; [171] + <PUSH TP* <MQUOTE (<OR ATOM DATUM!-COMPDEC!-PACKAGE>)> -1>; [172] + <PUSH TP* <MQUOTE (<OR ATOM DATUM!-COMPDEC!-PACKAGE>)>>; [173] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [174] + <PUSH TP* <MQUOTE CD!-IMAPGEN!-MAPGEN!-PACKAGE>> ; [175] + <PUSH TP* <TYPE-WORD UNBOUND>> ; [176] + <PUSH TP* [-1]> ; [177] + <PUSH TP* <MQUOTE (<OR ATOM DATUM!-COMPDEC!-PACKAGE>)> -1>; [178] + <PUSH TP* <MQUOTE (<OR ATOM DATUM!-COMPDEC!-PACKAGE>)>>; [179] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [180] + <PUSH TP* <MQUOTE AC-HACK!-IMAPGEN!-MAPGEN!-PACKAGE>>; [181] + <MOVE B* <MQUOTE AC-HACK!-IMAPGEN!-MAPGEN!-PACKAGE>> + <PUSHJ P* |CILVAL > + <PUSH TP* A> ; [182] + <PUSH TP* B> ; [183] + <PUSH TP* <MQUOTE (ANY)> -1> ; [184] + <PUSH TP* <MQUOTE (ANY)>> ; [185] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [186] + <PUSH TP* <MQUOTE EXIT!-IMAPGEN!-MAPGEN!-PACKAGE>>; [187] + <PUSH TP* <MQUOTE "MAPEX"> -1> ; [188] + <PUSH TP* <MQUOTE "MAPEX">> ; [189] + <MCALL 1 MAKE:TAG> + <PUSH TP* A> ; [188] + <PUSH TP* B> ; [189] + <PUSH TP* <MQUOTE (ATOM)> -1> ; [190] + <PUSH TP* <MQUOTE (ATOM)>> ; [191] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [192] + <PUSH TP* <MQUOTE APPLTAG!-IMAPGEN!-MAPGEN!-PACKAGE>>; [193] + <PUSH TP* <MQUOTE "MAPAP"> -1> ; [194] + <PUSH TP* <MQUOTE "MAPAP">> ; [195] + <MCALL 1 MAKE:TAG> + <PUSH TP* A> ; [194] + <PUSH TP* B> ; [195] + <PUSH TP* <MQUOTE (ATOM)> -1> ; [196] + <PUSH TP* <MQUOTE (ATOM)>> ; [197] + <PUSHJ P* |SPECBN > + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [198] + <PUSH TP* <MQUOTE GMF!-IMAPGEN!-MAPGEN!-PACKAGE>> ; [199] + <PUSH TP* <TYPE-WORD UNBOUND>> ; [200] + <PUSH TP* [-1]> ; [201] + <PUSH TP* <MQUOTE (ANY)> -1> ; [202] + <PUSH TP* <MQUOTE (ANY)>> ; [203] + <PUSHJ P* |SPECBN > + <PUSH TP* (FRM) -5> ; (-5) [204] + <PUSH TP* (FRM) -4> ; (-4) [205] + <MOVE B* (FRM) -5> ; (-5) + <MOVE D* (FRM) -4> ; (-4) + <GETYP O* B> + <CAMN D* <MQUOTE FLUSHED!-COMPDEC!-PACKAGE>> + <CAIE O* <TYPE-CODE ATOM>> + <JRST TAG10> + <MOVE PVP* <MQUOTE T> -1> + <MOVE TVP* <MQUOTE T>> + <JRST TAG11> +TAG10 <MOVE PVP* <TYPE-WORD FALSE>> ; 353 + <MOVEI TVP* 0> +TAG11 <PUSH TP* PVP> ; 355 [206] + <PUSH TP* TVP> ; [207] + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [208] + <PUSH TP* <MQUOTE RTAG!-COMPDEC!-PACKAGE>> ; [209] + <PUSH TP* <MQUOTE "MAP"> -1> ; [210] + <PUSH TP* <MQUOTE "MAP">> ; [211] + <MCALL 1 MAKE:TAG> + <PUSH TP* A> ; [210] + <PUSH TP* B> ; [211] + <PUSH TP* <MQUOTE (ATOM)> -1> ; [212] + <PUSH TP* <MQUOTE (ATOM)>> ; [213] + <PUSHJ P* |SPECBN > + <PUSH TP* <MQUOTE T> -1> ; [214] + <PUSH TP* <MQUOTE T>> ; [215] + <PUSH TP* <MQUOTE T> -1> ; [216] + <PUSH TP* <MQUOTE T>> ; [217] + <PUSH TP* [<(%<TYPE-CODE ATOM>) -1>]> ; [218] + <PUSH TP* <MQUOTE GSTK!-IMAPGEN!-MAPGEN!-PACKAGE>>; [219] + <PUSH TP* <TYPE-WORD UNBOUND>> ; [220] + <PUSH TP* [-1]> ; [221] + <PUSH TP* <MQUOTE (LIST)> -1> ; [222] + <PUSH TP* <MQUOTE (LIST)>> ; [223] + <PUSHJ P* |SPECBN > + <MOVEI O* *22* > + <PUSHJ P* |NTPALO > + <INTGO> + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(22) 22>]> + <JUMPGE B* |CERR2 > + <PUSH TP* <TYPE-WORD FIX>> ; [242] + <PUSH TP* (B) 1> ; [243] + <MOVE B* <MQUOTE TOT-SPEC!-IMAPGEN!-MAPGEN!-PACKAGE>> + <PUSHJ P* |CILVAL > + <PUSH TP* A> ; [244] + <PUSH TP* B> ; [245] + <MOVEI A* 2 > + <PUSHJ P* |CMINUS > + <MOVE D* (FRM) 64> ; (64) + <ADD D* [<(22) 22>]> + <JUMPGE D* |CERR2 > + <MOVEM A* (D) > + <MOVEM B* (D) 1> + <MOVE B* <MQUOTE PRE!-IMAPGEN!-MAPGEN!-PACKAGE>> + <PUSHJ P* |CILVAL > + <MOVEI E* (FRM) 217> ; (217) + <MOVE C* <MQUOTE PRE!-IMAPGEN!-MAPGEN!-PACKAGE>> + <MOVE D* <MQUOTE (ANY)>> + <PUSHJ P* |IBIND > + <MOVE B* (FRM) -2> ; (-2) + <JUMPE B* TAG12> + <MOVE D* <TYPE-WORD FALSE>> + <MOVEI PVP* 0> + <JUMPE B* TAG13> +TAG17 <MOVE TVP* (B) 1> ; 409 + <SKIPGE |INTFLG > + <TAG14> + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (FRM) 5> ; (5) + <MOVEM B* (FRM) 6> ; (6) + <PUSH TP* (TVP) 4> ; [242] + <PUSH TP* (TVP) 5> ; [243] + <PUSH TP* <MQUOTE <PRIMTYPE LIST>> -1> ; [244] + <PUSH TP* <MQUOTE <PRIMTYPE LIST>>> ; [245] + <MCALL 2 TYPE-OK?> + <GETYP O* A> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG15> + <MOVE B* <TYPE-WORD FALSE>> + <MOVEI D* 0> + <JRST TAG16> +TAG15 <MOVE B* <MQUOTE T> -1> ; 426 + <MOVE D* <MQUOTE T>> + <MOVE D* B> + <MOVE PVP* D> + <MOVE B* (FRM) 6> ; (6) + <HRRZ B* (B) > + <JUMPN B* TAG17> +TAG13 <MOVE B* PVP> ; 433 +TAG16 <JUMPGE D* TAG12> ; 434 + <MOVE B* <TYPE-WORD FALSE>> + <MOVEI D* 0> + <MOVEM B* (FRM) 207> ; (207) + <MOVEM D* (FRM) 208> ; (208) +TAG12 <MOVE B* (FRM) -2> ; 439 (-2) + <JUMPN B* TAG18> + <MOVE D* (FRM) 60> ; (60) + <GETYP O* (D) 6> + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG19> +TAG18 <MOVE D* (FRM) 60> ; 445 (60) + <MOVE PVP* (D) 6> + <MOVE TVP* (D) 7> + <GETYP O* PVP> + <CAIN TVP* 0> + <CAIE O* <TYPE-CODE FALSE>> + <SKIPA O> + <JRST TAG20> + <MOVE C* (D) 1> + <CAIE C* *107* > + <JRST TAG21> + <ADD D* [<(18) 18>]> + <JUMPGE D* |CERR2 > + <MOVE E* (D) > + <MOVE A* (D) 1> + <GETYP O* E> + <CAIN A* 5 > + <CAIE O* <TYPE-CODE FIX>> + <JRST TAG20> +TAG21 <GETYP O* (FRM) 113> ; 464 (113) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG19> +TAG20 <JUMPE B* TAG22> ; 467 + <MOVE D* (FRM) 64> ; (64) + <ADD D* [<(20) 20>]> + <JUMPGE D* |CERR2 > + <MOVE C* (D) 1> + <JUMPE C* |CERR2 > + <MOVE E* (C) 1> + <MOVE D* (E) 3> + <CAME D* <MQUOTE DUMMY-MAPF!-COMPDEC!-PACKAGE>> + <JRST TAG19> +TAG22 <MOVE D* <MQUOTE T> -1> ; 477 + <MOVE PVP* <MQUOTE T>> + <JRST TAG23> +TAG19 <MOVE D* <TYPE-WORD FALSE>> ; 480 + <MOVEI PVP* 0> +TAG23 <MOVEM D* (FRM) 193> ; 482 (193) + <MOVEM PVP* (FRM) 194> ; (194) + <JUMPE B* TAG24> + <PUSH P* [0]> + <JUMPE B* TAG25> +TAG27 <MOVE TVP* (B) 1> ; 487 + <SKIPGE |INTFLG > + <TAG26> + <PUSH TP* (TVP) 4> ; [242] + <PUSH TP* (TVP) 5> ; [243] + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (FRM) 3> ; (3) + <MOVEM B* (FRM) 4> ; (4) + <MCALL 1 MINL> + <PUSH TP* A> ; [242] + <PUSH TP* B> ; [243] + <AOS (P) > + <MOVE B* (FRM) 4> ; (4) + <HRRZ B* (B) > + <JUMPN B* TAG27> +TAG25 <POP P* A> ; 502 + <PUSHJ P* |CMIN > + <JUMPG B* TAG24> + <MOVE B* <MQUOTE T> -1> + <MOVE D* <MQUOTE T>> + <JRST TAG28> +TAG24 <MOVE B* <TYPE-WORD FALSE>> ; 508 + <MOVEI D* 0> +TAG28 <MOVEM B* (FRM) 15> ; 510 (15) + <MOVEM D* (FRM) 16> ; (16) + <GETYP O* (FRM) 199> ; (199) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG29> + <MOVE PVP* <MQUOTE FLUSHED!-COMPDEC!-PACKAGE> -1> + <MOVE TVP* <MQUOTE FLUSHED!-COMPDEC!-PACKAGE>> + <JRST TAG30> +TAG29 <PUSH TP* (FRM) 25> ; 518 (25) [238] + <PUSH TP* (FRM) 26> ; (26) [239] + <PUSH TP* (FRM) -5> ; (-5) [240] + <PUSH TP* (FRM) -4> ; (-4) [241] + <MCALL 2 GOODACS> + <MOVE PVP* A> + <MOVE TVP* B> +TAG30 <MOVEM PVP* (FRM) 163> ; 525 (163) + <MOVEM TVP* (FRM) 164> ; (164) + <MOVEM PVP* (FRM) 197> ; (197) + <MOVEM TVP* (FRM) 198> ; (198) + <GETYP O* (FRM) 219> ; (219) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG31> + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(30) 30>]> + <JUMPGE B* |CERR2 > + <SKIPGE (B) 1> + <JRST TAG32> + <MOVE B* (FRM) 142> ; (142) + <ADD B* [<(26) 26>]> + <JUMPGE B* |CERR2 > + <SKIPE (B) 1> + <JRST TAG33> +TAG32 <MOVE B* <TYPE-WORD FALSE>> ; 542 + <MOVEI D* 0> + <JRST TAG34> +TAG33 <MOVE B* <MQUOTE T> -1> ; 545 + <MOVE D* <MQUOTE T>> +TAG34 <PUSH TP* B> ; 547 [238] + <PUSH TP* D> ; [239] + <MCALL 1 EMIT-PRE> +TAG31 <MOVE B* (FRM) 123> ; 550 (123) + <MOVE D* (FRM) 124> ; (124) + <MOVE E* D> + <MOVEM B* (FRM) 117> ; (117) + <MOVEM D* (FRM) 118> ; (118) + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 0> + <PUSHJ P* |C1CONS > + <PUSH TP* (FRM) 59> ; (59) [238] + <PUSH TP* (FRM) 60> ; (60) [239] + <PUSH TP* (FRM) 163> ; (163) [240] + <PUSH TP* (FRM) 164> ; (164) [241] + <MOVE D* (FRM) 193> ; (193) + <MOVE PVP* (FRM) 194> ; (194) + <GETYP O* D> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG35> + <MOVE TVP* (FRM) 64> ; (64) + <ADD TVP* [<(20) 20>]> + <JUMPGE TVP* |CERR2 > + <MOVE C* (TVP) 1> + <JUMPE C* |CERR2 > + <MOVE TVP* (C) 1> + <MOVE C* (FRM) 64> ; (64) + <ADD C* [<(20) 20>]> + <JUMPGE C* |CERR2 > + <MOVE E* (C) 1> + <JUMPE E* |CERR2 > + <HRRZ C* (E) > + <MOVE SP* (FRM) 64> ; (64) + <ADD SP* [<(20) 20>]> + <JUMPGE SP* |CERR2 > + <MOVEM C* (SP) 1> + <MOVE D* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>> + <MOVE PVP* TVP> + <MOVEM TVP* (FRM) 18> ; (18) +TAG35 <PUSH TP* D> ; 586 [242] + <PUSH TP* PVP> ; [243] + <PUSH TP* (FRM) 15> ; (15) [244] + <PUSH TP* (FRM) 16> ; (16) [245] + <MOVE D* (FRM) 82> ; (82) + <MOVEM A* (FRM) 123> ; (123) + <MOVEM B* (FRM) 124> ; (124) + <SOJN D* TAG36> + <MOVE D* <MQUOTE T> -1> + <MOVE PVP* <MQUOTE T>> + <JRST TAG37> +TAG36 <MOVE D* <TYPE-WORD FALSE>> ; 597 + <MOVEI PVP* 0> +TAG37 <PUSH TP* D> ; 599 [246] + <PUSH TP* PVP> ; [247] + <PUSH TP* (FRM) 199> ; (199) [248] + <PUSH TP* (FRM) 200> ; (200) [249] + <MCALL 6 DO-FIRST-SETUP> + <GETYP O* A> + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG38> + <MOVE D* (FRM) 60> ; (60) + <MOVE PVP* (D) 1> + <CAIE PVP* *107* > + <JRST TAG39> + <MOVE TVP* <MQUOTE T> -1> + <MOVE C* <MQUOTE T>> + <JRST TAG40> +TAG39 <MOVE TVP* <TYPE-WORD FALSE>> ; 614 + <MOVEI C* 0> +TAG40 <MOVEM TVP* (FRM) 99> ; 616 (99) + <MOVEM C* (FRM) 100> ; (100) +TAG38 <PUSH TP* <TYPE-WORD LIST>> ; 618 [238] + <PUSH TP* (FRM) -2> ; (-2) [239] + <PUSH TP* <MQUOTE T> -1> ; [240] + <PUSH TP* <MQUOTE T>> ; [241] + <PUSH TP* (FRM) 193> ; (193) [242] + <PUSH TP* (FRM) 194> ; (194) [243] + <MOVE D* (FRM) 64> ; (64) + <ADD D* [<(20) 20>]> + <JUMPGE D* |CERR2 > + <PUSH TP* <TYPE-WORD LIST>> ; [244] + <PUSH TP* (D) 1> ; [245] + <MOVEM A* (FRM) 13> ; (13) + <MOVEM B* (FRM) 14> ; (14) + <MCALL 4 PUSH-STRUCS> + <PUSH TP* (FRM) 59> ; (59) [238] + <PUSH TP* (FRM) 60> ; (60) [239] + <PUSH TP* (FRM) 163> ; (163) [240] + <PUSH TP* (FRM) 164> ; (164) [241] + <MOVE D* (FRM) 193> ; (193) + <MOVE PVP* (FRM) 194> ; (194) + <GETYP O* D> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG41> + <MOVE D* (FRM) 17> ; (17) + <MOVE PVP* (FRM) 18> ; (18) +TAG41 <PUSH TP* D> ; 643 [242] + <PUSH TP* PVP> ; [243] + <PUSH TP* (FRM) 15> ; (15) [244] + <PUSH TP* (FRM) 16> ; (16) [245] + <MOVE D* (FRM) 82> ; (82) + <MOVEM A* (FRM) 75> ; (75) + <MOVEM B* (FRM) 76> ; (76) + <SOJN D* TAG42> + <MOVE D* <MQUOTE T> -1> + <MOVE PVP* <MQUOTE T>> + <JRST TAG43> +TAG42 <MOVE D* <TYPE-WORD FALSE>> ; 654 + <MOVEI PVP* 0> +TAG43 <PUSH TP* D> ; 656 [246] + <PUSH TP* PVP> ; [247] + <PUSH TP* (FRM) 199> ; (199) [248] + <PUSH TP* (FRM) 200> ; (200) [249] + <MCALL 6 DO-FIRST-SETUP-2> + <GETYP O* (FRM) 193> ; (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG44> + <GETYP O* (FRM) 199> ; (199) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG44> + <MOVE B* (FRM) 18> ; (18) + <GETYP O* (B) 24> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG44> + <MOVE D* (B) 24> + <MOVE PVP* (B) 25> + <MOVEM D* (FRM) 197> ; (197) + <MOVEM PVP* (FRM) 198> ; (198) +TAG44 <MOVE B* (FRM) 64> ; 675 (64) + <ADD B* [<(32) 32>]> + <JUMPGE B* |CERR2 > + <PUSH TP* <TYPE-WORD ATOM>> ; [238] + <PUSH TP* (B) 1> ; [239] + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(30) 30>]> + <JUMPGE B* |CERR2 > + <PUSH TP* (B) > ; [240] + <PUSH TP* (B) 1> ; [241] + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(34) 34>]> + <JUMPGE B* |CERR2 > + <PUSH TP* (B) > ; [242] + <PUSH TP* (B) 1> ; [243] + <MCALL 3 BEGIN-FRAME> + <GETYP O* (FRM) 219> ; (219) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG45> + <MOVE B* (FRM) 36> ; (36) + <JRST TAG46> +TAG45 <PUSH TP* (FRM) 123> ; 696 (123) [238] + <PUSH TP* (FRM) 124> ; (124) [239] + <MOVE B* (FRM) 148> ; (148) + <JUMPE B* |CERR2 > + <HRRZ D* (B) > + <JUMPE D* |CERR2 > + <GETYP O* (D) 0> + <CAIN O* <TYPE-CODE DEFER>> + <MOVE D* (D) 1> + <PUSH TP* (D) > ; [240] + <PUSH TP* (D) 1> ; [241] + <MCALL 2 STACK:L> +TAG46 <MOVE E* (FRM) 124> ; 708 (124) + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 0> + <MOVEM B* (FRM) 130> ; (130) + <PUSHJ P* |C1CONS > + <MOVE E* B> + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 0> + <MOVEM A* (FRM) 51> ; (51) + <MOVEM B* (FRM) 52> ; (52) + <MOVEM A* (FRM) 123> ; (123) + <MOVEM B* (FRM) 124> ; (124) + <PUSHJ P* |C1CONS > + <MOVEM A* (FRM) 123> ; (123) + <MOVEM B* (FRM) 124> ; (124) + <GETYP O* (FRM) 13> ; (13) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG47> + <PUSH TP* (FRM) 59> ; (59) [238] + <PUSH TP* (FRM) 60> ; (60) [239] + <PUSH TP* (FRM) 113> ; (113) [240] + <PUSH TP* (FRM) 114> ; (114) [241] + <MCALL 2 DO-FINAL-SETUP> + <MOVEM A* (FRM) 153> ; (153) + <MOVEM B* (FRM) 154> ; (154) +TAG47 <PUSH TP* (FRM) 63> ; 733 (63) [238] + <PUSH TP* (FRM) 64> ; (64) [239] + <MCALL 1 PROG-START-AC> + <PUSH TP* (FRM) 107> ; (107) [238] + <PUSH TP* (FRM) 108> ; (108) [239] + <MCALL 1 LABEL:TAG> + <GETYP O* (FRM) 13> ; (13) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG48> + <GETYP O* (FRM) 193> ; (193) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG48> + <PUSH TP* (FRM) 55> ; (55) [238] + <PUSH TP* (FRM) 56> ; (56) [239] + <PUSH TP* (FRM) 51> ; (51) [240] + <PUSH TP* (FRM) 52> ; (52) [241] + <GETYP O* (FRM) 219> ; (219) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG49> +TAG51 <MOVE B* <TYPE-WORD FALSE>> ; 752 + <MOVEI D* 0> + <JRST TAG50> +TAG49 <MOVE B* (FRM) 64> ; 755 (64) + <ADD B* [<(30) 30>]> + <JUMPGE B* |CERR2 > + <SKIPGE (B) 1> + <JRST TAG51> + <MOVE B* <MQUOTE T> -1> + <MOVE D* <MQUOTE T>> +TAG50 <PUSH TP* B> ; 762 [242] + <PUSH TP* D> ; [243] + <MCALL 3 FIND-FIRST-STRUC> + <MOVEM A* (FRM) 57> ; (57) + <MOVEM B* (FRM) 58> ; (58) +TAG48 <MOVE B* (FRM) 64> ; 767 (64) + <ADD B* [<(30) 30>]> + <JUMPGE B* |CERR2 > + <SKIPL (B) 1> + <JRST TAG52> + <MCALL 0 ACT:INITIAL> + <GETYP O* A> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG52> + <PUSH TP* <TYPE-WORD FIX>> ; [238] + <PUSH TP* [2]> ; [239] + <MCALL 1 ADD:STACK> +TAG52 <MOVE E* (FRM) 124> ; 779 (124) + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 0> + <PUSHJ P* |C1CONS > + <MOVEM A* (FRM) 95> ; (95) + <MOVEM B* (FRM) 96> ; (96) + <MOVEM A* (FRM) 123> ; (123) + <MOVEM B* (FRM) 124> ; (124) + <GETYP O* (FRM) 219> ; (219) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG53> + <GETYP O* (FRM) 193> ; (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG54> + <MOVE D* (FRM) 82> ; (82) + <SOJE D* TAG53> +TAG54 <MOVE D* (FRM) 64> ; 795 (64) + <ADD D* [<(32) 32>]> + <JUMPGE D* |CERR2 > + <PUSH TP* <TYPE-WORD ATOM>> ; [238] + <PUSH TP* (D) 1> ; [239] + <MCALL 1 SALLOC:SLOTS> + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(32) 32>]> + <JUMPGE B* |CERR2 > + <PUSH TP* <TYPE-WORD ATOM>> ; [238] + <PUSH TP* (B) 1> ; [239] + <MCALL 1 ADD:STACK> + <GETYP O* (FRM) 219> ; (219) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG55> + <PUSH TP* <MQUOTE GVAL> -1> ; [238] + <PUSH TP* <MQUOTE GVAL>> ; [239] + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(32) 32>]> + <JUMPGE B* |CERR2 > + <PUSH TP* <TYPE-WORD ATOM>> ; [240] + <PUSH TP* (B) 1> ; [241] + <MOVEI A* 2 > + <PUSHJ P* |IIFORM > + <MOVE C* A> + <MOVE D* B> + <MOVEI E* 0> + <PUSHJ P* |C1CONS > + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (FRM) 1> ; (1) + <MOVEM B* (FRM) 2> ; (2) + <MOVE D* (FRM) 32> ; (32) + <HRRM D* @ B> + <MOVE B* (FRM) 2> ; (2) + <MOVEM B* (FRM) 32> ; (32) +TAG55 <GETYP O* (FRM) 193> ; 830 (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG53> + <MOVE B* (FRM) 123> ; (123) + <MOVE D* (FRM) 124> ; (124) + <MOVE E* D> + <MOVEM B* (FRM) 213> ; (213) + <MOVEM D* (FRM) 214> ; (214) + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 0> + <PUSHJ P* |C1CONS > + <MOVEM A* (FRM) 123> ; (123) + <MOVEM B* (FRM) 124> ; (124) +TAG53 <GETYP O* (FRM) 219> ; 843 (219) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG56> + <GETYP O* (FRM) 193> ; (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG56> + <MOVE B* (FRM) 82> ; (82) + <SOJE B* TAG56> + <MOVE B* (FRM) 123> ; (123) + <MOVE D* (FRM) 124> ; (124) + <MOVEM B* (FRM) 213> ; (213) + <MOVEM D* (FRM) 214> ; (214) + <MOVE E* D> + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 0> + <PUSHJ P* |C1CONS > + <MOVEM A* (FRM) 123> ; (123) + <MOVEM B* (FRM) 124> ; (124) +TAG56 <GETYP O* (FRM) 153> ; 861 (153) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG57> + <MOVNI B* 2 > + <JRST TAG58> +TAG57 <GETYP O* (FRM) 13> ; 866 (13) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG59> + <MOVNI B* 1 > + <JRST TAG58> +TAG59 <MOVEI B* 0> ; 871 +TAG58 <MOVEM B* (FRM) 70> ; 872 (70) + <GETYP O* (FRM) 193> ; (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG60> + <GETYP O* (FRM) 15> ; (15) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG61> + <MOVE D* (FRM) 82> ; (82) + <SOJE D* TAG60> +TAG61 <GETYP O* (FRM) 199> ; 881 (199) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG60> + <PUSH TP* (FRM) 17> ; (17) [238] + <PUSH TP* (FRM) 18> ; (18) [239] + <MCALL 1 LVAL-UP> +TAG60 <MOVE O* <TYPE-WORD LIST>> ; 887 + <MOVEM O* (FRM) 223> ; (223) + <MOVE O* (FRM) -2> ; (-2) + <MOVEM O* (FRM) 224> ; (224) + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(20) 20>]> + <JUMPGE B* |CERR2 > + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (FRM) 225> ; (225) + <MOVE O* (B) 1> + <MOVEM O* (FRM) 226> ; (226) + <MOVE A* (FRM) 225> ; (225) + <MOVE B* (FRM) 226> ; (226) + <PUSHJ P* |CEMPTY > + <JRST TAG62> + <MOVEI B* 0> + <JRST TAG63> +TAG62 <PUSH TP* <TYPE-WORD FALSE>> ; 904 [238] + <PUSH TP* [0]> ; [239] + <PUSH TP* (FRM) 225> ; (225) [240] + <PUSH TP* (FRM) 226> ; (226) [241] + <PUSH P* [-1]> +TAG66 <MOVE A* (TP) -1> ; 909 (240) + <MOVE B* (TP) > ; (241) + <PUSHJ P* |TYPSEG > + <SKIPL (P) > + <XCT (C) |INCR1 > + <XCT (C) |TESTR > + <JRST TAG64> + <MOVE A* |DSTORE > + <MOVE B* D> + <MOVE O* |DSTORE > + <MOVEM O* (TP) -1> ; (240) + <MOVEM D* (TP) > ; (241) + <SETZM |DSTORE > + <SKIPGE |INTFLG > + <SAVAC O* [<(*100*) 0>]> + <MOVE D* (B) 1> + <MOVE PVP* (D) 3> + <CAME PVP* <MQUOTE DUMMY-MAPF!-COMPDEC!-PACKAGE>> + <JRST TAG65> + <MOVEI TVP* 0> + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (TP) -3> ; (238) + <MOVEM TVP* (TP) -2> ; (239) + <SETZM (P) > + <JRST TAG66> +TAG64 <SETZM |DSTORE > ; 934 + <MOVE B* (TP) -2> ; (239) +TAG65 <SUB TP* [<(4) 4>]> ; 936 + <SUB P* [<(1) 1>]> +TAG63 <MOVE O* <TYPE-WORD LIST>> ; 938 + <MOVEM O* (FRM) 227> ; (227) + <MOVEM B* (FRM) 228> ; (228) + <MOVE C* <TYPE-WORD LIST>> + <MOVEI D* 0> + <MOVEI E* 0> + <PUSHJ P* |C1CONS > + <MOVEI D* 1 > + <MOVE PVP* (FRM) 82> ; (82) + <ASH PVP* A> + <SUB D* PVP> + <MOVE C* <TYPE-WORD FIX>> + <MOVE E* B> + <PUSHJ P* |C1CONS > + <MOVEM A* (FRM) 229> ; (229) + <MOVEM B* (FRM) 230> ; (230) + <MOVE C* <TYPE-WORD LIST>> + <MOVEI D* 0> + <MOVEI E* 0> + <PUSHJ P* |C1CONS > + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 0> + <MOVE E* B> + <PUSHJ P* |C1CONS > + <MOVEM A* (FRM) 231> ; (231) + <MOVEM B* (FRM) 232> ; (232) + <MOVE O* <MQUOTE (0)> -1> + <MOVEM O* (FRM) 233> ; (233) + <MOVE O* <MQUOTE (0)>> + <MOVEM O* (FRM) 234> ; (234) +TAG88 <INTGO> ; 968 + <MOVE B* (FRM) 224> ; (224) + <JUMPN B* TAG67> + <GETYP O* (FRM) 193> ; (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG68> + <MOVE D* (FRM) 82> ; (82) + <SOJE D* TAG68> + <GETYP O* (FRM) 99> ; (99) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG68> + <GETYP O* (FRM) 199> ; (199) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG68> + <PUSH TP* (FRM) 197> ; (197) [238] + <PUSH TP* (FRM) 198> ; (198) [239] + <MCALL 1 RET-TMP-AC> +TAG68 <GETYP O* (FRM) 13> ; 986 (13) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG69> + <GETYP O* (FRM) 57> ; (57) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG69> + <PUSH TP* (FRM) 55> ; (55) [238] + <PUSH TP* (FRM) 56> ; (56) [239] + <MCALL 1 RET-TMP-AC> +TAG69 <MOVE B* (FRM) 228> ; 995 (228) + <JUMPE B* TAG70> +TAG71 <MOVE D* (B) 1> ; 997 + <SKIPGE |INTFLG > + <SAVAC O* [<(*1200*) *150000*>]> + <MOVE PVP* <MQUOTE %<RGLOC MBINDERS!-MAPGEN!-PACKAGE T>>> + <ADD PVP* |GLOTOP 1> + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (FRM) 5> ; (5) + <MOVEM B* (FRM) 6> ; (6) + <MOVE A* (PVP) > + <MOVE B* (PVP) 1> + <MOVE C* (D) 7> + <MOVE O* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>> + <MOVEM O* (FRM) 1> ; (1) + <MOVEM D* (FRM) 2> ; (2) + <PUSHJ P* |CINTH > + <PUSH TP* A> ; [238] + <PUSH TP* B> ; [239] + <PUSH TP* (FRM) 1> ; (1) [240] + <PUSH TP* (FRM) 2> ; (2) [241] + <MCALL 2 APPLY> + <MOVE B* (FRM) 6> ; (6) + <HRRZ B* (B) > + <JUMPN B* TAG71> + <JRST TAG70> +TAG67 <MOVE D* (FRM) 228> ; 1021 (228) + <JUMPE D* |CERR2 > + <MOVE PVP* (D) 1> + <GETYP O* (PVP) 14> + <CAIE O* <MQUOTE %<TYPE-C TEMPV!-COMPDEC!-PACKAGE LIST>>> + <JRST TAG72> + <MOVE TVP* <MQUOTE TEMPV!-COMPDEC!-PACKAGE>> + <MOVE C* <TYPE-WORD ATOM>> + <JRST TAG73> +TAG72 <MOVE C* <TYPE-WORD FALSE>> ; 1030 + <MOVEI TVP* 0> +TAG73 <MOVEM C* (FRM) 21> ; 1032 (21) + <MOVEM TVP* (FRM) 22> ; (22) + <GETYP O* (FRM) 193> ; (193) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG74> + <GETYP O* (FRM) 13> ; (13) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG75> + <GETYP O* (FRM) 57> ; (57) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG76> + <PUSH TP* (FRM) 57> ; (57) [238] + <PUSH TP* (FRM) 58> ; (58) [239] + <GETYP O* (FRM) 175> ; (175) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG77> + <MOVSI E* <TYPE-CODE FORM>> + <JRST TAG78> +TAG77 <MOVSI E* <TYPE-CODE TIME>> ; 1050 +TAG78 <PUSH TP* <MQUOTE %<TYPE-W OPCODE!-OP!-PACKAGE WORD>>>; 1051 [240] + <PUSH TP* E> ; [241] + <GETYP O* (FRM) 175> ; (175) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG79> + <MOVEI E* 1 > + <JRST TAG80> +TAG79 <MOVEI E* 0> ; 1058 +TAG80 <PUSH TP* <TYPE-WORD FIX>> ; 1059 [242] + <PUSH TP* E> ; [243] + <MCALL 3 ADDRESS:C> + <MOVEM A* (FRM) 3> ; (3) + <MOVEM B* (FRM) 4> ; (4) + <GETYP O* (FRM) 21> ; (21) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG74> + <PUSH TP* (FRM) 57> ; (57) [238] + <PUSH TP* (FRM) 58> ; (58) [239] + <PUSH TP* <TYPE-WORD FIX>> ; [240] + <PUSH TP* [2]> ; [241] + <MOVEI A* 2 > + <PUSHJ P* |CPLUS > + <MOVEM A* (FRM) 57> ; (57) + <MOVEM B* (FRM) 58> ; (58) + <JRST TAG74> +TAG76 <MOVE E* (FRM) 230> ; 1076 (230) + <PUSH TP* <TYPE-WORD FIX>> ; [238] + <PUSH TP* (E) 1> ; [239] + <PUSH TP* (FRM) 55> ; (55) [240] + <PUSH TP* (FRM) 56> ; (56) [241] + <PUSH TP* <MQUOTE VECTOR> -1> ; [242] + <PUSH TP* <MQUOTE VECTOR>> ; [243] + <HRRZ A* (E) > + <MOVE B* (A) 1> + <MOVE A* <TYPE-WORD LIST>> + <PUSH P* [0]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <PUSH TP* (FRM) 123> ; (123) [244] + <PUSH TP* (FRM) 124> ; (124) [245] + <PUSH TP* (FRM) 95> ; (95) [246] + <PUSH TP* (FRM) 96> ; (96) [247] + <MCALL 2 STACK:L> + <MOVEI O* |SEGLST > + <PUSHJ P* |RCALL > + <SUB P* [<(1) 1>]> + <PUSH TP* A> ; [244] + <PUSH TP* B> ; [245] + <MCALL 4 SPEC-OFFPTR> + <MOVEM A* (FRM) 3> ; (3) + <MOVEM B* (FRM) 4> ; (4) + <GETYP O* (FRM) 21> ; (21) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG74> + <PUSH TP* <TYPE-WORD LIST>> ; [238] + <PUSH TP* (FRM) 230> ; (230) [239] + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 2 > + <MOVEI E* 0> + <PUSHJ P* |C1CONS > + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (FRM) 5> ; (5) + <MOVEM B* (FRM) 6> ; (6) + <MOVE D* (FRM) 232> ; (232) + <MOVN D* (D) 1> + <MOVE C* <TYPE-WORD FIX>> + <MOVEI E* 0> + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (FRM) 1> ; (1) + <MOVEM B* (FRM) 2> ; (2) + <PUSHJ P* |C1CONS > + <HRRM B* @ (FRM) 2> ; (2) + <MOVEM B* (FRM) 2> ; (2) + <PUSH TP* <MQUOTE -> -1> ; [240] + <PUSH TP* <MQUOTE ->> ; [241] + <PUSH TP* <TYPE-WORD FIX>> ; [242] + <PUSH TP* [0]> ; [243] + <MOVE B* (FRM) 232> ; (232) + <HRRZ D* (B) > + <MOVE A* <TYPE-WORD LIST>> + <MOVE B* (D) 1> + <PUSH P* [2]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <POP P* A> + <PUSHJ P* |IIFORM > + <MOVE C* A> + <MOVE D* B> + <MOVEI E* 0> + <PUSHJ P* |C1CONS > + <HRRM B* @ (FRM) 2> ; (2) + <MOVEM B* (FRM) 2> ; (2) + <PUSH TP* <TYPE-WORD LIST>> ; [240] + <PUSH TP* (FRM) 6> ; (6) [241] + <JRST TAG81> +TAG75 <PUSH TP* <MQUOTE -> -1> ; 1146 [238] + <PUSH TP* <MQUOTE ->> ; [239] + <MOVE E* (FRM) 230> ; (230) + <PUSH TP* <TYPE-WORD FIX>> ; [240] + <PUSH TP* (E) 1> ; [241] + <PUSH TP* (FRM) 123> ; (123) [242] + <PUSH TP* (FRM) 124> ; (124) [243] + <PUSH TP* (FRM) 95> ; (95) [244] + <PUSH TP* (FRM) 96> ; (96) [245] + <MCALL 2 STACK:L> + <PUSH P* [2]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <POP P* A> + <PUSHJ P* |IIFORM > + <PUSH TP* A> ; [238] + <PUSH TP* B> ; [239] + <PUSH TP* <MQUOTE %<TYPE-W OPCODE!-OP!-PACKAGE WORD>>>; [240] + <PUSH TP* [<(*13*) 0>]> ; [241] + <MOVE B* (FRM) 230> ; (230) + <HRRZ D* (B) > + <MOVE A* <TYPE-WORD LIST>> + <MOVE B* (D) 1> + <PUSH P* [2]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <POP P* A> + <ACALL A* ADDRESS:C> + <PUSH TP* <TYPE-WORD LIST>> ; [238] + <PUSH TP* (FRM) 230> ; (230) [239] + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 2 > + <MOVEI E* 0> + <MOVEM A* (FRM) 3> ; (3) + <MOVEM B* (FRM) 4> ; (4) + <PUSHJ P* |C1CONS > + <PUSH TP* A> ; [240] + <PUSH TP* B> ; [241] +TAG81 <MCALL 2 STFIXIT> ; 1184 + <MOVEM B* (FRM) 230> ; (230) +TAG74 <MOVE B* (FRM) 228> ; 1186 (228) + <JUMPE B* |CERR2 > + <MOVE D* (B) 1> + <MOVE PVP* (D) 7> + <CAIE PVP* 4 > + <JRST TAG82> + <PUSH TP* <MQUOTE ERROR> -1> ; [238] + <PUSH TP* <MQUOTE ERROR>> ; [239] + <PUSH TP* <MQUOTE "NOT IMPLEMENTED MAPF/R TUPLES "> -1>; [240] + <PUSH TP* <MQUOTE "NOT IMPLEMENTED MAPF/R TUPLES ">>; [241] + <MCALL 2 MESSAGE> +TAG82 <GETYP O* (FRM) 193> ; 1197 (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG83> + <PUSH TP* <MQUOTE +> -1> ; [238] + <PUSH TP* <MQUOTE +>> ; [239] + <MOVE A* (FRM) 233> ; (233) + <MOVE B* (FRM) 234> ; (234) + <PUSH P* [1]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <POP P* A> + <PUSHJ P* |IIFORM > + <MOVE C* A> + <MOVE D* B> + <MOVEI E* 0> + <PUSHJ P* |C1CONS > + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (FRM) 5> ; (5) + <MOVEM B* (FRM) 6> ; (6) + <JRST TAG84> +TAG83 <PUSH TP* <MQUOTE -> -1> ; 1217 [238] + <PUSH TP* <MQUOTE ->> ; [239] + <PUSH TP* <TYPE-WORD FIX>> ; [240] + <PUSH TP* [0]> ; [241] + <MOVE B* (FRM) 232> ; (232) + <PUSH TP* <TYPE-WORD FIX>> ; [242] + <PUSH TP* (B) 1> ; [243] + <HRRZ B* (B) > + <MOVE A* <TYPE-WORD LIST>> + <MOVE B* (B) 1> + <PUSH P* [3]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <POP P* A> + <PUSHJ P* |IIFORM > + <MOVE C* A> + <MOVE D* B> + <MOVEI E* 0> + <PUSHJ P* |C1CONS > + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (FRM) 5> ; (5) + <MOVEM B* (FRM) 6> ; (6) + <MOVE C* <TYPE-WORD LIST>> + <MOVEI D* 0> + <MOVEI E* 0> + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (FRM) 1> ; (1) + <MOVEM B* (FRM) 2> ; (2) + <PUSHJ P* |C1CONS > + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 0> + <MOVE E* B> + <PUSHJ P* |C1CONS > + <PUSH TP* A> ; [238] + <PUSH TP* B> ; [239] + <PUSH TP* (FRM) 123> ; (123) [240] + <PUSH TP* (FRM) 124> ; (124) [241] + <PUSH TP* (FRM) 95> ; (95) [242] + <PUSH TP* (FRM) 96> ; (96) [243] + <MCALL 2 STACK:L> + <PUSH TP* A> ; [240] + <PUSH TP* B> ; [241] + <MCALL 2 STFIXIT> + <MOVE C* <TYPE-WORD FIX>> + <MOVE D* (B) 1> + <MOVEI E* 0> + <MOVEM B* (FRM) 232> ; (232) + <PUSHJ P* |C1CONS > + <HRRM B* @ (FRM) 2> ; (2) + <MOVEM B* (FRM) 2> ; (2) + <MOVE B* (FRM) 232> ; (232) + <HRRZ D* (B) > + <MOVE PVP* (D) 1> + <HRRM PVP* @ (FRM) 2> ; (2) +TAG84 <MOVE D* (FRM) 6> ; 1271 (6) + <MOVE C* <TYPE-WORD LIST>> + <MOVEI E* 0> + <PUSHJ P* |C1CONS > + <MOVE D* (FRM) 102> ; (102) + <JUMPE D* |CERR2 > + <MOVE C* <TYPE-WORD ATOM>> + <MOVE D* (D) 1> + <MOVE E* B> + <PUSHJ P* |C1CONS > + <PUSH TP* A> ; [238] + <PUSH TP* B> ; [239] + <MOVE A* (FRM) 159> ; (159) + <MOVE B* (FRM) 160> ; (160) + <PUSH P* [1]> + <MOVEI O* |SEGLST > + <PUSHJ P* |RCALL > + <SUB P* [<(1) 1>]> + <MOVEM A* (FRM) 159> ; (159) + <MOVEM B* (FRM) 160> ; (160) + <GETYP O* (FRM) 193> ; (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG85> + <MOVE D* (FRM) 224> ; (224) + <JUMPE D* |CERR2 > + <MOVE PVP* (D) 1> + <PUSH TP* (PVP) 4> ; [238] + <PUSH TP* (PVP) 5> ; [239] + <MOVE A* (FRM) 225> ; (225) + <MOVE B* (FRM) 226> ; (226) + <MOVEI C* 1 > + <PUSHJ P* |CINTH > + <PUSH TP* A> ; [240] + <PUSH TP* B> ; [241] + <MOVE B* (FRM) 228> ; (228) + <JUMPE B* |CERR2 > + <PUSH TP* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>>; [242] + <PUSH TP* (B) 1> ; [243] + <PUSH TP* (FRM) 91> ; (91) [244] + <PUSH TP* (FRM) 92> ; (92) [245] + <MOVE D* (FRM) 102> ; (102) + <JUMPE D* |CERR2 > + <PUSH TP* <TYPE-WORD ATOM>> ; [246] + <PUSH TP* (D) 1> ; [247] + <PUSH TP* (FRM) 15> ; (15) [248] + <PUSH TP* (FRM) 16> ; (16) [249] + <PUSH TP* (FRM) 81> ; (81) [250] + <PUSH TP* (FRM) 82> ; (82) [251] + <PUSH TP* (FRM) 111> ; (111) [252] + <PUSH TP* (FRM) 112> ; (112) [253] + <MCALL *10* ISET> + <MOVE A* (FRM) 225> ; (225) + <MOVE B* (FRM) 226> ; (226) + <MOVEI C* 1 > + <PUSHJ P* |CIREST > + <PUSH TP* (FRM) 123> ; (123) [238] + <PUSH TP* (FRM) 124> ; (124) [239] + <PUSH TP* (FRM) 213> ; (213) [240] + <PUSH TP* (FRM) 214> ; (214) [241] + <MOVEM A* (FRM) 225> ; (225) + <MOVEM B* (FRM) 226> ; (226) + <MCALL 2 STACK:L> + <MOVEM A* (FRM) 233> ; (233) + <MOVEM B* (FRM) 234> ; (234) + <JRST TAG86> +TAG85 <GETYP O* (FRM) 21> ; 1336 (21) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG87> + <PUSH TP* (FRM) 63> ; (63) [238] + <PUSH TP* (FRM) 64> ; (64) [239] + <PUSH TP* (FRM) 123> ; (123) [240] + <PUSH TP* (FRM) 124> ; (124) [241] + <MCALL 2 RETURN-UP> + <MOVE B* (FRM) 224> ; (224) + <JUMPE B* |CERR2 > + <MOVE D* (B) 1> + <PUSH TP* (D) 4> ; [238] + <PUSH TP* (D) 5> ; [239] + <MOVE PVP* (FRM) 228> ; (228) + <JUMPE PVP* |CERR2 > + <PUSH TP* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>>; [240] + <PUSH TP* (PVP) 1> ; [241] + <PUSH TP* <MQUOTE %<TYPE-W NODE!-COMPDEC!-PACKAGE VECTOR>>>; [242] + <PUSH TP* D> ; [243] + <PUSH TP* (FRM) 3> ; (3) [244] + <PUSH TP* (FRM) 4> ; (4) [245] + <PUSH TP* (FRM) 3> ; (3) [246] + <PUSH TP* (FRM) 4> ; (4) [247] + <MCALL 2 DATUM> + <PUSH TP* A> ; [244] + <PUSH TP* B> ; [245] + <PUSH TP* (FRM) 91> ; (91) [246] + <PUSH TP* (FRM) 92> ; (92) [247] + <MOVE B* (FRM) 102> ; (102) + <JUMPE B* |CERR2 > + <PUSH TP* <TYPE-WORD ATOM>> ; [248] + <PUSH TP* (B) 1> ; [249] + <PUSH TP* (FRM) 69> ; (69) [250] + <PUSH TP* (FRM) 70> ; (70) [251] + <MCALL 5 STACKM> + <PUSH TP* A> ; [242] + <PUSH TP* B> ; [243] + <PUSH TP* (FRM) 91> ; (91) [244] + <PUSH TP* (FRM) 92> ; (92) [245] + <MCALL 4 IISET> + <JRST TAG86> +TAG87 <MOVE D* (FRM) 228> ; 1377 (228) + <JUMPE D* |CERR2 > + <PUSH TP* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>>; [238] + <PUSH TP* (D) 1> ; [239] + <MOVE PVP* (FRM) 224> ; (224) + <JUMPE PVP* |CERR2 > + <PUSH TP* <MQUOTE %<TYPE-W NODE!-COMPDEC!-PACKAGE VECTOR>>>; [240] + <PUSH TP* (PVP) 1> ; [241] + <PUSH TP* (FRM) 3> ; (3) [242] + <PUSH TP* (FRM) 4> ; (4) [243] + <PUSH TP* (FRM) 3> ; (3) [244] + <PUSH TP* (FRM) 4> ; (4) [245] + <MCALL 2 DATUM> + <PUSH TP* A> ; [242] + <PUSH TP* B> ; [243] + <PUSH TP* (FRM) 91> ; (91) [244] + <PUSH TP* (FRM) 92> ; (92) [245] + <MOVE B* (FRM) 102> ; (102) + <JUMPE B* |CERR2 > + <PUSH TP* <TYPE-WORD ATOM>> ; [246] + <PUSH TP* (B) 1> ; [247] + <PUSH TP* (FRM) 69> ; (69) [248] + <PUSH TP* (FRM) 70> ; (70) [249] + <MCALL 5 STACKM> + <PUSH TP* A> ; [240] + <PUSH TP* B> ; [241] + <MCALL 2 BINDUP> +TAG86 <MOVE B* (FRM) 102> ; 1404 (102) + <JUMPE B* |CERR2 > + <HRRZ B* (B) > + <MOVE D* (FRM) 224> ; (224) + <JUMPE D* |CERR2 > + <HRRZ D* (D) > + <MOVE PVP* (FRM) 228> ; (228) + <JUMPE PVP* |CERR2 > + <HRRZ PVP* (PVP) > + <MOVEM B* (FRM) 102> ; (102) + <MOVEM D* (FRM) 224> ; (224) + <MOVEM PVP* (FRM) 228> ; (228) + <JRST TAG88> +TAG70 <GETYP O* (FRM) 193> ; 1417 (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG89> + <GETYP O* (FRM) 15> ; (15) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG90> + <MOVE B* (FRM) 82> ; (82) + <SOJE B* TAG89> +TAG90 <GETYP O* (FRM) 199> ; 1425 (199) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG89> + <GETYP O* (FRM) 99> ; (99) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG89> + <MOVE O* (FRM) 17> ; (17) + <MOVEM O* (FRM) 223> ; (223) + <MOVE O* (FRM) 18> ; (18) + <MOVEM O* (FRM) 224> ; (224) + <MOVE B* (FRM) 224> ; (224) + <MOVE O* <MQUOTE T> -1> + <MOVEM O* (B) 26> + <MOVE O* <MQUOTE T>> + <MOVEM O* (B) 27> + <GETYP O* (B) 24> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG89> + <MOVE D* (B) 25> + <GETYP O* (D) 0> + <CAIE O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG91> + <PUSH TP* (D) > ; [238] + <PUSH TP* (D) 1> ; [239] + <PUSH TP* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>>; [240] + <PUSH TP* B> ; [241] + <MCALL 2 FLUSH-RESIDUE> +TAG91 <MOVE B* (FRM) 224> ; 1452 (224) + <MOVE D* (B) 25> + <HRRZ PVP* (D) > + <GETYP O* (PVP) 0> + <CAIE O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG92> + <HRRZ PVP* (D) > + <PUSH TP* (PVP) > ; [238] + <PUSH TP* (PVP) 1> ; [239] + <PUSH TP* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>>; [240] + <PUSH TP* B> ; [241] + <MCALL 2 FLUSH-RESIDUE> +TAG92 <MOVE B* (FRM) 224> ; 1464 (224) + <MOVE O* <TYPE-WORD FALSE>> + <MOVEM O* (B) 24> + <SETZM (B) 25> +TAG89 <GETYP O* (FRM) 193> ; 1468 (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG93> + <GETYP O* (FRM) 15> ; (15) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG93> + <MOVE B* (FRM) 82> ; (82) + <SOJN B* TAG93> + <GETYP O* (FRM) 199> ; (199) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG93> + <PUSH TP* (FRM) 17> ; (17) [238] + <PUSH TP* (FRM) 18> ; (18) [239] + <MCALL 1 LVAL-UP> +TAG93 <GETYP O* (FRM) 219> ; 1482 (219) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG94> + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(26) 26>]> + <JUMPGE B* |CERR2 > + <MOVE D* <TYPE-WORD FIX>> + <MOVE PVP* (B) 1> + <MOVEM D* (FRM) 39> ; (39) + <MOVEM PVP* (FRM) 40> ; (40) + <JUMPE PVP* TAG94> + <PUSH TP* D> ; [238] + <PUSH TP* PVP> ; [239] + <MCALL 1 SALLOC:SLOTS> + <PUSH TP* (FRM) 39> ; (39) [238] + <PUSH TP* (FRM) 40> ; (40) [239] + <MCALL 1 ADD:STACK> + <MOVE B* <MQUOTE T> -1> + <MOVE D* <MQUOTE T>> + <PUSH TP* B> ; [238] + <PUSH TP* D> ; [239] + <MOVEM B* (FRM) 219> ; (219) + <MOVEM D* (FRM) 220> ; (220) + <MCALL 1 EMIT-PRE> +TAG94 <MOVE B* (FRM) 64> ; 1506 (64) + <ADD B* [<(30) 30>]> + <JUMPGE B* |CERR2 > + <SKIPGE (B) 1> + <MCALL 0 ACT:FINAL> + <MOVE B* (FRM) 123> ; (123) + <MOVE D* (FRM) 124> ; (124) + <MOVEM B* (FRM) 135> ; (135) + <MOVEM D* (FRM) 136> ; (136) + <GETYP O* (FRM) 157> ; (157) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG95> + <MOVE PVP* (FRM) 64> ; (64) + <MOVEM PVP* (FRM) 142> ; (142) +TAG95 <MOVE E* (FRM) 124> ; 1520 (124) + <MOVE C* <TYPE-WORD FIX>> + <MOVEI D* 0> + <PUSHJ P* |C1CONS > + <MOVEM A* (FRM) 123> ; (123) + <MOVEM B* (FRM) 124> ; (124) + <GETYP O* (FRM) 207> ; (207) + <CAIE O* <TYPE-CODE FALSE>> + <MCALL 0 CALL-INTERRUPT> + <GETYP O* (FRM) 91> ; (91) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG96> + <GETYP O* (FRM) 13> ; (13) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG96> + <GETYP O* (FRM) 99> ; (99) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG96> + <GETYP O* (FRM) 199> ; (199) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG96> + <MOVE B* (FRM) 82> ; (82) + <SOJN B* TAG96> + <MOVE B* (FRM) 64> ; (64) + <PUSH TP* <TYPE-WORD LIST>> ; [238] + <PUSH TP* (B) 9> ; [239] + <ADD B* [<(20) 20>]> + <JUMPGE B* |CERR2 > + <PUSH TP* <TYPE-WORD LIST>> ; [240] + <PUSH TP* (B) 1> ; [241] + <MOVE B* (FRM) -2> ; (-2) + <JUMPE B* |CERR2 > + <MOVE D* (B) 1> + <PUSH TP* (D) 4> ; [242] + <PUSH TP* (D) 5> ; [243] + <MCALL 1 MINL> + <PUSH TP* A> ; [242] + <PUSH TP* B> ; [243] + <MCALL 3 BLT-HACK> + <JUMPGE B* TAG96> + <MOVE B* <TYPE-WORD FALSE>> + <MOVEI D* 0> + <MOVEM B* (FRM) 209> ; (209) + <MOVEM D* (FRM) 210> ; (210) + <JRST TAG97> +TAG96 <GETYP O* (FRM) 13> ; 1565 (13) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG98> + <GETYP O* (FRM) 99> ; (99) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG99> +TAG98 <MOVE B* (FRM) 64> ; 1571 (64) + <PUSH TP* <TYPE-WORD LIST>> ; [238] + <PUSH TP* (B) 9> ; [239] + <PUSH TP* <MQUOTE %<TYPE-W NODE!-COMPDEC!-PACKAGE VECTOR>>>; [240] + <PUSH TP* B> ; [241] + <PUSH TP* <MQUOTE DONT-CARE!-COMPDEC!-PACKAGE> -1>; [242] + <PUSH TP* <MQUOTE DONT-CARE!-COMPDEC!-PACKAGE>> ; [243] + <MCALL 2 GOODACS> + <PUSH TP* A> ; [240] + <PUSH TP* B> ; [241] + <PUSH TP* <MQUOTE T> -1> ; [242] + <PUSH TP* <MQUOTE T>> ; [243] + <MCALL 3 SEQ-GEN> +TAG103 <MOVEM A* (FRM) 11> ; 1584 (11) + <MOVEM B* (FRM) 12> ; (12) + <JRST TAG97> +TAG99 <GETYP O* (FRM) 199> ; 1587 (199) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG100> + <MOVE B* (FRM) 64> ; (64) + <PUSH TP* <TYPE-WORD LIST>> ; [238] + <PUSH TP* (B) 9> ; [239] + <GETYP O* (FRM) 193> ; (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG101> + <MOVE D* (FRM) 197> ; (197) + <MOVE PVP* (FRM) 198> ; (198) + <JRST TAG102> +TAG101 <PUSH TP* <MQUOTE -> -1> ; 1599 [240] + <PUSH TP* <MQUOTE ->> ; [241] + <PUSH TP* <TYPE-WORD FIX>> ; [242] + <PUSH TP* [-1]> ; [243] + <MOVE D* (FRM) 82> ; (82) + <ASH D* A> + <PUSH TP* <TYPE-WORD FIX>> ; [244] + <PUSH TP* D> ; [245] + <PUSH TP* (FRM) 123> ; (123) [246] + <PUSH TP* (FRM) 124> ; (124) [247] + <PUSH TP* (FRM) 95> ; (95) [248] + <PUSH TP* (FRM) 96> ; (96) [249] + <MCALL 2 STACK:L> + <PUSH P* [3]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <POP P* A> + <PUSHJ P* |IIFORM > + <PUSH TP* A> ; [240] + <PUSH TP* B> ; [241] + <PUSH TP* <MQUOTE %<TYPE-W OPCODE!-OP!-PACKAGE WORD>>>; [242] + <PUSH TP* [<(*13*) 0>]> ; [243] + <MCALL 2 ADDRESS:C> + <PUSH TP* A> ; [240] + <PUSH TP* B> ; [241] + <PUSH TP* A> ; [242] + <PUSH TP* B> ; [243] + <MCALL 2 DATUM> + <MOVE D* A> + <MOVE PVP* B> +TAG102 <PUSH TP* D> ; 1629 [240] + <PUSH TP* PVP> ; [241] + <PUSH TP* <MQUOTE T> -1> ; [242] + <PUSH TP* <MQUOTE T>> ; [243] + <MCALL 3 SEQ-GEN> + <MOVEM A* (FRM) 197> ; (197) + <MOVEM B* (FRM) 198> ; (198) + <JRST TAG103> +TAG100 <MOVE B* (FRM) 64> ; 1637 (64) + <PUSH TP* <TYPE-WORD LIST>> ; [238] + <PUSH TP* (B) 9> ; [239] + <PUSH TP* <MQUOTE FLUSHED!-COMPDEC!-PACKAGE> -1> ; [240] + <PUSH TP* <MQUOTE FLUSHED!-COMPDEC!-PACKAGE>> ; [241] + <PUSH TP* <MQUOTE T> -1> ; [242] + <PUSH TP* <MQUOTE T>> ; [243] + <MCALL 3 SEQ-GEN> + <PUSH TP* A> ; [238] + <PUSH TP* B> ; [239] + <MOVEM A* (FRM) 11> ; (11) + <MOVEM B* (FRM) 12> ; (12) + <MCALL 1 RET-TMP-AC> +TAG97 <GETYP O* (FRM) 209> ; 1650 (209) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG104> + <MOVE B* <MQUOTE %<RGLOC NO-DATUM!-COMPDEC!-PACKAGE T>>> + <ADD B* |GLOTOP 1> + <MOVE D* (B) > + <MOVE PVP* (B) 1> + <GETYP O* (FRM) 11> ; (11) + <GETYP B* D> + <CAMN PVP* (FRM) 12> ; (12) + <CAIE O* (B) 0> + <SKIPA O> + <JRST TAG104> + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(30) 30>]> + <JUMPGE B* |CERR2 > + <SKIPL (B) 1> + <JRST TAG105> + <MCALL 0 PROG:END> + <PUSH TP* (FRM) 7> ; (7) [238] + <PUSH TP* (FRM) 8> ; (8) [239] + <MCALL 1 LABEL:OFF> + <JRST TAG106> +TAG105 <GETYP O* (FRM) 157> ; 1673 (157) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG107> + <GETYP O* (FRM) 13> ; (13) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG108> +TAG107 <SKIPL (FRM) 46> ; 1679 (46) + <JRST TAG109> + <GETYP O* (FRM) 157> ; (157) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG109> + <PUSH TP* (FRM) 11> ; (11) [238] + <PUSH TP* (FRM) 12> ; (12) [239] + <MOVE B* <MQUOTE %<RGLOC AC-A!-COMPDEC!-PACKAGE T>>> + <ADD B* |GLOTOP 1> + <PUSH TP* <MQUOTE %<TYPE-W AC!-COMPDEC!-PACKAGE VECTOR>>>; [240] + <PUSH TP* (B) 1> ; [241] + <MOVE B* <MQUOTE %<RGLOC AC-B!-COMPDEC!-PACKAGE T>>> + <ADD B* |GLOTOP 1> + <PUSH TP* <MQUOTE %<TYPE-W AC!-COMPDEC!-PACKAGE VECTOR>>>; [242] + <PUSH TP* (B) 1> ; [243] + <MCALL 2 DATUM> + <PUSH TP* A> ; [240] + <PUSH TP* B> ; [241] + <MCALL 2 MOVE:ARG> + <MOVEM A* (FRM) 11> ; (11) + <MOVEM B* (FRM) 12> ; (12) +TAG109 <PUSH TP* (FRM) 123> ; 1700 (123) [238] + <PUSH TP* (FRM) 124> ; (124) [239] + <PUSH TP* (FRM) 95> ; (95) [240] + <PUSH TP* (FRM) 96> ; (96) [241] + <MCALL 2 POP:LOCS> + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(22) 22>]> + <JUMPGE B* |CERR2 > + <PUSH TP* <TYPE-WORD FIX>> ; [238] + <PUSH TP* (B) 1> ; [239] + <MOVE A* (FRM) 31> ; (31) + <MOVE B* (FRM) 32> ; (32) + <PUSH P* [1]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <POP P* A> + <ACALL A* UNBIND:FUNNY> + <JRST TAG106> +TAG108 <PUSH TP* (FRM) 123> ; 1718 (123) [238] + <PUSH TP* (FRM) 124> ; (124) [239] + <PUSH TP* (FRM) 51> ; (51) [240] + <PUSH TP* (FRM) 52> ; (52) [241] + <MCALL 2 UNBIND:LOCS> +TAG106 <GETYP O* (FRM) 13> ; 1723 (13) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG110> + <PUSH TP* (FRM) 153> ; (153) [238] + <PUSH TP* (FRM) 154> ; (154) [239] + <PUSH TP* (FRM) 11> ; (11) [240] + <PUSH TP* (FRM) 12> ; (12) [241] + <MCALL 2 DO-STACK-ARGS> + <JRST TAG111> +TAG110 <GETYP O* (FRM) 193> ; 1732 (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG112> + <GETYP O* (FRM) 99> ; (99) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG112> + <GETYP O* (FRM) 219> ; (219) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG113> + <MOVE B* (FRM) 31> ; (31) + <MOVE D* (FRM) 32> ; (32) + <JUMPE D* |CERR2 > + <HRRZ PVP* (D) > + <MOVE TVP* (FRM) 123> ; (123) + <MOVE C* (FRM) 124> ; (124) + <MOVE E* (FRM) 52> ; (52) + <MOVEM B* (FRM) 19> ; (19) + <MOVEM D* (FRM) 20> ; (20) + <MOVEM E* (FRM) 102> ; (102) + <MOVEM PVP* (FRM) 10> ; (10) +TAG113 <PUSH TP* (FRM) 11> ; 1752 (11) [238] + <PUSH TP* (FRM) 12> ; (12) [239] + <PUSH TP* (FRM) 17> ; (17) [240] + <PUSH TP* (FRM) 18> ; (18) [241] + <PUSH TP* (FRM) 25> ; (25) [242] + <PUSH TP* (FRM) 26> ; (26) [243] + <PUSH TP* (FRM) 59> ; (59) [244] + <PUSH TP* (FRM) 60> ; (60) [245] + <PUSH TP* (FRM) 63> ; (63) [246] + <PUSH TP* (FRM) 64> ; (64) [247] + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(60) 60>]> + <JUMPGE B* |CERR2 > + <PUSH TP* <TYPE-WORD LIST>> ; [248] + <PUSH TP* (B) 1> ; [249] + <MCALL 6 DO-EVEN-FUNNIER-HACK> + <JRST TAG111> +TAG112 <GETYP O* (FRM) 193> ; 1769 (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG114> + <GETYP O* (FRM) 199> ; (199) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG114> + <PUSH TP* (FRM) 11> ; (11) [238] + <PUSH TP* (FRM) 12> ; (12) [239] + <MCALL 1 RET-TMP-AC> + <MOVE B* (FRM) 18> ; (18) + <MOVE O* (FRM) 11> ; (11) + <MOVEM O* (B) 24> + <MOVE O* (FRM) 12> ; (12) + <MOVEM O* (B) 25> + <MOVE O* <TYPE-WORD FALSE>> + <MOVEM O* (B) 26> + <SETZM (B) 27> + <MOVE D* (FRM) 12> ; (12) + <GETYP O* (D) 0> + <CAIE O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG115> + <MOVE PVP* (D) 1> + <MOVE E* (PVP) 15> + <MOVE C* <MQUOTE %<TYPE-W SYMTAB!-COMPDEC!-PACKAGE VECTOR>>> + <MOVE D* B> + <MOVE O* <MQUOTE %<TYPE-W AC!-COMPDEC!-PACKAGE VECTOR>>> + <MOVEM O* (FRM) 3> ; (3) + <MOVEM PVP* (FRM) 4> ; (4) + <PUSHJ P* |C1CONS > + <MOVE D* (FRM) 4> ; (4) + <MOVEM A* (D) 14> + <MOVEM B* (D) 15> +TAG115 <MOVE B* (FRM) 12> ; 1801 (12) + <HRRZ D* (B) > + <MOVE PVP* (D) 1> + <MOVE E* (PVP) 15> + <MOVE C* (FRM) 17> ; (17) + <MOVE D* (FRM) 18> ; (18) + <MOVE O* <MQUOTE %<TYPE-W AC!-COMPDEC!-PACKAGE VECTOR>>> + <MOVEM O* (FRM) 3> ; (3) + <MOVEM PVP* (FRM) 4> ; (4) + <PUSHJ P* |C1CONS > + <MOVE D* (FRM) 4> ; (4) + <MOVEM A* (D) 14> + <MOVEM B* (D) 15> + <MOVE B* (FRM) 18> ; (18) + <MOVE O* <TYPE-WORD FALSE>> + <MOVEM O* (B) 26> + <SETZM (B) 27> + <MOVE D* (FRM) 64> ; (64) + <ADD D* [<(60) 60>]> + <JUMPGE D* |CERR2 > + <MOVE PVP* (D) 1> + <JUMPE PVP* TAG116> +TAG117 <GETYP O* (PVP) 0> ; 1823 + <CAIN O* <MQUOTE %<TYPE-C SYMTAB!-COMPDEC!-PACKAGE VECTOR>>> + <CAME B* (PVP) 1> + <SKIPA O> + <JRST TAG111> + <HRRZ PVP* (PVP) > + <JUMPN PVP* TAG117> +TAG116 <MOVE D* (FRM) 64> ; 1830 (64) + <ADD D* [<(60) 60>]> + <JUMPGE D* |CERR2 > + <MOVE PVP* (D) 1> +TAG121 <SKIPGE |INTFLG > ; 1834 + <SAVAC O* [<(*1500*) *12*>]> + <JUMPE PVP* TAG118> + <JUMPE PVP* |CERR2 > + <HRRZ D* (PVP) > + <JUMPE D* |CERR2 > + <MOVE TVP* (D) 1> + <HRRZ D* (TVP) > + <GETYP O* (D) 0> + <CAIE O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG119> + <HRRZ D* (TVP) > + <MOVE C* (D) 1> + <MOVE O* <MQUOTE T> -1> + <MOVEM O* (C) 10> + <MOVE O* <MQUOTE T>> + <MOVEM O* (C) 11> +TAG119 <GETYP O* (TVP) 0> ; 1851 + <CAIE O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG120> + <MOVE D* (TVP) 1> + <MOVE O* <MQUOTE T> -1> + <MOVEM O* (D) 10> + <MOVE O* <MQUOTE T>> + <MOVEM O* (D) 11> +TAG120 <JUMPE PVP* |CERR2 > ; 1859 + <HRRZ PVP* (PVP) > + <JUMPE PVP* |CERR2 > + <HRRZ PVP* (PVP) > + <JRST TAG121> +TAG118 <MOVE B* (FRM) 64> ; 1864 (64) + <MOVE C* (FRM) 17> ; (17) + <MOVE D* (FRM) 18> ; (18) + <MOVEI E* 0> + <MOVE O* <MQUOTE %<TYPE-W NODE!-COMPDEC!-PACKAGE VECTOR>>> + <MOVEM O* (FRM) 3> ; (3) + <MOVEM B* (FRM) 4> ; (4) + <PUSHJ P* |C1CONS > + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (FRM) 1> ; (1) + <MOVEM B* (FRM) 2> ; (2) + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (FRM) 7> ; (7) + <MOVEM B* (FRM) 8> ; (8) + <MOVE O* <TYPE-WORD UNBOUND>> + <MOVEM O* (FRM) 223> ; (223) + <SETOM (FRM) 224> ; (224) + <MOVE D* (FRM) 26> ; (26) + <PUSH TP* (D) 4> ; [238] + <PUSH TP* (D) 5> ; [239] + <MCALL 1 ISTYPE-GOOD?> + <GETYP O* A> + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG122> + <GETYP O* (FRM) -5> ; (-5) + <CAIE O* <MQUOTE %<TYPE-C DATUM!-COMPDEC!-PACKAGE LIST>>> + <JRST TAG123> + <MOVE B* (FRM) -4> ; (-4) + <MOVE D* (B) > + <MOVE PVP* (B) 1> + <MOVEM D* (FRM) 223> ; (223) + <MOVEM PVP* (FRM) 224> ; (224) + <GETYP O* D> + <CAIN O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <SKIPGE (PVP) 11> + <JRST TAG123> + <PUSH TP* (FRM) 223> ; (223) [238] + <PUSH TP* (FRM) 224> ; (224) [239] + <PUSH TP* <TYPE-WORD FALSE>> ; [240] + <PUSH TP* [0]> ; [241] + <MCALL 2 SGETREG> + <MOVE O* <MQUOTE T> -1> + <MOVEM O* (B) 10> + <MOVE O* <MQUOTE T>> + <MOVEM O* (B) 11> + <JRST TAG122> +TAG123 <PUSH TP* <TYPE-WORD FALSE>> ; 1910 [238] + <PUSH TP* [0]> ; [239] + <MCALL 1 GETREG> + <MOVE O* <MQUOTE T> -1> + <MOVEM O* (B) 10> + <MOVE O* <MQUOTE T>> + <MOVEM O* (B) 11> + <MOVEM A* (FRM) 223> ; (223) + <MOVEM B* (FRM) 224> ; (224) +TAG122 <PUSH TP* A> ; 1919 [238] + <PUSH TP* B> ; [239] + <GETYP O* (FRM) -5> ; (-5) + <CAIE O* <MQUOTE %<TYPE-C DATUM!-COMPDEC!-PACKAGE LIST>>> + <JRST TAG124> + <MOVE B* (FRM) -4> ; (-4) + <HRRZ D* (B) > + <MOVE PVP* (D) > + <MOVE TVP* (D) 1> + <MOVEM PVP* (FRM) 5> ; (5) + <MOVEM TVP* (FRM) 6> ; (6) + <GETYP O* PVP> + <CAIN O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <SKIPGE (TVP) 11> + <JRST TAG124> + <PUSH TP* (FRM) 5> ; (5) [240] + <PUSH TP* (FRM) 6> ; (6) [241] + <PUSH TP* <TYPE-WORD FALSE>> ; [242] + <PUSH TP* [0]> ; [243] + <MCALL 2 SGETREG> + <JRST TAG125> +TAG124 <PUSH TP* <TYPE-WORD FALSE>> ; 1940 [240] + <PUSH TP* [0]> ; [241] + <MCALL 1 GETREG> + <MOVEM A* (FRM) 5> ; (5) + <MOVEM B* (FRM) 6> ; (6) +TAG125 <PUSH TP* A> ; 1945 [240] + <PUSH TP* B> ; [241] + <MCALL 2 DATUM> + <GETYP O* (FRM) 223> ; (223) + <CAIN O* <TYPE-CODE UNBOUND>> + <JRST TAG126> + <GETYP O* (FRM) 223> ; (223) + <CAIN O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <MOVE D* <MQUOTE AC!-COMPDEC!-PACKAGE>> + <MOVE D* (FRM) 224> ; (224) + <MOVE O* <TYPE-WORD FALSE>> + <MOVEM O* (D) 10> + <SETZM (D) 11> +TAG126 <MOVE C* A> ; 1958 + <MOVE D* B> + <MOVEI E* 0> + <PUSHJ P* |CICONS > + <HRRM B* @ (FRM) 8> ; (8) + <MOVEM B* (FRM) 8> ; (8) + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(60) 60>]> + <JUMPGE B* |CERR2 > + <MOVE D* (B) 1> + <HRRM D* @ (FRM) 8> ; (8) + <MOVE B* (FRM) 4> ; (4) + <ADD B* [<(60) 60>]> + <JUMPGE B* |CERR2 > + <MOVE O* (FRM) 2> ; (2) + <MOVEM O* (B) 1> +TAG129 <SKIPGE |INTFLG > ; 1974 + <SAVAC O* [*120000*]> + <JUMPE D* TAG111> + <JUMPE D* |CERR2 > + <HRRZ B* (D) > + <JUMPE B* |CERR2 > + <MOVE PVP* (B) 1> + <HRRZ B* (PVP) > + <GETYP O* (B) 0> + <CAIE O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG127> + <HRRZ B* (PVP) > + <MOVE TVP* (B) 1> + <MOVE O* <TYPE-WORD FALSE>> + <MOVEM O* (TVP) 10> + <SETZM (TVP) 11> +TAG127 <GETYP O* (PVP) 0> ; 1990 + <CAIE O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG128> + <MOVE B* (PVP) 1> + <MOVE O* <TYPE-WORD FALSE>> + <MOVEM O* (B) 10> + <SETZM (B) 11> +TAG128 <JUMPE D* |CERR2 > ; 1997 + <HRRZ D* (D) > + <JUMPE D* |CERR2 > + <HRRZ D* (D) > + <JRST TAG129> +TAG114 <GETYP O* (FRM) 99> ; 2002 (99) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG111> + <PUSH TP* (FRM) 11> ; (11) [238] + <PUSH TP* (FRM) 12> ; (12) [239] + <MOVE C* <TYPE-WORD LIST>> + <MOVEI D* 0> + <MOVEI E* 0> + <PUSHJ P* |C1CONS > + <MOVE D* (FRM) 82> ; (82) + <IMUL D* [-2]> + <MOVE C* <TYPE-WORD FIX>> + <MOVE E* B> + <PUSHJ P* |C1CONS > + <PUSH TP* A> ; [240] + <PUSH TP* B> ; [241] + <PUSH TP* (FRM) 25> ; (25) [242] + <PUSH TP* (FRM) 26> ; (26) [243] + <PUSH TP* (FRM) 59> ; (59) [244] + <PUSH TP* (FRM) 60> ; (60) [245] + <PUSH TP* (FRM) 63> ; (63) [246] + <PUSH TP* (FRM) 64> ; (64) [247] + <MCALL 5 DO-FUNNY-HACK> +TAG111 <GETYP O* (FRM) 75> ; 2025 (75) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG130> + <PUSH TP* <MQUOTE %<TYPE-W OPCODE!-OP!-PACKAGE WORD>>>; [238] + <PUSH TP* [<(*402000*) 0>]> ; [239] + <PUSH TP* (FRM) 69> ; (69) [240] + <PUSH TP* (FRM) 70> ; (70) [241] + <PUSH TP* <MQUOTE %<TYPE-W OPCODE!-OP!-PACKAGE WORD>>>; [242] + <PUSH TP* [<(*17*) 0>]> ; [243] + <MOVEI A* 3 > + <PUSHJ P* |IIFORM > + <PUSH TP* A> ; [238] + <PUSH TP* B> ; [239] + <MCALL 1 EMIT> +TAG130 <GETYP O* (FRM) 219> ; 2039 (219) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG104> + <GETYP O* (FRM) 193> ; (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG131> + <GETYP O* (FRM) 99> ; (99) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG104> +TAG131 <MOVE B* (FRM) 31> ; 2048 (31) + <MOVE D* (FRM) 32> ; (32) + <JUMPE D* |CERR2 > + <HRRZ PVP* (D) > + <MOVE TVP* (FRM) 52> ; (52) + <MOVEM B* (FRM) 19> ; (19) + <MOVEM D* (FRM) 20> ; (20) + <MOVEM PVP* (FRM) 10> ; (10) + <MOVEM TVP* (FRM) 102> ; (102) +TAG104 <GETYP O* (FRM) 209> ; 2057 (209) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG132> + <PUSH TP* (FRM) 63> ; (63) [238] + <PUSH TP* (FRM) 64> ; (64) [239] + <MOVE B* (FRM) 193> ; (193) + <MOVE D* (FRM) 194> ; (194) + <GETYP O* B> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG133> + <MOVE PVP* (FRM) 82> ; (82) + <SOJN PVP* TAG134> + <MOVE B* <MQUOTE T> -1> + <MOVE D* <MQUOTE T>> + <JRST TAG133> +TAG134 <MOVE B* <TYPE-WORD FALSE>> ; 2072 + <MOVEI D* 0> +TAG133 <PUSH TP* B> ; 2074 [240] + <PUSH TP* D> ; [241] + <MCALL 2 AGAIN-UP> + <PUSH TP* (FRM) 203> ; (203) [238] + <PUSH TP* (FRM) 204> ; (204) [239] + <MCALL 1 LABEL:TAG> + <GETYP O* (FRM) 193> ; (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG135> + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(20) 20>]> + <JUMPGE B* |CERR2 > + <PUSH TP* <TYPE-WORD LIST>> ; [238] + <PUSH TP* (B) 1> ; [239] + <PUSH TP* <TYPE-WORD LIST>> ; [240] + <PUSH TP* (FRM) -2> ; (-2) [241] + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(60) 60>]> + <JUMPGE B* |CERR2 > + <PUSH TP* <TYPE-WORD LIST>> ; [242] + <PUSH TP* (B) 1> ; [243] + <PUSH TP* (FRM) 81> ; (81) [244] + <PUSH TP* (FRM) 82> ; (82) [245] + <PUSH TP* (FRM) 111> ; (111) [246] + <PUSH TP* (FRM) 112> ; (112) [247] + <PUSH TP* (FRM) 91> ; (91) [248] + <PUSH TP* (FRM) 92> ; (92) [249] + <MCALL 6 REST-STRUCS> +TAG135 <GETYP O* (FRM) 193> ; 2102 (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG136> + <MOVE B* (FRM) 82> ; (82) + <SOJE B* TAG137> +TAG136 <PUSH TP* (FRM) 107> ; 2107 (107) [238] + <PUSH TP* (FRM) 108> ; (108) [239] + <MCALL 1 BRANCH:TAG> +TAG137 <PUSH TP* (FRM) 159> ; 2110 (159) [238] + <PUSH TP* (FRM) 160> ; (160) [239] + <PUSH TP* (FRM) 45> ; (45) [240] + <PUSH TP* (FRM) 46> ; (46) [241] + <MCALL 2 GEN-TAGS> + <GETYP O* (FRM) 193> ; (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG138> + <GETYP O* (FRM) 219> ; (219) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG138> + <MOVE B* (FRM) 214> ; (214) + <MOVE D* (FRM) 20> ; (20) + <MOVEM B* (FRM) 124> ; (124) + <MOVEM D* (FRM) 32> ; (32) +TAG138 <GETYP O* (FRM) 193> ; 2125 (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG139> + <MOVE B* (FRM) 82> ; (82) + <SOJE B* TAG139> + <GETYP O* (FRM) 157> ; (157) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG140> + <GETYP O* (FRM) 13> ; (13) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG141> +TAG140 <PUSH TP* (FRM) 123> ; 2136 (123) [238] + <PUSH TP* (FRM) 124> ; (124) [239] + <PUSH TP* (FRM) 95> ; (95) [240] + <PUSH TP* (FRM) 96> ; (96) [241] + <MCALL 2 POP:LOCS> + <MOVE B* (FRM) 64> ; (64) + <ADD B* [<(22) 22>]> + <JUMPGE B* |CERR2 > + <PUSH TP* <TYPE-WORD FIX>> ; [238] + <PUSH TP* (B) 1> ; [239] + <MOVE A* (FRM) 31> ; (31) + <MOVE B* (FRM) 32> ; (32) + <PUSH P* [1]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <POP P* A> + <ACALL A* UNBIND:FUNNY> + <JRST TAG139> +TAG141 <PUSH TP* (FRM) 123> ; 2154 (123) [238] + <PUSH TP* (FRM) 124> ; (124) [239] + <PUSH TP* (FRM) 51> ; (51) [240] + <PUSH TP* (FRM) 52> ; (52) [241] + <MCALL 2 UNBIND:LOCS> +TAG139 <MOVE B* (FRM) -2> ; 2159 (-2) + <JUMPE B* TAG142> +TAG144 <MOVE D* (B) 1> ; 2161 + <SKIPGE |INTFLG > + <SAVAC O* [<(*1200*) *150000*>]> + <MOVE O* <TYPE-WORD LIST>> + <MOVEM O* (FRM) 7> ; (7) + <MOVEM B* (FRM) 8> ; (8) + <PUSH TP* (D) 4> ; [238] + <PUSH TP* (D) 5> ; [239] + <MCALL 1 STRUCTYP> + <PUSH TP* A> ; [238] + <PUSH TP* B> ; [239] + <MCALL 1 ISTYPE?> + <GETYP O* A> + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG143> + <PUSH TP* <MQUOTE <`SETZM |DSTORE >> -1> ; [238] + <PUSH TP* <MQUOTE <`SETZM |DSTORE >>> ; [239] + <MCALL 1 EMIT> + <JRST TAG142> +TAG143 <MOVE B* (FRM) 8> ; 2180 (8) + <HRRZ B* (B) > + <JUMPN B* TAG144> + <JRST TAG142> +TAG132 <PUSH TP* (FRM) 159> ; 2184 (159) [238] + <PUSH TP* (FRM) 160> ; (160) [239] + <PUSH TP* (FRM) 45> ; (45) [240] + <PUSH TP* (FRM) 46> ; (46) [241] + <MCALL 2 GEN-TAGS> +TAG142 <PUSH TP* (FRM) 63> ; 2189 (63) [238] + <PUSH TP* (FRM) 64> ; (64) [239] + <MCALL 1 CLEANUP-STATE> + <PUSH TP* (FRM) 187> ; (187) [238] + <PUSH TP* (FRM) 188> ; (188) [239] + <MCALL 1 LABEL:TAG> + <GETYP O* (FRM) 163> ; (163) + <CAIE O* <MQUOTE %<TYPE-C DATUM!-COMPDEC!-PACKAGE LIST>>> + <JRST TAG145> + <GETYP O* (FRM) 13> ; (13) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG146> + <PUSH TP* (FRM) 113> ; (113) [238] + <PUSH TP* (FRM) 114> ; (114) [239] + <PUSH TP* (FRM) 153> ; (153) [240] + <PUSH TP* (FRM) 154> ; (154) [241] + <MOVE A* (FRM) 163> ; (163) + <MOVE B* (FRM) 164> ; (164) + <PUSH P* [0]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <POP P* A> + <ACALL A* DATUM> + <PUSH TP* A> ; [242] + <PUSH TP* B> ; [243] + <MCALL 3 DO-LAST> + <JRST TAG147> +TAG146 <GETYP O* (FRM) 99> ; 2216 (99) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG148> + <GETYP O* (FRM) 193> ; (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG148> + <PUSH TP* (FRM) 17> ; (17) [238] + <PUSH TP* (FRM) 18> ; (18) [239] + <PUSH TP* <TYPE-WORD FALSE>> ; [240] + <PUSH TP* [0]> ; [241] + <PUSH TP* <TYPE-WORD FALSE>> ; [242] + <PUSH TP* [0]> ; [243] + <MCALL 3 LADDR> + <PUSH TP* A> ; [238] + <PUSH TP* B> ; [239] + <MOVE A* (FRM) 163> ; (163) + <MOVE B* (FRM) 164> ; (164) + <PUSH P* [0]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <POP P* A> + <JRST TAG149> +TAG148 <GETYP O* (FRM) 99> ; 2238 (99) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG150> + <PUSH TP* (FRM) 59> ; (59) [238] + <PUSH TP* (FRM) 60> ; (60) [239] + <MOVNI B* 1 > + <MOVE D* (FRM) 82> ; (82) + <ASH D* A> + <SUB B* D> + <PUSH TP* <TYPE-WORD FIX>> ; [240] + <PUSH TP* B> ; [241] + <MOVE A* (FRM) 163> ; (163) + <MOVE B* (FRM) 164> ; (164) + <PUSH P* [0]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <POP P* A> + <ACALL A* DATUM> + <PUSH TP* A> ; [242] + <PUSH TP* B> ; [243] + <MCALL 3 DO-FUNNY-LAST> + <JRST TAG147> +TAG150 <GETYP O* (FRM) 193> ; 2260 (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG151> + <PUSH TP* (FRM) 197> ; (197) [238] + <PUSH TP* (FRM) 198> ; (198) [239] + <MOVE A* (FRM) 163> ; (163) + <MOVE B* (FRM) 164> ; (164) + <PUSH P* [0]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <POP P* A> + <JRST TAG149> +TAG151 <MOVNI B* 1 > ; 2272 + <MOVE D* (FRM) 82> ; (82) + <ASH D* A> + <SUB B* D> + <PUSH TP* <TYPE-WORD FIX>> ; [238] + <PUSH TP* B> ; [239] + <PUSH TP* <MQUOTE %<TYPE-W OPCODE!-OP!-PACKAGE WORD>>>; [240] + <PUSH TP* [<(*13*) 0>]> ; [241] + <MCALL 2 ADDRESS:C> + <PUSH TP* A> ; [238] + <PUSH TP* B> ; [239] + <PUSH TP* A> ; [240] + <PUSH TP* B> ; [241] + <MCALL 2 DATUM> + <PUSH TP* A> ; [238] + <PUSH TP* B> ; [239] + <MOVE A* (FRM) 163> ; (163) + <MOVE B* (FRM) 164> ; (164) + <PUSH P* [0]> + <MOVEI O* |SEGMNT > + <PUSHJ P* |RCALL > + <POP P* A> +TAG149 <ACALL A* DATUM> ; 2294 + <PUSH TP* A> ; [240] + <PUSH TP* B> ; [241] + <MCALL 2 MOVE:ARG> +TAG147 <PUSH TP* (FRM) 163> ; 2298 (163) [238] + <PUSH TP* (FRM) 164> ; (164) [239] + <PUSH TP* A> ; [240] + <PUSH TP* B> ; [241] + <MOVEM A* (FRM) 169> ; (169) + <MOVEM B* (FRM) 170> ; (170) + <MCALL 2 ACFIX> + <MOVE B* (FRM) 164> ; (164) + <PUSH TP* (B) > ; [238] + <PUSH TP* (B) 1> ; [239] + <MCALL 1 ISTYPE?> + <GETYP O* A> + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG152> + <MOVE B* (FRM) 170> ; (170) + <GETYP O* (B) 0> + <CAIE O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG152> + <PUSH TP* (B) > ; [238] + <PUSH TP* (B) 1> ; [239] + <PUSH TP* <MQUOTE %<TYPE-W DATUM!-COMPDEC!-PACKAGE LIST>>>; [240] + <PUSH TP* B> ; [241] + <MCALL 2 RET-TMP-AC> + <JRST TAG152> +TAG145 <GETYP O* (FRM) 13> ; 2322 (13) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG153> + <PUSH TP* (FRM) 113> ; (113) [238] + <PUSH TP* (FRM) 114> ; (114) [239] + <PUSH TP* (FRM) 153> ; (153) [240] + <PUSH TP* (FRM) 154> ; (154) [241] + <MCALL 0 FUNCTION:VALUE> + <PUSH TP* A> ; [242] + <PUSH TP* B> ; [243] + <MCALL 3 DO-LAST> + <JRST TAG152> +TAG153 <GETYP O* (FRM) 99> ; 2334 (99) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG154> + <GETYP O* (FRM) 193> ; (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG154> +TAG156 <PUSH TP* (FRM) 197> ; 2340 (197) [238] + <PUSH TP* (FRM) 198> ; (198) [239] + <MCALL 0 FUNCTION:VALUE> + <PUSH TP* A> ; [240] + <PUSH TP* B> ; [241] + <MCALL 2 MOVE:ARG> + <JRST TAG152> +TAG154 <GETYP O* (FRM) 193> ; 2347 (193) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG155> + <GETYP O* (FRM) 99> ; (99) + <CAIE O* <TYPE-CODE FALSE>> + <JRST TAG156> +TAG155 <GETYP O* (FRM) 99> ; 2353 (99) + <CAIN O* <TYPE-CODE FALSE>> + <JRST TAG152> + <PUSH TP* (FRM) 59> ; (59) [238] + <PUSH TP* (FRM) 60> ; (60) [239] + <MOVNI B* 1 > + <MOVE D* (FRM) 82> ; (82) + <ASH D* A> + <SUB B* D> + <PUSH TP* <TYPE-WORD FIX>> ; [240] + <PUSH TP* B> ; [241] + <MCALL 0 FUNCTION:VALUE> + <PUSH TP* A> ; [242] + <PUSH TP* B> ; [243] + <MCALL 3 DO-FUNNY-LAST> +TAG152 <PUSH TP* (FRM) 51> ; 2368 (51) [238] + <PUSH TP* (FRM) 52> ; (52) [239] + <PUSH TP* (FRM) 117> ; (117) [240] + <PUSH TP* (FRM) 118> ; (118) [241] + <MCALL 2 POP:LOCS> + <PUSH TP* (FRM) 181> ; (181) [238] + <PUSH TP* (FRM) 182> ; (182) [239] + <MCALL 1 LABEL:TAG> + <MOVEI E* (FRM) 217> ; (217) + <PUSHJ P* |SSPEC1 > + <GETYP O* (FRM) 169> ; (169) + <CAIN O* <TYPE-CODE UNBOUND>> + <JRST TAG157> + <MOVE B* (FRM) 164> ; (164) + <GETYP O* (B) 0> + <CAIE O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG158> + <PUSH TP* (B) > ; [238] + <PUSH TP* (B) 1> ; [239] + <PUSH TP* <MQUOTE %<TYPE-W DATUM!-COMPDEC!-PACKAGE LIST>>>; [240] + <PUSH TP* B> ; [241] + <PUSH TP* (FRM) 169> ; (169) [242] + <PUSH TP* (FRM) 170> ; (170) [243] + <MCALL 3 FIX-ACLINK> +TAG158 <MOVE B* (FRM) 164> ; 2392 (164) + <HRRZ D* (B) > + <GETYP O* (D) 0> + <CAIE O* <MQUOTE %<TYPE-C AC!-COMPDEC!-PACKAGE VECTOR>>> + <JRST TAG157> + <HRRZ D* (B) > + <PUSH TP* (D) > ; [238] + <PUSH TP* (D) 1> ; [239] + <PUSH TP* <MQUOTE %<TYPE-W DATUM!-COMPDEC!-PACKAGE LIST>>>; [240] + <PUSH TP* B> ; [241] + <PUSH TP* (FRM) 169> ; (169) [242] + <PUSH TP* (FRM) 170> ; (170) [243] + <MCALL 3 FIX-ACLINK> +TAG157 <MOVE B* (FRM) 104> ; 2405 (104) + <PUSH TP* (FRM) 163> ; (163) [238] + <PUSH TP* (FRM) 164> ; (164) [239] + <PUSH TP* (FRM) -5> ; (-5) [240] + <PUSH TP* (FRM) -4> ; (-4) [241] + <MOVEM B* (FRM) 124> ; (124) + <MCALL 2 MOVE:ARG> + <MOVEM A* (FRM) 9> ; (9) + <MOVEM B* (FRM) 10> ; (10) + <MCALL 0 END-FRAME> + <MOVE A* (FRM) 9> ; (9) + <MOVE B* (FRM) 10> ; (10) + <MOVE TP* FRM> + <PUSHJ P* |SSPECS > + <JRST |FMPOPJ > + <TAG1> + <0> + <(*47*) -1> + <IMULI TB* 1 > + <-1> + <(18) 18> + <IMULI TB* (B) 0> + <IMULI TB* 4 > + <(4) 4> + <(1) 1> + <1> + <IMULI TB* 2 > + <(22) 22> + <(22) 22> +TAG14 <(*1200*) 0> ; 2434 + <FSB O* O> + <IMULI TB* (D) 6> + <IMULI TB* 6 > + <IMULI TB* 5 > + <IMULI TB* (FRM) 113> ; (113) + <(20) 20> +TAG26 <(*1200*) 4> ; 2441 + <FSB O* O> + <IMULI TB* (FRM) 199> ; (199) + <IMULI TB* (FRM) 219> ; (219) + <(30) 30> + <(26) 26> + <(20) 20> + <IMULI TB* (FRM) 193> ; (193) + <IMULI TB* (B) 24> + <(32) 32> + <(34) 34> + <IMULI TB* (D) 0> + <IMULI TB* (FRM) 13> ; (13) + <2> + <IMULI TB* (FRM) 153> ; (153) + <IMULI TB* (FRM) 15> ; (15) + <(*100*) 0> + <(4) 4> + <IMULI TB* (FRM) 99> ; (99) + <IMULI TB* (FRM) 57> ; (57) + <(*1200*) *150000*> + <IMULI TB* (PVP) 14> + <IMULI TB* (FRM) 175> ; (175) + <IMULI TB* (FRM) 21> ; (21) + <(*13*) 0> + <3> + <IMULI TB* (D) 0> + <IMULI TB* (PVP) 0> + <IMULI TB* (FRM) 157> ; (157) + <IMULI TB* (FRM) 207> ; (207) + <IMULI TB* (FRM) 91> ; (91) + <IMULI TB* (FRM) 209> ; (209) + <IMULI TB* (FRM) 11> ; (11) + <(60) 60> + <IMULI TB* (PVP) 0> + <(*1500*) *12*> + <IMULI TB* (TVP) 0> + <IMULI TB* (FRM) -5> ; (-5) + <IMULI TB* (FRM) 223> ; (223) + <(60) 60> + <*120000*> + <-2> + <IMULI TB* (FRM) 75> ; (75) + <SETZM O> + <(*17*) 0> + <IMULI TB* (FRM) 163> ; (163) + <IMULI TB* (FRM) 169> ; (169) + <(3) *10*> + <(*56132*) *551434*> + <0> + <(1) 2> + \ No newline at end of file diff --git a/<mdl.comp>/varana.mud.43 b/<mdl.comp>/varana.mud.43 new file mode 100644 index 0000000..7c8a71e --- /dev/null +++ b/<mdl.comp>/varana.mud.43 @@ -0,0 +1,603 @@ +<PACKAGE "VARANA"> + +<ENTRY VARS> + +<USE "COMPDEC" "CHKDCL" "ADVMESS" "SUBRTY"> + + +<SETG TEMPSTRT #TEMPV ()> + +<DEFINE VARS REVAR (FCN + "AUX" GFRMID NOA ACC LARG (BPRE <>) (UNPRE <>) (NOACT T) + (OV .VERBOSE) (NNEW T)) + #DECL ((FCN) <SPECIAL NODE> + (GFRMID NOA ACC LARG REVAR BPRE UNPRE NOACT NNEW) <SPECIAL ANY>) + <COND (.VERBOSE <PUTREST <SET VERBOSE .OV> ()>)> + <SET NOA <ACS .FCN>> + <SET ACC <AND .NOA <N=? .NOA '(STACK)> <N=? .NOA '(FUNNY-STACK)>>> + <SET LARG <>> + <SET GFRMID 0> + <COND (<AND .VERBOSE <NOT .NOA>> + <ADDVMESS .FCN ("Frame being generated.")>)> + <FUNC-VAR .FCN>> + +<DEFINE FUNC-VAR (BASEF + "AUX" (PRE <>) (BST <BINDING-STRUCTURE .BASEF>) + (FRMID <SET GFRMID <+ .GFRMID 1>>) (SVIOFF 0) TA + (IOFF + <+ + <COND (<OR <ACTIV? .BST .NOACT> <ACTIVATED .BASEF>> + <PUT .BASEF ,ACTIVATED T> + 2) + (ELSE 0)> + <COND + (<=? .NOA '(STACK)> + <* 2 + <COND (<L? <SET TA <TOTARGS .BASEF>> 0> 0) + (ELSE .TA)>>) + (ELSE 0)>>) (USOFF 0) (FUZZ <>) (HSLOT 0)) + #DECL ((BASEF) <SPECIAL NODE> (BST) <LIST [REST SYMTAB]> + (FRMID GFRMID SVIOFF IOFF USOFF HSLOT) <SPECIAL FIX> + (PRE FUZZ) <SPECIAL ANY>) + <COND (<AND .NOACT <ACTIVATED .BASEF>> + <SET NOACT <>> + <AGAIN .REVAR>)> + <AND <==? .FCN .BASEF> + .NOA + <ACTIVATED .BASEF> + .NNEW + <PUT .BASEF ,ACS <CHTYPE (<ACS .FCN>) FALSE>> + <AGAIN .REVAR>> + <PUT .BASEF ,BINDING-STRUCTURE <DOREG .BST>> + <SET PRE <OR .PRE .BPRE>> + <AND .ACC <NOT .LARG> <SET LARG T>> + <AND .PRE <G? .USOFF .HSLOT> <SET HSLOT .USOFF>> + <SET SVIOFF .IOFF> + <MAPF <> ,VAR-ANA <KIDS .BASEF>> + <AND .PRE <PUT .BASEF ,SSLOTS <COND (<0? .HSLOT> -1)(ELSE .HSLOT)>>>> + +<DEFINE VAR-ANA (N) + #DECL ((N FCN) NODE) + <COND (<AND .FUZZ <ACS .FCN> .NNEW <NOT <=? <ACS .FCN> '(FUNNY-STACK)>>> + <COND (<G=? <TOTARGS .FCN> 0> <PUT .FCN ,ACS '(FUNNY-STACK)>) + (<PUT .FCN ,ACS <CHTYPE (<ACS .FCN>) FALSE>>)> + <AGAIN .REVAR>)> + <COND (<VAR-ANA1 .N .FUZZ> <SET FUZZ T>)>> + +<DEFINE VAR-ANA1 (N OFUZZ + "AUX" (FUZZ .OFUZZ) (SIOFF .IOFF) (COD <NODE-TYPE .N>) FL K RN + ACST) + #DECL ((N RN) NODE (FUZZ) <SPECIAL ANY> (SIOFF) FIX (IOFF COD) FIX + (K) <LIST [REST NODE]>) + <COND + (<==? .COD ,MAP-CODE> + <PROG ((GMF ,NUMACS)) + #DECL ((GMF) <SPECIAL ANY>) + <VAR-ANA <1 <SET K <KIDS .N>>>> + <SET COD <NODE-TYPE <1 .K>>> + <SET FL <==? <NODE-TYPE <2 .K>> ,MFCN-CODE>> + <COND + (<AND + <OR + <EMPTY? <REST .K 2>> + <MAPF <> + <FUNCTION (N) + #DECL ((N) NODE) + <COND (<AND <SET TEM <STRUCTYP <RESULT-TYPE .N>>> + <N==? .TEM TEMPLATE>> + <SET GMF + <- .GMF + <COND (<OR <==? .TEM STRING> + <==? .TEM BYTES>> + 2) + (ELSE 1)>>>) + (ELSE <MAPLEAVE <>>)>> + <REST .K 2>>> + <OR <==? <ISTYPE? <RESULT-TYPE <1 .K>>> FALSE> + <AND <AP? <1 .K>> <N==? <NODE-SUBR <1 .K>> 5>>> + .FL>) + (ELSE <SET GMF <>>)> + <COND (<AND .FL + <NOT <EMPTY? <BINDING-STRUCTURE <2 .K>>>> + <==? <NAME-SYM <1 <BINDING-STRUCTURE <2 .K>>>> DUMMY-MAPF>> + <REPEAT ((B <REST <BINDING-STRUCTURE <2 .K>> <- <LENGTH .K> 1>>) + (N <- <LENGTH .K> 2>)) + <COND (<L? <SET N <- .N 1>> 0> <RETURN>)> + <PUT <1 .B> ,CODE-SYM 3>>)> + <COND (<AND .FL + <NOT .GMF> + <NOT <EMPTY? <BINDING-STRUCTURE <2 .K>>>> + <==? <NAME-SYM <1 <BINDING-STRUCTURE <2 .K>>>> DUMMY-MAPF>> + <PUT <2 .K> + ,BINDING-STRUCTURE + <REST <BINDING-STRUCTURE <2 .K>> <- <LENGTH .K> 1>>>)> + <COND (<NOT <OR .GMF .FUZZ .PRE>> + <COND (<==? .COD ,MFIRST-CODE> + <COND (<==? <NODE-SUBR <1 .K>> 5> <SET IOFF <+ .IOFF 4>>) + (ELSE <SET IOFF <+ .IOFF 2>>)>) + (<NOT <NODE-NAME <1 .K>>> <SET IOFF <+ .IOFF 2>>)> + <COND (<AND <NOT .FL> + <N==? <NODE-TYPE <2 .K>> ,MPSBR-CODE> + <NOT <AP? <2 .K>>>> + <SET IOFF <+ .IOFF 2>>)>) + (<AND <NOT <OR .FUZZ .PRE>> + <==? .COD ,MFIRST-CODE> + <==? <NODE-SUBR <1 .K>> 5>> + <SET IOFF <+ .IOFF 4>>)> + <AND .FL <VARMAP .K <OR .GMF .OFUZZ>>> + <SET FUZZ <OR .FUZZ <AND <NODE-NAME <1 .K>> <N==? .COD ,MFIRST-CODE>>>> + <VAR-ANA <2 .K>> + <SET FUZZ .OFUZZ> + <OR .FL <VARMAP .K .OFUZZ>>>) + (<==? .COD ,STACKFORM-CODE> + <VAR-ANA <1 <SET K <KIDS .N>>>> + <SET OFUZZ .FUZZ> + <SET FUZZ T> + <VAR-ANA <2 .K>> + <VAR-ANA <3 .K>> + <SET FUZZ .OFUZZ>) + (<OR <==? .COD ,PROG-CODE> <==? .COD ,MFCN-CODE>> <PROG-REP-VAR .N .OFUZZ>) + (<OR <==? .COD ,SUBR-CODE> + <==? .COD ,COPY-CODE> + <AND <==? .COD ,ISUBR-CODE> <==? <4 <GET-TMP <NODE-SUBR .N>>> STACK>> + <AND <==? .COD ,RSUBR-CODE> + <OR <AND <TYPE? <NODE-SUBR .N> FUNCTION> + <SET ACST <ACS <SET RN <GET <NODE-NAME .N> .IND>>>> + <OR <ASSIGNED? GROUP-NAME> <==? .FCN .RN>> + <=? .ACST '(STACK)>> + <TYPE? <NODE-SUBR .N> RSUBR RSUBR-ENTRY>>>> + <MAPF <> + <FUNCTION (N) + #DECL ((N) NODE (IOFF) FIX) + <OR <VAR-ANA .N> .OFUZZ .PRE <SET IOFF <+ .IOFF 2>>>> + <KIDS .N>>) + (<OR <==? .COD ,ISTRUC-CODE> <==? .COD ,ISTRUC2-CODE>> + <VAR-ANA <1 <KIDS .N>>> + <OR .PRE + .OFUZZ + <SET IOFF <+ .IOFF <COND (<==? <NODE-SUBR .N> ,ISTRING> 2) (ELSE 4)>>>> + <MAPF <> ,VAR-ANA <REST <KIDS .N>>>) + (<==? .COD ,UNWIND-CODE> + <OR .PRE .OFUZZ <SET IOFF <+ .IOFF 10>>> + <VAR-ANA <1 <KIDS .N>>> + <VAR-ANA <2 <KIDS .N>>>) + (ELSE + <AND <==? <NODE-TYPE .N> ,BRANCH-CODE> <VAR-ANA <PREDIC .N>>> + <MAPF <> ,VAR-ANA <KIDS .N>>)> + <SET IOFF .SIOFF> + <==? <NODE-TYPE .N> ,SEGMENT-CODE>> + +<DEFINE VARMAP (K OFUZZ) + #DECL ((K) <LIST [REST NODE]> (OFUZZ) ANY) + <MAPF <> + <FUNCTION (N) + #DECL ((N) NODE (IOFF) FIX) + <VAR-ANA .N> + <OR .PRE .OFUZZ <SET IOFF <+ .IOFF 2>>>> + <REST .K 2>>> + +<DEFINE PROG-REP-VAR (PNOD FUZZ + "AUX" (BST <BINDING-STRUCTURE .PNOD>) (SVIOFF .SVIOFF) + (USOFF .USOFF) (IOFF .IOFF) (NOA <>) + (PROG-REP + <OR <==? <NODE-SUBR .PNOD> ,PROG> + <==? <NODE-SUBR .PNOD> ,REPEAT>>)) + #DECL ((PNOD) <SPECIAL NODE> (FUZZ NOA) <SPECIAL ANY> + (BST) <LIST [REST SYMTAB]> (SVIOFF USOFF IOFF) <SPECIAL FIX>) + <COND (<OR <ACTIV? .BST .NOACT> <ACTIVATED .PNOD>> + <AND .NOACT <PROG () + <SET NOACT <>> + <AGAIN .REVAR>>> + <PUT .PNOD ,ACTIVATED T> + <AND .FUZZ + <NOT .PRE> + <SET PRE T> + <OR <ASSIGNED? INARG> .UNPRE> + <NOT .BPRE> + <SET BPRE T> + <NOT <SET UNPRE <>>> + <AGAIN .REVAR>> + <AND .PRE + .NOA + .NNEW + <PUT .BASEF ,ACS (FUNNY-STACK)> + <AGAIN .REVAR>> + <PROG REVAR ((BPRE <>) (UNPRE <>) (OG .GFRMID) (OV .VERBOSE) + (NNEW <>)) + #DECL ((REVAR BPRE NNEW UNPRE) <SPECIAL ANY>) + <COND (.VERBOSE <PUTREST <SET VERBOSE .OV> ()>)> + <SET GFRMID .OG> + <SET NOA <>> + <COND (.VERBOSE + <ADDVMESS .PNOD ("Internal FRAME generated.")>)> + <FUNC-VAR .PNOD>>) + (ELSE + <COND (<OR .PRE .FUZZ> + <AND <NOT .PRE> + <OR <ASSIGNED? INARG> .UNPRE> + <NOT .BPRE> + <SET BPRE T> + <NOT <SET UNPRE <>>> + <AGAIN .REVAR>> + <SET PRE T> + <OR <ASSIGNED? INARG> <SET IOFF .SVIOFF>> + <PUT .PNOD ,SPECS-START <+ .IOFF .USOFF>> + <PUT .PNOD ,USLOTS <+ .IOFF .USOFF>> + <PUT .PNOD ,BINDING-STRUCTURE <DOUNREG .BST .BST .BST T>> + <MAPF <> ,VAR-ANA <KIDS .PNOD>> + <AND <ASSIGNED? INARG> <SET IOFF .SVIOFF>> + <AND <G? .USOFF .HSLOT> <SET HSLOT .USOFF>>) + (ELSE + <PROG ((BASEF .PNOD) (HSLOT 0) (PRE <>)) + #DECL ((BASEF) <SPECIAL NODE> (PRE) <SPECIAL ANY> + (HSLOT) <SPECIAL FIX>) + <PUT .BASEF ,BINDING-STRUCTURE <DOREG .BST T>> + <SET SVIOFF .IOFF> + <AND .PRE <G? .USOFF .HSLOT> <SET HSLOT .USOFF>> + <MAPF <> ,VAR-ANA <KIDS .BASEF>> + <COND (<AND .PRE .UNPRE> + <SET BPRE T> + <SET UNPRE <>> + <AGAIN .REVAR>) + (<NOT .BPRE> <SET UNPRE T>)> + <COND (.PRE + <AND <G? .USOFF .HSLOT> <SET HSLOT .USOFF>> + <PUT .BASEF + ,SSLOTS + <COND (<0? .HSLOT> -1) + (ELSE .HSLOT)>>)>>)>)>> + +<DEFINE ARG? (SYM) #DECL ((SYM) SYMTAB) <1? <NTH ,ARGTBL <CODE-SYM .SYM>>>> + +<SETG ARGTBL ![0 0 0 0 1 0 0 0 0 1 0 1 1!]> + +<DEFINE ACTIV? (BST NOACT) + #DECL ((BST) <LIST [REST SYMTAB]>) + <REPEAT () + <AND <EMPTY? .BST> <RETURN <>>> + <AND <==? <CODE-SYM <1 .BST>> 1> + <OR <NOT .NOACT> + <NOT <RET-AGAIN-ONLY <1 .BST>>> + <SPEC-SYM <1 .BST>>> + <RETURN T>> + <SET BST <REST .BST>>>> + +<DEFINE INITV? (SYM) + #DECL ((SYM) SYMTAB) + <1? <NTH '![0 1 0 0 0 1 1 0 0 0 0 0 0!] <CODE-SYM .SYM>>>> + +<DEFINE NONARG (SYM) + #DECL ((SYM) SYMTAB) + <1? <NTH '![1 1 1 0 0 0 0 0 0 0 1 0 0!] <CODE-SYM .SYM>>>> + +<DEFINE TUPLE? (TUP-NOD) + <AND .TUP-NOD + <OR <==? <NODE-NAME .TUP-NOD> ITUPLE> + <==? <NODE-NAME .TUP-NOD> TUPLE>>>> + +<DEFINE GOOD-TUPLE (TUP "AUX" (K <KIDS .TUP>) NT (WD 0)) + #DECL ((NT) FIX (TUP) NODE (K) <LIST [REST NODE]>) + <AND <NOT <==? <NODE-TYPE .TUP> ,ISTRUC-CODE>> + <COND (<==? <NODE-SUBR .TUP> ,ITUPLE> + <AND <==? <NODE-TYPE <1 .K>> ,QUOTE-CODE> + <OR <==? <SET NT <NODE-TYPE <2 .K>>> ,QUOTE-CODE> + <==? .NT ,FLVAL-CODE> + <==? .NT ,FGVAL-CODE> + <==? .NT ,GVAL-CODE> + <==? .NT ,LVAL-CODE>> + <* <NODE-NAME <1 .K>> 2>>) + (ELSE + <MAPF <> + <FUNCTION (K) + <COND (<==? <NODE-TYPE .K> ,SEGMENT-CODE> + <MAPLEAVE <>>) + (ELSE <SET WD <+ .WD 2>>)>> + .K>)>>> + +<DEFINE DOREG (BST + "OPTIONAL" (HACK-INITS <>) + "AUX" TUP SYM COD (RQRG 0) (TRG 0) (COOL <AND .NOA <NOT .ACC>>) + (INARG T) INIT-LIST) + #DECL ((BST) <LIST [REST SYMTAB]> (SYM) SYMTAB (COD IOFF RQRG TRG) FIX + (BASEF) NODE (INARG) <SPECIAL ANY> (INIT-LIST) LIST) + <COND (<AND <ASSIGNED? GMF> .GMF <L=? .GMF 0>> <SET HACK-INITS <>>)> + <COND (<==? <NODE-TYPE .BASEF> ,FUNCTION-CODE> + <SET RQRG <REQARGS .BASEF>> + <SET TRG <TOTARGS .BASEF>>)> + <COND + (.HACK-INITS + <SET INIT-LIST + <MAPF ,LIST + <FUNCTION (SYM) + #DECL ((SYM) SYMTAB) + <COND + (<OR + <AND <ASSIGNED? GMF> .GMF <==? <NAME-SYM .SYM> DUMMY-MAPF>> + <AND + <OR <INIT-SYM .SYM> <==? <CODE-SYM .SYM> 13>> + <NOT <ASS? .SYM>> + <NOT <SPEC-SYM .SYM>> + <ISTYPE-GOOD? + <COND (<COMPOSIT-TYPE .SYM> + <TYPE-AND <1 <DECL-SYM .SYM>> <COMPOSIT-TYPE .SYM>>) + (<1 <DECL-SYM .SYM>>)>> + <USAGE-SYM .SYM> + <NOT <0? <USAGE-SYM .SYM>>>>> + <MAPRET .SYM>) + (<MAPRET>)>> + .BST>> + <REPEAT ((L <LENGTH .INIT-LIST>) (REMPTR .INIT-LIST) + (NA <COND (<AND <ASSIGNED? GMF> .GMF> .GMF) (ELSE ,NUMACS)>)) + #DECL ((L NA) FIX (REMPTR) LIST) + <COND (<L? .L .NA> <RETURN>)> + <REPEAT ((PTR .INIT-LIST) (MIN-CNT <CHTYPE <MIN> FIX>) SYM) + <SET SYM <1 .PTR>> + <COND (<L? <USAGE-SYM .SYM> .MIN-CNT> + <SET MIN-CNT <USAGE-SYM .SYM>> + <RETURN>)> + <SET REMPTR <SET PTR <REST .PTR>>>> + <SET L <- .L 1>> + <COND (<==? .REMPTR .INIT-LIST> <SET INIT-LIST <REST .INIT-LIST>>) + (<PUTREST .REMPTR <REST .REMPTR 2>>)>>)> + <REPEAT ((FB .BST) (PB .BST)) + <AND <EMPTY? .BST> <RETURN .FB>> + <PUT <SET SYM <1 .BST>> ,CODE-SYM <SET COD <ABS <CODE-SYM .SYM>>>> + <COND + (<AND <COMPOSIT-TYPE .SYM> <N==? <COMPOSIT-TYPE .SYM> T>> + <COND + (<NOT <SPEC-SYM .SYM>> + <COND (<NOT <ASS? .SYM>> + <PUT .SYM + ,COMPOSIT-TYPE + <TYPE-AND '<NOT UNBOUND> <COMPOSIT-TYPE .SYM>>>)> + <SET DC <1 <DECL-SYM .SYM>>> + <PUT .SYM ,DECL-SYM (<TYPE-AND <COMPOSIT-TYPE .SYM> .DC>)> + <COND (<AND .VERBOSE + <N==? <COMPOSIT-TYPE .SYM> T> + <N==? <COMPOSIT-TYPE .SYM> NO-RETURN> + <NOT <SAME-DECL? + <TYPE-AND .DC <COMPOSIT-TYPE .SYM>> .DC>>> + <VMESS "Computed decl of variable: " + <NAME-SYM .SYM> + " is: " + <COMPOSIT-TYPE .SYM>>)>)> + <PUT .SYM ,COMPOSIT-TYPE T>)> + <PUT .SYM ,CURRENT-TYPE <>> + <COND + (<NOT <OR <AND <1? <CODE-SYM .SYM>> + <NOT <SPEC-SYM .SYM>> + <RET-AGAIN-ONLY .SYM> + <NOT <ACTIVATED .BASEF>>> + <AND <NOT <USED-AT-ALL .SYM>> + <PROG () + <PUT .SYM ,USED-AT-ALL T> + <COND (<SPEC-SYM .SYM> + <MESSAGE NOTE + "Special variable never used: " + <NAME-SYM .SYM>>) + (ELSE + <MESSAGE WARNING + "VARIABLE NEVER USED: " + <NAME-SYM .SYM>>)> + T> + <NONARG .SYM> + <NOT <SPEC-SYM .SYM>> + <NOT <INIT-SYM .SYM>> + <PURE-SYM .SYM> + <SET FB <FLUSH-SYM .BST <SET BST .PB> .FB>>>>> + <COND (<SPEC-SYM .SYM> + <PUT .SYM ,ADDR-SYM <+ .USOFF .IOFF 2>> + <AND <OR <NONARG .SYM> <ASSIGNED? PNOD>> + <PUT .SYM ,ARGNUM-SYM <TMPLS .BASEF>>> + <SET USOFF <+ .USOFF 6>>)> + <COND (<INITV? .SYM> + <COND (<TUPLE? <INIT-SYM .SYM>> + <COND (<AND <NOT <OR <==? <CODE-SYM .SYM> 7> + <==? <CODE-SYM .SYM> 8> + <==? <CODE-SYM .SYM> 9> + <SPEC-SYM .SYM>>> + <SET TUP <GOOD-TUPLE <INIT-SYM .SYM>>>> + <SET IOFF <+ .IOFF .TUP 2>>) + (ELSE + <SET PRE T> + <COND (<ACS .FCN> + <PUT .FCN ,ACS <CHTYPE (<ACS .FCN>) FALSE>> + <AGAIN .REVAR>)> + <RETURN <DOUNREG .BST .FB .PB .HACK-INITS>>)>)> + <COND (<SPEC-SYM .SYM> + <SET IOFF <+ .IOFF 2>> + <VAR-ANA <INIT-SYM .SYM>> + <SET IOFF <- .IOFF 2>>) + (ELSE <VAR-ANA <INIT-SYM .SYM>>)> + <COND (.PRE + <OR <SPEC-SYM .SYM> <SET USOFF <+ .USOFF 2>>> + <SET COD <- .COD>>)>)> + <COND (<AND .ACC <NOT .LARG> <NONARG .SYM>> <SET LARG T>)> + <COND (<AND <NOT .NOA> + <ARG? .SYM> + <NOT <SPEC-SYM .SYM>> + <PURE-SYM .SYM>> + <PUT .SYM ,ADDR-SYM <REFERENCE:ARG <ARGNUM-SYM .SYM>>>) + (<AND .COOL <NOT <NONARG .SYM>> <NOT <SPEC-SYM .SYM>>> + <PUT .SYM ,FRMNO .FRMID> + <PUT .SYM + ,ADDR-SYM + <COND (<=? .NOA '(FUNNY-STACK)> + <- -2 <* <- <TOTARGS .FCN> <ARGNUM-SYM .SYM>> 2>>) + (ELSE <* 2 <- <ARGNUM-SYM .SYM> 1>>)>>) + (<AND <TUPLE? <INIT-SYM .SYM>> <NOT .TUP>> + <SET PRE T> + <COND (<ACS .FCN> + <PUT .FCN ,ACS <CHTYPE (<ACS .FCN>) FALSE>> + <AGAIN .REVAR>)> + <RETURN <DOUNREG .BST .FB .PB .HACK-INITS>>) + (ELSE + <PUT .SYM ,FRMNO .FRMID> + <COND (<AND <OR <==? <CODE-SYM .SYM> 2> + <==? <CODE-SYM .SYM> 3> + <==? <CODE-SYM .SYM> 13>> + <NOT <SPEC-SYM .SYM>> + <NOT <ASS? .SYM>> + <OR <==? <CODE-SYM .SYM> 3> + <AND .HACK-INITS <MEMQ .SYM .INIT-LIST>>>> + <PUT .SYM ,ADDR-SYM ,TEMPSTRT>) + (ELSE + <PUT .SYM + ,ADDR-SYM + <+ .IOFF <COND (<SPEC-SYM .SYM> 2) (ELSE 0)>>> + <AND <OR <NONARG .SYM> <ASSIGNED? PNOD>> + <PUT .SYM ,ARGNUM-SYM <TMPLS .BASEF>>> + <OR .PRE + <SET IOFF + <+ .IOFF + <COND (<SPEC-SYM .SYM> 6) (ELSE 2)>>>>)>)>)> + <SET BST <REST <SET PB .BST>>> + <PUT .SYM ,CODE-SYM .COD> + <COND (.PRE <RETURN <DOUNREG .BST .FB .PB .HACK-INITS>>)>>> + +<DEFINE DOUNREG (BST FB PB + "OPTIONAL" (HACK-INITS <>) + "AUX" SYM (INARG T) INIT-LIST) + #DECL ((BST) <LIST [REST SYMTAB]> (SYM) SYMTAB (USOFF IOFF) FIX + (INARG) <SPECIAL ANY> (INIT-LIST) LIST) + <COND (<AND <ASSIGNED? GMF> .GMF <L=? .GMF 0>> <SET HACK-INITS <>>)> + <COND + (.HACK-INITS + <SET INIT-LIST + <MAPF ,LIST + <FUNCTION (SYM) + #DECL ((SYM) SYMTAB) + <COND + (<AND <INIT-SYM .SYM> + <NOT <ASS? .SYM>> + <NOT <SPEC-SYM .SYM>> + <ISTYPE-GOOD? + <COND (<COMPOSIT-TYPE .SYM> + <TYPE-AND <1 <DECL-SYM .SYM>> <COMPOSIT-TYPE .SYM>>) + (<1 <DECL-SYM .SYM>>)>> + <USAGE-SYM .SYM> + <NOT <0? <USAGE-SYM .SYM>>>> + <MAPRET .SYM>) + (<MAPRET>)>> + .BST>> + <REPEAT ((L <LENGTH .INIT-LIST>) (REMPTR .INIT-LIST) + (NA <COND (<AND <ASSIGNED? GMF> .GMF> .GMF) (ELSE 5)>)) + #DECL ((L NA) FIX (REMPTR) LIST) + <COND (<L? .L .NA> <RETURN>)> + <REPEAT ((PTR .INIT-LIST) (MIN-CNT <CHTYPE <MIN> FIX>) SYM) + <SET SYM <1 .PTR>> + <COND (<L? <USAGE-SYM .SYM> .MIN-CNT> + <SET MIN-CNT <USAGE-SYM .SYM>> + <RETURN>)> + <SET REMPTR <SET PTR <REST .PTR>>>> + <SET L <- .L 1>> + <COND (<==? .REMPTR .INIT-LIST> <SET INIT-LIST <REST .INIT-LIST>>) + (<PUTREST .REMPTR <REST .REMPTR 2>>)>>)> + <PROG () + <AND <EMPTY? .BST> <RETURN .FB>> + <REPEAT ((BST .BST)) + <COND + (<AND <COMPOSIT-TYPE <SET SYM <1 .BST>>> <N==? <COMPOSIT-TYPE .SYM> T>> + <COND + (<NOT <SPEC-SYM .SYM>> + <COND (<NOT <ASS? .SYM>> + <PUT .SYM + ,COMPOSIT-TYPE + <TYPE-AND '<NOT UNBOUND> <COMPOSIT-TYPE .SYM>>>)> + <SET DC <1 <DECL-SYM .SYM>>> + <PUT .SYM ,DECL-SYM (<TYPE-AND <COMPOSIT-TYPE .SYM> .DC>)> + <COND + (<AND .VERBOSE + <N==? <COMPOSIT-TYPE .SYM> T> + <N==? <COMPOSIT-TYPE .SYM> NO-RETURN> + <NOT <SAME-DECL? <TYPE-AND .DC <COMPOSIT-TYPE .SYM>> .DC>>> + <VMESS "Computed decl of variable: " + <NAME-SYM .SYM> + " is: " + <COMPOSIT-TYPE .SYM>>)>)> + <PUT .SYM ,COMPOSIT-TYPE T>)> + <PUT .SYM ,CURRENT-TYPE <>> + <PUT .SYM ,FRMNO .FRMID> + <COND (<NOT <OR <AND <1? <CODE-SYM .SYM>> + <NOT <SPEC-SYM .SYM>> + <RET-AGAIN-ONLY .SYM> + <NOT <ACTIVATED .BASEF>>> + <AND <NOT <USED-AT-ALL .SYM>> + <PROG () + <PUT .SYM ,USED-AT-ALL T> + <COND (<SPEC-SYM .SYM> + <MESSAGE NOTE + +"Special variable never used: " + <NAME-SYM .SYM>>) + (ELSE + <MESSAGE WARNING + "VARIABLE NEVER USED: " + <NAME-SYM .SYM>>)> + T> + <NONARG .SYM> + <NOT <SPEC-SYM .SYM>> + <NOT <INIT-SYM .SYM>> + <PURE-SYM .SYM> + <SET FB <FLUSH-SYM .BST <SET BST .PB> .FB>>>>> + <AND <INITV? .SYM> <VAR-ANA <INIT-SYM .SYM>>> + <COND (<OR <AND <ASSIGNED? GMF> + .GMF + <==? <NAME-SYM .SYM> DUMMY-MAPF>> + <AND .NOACT + <OR <==? <CODE-SYM .SYM> 3> + <==? <CODE-SYM .SYM> 2> + <==? <CODE-SYM .SYM> 13>> + <NOT <SPEC-SYM .SYM>> + <NOT <ASS? .SYM>> + <OR <==? <CODE-SYM .SYM> 3> + <AND .HACK-INITS <MEMQ .SYM .INIT-LIST>>>>> + <PUT .SYM ,ADDR-SYM ,TEMPSTRT>) + (ELSE + <PUT .SYM + ,ADDR-SYM + <+ .IOFF .USOFF <COND (<SPEC-SYM .SYM> 2) (ELSE 0)>>> + <AND <OR <NONARG .SYM> <ASSIGNED? PNOD>> + <PUT .SYM ,ARGNUM-SYM <TMPLS .BASEF>>> + <SET USOFF + <+ .USOFF <COND (<SPEC-SYM .SYM> 6) (ELSE 2)>>>)>)> + <AND <EMPTY? <SET BST <REST <SET PB .BST>>>> <RETURN .FB>>>>> + +<DEFINE FLUSH-SYM (B P F) + #DECL ((B P F) <LIST [REST SYMTAB]>) + <COND (<==? .B .F> <REST .B>) + (ELSE <PUTREST .P <REST .B>> .F)>> + +<DEFINE AP? (N "AUX" AT) + #DECL ((N) NODE) + <AND <==? <NODE-TYPE .N> ,GVAL-CODE> + <==? <NODE-TYPE <SET N <1 <KIDS .N>>>> ,QUOTE-CODE> + <SET AT <NODE-NAME .N>> + <OR .REASONABLE + <AND <GASSIGNED? .AT> <TYPE? ,.AT SUBR RSUBR RSUBR-ENTRY>> + <AND <GASSIGNED? .AT> + <TYPE? ,.AT FUNCTION> + <OR <==? .AT .FCNS> + <AND <TYPE? .FCNS LIST> <MEMQ .AT .FCNS>>>>> + .AT>> + + +<DEFINE REFERENCE:ARG (NUMBER "AUX" TEM) + #DECL ((VALUE) <DATUM ADDRESS:C ADDRESS:C> (NUMBER) FIX) + <SET TEM <ADDRESS:C `(AB) <* 2 <- .NUMBER 1>>>> + <DATUM .TEM .TEM>> + + +<DEFINE GET-TMP (SUB "AUX" (LS <MEMQ .SUB ,SUBRS>)) + #DECL ((VALUE) <LIST ANY ANY>) + <COND (.LS <NTH ,TEMPLATES <LENGTH .LS>>) + (ELSE '(ANY ANY))>> + +<DEFINE SAME-DECL? (D1 D2) <OR <=? .D1 .D2> <NOT <TYPE-OK? .D2 <NOTIFY .D1>>>>> + +<DEFINE NOTIFY (D) + <COND (<AND <TYPE? .D FORM> <==? <LENGTH .D> 2> <==? <1 .D> NOT>> + <2 .D>) + (ELSE <FORM NOT .D>)>> + +<ENDPACKAGE> diff --git a/README.md b/README.md index c57f055..27e1c61 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ `<mdl.int>` contains Muddle for TOPS-20, from around 1981. There should also be support for ITS, but it won't build as is. +`<mdl.comp>` contains a TOPS-20 Muddle compiler from around 1982. + `MUDDLE` contains Muddle for ITS, from around 1973. `mim` contains Machine-Independent MDL for TOPS-20 and VAX. -- 2.31.1