Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / mimc / mapgen.mud
diff --git a/mim/development/mim/mimc/mapgen.mud b/mim/development/mim/mimc/mapgen.mud
new file mode 100644 (file)
index 0000000..16307a9
--- /dev/null
@@ -0,0 +1,981 @@
+
+<PACKAGE "MAPGEN">
+
+<ENTRY MAPFR-GEN
+       MAPRET-STOP-GEN
+       MAPLEAVE-GEN
+       MTUPLE-GEN
+       MBINDERS
+       MPARGS-GEN
+       MOPTG
+       MOPTG2>
+
+<USE "COMPDEC" "CODGEN" "CHKDCL" "CARGEN" "NEWREP" "STRGEN" "MIMGEN" "ADVMESS">
+
+" Definitions of offsets into MAPINFO vector used by MAP hackers inferiors."
+
+<SETG MAP-STRS 1>
+
+<SETG MAP-FR 2>
+
+<SETG MAP-TAG 3>
+
+<SETG MAP-TEMPS 4>
+
+<SETG MAP-F? 5>
+
+<SETG MAP-FTMP 6>
+
+<SETG MAP-EXTMP 7>
+
+<SETG MAP-SEG? 8>
+
+<MANIFEST MAP-FR
+         MAP-TAG
+         MAP-TGL
+         MAP-SRC
+         MAP-TEMPS
+         MAP-F?
+         MAP-FTMP
+         MAP-EXTMP
+         MAP-SEG?
+         MAP-STRS>
+
+<PUT-DECL MPINFO
+         '<VECTOR <LIST [REST NODE]>
+                  <OR FALSE ATOM>
+                  ATOM
+                  <LIST [REST TEMP]>
+                  <OR FALSE ATOM>
+                  TEMP
+                  TEMP
+                  <LIST [REST <OR ATOM FALSE>]>>>
+
+"\f"
+
+<DEFINE MAPFR-GEN (NOD WHERE "OPT" (NF <>) (BR <>) (DIR <>)
+                            "AUX" (K <KIDS .NOD>) (COD <NODE-TYPE <2 .K>>)) 
+   #DECL ((NOD) NODE (COD) FIX (K) <LIST [REST NODE]>)
+   <COND
+    (<==? .COD ,MFCN-CODE> <HMAPFR .NOD .WHERE .K .NF .BR .DIR>)
+    (ELSE
+     <PROG ((FAP <1 .K>) MPINFO (INRAP <2 .K>) W (STACKED 0) F? FF?
+           (MAYBE-FALSE <>) (NARG <LENGTH <SET K <REST .K 2>>>)
+           (R? <==? <NODE-SUBR .NOD> ,MAPR>) (MAPEND <MAKE-TAG "MAP">)
+           (MAPLP <MAKE-TAG "MAP">) (SUBRC <AP? .FAP>) (FOONARG .NARG)
+           (STMPS <MAPF ,LIST
+                        <FUNCTION () <COND (<L? <SET FOONARG <- .FOONARG 1>>
+                                                0> <MAPSTOP>)
+                                           (ELSE <GEN-TEMP <>>)>>>)
+           (FTMP <GEN-TEMP <>>)
+           (EXTMP <GEN-TEMP <>>) (APTMP <>) (FLS <==? .WHERE FLUSHED>) TMP
+           (SEG? <MAPF ,LIST <FUNCTION (X) #FALSE ()> .STMPS>) (SEGCNT <>))
+       #DECL ((FAP INRAP) NODE (NARG POFF) FIX (MAPLP MAPEND) ATOM
+             (MPINFO) <SPECIAL MPINFO> (STACKED) <SPECIAL FIX>
+             (SEG?) <LIST [REST <OR ATOM FALSE>]> (SEGCNT) <OR FALSE TEMP>)
+       <SET WHERE
+           <COND (<==? .WHERE FLUSHED> FLUSHED)
+                 (<==? .WHERE DONT-CARE> .FTMP)
+                 (ELSE .WHERE)>>
+       <SET F? <DO-FIRST-SETUP .FAP .WHERE .FTMP .EXTMP .FLS>>
+       <OR .F? <SET FF? <==? <NODE-TYPE .FAP> ,MFIRST-CODE>>>
+       <PUSH-STRUCS .K .STMPS .SEG?>
+       <COND (.F? <SET MAYBE-FALSE <DO-FINAL-SETUP .FAP .SUBRC .FTMP .EXTMP>>)>
+       <COND (<N==? .COD ,MPSBR-CODE> <SET APTMP <GEN .INRAP>>)>
+       <COND (<AND .F?
+                  <OR <NOT .SUBRC>
+                      <NOT <MEMQ .SUBRC
+                                 '[VECTOR UVECTOR TUPLE STRING BYTES]>>>>
+             <START-FRAME <COND (.SUBRC) (ELSE APPLY)>>
+             <COND (<NOT .SUBRC> <PUSH .EXTMP>)>)>
+       <IEMIT `LOOP>
+       <LABEL-TAG .MAPLP>
+       <IEMIT `INTGO>
+       <EMPTY-MAPF-CHECK .K .STMPS .MAPEND .SEG?>
+       <SET MPINFO [.K .R? .MAPEND .STMPS .F? .FTMP .EXTMP .SEG?]>
+       <COND (<AND <==? .COD ,MPSBR-CODE> <NOT <OR? !.SEG?>>>
+             <COND (.F?
+                    <GEN <1 <KIDS .INRAP>> ,POP-STACK>
+                    <IEMIT `ADD .FTMP 1 = .FTMP '(`TYPE FIX)>)
+                   (.FF?
+                    <DO-FUNNY-HACK <GEN <1 <KIDS .INRAP>> DONT-CARE>
+                                   .NOD
+                                   .FAP
+                                   <1 <KIDS .INRAP>>
+                                   .FTMP
+                                   .EXTMP>)
+                   (<NOT .FLS> <GEN <1 <KIDS .INRAP>> .FTMP>)
+                   (ELSE <GEN <1 <KIDS .INRAP>> FLUSHED>)>)
+            (ELSE
+             <COND (<OR? !.SEG?>
+                    <SET SEGCNT <GEN-TEMP>>
+                    <IEMIT `SET
+                           .SEGCNT
+                           <+ <MAPF ,+
+                                    <FUNCTION (SG) <COND (.SG 0) (ELSE 1)>>
+                                    .SEG?>
+                              <COND (.APTMP 1) (ELSE 0)>>>)>
+             <START-FRAME <COND (.APTMP APPLY)
+                                (ELSE <NODE-NAME <1 <KIDS .INRAP>>>)>>
+             <COND (.APTMP <PUSH .APTMP>)>
+             <REPEAT ((I .NARG))
+                     #DECL ((I) FIX)
+                     <MPARGS-GEN .NOD ,POP-STACK .SEGCNT>
+                     <AND <0? <SET I <- .I 1>>> <RETURN>>>
+             <MSUBR-CALL <COND (.APTMP APPLY)
+                               (ELSE <NODE-NAME <1 <KIDS .INRAP>>>)>
+                         <COND (.SEGCNT) (ELSE <+ .NARG 1>)>
+                         <COND (<OR .F? .FF?> <SET TMP <GEN-TEMP>>)
+                               (ELSE .WHERE)>>
+             <COND (.F? <DO-STACK-ARGS .MAYBE-FALSE .TMP .EXTMP .FTMP>)
+                   (.FF?
+                    <DO-FUNNY-HACK .TMP .NOD .FAP .INRAP .FTMP .EXTMP>)>)>
+       <REST-STRUCS .STMPS .K .SEG?>
+       <BRANCH-TAG .MAPLP>
+       <LABEL-TAG .MAPEND>
+       <MAPF <> ,FREE-TEMP .STMPS>
+       <COND (<ASSIGNED? APTMP> <FREE-TEMP .APTMP>)>
+       <COND (.F?
+             <SET WHERE <DO-LAST .SUBRC .MAYBE-FALSE .WHERE .EXTMP .FTMP>>
+             <FREE-TEMP .FTMP>
+             <FREE-TEMP .EXTMP>)
+            (.FF? <FREE-TEMP .EXTMP> <SET WHERE <MOVE-ARG .FTMP .WHERE>>)
+            (<NOT .FLS>
+             <SET WHERE <MOVE-ARG .FTMP .WHERE>>
+             <FREE-TEMP .EXTMP>)
+            (ELSE <FREE-TEMP .FTMP> <FREE-TEMP .EXTMP>)>
+       <FLUSH-TUPLES .STMPS .SEG?>
+       .WHERE>)>>
+
+\\f 
+
+<DEFINE PUSH-STRUCS (K STMPS SEG?
+                    "AUX" COUNTMP (SEGLABEL <MAKE-TAG>) (SEGCALLED <>))
+   #DECL ((K) <LIST [REST NODE]> (STMPS) <LIST [REST TEMP]>
+         (SEG?) <LIST [REST <OR ATOM FALSE>]>
+         (SEGCALLED COUNTMP SEGLABEL) <SPECIAL ANY>)
+   <MAPR <>
+    <FUNCTION (NP TMPP SEG "AUX" (N <1 .NP>) (TMP <1 .TMPP>) TT CT TTT TY STY) 
+           #DECL ((N) NODE (SEG) LIST)
+           <COND
+            (<OR <==? <NODE-TYPE .N> ,SEGMENT-CODE>
+                 <==? <NODE-TYPE .N> ,SEG-CODE>>
+             <SET N <1 <KIDS .N>>>
+             <IEMIT `SET <SET CT <SET COUNTMP <GEN-TEMP>>> 0>
+             <SET TT <GEN .N DONT-CARE>>
+             <COND (<NOT <OR <==? .TT ,NO-DATUM>
+                             <AND <TYPE? .TT TEMP> <L=? <TEMP-REFS .TT> 1>>>>
+                    <IEMIT `SET <SET TTT <GEN-TEMP>> .TT>
+                    <FREE-TEMP .TT>
+                    <SET TT .TTT>)>
+             <PUT .SEG 1 T>
+             <COND (<N==? .TT ,NO-DATUM>
+                    <SEGMENT-STACK .TT
+                                   .CT
+                                   <STRUCTYP <RESULT-TYPE .N>>
+                                   <ISTYPE? <RESULT-TYPE .N>>
+                                   .SEGLABEL>)
+                   (.SEGCALLED <LABEL-TAG .SEGLABEL>)>
+             <SET SEGLABEL <MAKE-TAG>>
+             <FREE-TEMP .TT>
+             <USE-TEMP .TMP>
+             <IEMIT `TUPLE .CT = .TMP '(`TYPE TUPLE)>
+             <FREE-TEMP .CT>)
+            (ELSE
+             <SET TT <GEN .N DONT-CARE>>
+             <SET STY <STRUCTYP <SET TY <RESULT-TYPE .N>>>>
+             <SET TY <ISTYPE? .TY>>
+             <COND (<AND <TYPE? .TT TEMP> <L=? <TEMP-REFS .TT> 1>>
+                    <PUT .TMPP 1 <SET TMP .TT>>
+                    <COND (<AND .STY <N==? .TY .STY>>
+                           <IEMIT `CHTYPE
+                                  .TMP
+                                  <FORM `TYPE-CODE .STY>
+                                  =
+                                  .TMP>)>)
+                   (<AND .STY <N==? .STY .TY>>
+                    <USE-TEMP .TMP .STY>
+                    <IEMIT `CHTYPE .TT <FORM `TYPE-CODE .STY> = .TMP>)
+                   (.STY <MOVE-ARG .TT .TMP (`TYPE .TY)>)
+                   (ELSE <MOVE-ARG .TT .TMP>)>)>>
+    .K
+    .STMPS
+    .SEG?>
+   T>
+
+<DEFINE REST-STRUCS (STMPS K SEG?) 
+   #DECL ((K) <LIST [REST NODE]> (STMPS) <LIST [REST TEMP]>
+         (SEG?) <LIST [REST <OR ATOM FALSE>]>)
+   <MAPF <>
+    <FUNCTION (TMP NOD SEG
+              "AUX" (ST <STRUCTYP <RESULT-TYPE .NOD>>) ETYP STMP LBL1 LBL2
+                    ETMP)
+       #DECL ((NOD) NODE (TMP) TEMP)
+       <COND
+       (.SEG
+        <IEMIT `SET <SET STMP <GEN-TEMP>> .TMP>
+        <SET ETYP <STRUCTYP <GET-ELE-TYPE <RESULT-TYPE <1 <KIDS .NOD>>> ALL>>>
+        <COND (.ETYP <IEMIT `LOOP (<TEMP-NAME .STMP> LENGTH VALUE)>)
+              (ELSE <IEMIT `LOOP>)>
+        <LABEL-TAG <SET LBL1 <MAKE-TAG>>>
+        <IEMIT `INTGO>
+        <EMPTY-CHECK TUPLE .STMP TUPLE T <SET LBL2 <MAKE-TAG>>>
+        <NTH-DO TUPLE .STMP <SET ETMP <GEN-TEMP>> 1>
+        <COND (.ETYP <REST-DO .ETYP .ETMP .ETMP 1>)
+              (ELSE <IEMIT `REST1 .ETMP = .ETMP>)>
+        <PUT-VECTOR .STMP 1 .ETMP>
+        <REST-DO TUPLE .STMP .STMP 1>
+        <BRANCH-TAG .LBL1>
+        <LABEL-TAG .LBL2>
+        <FREE-TEMP .STMP>
+        <FREE-TEMP .ETMP>)
+       (.ST <REST-DO .ST .TMP .TMP 1>)
+       (ELSE <IEMIT `REST1 .TMP = .TMP>)>>
+    .STMPS
+    .K
+    .SEG?>>
+
+<DEFINE DO-FINAL-SETUP (FAP SUBRC FTMP EXTMP 
+                       "AUX" (MBYF <AND <NOT .SUBRC>
+                                        <OR <NOT .REASONABLE>
+                                            <N==? <NODE-TYPE .FAP>
+                                                  ,GVAL-CODE>>
+                                        <TYPE-OK? <RESULT-TYPE .FAP>
+                                                  FALSE>>)
+                             TG1 TG2) 
+       #DECL ((FAP) NODE)
+       <COND (<NOT .SUBRC>
+              <GEN .FAP .EXTMP>)>
+       <COND (.MBYF
+              <GEN-TYPE? .EXTMP FALSE <SET TG1 <MAKE-TAG>> T>)>
+       <SET-TEMP .FTMP <COND (.SUBRC 0) (ELSE 1)> '(`TYPE FIX)>
+       <COND (.MBYF
+              <BRANCH-TAG <SET TG2 <MAKE-TAG>>>
+              <LABEL-TAG .TG1>
+              <SET-TEMP .FTMP <> '(`TYPE FALSE)>
+              <LABEL-TAG .TG2>)>
+       .MBYF>
+
+<DEFINE DO-STACK-ARGS (MAYBE-FALSE ARG SW COUNT "AUX" TG1 TG2) 
+       <COND (.MAYBE-FALSE
+              <GEN-TYPE? .SW FALSE <SET TG1 <MAKE-TAG>> T>
+              <PUSH .ARG>
+              <IEMIT `ADD .COUNT 1 = .COUNT '(`TYPE FIX)>
+              <BRANCH-TAG <SET TG2 <MAKE-TAG>>>
+              <LABEL-TAG .TG1>
+              <MOVE-ARG .ARG .COUNT>
+              <LABEL-TAG .TG2>)
+             (ELSE <PUSH .ARG> <IEMIT `ADD .COUNT 1 = .COUNT '(`TYPE FIX)>)>>
+
+<DEFINE DO-STACK-TUPLE (MAYBE-FALSE NEW-COUNT SW COUNT "AUX" TG1 TG2) 
+       <COND (.MAYBE-FALSE
+              <LENGTH-VECTOR .NEW-COUNT .NEW-COUNT>
+              <GEN-TYPE? .SW FALSE <SET TG1 <MAKE-TAG>> T>
+              <IEMIT `ADD .COUNT .NEW-COUNT = .COUNT '(`TYPE FIX)>
+              <BRANCH-TAG <SET TG2 <MAKE-TAG>>>
+              <LABEL-TAG .TG1>
+              <POP .COUNT>
+              <IEMIT `SUB 1 .NEW-COUNT = .NEW-COUNT '(`TYPE FIX)>
+              <IEMIT `MUL .NEW-COUNT 2 = .NEW-COUNT '(`TYPE FIX)>
+              <IEMIT `ADJ .NEW-COUNT>
+              <LABEL-TAG .TG2>)
+             (ELSE
+              <LENGTH-VECTOR .NEW-COUNT .NEW-COUNT>
+              <IEMIT `ADD .COUNT .NEW-COUNT = .COUNT '(`TYPE FIX)>)>>
+
+\\f 
+
+<SETG MINS '[[`LESS? `GRTR? `MUL `ADD] [`LESS? `GRTR? `MULF `ADDF]]>
+
+<GDECL (MINS) !<VECTOR [2 !<VECTOR [4 ATOM]>]>>
+
+<DEFINE DO-FUNNY-HACK (DAT N FAP NN FTMP EXTMP
+                      "AUX" (COD <NODE-SUBR .FAP>)
+                            (LMOD <ISTYPE? <RESULT-TYPE .NN>>)
+                            (MOD <ISTYPE? <RESULT-TYPE .N>>) T1 T2 TMP INS)
+       #DECL ((COD) FIX (N FAP NN) NODE)
+       <COND (<==? .COD 5>
+              <FREE-TEMP .DAT <>>
+              <SET TMP <GEN-TEMP>>
+              <IEMIT `CONS .DAT () = .TMP '(`TYPE LIST)>
+              <EMPTY-LIST .FTMP <SET T1 <MAKE-TAG>> <>>
+              <SET-TEMP .FTMP .TMP '(`TYPE LIST)>
+              <BRANCH-TAG <SET T2 <MAKE-TAG>>>
+              <LABEL-TAG .T1>
+              <IEMIT `PUTREST .EXTMP .TMP>
+              <LABEL-TAG .T2>
+              <FREE-TEMP .TMP <>>
+              <SET-TEMP .EXTMP .TMP '(`TYPE LIST)>)
+             (ELSE
+              <SET MOD <OR <AND <==? .MOD FIX> 1> 2>>
+              <COND (<AND <==? .MOD 2> <==? .LMOD FIX>>
+                     <SET TMP <GEN-FLOAT .DAT <GEN-TEMP>>>
+                     <FREE-TEMP .DAT>
+                     <SET DAT .TMP>)>
+              <SET INS <NTH <NTH ,MINS .MOD> .COD>>
+              <COND (<L? .COD 3>
+                     <IEMIT .INS .DAT .FTMP - <SET T1 <MAKE-TAG>>
+                            (`TYPE <COND (<==? .MOD 1> FIX)
+                                         (ELSE FLOAT)>)>
+                     <MOVE-ARG .DAT .FTMP>
+                     <LABEL-TAG .T1>)
+                    (ELSE
+                     <FREE-TEMP .DAT <>>
+                     <IEMIT .INS .FTMP .DAT = .FTMP>)>)>
+       T>
+
+<DEFINE DO-LAST (SUBRC MAYBE-FALSE WHERE EXTMP COUNT "AUX" TG TG2) 
+       <COND (.MAYBE-FALSE
+              <GEN-TYPE? .EXTMP FALSE <SET TG <MAKE-TAG>> T>
+              <COND (<==? .WHERE DONT-CARE> <SET WHERE <GEN-TEMP>>)
+                    (<TYPE? .WHERE TEMP> <USE-TEMP .WHERE>)>
+              <COND (.SUBRC <XMSUBR-CALL .SUBRC .COUNT .WHERE>)
+                    (ELSE <MSUBR-CALL APPLY .COUNT .WHERE>)>
+              <BRANCH-TAG <SET TG2 <MAKE-TAG>>>
+              <LABEL-TAG .TG>
+              <MOVE-ARG .COUNT .WHERE>
+              <LABEL-TAG .TG2>)
+             (ELSE
+              <COND (<==? .WHERE DONT-CARE> <SET WHERE <GEN-TEMP>>)
+                    (<TYPE? .WHERE TEMP> <USE-TEMP .WHERE>)>
+              <COND (.SUBRC <XMSUBR-CALL .SUBRC .COUNT .WHERE>)
+                    (ELSE <MSUBR-CALL APPLY .COUNT .WHERE>)>)>
+       .WHERE>
+
+<DEFINE XMSUBR-CALL (SUBRC NARGS WHERE) 
+       <COND (<MEMQ .SUBRC '[VECTOR UVECTOR STRING BYTES]>
+              <IEMIT `UBLOCK <FORM `TYPE-CODE .SUBRC> .NARGS = .WHERE
+                     (`TYPE .SUBRC)>)
+             (<==? .SUBRC LIST>
+              <IEMIT `LIST .NARGS = .WHERE '(`TYPE LIST)>)
+             (<==? .SUBRC TUPLE>
+              <IEMIT `TUPLE .NARGS = .WHERE>
+              <COND (<ASSIGNED? LIST-TUPLE>
+                     <SET LIST-TUPLE (.WHERE !.LIST-TUPLE)>)>)
+             (ELSE <MSUBR-CALL .SUBRC .NARGS .WHERE>)>>
+
+<SETG SLOT-FIRST [<CHTYPE <MIN> FIX> <CHTYPE <MAX> FIX> 1 0]>
+
+<COND (<GASSIGNED? MINFL> <SETG FSLOT-FIRST [,MINFL ,MAXFL 1.0 0.0]>)>
+
+<GDECL (SLOT-FIRST) <VECTOR [REST FIX]> (FSLOT-FIRST) <VECTOR [REST FLOAT]>>
+
+\\f 
+
+<DEFINE DO-FIRST-SETUP (FAP W FTMP EXTMP FLS
+                       "AUX" (COD 0)
+                             (TYP <ISTYPE? <RESULT-TYPE <PARENT .FAP>>>))
+   #DECL ((FAP) NODE (COD) FIX)
+   <COND
+    (<==? <NODE-TYPE .FAP> ,MFIRST-CODE>
+     <SET COD <NODE-SUBR .FAP>>
+     <COND (<==? .COD 5>
+           <MOVE-ARG <REFERENCE <COND (.TYP <CHTYPE () .TYP>) (ELSE ())>>
+                     .FTMP>
+           <MOVE-ARG <REFERENCE ()> .EXTMP>
+           <>)
+          (ELSE
+           <MOVE-ARG <REFERENCE <COND (<==? .TYP FLOAT>
+                                       <NTH ,FSLOT-FIRST .COD>)
+                                      (ELSE <NTH ,SLOT-FIRST .COD>)>>
+                     .FTMP>
+           <>)>)
+    (<NODE-NAME .FAP> T)
+    (<NOT .FLS> <DEALLOCATE-TEMP <MOVE-ARG <REFERENCE <>> .FTMP>> <>)>>
+
+\\f 
+
+<DEFINE MPARGS-GEN (N W "OPT" (CNT <>) "AUX" (MP .MPINFO)) 
+       #DECL ((MP) MPINFO (ETAG) ATOM)
+       <SET W
+            <STACKM <1 <MAP-STRS .MP>>
+                    <1 <MAP-TEMPS .MP>>
+                    <MAP-FR .MP>
+                    <MAP-TAG .MP>
+                    .W
+                    <1 <MAP-SEG? .MP>>
+                    .CNT>>
+       <PUT .MP ,MAP-STRS <REST <MAP-STRS .MP>>>
+       <PUT .MP ,MAP-TEMPS <REST <MAP-TEMPS .MP>>>
+       <PUT .MP ,MAP-SEG? <REST <MAP-SEG? .MP>>>
+       .W>
+
+\\f 
+
+<DEFINE STACKM (N SRC R? LBL W SEG CNT
+               "AUX" (STY <STRUCTYP <RESULT-TYPE .N>>) STMP ETMP LBL1 LBL2
+                     (ETY
+                      <GET-ELE-TYPE <RESULT-TYPE .N>
+                                    ALL
+                                    <AND .R? <NOT .SEG>>>))
+       #DECL ((N) NODE)
+       <COND (<==? .W DONT-CARE>
+              <SET W <GEN-TEMP <COND (<ISTYPE? .ETY>)(T)>>>)
+             (<TYPE? .W TEMP> <USE-TEMP .W <ISTYPE? .ETY>>)>
+       <COND (.SEG                             ;"Note this implies W is STACK"
+              <IEMIT `SET <SET STMP <GEN-TEMP>> .SRC>
+              <IEMIT `LOOP (<TEMP-NAME .STMP> LENGTH VALUE)>
+              <LABEL-TAG <SET LBL1 <MAKE-TAG>>>
+              <IEMIT `INTGO>
+              <EMPTY-CHECK TUPLE .STMP TUPLE T <SET LBL2 <MAKE-TAG>>>
+              <NTH-DO TUPLE .STMP <SET ETMP <GEN-TEMP>> 1>
+              <SET ETY <GET-ELE-TYPE <RESULT-TYPE <1 <KIDS .N>>> ALL>>
+              <COND (.R? <PUSH .ETMP>)
+                    (<SET ETY <STRUCTYP .ETY>>
+                     <NTH-DO .ETY .ETMP ,POP-STACK 1>)
+                    (ELSE <IEMIT `NTH1 .ETMP = ,POP-STACK>)>
+              <IEMIT `ADD .CNT 1 = .CNT '(`TYPE FIX)>
+              <REST-DO TUPLE .STMP .STMP 1>
+              <BRANCH-TAG .LBL1>
+              <LABEL-TAG .LBL2>
+              <FREE-TEMP .ETMP>
+              <FREE-TEMP .STMP>)
+             (ELSE
+              <SET ETY <ISTYPE? .ETY>>
+              <COND (.R? <IEMIT `SET .W .SRC>)
+                    (.STY <NTH-DO .STY .SRC .W 1> .W)
+                    (ELSE <IEMIT `NTH1 .SRC = .W>)>)>
+       .W>
+
+<DEFINE EMPTY-MAPF-CHECK (K STMPS LBL SEG? "AUX" STMP ETMP LBL1 LBL2 ETYP) 
+   #DECL ((K) <LIST [REST NODE]> (STMPS) <LIST [REST TEMP]>
+         (SEG?) <LIST [REST <OR ATOM FALSE>]>)
+   <MAPF <>
+    <FUNCTION (N TMP SEG "AUX" (STYP <STRUCTYP <RESULT-TYPE .N>>)) 
+       #DECL ((N) NODE)
+       <COND
+       (.SEG
+        <IEMIT `SET <SET STMP <GEN-TEMP>> .TMP>
+        <IEMIT `LOOP (<TEMP-NAME .STMP> VALUE LENGTH)>
+        <LABEL-TAG <SET LBL1 <MAKE-TAG>>>
+        <IEMIT `INTGO>
+        <EMPTY-CHECK TUPLE .STMP TUPLE T <SET LBL2 <MAKE-TAG>>>
+        <SET ETYP <STRUCTYP <GET-ELE-TYPE <RESULT-TYPE <1 <KIDS .N>>> ALL>>>
+        <NTH-DO TUPLE .STMP <SET ETMP <GEN-TEMP>> 1>
+        <COND (.ETYP <EMPTY-CHECK .ETYP .ETMP .ETYP T .LBL>)
+              (ELSE
+               <IEMIT `EMPTY? .ETMP + .LBL>)>
+        <REST-DO TUPLE .STMP .STMP 1>
+        <BRANCH-TAG .LBL1>
+        <LABEL-TAG .LBL2>
+        <FREE-TEMP .STMP>
+        <FREE-TEMP .ETMP>)
+       (.STYP <EMPTY-CHECK .STYP .TMP .STYP T .LBL>)
+       (ELSE
+        <IEMIT `EMPTY? .TMP + .LBL>)>>
+    .K
+    .STMPS
+    .SEG?>>
+
+<DEFINE REM-TUPS ()
+       #DECL ((STK-CHARS8 STK-CHARS7 STK) FIX)
+       <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">)>>
+
+<DEFINE FLUSH-TUPLES (STMPS SEG?) 
+       #DECL ((SEG? STMPS) LIST)
+       <MAPF <>
+             <FUNCTION (TMP SEGF) 
+                     #DECL ((TMP) TEMP (SEGF) <OR ATOM FALSE>)
+                     <COND (.SEGF
+                            <LENGTH-VECTOR .TMP .TMP>
+                            <IEMIT `SUB 0 .TMP = .TMP '(`TYPE FIX)>
+                            <IEMIT `MUL .TMP 2 = .TMP '(`TYPE FIX)>
+                            <IEMIT `ADJ .TMP>)>
+                     <FREE-TEMP .TMP>>
+             .STMPS
+             .SEG?>>
+
+\\f 
+
+<DEFINE HMAPFR (MNOD MWHERE K NF BR DIR
+               "AUX" (SPECD <>) (FAP <1 .K>) (INRAP <2 .K>) F?
+                     (NARG <LENGTH <SET K <REST .K 2>>>)
+                     (R? <==? <NODE-SUBR .MNOD> ,MAPR>) (FF? <>)
+                     (MAPEND <MAKE-TAG "MAP">) (MAPLP <MAKE-TAG "MAP">)
+                     (REST-TAG <MAKE-TAG "MAP">) (SUBRC <AP? .FAP>)
+                     (BASEF .BASEF) (MAYBE-FALSE <>) (EXIT <MAKE-TAG "MAPEX">)
+                     (APPLTAG <MAKE-TAG "MAPAP">) (FLS <==? .MWHERE FLUSHED>)
+                     (RTAG <MAKE-TAG "MAP">) TEM (FOONARG .NARG)
+                     (STMPS
+                      <MAPF ,LIST
+                            <FUNCTION () 
+                                    <COND (<L? <SET FOONARG <- .FOONARG 1>> 0>
+                                           <MAPSTOP>)
+                                          (ELSE <GEN-TEMP <>>)>>>) FTMP FEXIT
+                     (EXTMP <GEN-TEMP <>>) (BNDTMP <GEN-TEMP <>>)
+                     (SEG? <MAPF ,LIST <FUNCTION (X) %<>> .STMPS>) SEGCNT
+                     MYFRAME (INRTYP <ISTYPE? <RESULT-TYPE .INRAP>>)
+                     (FWHERE <>) LEAVE? (OFT .FREE-TEMPS) (ANY-EMPTY <>)
+                     STKTMP (STK 0) (STK-CHARS7 0) (STK-CHARS8 0))
+   #DECL ((STK-CHARS7 STK-CHARS8 STK) <SPECIAL FIX> (STKTMP) <SPECIAL ANY>
+         (SPECD) <SPECIAL <OR FALSE ATOM>> (NARG) <SPECIAL FIX> (FAP) NODE
+         (BASEF MNOD INRAP) <SPECIAL NODE> (K) <LIST [REST NODE]>
+         (MAPEND EXIT MAPLP RTAG APPLTAG REST-TAG) <SPECIAL ATOM>
+         (FTMP EXTMP MWHERE MAYBE-FALSE FLS) <SPECIAL ANY> (FSYM) SYMTAB
+         (F?) <SPECIAL ANY> (BNDTMP LEAVE?) <SPECIAL TEMP>
+         (DIR BR) <SPECIAL ANY> (SEG?) <LIST [REST <OR ATOM FALSE>]>
+         (TMPS) <PRIMTYPE LIST>)
+   <MAPF <>
+        <FUNCTION (X) 
+                #DECL ((X) NODE)
+                <COND (<L? <MINL <RESULT-TYPE .X>> 1>
+                       <SET ANY-EMPTY T>
+                       <MAPLEAVE>)>>
+        .K>
+   <COND (.NF <SET DIR <NOT .DIR>>)>
+   <PROG ((TMPS .TMPS) (TMPS-NEXT .TMPS-NEXT) (FREE-TEMPS .FREE-TEMPS)
+         (ALL-TEMPS-LIST .ALL-TEMPS-LIST))
+     #DECL ((TMPS-NEXT FREE-TEMPS ALL-TEMPS-LIST) <SPECIAL LIST>
+           (TMPS) <SPECIAL FORM>)
+     <COND (<==? .MWHERE DONT-CARE> <SET FTMP <SET MWHERE <GEN-TEMP <>>>>)
+          (ELSE <SET FTMP <GEN-TEMP <>>>)>
+     <SET F? <DO-FIRST-SETUP .FAP .MWHERE .FTMP .EXTMP .FLS>>
+     <OR .F? <SET FF? <==? <NODE-TYPE .FAP> ,MFIRST-CODE>>>
+     <PUSH-STRUCS .K .STMPS .SEG?>
+     <COND (.F? <SET MAYBE-FALSE <DO-FINAL-SETUP .FAP .SUBRC .FTMP .EXTMP>>)>
+     <COND (<AND .F?
+                <OR <NOT .SUBRC>
+                    <NOT <MEMQ .SUBRC '[VECTOR
+                                        UVECTOR
+                                        TUPLE
+                                        STRING
+                                        BYTES]>>>>
+           <START-FRAME <COND (.SUBRC) (ELSE APPLY)>>
+           <COND (<NOT .SUBRC> <PUSH .EXTMP>)>)>
+     <COND (<AND .ANY-EMPTY .BR <N==? .INRTYP FALSE> <NOT .DIR>>
+           <EMPTY-MAPF-CHECK .K .STMPS .BR .SEG?>)>
+     <IEMIT `LOOP>
+     <LABEL-TAG .MAPLP>
+     <IEMIT `INTGO>
+     <EMPTY-MAPF-CHECK .K
+                      .STMPS
+                      <COND (<AND .BR
+                                  <COND (.DIR <N==? .INRTYP FALSE>)
+                                        (ELSE <==? .INRTYP FALSE>)>>
+                             .BR)
+                            (ELSE .APPLTAG)>
+                      .SEG?>
+     <COND (<AND <OR <SPCS-X .INRAP> <OR? !.SEG?>>
+                <ACTIVATED .INRAP>
+                .F?
+                <NOT .FF?>>
+           <SET LEAVE? <GEN-TEMP>>
+           <IEMIT `SET .LEAVE? 0>
+           <IEMIT `ICALL <SET FEXIT <MAKE-TAG>> = <SET FWHERE <GEN-TEMP>>>
+           <SET ALL-TEMPS-LIST
+                ((.TMPS .TMPS-NEXT .FREE-TEMPS <>) !.ALL-TEMPS-LIST)>
+           <MIM-TEMPS-HOLD>
+           <MIM-TEMPS-EMIT>
+           <SET FREE-TEMPS ()>
+           <SET MYFRAME <GEN-TEMP>>
+           <PREV-FRAME .MYFRAME>
+           <PUT <1 .ALL-TEMPS-LIST> 4 .MYFRAME>)>
+     <REPEAT ((BST <BINDING-STRUCTURE .INRAP>) (K .K) TMP SYM (STMPS .STMPS)
+             VAL (SEG? .SEG?) T-NAME TY PT)
+       #DECL ((BS) <LIST [REST SYMTAB]> (K) <LIST [REST NODE]>
+             (STMPS) <LIST [REST TEMP]> (TNAME) <SPECIAL ANY>
+             (SEG?) <LIST [REST <OR ATOM FALSE>]>)
+       <COND
+       (<EMPTY? .STMPS>
+        <MAPF <>
+              <FUNCTION (SYM) 
+                      #DECL ((SYM) SYMTAB)
+                      <COND (<AND <NOT .SPECD> <SPEC-SYM .SYM>>
+                             <SAVE-BINDING .BNDTMP>
+                             <SET SPECD T>)>
+                      <COND (<NOT <SPEC-SYM .SYM>>
+                             <SET TMP
+                                  <GEN-TEMP <>
+                                            <NAME-SYM .SYM>
+                                            T
+                                            <DECL-SYM .SYM>>>
+                             <PUT .SYM ,TEMP-NAME-SYM .TMP>
+                             <SET T-NAME <TEMP-NAME .TMP>>)>
+                      <COND (<AND <MBIND-GENERATE .SYM> <NOT <SPEC-SYM .SYM>>>
+                             <PUTREST .TMPS-NEXT <SET TMPS-NEXT (.T-NAME)>>
+                             <USE-TEMP .TMP>
+                             <PUT .TMP ,TEMP-REFS 1>)>>
+              .BST>
+        <RETURN>)
+       (ELSE
+        <COND (<AND <SPEC-SYM <SET SYM <1 .BST>>> <NOT .SPECD>>
+               <SAVE-BINDING .BNDTMP>
+               <SET SPECD T>)>
+        <COND
+         (<NOT <SPEC-SYM .SYM>>
+          <SET TMP <GEN-TEMP <> <NAME-SYM .SYM> T T>>
+          <PUT .SYM ,TEMP-NAME-SYM .TMP>
+          <PUTREST
+           .TMPS-NEXT
+           <SET TMPS-NEXT
+                (<COND (<AND <NOT <ASS? .SYM>>
+                             <SET TY <ISTYPE? <COMPOSIT-TYPE .SYM>>>
+                             <OR <==? <SET PT <TYPEPRIM .TY>> FIX>
+                                 <==? .PT WORD>
+                                 <==? .PT LIST>>>
+                        <CHTYPE [<TEMP-NAME .TMP> .TY] ADECL>)
+                       (ELSE <TEMP-NAME .TMP>)>)>>
+          <PUT .TMP ,TEMP-REFS 1>)>
+        <COND (<AND <1 .SEG?> <==? <CODE-SYM .SYM> ,ARGL-TUPLE>>
+               <IEMIT `SET <SET SEGCNT <GEN-TEMP>> 0>
+               <STACKM <1 .K> <1 .STMPS> .R? .MAPEND ,POP-STACK T .SEGCNT>
+               <IEMIT `TUPLE
+                      .SEGCNT
+                      =
+                      <COND (<SPEC-SYM .SYM> <SET VAL <GEN-TEMP>>)
+                            (ELSE .TMP)>>)
+              (<1 .SEG?>
+               <COMPILE-LOSSAGE "Not quite implemented SEGMENTS in MAPFS">)
+              (ELSE
+               <SET VAL
+                    <STACKM <1 .K>
+                            <1 .STMPS>
+                            .R?
+                            .MAPEND
+                            <COND (<SPEC-SYM .SYM> DONT-CARE) (ELSE .TMP)>
+                            <>
+                            <>>>)>
+        <COND (<SPEC-SYM .SYM>
+               <SPECIAL-BINDING .SYM T .VAL>
+               <SET STK <+ .STK ,BINDING-LENGTH>>)>
+        <SET STMPS <REST .STMPS>>
+        <SET BST <REST .BST>>
+        <SET K <REST .K>>
+        <SET SEG? <REST .SEG?>>)>>
+     <COND (.F?
+           <SET TEM <SEQ-GEN <KIDS .INRAP> DONT-CARE>>
+           <COND (<N==? .TEM ,NO-DATUM>
+                  <COND (.FWHERE
+                         <FREE-TEMP .TEM <>>
+                         <PUSH .TEM>
+                         <IEMIT `RTUPLE 1 <FREE-TEMP <CURRENT-FRAME> <>>>)
+                        (ELSE
+                         <COND (.SPECD <IEMIT `UNBIND .BNDTMP>)>
+                         <COND (<AND <ASSIGNED? SEGCNT> .SEGCNT>
+                                <IEMIT `SUB 0 .SEGCNT = .SEGCNT '(`TYPE FIX)>
+                                <IEMIT `MUL .SEGCNT 2 = .SEGCNT '(`TYPE FIX)>
+                                <IEMIT `ADJ .SEGCNT>
+                                <FREE-TEMP .SEGCNT>)>
+                         <REM-TUPS>
+                         <DO-STACK-ARGS .MAYBE-FALSE .TEM .EXTMP .FTMP>
+                         <FREE-TEMP .TEM>)>)>)
+          (.FF?
+           <SET TEM <SEQ-GEN <KIDS .INRAP> DONT-CARE>>
+           <COND (<N==? .TEM ,NO-DATUM>
+                  <COND (.SPECD <IEMIT `UNBIND .BNDTMP>)>
+                  <COND (<AND <ASSIGNED? SEGCNT> .SEGCNT>
+                         <IEMIT `SUB 0 .SEGCNT = .SEGCNT '(`TYPE FIX)>
+                         <IEMIT `MUL .SEGCNT 2 = .SEGCNT '(`TYPE FIX)>
+                         <IEMIT `ADJ .SEGCNT>
+                         <FREE-TEMP .SEGCNT>)>
+                  <REM-TUPS>
+                  <DO-FUNNY-HACK .TEM .MNOD .FAP .INRAP .FTMP .EXTMP>)>)
+          (.FLS
+           <SEQ-GEN <KIDS .INRAP> FLUSHED>
+           <COND (.SPECD <IEMIT `UNBIND .BNDTMP>)>
+           <COND (<AND <ASSIGNED? SEGCNT> .SEGCNT>
+                  <IEMIT `SUB 0 .SEGCNT = .SEGCNT '(`TYPE FIX)>
+                  <IEMIT `MUL .SEGCNT 2 = .SEGCNT '(`TYPE FIX)>
+                  <IEMIT `ADJ .SEGCNT>
+                  <FREE-TEMP .SEGCNT>)>
+           <REM-TUPS>)
+          (ELSE
+           <SEQ-GEN <KIDS .INRAP> .FTMP>
+           <COND (.SPECD <IEMIT `UNBIND .BNDTMP>)>
+           <COND (<AND <ASSIGNED? SEGCNT> .SEGCNT>
+                  <IEMIT `SUB 0 .SEGCNT = .SEGCNT '(`TYPE FIX)>
+                  <IEMIT `MUL .SEGCNT 2 = .SEGCNT '(`TYPE FIX)>
+                  <IEMIT `ADJ .SEGCNT>
+                  <FREE-TEMP .SEGCNT>)>
+           <REM-TUPS>)>
+     <COND (<NOT <ASSIGNED? LEAVE?>> <SET OFT .FREE-TEMPS>)>>
+   <SET FREE-TEMPS .OFT>
+   <SET TMPS-NEXT <REST .TMPS <- <LENGTH .TMPS> 1>>>
+   <COND (<AND .FWHERE .F?>
+         <LABEL-TAG .FEXIT>
+         <IEMIT `VEQUAL? .LEAVE? 2 + .EXIT>
+         <DO-STACK-TUPLE .MAYBE-FALSE .FWHERE .EXTMP .FTMP>
+         <IEMIT `VEQUAL? .LEAVE? 1 + .APPLTAG>
+         <FREE-TEMP .LEAVE?>)>
+   <COND (<AND <NOT .F?> <ASSIGNED? SEGCNT> .SEGCNT>
+         <IEMIT `SUB 0 .SEGCNT = .SEGCNT '(`TYPE FIX)>
+         <IEMIT `MUL .SEGCNT 2 = .SEGCNT '(`TYPE FIX)>
+         <IEMIT `ADJ .SEGCNT>
+         <FREE-TEMP .SEGCNT>)>
+   <LABEL-TAG .REST-TAG>
+   <REST-STRUCS .STMPS .K .SEG?>
+   <BRANCH-TAG .MAPLP>
+   <LABEL-TAG .APPLTAG>
+   <COND (.F?
+         <SET MWHERE <DO-LAST .SUBRC .MAYBE-FALSE .MWHERE .EXTMP .FTMP>>
+         <FREE-TEMP .EXTMP>
+         <FREE-TEMP .FTMP>)
+        (.FF? <FREE-TEMP .EXTMP> <SET MWHERE <MOVE-ARG .FTMP .MWHERE>>)
+        (<N==? .MWHERE FLUSHED>
+         <FREE-TEMP .EXTMP>
+         <COND (<N==? .FTMP .MWHERE> <MOVE-ARG .FTMP .MWHERE>)>)
+        (ELSE <FREE-TEMP .EXTMP> <FREE-TEMP .FTMP>)>
+   <LABEL-TAG .EXIT>
+   <FLUSH-TUPLES .STMPS .SEG?>
+   .MWHERE>
+
+<DEFINE SAVE-BINDING (BNDTMP) <USE-TEMP .BNDTMP> <GET-BINDING .BNDTMP>>
+
+<DEFINE NO-INTERFERE (N B) 
+       #DECL ((N) NODE (B) <LIST [REST SYMTAB]>)
+       <COND (<AND <==? <NODE-TYPE .N> ,LVAL-CODE> <MEMQ <NODE-NAME .N> .B>>
+              <>)
+             (<MEMQ <NODE-TYPE .N> ,SNODES> T)
+             (<AND <==? <NODE-TYPE .N> ,COND-CODE>
+                   <NOT <NO-INTERFERE <PREDIC .N> .B>>>
+              <>)
+             (ELSE
+              <MAPF <>
+                    <FUNCTION (N) 
+                            #DECL ((N) NODE)
+                            <COND (<NO-INTERFERE .N .B> T)
+                                  (ELSE <MAPLEAVE <>>)>>
+                    <KIDS .N>>)>>
+
+\\f 
+
+<DEFINE NOTIMP (ARG) <COMPILE-ERROR "NOT IMPLEMENTED MAPF/R TUPLES">>
+
+<DEFINE MENTROPY (SYM) T>
+
+<DEFINE MBIND-GENERATE (SYM "AUX" (COD <CODE-SYM .SYM>)) 
+       #DECL ((SYM) SYMTAB (COD) FIX)
+       <CASE ,==?
+             .COD
+             (,ARGL-ACT <ACT-B .SYM>)
+             (,ARGL-IAUX <AUX1-B .SYM T>)
+             (,ARGL-AUX <AUX2-B .SYM T>)
+             (,ARGL-TUPLE <NOTIMP .SYM>)
+             (,ARGL-ARGS <MENTROPY .SYM>)
+             (,ARGL-QIOPT <AUX1-B .SYM T>)
+             (,ARGL-IOPT <AUX1-B .SYM T>)
+             (,ARGL-QOPT <AUX2-B .SYM T>)
+             (,ARGL-OPT <AUX2-B .SYM T>)
+             (,ARGL-CALL <MENTROPY .SYM>)
+             (,ARGL-BIND <BIND-B .SYM>)
+             (,ARGL-QUOTE <MENTROPY .SYM>)
+             (,ARGL-ARG <MENTROPY .SYM>)>>
+
+<DEFINE MAPLEAVE-GEN (N W
+                     "AUX" (FAP <1 <KIDS .MNOD>>) (TMP <GEN-TEMP <>>)
+                           (BR .BR) (DIR .DIR) RT (FRAME? <ASSIGNED? LEAVE?>)
+                           FOK TRUE-OK)
+       #DECL ((MNOD FAP N) NODE (TMP) TEMP)
+       <SET FOK <TYPE-AND <SET RT <RESULT-TYPE <SET N <1 <KIDS .N>>>>> FALSE>>
+       <SET TRUE-OK <N==? <ISTYPE? .RT> FALSE>>
+       <COND (<==? .MWHERE FLUSHED>
+              <COND (.BR
+                     <COND (<AND .FOK .TRUE-OK>
+                            <PRED-BRANCH-GEN .BR .N .DIR>)
+                           (ELSE
+                            <GEN .N FLUSHED>
+                            <COND (<COND (.FOK <NOT .DIR>) (ELSE .DIR)>
+                                   <BRANCH-TAG .BR>)>)>)
+                    (ELSE
+                     <GEN .N FLUSHED>)>)
+             (ELSE
+              <COND (<AND .F? <==? .MWHERE .FTMP> <NOT .FRAME?>>
+                     <SET-TEMP .TMP .FTMP>)
+                    (ELSE <SET TMP .FTMP>)>
+              <SET MWHERE <GEN .N .MWHERE>>
+              <DEALLOCATE-TEMP .MWHERE>)>
+       <COND (.FRAME? <SET-TEMP .LEAVE? 2>)
+             (ELSE
+              <REM-TUPS>
+              <MAP-UNBIND .TMP .F? .BNDTMP .SPECD>
+              <COND (<N==? .TMP .FTMP> <FREE-TEMP .TMP>)>
+              <BRANCH-TAG .EXIT>)>
+       ,NO-DATUM>
+
+<DEFINE MAP-UNBIND (EXTMP F? BNDTMP SPECD) 
+       <COND (.F?
+              <IEMIT `SUB 0 .EXTMP = .EXTMP '(`TYPE FIX)>
+              <IEMIT `MUL .EXTMP 2 = .EXTMP '(`TYPE FIX)>
+              <IEMIT `ADJ .EXTMP>)>
+       <COND (.SPECD <IEMIT `UNBIND .BNDTMP>)>
+       T>
+
+\\f 
+
+<DEFINE MAPRET-STOP-GEN (N W
+                        "AUX" (SG <SEGS .N>) (K <KIDS .N>) (LN <LENGTH .K>)
+                              (FAP <1 <KIDS .MNOD>>) DAT FTG
+                              (FF? <==? <NODE-TYPE .FAP> ,MFIRST-CODE>)
+                              (LEAVE <==? <NODE-SUBR .N> ,MAPSTOP>)
+                              (EXTMP .EXTMP) (FTMP .FTMP) (F? .F?)
+                              (MAYBE-FALSE .MAYBE-FALSE) SEGTMP
+                              (FRAME? <ASSIGNED? LEAVE?>)
+                              (SEGLABEL <MAKE-TAG>) (COUNTMP .FTMP)
+                              (SEGCALLED <>))
+   #DECL ((N MNOD) NODE (K) <LIST [REST NODE]> (LN) FIX
+         (SEGCALLED SEGLABEL COUNTMP) <SPECIAL ANY>)
+   <COND
+    (<AND <NOT .SG> <L? .LN 2>>
+     <COND (<NOT <0? .LN>>
+           <SET DAT <GEN <1 .K>>>
+           <COND (.FF?
+                  <REM-TUPS>
+                  <DO-FUNNY-HACK .DAT <1 .K> .FAP .INRAP .FTMP .EXTMP>)
+                 (.F?
+                  <COND (.FRAME?
+                         <PUSH .DAT>
+                         <IEMIT `RTUPLE 1 <FREE-TEMP <CURRENT-FRAME> <>>>)
+                        (ELSE
+                         <REM-TUPS>
+                         <PUSH .DAT>
+                         <IEMIT `ADD .FTMP 1 = .FTMP '(`TYPE FIX)>)>
+                  <FREE-TEMP .DAT>)>)
+          (ELSE <REM-TUPS>)>)
+    (.FF? <DO-FUNNY-MAPRET .N .K .FAP> <REM-TUPS>)
+    (ELSE
+     <COND (.FRAME? <SET FTMP <GEN-TEMP>> <IEMIT `SET .FTMP 0>)>
+     <MAPF <>
+      <FUNCTION (NOD "AUX" TG STYP N TT RES) 
+        #DECL ((NOD) NODE)
+        <COND
+         (<==? <NODE-TYPE .NOD> ,SEGMENT-CODE>
+          <COND (<NOT <ASSIGNED? SEGTMP>> <SET SEGTMP <GEN-TEMP <>>>)>
+          <SET RES <GEN <SET N <1 <KIDS .NOD>>> .SEGTMP>>
+          <COND (.MAYBE-FALSE <GEN-TYPE? .EXTMP FALSE <SET TG <MAKE-TAG>> T>)>
+          <COND (<N==? .RES ,NO-DATUM>
+                 <SEGMENT-STACK
+                  .SEGTMP
+                  .FTMP
+                  <SET STYP <STRUCTYP <RESULT-TYPE .N>>>
+                  <ISTYPE? <RESULT-TYPE .N>>
+                  .SEGLABEL>)
+                (.SEGCALLED <LABEL-TAG .SEGLABEL>)>
+          <SET SEGLABEL <MAKE-TAG>>
+          <COND (.MAYBE-FALSE
+                 <BRANCH-TAG <SET FTG <MAKE-TAG>>>
+                 <LABEL-TAG .TG>
+                 <COND (.STYP <EMPTY-CHECK .STYP .SEGTMP .STYP T .FTG>)
+                       (ELSE <IEMIT `EMPTY? .SEGTMP + .FTG>)>
+                 <STACKM .N .SEGTMP <> <> .FTMP <> <>>
+                 <LABEL-TAG .FTG>)>)
+         (ELSE
+          <COND (.MAYBE-FALSE
+                 <SET TT <GEN .NOD>>
+                 <GEN-TYPE? .EXTMP FALSE <SET TG <MAKE-TAG>> T>
+                 <PUSH .TT>
+                 <IEMIT `ADD .FTMP 1 = .FTMP '(`TYPE FIX)>
+                 <BRANCH-TAG <SET FTG <MAKE-TAG>>>
+                 <LABEL-TAG .TG>
+                 <SET-TEMP .FTMP .TT>
+                 <LABEL-TAG .FTG>
+                 <FREE-TEMP .TT>)
+                (ELSE
+                 <GEN .NOD ,POP-STACK>
+                 <IEMIT `ADD .FTMP 1 = .FTMP '(`TYPE FIX)>)>)>>
+      .K>
+     <COND (.FRAME?
+           <COND (.LEAVE <SET-TEMP .LEAVE? 1>)>
+           <IEMIT `RTUPLE .FTMP <FREE-TEMP <CURRENT-FRAME> <>>>)>)>
+   <COND (<NOT .FRAME?>
+         <BRANCH-TAG <COND (.LEAVE .APPLTAG) (ELSE .REST-TAG)>>)>
+   ,NO-DATUM>
+
+\\f 
+
+<DEFINE DO-FUNNY-MAPRET (N K FAP "AUX" SEGTMP SEGLABEL COUNTMP TGX (SEGCALLED <>)) 
+   #DECL ((N FAP) NODE (K) <LIST [REST NODE]>
+         (SEGLABEL COUNTMP SEGCALLED) <SPECIAL ANY>)
+   <MAPF <>
+    <FUNCTION (NN "AUX" TG1 TG2 DAT STYP TMPX TEM) 
+           #DECL ((NN) NODE (TG1 TG2) ATOM)
+           <COND (<OR <==? <NODE-TYPE .NN> ,SEG-CODE>
+                      <==? <NODE-TYPE .NN> ,SEGMENT-CODE>>
+                  <SET COUNTMP <GEN-TEMP>>
+                  <SET SEGLABEL <MAKE-TAG>>
+                  <SET TEM <GEN <SET NN <1 <KIDS .NN>>>>>
+                  <COND (<AND <TYPE? .TEM TEMP> <L=? <TEMP-REFS .TEM> 1>>
+                         <SET SEGTMP .TEM>)
+                        (<N==? .TEM ,NO-DATUM>
+                         <COND (<NOT <ASSIGNED? SEGTMP>>
+                                <SET SEGTMP <GEN-TEMP <>>>)>
+                         <SET-TEMP .SEGTMP .TEM>
+                         <FREE-TEMP .TEM>)>
+                  <SET TG2 <MAKE-TAG>>
+                  <COND (<N==? .TEM ,NO-DATUM>
+                         <SET STYP <STRUCTYP <RESULT-TYPE .NN>>>
+                         <COND (<==? .STYP LIST>
+                                <IEMIT `LOOP (<TEMP-NAME .SEGTMP> VALUE)>)
+                               (ELSE
+                                <IEMIT `LOOP (<TEMP-NAME .SEGTMP>
+                                              VALUE LENGTH)>)>
+                         <LABEL-TAG <SET TG1 <MAKE-TAG>>>
+                         <IEMIT `INTGO>
+                         <SET TMPX <GEN-TEMP>>
+                         <COND (.STYP
+                                <EMPTY-CHECK .STYP .SEGTMP .STYP T .TG2>
+                                <NTH-DO .STYP .SEGTMP .TMPX 1>)
+                               (ELSE
+                                <IEMIT `EMPTY? .SEGTMP + .TG2>
+                                <IEMIT `NTH1 .SEGTMP = .TMPX>)>
+                         <DO-FUNNY-HACK .TMPX .MNOD .FAP .NN .FTMP .EXTMP>
+                         <COND (.STYP <REST-DO .STYP .SEGTMP .SEGTMP 1>)
+                               (ELSE <IEMIT `REST1 .SEGTMP = .SEGTMP>)> 
+                         <BRANCH-TAG .TG1>)>
+                  <COND (.SEGCALLED
+                         <SET TMPX <GEN-TEMP>>
+                         <LABEL-TAG .SEGLABEL>
+                         <IEMIT `LOOP>
+                         <LABEL-TAG <SET TGX <MAKE-TAG>>>
+                         <IEMIT `VEQUAL? .COUNTMP 0 + .TG2>
+                         <POP .TMPX>
+                         <DO-FUNNY-HACK .TMPX .MNOD .FAP .NN .FTMP .EXTMP>
+                         <IEMIT `SUB .COUNTMP 1 = .COUNTMP>
+                         <BRANCH-TAG .TGX>
+                         <LABEL-TAG .TG2>
+                         <FREE-TEMP .COUNTMP>
+                         <FREE-TEMP .TMPX>)
+                        (<N==? .TEM ,NO-DATUM>
+                         <LABEL-TAG .TG2>)>)
+                 (ELSE
+                  <SET DAT <GEN .NN DONT-CARE>>
+                  <DO-FUNNY-HACK .DAT .MNOD .FAP .NN .FTMP .EXTMP>)>>
+    .K>>
+
+<DEFINE AP? (N "AUX" AT) 
+       #DECL ((N) NODE)
+       <AND <==? <NODE-TYPE .N> ,GVAL-CODE>
+            <==? <NODE-TYPE <SET N <1 <KIDS .N>>>> ,QUOTE-CODE>
+            <SET AT <NODE-NAME .N>>
+            <OR .REASONABLE
+                <AND <GASSIGNED? .AT> <TYPE? ,.AT MSUBR>>
+                <AND <GASSIGNED? .AT>
+                     <TYPE? ,.AT FUNCTION>
+                     <OR <==? .AT .FCNS>
+                         <AND <TYPE? .FCNS LIST> <MEMQ .AT .FCNS>>>>>
+            .AT>>
+
+<ENDPACKAGE>