Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / mimc / codgen.mud
diff --git a/mim/development/mim/mimc/codgen.mud b/mim/development/mim/mimc/codgen.mud
new file mode 100644 (file)
index 0000000..8f4a83b
--- /dev/null
@@ -0,0 +1,2305 @@
+<PACKAGE "CODGEN">
+
+<ENTRY GEN
+       CODE-GEN
+       SEQ-GEN
+       SEGMENT-STACK
+       GOOD-TUPLE
+       NO-KILL
+       DELAY-KILL
+       BASEF
+       LADDR
+       TRUE-FALSE
+       SUBR-GEN
+       BIND-CODE
+       NPRUNE
+       ARG?
+       OPT?
+       COND-GEN
+       OR-GEN
+       AND-GEN
+       ASSIGNED?-GEN
+       BIND-B
+       ACT-B
+       AUX1-B
+       AUX2-B
+       SMSUBR-CALL
+       CALL-GEN
+       T-NAME
+       GASSIGNED?-GEN
+       INTERFERE?
+       INTERF-CHANGE
+       SEGLABEL
+       SEGCALLED
+       COUNTMP
+       SET-GEN
+       PSEQ-GEN>
+
+<USE "CHKDCL"
+     "COMPDEC"
+     "MIMGEN"
+     "STRGEN"
+     "MAPGEN"
+     "MMQGEN"
+     "BUILDL"
+     "BITSGEN"
+     "LNQGEN"
+     "CARGEN"
+     "NOTGEN"
+     "ALLR"
+     "SUBRTY"
+     "NEWREP"
+     "ADVMESS"
+     "CASECOMP">
+
+<SETG THE-UNBOUND <CHTYPE 0 T$UNBOUND>>
+
+"      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."
+
+" Main generator, dispatches to specific code generators. "
+
+<DEFINE GEN (NOD "OPT" (WHERE DONT-CARE) "AUX" TEMP) 
+       #DECL ((NOD) NODE)
+       <SET TEMP <GEN-DISPATCH .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 <>)
+                "AUX" K (WSET <>))
+   #DECL ((K L) <LIST [REST NODE]> (LAST) NODE)
+   <MAPR <>
+    <FUNCTION (N "AUX" (ND <1 .N>) NX W) 
+       #DECL ((N) <LIST NODE> (ND) NODE)
+       <COND (<NOT <EMPTY? <REST .N>>>
+             <SET NX <2 .N>>
+             <COND (<AND <==? <NODE-TYPE .NX> ,CALL-CODE>
+                         <G=? <LENGTH <SET K <KIDS .NX>>> 2>
+                         <==? <NODE-NAME <1 .K>> `ENDIF>>
+                    <SET W <GEN .ND .WHERE>>
+                    <COND (<AND <NOT .WSET>
+                                <N==? .WHERE FLUSHED>
+                                <N==? .W ,NO-DATUM>
+                                <N==? .WHERE ,POP-STACK>>
+                           <SET WHERE <FIXUP-TEMP .WHERE .W>>
+                           <SET WSET T>)>
+                    <COND (<NOT <EMPTY? <REST .N 2>>>
+                           <DEALLOCATE-TEMP .WHERE>)>)
+                   (<OR <AND <G=? <LENGTH .ND>
+                                  <CHTYPE <INDEX ,SIDE-EFFECTS> FIX>>
+                             <SIDE-EFFECTS .ND>>
+                        <GETPROP .ND DONT-FLUSH-ME>
+                        ,DONT-FLUSH-ME>
+                    <GEN .ND FLUSHED>)>)
+            (<AND <==? <NODE-TYPE .ND> ,CALL-CODE>
+                  <G=? <LENGTH <SET K <KIDS .ND>>> 2>
+                  <==? <NODE-NAME <1 .K>> `ENDIF>>
+             <GEN .ND FLUSHED>)
+            (ELSE <SET WHERE <GEN .ND .WHERE>>)>>
+    .L>
+   .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 EXTRA-CODE
+                 "AUX" (K <KIDS .BASEF>) CD (NO-KILL ()) (KILL-LIST ())
+                       (ATAG <MAKE-TAG "AGAIN">) (RTAG <MAKE-TAG "RETURN">)
+                       (CODE-START .EXTRA-CODE) (CODE-PTR .CODE-START)
+                       (EVERY-TEMP ()) ARGS-NEXT TMPS TMPS-NEXT (STK 0)
+                       (FREE-TEMPS ()) (ALL-TEMPS-LIST ()) TMP-DEST SPECD
+                       BNDTMP STKTMP (STK-CHARS7 0) (STK-CHARS8 0))
+       #DECL ((STK-CHARS7 STK-CHARS8 STK) <SPECIAL FIX> (STKTMP) <SPECIAL
+                                                                  ANY>
+              (BASEF) <SPECIAL NODE>
+              (KILL-LIST NO-KILL CODE-START CODE-PTR TMPS-NEXT ARGS-NEXT
+               EVERY-TEMP ALL-TEMPS-LIST) <SPECIAL LIST> (TMPS) <SPECIAL
+                                                                 FORM>
+              (K) <LIST [REST NODE]> (ATAG RTAG) ATOM
+              (TMP-DEST) <SPECIAL ATOM> (SPECD) <SPECIAL ANY>
+              (FREE-TEMPS) <SPECIAL <LIST [REST TEMP]>>)
+       <MIM-FCN <NODE-NAME .BASEF>
+                <RSUBR-DECLS .BASEF>
+                <OR <ACTIVATED .BASEF>
+                    <ACTIV? <BINDING-STRUCTURE .BASEF>>
+                    <GETPROP <NODE-NAME .BASEF> FRAME>
+                    <GETPROP .BASEF UNWIND>>>
+       <MIM-TEMPS-HOLD>
+       <SET SPECD <BIND-CODE .BASEF <> <SET BNDTMP <GEN-TEMP <>>>>>
+       <COND (<AGND .BASEF> <IEMIT `LOOP>)>
+       <LABEL-TAG .ATAG>
+       <PUT .BASEF ,DST DONT-CARE>
+       <PUT .BASEF ,CDST DONT-CARE>
+       <PUT .BASEF ,ATAG .ATAG>
+       <PUT .BASEF ,RTAG .RTAG>
+       <COND (<N==? <SET CD <SEQ-GEN .K DONT-CARE <> <> T>> ,NO-DATUM>)
+             (ELSE <SET CD <CDST .BASEF>>)>
+       <COND (<N==? <CDST .BASEF> .CD> <SET CD <MOVE-ARG .CD <CDST .BASEF>>>)>
+       <LABEL-TAG .RTAG>
+       <COND (<ASSIGNED? TMP-DEST> <PUTREST .TMPS-NEXT (= .TMP-DEST)>)>
+       <FREE-TEMP .CD <>>
+       <COND (.SPECD <IEMIT `UNBIND .BNDTMP> <FREE-TEMP .BNDTMP>)>
+       <COND (<N==? .STK-CHARS8 0>
+              <SET STK-CHARS8 <+ .STK-CHARS8 .STK>>
+              <SET STK-CHARS7 <+ .STK-CHARS7 .STK>>
+              <SET STK 0>)>
+       <COND (<ASSIGNED? STKTMP>
+              <COND (<N==? .STK 0>
+                     <IEMIT `SUB .STKTMP .STK = .STKTMP (`TYPE FIX)>)
+                    (<N==? .STK-CHARS7 0>
+                     <IEMIT `IFSYS "TOPS20">
+                     <IEMIT `SUB .STKTMP .STK-CHARS7 = .STKTMP>
+                     <IEMIT `ENDIF "TOPS20">
+                     <IEMIT `IFSYS "UNIX">
+                     <IEMIT `SUB .STKTMP .STK-CHARS8 = .STKTMP>
+                     <IEMIT `ENDIF "UNIX">)>
+              <IEMIT `ADJ .STKTMP>
+              <FREE-TEMP .STKTMP>)
+             (<N==? .STK 0> <IEMIT `ADJ <- .STK>>)
+             (<N==? .STK-CHARS8 0>
+              <IEMIT `IFSYS "TOPS20">
+              <IEMIT `ADJ <- .STK-CHARS7>>
+              <IEMIT `ENDIF "TOPS20">
+              <IEMIT `IFSYS "UNIX">
+              <IEMIT `ADJ <- .STK-CHARS8>>
+              <IEMIT `ENDIF "UNIX">)>
+       <MIM-RETURN .CD>
+       <TYPIFY-TEMPS .EVERY-TEMP>
+       <IEMIT `END <CHTYPE <NODE-NAME .BASEF> FCN-ATOM>>
+       .CODE-START>
+
+" Generate code for setting up and binding agruments."
+
+<DEFINE BIND-CODE (NOD
+                  "OPTIONAL" (FORPROG <>) BNDTMP
+                  "AUX" (BST <BINDING-STRUCTURE .NOD>) (NPRUNE T) (LARG <>)
+                        (ANY-ARG <>) (ANY-SPEC <>) (OPTS? <>) (OL ()) T-NAME
+                        (TUP? <>))
+   #DECL ((NOD) NODE (BST B) <LIST [REST SYMTAB]> (NPRUNE) <SPECIAL ANY>
+         (INAME) <UVECTOR [REST ATOM]> (BASEF) NODE (TMPS-NEXT OL) LIST
+         (T-NAME) <SPECIAL ANY>)
+   <COND
+    (<NOT .FORPROG>
+     <SET OL
+         <MAPF ,LIST
+               <FUNCTION (SYM) 
+                       #DECL ((SYM) SYMTAB)
+                       <COND (<OPT? .SYM> <MAKE-TAG "OPT">)
+                             (ELSE
+                              <COND (<==? <CODE-SYM .SYM> ,ARGL-TUPLE>
+                                     <SET TUP? <TOTARGS .NOD>>)>
+                              <MAPRET>)>>
+               .BST>>
+     <COND (<NOT <EMPTY? .OL>>
+           <PUTREST <REST .OL <- <LENGTH .OL> 1>> (<MAKE-TAG "OPT">)>
+           <IEMIT `OPT-DISPATCH <REQARGS .NOD> .TUP? !.OL>)>
+     <MAPF <>
+      <FUNCTION (SYM "AUX" (NT 0)) 
+        #DECL ((SYM) SYMTAB (NT) FIX)
+        <PUT .SYM
+             ,TEMP-NAME-SYM
+             <GEN-TEMP <> <NAME-SYM .SYM> T <DECL-SYM .SYM>>>
+        <COND
+         (<OPT? .SYM>
+          <LABEL-TAG <1 .OL>>
+          <SET OL <REST .OL>>
+          <COND (<AND <NOT <SPEC-SYM .SYM>>
+                      <N==? <CODE-SYM .SYM> ,ARGL-OPT>
+                      <N==? <CODE-SYM .SYM> ,ARGL-QOPT>
+                      <OR <==? <SET NT <NODE-TYPE <INIT-SYM .SYM>>>
+                               ,QUOTE-CODE>
+                          <==? .NT ,LVAL-CODE>>>
+                 <GEN <INIT-SYM .SYM> ,POP-STACK>)
+                (ELSE <PUSH ,THE-UNBOUND>)>
+          <COND (<EMPTY? <REST .OL>> <LABEL-TAG <1 .OL>>)>)>>
+      .BST>
+     <COND (<==? <NODE-TYPE .NOD> ,FUNCTION-CODE> <MIM-TEMPS-EMIT>)>)>
+   <MAPR <>
+        <FUNCTION (BS
+                   "AUX" (SYM <1 .BS>) TMP (A? <ARG? .SYM>) (O? <OPT? .SYM>))
+                #DECL ((SYM) SYMTAB (TMP) TEMP (BS) <LIST SYMTAB>)
+                <COND (<NOT <USED-AT-ALL .SYM>>
+                       <COND (<SPEC-SYM .SYM>
+                              <COMPILE-NOTE "Special variable never used: "
+                                            <NAME-SYM .SYM>>)
+                             (ELSE
+                              <COMPILE-WARNING
+                               "Variable never used: " <NAME-SYM .SYM>>)>)>
+                <COND (<AND <NOT .LARG> <NOT .A?> <NOT .O?>>
+                       <COND (<AND .ANY-SPEC .ANY-ARG> <GEN-FIX-BIND>)>
+                       <SET LARG T>)>
+                <COND (<NOT <TYPE? <TEMP-NAME-SYM .SYM> TEMP>>
+                       <PUT .SYM
+                            ,TEMP-NAME-SYM
+                            <GEN-TEMP <> <NAME-SYM .SYM> T <DECL-SYM .SYM>>>)>
+                <COND (<AND .O? <NOT .OPTS?>> <SET OPTS? T>)>
+                <COND (<AND <ASSIGNED? BNDTMP>
+                            <SPEC-SYM .SYM>
+                            <NOT .ANY-SPEC>>
+                       <SET ANY-SPEC T>
+                       <USE-TEMP .BNDTMP LBIND>
+                       <GET-BINDING .BNDTMP>)>
+                <PUT <SET TMP <TEMP-NAME-SYM .SYM>>
+                     ,TEMP-TYPE
+                     <COND (<ASS? .SYM> ANY) (ELSE <COMPOSIT-TYPE .SYM>)>>
+                <COND (<OR .A? .O?>
+                       <PUTREST .ARGS-NEXT
+                                <SET ARGS-NEXT
+                                     (<CHTYPE <TEMP-NAME .TMP> ATOM>)>>)>
+                <COND (<OR .A? .O?> <SET ANY-ARG T>)>
+                <SET T-NAME <TEMP-NAME .TMP>>
+                <COND (<AND <BIND-GENERATE .SYM .FORPROG>
+                            <NOT .A?>
+                            <NOT .O?>
+                            <NOT <SPEC-SYM .SYM>>>
+                       <PUTREST .TMPS-NEXT <SET TMPS-NEXT (.T-NAME)>>
+                       <USE-TEMP .TMP <ISTYPE? <COMPOSIT-TYPE .SYM>>>
+                       <PUT .TMP ,TEMP-REFS 1>)>
+                <COND (<AND <NOT .LARG> <EMPTY? <REST .BS>>>
+                       <COND (<AND .ANY-SPEC .ANY-ARG> <GEN-FIX-BIND>)>
+                       <SET LARG T>)>>
+        .BST>
+   <COND (<ACTIVATED .NOD> <IEMIT `ACTIVATION>)>
+   <COND (<AND <ASSIGNED? BNDTMP> <NOT .ANY-SPEC> <PUTPROP .NOD UNWIND>>
+         <USE-TEMP .BNDTMP LBIND>
+         <GET-BINDING .BNDTMP>)>
+   <COND (.ANY-SPEC .BNDTMP)>>
+
+" Generate \"BIND\" binding code."
+
+<DEFINE BIND-B (SYM "AUX" TMP FTMP) 
+       #DECL ((STK) FIX (SYM) SYMTAB (BASEF) NODE)
+       <COND (<SPEC-SYM .SYM>
+              <SET FTMP <PREV-FRAME <GEN-TEMP FRAME>>>
+              <SPECIAL-BINDING .SYM T .FTMP>
+              <SET STK <+ .STK ,BINDING-LENGTH>>
+              <FREE-TEMP .FTMP>)
+             (ELSE
+              <PREV-FRAME <TEMP-NAME-SYM .SYM>>
+              <USE-TEMP <TEMP-NAME-SYM .SYM>>)>
+       T>
+
+" Do code generation for normal  arguments."
+
+<DEFINE NORM-B (SYM) 
+       #DECL ((SYM) SYMTAB (STK) FIX)
+       <COND (<SPEC-SYM .SYM>
+              <SPECIAL-BINDING .SYM <> <TEMP-NAME-SYM .SYM>>
+              <SET STK <+ .STK ,BINDING-LENGTH>>)>
+       T>
+
+" Initialized optional argument binder."
+
+<DEFINE OPT1-B (SYM "AUX" NT) 
+       #DECL ((SYM) SYMTAB)
+       <COND (<OR <SPEC-SYM .SYM>
+                  <AND <N==? <SET NT <NODE-TYPE <INIT-SYM .SYM>>> ,QUOTE-CODE>
+                       <N==? .NT ,LVAL-CODE>>>
+              <OPTBIND .SYM <INIT-SYM .SYM>>)>>
+
+" Uninitialized optional argument binder."
+
+<DEFINE OPT2-B (SYM) 
+       #DECL ((SYM) SYMTAB)
+       <COND (<SPEC-SYM .SYM> <OPTBIND .SYM>)>
+       T>
+
+" Create a binding for either intitialized or unitialized optional."
+
+<DEFINE OPTBIND (SYM
+                "OPTIONAL" DVAL
+                "AUX" (GIVE <MAKE-TAG>) (DEF <MAKE-TAG>) DV TMP
+                      (SPEC <SPEC-SYM .SYM>) BLBL)
+       #DECL ((STK) FIX (SYM) SYMTAB (BASEF DVAL) NODE (GIVE DEF) ATOM)
+       <COND (<OR <ASSIGNED? DVAL> .SPEC>
+              <COND (.SPEC
+                     <SET TMP <GEN-TEMP FIX>>
+                     <IEMIT `SET .TMP 0>)>
+              <TEST-ARG <TEMP-NAME-SYM .SYM> .GIVE>
+              <COND (<ASSIGNED? DVAL>
+                     <GEN .DVAL <TEMP-NAME-SYM .SYM>>)>
+              <COND (.SPEC
+                     <IEMIT `SET .TMP 1>
+                     <FREE-TEMP <TEMP-NAME-SYM .SYM> <>>)>
+              <LABEL-TAG .GIVE>)>
+       <COND (.SPEC
+              <SPECIAL-BINDING .SYM <> <TEMP-NAME-SYM .SYM>>
+              <SET STK <+ .STK ,BINDING-LENGTH>>
+              <IEMIT `VEQUAL? .TMP 0 + <SET BLBL <MAKE-TAG>>>
+              <GEN-FIX-BIND>
+              <LABEL-TAG .BLBL>
+              <FREE-TEMP .TMP>)>
+       T>
+
+" Do a binding for a named activation."
+
+<DEFINE ACT-B (SYM "AUX" TMP FTMP) 
+       #DECL ((STK) FIX (SYM) SYMTAB (BASEF) NODE)
+       <COND (<SPEC-SYM .SYM>
+              <SET FTMP <CURRENT-FRAME>>
+              <SPECIAL-BINDING .SYM T .FTMP>
+              <SET STK <+ .STK ,BINDING-LENGTH>>
+              <FREE-TEMP .FTMP>
+              <PUT .BASEF ,ACTIVATED T>)
+             (<OR <ACTIVATED .BASEF> <ACTIV? <BINDING-STRUCTURE .BASEF>>>
+              <PUT .BASEF ,ACTIVATED T>
+              <CURRENT-FRAME <TEMP-NAME-SYM .SYM>>
+              <USE-TEMP <TEMP-NAME-SYM .SYM>>)>
+       T>
+
+" Bind an \"AUX\" variable."
+
+<DEFINE AUX1-B (SYM
+               "OPT" (FORCE-INIT <>)
+               "AUX" (TMP <TEMP-NAME-SYM .SYM>) TY PT INIT
+                     (NOD <INIT-SYM .SYM>))
+       #DECL ((SYM) SYMTAB (NOD) NODE (STK) FIX)
+       <COND (<AND <SET TY <ISTYPE? <COMPOSIT-TYPE .SYM>>>
+                   <OR <==? <SET PT <TYPEPRIM .TY>> FIX>
+                       <==? .PT WORD>
+                       <==? .PT LIST>>
+                   <NOT <ASS? .SYM>>>)
+             (ELSE <SET TY <>>)>
+       <COND (<SPEC-SYM .SYM>
+              <SPECIAL-BINDING .SYM T <SET INIT <GEN .NOD>>>
+              <SET STK <+ .STK ,BINDING-LENGTH>>
+              <FREE-TEMP .INIT>)
+             (<AND <NOT .FORCE-INIT> <==? <NODE-TYPE .NOD> ,QUOTE-CODE>>
+              <USE-TEMP .TMP .TY>
+              <SET T-NAME
+                   (<COND (.TY <CHTYPE [<TEMP-NAME .TMP> .TY] ADECL>)
+                          (ELSE <TEMP-NAME .TMP>)>
+                    <ATOMCHK <NODE-NAME .NOD>>)>)
+             (ELSE
+              <COND (.TY <SET T-NAME <CHTYPE [<TEMP-NAME .TMP> .TY] ADECL>>)>
+              <GEN .NOD <TEMP-NAME-SYM .SYM>>)>
+       T>
+
+" Do a binding for an uninitialized \"AUX\" "
+
+<DEFINE AUX2-B (SYM FP "AUX" TMP) 
+       #DECL ((SYM) SYMTAB (STK) FIX)
+       <COND (<SPEC-SYM .SYM>
+              <SPECIAL-BINDING .SYM T>
+              <SET STK <+ .STK ,BINDING-LENGTH>>)
+             (<AND .FP <ASS? .SYM>> <SET-SYM .SYM ,THE-UNBOUND T> T)
+             (<ASS? .SYM>)
+             (ELSE
+              <SET TMP <PUT <TEMP-NAME-SYM .SYM> ,TEMP-ALLOC <>>>
+              <PUT .TMP ,TEMP-REFS 0>
+              <>)>>
+
+" Do a \"TUPLE\" binding."
+
+<DEFINE TUPL-B (SYM "AUX" (TMP1 <TEMP-NAME-SYM .SYM>) TMP2) 
+       #DECL ((SYM) SYMTAB (STK) FIX)
+       <GET-ARG-TUPLE .TMP1>
+       <COND (<SPEC-SYM .SYM>
+              <SPECIAL-BINDING .SYM T .TMP1>
+              <SET STK <+ .STK ,BINDING-LENGTH>>)>
+       T>
+
+" Dispatch table for binding generation code."
+
+<DEFINE BIND-GENERATE (SYM FORPROG "AUX" (COD <CODE-SYM .SYM>)) 
+       #DECL ((SYM) SYMTAB (COD) FIX)
+       <CASE ,==?
+             .COD
+             (,ARGL-ACT <ACT-B .SYM>)
+             (,ARGL-IAUX <AUX1-B .SYM .FORPROG>)
+             (,ARGL-AUX <AUX2-B .SYM .FORPROG>)
+             (,ARGL-TUPLE <TUPL-B .SYM>)
+             (,ARGL-ARGS <NORM-B .SYM>)
+             (,ARGL-QIOPT <OPT1-B .SYM>)
+             (,ARGL-IOPT <OPT1-B .SYM>)
+             (,ARGL-QOPT <OPT2-B .SYM>)
+             (,ARGL-OPT <OPT2-B .SYM>)
+             (,ARGL-CALL <NORM-B .SYM>)
+             (,ARGL-BIND <BIND-B .SYM>)
+             (,ARGL-QUOTE <NORM-B .SYM>)
+             (,ARGL-ARG <NORM-B .SYM>)>>
+
+" 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
+              <COMPILE-ERROR "Non-applicabe object type "
+                             <NODE-NAME .NOD>
+                             .NOD>)>>
+
+" Generate a call to EVAL for uncompilable FORM."
+
+<DEFINE FORM-GEN (NOD WHERE) 
+       #DECL ((NOD) NODE)
+       <COND (<==? .WHERE DONT-CARE> <SET WHERE <GEN-TEMP>>)>
+       <START-FRAME EVAL>
+       <PUSH <REFERENCE <NODE-NAME .NOD>>>
+       <MSUBR-CALL EVAL 1 .WHERE>
+       .WHERE>
+
+" Generate code for LIST/VECTOR etc. evaluation."
+
+<GDECL (COPIERS) <UVECTOR [REST ATOM]>>
+
+<DEFINE COPY-GEN (NOD WHERE
+                 "AUX" (I 0) (ARGS <KIDS .NOD>) SEGTYP (SEGLABEL <MAKE-TAG>)
+                       (INAME <NODE-NAME .NOD>) SEGTMP COUNTMP RES X
+                       (SEGCALLED <>)
+                       (STACK?
+                        <COND
+                         (<AND <TYPE? <SET X <PARENT .NOD>> NODE>
+                               <OR <==? <NODE-TYPE .X> ,STACK-CODE>
+                                   <AND <==? <NODE-TYPE .X> ,CHTYPE-CODE>
+                                        <TYPE? <SET X <PARENT .X>> NODE>
+                                        <==? <NODE-TYPE .X>
+                                             ,STACK-CODE>>>>)
+                         (<==? .INAME TUPLE>)>))
+   #DECL ((GT) <OR FALSE FIX> (NOD) NODE (ARGS) <LIST [REST NODE]> (I) FIX
+         (SEGCALLED SEGLABEL COUNTMP) <SPECIAL ANY> (STK) FIX)
+   <SET I
+       <MAPF ,+
+             <FUNCTION (N) 
+                     #DECL ((N) NODE)
+                     <COND (<==? <NODE-TYPE .N> ,SEGMENT-CODE> 0) (ELSE 1)>>
+             .ARGS>>
+   <COND
+    (<REPEAT (N)
+            #DECL ((N) NODE (STK) FIX)
+            <COND (<EMPTY? .ARGS> <RETURN>)>
+            <COND
+             (<==? <NODE-TYPE <SET N <1 .ARGS>>> ,SEGMENT-CODE>
+              <COND (<NOT <ASSIGNED? SEGTMP>>
+                     <SET SEGTMP <GEN-TEMP <>>>
+                     <SET COUNTMP <GEN-TEMP FIX>>
+                     <SET-TEMP .COUNTMP .I '(`TYPE FIX)>)>
+              <SET RES <GEN <SET N <1 <KIDS .N>>> .SEGTMP>>
+              <SET SEGTYP <STRUCTYP-SEG <RESULT-TYPE .N>>>
+              <COND (<AND <==? <NODE-NAME .NOD> LIST>
+                          <EMPTY? <REST .ARGS>>
+                          <OR <NOT .SEGTYP> <==? .SEGTYP LIST>>
+                          <N==? .RES ,NO-DATUM>> 
+                     <COND (<==? .WHERE DONT-CARE>
+                            <SET WHERE <GEN-TEMP LIST>>)
+                           (<TYPE? .WHERE TEMP> <USE-TEMP .WHERE LIST>)>
+                     <SEGMENT-LIST .SEGTMP
+                                   .COUNTMP
+                                   .SEGTYP
+                                   .WHERE
+                                   .SEGLABEL
+                                   .RES>
+                     <FREE-TEMP .SEGTMP>
+                     <FREE-TEMP .COUNTMP>
+                     <RETURN <>>)
+                    (<AND <N==? .RES ,NO-DATUM> <N==? .SEGTYP MULTI>>
+                     <SEGMENT-STACK .SEGTMP
+                                    .COUNTMP
+                                    .SEGTYP
+                                    <ISTYPE? <RESULT-TYPE .N>>
+                                    .SEGLABEL>
+                     <SET SEGLABEL <MAKE-TAG>>)
+                    (.SEGCALLED
+                     <LABEL-TAG .SEGLABEL>
+                     <SET SEGLABEL <MAKE-TAG>>)>)
+             (ELSE <GEN <1 .ARGS> ,POP-STACK>)>
+            <SET ARGS <REST .ARGS>>>
+     <COND (<ASSIGNED? SEGTMP>
+           <FREE-TEMP .SEGTMP>
+           <COND (<NOT .STACK?> <FREE-TEMP .COUNTMP>)>)>
+     <COND (<==? .WHERE DONT-CARE> <SET WHERE <GEN-TEMP .INAME>>)
+          (<TYPE? .WHERE TEMP> <USE-TEMP .WHERE .INAME>)>
+     <COND (<==? .INAME VECTOR>
+           <GEN-VECTOR <COND (<ASSIGNED? SEGTMP> .COUNTMP) (ELSE .I)>
+                       .WHERE
+                       .STACK?>)
+          (<==? .INAME LIST>
+           <GEN-LIST <COND (<ASSIGNED? SEGTMP> .COUNTMP) (ELSE .I)> .WHERE>)
+          (<==? .INAME UVECTOR>
+           <GEN-UVECTOR <COND (<ASSIGNED? SEGTMP> .COUNTMP) (ELSE .I)>
+                        .WHERE
+                        .STACK?>)
+          (<==? .INAME TUPLE>
+           <GEN-TUPLE <COND (<ASSIGNED? SEGTMP> .COUNTMP) (ELSE .I)> .WHERE>)
+          (ELSE <ERROR "NOT READY YET">)>
+     <COND
+      (.STACK?
+       <COND (<ASSIGNED? SEGTMP>
+             <COND (<N==? .INAME UVECTOR>
+                    <IEMIT `LSH
+                           .COUNTMP
+                           1
+                           =
+                           <COND (<G? <TEMP-REFS .COUNTMP> 1>
+                                  <FREE-TEMP .COUNTMP <>>
+                                  <SET COUNTMP <GEN-TEMP FIX>>)>>)>
+             <FREE-TEMP .COUNTMP <>>
+             <COND (<ASSIGNED? STKTMP>
+                    <IEMIT `SUB .STKTMP .COUNTMP = .STKTMP>)
+                   (ELSE
+                    <IEMIT `SUB 0 .COUNTMP = <SET STKTMP <GEN-TEMP FIX>>>)>
+             <SET STK <+ .STK 2>>)
+            (ELSE
+             <SET STK
+                  <+ .STK
+                     <COND (<==? .INAME UVECTOR> .I) (ELSE <* .I 2>)>
+                     2>>)>)>)>
+   .WHERE>
+
+"Generate code for a call to a SUBR."
+
+<DEFINE SUBR-GEN (NOD WHERE "AUX" N ST) 
+       #DECL ((NOD) NODE)
+       <COND (<AND <TYPE? <SET N <PARENT .NOD>> NODE>
+                   <==? <NODE-TYPE .N> ,SEGMENT-CODE>
+                   <OR <==? <SET ST <STRUCTYP-SEG <RESULT-TYPE .NOD>>> MULTI>
+                       <NOT .ST>>>
+              <SET SEGCALLED T>
+              <COMP-SUBR-CALL .NOD <KIDS .NOD> .WHERE .COUNTMP .SEGLABEL>)
+             (ELSE <COMP-SUBR-CALL .NOD <KIDS .NOD> .WHERE <> <>>)>>
+
+" Compile call to a SUBR that doesn't compile or PUSHJ."
+
+<DEFINE COMP-SUBR-CALL (N OBJ W PARENT-COUNT PARENT-LABEL
+                       "AUX" (I 0) SEGTMP COUNTMP (SEGLABEL <MAKE-TAG>) RES
+                             (SUBR <NODE-NAME .N>) (SEGCALLED <>) X (SLNT 0)
+                             (STACK?
+                              <COND
+                               (<AND
+                                 <TYPE? <SET X <PARENT .N>> NODE>
+                                 <OR <==? <NODE-TYPE .X> ,STACK-CODE>
+                                     <AND
+                                      <==? <NODE-TYPE .X> ,CHTYPE-CODE>
+                                      <TYPE? <SET X <PARENT .X>> NODE>
+                                      <==? <NODE-TYPE .X> ,STACK-CODE>>>>)>))
+   #DECL ((I) FIX (OBJ) <LIST [REST NODE]> (UNK) <OR FALSE ATOM> (N) NODE
+         (SEGCALLED SEGLABEL COUNTMP) <SPECIAL ANY>)
+   <SET I
+       <MAPF ,+
+             <FUNCTION (N) 
+                     #DECL ((N) NODE)
+                     <COND (<==? <NODE-TYPE .N> ,SEGMENT-CODE>
+                            <SET SLNT <>>
+                            0)
+                           (ELSE
+                            <COND (<AND <==? .SUBR STRING>
+                                        <TYPE? .SLNT FIX>
+                                        <==? <NODE-TYPE .N> ,QUOTE-CODE>>
+                                   <SET SLNT <+ .SLNT
+                                                <LENGTH <CHTYPE <NODE-NAME .N>
+                                                                STRING>>>>)
+                                  (ELSE <SET SLNT <>>)>
+                            1)>>
+             .OBJ>>
+   <COND (<NOT <MEMQ .SUBR '[LIST VECTOR UVECTOR TUPLE BYTES STRING]>>
+         <COND (.PARENT-COUNT <IEMIT `SFRAME <FORM QUOTE .SUBR>>)
+               (ELSE <START-FRAME .SUBR>)>)>
+   <MAPF <>
+    <FUNCTION (OB) 
+       #DECL ((OB) NODE (I STA) FIX)
+       <COND
+       (<==? <NODE-TYPE .OB> ,SEGMENT-CODE>
+        <COND (<NOT <ASSIGNED? SEGTMP>>
+               <SET SEGTMP <GEN-TEMP <>>>
+               <SET COUNTMP <GEN-TEMP <>>>
+               <SET-TEMP .COUNTMP .I '(`TYPE FIX)>)>
+        <SET RES <GEN <SET OB <1 <KIDS .OB>>> .SEGTMP>>
+        <COND (<AND <N==? .RES ,NO-DATUM>
+                    <N==? <STRUCTYP-SEG <RESULT-TYPE .OB>> MULTI>>
+               <SEGMENT-STACK
+                .SEGTMP
+                .COUNTMP
+                <STRUCTYP <RESULT-TYPE .OB>>
+                <ISTYPE? <RESULT-TYPE .OB>>
+                .SEGLABEL>)
+              (.SEGCALLED <LABEL-TAG .SEGLABEL>)>
+        <SET SEGLABEL <MAKE-TAG>>)
+       (ELSE <GEN .OB ,POP-STACK>)>>
+    .OBJ>
+   <COND (<ASSIGNED? SEGTMP>
+         <FREE-TEMP .SEGTMP>
+         <COND (<NOT .STACK?> <FREE-TEMP .COUNTMP <>>)>)>
+   <COND (<==? .W DONT-CARE> <SET W <GEN-TEMP <RESULT-TYPE .N>>>)
+        (<TYPE? .W TEMP> <USE-TEMP .W <RESULT-TYPE .N>>)>
+   <COND (.PARENT-COUNT
+         <SEG-SUBR-CALL .SUBR
+                        <COND (<ASSIGNED? COUNTMP> .COUNTMP) (ELSE .I)>
+                        .W
+                        .PARENT-COUNT
+                        .PARENT-LABEL>)
+        (ELSE
+         <SMSUBR-CALL .SUBR
+                      <COND (<ASSIGNED? COUNTMP> .COUNTMP) (ELSE .I)>
+                      .W
+                      .STACK?
+                      .SLNT>)>
+   .W>
+
+"\f"
+
+<DEFINE SEGMENT-STACK (SEGTMP COUNTMP SEGTYP SEGTYP2
+                      "OPT" (TG1 <MAKE-TAG>)
+                      "AUX" (TG2 <MAKE-TAG>) TMP)
+       <COND (<NOT .SEGTYP>
+              <IEMIT `LOOP
+                     (<TEMP-NAME .SEGTMP> TYPE VALUE LENGTH)
+                     (<TEMP-NAME .COUNTMP> VALUE)>)
+             (<==? .SEGTYP LIST>
+              <IEMIT `LOOP
+                     (<TEMP-NAME .SEGTMP> VALUE)
+                     (<TEMP-NAME .COUNTMP> VALUE)>)
+             (ELSE
+              <IEMIT `LOOP
+                     (<TEMP-NAME .SEGTMP> VALUE LENGTH)
+                     (<TEMP-NAME .COUNTMP> VALUE)>)>
+       <LABEL-TAG .TG2>
+       <IEMIT `INTGO>
+       <COND (.SEGTYP <EMPTY-CHECK .SEGTYP .SEGTMP .SEGTYP2 T .TG1>)
+             (ELSE <IEMIT `EMPTY? .SEGTMP + .TG1>)>
+       <COND (.SEGTYP
+              <NTH-DO .SEGTYP .SEGTMP ,POP-STACK 1 .SEGTYP2>
+              <REST-DO .SEGTYP .SEGTMP .SEGTMP 1 .SEGTYP2>)
+             (ELSE
+              <IEMIT `NTH1 .SEGTMP = ,POP-STACK>
+              <IEMIT `REST1 .SEGTMP = .SEGTMP>)>
+       <IEMIT `ADD .COUNTMP 1 = .COUNTMP (`TYPE FIX)>
+       <BRANCH-TAG .TG2>
+       <LABEL-TAG .TG1>>
+
+<DEFINE SEGMENT-LIST (SEGTMP COUNTMP LIST? W
+                     "OPT" (TGX <MAKE-TAG>) (RES <>)
+                     "AUX" (TG1 <MAKE-TAG>) (TG2 <MAKE-TAG>) (TG3 <MAKE-TAG>)
+                           (TG4 <MAKE-TAG>) (OTMP <GEN-TEMP>))
+       <COND (<NOT .LIST?>
+              <IEMIT `TYPE .SEGTMP = .OTMP>
+              <IEMIT `AND .OTMP 7 = .OTMP>
+              <IEMIT `VEQUAL? .OTMP 1 + .TG1>
+              <SEGMENT-STACK .SEGTMP .COUNTMP <> <>>
+              <GEN-LIST .COUNTMP .W>
+              <BRANCH-TAG .TG2>
+              <LABEL-TAG .TGX>
+              <SET-TEMP .SEGTMP 0>
+              <LABEL-TAG .TG1>)>
+       <IEMIT `LOOP>
+       <LABEL-TAG .TG4>
+       <IEMIT `VEQUAL? .COUNTMP 0 + .TG3>
+       <IEMIT `POP = .OTMP>
+       <IEMIT `CONS .OTMP .SEGTMP = .SEGTMP '(`TYPE LIST)>
+       <IEMIT `SUB .COUNTMP 1 = .COUNTMP '(`TYPE FIX)>
+       <BRANCH-TAG .TG4>
+       <LABEL-TAG .TG3>
+       <FREE-TEMP .OTMP>
+       <MOVE-ARG .SEGTMP .W>
+       <COND (<NOT .LIST?> <LABEL-TAG .TG2>)>
+       .W>
+
+<GDECL (SUBRS TEMPLATES) VECTOR>
+
+<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>:<OR LIST FALSE>>>
+                            <MAPLEAVE T>)>>
+             .L>>
+
+" Generate code for a COND."
+
+<DEFINE COND-GEN (NOD W
+                 "OPTIONAL" (NOTF <>) (BRANCH <>) (DIR <>)
+                 "AUX" NW (RW .W) LOCN (COND <MAKE-TAG "COND">) W2 (WSET <>)
+                       (KK <CLAUSES .NOD>) (SDIR .DIR))
+   #DECL ((NOD) NODE (COND) ATOM (KK) <LIST [REST NODE]>)
+   <COND (.NOTF <SET DIR <NOT .DIR>>)>
+   <COND (<OR <==? .W ,POP-STACK>
+             <AND <TYPE? .W TEMP>
+                  <TEMP-NO-RECYCLE .W>
+                  <N==? <TEMP-NO-RECYCLE .W> ANY>>>
+         <SET W DONT-CARE>)>
+   <MAPR <>
+    <FUNCTION (BRN
+              "AUX" (LAST <EMPTY? <REST .BRN>>) (BR <1 .BRN>) NEXT
+                    (PRED-TRUE <>) (K <CLAUSES .BR>) (PR <PREDIC .BR>)
+                    (NO-SEQ <>) (LEAVE <>) FLG K2 PR2 BR2 PRT2 (BRNCHED <>)
+                    (PRT <RESULT-TYPE .PR>) CT)
+       #DECL ((BR2 PR2 PR BR) NODE (BRN) <LIST NODE> (K) <LIST [REST NODE]>)
+       <COND
+       (<AND
+         <NOT .LAST>
+         <TYPE-OK? .PRT FALSE>
+         <NOT
+          <TYPE-OK?
+           <SET PRT2 <RESULT-TYPE <SET PR2 <PREDIC <SET BR2 <2 .BRN>>>>>>
+           FALSE>>
+         <OR <AND <EMPTY? <SET K2 <CLAUSES .BR2>>> <NOT .PRT2>>
+             <AND <NOT <EMPTY? .K2>>
+                  <NOT <RESULT-TYPE <NTH .K2 <LENGTH .K2>>>>>>>
+        <COND-COMPLAIN "Predicate assumed true to avoid type mismatch" .PR>
+        <SET PRED-TRUE T>)>
+       <COND
+       (<EMPTY? .K>
+        <COND
+         (<OR <SET FLG <OR <NOT <TYPE-OK? .PRT FALSE>> .PRED-TRUE>> .LAST>
+          <COND (<NOT .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 (<AND <NOT .WSET> <N==? .LOCN ,NO-DATUM> <N==? .RW FLUSHED>>
+                   <SET LOCN <SET W <FIXUP-TEMP .W .LOCN>>>
+                   <SET WSET T>)>
+            <COND (.DIR <BRANCH-TAG .BRANCH>)>)
+           (<AND .BRANCH .LAST>
+            <SET LOCN
+                 <PRED-BRANCH-GEN
+                  .BRANCH
+                  .PR
+                  .SDIR
+                  <COND (<==? .RW FLUSHED> FLUSHED)
+                        (<OR .WSET <AND <TYPE? .W TEMP> <0? <TEMP-REFS .W>>>>
+                         <SET WSET T>
+                         .W)
+                        (ELSE <SET WSET T> <SET W <GEN-TEMP <>>>)>
+                  .NOTF>>)
+           (ELSE
+            <SET LOCN <GEN .PR <COND (<==? .RW FLUSHED> FLUSHED) (ELSE .W)>>>
+            <COND (<AND <NOT .WSET> <N==? .LOCN ,NO-DATUM> <N==? .RW FLUSHED>>
+                   <SET LOCN <SET W <FIXUP-TEMP .W .LOCN>>>
+                   <SET WSET T>)>)>
+          <MAPLEAVE>)
+         (<NOT .PRT>
+          <COND-COMPLAIN "Predicate assumed FALSE to satisfy type constraint "
+                         .PR>
+          <GEN .PR FLUSHED>)
+         (<==? <ISTYPE? .PRT> 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>
+            <FREE-TEMP <PRED-BRANCH-GEN .BRANCH .PR T FLUSHED .NOTF>>)
+           (ELSE
+            <SET LOCN
+                 <PRED-BRANCH-GEN
+                  .COND
+                  .PR
+                  T
+                  <COND (<OR .WSET <AND <TYPE? .W TEMP> <0? <TEMP-REFS .W>>>>
+                         <SET WSET T>
+                         .W)
+                        (ELSE <SET WSET T> <SET W <GEN-TEMP <>>>)>
+                  .NOTF>>
+            <COND (<NOT .LAST> <DEALLOCATE-TEMP .LOCN>)>)>)>)
+       (ELSE
+        <SET NEXT <MAKE-TAG "PHRASE">>
+        <SET CT <RESULT-TYPE <NTH .K <LENGTH .K>>>>
+        <COND
+         (<OR <AND <N==? <ISTYPE? .PRT> FALSE>
+                   <NOT .CT>
+                   <COND-COMPLAIN 
+"Predicate assumed FALSE to satisfy type constraibnt"
+                                  .PR>>
+              <AND <==? <ISTYPE? .PRT> FALSE>
+                   <COND-COMPLAIN "COND PREDICATE ALWAYS FALSE" .PR>>>
+          <COND (<AND .BRANCH .LAST <NOT .DIR>>
+                 <SET LOCN <GEN .PR .W>>
+                 <COND (<AND <NOT .WSET>
+                             <N==? .LOCN ,NO-DATUM>
+                             <N==? .RW FLUSHED>>
+                        <SET LOCN <SET W <FIXUP-TEMP .W .LOCN>>>
+                        <SET WSET T>)>
+                 <BRANCH-TAG .BRANCH>)
+                (ELSE
+                 <COND (<AND .LAST <NOT <==? .RW FLUSHED>>>
+                        <SET LOCN <GEN .PR .W>>
+                        <COND (<AND <NOT .WSET> <N==? .LOCN ,NO-DATUM>>
+                               <SET LOCN <SET W <FIXUP-TEMP .W .LOCN>>>
+                               <SET WSET T>)>)
+                       (ELSE <SET LOCN <GEN .PR FLUSHED>>)>
+                 <COND (<N==? .PRT NO-RETURN> <BRANCH-TAG .NEXT>)>)>
+          <SET NO-SEQ T>)
+         (<AND <TYPE-OK? FALSE .PRT> <NOT .PRED-TRUE>>
+          <COND
+           (<AND .LAST <NOT .DIR> .BRANCH>
+            <SET LOCN
+                 <PRED-BRANCH-GEN
+                  .BRANCH
+                  .PR
+                  <>
+                  <COND (<==? .RW FLUSHED> FLUSHED)
+                        (<OR .WSET <AND <TYPE? .W TEMP> <0? <TEMP-REFS .W>>>>
+                         <SET WSET T>
+                         .W)
+                        (ELSE <SET WSET T> <SET W <GEN-TEMP <>>>)>
+                  .NOTF>>
+            <DEALLOCATE-TEMP .LOCN>)
+           (<AND .LAST .BRANCH>
+            <FREE-TEMP <PRED-BRANCH-GEN .NEXT .PR <> FLUSHED>>)
+           (<AND .LAST <NOT <==? .RW FLUSHED>>>
+            <SET LOCN
+                 <PRED-BRANCH-GEN
+                  .NEXT
+                  .PR
+                  <>
+                  <COND (<==? .RW FLUSHED> FLUSHED)
+                        (<OR .WSET <AND <TYPE? .W TEMP> <0? <TEMP-REFS .W>>>>
+                         <SET WSET T>
+                         .W)
+                        (ELSE <SET WSET T> <SET W <GEN-TEMP <>>>)>>>
+            <DEALLOCATE-TEMP .LOCN>)
+           (ELSE <PRED-BRANCH-GEN .NEXT .PR <> FLUSHED>)>)
+         (ELSE
+          <SET K (.PR !.K)>
+          <COND (<NOT .LAST>
+                 <SET LEAVE T>
+                 <COND-COMPLAIN "NON REACHABLE COND CLAUSE(S)" <2 .BRN>>)>)>
+        <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>>
+                           <COND (<AND <NOT .WSET> <N==? .LOCN ,NO-DATUM>>
+                                  <SET LOCN <SET W <FIXUP-TEMP .W .LOCN>>>
+                                  <SET WSET T>)>)>)
+                   (ELSE
+                    <SET LOCN
+                         <SEQ-GEN .K
+                                  <COND (<OR <==? .RW FLUSHED>
+                                             <N==? .SDIR .FLG>>
+                                         FLUSHED)
+                                        (ELSE .W)>>>
+                    <COND (<AND <NOT .WSET>
+                                <N==? .RW FLUSHED>
+                                <N==? .LOCN ,NO-DATUM>>
+                           <SET LOCN <SET W <FIXUP-TEMP .W .LOCN>>>
+                           <SET WSET T>)>)>
+             <COND (<==? .FLG .SDIR> <SET BRNCHED T> <BRANCH-TAG .BRANCH>)>)
+            (ELSE
+             <SET LOCN
+                  <PSEQ-GEN .K
+                            <COND (<==? .RW FLUSHED> FLUSHED) (ELSE .W)>
+                            .BRANCH
+                            .SDIR
+                            .NOTF>>
+             <COND (<AND <NOT .WSET>
+                         <N==? .LOCN ,NO-DATUM>
+                         <N==? .RW FLUSHED>>
+                    <SET LOCN <SET W <FIXUP-TEMP .W .LOCN>>>
+                    <SET WSET T>)>)>>)
+         (<NOT .NO-SEQ>
+          <SET LOCN
+               <PSEQ-GEN .K
+                         <COND (<==? .RW FLUSHED> FLUSHED) (ELSE .W)>
+                         .BRANCH
+                         .SDIR
+                         .NOTF>>
+          <COND (<AND <NOT .WSET> <N==? .LOCN ,NO-DATUM> <N==? .RW FLUSHED>>
+                 <SET LOCN <SET W <FIXUP-TEMP .W .LOCN>>>
+                 <SET WSET T>)>)>
+        <COND (<AND <NOT .LAST>
+                    <N==? <RESULT-TYPE <NTH .K <LENGTH .K>>> NO-RETURN>>
+               <OR .NO-SEQ <DEALLOCATE-TEMP .LOCN>>
+               <OR .BRNCHED .NO-SEQ <BRANCH-TAG .COND>>)>
+        <LABEL-TAG .NEXT>)>
+       <COND (<NOT <ASSIGNED? NPRUNE>> <PUT .BR ,CLAUSES ()>)>
+       <AND .LEAVE <MAPLEAVE>>>
+    .KK>
+   <COND (<NOT <ASSIGNED? NPRUNE>> <PUT .NOD ,CLAUSES ()>)>
+   <LABEL-TAG .COND>
+   <SET NW
+       <COND (<==? <RESULT-TYPE .NOD> NO-RETURN> ,NO-DATUM)
+             (ELSE <MOVE-ARG .W .RW>)>>
+   .NW>
+
+<DEFINE FIXUP-TEMP (W LOCN) 
+       <COND (<AND <TYPE? .LOCN TEMP> <L=? <TEMP-REFS .LOCN> 1>> .LOCN)
+             (<==? .LOCN .W> .LOCN)
+             (ELSE <MOVE-ARG .LOCN <GEN-TEMP <>>>)>>
+
+<DEFINE PSEQ-GEN (L W B D NF "AUX" (WSET <>) WW) 
+   #DECL ((L) <LIST [REST NODE]>)
+   <MAPR <>
+    <FUNCTION (N "AUX" (ND <1 .N>) NX K) 
+           #DECL ((N) <LIST NODE> (ND) NODE)
+           <COND (<NOT <EMPTY? <REST .N>>>
+                  <SET NX <2 .N>>
+                  <COND (<AND <==? <NODE-TYPE .NX> ,CALL-CODE>
+                              <G=? <LENGTH <SET K <KIDS .NX>>> 2>
+                              <==? <NODE-NAME <1 .K>> `ENDIF>>
+                         <SET WW <GEN .ND .W>>
+                         <COND (<AND <NOT .WSET>
+                                     <N==? .W FLUSHED>
+                                     <N==? .WW ,NO-DATUM>
+                                     <N==? .W ,POP-STACK>>
+                                <SET W <FIXUP-TEMP .W .WW>>
+                                <SET WSET T>)>
+                         <COND (<NOT <EMPTY? <REST .N 2>>>
+                                <DEALLOCATE-TEMP .W>)>)
+                        (<OR <AND <G=? <LENGTH .ND> <INDEX ,SIDE-EFFECTS>>
+                                  <SIDE-EFFECTS .ND>>
+                             <GETPROP .ND DONT-FLUSH-ME>
+                             ,DONT-FLUSH-ME>
+                         <GEN .ND FLUSHED>)>)
+                 (<AND <==? <NODE-TYPE .ND> ,CALL-CODE>
+                       <G=? <LENGTH <SET K <KIDS .ND>>> 2>
+                       <==? <NODE-NAME <1 .K>> `ENDIF>>
+                  <GEN .ND FLUSHED>)
+                 (ELSE
+                  <SET W
+                       <COND (.B <PRED-BRANCH-GEN .B .ND .D .W .NF>)
+                             (ELSE <GEN .ND .W>)>>)>>
+    .L>
+   .W>
+
+<DEFINE COND-COMPLAIN (MSG N1) #DECL ((N1) NODE) <COMPILE-NOTE .MSG .N1>>
+
+" 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 W NOTF BRANCH DIR
+                 "AUX" (RW .W) (BOOL <MAKE-TAG "BOOL">)
+                       (FLUSH <==? .RW FLUSHED>) (WSET <>)
+                       (FLS <AND <NOT .BRANCH> .FLUSH>) RTF SRES LOCN FIN)
+   #DECL ((PREDS) <LIST [REST NODE]> (NOTF DIR FLUSH FLS RTF) ANY (BOOL) ATOM
+         (BRANCH) <OR ATOM FALSE> (NOD) NODE (LOCN) ANY (SRES RESULT) ANY)
+   <COND (<OR <==? .W ,POP-STACK>
+             <AND <TYPE? .W TEMP>
+                  <TEMP-NO-RECYCLE .W>
+                  <N==? <TEMP-NO-RECYCLE .W> ANY>>>
+         <SET W DONT-CARE>)>
+   <COND (.NOTF <SET RESULT <NOT .RESULT>>)>
+   <SET SRES .RESULT>
+   <SET RTF
+       <AND <NOT .FLUSH>
+            <==? .SRES .DIR>
+            <TYPE-OK? <RESULT-TYPE .NOD> FALSE>>>
+   <COND (.DIR <SET RESULT <NOT .RESULT>>)>
+   <COND
+    (<EMPTY? .PREDS> <SET LOCN <MOVE-ARG <REFERENCE .RESULT> .W>>)
+    (ELSE
+     <MAPR <>
+      <FUNCTION (BRN
+                "AUX" (BR <1 .BRN>) (LAST <EMPTY? <REST .BRN>>)
+                      (RT <RESULT-TYPE .BR>) (RTFL <>) TY)
+        #DECL ((BRN) <LIST NODE [REST NODE]> (BR) NODE)
+        <COND
+         (<AND .FLUSH
+               <NOT .LAST>
+               <EMPTY? <REST .BRN 2>>
+               <OR <AND <==? <ISTYPE? <SET TY <RESULT-TYPE <2 .BRN>>>> FALSE>
+                        <NOT .SRES>
+                        <SET TY FALSE>>
+                   <AND .SRES <NOT <TYPE-OK? .TY FALSE>>>>
+               <OR <L? <LENGTH <2 .BRN>> <INDEX ,SIDE-EFFECTS>>
+                   <NOT <SIDE-EFFECTS <2 .BRN>>>>>
+          <COND (<==? .TY FALSE> <SET RT ATOM>) (ELSE <SET RT FALSE>)>)>
+        <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)
+                      (<OR .WSET <AND <TYPE? .W TEMP> <0? <TEMP-REFS .W>>>>
+                       <SET WSET T>
+                       .W)
+                      (ELSE <SET WSET T> <SET W <GEN-TEMP <>>>)>
+                .NOTF>>)
+             (ELSE
+              <SET LOCN
+               <PRED-BRANCH-GEN
+                <COND (.FLS .BOOL) (.RESULT .BOOL) (ELSE .BRANCH)>
+                .BR
+                .SRES
+                <COND (<OR .FLUSH <NOT .RTF>> FLUSHED)
+                      (<OR .WSET <AND <TYPE? .W TEMP> <0? <TEMP-REFS .W>>>>
+                       <SET WSET T>
+                       .W)
+                      (ELSE <SET WSET T> <SET W <GEN-TEMP <>>>)>
+                .NOTF>>
+              <DEALLOCATE-TEMP .LOCN>)>)
+           (.LAST
+            <SET LOCN <GEN .BR .W>>
+            <COND (<AND <NOT .FLUSH> <N==? .LOCN ,NO-DATUM> <NOT .WSET>>
+                   <SET LOCN <SET W <FIXUP-TEMP .W .LOCN>>>
+                   <SET WSET T>)>
+            .LOCN)
+           (ELSE
+            <SET LOCN
+                 <PRED-BRANCH-GEN
+                  .BOOL
+                  .BR
+                  .DIR
+                  <COND (.FLUSH FLUSHED)
+                        (<OR .WSET <AND <TYPE? .W TEMP> <0? <TEMP-REFS .W>>>>
+                         <SET WSET T>
+                         .W)
+                        (ELSE <SET WSET T> <SET W <GEN-TEMP <>>>)>
+                  .NOTF>>
+            <DEALLOCATE-TEMP .LOCN>)>)
+         (<OR <N==? .SRES <COND (.NOTF <SET RTFL <NOT .RTFL>>) (ELSE .RTFL)>>
+              .LAST>
+          <COND (<NOT .LAST>
+                 <COMPILE-NOTE "NON REACHABLE AND/OR CLAUSE" <2 .BRN>>)>
+          <COND (.BRANCH
+                 <SET LOCN
+                      <GEN .BR <COND (<N==? .DIR .RTFL> .W) (ELSE FLUSHED)>>>
+                 <COND (<AND <NOT .FLUSH>
+                             <N==? .LOCN ,NO-DATUM>
+                             <NOT .WSET>
+                             <N==? .DIR .RTFL>>
+                        <SET LOCN <SET W <FIXUP-TEMP .W .LOCN>>>
+                        <SET WSET T>)>
+                 <COND (<AND <N==? .DIR .RTFL>
+                             <N==? <RESULT-TYPE .BR> NO-RETURN>>
+                        <BRANCH-TAG .BRANCH>)>)
+                (ELSE
+                 <SET LOCN <GEN .BR .W>>
+                 <COND (<AND <NOT .FLUSH> <N==? .LOCN ,NO-DATUM> <NOT .WSET>>
+                        <SET LOCN <SET W <FIXUP-TEMP .W .LOCN>>>
+                        <SET WSET T>)>
+                 .LOCN)>
+          <MAPLEAVE>)
+         (ELSE
+          <COND (<OR <L? <LENGTH .BR> <INDEX ,SIDE-EFFECTS>>
+                     <NOT <SIDE-EFFECTS .BR>>
+                     <==? .BRN .PREDS>>
+                 <COMPILE-NOTE <STRING "PREDICATE ALWAYS "
+                                       <COND (.RTFL "FALSE")
+                                             (ELSE "TRUE")>  " IN AND/OR">
+                               .BR>)>
+          <GEN .BR FLUSHED>)>>
+      .PREDS>)>
+   <COND (<NOT <ASSIGNED? NPRUNE>> <PUT .NOD ,CLAUSES ()>)>
+   <COND (<NOT <AND .BRANCH <NOT .RESULT>>> <LABEL-TAG .BOOL>)>
+   <SET FIN
+       <COND (<==? <RESULT-TYPE .NOD> NO-RETURN> ,NO-DATUM)
+             (ELSE <MOVE-ARG .W .RW>)>>
+   .FIN>
+
+" Generate code for ASSIGNED?"
+
+<DEFINE ASSIGNED?-GEN (N W
+                      "OPTIONAL" (NF <>) (BR <>) (DIR <>) (SETF <>)
+                      "AUX" (A <NODE-NAME .N>) (SDIR .DIR)
+                            (FLS <==? .W FLUSHED>) B2 TMP (GLOBAL T))
+       #DECL ((N) NODE)
+       <COND (<==? .W DONT-CARE> <SET W <GEN-TEMP <>>>)>
+       <COND (.NF <SET DIR <NOT .DIR>>)>
+       <COND (.SETF <DEALLOCATE-TEMP <MOVE-ARG <REFERENCE <NOT .SDIR>>
+                                               .W>>)>
+       <SET DIR <COND (<AND .BR <NOT .FLS>> <NOT .DIR>) (ELSE .DIR)>>
+       <COND (<AND <TYPE? .A SYMTAB> <NOT <SPEC-SYM .A>>>
+              <SET A <LADDR .A>>
+              <COND (<AND .BR .FLS>
+                     <GEN-TYPE? .A UNBOUND .BR <NOT .DIR>>
+                     FLUSHED)
+                    (.BR
+                     <GEN-TYPE? .A UNBOUND <SET B2 <MAKE-TAG>> <NOT .DIR>>
+                     <SET W <MOVE-ARG <REFERENCE .SDIR> .W>>
+                     <BRANCH-TAG .BR>
+                     <LABEL-TAG .B2>
+                     .W)
+                    (ELSE
+                     <GEN-TYPE? .A UNBOUND <SET BR <MAKE-TAG>> <NOT .DIR>>
+                     <TRUE-FALSE .N .BR .W>)>)
+             (ELSE
+              <COND (<TYPE? .A SYMTAB>
+                     <COND (<N==? <CODE-SYM .A> -1> <SET GLOBAL <>>)>
+                     <SET A <NAME-SYM .A>>)
+                    (ELSE <SET A <GEN <1 <KIDS .N>>>>)>
+              <COND (<AND .BR .FLS>
+                     <ASS-GEN .A .BR .DIR .GLOBAL>
+                     <FREE-TEMP .A>
+                     FLUSHED)
+                    (.BR
+                     <ASS-GEN .A <SET B2 <MAKE-TAG>> .DIR .GLOBAL>
+                     <SET W <MOVE-ARG <REFERENCE .SDIR> .W>>
+                     <BRANCH-TAG .BR>
+                     <LABEL-TAG .B2>
+                     <FREE-TEMP .A>
+                     .W)
+                    (ELSE
+                     <ASS-GEN .A <SET BR <MAKE-TAG>> .DIR .GLOBAL>
+                     <FREE-TEMP .A>
+                     <TRUE-FALSE .N .BR .W>)>)>>
+
+<DEFINE GASSIGNED?-GEN (N W
+                       "OPTIONAL" (NF <>) (BR <>) (DIR <>) (SETF <>)
+                       "AUX" (A <NODE-NAME .N>) (SDIR .DIR)
+                             (NM <NODE-NAME .N>) (FLS <==? .W FLUSHED>) B2
+                             TMP)
+       #DECL ((N) NODE)
+       <COND (<==? .W DONT-CARE> <SET W <GEN-TEMP <>>>)>
+       <COND (.NF <SET DIR <NOT .DIR>>)>
+       <COND (.SETF <DEALLOCATE-TEMP <MOVE-ARG <REFERENCE <NOT .SDIR>> .W>>)>
+       <SET DIR <COND (<AND .BR <NOT .FLS>> <NOT .DIR>) (ELSE .DIR)>>
+       <SET A <GEN <1 <KIDS .N>>>>
+       <COND (<AND .BR .FLS> <GEN-GASS .A .BR .DIR .NM> FLUSHED)
+             (.BR
+              <GEN-GASS .A <SET B2 <MAKE-TAG>> .DIR .NM>
+              <SET W <MOVE-ARG <REFERENCE .SDIR> .W>>
+              <BRANCH-TAG .BR>
+              <LABEL-TAG .B2>
+              .W)
+             (ELSE
+              <GEN-GASS .A <SET BR <MAKE-TAG>> .DIR .NM>
+              <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)
+       <MOVE-ARG <REFERENCE .THIS> .W>
+       <BRANCH-TAG .B2>
+       <LABEL-TAG .B>
+       <MOVE-ARG <REFERENCE <NOT .THIS>> .W>
+       <LABEL-TAG .B2>
+       <DEALLOCATE-TEMP .W>
+       <MOVE-ARG .W .RW>>
+
+" Generate code for LVAL."
+
+<DEFINE LVAL-GEN (NOD WHERE
+                 "AUX" (SYM <NODE-NAME .NOD>) TT (ADDR <>) REFS
+                       (LIVE
+                        <COND (<==? <LENGTH <SET TT <TYPE-INFO .NOD>>> 2>
+                               <2 .TT>)
+                              (ELSE T)>) TMP)
+   #DECL ((NOD) NODE (SYM) SYMTAB (NO-KILL) LIST (REFS) FIX)
+   <COND (<==? <RESULT-TYPE .NOD> NO-RETURN>
+         <COMPILE-ERROR "Variable referenced before initialization: "
+                        <NAME-SYM .SYM>
+                        .NOD>)>
+   <SET TT
+    <MOVE-ARG
+     <COND
+      (<AND <SPEC-SYM .SYM> <N==? <CODE-SYM .SYM> -1>>
+       <SET TMP
+           <COND (<TYPE? .WHERE TEMP> .WHERE)
+                 (<==? .WHERE ,POP-STACK> .WHERE)
+                 (ELSE <GEN-TEMP <>>)>>
+       <COND (<TYPE? .TMP TEMP> <USE-TEMP .TMP <DECL-SYM .SYM>>)>
+       <GET-VALUE-X <NAME-SYM .SYM> .TMP>
+       .TMP)
+      (<SPEC-SYM .SYM>
+       <SET TMP <COND (<TYPE? .WHERE TEMP> .WHERE) (ELSE <GEN-TEMP <>>)>>
+       <USE-TEMP .TMP>
+       <START-FRAME LVAL>
+       <PUSH-CONSTANT <NAME-SYM .SYM>>
+       <MSUBR-CALL LVAL 1 .TMP>
+       .TMP)
+      (ELSE
+       <SET ADDR <LADDR .SYM>>
+       <COND (<TYPE? .ADDR TEMP>
+             <COND (<AND ,DEATH
+                         <NOT .LIVE>
+                         <NOT <SPEC-SYM .SYM>>
+                         <NOT <MAPF <>
+                                    <FUNCTION (LL) 
+                                            #DECL ((LL) LIST)
+                                            <AND <==? <1 .LL> .SYM>
+                                                 <PUT .LL 2 T>
+                                                 <MAPLEAVE>>>
+                                    .NO-KILL>>>)
+                   (<0? <SET REFS <TEMP-REFS .ADDR>>> <USE-TEMP .ADDR>)
+                   (ELSE <PUT .ADDR ,TEMP-REFS <+ .REFS 1>>)>)>
+       .ADDR)>
+     .WHERE>>
+   .TT>
+
+<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>>>
+                      <SET TT <TEMP-NAME-SYM <SET SYM <1 .TT>>>>
+                      <FREE-TEMP .TT>)>
+               <SET L1 <REST .L1>>>>
+
+" Generate LVAL for free variable."
+
+<DEFINE FLVAL-GEN (NOD WHERE "AUX" TMP T1) 
+       #DECL ((NOD) NODE)
+       <SET TMP <COND (<==? .WHERE DONT-CARE> <GEN-TEMP <>>) (ELSE .WHERE)>>
+       <COND (<TYPE? .TMP TEMP> <USE-TEMP .TMP>)>
+       <COND (<TYPE? <SET T1 <NODE-NAME .NOD>> SYMTAB>
+              <SET T1 <NAME-SYM .T1>>)
+             (<==? <NODE-TYPE <1 <KIDS .NOD>>> ,QUOTE-CODE>
+              <SET T1 <NODE-NAME <1 <KIDS .NOD>>>>)
+             (ELSE <SET T1 <GEN <1 <KIDS .NOD>>>>)>
+       <GET-VALUE-X .T1 .TMP T>
+       <FREE-TEMP .T1>
+       <MOVE-ARG .TMP .WHERE>>
+
+<DEFINE FSET-GEN (NOD WHERE "AUX" TT (TEM <>) T1) 
+       #DECL ((NOD) NODE (TEM) <OR FALSE NODE>)
+       <COND (<==? <NODE-SUBR .NOD> ,SET> <SET TEM <2 <KIDS .NOD>>>)>
+       <COND (<TYPE? <SET TT <NODE-NAME .NOD>> SYMTAB>
+              <SET TT <NAME-SYM .TT>>)
+             (<==? <NODE-TYPE <SET T1 <1 <KIDS .NOD>>>> ,QUOTE-CODE>
+              <SET TT <NODE-NAME .T1>>)
+             (ELSE
+              <SET TT <GEN .T1>>
+              <COND (.TEM <SET TT <INTERF-CHANGE .TT .TEM>>)>)>
+       <COND (.TEM
+              <SET T1
+                   <GEN .TEM <COND (<TYPE? .WHERE TEMP> .WHERE)
+                                   (ELSE DONT-CARE)>>>)
+             (ELSE
+              <SET T1 ,THE-UNBOUND>)>
+       <SET T1 <SET-VALUE .TT .T1 T>>
+       <FREE-TEMP .TT>
+       <MOVE-ARG <COND (<==? .T1 ,THE-UNBOUND> .TT) (ELSE .T1)> .WHERE>>
+
+" Generate code for an internal SET."
+
+<DEFINE SET-GEN (NOD WHERE "OPT" (NOTF <>) (BRANCH <>) (DIR <>)
+                "AUX" (SYM <NODE-NAME .NOD>) TY PT TEM (TT <>) REFS
+                                (NM <2 <CHTYPE <NODE-SUBR .NOD> MSUBR>>))
+       #DECL ((NOD) NODE (SYM) SYMTAB)
+       <COND
+        (<AND <SPEC-SYM .SYM> <N==? <CODE-SYM .SYM> -1>>
+         <COND (<==? .NM SET>
+                <SET TEM
+                     <GEN <2 <KIDS .NOD>>
+                          <COND (<TYPE? .WHERE TEMP> .WHERE) (ELSE DONT-CARE)>>>
+                <SET-VALUE <NAME-SYM .SYM> .TEM>)
+               (ELSE
+                <SET-VALUE <NAME-SYM .SYM> ,THE-UNBOUND>
+                <SET TEM <NAME-SYM .SYM>>)>
+         <MOVE-ARG .TEM .WHERE>)
+        (<AND <SPEC-SYM .SYM> <==? .NM UNASSIGN>>
+         <START-FRAME UNASSIGN>
+         <PUSH-CONSTANT <NAME-SYM .SYM>>
+         <COND (<==? .WHERE DONT-CARE>
+                <SET WHERE <GEN-TEMP <RESULT-TYPE .NOD>>>)
+               (<TYPE? .WHERE TEMP> <USE-TEMP .WHERE <RESULT-TYPE .NOD>>)>
+         <MSUBR-CALL UNASSIGN 1 .WHERE>
+         <COND (<==? .WHERE FLUSHED> ,NO-DATUM) (ELSE .WHERE)>)
+        (<SPEC-SYM .SYM>
+         <START-FRAME SET>
+         <PUSH-CONSTANT <NAME-SYM .SYM>>
+         <GEN <2 <KIDS .NOD>> ,POP-STACK>
+         <COND (<==? .WHERE DONT-CARE>
+                <SET WHERE <GEN-TEMP <RESULT-TYPE .NOD>>>)
+               (<TYPE? .WHERE TEMP> <USE-TEMP .WHERE <RESULT-TYPE .NOD>>)>
+         <MSUBR-CALL SET 2 .WHERE>
+         <COND (<==? .WHERE FLUSHED> ,NO-DATUM) (ELSE .WHERE)>)
+        (ELSE
+         <SET TEM <LADDR .SYM>>
+         <COND (<AND <NOT <TEMP-ALLOC .TEM>>
+                     <COND (<AND <SET TY <ISTYPE? <DECL-SYM .SYM>>>
+                                 <OR <==? <SET PT <TYPEPRIM .TY>> FIX>
+                                     <==? .PT WORD>
+                                     <==? .PT LIST>>>
+                            .TY)>>
+                <DEALLOCATE-TEMP <USE-TEMP .TEM .TY>>)>
+         <COND (<==? .NM SET>
+                <COND (.BRANCH
+                       <COND (.NOTF <SET DIR <NOT .DIR>>)>
+                       <PRED-BRANCH-GEN .BRANCH <2 <KIDS .NOD>> .DIR .TEM
+                                         <> T>)
+                      (ELSE
+                       <SET TEM <GEN <2 <KIDS .NOD>> .TEM>>)>)
+               (ELSE
+                <MOVE-ARG ,THE-UNBOUND .TEM>)>
+         <COND (<TYPE? .TEM TEMP>
+                <COND (<0? <SET REFS <TEMP-REFS .TEM>>> <SET REFS 1>)>
+                <PUT .TEM ,TEMP-REFS <+ .REFS 1>>)>
+         <MOVE-ARG .TEM .WHERE>)>>
+
+<DEFINE ARG? (SYM) #DECL ((SYM) SYMTAB) <1? <NTH ,ARGTBL <CODE-SYM .SYM>>>>
+
+<DEFINE OPT? (SYM) #DECL ((SYM) SYMTAB) <1? <NTH ,OPTBL <CODE-SYM .SYM>>>>
+
+<SETG OPTBL ![0 0 0 0 0 1 1 1 1 0 0 0 0]>
+
+<SETG ARGTBL ![0 0 0 0 1 0 0 0 0 1 0 1 1]>
+
+<GDECL (OPTBL ARGTBL) <UVECTOR [REST FIX]>>
+
+" Compute the address of a local variable using the stack model."
+
+<DEFINE LADDR (S) #DECL ((S) SYMTAB) <TEMP-NAME-SYM .S>>
+
+" 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" (RT <RESULT-TYPE .N>) (TYP <ISTYPE? .RT>)) 
+       #DECL ((N) NODE)
+       <GEN-GVAL <NODE-NAME <1 <KIDS .N>>>
+                 <COND (<==? .W DONT-CARE>
+                        <SET W <GEN-TEMP .RT>>)
+                       (<TYPE? .W TEMP> <USE-TEMP .W .RT> .W)
+                       (ELSE .W)>
+                 .TYP>
+       .W>
+
+" Do SETG using direct locative reference."
+
+<DEFINE SETG-GEN (N W "AUX" TEM) 
+       #DECL ((N) NODE)
+       <SET TEM <GEN <2 <KIDS .N>>>>
+       <GEN-SETG <NODE-NAME <1 <KIDS .N>>>
+                 .TEM
+                 <COND (<==? <LENGTH <KIDS .N>> 3>
+                        <GEN <3 <KIDS .N>> DONT-CARE>)
+                       (ELSE <>)>
+                 FLUSHED>
+       <MOVE-ARG .TEM .W>>
+
+" Generate GVAL calls."
+
+<DEFINE FGVAL-GEN (N W "AUX" TEM) 
+       #DECL ((N) NODE)
+       <GEN-GVAL <SET TEM <GEN <1 <KIDS .N>>>>
+                 <COND (<==? .W DONT-CARE>
+                        <SET W <GEN-TEMP <RESULT-TYPE .N>>>)
+                       (<TYPE? .W TEMP> <USE-TEMP .W <RESULT-TYPE .N>> .W)
+                       (ELSE .W)>>
+       <FREE-TEMP .TEM>
+       .W>
+
+" Generate a SETG call."
+
+<DEFINE FSETG-GEN (NOD W "AUX" TEM ATM) 
+       #DECL ((NOD) NODE)
+       <SET ATM <GEN <1 <KIDS .NOD>>>>
+       <SET ATM <INTERF-CHANGE .ATM <2 <KIDS .NOD>>>>
+       <SET TEM
+            <GEN <2 <KIDS .NOD>>
+                 <COND (<TYPE? .W TEMP> .W) (ELSE DONT-CARE)>>>
+       <GEN-SETG .ATM
+                 .TEM
+                 <COND (<==? <LENGTH <KIDS .NOD>> 3>
+                        <GEN <3 <KIDS .NOD>> DONT-CARE>)
+                       (ELSE <>)>
+                 .W>
+       <FREE-TEMP .ATM>
+       <MOVE-ARG .TEM .W>>
+
+<DEFINE CHTYPE-GEN (NOD WHERE
+                   "AUX" (TYP <ISTYPE? <RESULT-TYPE .NOD>>)
+                         (N <1 <KIDS .NOD>>) N2 TEM TT)
+       #DECL ((NOD N) NODE)
+       <COND (<AND .TYP
+                   <TYPE? <PARENT .NOD> NODE>
+                   <MEMQ <NODE-TYPE <PARENT .NOD>> ,CHTYPE-FOR-FREE>
+                   <OR <==? .WHERE ,POP-STACK> <==? .WHERE DONT-CARE>>>
+              <GEN .N .WHERE>)
+             (ELSE
+              <SET TEM <GEN .N>>
+              <COND (<AND <G? <LENGTH <KIDS .NOD>> 1>
+                          <N==? <NODE-TYPE <SET N2 <2 <KIDS .NOD>>>>
+                                ,QUOTE-CODE>>
+                     <SET TEM <INTERF-CHANGE .TEM .N2>>
+                     <SET TT <GEN <1 <KIDS .N2>>>>)>
+              <COND (<==? .WHERE DONT-CARE>
+                     <COND (<AND <TYPE? .TEM TEMP> <L=? <TEMP-REFS .TEM> 1>>
+                            <DEALLOCATE-TEMP <SET WHERE .TEM>>
+                            <USE-TEMP .TEM .TYP>)
+                           (ELSE
+                            <SET WHERE <GEN-TEMP <COND (.TYP) (ELSE ANY)>>>)>)
+                    (<TYPE? .WHERE TEMP> <USE-TEMP .WHERE .TYP>)>
+              <COND (<AND <ASSIGNED? N2> <N==? <NODE-TYPE .N2> ,QUOTE-CODE>>
+                     <COND (<NOT <TYPE? .TT TEMP>>
+                            <SET TT <MOVE-ARG .TT <GEN-TEMP <>>>>)>
+                     <GEN-CHTYPE .TEM <FORM `TYPE <TEMP-NAME .TT>> .WHERE>
+                     <FREE-TEMP .TT>)
+                    (ELSE <GEN-CHTYPE .TEM .TYP .WHERE>)>
+              <COND (<N==? .TEM .WHERE> <FREE-TEMP .TEM>)>
+              .WHERE)>>
+
+<GDECL (CHTYPE-FOR-FREE) <VECTOR [REST FIX]>>
+
+<SETG CHTYPE-FOR-FREE
+      [,NTH-CODE
+       ,ARITH-CODE
+       ,0-TST-CODE
+       ,1?-CODE
+       ,TEST-CODE
+       ,LNTH-CODE
+       ,MT-CODE
+       ,REST-CODE
+       ,MOD-CODE
+       ,BITS-CODE
+       ,BITL-CODE
+       ,ROT-CODE
+       ,LSH-CODE
+       ,BIT-TEST-CODE]>
+
+" Generate do-nothing piece of code."
+
+<DEFINE ID-GEN (N W) #DECL ((N) NODE) <GEN <1 <KIDS .N>> .W>>
+
+" Generate call to READ etc. with eof condition."
+
+<DEFINE READ2-GEN (N W "AUX" (I 0) SPOB BRANCH TMP CF) 
+       #DECL ((N) NODE (I) FIX (SPOB) NODE)
+       <COND (<AND <TYPE? .W TEMP> <L? <TEMP-REFS .W> 1>> <SET TMP .W>)
+             (ELSE <SET TMP <GEN-TEMP <>>>)>
+       <START-FRAME <NODE-NAME .N>>
+       <MAPF <>
+             <FUNCTION (OB) 
+                     #DECL ((OB SPOB) NODE (I) FIX)
+                     <COND (<==? <NODE-TYPE .OB> ,EOF-CODE>
+                            <SET SPOB .OB>
+                            <CURRENT-FRAME ,POP-STACK>)
+                           (ELSE <GEN .OB ,POP-STACK>)>
+                     <SET I <+ .I 1>>>
+             <KIDS .N>>
+       <USE-TEMP .TMP>
+       <MSUBR-CALL <NODE-NAME .N> .I .TMP>
+       <GEN-==? <SET CF <CURRENT-FRAME>> .TMP <> <SET BRANCH <MAKE-TAG>>>
+       <FREE-TEMP .CF>
+       <DEALLOCATE-TEMP .TMP>
+       <GEN .SPOB .TMP>
+       <LABEL-TAG .BRANCH>
+       <MOVE-ARG .TMP .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>) (BR <MAKE-TAG>) TMP (LN <LENGTH .K>) CF)
+       #DECL ((N) NODE (K) <LIST NODE NODE [REST NODE]> (LN) FIX)
+       <START-FRAME <NODE-NAME .N>>
+       <GEN <1 .K> ,POP-STACK>
+       <GEN <2 .K> ,POP-STACK>
+       <COND (<==? .LN 3> <CURRENT-FRAME ,POP-STACK>)>
+       <MSUBR-CALL <NODE-NAME .N>
+                   .LN
+                   <COND (<AND <TYPE? .W TEMP>
+                               <OR <L? .LN 3> <L? <TEMP-REFS .W> 1>>>
+                          <USE-TEMP <SET TMP .W>>)
+                         (ELSE <SET TMP <GEN-TEMP>>)>>
+       <COND (<==? .LN 3>
+              <GEN-==? <SET CF <CURRENT-FRAME>> .TMP <> <SET BR <MAKE-TAG>>>
+              <FREE-TEMP .CF>
+              <COND (.REV
+                     <START-FRAME EVAL>
+                     <GEN <3 .K> ,POP-STACK>
+                     <DEALLOCATE-TEMP <MSUBR-CALL EVAL 1 .TMP>>)
+                    (ELSE <DEALLOCATE-TEMP <GEN <3 .K> .TMP>>)>
+              <LABEL-TAG .BR>)>
+       <MOVE-ARG .TMP .W>>
+
+'<SETG GETTERS [,GET ,GETL ,GETPROP ,GETPL]>
+
+<SETG STACK-INS [`CALL `UBLOCK `LIST `SYSCALL]>
+
+<GDECL (STACK-INS) <VECTOR [REST ATOM]>>
+
+<DEFINE CALL-GEN (NOD WHERE
+                 "OPT" (NOTF <>) (B <>) (D <>)
+                 "AUX" (K <KIDS .NOD>) (INS <NODE-NAME <1 .K>>) L RECSPEC
+                       (ON-STACK <>) COUNTMP SEGTMP I INS1 (REC? <>))
+   #DECL ((NOD) NODE (K) <LIST NODE [REST NODE]>)
+   <COND (.NOTF <SET D <NOT .D>>)>
+   <COND
+    (<MEMQ .INS ,STACK-INS>
+     <SET ON-STACK T>
+     <COND (<OR <==? .INS `CALL> <==? .INS `SCALL>>
+           <COND (<AND <==? <NODE-TYPE <SET INS1 <2 .K>>> ,QUOTE-CODE>
+                       <TYPE? <NODE-NAME .INS1> ATOM>>
+                  <IEMIT <COND (<==? .INS `CALL> `FRAME) (ELSE `SFRAME)>
+                         <FORM QUOTE
+                               <SET INS1
+                                    <CHTYPE <NODE-NAME .INS1> FCN-ATOM>>>>
+                  <SET INS1 <FORM QUOTE .INS1>>)
+                 (ELSE
+                  <IEMIT <COND (<==? .INS `CALL> `FRAME) (ELSE `SFRAME)>>
+                  <SET INS1 <GEN .INS1>>)>
+           <SET K <REST .K>>)
+          (<==? .INS `SYSCALL> <SET INS1 <GEN <2 .K>>> <SET K <REST .K>>)>)>
+   <COND (<GETPROP .INS `RECORD-TYPE> <SET REC? T>)>
+   <SET I
+       <MAPF ,+
+             <FUNCTION (N) 
+                     #DECL ((N) NODE)
+                     <COND (<==? <NODE-TYPE .N> ,SEGMENT-CODE> 0) (ELSE 1)>>
+             <REST .K>>>
+   <SET L
+    <MAPR ,LIST
+     <FUNCTION (NL "AUX" (N <1 .NL>) TMP) 
+       #DECL ((N) NODE (NL) <LIST NODE>)
+       <COND (<==? <NODE-TYPE .N> ,SEGMENT-CODE>
+              <COND (<NOT <ASSIGNED? SEGTMP>>
+                     <SET SEGTMP <GEN-TEMP <>>>
+                     <SET COUNTMP <GEN-TEMP <>>>
+                     <SET-TEMP .COUNTMP .I '(`TYPE FIX)>)>
+              <GEN <1 <KIDS .N>> .SEGTMP>
+              <SEGMENT-STACK
+               .SEGTMP
+               .COUNTMP
+               <STRUCTYP <RESULT-TYPE <1 <KIDS .N>>>>
+               <ISTYPE? <RESULT-TYPE <1 <KIDS .N>>>>>)
+             (ELSE
+              <SET TMP
+                   <GEN .N <COND (.ON-STACK ,POP-STACK) (ELSE DONT-CARE)>>>
+              <COND (<NOT .ON-STACK>
+                     <MAPF <>
+                           <FUNCTION (NN) <SET TMP <INTERF-CHANGE .TMP .NN>>>
+                           <REST .NL>>)>
+              .TMP)>>
+     <REST .K>>>
+   <COND (<NOT .ON-STACK> <MAPF <> <FUNCTION (X) <FREE-TEMP .X <>>> .L>)>
+   <COND (<OR <==? .WHERE FLUSHED> <==? <RESULT-TYPE .NOD> NO-RETURN>>
+         <COND (.ON-STACK
+                <COND (<ASSIGNED? INS1>
+                       <IEMIT .INS
+                              .INS1
+                              <COND (<ASSIGNED? COUNTMP> .COUNTMP) (ELSE .I)>>
+                       <FREE-TEMP .INS1>)
+                      (ELSE
+                       <IEMIT .INS
+                              <COND (<ASSIGNED? COUNTMP> .COUNTMP)
+                                    (ELSE .I)>>)>)
+               (.B <IEMIT .INS !.L <COND (.D +) (ELSE -)> .B>)
+               (ELSE <IEMIT .INS !.L>)>
+         <SET WHERE ,NO-DATUM>)
+        (ELSE
+         <COND (<ASSIGNED? COUNTMP>
+                <FREE-TEMP .COUNTMP <>>
+                <FREE-TEMP .SEGTMP <>>)>
+         <COND (<==? .WHERE DONT-CARE>
+                <SET WHERE <GEN-TEMP <RESULT-TYPE .NOD>>>)
+               (<TYPE? .WHERE TEMP> <USE-TEMP .WHERE <RESULT-TYPE .NOD>>)>
+         <COND (.ON-STACK
+                <COND (<ASSIGNED? INS1>
+                       <IEMIT .INS
+                              .INS1
+                              <COND (<ASSIGNED? COUNTMP> .COUNTMP) (ELSE .I)>
+                              =
+                              .WHERE>
+                       <FREE-TEMP .INS1>)
+                      (ELSE
+                       <IEMIT .INS
+                              <COND (<ASSIGNED? COUNTMP> .COUNTMP) (ELSE .I)>
+                              =
+                              .WHERE>)>)
+               (<AND .REC?
+                     <TYPE? <SET RECSPEC <NTH .L <LENGTH .L>>> LIST>
+                     <==? <LENGTH .RECSPEC> 2>
+                     <=? <SPNAME <1 .RECSPEC>> "RECORD-TYPE">>
+                <COND (<==? <LENGTH .L> 1> <SET L ()>)
+                      (ELSE <PUTREST <REST .L <- <LENGTH .L> 2>> ()>)>
+                <IEMIT .INS !.L = .WHERE .RECSPEC>)
+               (.B <IEMIT .INS !.L = .WHERE <COND (.D +) (ELSE -)> .B>)
+               (ELSE <IEMIT .INS !.L = .WHERE>)>)>
+   .WHERE>
+
+<DEFINE CHANNEL-OP-GEN (NOD WHERE
+                       "AUX" (CTY <NODE-SUBR .NOD>) (K <KIDS .NOD>) L I)
+   #DECL ((NOD) NODE (K) <LIST NODE [REST NODE]> (L) LIST)
+   <SET I <+ <LENGTH .K> 1>>
+   <SET L
+    <MAPR ,LIST
+     <FUNCTION (NL "AUX" (N <1 .NL>) TMP) 
+            #DECL ((N) NODE (NL) <LIST NODE>)
+            <COND (<==? <NODE-TYPE .N> ,QUOTE-CODE>
+                   <COND (<TYPE? <SET TMP <NODE-NAME .N>> ATOM>
+                          <FORM QUOTE .TMP>)
+                         (ELSE .TMP)>)
+                  (ELSE
+                   <SET TMP <GEN .N DONT-CARE>>
+                   <MAPF <>
+                         <FUNCTION (NN) <SET TMP <INTERF-CHANGE .TMP .NN>>>
+                         <REST .NL>>
+                   .TMP)>>
+     .K>>
+   <MAPF <> <FUNCTION (X) <FREE-TEMP .X <>>> .L>
+   <COND (<OR <==? .WHERE FLUSHED> <==? <RESULT-TYPE .NOD> NO-RETURN>>
+         <IEMIT `CHANNEL-OP <FORM QUOTE .CTY> <2 .L> <1 .L> !<REST .L 2>>)
+        (ELSE
+         <COND (<==? .WHERE DONT-CARE>
+                <SET WHERE <GEN-TEMP <RESULT-TYPE .NOD>>>)
+               (<TYPE? .WHERE TEMP> <USE-TEMP .WHERE <RESULT-TYPE .NOD>>)>
+         <IEMIT `CHANNEL-OP
+                <FORM QUOTE .CTY>
+                <2 .L>
+                <1 .L>
+                !<REST .L 2>
+                =
+                .WHERE>)>
+   .WHERE>
+
+<DEFINE SMSUBR-CALL (SUBRC NARGS WHERE "OPT" (STACK? <>) (SLNT <>)
+                    "AUX"  (W <COND (<AND <==? .SUBRC STRING>
+                                          <NOT .SLNT>
+                                          .STACK?
+                                          <NOT <TYPE? .WHERE TEMP>>>
+                                     <GEN-TEMP STRING>)
+                                    (ELSE .WHERE)>)) 
+       #DECL ((STK STK-CHARS7 STK-CHARS8) FIX)
+       <COND (<OR <==? .SUBRC VECTOR>
+                  <==? .SUBRC UVECTOR>
+                  <==? .SUBRC STRING>
+                  <==? .SUBRC BYTES>
+                  <==? .SUBRC TUPLE>>
+              <IEMIT <COND (.STACK? `SBLOCK) (ELSE `UBLOCK)>
+                     <FORM `TYPE-CODE .SUBRC>
+                     .NARGS
+                     =
+                     .W
+                     (`TYPE .SUBRC)>
+              <COND (.STACK?
+                     <COND (<OR <TYPE? .NARGS TEMP>
+                                <AND <NOT .SLNT>
+                                     <==? .SUBRC STRING>
+                                     <SET NARGS <GEN-TEMP FIX>>>>
+                            <COND (<OR <==? .SUBRC VECTOR> <==? .SUBRC TUPLE>>
+                                   <IEMIT `DIV .NARGS 2 = .NARGS>)
+                                  (<==? .SUBRC BYTES>
+                                   <IEMIT `ADD .NARGS 3 =.NARGS>
+                                   <IEMIT `DIV .NARGS 4 = .NARGS>)
+                                  (<==? .SUBRC STRING>
+                                   <IEMIT `LENUS .W = .NARGS>
+                                   <IEMIT `IFSYS "TOPS20">
+                                   <IEMIT `ADD .NARGS 4 = .NARGS>
+                                   <IEMIT `DIV .NARGS 5 = .NARGS>
+                                   <IEMIT `ENDIF "TOPS20">
+                                   <IEMIT `IFSYS "UNIX">
+                                   <IEMIT `ADD .NARGS 3 = .NARGS>
+                                   <IEMIT `DIV .NARGS 4 = .NARGS>
+                                   <IEMIT `ENDIF "UNIX">)>
+                            <FREE-TEMP .NARGS <>>
+                            <COND (<ASSIGNED? STKTMP>
+                                   <IEMIT `SUB .STKTMP .NARGS = .STKTMP>)
+                                  (ELSE
+                                   <IEMIT `SUB 0 .NARGS =
+                                          <SET STKTMP <GEN-TEMP FIX>>>)>
+                            <SET STK <+ .STK 2>>)
+                           (<==? .SUBRC STRING>
+                            <SET STK-CHARS7
+                                 <+ </ <+ .SLNT 4> 5> .STK-CHARS7>>
+                            <SET STK-CHARS8
+                                 <+ </ <+ .SLNT 3> 4> .STK-CHARS8>>
+                            <SET STK <+ .STK 2>>)
+                           (ELSE
+                            <SET STK
+                                 <+ .STK
+                                    <COND (<==? .SUBRC UVECTOR> .NARGS)
+                                          (<==? .SUBRC BYTES>
+                                           </ <+ .NARGS 3> 4>)
+                                          (ELSE <* .NARGS 2>)>
+                                    2>>)>)>
+              <COND (<N==? .W .WHERE> <MOVE-ARG .W .WHERE>)>)
+             (<==? .SUBRC LIST> <IEMIT `LIST .NARGS = .WHERE '(`TYPE LIST)>)
+             (ELSE <MSUBR-CALL .SUBRC .NARGS .WHERE>)>>
+
+<DEFINE APPLY-GEN (NOD WHERE
+                  "AUX" (K <KIDS .NOD>) COUNTMP SEGTMP (SEGLABEL <MAKE-TAG>)
+                        (SEGCALLED <>) I MS)
+   #DECL ((NOD) NODE (K) <LIST NODE [REST NODE]>
+         (COUNTMP SEGCALLED SEGLABEL) <SPECIAL ANY>)
+   <START-FRAME>
+   <SET MS <GEN <1 .K>>>
+   <SET I
+       <MAPF ,+
+             <FUNCTION (N) 
+                     #DECL ((N) NODE)
+                     <COND (<==? <NODE-TYPE .N> ,SEGMENT-CODE> 0) (ELSE 1)>>
+             <REST .K>>>
+   <MAPF <>
+    <FUNCTION (N "AUX" RES) 
+       #DECL ((N) NODE (NL) <LIST NODE>)
+       <COND
+       (<==? <NODE-TYPE .N> ,SEGMENT-CODE>
+        <COND (<NOT <ASSIGNED? SEGTMP>>
+               <SET SEGTMP <GEN-TEMP <>>>
+               <SET COUNTMP <GEN-TEMP <>>>
+               <SET-TEMP .COUNTMP .I '(`TYPE FIX)>)>
+        <SET RES <GEN <SET N <1 <KIDS .N>>> .SEGTMP>>
+        <COND (<AND <N==? .RES ,NO-DATUM>
+                    <N==? <STRUCTYP-SEG <RESULT-TYPE .N>> MULTI>>
+               <SEGMENT-STACK
+                .SEGTMP
+                .COUNTMP
+                <STRUCTYP <RESULT-TYPE .N>>
+                <ISTYPE? <RESULT-TYPE .N>>
+                .SEGLABEL>)
+              (.SEGCALLED <LABEL-TAG .SEGLABEL>)>
+        <SET SEGLABEL <MAKE-TAG>>)
+       (ELSE <GEN .N ,POP-STACK>)>>
+    <REST .K>>
+   <COND (<ASSIGNED? COUNTMP> <FREE-TEMP .COUNTMP <>> <FREE-TEMP .SEGTMP <>>)>
+   <COND (<OR <==? .WHERE FLUSHED> <==? <RESULT-TYPE .NOD> NO-RETURN>>
+         <IEMIT `ACALL .MS <COND (<ASSIGNED? COUNTMP> .COUNTMP) (ELSE .I)>>
+         <FREE-TEMP .MS>)
+        (ELSE
+         <COND (<==? .WHERE DONT-CARE>
+                <SET WHERE <GEN-TEMP <RESULT-TYPE .NOD>>>)
+               (<TYPE? .WHERE TEMP> <USE-TEMP .WHERE <RESULT-TYPE .NOD>>)>
+         <IEMIT `ACALL
+                .MS
+                <COND (<ASSIGNED? COUNTMP> .COUNTMP) (ELSE .I)>
+                =
+                .WHERE>
+         <FREE-TEMP .MS>)>
+   .WHERE>
+
+<DEFINE UNWIND-GEN (N W
+                   "AUX" (UNBRANCH <MAKE-TAG>) (NOUNWIND <MAKE-TAG>)
+                         (K1 <1 <KIDS .N>>) (K2 <2 <KIDS .N>>) W1 BND LBL)
+       #DECL ((N K1 K2) NODE (BND) TEMP (STK) FIX)
+       <SET SPECD T>
+       <IEMIT `LOCATION + .UNBRANCH = <SET LBL <GEN-TEMP>>>
+       <IEMIT `BBIND
+              <FORM QUOTE UNWIND>
+              .LBL
+              <FORM QUOTE FIX>
+              <CURRENT-FRAME>>
+       <SET STK <+ .STK ,BINDING-LENGTH>>
+       <SET W1 <GEN .K1 .W>>
+       <SET-VALUE UNWIND 0>
+       <FREE-TEMP .LBL>
+       <BRANCH-TAG .NOUNWIND>
+       <LABEL-TAG .UNBRANCH>
+       <GEN .K2 FLUSHED>
+       <BRANCH-TAG `UNWCONT>
+       <LABEL-TAG .NOUNWIND>
+       .W1>
+
+<DEFINE INTERFERE? (TMP N "AUX" L) 
+   #DECL ((N) NODE (TMP) TEMP (L) <OR FALSE LIST>)
+   <AND
+    <G=? <LENGTH .N> <INDEX ,SIDE-EFFECTS>>
+    <SET L <SIDE-EFFECTS .N>>
+    <MAPF <>
+     <FUNCTION (NN "AUX" SYM) 
+            #DECL ((SYM) SYMTAB)
+            <COND (<AND <TYPE? .NN NODE>
+                        <==? <NODE-TYPE .NN> ,SET-CODE>
+                        <NOT <SPEC-SYM <SET SYM <NODE-NAME .NN>>>>
+                        <N==? <CODE-SYM .SYM> -1>
+                        <==? <TEMP-NAME-SYM .SYM> .TMP>>
+                   <MAPLEAVE T>)>>
+     <CHTYPE .L LIST>>>>
+
+<DEFINE INTERF-CHANGE (TMP N) 
+       #DECL ((N) NODE)
+       <COND (<AND <TYPE? .TMP TEMP> <INTERFERE? .TMP .N>>
+              <MOVE-ARG .TMP <GEN-TEMP <>>>)
+             (ELSE .TMP)>>
+
+<DEFINE ADECL-GEN (NOD WHERE "AUX" (N <1 <KIDS .NOD>>)) <GEN .N .WHERE>>
+
+<DEFINE STACK-GEN (N W) <GEN <1 <KIDS .N>> .W>>
+
+"ILIST, IVECTOR, IUVECTOR AND ISTRING."
+
+<DEFINE ISTRUC-GEN (N W
+                   "AUX" (NAM <NODE-NAME .N>) (K <KIDS .N>)
+                         (NT <NODE-TYPE .N>) (LEN <1 .K>) EL
+                         (TY <RESULT-TYPE .N>) NT-M NT-E EL-TMP EV-TMP STRT
+                         NSTR STR END STR2 OBJ (CALL-EV <>) (GEN-EACH-TIME <>)
+                         X EMP-INS PUT-INS REST-INS (ISTY <ISTYPE? .TY>)
+                         CONS-T1 CONS-T2 CONS-TMP NT-S
+                         (STACK?
+                          <COND
+                           (<AND
+                             <TYPE? <SET X <PARENT .N>> NODE>
+                             <OR <==? <NODE-TYPE .X> ,STACK-CODE>
+                                 <AND <==? <NODE-TYPE .X> ,CHTYPE-CODE>
+                                      <TYPE? <SET X <PARENT .X>> NODE>
+                                      <==? <NODE-TYPE .X> ,STACK-CODE>>>>)>))
+   #DECL ((N LEN EL) NODE (K) <LIST NODE [OPT NODE]>
+         (STK STK-CHARS7 STK-CHARS8) FIX (STR) <OR FIX TEMP>)
+   <COND (<==? .NAM ITUPLE> <SET STACK? T>)>
+   <COND (<AND <==? <LENGTH .K> 1> <N==? .NAM ILIST>>
+         <IEMIT <COND (.STACK? `USBLOCK) (ELSE `UUBLOCK)>
+                <FORM `TYPE-CODE .ISTY>
+                <SET STR <GEN .LEN DONT-CARE>>
+                =
+                <COND (<TYPE? .W TEMP> <USE-TEMP .W .ISTY> .W)
+                      (<==? .W DONT-CARE>
+                       <SET W <GEN-TEMP <COND (.ISTY) (ANY)>>>)
+                      (ELSE .W)>
+                (`TYPE .ISTY)>
+         <COND (<NOT .STACK?> <FREE-TEMP .STR>)>)
+        (ELSE
+         <COND (<OR <==? .NAM IVECTOR> <==? .NAM ITUPLE>>
+                <SET REST-INS `RESTUV>
+                <SET PUT-INS `PUTUV>
+                <SET EMP-INS `EMPUV?>)
+               (<==? .NAM IUVECTOR>
+                <SET REST-INS `RESTUU>
+                <SET PUT-INS `PUTUU>
+                <SET EMP-INS `EMPUU?>)
+               (<==? .NAM ISTRING>
+                <SET REST-INS `RESTUS>
+                <SET PUT-INS `PUTUS>
+                <SET EMP-INS `EMPUS?>)
+               (<==? .NAM IBYTES>
+                <SET REST-INS `RESTUB>
+                <SET PUT-INS `PUTUB>
+                <SET EMP-INS `EMPUB?>)
+               (ELSE
+                <SET REST-INS `RESTL>
+                <SET PUT-INS `PUTL>
+                <SET EMP-INS `EMPL?>)>
+         <COND (<EMPTY? <REST .K>> <SET EL-TMP 0>)
+               (<OR <AND <==? <SET NT-M <NODE-TYPE .N>> ,ISTRUC2-CODE>
+                         <OR <L? <LENGTH <SET EL <2 .K>>>
+                                 <INDEX ,SIDE-EFFECTS>>
+                             <AND <NOT <SIDE-EFFECTS .EL>>
+                                  <N==? <SET NT-S <NODE-TYPE .EL>> ,COPY-CODE>
+                                  <N==? .NT-S ,CHTYPE-CODE>
+                                  ; "TAA 11/5/85--otherwise
+                                     <IVECTOR .FOO '<CHTYPE [1 2 3] BAR>>
+                                     doesn't generate a new frob each time"
+                                  <N==? .NT-S ,ISTRUC-CODE>
+                                  <N==? .NT-S ,ISTRUC2-CODE>>>>
+                    <AND <==? .NT-M ,ISTRUC-CODE>
+                         <NOT <TYPE-OK?
+                               <RESULT-TYPE <SET EL <2 .K>>>
+                               '<OR FORM LIST VECTOR UVECTOR LVAL GVAL>>>>>
+                <SET EL-TMP <GEN .EL>>)
+               (<==? .NT-M ,ISTRUC-CODE>
+                <SET EV-TMP <GEN .EL>>
+                <SET CALL-EV T>)
+               (ELSE <SET GEN-EACH-TIME T>)>
+         <SET STR <GEN .LEN>>
+         <COND (<==? .NAM ILIST>
+                <IEMIT `SET
+                       <COND (<TYPE? .W TEMP> <USE-TEMP <SET OBJ .W> .ISTY>)
+                             (ELSE <SET OBJ <GEN-TEMP>>)> ()>
+                <COND (<OR <TYPE? .STR FIX>
+                           <G? <TEMP-REFS .STR> 1>>
+                       <IEMIT `SET <SET STR2 <GEN-TEMP FIX>> .STR>
+                       <SET STR .STR2>)>
+                <IEMIT `SET <SET STR2 <GEN-TEMP LIST>> ()>)
+               (ELSE
+                <IEMIT <COND (.STACK? `USBLOCK) (ELSE `UUBLOCK)>
+                       <FORM `TYPE-CODE .ISTY>
+                       .STR
+                       =
+                       <COND (<TYPE? .W TEMP> <USE-TEMP <SET OBJ .W> .ISTY>)
+                             (ELSE <SET OBJ <GEN-TEMP>>)>>
+                <COND (<NOT .STACK?> <FREE-TEMP .STR>)>
+                <IEMIT `SET <SET STR2 <GEN-TEMP>> .OBJ>)>
+         <IEMIT `LOOP
+                (<TEMP-NAME .STR2> VALUE LENGTH)
+                !<COND (.CALL-EV ((<TEMP-NAME .EV-TMP> TYPE VALUE LENGTH)))
+                       (<AND <NOT .GEN-EACH-TIME> <TYPE? .EL-TMP TEMP>>
+                        ((<TEMP-NAME .EL-TMP> TYPE VALUE LENGTH)))
+                       (ELSE ())>
+                !<COND (<==? .NAM ILIST> ((<TEMP-NAME .STR> VALUE)))
+                       (ELSE ())>>
+         <LABEL-TAG <SET STRT <MAKE-TAG "ISTR">>>
+         <COND (<==? .NAM ILIST>
+                <IEMIT `VEQUAL? .STR 0 + <SET END <MAKE-TAG "ISTRE">>>)
+               (ELSE
+                <IEMIT .EMP-INS .STR2 + <SET END <MAKE-TAG "ISTRE">>>)>
+         <COND (.CALL-EV
+                <START-FRAME EVAL>
+                <PUSH .EV-TMP>
+                <MSUBR-CALL EVAL 1 <SET EL-TMP <GEN-TEMP>>>)
+               (.GEN-EACH-TIME <SET EL-TMP <GEN .EL>>)>
+         <COND (<==? .NAM ILIST>
+                <IEMIT `CONS .EL-TMP () = <SET CONS-TMP <GEN-TEMP LIST>>>
+                <IEMIT `EMPL? .STR2 + <SET CONS-T1 <MAKE-TAG>>>
+                <IEMIT `PUTREST .STR2 .CONS-TMP>
+                <IEMIT `SET .STR2 .CONS-TMP>
+                <BRANCH-TAG <SET CONS-T2 <MAKE-TAG>>>
+                <LABEL-TAG .CONS-T1>
+                <IEMIT `SET .STR2 .CONS-TMP>
+                <IEMIT `SET .OBJ .CONS-TMP>
+                <LABEL-TAG .CONS-T2>
+                <IEMIT `SUB .STR 1 = .STR>)
+               (ELSE
+                <IEMIT .PUT-INS .STR2 1 .EL-TMP>
+                <IEMIT .REST-INS .STR2 1 = .STR2>)>
+         <COND (<OR .CALL-EV .GEN-EACH-TIME> <FREE-TEMP .EL-TMP>)>
+         <BRANCH-TAG .STRT>
+         <LABEL-TAG .END>
+         <FREE-TEMP .STR2>
+         <COND (.CALL-EV <FREE-TEMP .EV-TMP>)
+               (<NOT .GEN-EACH-TIME> <FREE-TEMP .EL-TMP>)>
+         <SET W <MOVE-ARG .OBJ .W>>)>
+   <COND (.STACK?
+         <COND (<TYPE? .STR TEMP>
+                <COND (<AND <N==? .NAM IUVECTOR> <G? <TEMP-REFS .STR> 1>>
+                       <SET NSTR <GEN-TEMP FIX>>)
+                      (ELSE <SET NSTR .STR>)>
+                <COND (<OR <==? .NAM IVECTOR> <==? .NAM ITUPLE>>
+                       <IEMIT `LSH .STR 1 = .NSTR>)
+                      (<==? .NAM IBYTES>
+                       <IEMIT `ADD .STR 3 = .NSTR>
+                       <IEMIT `LSH .NSTR -2 = .NSTR>)
+                      (<==? .NAM ISTRING>
+                       <IEMIT `IFSYS "TOPS20">
+                       <IEMIT `ADD .STR 4 = .NSTR>
+                       <IEMIT `DIV .NSTR 5 = .NSTR>
+                       <IEMIT `ENDIF "TOPS20">
+                       <IEMIT `IFSYS "UNIX">
+                       <IEMIT `ADD .STR 3 = .NSTR>
+                       <IEMIT `LSH .NSTR -2 = .NSTR>
+                       <IEMIT `ENDIF "UNIX">)>
+                <FREE-TEMP .STR <>>
+                <COND (<ASSIGNED? STKTMP>
+                       <IEMIT `SUB .STKTMP .NSTR = .STKTMP>)
+                      (ELSE
+                       <IEMIT `SUB 0 .NSTR = <SET STKTMP <GEN-TEMP FIX>>>)>
+                <COND (<N==? .STR .NSTR> <FREE-TEMP .NSTR>)>
+                <SET STK <+ .STK 2>>)
+               (<==? .NAM ISTRING>
+                <SET STK-CHARS7 <+ </ <+ .STR 4> 5> .STK-CHARS7>>
+                <SET STK-CHARS8 <+ </ <+ .STR 3> 4> .STK-CHARS8>>
+                <SET STK <+ .STK 2>>)
+               (ELSE
+                <SET STK
+                     <+ .STK
+                        <COND (<==? .NAM IUVECTOR> .STR)
+                              (<==? .NAM IBYTES> </ <+ .STR 3> 4>)
+                              (ELSE <* .STR 2>)>
+                        2>>)>)>
+   .W>
+
+
+<DEFINE MULTI-SET-GEN (N:NODE W
+                      "AUX" (K:<LIST [REST NODE]> <KIDS .N>) (SEG? <>)
+                            (SIDE-E <>) (MX:FIX 0) (MN:FIX 0)
+                            (VARS:<LIST [REST LIST]> <NODE-NAME .N>) TL:LIST
+                            (VLN:FIX <LENGTH .VARS>) NT:FIX SEGTYP LCL
+                            (LV:<OR ATOM SYMTAB> <1 <NTH .VARS .VLN>>) (I:FIX 0))
+   <MAPF <>
+    <FUNCTION (N:NODE "AUX" RT) 
+           <COND (<OR <==? <SET NT <NODE-TYPE .N>> ,SEG-CODE>
+                      <==? .NT ,SEGMENT-CODE>>
+                  <SET SEG? T>
+                  <SET MX <MAX <+ <MAXL <SET RT <RESULT-TYPE <1 <KIDS .N>>>>> .MX>
+                               ,MAX-LENGTH>>
+                  <SET MN <+ <MINL .RT> .MN>>)
+                 (ELSE
+                  <SET I <+ .I 1>>
+                  <SET MN <+ .MN 1>>
+                  <SET MX <MAX <+ .MX 1> ,MAX-LENGTH>>)>
+           <COND (<AND <G=? <LENGTH .N> <INDEX ,SIDE-EFFECTS>>
+                       <SIDE-EFFECTS .N>>
+                  <SET SIDE-E T>)>>
+    <SET K <REST .K>>>
+   <COND
+    (.SEG?
+     <PROG ((SEGLABEL <MAKE-TAG>) COUNTMP (SEGCALLED <>) SEGTMP)
+       #DECL ((SEGLABEL COUNTMP SEGCALLED) <SPECIAL ANY>)
+       <MAPF <>
+       <FUNCTION (NN:NODE "AUX" (NT <NODE-TYPE .NN>) RES) 
+          <COND
+           (<OR <==? .NT ,SEG-CODE> <==? .NT ,SEGMENT-CODE>>
+            <COND (<NOT <ASSIGNED? SEGTMP>>
+                   <SET SEGTMP <GEN-TEMP <>>>
+                   <SET COUNTMP <GEN-TEMP FIX>>
+                   <SET-TEMP .COUNTMP .I '(`TYPE FIX)>)>
+            <SET RES <GEN <SET NN <1 <KIDS .NN>>> .SEGTMP>>
+            <SET SEGTYP <STRUCTYP-SEG <RESULT-TYPE .NN>>>
+            <COND (<AND <N==? .RES ,NO-DATUM> <N==? .SEGTYP MULTI>>
+                   <SEGMENT-STACK .SEGTMP
+                                  .COUNTMP
+                                  .SEGTYP
+                                  <ISTYPE? <RESULT-TYPE .NN>>
+                                  .SEGLABEL>
+                   <SET SEGLABEL <MAKE-TAG>>)
+                  (.SEGCALLED
+                   <LABEL-TAG .SEGLABEL>
+                   <SET SEGLABEL <MAKE-TAG>>)>)
+           (ELSE
+            <GEN .NN ,POP-STACK>)>>
+       .K>
+       <COND (<AND .CAREFUL <N==? .MX .MN>>
+             <IEMIT `VEQUAL? .COUNTMP .VLN - `COMPERR>)>
+       <REPEAT (TVAR TSYM TMP)
+              <COND (<AND
+                      <TYPE? <SET TSYM <1 <SET TVAR <NTH .VARS .VLN>>>>
+                             SYMTAB>
+                      <NOT <SPEC-SYM .TSYM>>
+                      <N==? <CODE-SYM .TSYM> -1>>
+                     <USE-TEMP <SET TMP <TEMP-NAME-SYM .TSYM>>
+                               <OR <2 .TVAR> T>>
+                     <IEMIT `POP = .TMP>)
+                    (ELSE
+                     <IEMIT `POP = <SET TMP <GEN-TEMP <OR <2 .TVAR> T>>>>
+                     <SET-VALUE <COND (<TYPE? .TSYM SYMTAB> <NAME-SYM .TSYM>)
+                                      (ELSE .TSYM)>
+                                .TMP
+                                <NOT <AND <TYPE? .TSYM SYMTAB>
+                                          <N==? <CODE-SYM .TSYM> -1>>>>
+                     <FREE-TEMP .TMP>)>
+              <COND (<==? <SET VLN <- .VLN 1>> 0> <RETURN>)>>>)
+    (.SIDE-E
+     <SET TL
+         <MAPF ,LIST
+               <FUNCTION (NN:NODE SYP:<LIST <OR ATOM SYMTAB>>
+                          "AUX" (TY <RESULT-TYPE .NN>) PT
+                                (SY:<OR ATOM SYMTAB> <1 .SYP>))
+                       <COND (<TYPE? .SY SYMTAB>
+                              <SET TY <TYPE-AND <2 .SYP> .TY>>)>
+                       <COND (<AND <SET TY <ISTYPE? .TY>>
+                                   <OR <==? <SET PT <TYPEPRIM .TY>> FIX>
+                                       <==? .PT LIST>>>)
+                             (ELSE <SET TY ANY>)>
+                       <GEN .NN <GEN-TEMP .TY>>>
+               .K
+               .VARS>>
+     <MAPF <>
+          <FUNCTION (SYP:<LIST <OR ATOM SYMTAB>> TMP:TEMP
+                     "AUX" (SY:<OR ATOM SYMTAB> <1 .SYP>) (LCL <>)) 
+                  <COND (<AND <TYPE? .SY SYMTAB>
+                              <N==? <CODE-SYM .SY> -1>
+                              <SET LCL T>
+                              <NOT <SPEC-SYM .SY>>>
+                         <IEMIT `SET <TEM-NAME-SYM .SY> .TMP>
+                         <FREE-TEMP .TMP>)
+                        (ELSE
+                         <COND (<TYPE? .SY SYMTAB> <SET SY <NAME-SYM .SY>>)>
+                         <SET-VALUE .SY .TMP <NOT .LCL>>
+                         <FREE-TEMP .TMP>)>>
+          .VARS
+          .TL>)
+    (ELSE
+     <PROG (NL-LATER:LIST SL-LATER:LIST ANY-DONE (MUCH-LATER:LIST ())
+           TTMP:TEMP)
+       <SET NL-LATER <SET SL-LATER ()>>
+       <SET ANY-DONE <>>
+       <MAPR <>
+       <FUNCTION (SL NL
+                  "AUX" (SYP:<LIST <OR ATOM SYMTAB TEMP>> <1 .SL>) (LCL <>) TY
+                        (N:NODE <1 .NL>) (SY:<OR ATOM SYMTAB TEMP> <1 .SYP>) TMP)
+               <COND (<OR <TYPE? .SY TEMP>
+                          <AND <NOT <REF? .SY <REST .NL>>>
+                               <NOT <REF? .SY .NL-LATER>>>>
+                      <SET ANY-DONE T>
+                      <COND (<OR <AND <TYPE? .SY SYMTAB>
+                                      <N==? <CODE-SYM .SY> -1>
+                                      <SET LCL T>
+                                      <NOT <SPEC-SYM .SY>>
+                                      <SET TMP <TEMP-NAME-SYM .SY>>>
+                                 <AND <TYPE? .SY TEMP> <SET TMP .SY>>>
+                             <GEN .N .TMP>)
+                            (ELSE
+                             <COND (<TYPE? .SY SYMTAB>
+                                    <SET SY <NAME-SYM .SY>>)>
+                             <SET-VALUE .SY <GEN .N DONT-CARE> <NOT .LCL>>)>)
+                     (ELSE
+                      <SET SL-LATER (.SYP !.SL-LATER)>
+                      <SET NL-LATER (.N !.NL-LATER)>)>>
+       .VARS
+       .K>
+       <COND (<AND .ANY-DONE <NOT <EMPTY? .SL-LATER>>>
+             <SET VARS .SL-LATER>
+             <SET K .NL-LATER>
+             <AGAIN>)
+            (<NOT <EMPTY? .SL-LATER>>
+             <SET MUCH-LATER
+                  ((<1 .SL-LATER> <SET TTMP <GEN-TEMP <>>>) !.MUCH-LATER)>
+             <SET VARS ((.TTMP) !<REST .SL-LATER>)>
+             <SET K .NL-LATER>
+             <AGAIN>)>
+       <MAPF <>
+            <FUNCTION (L:LIST
+                       "AUX" (SY:<OR ATOM SYMTAB> <1 <1 .L>>) (LCL <>)
+                             (TMP:TEMP <2 .L>))
+                    <COND (<AND <TYPE? .SY SYMTAB>
+                                <N==? <CODE-SYM .SY> -1>
+                                <SET LCL T>
+                                <NOT <SPEC-SYM .SY>>>
+                           <IEMIT `SET <TEMP-NAME-SYM .SY> .TMP>
+                           <FREE-TEMP .TMP>)
+                          (ELSE
+                           <COND (<TYPE? .SY SYMTAB> <SET SY <NAME-SYM .SY>>)>
+                           <SET-VALUE .SY .TMP <NOT .LCL>>
+                           <FREE-TEMP .TMP>)>>
+            .MUCH-LATER>>)>
+   <COND (<N==? .W FLUSHED>
+         <SET LCL <>>
+         <COND (<AND <TYPE? .LV SYMTAB>
+                     <N==? <CODE-SYM .LV> -1>
+                     <SET LCL T>
+                     <NOT <SPEC-SYM .LV>>>
+                <TEMP-REFS .LV <+ <TEMP-REFS .LV> 1>>
+                <MOVE-ARG .LV .W>)
+               (ELSE
+                <COND (<TYPE? .LV SYMTAB> <SET LV <NAME-SYM .LV>>)>
+                <COND (<==? .W DONT-CARE> <SET W <GEN-TEMP <>>>)>
+                <GET-VALUE-X .LV .W <NOT .LCL>>)>)
+        (ELSE .W)>>
+
+<DEFINE REF? (SY:<OR ATOM SYMTAB> L:<LIST [REST NODE]>)
+       <MAPF <>
+             <FUNCTION (N:NODE "AUX" (NT:FIX <NODE-TYPE .N>) NN)
+                   <PROG ()
+                         <COND (<OR <==? .NT ,LVAL-CODE>
+                                    <==? .NT ,ASSIGNED?-CODE>
+                                    <==? .NT ,SET-CODE>>
+                                <COND (<==? <NODE-NAME .N> .SY> <MAPLEAVE>)>)
+                               (<OR <==? .NT ,FLVAL-CODE> <==? .NT ,FSET-CODE>>
+                                <COND (<OR <==? <NODE-NAME .N> .SY>
+                                           <COND (<==? <NODE-TYPE
+                                                        <SET NN <1 <KIDS .N>>>>
+                                                       ,QUOTE-CODE>
+                                                  <==? <NODE-NAME .NN> .SY>)
+                                                 (ELSE
+                                                  <OR <TYPE? .SY ATOM>
+                                                      <==? <CODE-SYM .SY> -1>
+                                                      <SPEC-SYM .SY>>)>>
+                                       <MAPLEAVE T>)>)
+                               (<AND <G? <LENGTH .N> <INDEX ,SIDE-EFFECTS>>
+                                     <MEMQ ALL <CHTYPE <SIDE-EFFECTS .N>
+                                                       LIST>>
+                                     <OR <TYPE? .SY ATOM>
+                                         <SPEC-SYM .SY>
+                                         <==? <CODE-SYM .SY> -1>>>
+                                <MAPLEAVE T>)
+                               (ELSE
+                                <COND (<REF? .SY <KIDS .N>> <MAPLEAVE T>)>
+                                <COND (<==? .NT ,BRANCH-CODE>
+                                       <SET NT <NODE-TYPE <SET N <PREDIC .N>>>>
+                                       <AGAIN>)>)>>>
+             .L>>
+                                
+<DEFINE GEN-DISPATCH (N W) 
+       <CASE ,==?
+             <NODE-TYPE .N>
+             (,FORM-CODE <FORM-GEN .N .W>)
+             (,PROG-CODE <PROG-REP-GEN .N .W>)
+             (,SUBR-CODE <SUBR-GEN .N .W>)
+             (,COND-CODE <COND-GEN .N .W>)
+             (,LVAL-CODE <LVAL-GEN .N .W>)
+             (,SET-CODE <SET-GEN .N .W>)
+             (,OR-CODE <OR-GEN .N .W>)
+             (,AND-CODE <AND-GEN .N .W>)
+             (,RETURN-CODE <RETURN-GEN .N .W>)
+             (,COPY-CODE <COPY-GEN .N .W>)
+             (,AGAIN-CODE <AGAIN-GEN .N .W>)
+             (,ARITH-CODE <ARITH-GEN .N .W>)
+             (,RSUBR-CODE <SUBR-GEN .N .W>)
+             (,0-TST-CODE <0-TEST .N .W>)
+             (,NOT-CODE <NOT-GEN .N .W>)
+             (,1?-CODE <1?-GEN .N .W>)
+             (,TEST-CODE <TEST-GEN .N .W>)
+             (,EQ-CODE <==-GEN .N .W>)
+             (,TY?-CODE <TYPE?-GEN .N .W>)
+             (,LNTH-CODE <LNTH-GEN .N .W>)
+             (,MT-CODE <MT-GEN .N .W>)
+             (,REST-CODE <REST-GEN .N .W>)
+             (,NTH-CODE <NTH-GEN .N .W>)
+             (,PUT-CODE <PUT-GEN .N .W>)
+             (,PUTR-CODE <PUTREST-GEN .N .W>)
+             (,FLVAL-CODE <FLVAL-GEN .N .W>)
+             (,FSET-CODE <FSET-GEN .N .W>)
+             (,FGVAL-CODE <FGVAL-GEN .N .W>)
+             (,FSETG-CODE <FSETG-GEN .N .W>)
+             (,MIN-MAX-CODE <MIN-MAX .N .W>)
+             (,CHTYPE-CODE <CHTYPE-GEN .N .W>)
+             (,FIX-CODE <FIX-GEN .N .W>)
+             (,FLOAT-CODE <FLOAT-GEN .N .W>)
+             (,ABS-CODE <ABS-GEN .N .W>)
+             (,MOD-CODE <MOD-GEN .N .W>)
+             (,ID-CODE <ID-GEN .N .W>)
+             (,ASSIGNED?-CODE <ASSIGNED?-GEN .N .W>)
+             (,BITL-CODE <BITLOG-GEN .N .W>)
+             (,ISUBR-CODE <SUBR-GEN .N .W>)
+             (,EOF-CODE <ID-GEN .N .W>)
+             (,READ-EOF2-CODE <READ2-GEN .N .W>)
+             (,READ-EOF-CODE <SUBR-GEN .N .W>)
+             (,GET2-CODE <GET2-GEN .N .W>)
+             (,GET-CODE <GET-GEN .N .W>)
+             (,IPUT-CODE <SUBR-GEN .N .W>)
+             (,MAP-CODE <MAPFR-GEN .N .W>)
+             (,MARGS-CODE <MPARGS-GEN .N .W>)
+             (,MAPLEAVE-CODE <MAPLEAVE-GEN .N .W>)
+             (,MAPRET-STOP-CODE <MAPRET-STOP-GEN .N .W>)
+             (,UNWIND-CODE <UNWIND-GEN .N .W>)
+             (,GVAL-CODE <GVAL-GEN .N .W>)
+             (,SETG-CODE <SETG-GEN .N .W>)
+             (,MEMQ-CODE <MEMQ-GEN .N .W>)
+             (,LENGTH?-CODE <LENGTH?-GEN .N .W>)
+             (,FORM-F-CODE <FORM-F-GEN .N .W>)
+             (,ALL-REST-CODE <ALL-REST-GEN .N .W>)
+             (,COPY-LIST-CODE <LIST-BUILD .N .W>)
+             (,PUT-SAME-CODE <PUT-GEN .N .W>)
+             (,BACK-CODE <BACK-GEN .N .W>)
+             (,TOP-CODE <TOP-GEN .N .W>)
+             (,ROT-CODE <ROT-GEN .N .W>)
+             (,LSH-CODE <LSH-GEN .N .W>)
+             (,BIT-TEST-CODE <BIT-TEST-GEN .N .W>)
+             (,CALL-CODE <CALL-GEN .N .W>)
+             (,MONAD-CODE <MONAD?-GEN .N .W>)
+             (,GASSIGNED?-CODE <GASSIGNED?-GEN .N .W>)
+             (,APPLY-CODE <APPLY-GEN .N .W>)
+             (,ADECL-CODE <ADECL-GEN .N .W>)
+             (,MULTI-RETURN-CODE <MULTI-RETURN-GEN .N .W>)
+             (,VALID-CODE <VALID-TYPE?-GEN .N .W>)
+             (,TYPE-C-CODE <TYPE-C-GEN .N .W>)
+             (,=?-STRING-CODE <=?-STRING-GEN .N .W>)
+             (,CASE-CODE <CASE-GEN .N .W>)
+             (,FGETBITS-CODE <FGETBITS-GEN .N .W>)
+             (,FPUTBITS-CODE <FPUTBITS-GEN .N .W>)
+             (,ISTRUC-CODE <ISTRUC-GEN .N .W>)
+             (,ISTRUC2-CODE <ISTRUC-GEN .N .W>)
+             (,STACK-CODE <STACK-GEN .N .W>)
+             (,CHANNEL-OP-CODE <CHANNEL-OP-GEN .N .W>)
+             (,ATOM-PART-CODE <ATOM-PART-GEN .N .W>)
+             (,OFFSET-PART-CODE <OFFSET-PART-GEN .N .W>)
+             (,PUT-GET-DECL-CODE <PUT-GET-DECL-GEN .N .W>)
+             (,SUBSTRUC-CODE <SUBSTRUC-GEN .N .W>)
+             (,MULTI-SET-CODE <MULTI-SET-GEN .N .W>)
+             DEFAULT
+             (<DEFAULT-GEN .N .W>)>>
+
+<ENDPACKAGE>