Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vaxc / acmerge.mud
diff --git a/mim/development/mim/vaxc/acmerge.mud b/mim/development/mim/vaxc/acmerge.mud
new file mode 100644 (file)
index 0000000..8c67de5
--- /dev/null
@@ -0,0 +1,604 @@
+<COND (<NOT <GASSIGNED? INST-NULLF>>
+       <SETG INST-NULLF <CHTYPE <LSH ,INST-NULL 24> FIX>>)>
+
+<DEFINE SAVE-LOAD-STATE () 
+       #DECL ((VALUE) SLOAD-STATE)
+       <MAPF ,VECTOR
+             <FCN (AC)
+                  <AND <NOT <AC-USE .AC>>
+                       <CHTYPE <VECTOR <AC-LLOAD .AC> <AC-LLOAD-EA .AC>>
+                               AC-LOAD-STATE>>>
+             ,ALL-ACS>>
+
+<DEFINE SET-AC-LOAD-STATE (LSTATE) 
+       #DECL ((LSTATE) SLOAD-STATE)
+       <MAPF <>
+             <FCN (AC ACLS)
+                  <COND (.ACLS
+                         <PUT .AC ,AC-USE <>>
+                         <PUT .AC ,AC-LLOAD <ACL-LLOAD .ACLS>>
+                         <PUT .AC ,AC-LLOAD-EA <ACL-LLOAD-EA .ACLS>>)
+                        (<PUT .AC ,AC-USE T>
+                         <PUT .AC ,AC-LLOAD <>>
+                         <PUT .AC ,AC-LLOAD-EA <>>)>>
+             ,ALL-ACS
+             .LSTATE>>
+
+<DEFINE SAVE-STATE ("AUX" (CACHE ,VARIABLE-CACHE)) 
+       #DECL ((SSTATE) <OR FALSE VECTOR> (VALUE) <PRIMTYPE VECTOR>)
+       <MAPF ,VECTOR <FCN (LVAR) <COPY-LINKVAR .LVAR>> .CACHE>>
+
+<DEFINE PAIR-MERGE-STATE (SSTATE1 SSTATE2
+                         "OPTIONAL" (SSTATE <>) LEN
+                         "AUX" LKV2)
+       #DECL ((SSTATE1 SSTATE2) AC-STATE
+              (SSTATE) <OR FALSE <PRIMTYPE VECTOR>>)
+       <SET LEN <MAX <LENGTH .SSTATE1> <LENGTH .SSTATE2>>>
+       <COND (.SSTATE <SET SSTATE <ADJUST-LENGTH .SSTATE .LEN>>)
+             (ELSE <SET SSTATE <IVECTOR .LEN>>)>
+       <SET SSTATE <REST .SSTATE <LENGTH .SSTATE>>>
+       <MAPF <>
+             <FCN (LKV1)
+                  <COND (<SET LKV2 <LINK-FIND .LKV1 .SSTATE2>>
+                         <COND (<SET LKV2 <ADJUST-LINKS .LKV1 .LKV2>>
+                                <SET SSTATE <BACK .SSTATE>>
+                                <PUT .SSTATE 1 .LKV2>)>)>>
+             .SSTATE1>
+       .SSTATE>
+
+<DEFINE LINK-FIND (LK1 LINKS "AUX" (VAR <LINKVAR-VAR .LK1>)) 
+       #DECL ((LK1) LINKVAR (LINKS) <VECTOR [REST LINKVAR]>)
+       <MAPF <>
+             <FCN (LK2)
+                  <COND (<==? <LINKVAR-VAR .LK2> .VAR> <MAPLEAVE .LK2>)>>
+             .LINKS>>
+
+<DEFINE ADJUST-LINKS (LK1 LK2
+                     "AUX" DECL (VAC <>) (TAC <>) (TWAC <>) (CAC <>) MXREFS)
+       #DECL ((LK1 LK2) LINKVAR)
+       <COND (<==? <LINKVAR-DECL .LK1> <LINKVAR-DECL .LK2>>
+              <SET DECL <LINKVAR-DECL .LK1>>)
+             (ELSE <SET DECL <>>)>
+       <COND (<==? <LINKVAR-TYPE-AC .LK1> <LINKVAR-TYPE-AC .LK2>>
+              <SET TAC <LINKVAR-TYPE-AC .LK1>>)>
+       <COND (<==? <LINKVAR-VALUE-AC .LK1> <LINKVAR-VALUE-AC .LK2>>
+              <SET VAC <LINKVAR-VALUE-AC .LK1>>)>
+       <COND (<==? <LINKVAR-COUNT-AC .LK1> <LINKVAR-COUNT-AC .LK2>>
+              <SET CAC <LINKVAR-COUNT-AC .LK1>>)>
+       <COND (<==? <LINKVAR-TYPE-WORD-AC .LK1> <LINKVAR-TYPE-WORD-AC .LK2>>
+              <SET TWAC <LINKVAR-TYPE-WORD-AC .LK1>>)>
+       <COND (<OR .VAC .TAC .TWAC .CAC>
+              <SET LK1 <COPY-LINKVAR .LK1>>
+              <PUT .LK1 ,LINKVAR-DECL .DECL>
+              <PUT .LK1 ,LINKVAR-TYPE-AC .TAC>
+              <PUT .LK1 ,LINKVAR-VALUE-AC .VAC>
+              <PUT .LK1 ,LINKVAR-TYPE-WORD-AC .TWAC>
+              <PUT .LK1 ,LINKVAR-COUNT-AC .CAC>
+              <SET MXREFS
+                   <MERGE-XREFS <LINKVAR-POTENTIAL-SAVES .LK1>
+                                <LINKVAR-POTENTIAL-SAVES .LK2>>>
+              <PUT .LK1
+                   ,LINKVAR-VALUE-STORED
+                   <AND <LINKVAR-VALUE-STORED .LK1>
+                        <LINKVAR-VALUE-STORED .LK2>>>
+              <PUT .LK1
+                   ,LINKVAR-TYPE-STORED
+                   <AND <LINKVAR-TYPE-STORED .LK1>
+                        <LINKVAR-TYPE-STORED .LK2>>>
+              <PUT .LK1
+                   ,LINKVAR-COUNT-STORED
+                   <AND <LINKVAR-COUNT-STORED .LK1>
+                        <LINKVAR-COUNT-STORED .LK2>>>
+              <PUT .LK1 ,LINKVAR-POTENTIAL-SAVES .MXREFS>)>>
+
+<DEFINE MERGE-XREFS (LX1 LX2) 
+       #DECL ((LX1 LX2) <LIST [REST XREF-INFO]>)
+       <MAPF ,LIST
+             <FCN (XF1) <COND (<MEMQ .XF1 .LX2> <MAPRET .XF1>) (<MAPRET>)>>
+             .LX1>>
+
+<DEFINE SET-AC-STATE (SSTATE) 
+       #DECL ((SSTATE) AC-STATE)
+       <FLUSH-VAR-TEMP-DECLS>
+       <SETG VARIABLE-CACHE <REST ,VARIABLE-CACHE <LENGTH ,VARIABLE-CACHE>>>
+       <MAPF <>
+             <FUNCTION (AC "AUX" (VARS <AC-VARS .AC>)) 
+                     <USE-AC .AC>
+                     <PUT .AC ,AC-VARS <REST .VARS <LENGTH .VARS>>>>
+             ,ALL-ACS>
+       <MAPF <>
+             <FCN (LV "AUX" (VAR <LINKVAR-VAR .LV>) DCL)
+                  <CACHE-VAR .VAR .LV>
+                  <AND <SET DCL <LINKVAR-DECL .LV>>
+                       <INDICATE-VAR-TEMP-DECL .VAR .DCL>>>
+             .SSTATE>
+       <MAPF <>
+             <FCN (FLKV "AUX" VAC (LKV <FIND-CACHE-VAR <LINKVAR-VAR .FLKV>>))
+                  <AND <SET VAC <LINKVAR-VALUE-AC .LKV>>
+                       <PLACE-LV-IN-AC .VAC .LKV>>
+                  <AND <SET VAC <LINKVAR-TYPE-AC .LKV>>
+                       <PLACE-LV-IN-AC .VAC .LKV>>
+                  <AND <SET VAC <LINKVAR-COUNT-AC .LKV>>
+                       <PLACE-LV-IN-AC .VAC .LKV>>
+                  <AND <SET VAC <LINKVAR-TYPE-WORD-AC .LKV>>
+                       <PLACE-LV-IN-AC .VAC .LKV>>>
+             .SSTATE>
+       T>
+
+<DEFINE PROCESS-LABEL-MERGE (LABEL UCB? PATCH
+                            "AUX" SSTATE NSSTATE (PRE-STATE <>))
+       #DECL ((LABEL) LABEL-REF (UCB?) BOOLEAN (PATCH) FIX)
+       <COND (<NOT .UCB?> <SET PRE-STATE <SAVE-STATE>>)>
+       <SET SSTATE <COMPUTE-MERGE-STATE .PRE-STATE .LABEL>>
+       <OR .UCB? <ADJUST-PRE-LABEL .PRE-STATE .SSTATE .PATCH>>
+       <MAPF <>
+             <FCN (XREF)
+                  <COND (<SET NSSTATE <XREF-INFO-SAVED-AC-INFO .XREF>>
+                         <ADJUST-JUMP .XREF .NSSTATE .SSTATE>)>>
+             <LABEL-REF-XREFS .LABEL>>
+       <SET SSTATE <COMPUTE-MERGE-STATE .PRE-STATE .LABEL>>
+       <COND (.SSTATE <SET-AC-STATE .SSTATE>)
+             (<MAPF <> ,CLEAR-VARS-FROM-AC ,ALL-ACS>)>
+       <CLEAN-UP-LABEL .LABEL>>
+
+<DEFINE CLEAN-UP-LABEL (LABEL) 
+       #DECL ((LABEL) LABEL-REF)
+       <MAPF <>
+             <FCN (JUMP)
+                  <PUT .JUMP ,XREF-INFO-SAVED-AC-INFO <>>
+                  <PUT .JUMP ,XREF-INFO-SLSTATE <>>>
+             <LABEL-REF-XREFS .LABEL>>>
+
+<DEFINE COMPUTE-MERGE-STATE (PSSTATE LABEL "AUX" NSSTATE (SSTATE .PSSTATE)) 
+       #DECL ((PSSTATE) <OR FALSE AC-STATE> (LABEL) LABEL-REF)
+       <MAPF <>
+             <FCN (XREF)
+                  <COND (<SET NSSTATE <XREF-INFO-SAVED-AC-INFO .XREF>>
+                         <COND (<NOT .PSSTATE>
+                                <SET PSSTATE .NSSTATE>
+                                <SET SSTATE .PSSTATE>)
+                               (ELSE
+                                <SET SSTATE
+                                     <PAIR-MERGE-STATE .PSSTATE .NSSTATE>>
+                                <SET PSSTATE .SSTATE>)>)>>
+             <LABEL-REF-XREFS .LABEL>>
+       .SSTATE>
+
+<DEFINE ADJUST-JUMP (XREF JSSTATE LSSTATE "AUX" SVEC) 
+       #DECL ((XREF) XREF-INFO (JSSTATE LSSTATE) AC-STATE)
+       <SET-AC-LOAD-STATE <XREF-INFO-SLSTATE .XREF>>
+       <SET SVEC <GEN-INSERT .JSSTATE .LSSTATE .XREF>>
+       <SET SVEC
+            <PRE-INSERT .SVEC
+                        <XREF-INFO-STATUS .XREF>
+                        <XREF-INFO-LILEN .XREF>
+                        <XREF-INFO-CP .XREF>>>
+       <PUT .XREF ,XREF-INFO-STACK-SAVE-CODE .SVEC>>
+
+<DEFINE PRE-INSERT (CDV STATUS? LILEN CP "AUX" INS1 (INS2 <>) RES) 
+       #DECL ((CDV) CODEVEC (STATUS?) ANY (LILEN CP) FIX)
+       <COND (<OR <==? .STATUS? UNCONDITIONAL-BRANCH> <EMPTY? .CDV>> .CDV)
+             (ELSE
+              <SET INS1 <NTH-CODE <- .CP .LILEN>>>
+              <COND (<G=? .LILEN 2>
+                     <SET INS2
+                          <REPEAT ((L ()) (NLILEN 0)) #DECL ((L) LIST)
+                                  <COND (<G=? <SET NLILEN <+ .NLILEN 1>>
+                                              .LILEN> 
+                                         <RETURN .L>)>
+                                  <SET L (<NTH-CODE <- .CP .NLILEN>> !.L)>
+                                  <PUT-CODE <- .CP .NLILEN> ,INST-NULLF>>>)>
+              <COND (<TYPE? .STATUS? AC>
+                     <SET RES <RE-GEN .CDV .STATUS? .INS1 .INS2>>)
+                    (<==? .LILEN 1> <SET RES <UVECTOR !.CDV .INS1>>)
+                    (<SET RES <UVECTOR !.CDV .INS1 !.INS2>>)>
+              <PUT-CODE <- .CP .LILEN> ,INST-NULLF>
+              .RES)>>
+
+<DEFINE RE-GEN (CDV AC INS1 INS2) 
+       #DECL ((INS1) FIX (INS2) <OR FALSE <LIST [REST FIX]>>
+              (CDV) CODEVEC (AC) AC)
+       <SETG RE-GEN-POST ()>
+       <SETG RE-GEN-PRE ()>
+       <INT-RE-GEN .CDV .AC <>>
+       <COND (.INS2 <UVECTOR !,RE-GEN-PRE .INS1 !.INS2 !,RE-GEN-POST>)
+             (<UVECTOR !,RE-GEN-PRE .INS1 !,RE-GEN-POST>)>>
+
+
+<DEFINE GET-I-FIELD (X) <CHTYPE <LSH .X -24> FIX>>
+
+<DEFINE GET-S-FIELD (X "AUX" (OP1 <CHTYPE <ANDB <LSH .X -16> *377*> FIX>))
+       <COND (<==? <CHTYPE <ANDB .OP1 *360*> FIX> ,AM-REG>
+              <CHTYPE <ANDB .OP1 *17*> FIX>)
+             (ELSE -1)>>
+
+<DEFINE INT-RE-GEN (CDV AC PSAVE) 
+       #DECL ((AC) AC (CDV) CODEVEC (PSAVE) <OR FALSE PTN-SAVE>)
+       <REPEAT (IFLD IREG INST)
+               <COND (<EMPTY? .CDV> <RETURN>)>
+               <SET IFLD <GET-I-FIELD <SET INST <1 .CDV>>>>
+               <SET IREG <GET-S-FIELD .INST>>
+               <COND (<==? .IFLD ,INST-PSTORE>
+                      <SET PSAVE <GET-PTNS <CHTYPE <ANDB .INST
+                                                         *377777*> FIX>>>
+                      <PSTORE-RE-GEN <PTNS-CODE .PSAVE> .AC .PSAVE .INST>
+                      <SET CDV <REST .CDV>>)
+                     (<AND <OR <==? .IFLD ,INST-MOVW>
+                               <==? .IFLD ,INST-MOVL>
+                               <==? .IFLD ,INST-MOVB>>
+                           <==? .IREG <AC-NUMBER .AC>>>
+                      <GROUP-INST POST .PSAVE .INST (<2 .CDV>)>
+                      <SET CDV <REST .CDV 2>>)
+                     (ELSE
+                      <COND (<OR <==? .IFLD ,INST-MOVB>
+                                 <==? .IFLD ,INST-MOVW>
+                                 <==? .IFLD ,INST-MOVL>>
+                             <GROUP-INST PRE .PSAVE .INST (<2 .CDV>)>
+                             <SET CDV <REST .CDV 2>>)
+                            (ELSE
+                             <GROUP-INST PRE .PSAVE .INST <>>
+                             <SET CDV <REST .CDV>>)>)>>>
+
+<DEFINE PSTORE-RE-GEN (CDV AC PSAVE INST) 
+       #DECL ((AC) AC (CDV) CODEVEC (PSAVE) <OR FALSE PTN-SAVE> (INST) FIX)
+       <COND (<==? <TEST-PRE-POST .CDV .AC> ALL-PRE>
+              <GROUP-INST PRE <> .INST <>>)
+             (<==? <TEST-PRE-POST .CDV .AC> ALL-POST>
+              <GROUP-INST POST <> .INST <>>)
+             (<INT-RE-GEN .CDV .AC .PSAVE>)>>
+
+<DEFINE TEST-PRE-POST (CDV AC "AUX" (MODE <>)) 
+       #DECL ((AC) AC (CDV) CODEVEC)
+       <REPEAT (IFLD IREG IMOD INST)
+               <COND (<EMPTY? .CDV> <RETURN .MODE>)>
+               <SET IFLD <GET-I-FIELD <SET INST <1 .CDV>>>>
+               <SET IREG <GET-S-FIELD .INST>>
+               <COND (<AND <OR <==? .IFLD ,INST-MOVW> <==? .IFLD ,INST-MOVL>>
+                           <==? .IREG <AC-NUMBER .AC>>>
+                      <COND (<N==? .MODE ALL-PRE> <SET MODE ALL-POST>)
+                            (<RETURN MIXED>)>
+                      <SET CDV <REST .CDV 2>>)
+                     (ELSE
+                      <COND (<==? .MODE ALL-POST> <RETURN MIXED>)
+                            (<SET MODE ALL-PRE>)>
+                      <COND (<OR <==? .IFLD ,INST-MOVB>
+                                 <==? .IFLD ,INST-MOVW>
+                                 <==? .IFLD ,INST-MOVL>>
+                             <SET CDV <REST .CDV 2>>)
+                            (<SET CDV <REST .CDV>>)>)>>>
+
+<DEFINE GROUP-INST (MODE PSAVE INST1 INST2 "AUX" ADD NPSAVE) 
+       #DECL ((MODE) ATOM (PSAVE) <OR FALSE PTN-SAVE> (INST1) FIX
+              (INST2) <OR FALSE LIST>)
+       <COND (.PSAVE
+              <COND (.INST2 <SET ADD <UVECTOR .INST1 !.INST2>>)
+                    (<SET ADD <UVECTOR .INST1>>)>
+              <SET NPSAVE <COPY-PSAVE .PSAVE .ADD>>
+              <COND (<==? .MODE PRE> <SETG RE-GEN-PRE (.NPSAVE !,RE-GEN-PRE)>)
+                    (<SETG RE-GEN-POST (.NPSAVE !,RE-GEN-POST)>)>)
+             (ELSE
+              <COND (<==? .MODE PRE>
+                     <COND (.INST2
+                            <SETG RE-GEN-PRE (.INST1 !.INST2 !,RE-GEN-PRE)>)
+                           (<SETG RE-GEN-PRE (.INST1 !,RE-GEN-PRE)>)>)
+                    (<COND (.INST2
+                            <SETG RE-GEN-POST (.INST1 !.INST2 !,RE-GEN-POST)>)
+                           (<SETG RE-GEN-POST (.INST1 !,RE-GEN-POST)>)>)>)>>
+
+<DEFINE GEN-INSERT (JSSTATE LSSTATE "OPTIONAL" (XREF <>)) 
+       #DECL ((JSSTATE LSSTATE) AC-STATE)
+       <START-CODE-INSERT>
+       <MAPF <>
+             <FCN (JLV "AUX" LLV (VAR <LINKVAR-VAR .JLV>))
+                  <COND (<SET LLV <FIND-CACHE-VAR .VAR .LSSTATE>>
+                         <CHECK-VALUE-STORED .JLV .LLV .XREF>
+                         <CHECK-TYPE-STORED .JLV .LLV .XREF>
+                         <CHECK-COUNT-STORED .JLV .LLV .XREF>)
+                        (ELSE <ISTORE-VAR .JLV .XREF>)>>
+             .JSSTATE>
+       <END-CODE-INSERT>>
+
+<DEFINE ADJUST-PRE-LABEL (JSSTATE LSSTATE PATCH "AUX" SVEC) 
+       #DECL ((JSSTATE LSSTATE) AC-STATE (PATCH) FIX)
+       <SET SVEC <GEN-INSERT .JSSTATE .LSSTATE>>
+       <INSERT-PATCH .PATCH .SVEC>>
+
+<DEFINE CHECK-VALUE-STORED (JLV LLV XREF
+                           "AUX" DADDR VAC (VAR <LINKVAR-VAR .JLV>) SVEC)
+       #DECL ((JLV LLV) LINKVAR (XREF) <OR FALSE XREF-INFO>)
+       <COND (<AND <LINKVAR-VALUE-AC .JLV>
+                   <NOT <LINKVAR-VALUE-AC .LLV>>
+                   <NOT <LINKVAR-VALUE-STORED .JLV>>>
+              <START-CODE-INSERT>
+              <COND (<NOT <SET VAC <LINKVAR-VALUE-AC .JLV>>>
+                     <ERROR "VARIABLE NOT IN AC" CHECK-VALUE-STORED>)>
+              <SET DADDR <ADDR-VAR-VALUE .VAR>>
+              <EMIT-STORE-AC .VAC .DADDR LONG>
+              <PUT .JLV ,LINKVAR-VALUE-STORED T>
+              <SET SVEC <END-CODE-INSERT>>
+              <EMIT-POTENTIAL-STORE .SVEC VALUE .JLV>
+              <AND .XREF <KILL-STORES .XREF VALUE .VAR>>)>>
+
+<DEFINE KILL-STORES (XREF KIND VAR) 
+       #DECL ((XREF) XREF-INFO (KIND) ATOM (VAR) VARTBL)
+       <MAPF <>
+             <FCN (PSAVE)
+                  <COND (<AND <==? <PTNS-VAR .PSAVE> .VAR>
+                              <STRONGER-SAVE? .KIND <PTNS-KIND .PSAVE>>>
+                         <KILL-PSAVE .PSAVE>)>>
+             <XREF-INFO-PSAVES .XREF>>>
+
+<DEFINE STRONGER-SAVE? (KIND1 KIND2) 
+       #DECL ((KIND1 KIND2) ATOM)
+       <OR <==? .KIND1 .KIND2>
+           <==? .KIND1 TYPE-COUNT-VALUE>
+           <AND <==? .KIND1 TYPE-COUNT>
+                <OR <==? .KIND2 TYPE> <==? .KIND2 COUNT>>>
+           <AND <==? .KIND1 TYPE-VALUE>
+                <OR <==? .KIND2 TYPE> <==? .KIND2 VALUE>>>
+           <AND <==? .KIND1 COUNT-VALUE>
+                <OR <==? .KIND2 COUNT> <==? .KIND2 VALUE>>>>>
+
+<DEFINE CHECK-TYPE-STORED (JLV LLV XREF
+                          "AUX" DADDR TAC DCL (VAR <LINKVAR-VAR .JLV>) SVEC
+                                (KIND TYPE))
+       #DECL ((JLV LLV) LINKVAR (XREF) <OR FALSE XREF-INFO>)
+       <COND (<AND <NOT <LINKVAR-TYPE-STORED .JLV>>
+                   <NOT <LINKVAR-DECL .LLV>>
+                   <NOT <LINKVAR-TYPE-AC .LLV>>
+                   <NOT <LINKVAR-TYPE-WORD-AC .LLV>>>
+              <START-CODE-INSERT>
+              <SET DADDR <ADDR-VAR-TYPE .VAR>>
+              <PUT .JLV ,LINKVAR-TYPE-STORED T>
+              <COND (<SET TAC <LINKVAR-TYPE-WORD-AC .JLV>>
+                     <EMIT-STORE-AC .TAC .DADDR LONG>
+                     <PUT .JLV ,LINKVAR-COUNT-STORED T>
+                     <SET KIND TYPE-COUNT>)
+                    (<SET DCL <LINKVAR-DECL .JLV>>
+                     <STORE-TYPE .DCL .DADDR>
+                     <COND (<NOT <COUNT-NEEDED? .DCL>>
+                            <PUT .JLV ,LINKVAR-COUNT-STORED T>)>)
+                    (<SET TAC <LINKVAR-TYPE-AC .JLV>>
+                     <EMIT-STORE-AC .TAC .DADDR WORD>)
+                    (<ERROR "VARIABLE NOT IN AC" ISTORE-ADDR>)>
+              <SET SVEC <END-CODE-INSERT>>
+              <EMIT-POTENTIAL-STORE .SVEC .KIND .JLV>
+              <AND .XREF <KILL-STORES .XREF .KIND .VAR>>)>>
+
+<DEFINE CHECK-COUNT-STORED (JLV LLV XREF
+                           "AUX" DADDR TAC DCL SVEC (KIND COUNT)
+                                 (VAR <LINKVAR-VAR .JLV>))
+       #DECL ((JLV LLV) LINKVAR (XREF) <OR FALSE XREF-INFO>)
+       <COND (<AND <NOT <LINKVAR-COUNT-AC .LLV>>
+                   <NOT <LINKVAR-TYPE-WORD-AC .LLV>>
+                   <NOT <LINKVAR-COUNT-STORED .JLV>>
+                   <OR <NOT <SET DCL <LINKVAR-DECL .LLV>>>
+                       <COUNT-NEEDED? .DCL>>
+                   <OR <NOT <SET DCL <LINKVAR-DECL .JLV>>>
+                       <COUNT-NEEDED? .DCL>>>
+              <START-CODE-INSERT>
+              <SET DADDR <ADDR-VAR-COUNT <LINKVAR-VAR .JLV>>>
+              <PUT .JLV ,LINKVAR-COUNT-STORED T>
+              <COND (<SET TAC <LINKVAR-TYPE-WORD-AC .JLV>>
+                     <SET DADDR <ADDR-VAR-TYPE <LINKVAR-VAR .JLV>>>
+                     <EMIT-STORE-AC .TAC .DADDR LONG>
+                     <PUT .JLV ,LINKVAR-TYPE-STORED T>
+                     <SET KIND TYPE-COUNT>)
+                    (<SET TAC <LINKVAR-COUNT-AC .JLV>>
+                     <EMIT-STORE-AC .TAC .DADDR WORD>)>
+              <SET SVEC <END-CODE-INSERT>>
+              <EMIT-POTENTIAL-STORE .SVEC .KIND .JLV>
+              <AND .XREF <KILL-STORES .XREF .KIND .VAR>>)>>
+
+<DEFINE SETUP-PSAVES (XREF "AUX" (CACHE ,VARIABLE-CACHE)) 
+       #DECL ((XREF) XREF-INFO)
+       <MAPF <>
+             <FCN (LVAR "AUX" (PSAVES <LINKVAR-POTENTIAL-SAVES .LVAR>))
+                  <PUT .LVAR ,LINKVAR-POTENTIAL-SAVES (.XREF !.PSAVES)>>
+             .CACHE>>
+
+<DEFINE LOOP-GEN ("TUPLE" VARS) 
+       #DECL ((VARS) <TUPLE [REST <OR ATOM LIST>]>)
+       <CLEAR-STATUS>
+       <MAPR <>
+             <FCN (MVARS "AUX" (VARLST <1 .MVARS>))
+                  <COND (<TYPE? .VARLST ATOM>
+                         <PUT .MVARS 1 <LIST <FIND-VAR .VARLST> VALUE>>)
+                        (<PUT .MVARS
+                              1
+                              (<FIND-VAR <1 .VARLST>> !<REST .VARLST>)>)>>
+             .VARS>
+       <SETUP-LOOP-ACS .VARS>
+       <SETG LOOP-VARS <SAVE-STATE>>
+       <CLEAR-STATUS>
+       LOOP-LABEL>
+
+<DEFINE SETUP-LOOP-ACS (VARS "AUX" TAC) 
+   #DECL ((VARS) <TUPLE [REST LIST]>)
+   <MAPF <>
+        <FCN (LVAR "AUX" (VAR <LINKVAR-VAR .LVAR>))
+             <COND (<NOT <FIND-INFO .VAR .VARS>>
+                    <ISTORE-VAR .LVAR>
+                    <DEAD-VAR .VAR>)>>
+        ,VARIABLE-CACHE>
+   <MAPF <>
+        <FCN (LVAR "AUX" (VAR <LINKVAR-VAR .LVAR>) RVAR NLVAR
+                         (CS <LINKVAR-COUNT-STORED .LVAR>)
+                         (VS <LINKVAR-VALUE-STORED .LVAR>)
+                         (TS <LINKVAR-TYPE-STORED .LVAR>))
+             <SET RVAR <FIND-INFO .VAR .VARS>>
+             <SET NLVAR <COPY-LINKVAR .LVAR>>
+             <AND <MEMQ TYPE .RVAR> <SET TS T>>
+             <AND <MEMQ VALUE .RVAR> <SET VS T>>
+             <COND (<MEMQ LENGTH .RVAR>
+                    <SET CS T>
+                    <SET TS T>)>
+             ; "Make sure that if we're storing the type we also store
+                the value, so  we don't get garbage pointers on the stack."
+             <COND (<OR <NOT .VS><NOT .TS><NOT .CS>>
+                    <ISTORE-VAR .NLVAR>)
+                   (<LINKVAR-COUNT-STORED .NLVAR .CS>
+                    <LINKVAR-TYPE-STORED .NLVAR .TS>
+                    <LINKVAR-VALUE-STORED .NLVAR .VS>)>
+             <COND (<AND <SET TAC <LINKVAR-TYPE-AC .NLVAR>>
+                         <NOT <MEMQ TYPE .RVAR>>>
+                    <AND <LINKVAR-TYPE-AC .LVAR> <BREAK-LINK .TAC .VAR>>
+                    <PUT .LVAR ,LINKVAR-TYPE-STORED T>)>
+             <COND (<AND <SET TAC <LINKVAR-COUNT-AC .NLVAR>>
+                         <NOT <MEMQ LENGTH .RVAR>>>
+                    <PUT .LVAR ,LINKVAR-COUNT-STORED T>
+                    <AND <LINKVAR-COUNT-AC .LVAR> <BREAK-LINK .TAC .VAR>>)>
+             <COND (<AND <SET TAC <LINKVAR-TYPE-WORD-AC .NLVAR>>
+                         <NOT <MEMQ TYPE .RVAR>>
+                         <NOT <MEMQ LENGTH .RVAR>>>
+                    <AND <LINKVAR-TYPE-WORD-AC .LVAR> <BREAK-LINK .TAC .VAR>>
+                    <PUT .LVAR ,LINKVAR-TYPE-STORED T>
+                    <PUT .LVAR ,LINKVAR-COUNT-STORED T>)>>
+        ,VARIABLE-CACHE>
+   <MAPF <>
+    <FCN (RVAR "AUX" VAC (VAR <1 .RVAR>) LVAR)
+        <COND (<VARTBL-ASSIGNED? .VAR>
+               <COND (<SET LVAR <FIND-CACHE-VAR .VAR>>
+                      <AND <SET VAC <LINKVAR-TYPE-AC .LVAR>> <PROTECT .VAC>>
+                      <AND <SET VAC <LINKVAR-COUNT-AC .LVAR>> <PROTECT .VAC>>
+                      <AND <SET VAC <LINKVAR-TYPE-WORD-AC .LVAR>>
+                           <PROTECT .VAC>>)>
+               <AND <MEMQ VALUE .RVAR> <PROTECT <LOAD-VAR-APP .VAR <>>>>
+               <COND (<AND <MEMQ TYPE .RVAR> <MEMQ LENGTH .RVAR>>
+                      <PROTECT <LOAD-VAR .VAR TYPE-WORD <> PREF-TYPE>>)
+                     (<MEMQ TYPE .RVAR>
+                      <PROTECT <LOAD-VAR .VAR TYPE <> PREF-TYPE>>)
+                     (<MEMQ LENGTH .RVAR>
+                      <PROTECT <LOAD-VAR .VAR TYPE-WORD <> PREF-TYPE>>)>
+               <SET LVAR <FIND-CACHE-VAR .VAR>>
+               <LINKVAR-POTENTIAL-SAVES .LVAR ()>
+               <AND <MEMQ TYPE .RVAR> <PUT .LVAR ,LINKVAR-TYPE-STORED <>>>
+               <AND <MEMQ VALUE .RVAR> <PUT .LVAR ,LINKVAR-VALUE-STORED <>>>
+               <AND <MEMQ LENGTH .RVAR>
+                    <PUT .LVAR ,LINKVAR-COUNT-STORED <>>>)>>
+    .VARS>
+   T>
+
+<DEFINE FIND-INFO (VAR VARS) 
+       #DECL ((VAR) VARTBL (VARS) <TUPLE [REST LIST]>)
+       <MAPF <>
+             <FCN (RVAR) <COND (<==? .VAR <1 .RVAR>> <MAPLEAVE .RVAR>)>>
+             .VARS>>
+
+<DEFINE RESTORE-LOOP-STATE (LSTATE) 
+       #DECL ((LSTATE) AC-STATE)
+       <MAPF <>
+             <FCN (LVAR "AUX" (VAR <LINKVAR-VAR .LVAR>) LVAR1)
+                  <COND (<SET LVAR1 <FIND-CACHE-VAR .VAR .LSTATE>>
+                         <PROTECT-MATCHES .LVAR .LVAR1>)
+                        (ELSE <ISTORE-VAR .LVAR <> T> <DEAD-VAR .VAR>)>>
+             <SAVE-STATE>>
+       <MAPF <>
+             <FCN (LVAR "AUX" (VAR <LINKVAR-VAR .LVAR>) VAC)
+                  <AND <SET VAC <LINKVAR-VALUE-AC .LVAR>>
+                       <PROTECT <LP-LOAD-VAR .VAR VALUE <> .VAC>>>
+                  <AND <SET VAC <LINKVAR-TYPE-AC .LVAR>>
+                       <PROTECT <LP-LOAD-VAR .VAR TYPE <> .VAC>>>
+                  <AND <SET VAC <LINKVAR-TYPE-WORD-AC .LVAR>>
+                       <PROTECT <LP-LOAD-VAR .VAR TYPE-WORD <> .VAC>>>
+                  <AND <SET VAC <LINKVAR-COUNT-AC .LVAR>>
+                       <PROTECT <LP-LOAD-VAR .VAR COUNT <> .VAC>>>>
+             .LSTATE>
+       <SET-AC-STATE .LSTATE>>
+
+<DEFINE PROTECT-MATCHES (LVAR1 LVAR2 "AUX" VAC (VAR <LINKVAR-VAR .LVAR1>)) 
+       #DECL ((LVAR1 LVAR2) LINKVAR)
+       <AND <LINKVAR-VALUE-AC .LVAR2> <PUT .LVAR1 ,LINKVAR-VALUE-STORED T>>
+       <AND <LINKVAR-TYPE-AC .LVAR2> <PUT .LVAR1 ,LINKVAR-TYPE-STORED T>>
+       <AND <LINKVAR-COUNT-AC .LVAR2> <PUT .LVAR2 ,LINKVAR-COUNT-STORED T>>
+       <AND <LINKVAR-TYPE-WORD-AC .LVAR2>
+            <PUT .LVAR1 ,LINKVAR-TYPE-STORED T>
+            <PUT .LVAR1 ,LINKVAR-COUNT-STORED T>>
+       <COND (<SET VAC <LINKVAR-TYPE-AC .LVAR1>>
+              <COND (<AND <NOT <LINKVAR-TYPE-AC .LVAR2>>
+                          <NOT <LINKVAR-TYPE-WORD-AC .LVAR2>>>
+                     <ISTORE-VAR .LVAR1 <> T>
+                     <BREAK-LINK .VAC .VAR>)
+                    (<==? .VAC <LINKVAR-TYPE-AC .LVAR2>> <PROTECT .VAC>)>)>
+       <COND (<SET VAC <LINKVAR-VALUE-AC .LVAR1>>
+              <COND (<NOT <LINKVAR-VALUE-AC .LVAR2>>
+                     <ISTORE-VAR .LVAR1 <> T>
+                     <BREAK-LINK .VAC .VAR>)
+                    (<==? .VAC <LINKVAR-VALUE-AC .LVAR2>> <PROTECT .VAC>)>)>
+       <COND (<SET VAC <LINKVAR-TYPE-WORD-AC .LVAR1>>
+              <COND (<AND <NOT <LINKVAR-TYPE-WORD-AC .LVAR2>>
+                          <NOT <LINKVAR-COUNT-AC .LVAR2>>
+                          <NOT <LINKVAR-TYPE-AC .LVAR2>>>
+                     <ISTORE-VAR .LVAR1 <> T>
+                     <BREAK-LINK .VAC .VAR>)
+                    (<==? .VAC <LINKVAR-TYPE-WORD-AC .LVAR2>>
+                      <PROTECT .VAC>)>)>
+       <COND (<SET VAC <LINKVAR-COUNT-AC .LVAR1>>
+              <COND (<AND <NOT <LINKVAR-COUNT-AC .LVAR2>>
+                          <NOT <LINKVAR-TYPE-WORD-AC .LVAR2>>>
+                     <ISTORE-VAR .LVAR1 <> T>
+                     <BREAK-LINK .VAC .VAR>)
+                    (<==? .VAC <LINKVAR-COUNT-AC .LVAR2>>
+                      <PROTECT .VAC>)>)>>
+
+"THE STATUS INFORMATION THAT IS CURRENTLY-GENERATED IS AN ATOM
+ EITHER NORMAL, UNCONDITIONAL-BRANCH, LOOP-LABEL"
+
+<DEFINE GEN-LABEL (LABEL STATUS "AUX" LREF PATCH) 
+       #DECL ((LABEL STATUS) ATOM)
+       <COND (<MEMQ .LABEL ,INT-LABELS>
+              <EMIT-LABEL .LABEL <>>
+              <MAPF <> ,CLEAR-VARS-FROM-AC ,ALL-ACS>)
+             (ELSE
+               <COND (<MEMQ .LABEL ,ICALL-LABELS>
+                      <POP-MODEL>
+                      <SETG ICALL-LEVEL <- ,ICALL-LEVEL 1>>
+                      <MAPF <> ,CLEAR-VARS-FROM-AC ,ALL-ACS>)>
+              <AND <N==? .STATUS UNCONDITIONAL-JUMP>
+                   <SET PATCH <ADD-PATCH LABEL-MERGE>>>
+              <COND (<==? .STATUS LOOP-LABEL>
+                     <SET LREF <EMIT-LABEL .LABEL ,LOOP-VARS>>)
+                    (<SET LREF <EMIT-LABEL .LABEL <>>>)>
+              <COND (<==? .STATUS UNCONDITIONAL-BRANCH>
+                     <PROCESS-LABEL-MERGE .LREF T 0>)
+                    (<PROCESS-LABEL-MERGE .LREF <> .PATCH>)>)>>
+
+<DEFINE GEN-BRANCH (INST LABEL STATUS?
+                   "OPTIONAL" (ACNUM <>) (FLONG? <>) (NO-KILL <>)
+                   "AUX" XREF LREF INSRT (LLEN ,LAST-INST-LENGTH)
+                         (CCOUNT ,CODE-COUNT) LSTATE)
+       #DECL ((INST CC) FIX (LABEL) <OR ATOM SPEC-LABEL>
+              (ACNUM) ANY (STATUS?) ANY (FLONG?) BOOLEAN)
+       <SET XREF <EMIT-BRANCH .INST .LABEL .STATUS? .LLEN .ACNUM .FLONG?>>
+       <COND (<TYPE? .LABEL SPEC-LABEL>)
+             (<AND <SET LREF <XREF-INFO-LABEL .XREF>>
+                   <SET LSTATE <LABEL-REF-LOOP-LABEL .LREF>>>
+              <START-CODE-INSERT>
+              <RESTORE-LOOP-STATE .LSTATE>
+              <SET INSRT <END-CODE-INSERT>>
+              <SET INSRT <PRE-INSERT .INSRT .STATUS? .LLEN .CCOUNT>>
+              <PUT .XREF ,XREF-INFO-STACK-SAVE-CODE .INSRT>)
+             (<NOT <MEMQ .LREF ,OUTST-LABEL-TABLE>>
+              <ERROR "JUMPING BACK TO A NON-LOOP LABEL" .LREF>)
+             (ELSE
+              <COND (<NOT .NO-KILL> <SET-DEATH .CODPTR T>)>
+              <SAVE-XREF-AC-INFO .XREF <SAVE-STATE> <SAVE-LOAD-STATE>>
+              <USE-ALL-ACS>
+              <SETUP-PSAVES .XREF>)>>
+
+<DEFINE LP-LOAD-VAR (VAR TYP MUNG VAC "AUX" TAC LVAR) 
+       #DECL ((VAR) VARTBL (TYP) ATOM (MUNG) BOOLEAN (VAC) AC)
+       <COND (<AND <SET LVAR <FIND-CACHE-VAR .VAR>>
+                   <OR <AND <==? .TYP TYPE>
+                            <==? <LINKVAR-TYPE-AC .LVAR> .VAC>>
+                       <AND <==? .TYP VALUE>
+                            <==? <LINKVAR-VALUE-AC .LVAR> .VAC>>
+                       <AND <==? .TYP COUNT>
+                            <==? <LINKVAR-COUNT-AC .LVAR> .VAC>>
+                       <AND <==? .TYP TYPE-WORD>
+                            <==? <LINKVAR-TYPE-WORD-AC .LVAR> .VAC>>>>)
+             (<NOT <ALL-DEAD? .VAC>>
+              <COND (<SET TAC <FREE-AC?>>
+                     <EMIT-EXCH .VAC .TAC>
+                     <EXCH-AC .TAC .VAC>)>)>
+       <LOAD-VAR .VAR .TYP .MUNG .VAC>>