Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vaxc / recordgen.mud
diff --git a/mim/development/mim/vaxc/recordgen.mud b/mim/development/mim/vaxc/recordgen.mud
new file mode 100644 (file)
index 0000000..d386867
--- /dev/null
@@ -0,0 +1,405 @@
+
+<DEFINE PUTR-GEN (VAR NUM VAL
+                 "OPTIONAL" (HINT <>) (PHINT <>)
+                 "AUX" RD ETYP VAC ACN TCOFF VADDR VVAC ANYCOFF VOFF STACK? A1
+                       LV RHINT)
+   #DECL ((VAR) ANY (NUM) <OR FIX VARTBL> (VAL) ANY)
+   <COND (<NOT <TYPE? .VAR VARTBL>> <SET HINT <TYPE .VAR>>)>
+   <COND (.PHINT <SET PHINT <PARSE-HINT .PHINT TYPE>>)>
+   <COND
+    (<OR <TYPE? .NUM VARTBL> <NOT .HINT>>
+     <CALL-RTE ,IPUTR!-MIMOP CALL <> <> .VAR .NUM .VAL>
+     T)
+    (ELSE
+     <OR <SET RD <GET-RELE-DESCRIPTOR .NUM .HINT>>
+        <ERROR "RECORD TYPE NOT FOUND" .NUM .HINT PUTR-GEN>>
+     ; "This crock causes the actual contents of FR to be saved when
+       bindind UNWIND, so it can be restored by the kernel.  CFRAME
+       saves a pointer to the real frame, which is by no means the
+       same thing when MAKTUP-FLAG is set."
+     <COND (<AND ,MAKTUP-FLAG
+                <==? .NUM 2>
+                <OR <==? .VAL UNWIND>
+                    <==? .VAL T$UNWIND>>
+                <AND .HINT
+                     <SET RHINT <PARSE-HINT .HINT RECORD-TYPE>>
+                     <OR <==? .RHINT LBIND>
+                         <==? .RHINT T$LBIND>>>>
+           <EMIT-PUSH <TYPE-WORD T$FRAME> LONG>
+           <EMIT-PUSH <MA-REG ,AC-F> LONG>)> 
+     <SET STACK? <GET-RSTACK? .HINT>>
+     <PROTECT-VAL .VAL>
+     <COND (<TYPE? .VAR VARTBL> <SET VAC <LOAD-VAR .VAR VALUE <> PREF-VAL>>)
+          (ELSE <SET VAC <GET-AC PREF-VAL T>> <MOVE-VALUE .VAR .VAC>)>
+     <PROTECT .VAC>
+     <SET TCOFF <MA-DISP .VAC <RED-OFFSET-TYPCNT .RD>>>
+     <SET ANYCOFF <MA-DISP .VAC <+ <RED-OFFSET-TYPCNT .RD> 2>>>
+     <SET VOFF <MA-DISP .VAC <RED-OFFSET-VALUE .RD>>>
+     <COND
+      (<==? <SET ETYP <RED-KIND .RD>> ANY>
+       <COND (<OR <FIX-CONSTANT? .VAL>
+                 <AND <TYPE? .VAL VARTBL>
+                      <SET LV <FIND-CACHE-VAR .VAL>>
+                      <NOT <AND <LINKVAR-VALUE-STORED .LV>
+                                <LINKVAR-TYPE-STORED .LV>
+                                <LINKVAR-COUNT-STORED .LV>>>
+                      <NOT <AND <SET A1 <LINKVAR-TYPE-WORD-AC .LV>>
+                                <==? <LINKVAR-VALUE-AC .LV> <NEXT-AC .A1>>>>>>
+             <MOVE-VALUE .VAL .VOFF>
+             <MOVE-TYPE .VAL .TCOFF .ANYCOFF>)
+            (<TYPE? .VAL VARTBL>
+             <EMIT ,INST-MOVQ <VAR-TYPE-ADDRESS .VAL TYPE-WORD> .TCOFF>)
+            (ELSE <EMIT ,INST-MOVQ <ADDR-TYPE-MQUOTE .VAL> .TCOFF>)>)
+      (<OR <==? .ETYP SMALL-INT> <==? .ETYP SMALL-POS-INT>>
+       <COND (<TYPE? .VAL FIX> <EMIT-MOVE <MA-IMM .VAL> .VOFF WORD>)
+            (<TYPE? .VAL VARTBL>
+             <COND (<SET VVAC <VAR-VALUE-IN-AC? .VAL>>
+                    <EMIT-MOVE <MA-REG .VVAC> .VOFF WORD>)
+                   (ELSE
+                    <SET VADDR <MA-DISP ,AC-F <+ <VARTBL-LOC .VAL> 2>>>
+                    <EMIT-MOVE .VADDR .VOFF WORD>)>)
+            (<ERROR "BAD ARGUMENT" PUT-RECORD>)>)
+      (<OR <==? .ETYP TYPE-C> <==? .ETYP VWORD1>>
+       <COND
+       (<RED-SBOOL .RD>
+        <COND (<OR <==? .VAL <>>
+                   <AND <TYPE? .VAL VARTBL> <==? <VARTBL-DECL .VAL> FALSE>>
+                   <==? .PHINT FALSE>>
+               <COND (<==? .ETYP TYPE-C> <EMIT ,INST-MCOMW <MA-IMM 0> .VOFF>)
+                     (ELSE <EMIT ,INST-CLRL .VOFF>)>)
+              (<OR <NOT <TYPE? .VAL VARTBL>> <VARTBL-DECL .VAL> .PHINT>
+               <COND (<==? .ETYP TYPE-C>
+                      <EMIT ,INST-MOVW
+                            <COND (<TYPE? .VAL VARTBL>
+                                   <VAR-VALUE-ADDRESS .VAL>)
+                                  (ELSE <MA-IMM .VAL>)>
+                            .VOFF>)
+                     (ELSE <MOVE-VALUE .VAL .VOFF>)>)
+              (<TYPE? .VAL VARTBL>
+               <TESTSET .VAL .VOFF <> <==? .ETYP TYPE-C>>)>)
+       (ELSE <MOVE-VALUE .VAL .VOFF>)>)
+      (<==? .ETYP COUNTVWORD>
+       <COND (<AND <RED-SBOOL .RD>
+                  <OR <==? .VAL <>>
+                      <==? <VARTBL-DECL .VAR> FALSE>
+                      <==? .PHINT FALSE>>>
+             <EMIT ,INST-CLRL .VOFF>
+             <EMIT ,INST-CLRW .TCOFF>)
+            (<TYPE? .VAL VARTBL>
+             <COND (<OR <NOT <RED-SBOOL .RD>> .PHINT <VARTBL-DECL .VAL>>
+                    <MOVE-VALUE .VAL .VOFF>
+                    <COUNT-STORE-REC .VAL .TCOFF>)
+                   (ELSE <TESTSET .VAL .VOFF .TCOFF>)>)
+            (ELSE
+             <MOVE-VALUE .VAL .VOFF>
+             <EMIT-MOVE <MA-IMM <LENGTH .VAL>> .TCOFF WORD>)>)
+      (<==? .ETYP BYTE>
+       <COND (<TYPE? .VAL FIX> <EMIT-MOVE <MA-IMM .VAL> .VOFF BYTE>)
+            (ELSE <EMIT-MOVE <VAR-VALUE-ADDRESS .VAL> .VOFF BYTE>)>)
+      (<==? .ETYP BOOLEAN> <TEST-BOOL .VOFF <RED-BIT-NUMBER .RD> .VAL>)>
+     <CLEAR-STATUS>)>
+   NORMAL>
+
+<DEFINE TESTSET (VAR VADDR TCADDR "OPT" (HW <>) "AUX" ELAB FLAB) 
+       #DECL ((VAR) VARTBL (VADDR) EFF-ADDR (TCADDR) <OR FIX FALSE EFF-ADDR>)
+       <SET FLAB <MAKE-LABEL>>
+       <TYPE-TST-GEN .VAR FALSE - .FLAB>
+       <EMIT <COND (.HW ,INST-CLRW) (ELSE ,INST-CLRL)> .VADDR>
+       <AND <TYPE? .TCADDR EFF-ADDR> <EMIT ,INST-CLRW .TCADDR>>
+       <SET ELAB <MAKE-LABEL>>
+       <GEN-BRANCH ,INST-BRB .ELAB <>>
+       <EMIT-LABEL .FLAB <>>
+       <EMIT-MOVE <VAR-VALUE-ADDRESS .VAR> .VADDR
+                  <COND (.HW WORD) (ELSE LONG)>>
+       <COND (<TYPE? .TCADDR EFF-ADDR>
+              <COUNT-STORE-REC .VAR .TCADDR>)>
+       <EMIT-LABEL .ELAB <>>>
+
+<DEFINE TEST-BOOL (VCADDR BITNO VAL "AUX" FLAB ELAB) 
+       #DECL ((VCADDR) EFF-ADDR (BITNO) FIX (VAL) VARTBL)
+       <SET FLAB <MAKE-LABEL>>
+       <TYPE-TST-GEN .VAL FALSE - .FLAB>
+       <EMIT ,INST-BICL2 .VCADDR <MA-IMM <CHTYPE <LSH 1 .BITNO> FIX>>>
+       <SET ELAB <MAKE-LABEL>>
+       <GEN-BRANCH ,INST-BRB .ELAB <>>
+       <EMIT ,INST-BISL .VCADDR <MA-IMM <CHTYPE <LSH 1 .BITNO> FIX>>>
+       <EMIT-LABEL .ELAB <>>>
+
+<DEFINE NTH-RECORD-GEN (VAR OFF RES
+                       "OPTIONAL" (HINT1 <>) (HINT2 <>)
+                       "AUX" RD (BRANCH? <>) VAC ACN TCOFF ANYCOFF VOFF TYP
+                             NTYP DAC ETYP STACK? AC-LOADED)
+   #DECL ((VAR) ANY (OFF) <OR VARTBL FIX> (HINT2) <OR FALSE HINT>
+         (RES) <OR ATOM VARTBL>)
+   <COND (<NOT <TYPE? .VAR VARTBL>> <SET HINT1 <TYPE .VAR>>)>
+   <COND (<OR <NOT .HINT1> <TYPE? .OFF VARTBL>>
+         <CALL-RTE ,INTHR!-MIMOP CALL .RES <> .VAR .OFF>)
+        (ELSE
+         <OR <SET RD <GET-RELE-DESCRIPTOR .OFF .HINT1>>
+             <ERROR "RECORD TYPE NOT FOUND" .HINT1 .OFF NTH-RECORD-GEN>>
+         <SET STACK? <GET-RSTACK? .HINT1>>
+         <SET TYP <RED-OBJTYP .RD>>
+         <SET NTYP <AND .HINT2 <PARSE-HINT .HINT2 TYPE>>>
+         <COND (<N==? .RES STACK> <SET BRANCH? <GET-RELE-BRANCH? .HINT2>>)>
+         <COND (<TYPE? .VAR VARTBL>
+                <SET VAC <LOAD-VAR .VAR VALUE <> PREF-VAL>>)
+               (ELSE <SET VAC <GET-AC VALUE T>> <MOVE-VALUE .VAR .VAC>)>
+         <PROTECT .VAC>
+         <SET TCOFF <MA-DISP .VAC <RED-OFFSET-TYPCNT .RD>>>
+         <SET ANYCOFF <MA-DISP .VAC <+ <RED-OFFSET-TYPCNT .RD> 2>>>
+         <SET VOFF <MA-DISP .VAC <RED-OFFSET-VALUE .RD>>>
+         <COND (<==? .VAR .RES>
+                <DEAD-VAR .VAR>)>
+         <COND (<==? <SET ETYP <RED-KIND .RD>> ANY>
+                <RANY-OFF .RES .TCOFF .VOFF .VAC>)
+               (<AND <OR <==? .ETYP VWORD1> <==? .ETYP COUNTVWORD>> .BRANCH?>
+                <SET AC-LOADED <BRANCH-VALUE .VOFF .BRANCH? <RED-LENGTH .RD>>>
+                <GEN-NTH .VOFF
+                         .TYP
+                         .VAC
+                         .RES
+                         <RED-LENGTH .RD>
+                         <>
+                         <COND (<RED-LENGTH .RD> .AC-LOADED)>
+                         <COND (<RED-LENGTH .RD> <NEXT-AC .AC-LOADED>)
+                               (ELSE .AC-LOADED)>>)
+               (<AND <==? .ETYP TYPE-C> .BRANCH?>
+                <SET AC-LOADED <BRANCH-HW .VOFF .BRANCH?>>
+                <GEN-NTH .VOFF
+                         .TYP
+                         .VAC
+                         .RES
+                         <RED-LENGTH .RD>
+                         T
+                         <>
+                         .AC-LOADED>)
+               (<OR <==? .ETYP VWORD1> <==? .ETYP TYPE-C>>
+                <COND (<RED-SBOOL .RD>
+                       <TEST-NTH .VOFF
+                                 .TYP
+                                 .VAC
+                                 .RES
+                                 <RED-LENGTH .RD>
+                                 .NTYP
+                                 <==? .ETYP TYPE-C>>)
+                      (<GEN-NTH .VOFF
+                                .TYP
+                                .VAC
+                                .RES
+                                <RED-LENGTH .RD>
+                                <==? .ETYP TYPE-C>>)>)
+               (<==? .ETYP COUNTVWORD>
+                <COND (<RED-SBOOL .RD>
+                       <TEST-NTH .VOFF .TYP .VAC .RES .TCOFF .NTYP>)
+                      (<GEN-NTH .VOFF .TYP .VAC .RES .TCOFF>)>)
+               (<==? .ETYP SMALL-FR-OFFSET>
+                <PROTECT <SET DAC <GET-AC PREF-VAL T>>>
+                <EMIT ,INST-CVTWL .VOFF <MA-REG .DAC>>
+                <EMIT ,INST-ADDL2 <MA-REG .VAC> <MA-REG .DAC>>
+                <DEST-DECL .DAC .RES T$LBIND>)
+               (<OR <==? .ETYP SMALL-INT> <==? .ETYP SMALL-POS-INT>>
+                <PROTECT <SET DAC <GET-AC PREF-VAL T>>>
+                <COND (<==? .ETYP SMALL-INT>
+                       <EMIT ,INST-CVTWL .VOFF <MA-REG .DAC>>)
+                      (ELSE <EMIT ,INST-MOVZWL .VOFF <MA-REG .DAC>>)>
+                <DEST-DECL .DAC .RES FIX>)
+               (<==? .ETYP BYTE>
+                <PROTECT <SET DAC <GET-AC PREF-VAL T>>>
+                <EMIT ,INST-MOVZBL .VOFF <MA-REG .DAC>>
+                <DEST-DECL .DAC .RES FIX>)
+               (<==? .ETYP BOOLEAN>
+                <COND (.BRANCH?
+                       <BOOL-NTH-BRANCH .VOFF <RED-BIT-NUMBER .RD> .BRANCH?>)
+                      (<BOOL-NTH .VOFF <RED-BIT-NUMBER .RD> .RES>)>)>)>
+   NORMAL>
+
+<DEFINE BRANCH-VALUE (VADDR BRANCH? TWO? "AUX" AC) 
+       #DECL ((VADDR) EFF-ADDR (BRANCH?) <LIST ATOM ATOM>)
+       <SET AC <GET-AC <COND (.TWO? DOUBLE)(ELSE PREF-VAL)> T>>
+       <EMIT ,INST-MOVL .VADDR
+             <MA-REG <COND (.TWO? <NEXT-AC .AC>)(ELSE .AC)>>>
+       <COND (<==? <1 .BRANCH?> ->
+              <GEN-BRANCH ,INST-BNEQ <2 .BRANCH?> <>>)
+             (ELSE
+              <GEN-BRANCH ,INST-BEQL <2 .BRANCH?> <>>)>
+       .AC>
+
+<DEFINE BRANCH-HW (VADDR BRANCH? "AUX" (AC <GET-AC PREF-VAL T>)) 
+       #DECL ((VADDR) EFF-ADDR (BRANCH?) <LIST ATOM ATOM>)
+       <EMIT ,INST-CVTWL .VADDR <MA-REG .AC>>
+       <COND (<==? <1 .BRANCH?> ->
+              <GEN-BRANCH ,INST-BGEQ <2 .BRANCH?> <>>)
+             (ELSE
+              <GEN-BRANCH ,INST-BLSS <2 .BRANCH?> <>>)>
+       .AC>
+
+<DEFINE RANY-OFF (RES TCOFF VOFF VAC "AUX" TAC) 
+       #DECL ((RES) <OR ATOM VARTBL> (TCADDR VADDR) EFF-ADDR (VAC) AC)
+       <COND (<==? .RES STACK> <EMIT-PUSH .TCOFF DOUBLE>)
+             (ELSE
+              <COND (<AND <N==? .VAC ,AC-0>
+                          <NOT <AC-PROT <SET TAC <PREV-AC .VAC>>>>
+                          <OR <ALL-DEAD? .TAC> <ALL-STORED? .TAC>>>
+                     <MUNG-AC .VAC>
+                     <GET-AC .TAC T>
+                     <EMIT ,INST-MOVQ .TCOFF <MA-REG .TAC>>)
+                    (ELSE
+                     <PROTECT <SET TAC <GET-AC DOUBLE T>>>
+                     <EMIT ,INST-MOVQ .TCOFF <MA-REG .TAC>>
+                     <SET VAC <NEXT-AC .TAC>>)>
+              <DEST-PAIR .VAC .TAC .RES>)>>
+
+<DEFINE TEST-NTH (VADDR TYP VAC RES CADDR HTYP
+                 "OPT" (HW <>)
+                 "AUX" FLAB ELAB RVAC RTAC VPUSH (TYPV <>))
+   #DECL ((VADDR) EFF-ADDR (TYP) ATOM (VAC) AC (RES) <OR ATOM VARTBL>
+         (CADDR) <OR EFF-ADDR FALSE FIX> (HTYP) <OR FALSE ATOM>)
+   <COND (<AND .TYP <SET TYPV <MEMQ .TYP ,TYPE-WORDS>>> <SET TYPV <2 .TYPV>>)>
+   <COND (<TYPE? .RES VARTBL>
+         <COND (<OR <NOT .HTYP> .CADDR>
+                <SET RTAC <GET-AC DOUBLE T>>
+                <SET RVAC <NEXT-AC .RTAC>>
+                <PROTECT .RTAC>)
+               (ELSE <SET RVAC <FIND-APP-AC .VAC .TYP>>)>
+         <PROTECT .RVAC>)>
+   <SET ELAB <MAKE-LABEL>>
+   <SET FLAB <MAKE-LABEL>>
+   <COND (<NOT .HTYP>
+         <EMIT <COND (.HW ,INST-TSTW) (ELSE ,INST-TSTL)> .VADDR>
+         <GEN-BRANCH <COND (.HW ,INST-BGEQ) (ELSE ,INST-BNEQ)> .FLAB <>>
+         <COND (<==? .RES STACK>
+                <EMIT-PUSH <TYPE-WORD FALSE> LONG>
+                <CLEAR-PUSH>)
+               (ELSE <MOVE-TYPE <> .RTAC> <MOVE-VALUE <> .RVAC>)>
+         <GEN-BRANCH ,INST-BRB .ELAB <>>
+         <EMIT-LABEL .FLAB <>>)>
+   <COND
+    (<==? .RES STACK>
+     <COND (.CADDR
+           <COND (<TYPE? .CADDR FIX>
+                  <COND (.TYPV
+                         <SET VPUSH <CHTYPE <ORB .TYPV <LSH .CADDR 16>> FIX>>
+                         <EMIT-PUSH <MA-IMM .VPUSH> LONG>)
+                        (ELSE
+                         <EMIT-PUSH <TYPE-CODE .TYP> WORD>
+                         <EMIT-PUSH <MA-IMM .CADDR> WORD>)>)
+                 (ELSE
+                  <EMIT-PUSH <TYPE-CODE .TYP> WORD>
+                  <EMIT-PUSH .CADDR WORD>)>)
+          (<EMIT-PUSH <TYPE-WORD .TYP> LONG>)>
+     <COND (.HW <EMIT ,INST-MOVZWL .VADDR <MA-AINC ,AC-TP>>)
+          (ELSE <EMIT-PUSH .VADDR LONG>)>)
+    (ELSE
+     <COND
+      (<NOT .HTYP>
+       <COND
+       (<AND <TYPE? .CADDR FIX> <TYPE? .TYPV FIX>>
+        <SET VPUSH <CHTYPE <ORB .TYPV <LSH .CADDR 16>> FIX>>
+        <LOAD-CONSTANT .RTAC .VPUSH>)
+       (ELSE
+        <COND
+         (.CADDR
+          <COND (<TYPE? .CADDR FIX>
+                 <LOAD-CONSTANT .RTAC <MA-IMM <CHTYPE <LSH .CADDR 16> FIX>>>
+                 <EMIT ,INST-MOVW <TYPE-CODE .TYP> <MA-REG .RTAC>>)
+                (ELSE <EMIT ,INST-MOVL .CADDR <MA-REG .RTAC>>)>)
+         (ELSE <EMIT ,INST-MOVL <TYPE-WORD .TYP> <MA-REG .RTAC>>)>
+        <USE-AC .RTAC>)>)
+      (ELSE
+       <COND (<TYPE? .CADDR FIX> <LOAD-CONSTANT .RTAC .CADDR>)
+            (.CADDR <MOVE-TO-AC .RTAC .CADDR WORD>)>)>
+     <COND (.HW <EMIT ,INST-MOVZWL .VADDR <MA-REG .RVAC>>)
+          (ELSE <EMIT-MOVE .VADDR <MA-REG .RVAC> LONG>)>)>
+   <COND (<NOT .HTYP>
+         <EMIT-LABEL .ELAB <>>
+         <AND <TYPE? .RES VARTBL> <DEST-PAIR .RVAC .RTAC .RES>>)
+        (<TYPE? .RES VARTBL>
+         <COND (.CADDR <DEST-COUNT-DECL .RVAC .RTAC .RES .TYP>)
+               (ELSE <DEST-DECL .RVAC .RES .TYP>)>)>>
+
+<DEFINE FIND-APP-AC (VAC TYP "OPTIONAL" (RES <>)) 
+       #DECL ((VAC) AC (TYP) <OR FALSE ATOM>)
+       <COND (<OR <NOT .TYP> <STRUCTURED-TYPE? .TYP>>
+              <COND (<FREE-VALUE-AC? STORED> <GET-AC PREF-VAL T>)
+                    (ELSE <MUNG-AC .VAC> .VAC)>)
+             (<GET-AC PREF-VAL T>)>>
+
+<DEFINE GEN-NTH (VADDR TYP VAC RES CADDR
+                "OPT" (HW <>) (RTAC <>) (RVAC <>)
+                "AUX" VPUSH (NO-LOAD <>))
+       #DECL ((VADDR) EFF-ADDR (TYP) ATOM (VAC) AC (RES) <OR ATOM VARTBL>
+              (CADDR) <OR EFF-ADDR FALSE FIX>)
+       <COND (<==? .RES STACK>
+              <COND (<AND <TYPE? .CADDR FIX> <MEMQ .TYP ,TYPE-WORDS>>
+                     <SET VPUSH
+                          <CHTYPE <ORB <TYPE-CODE .TYP VALUE> <LSH .CADDR 16>>
+                                  FIX>>
+                     <EMIT-PUSH <MA-IMM .VPUSH> LONG>)
+                    (.CADDR
+                     <EMIT-PUSH <TYPE-CODE .TYP> WORD>
+                     <EMIT-PUSH .CADDR WORD>)
+                    (<EMIT-PUSH <TYPE-WORD .TYP> LONG>)>
+              <COND (.HW <EMIT ,INST-MOVZWL .VADDR <MA-AINC ,AC-TP>>)
+                    (ELSE <EMIT-PUSH .VADDR LONG>)>)
+             (ELSE
+              <COND (<AND <NOT .RTAC> .CADDR>
+                     <SET RTAC <GET-AC DOUBLE T>>
+                     <PROTECT <SET RVAC <NEXT-AC .RTAC>>>)
+                    (<NOT .RVAC> <PROTECT <SET RVAC <FIND-APP-AC .VAC .TYP>>>)
+                    (ELSE <SET NO-LOAD T>)>
+              <COND (.CADDR
+                     <COND (<TYPE? .CADDR FIX> <LOAD-CONSTANT .RTAC .CADDR>)
+                           (ELSE <EMIT ,INST-MOVZWL .CADDR <MA-REG .RTAC>>)>
+                     <COND (<NOT .NO-LOAD>
+                            <EMIT-MOVE .VADDR <MA-REG .RVAC> LONG>)>
+                     <DEST-COUNT-DECL .RVAC .RTAC .RES .TYP>)
+                    (<NOT .NO-LOAD>
+                     <COND (.HW <EMIT ,INST-MOVZWL .VADDR <MA-REG .RVAC>>)
+                           (ELSE
+                            <EMIT-MOVE .VADDR <MA-REG .RVAC> LONG>)>
+                     <DEST-DECL .RVAC .RES .TYP>)
+                    (ELSE
+                     <DEST-DECL .RVAC .RES .TYP>)>
+              <LOAD-AC .RVAC .VADDR>)>>
+
+<DEFINE BOOL-NTH (VADDR BNO RES "AUX" ELAB FLAB RVAC RTAC) 
+       #DECL ((VADDR) EFF-ADDR (BNO) FIX (RES) <OR ATOM VARTBL>
+              (BRANCH?) <OR LIST FALSE>)
+       <SET ELAB <MAKE-LABEL>>
+       <SET FLAB <MAKE-LABEL>>
+       <COND (<TYPE? .RES VARTBL>
+              <SET RTAC <GET-AC PREF-TYPE>>
+              <SET RVAC <GET-AC PREF-VAL>>
+              <DEST-PAIR .RVAC .RTAC .RES>)>
+       <GEN-BRANCH ,INST-BBC <MA-IMM .BNO> .VADDR  .FLAB <>>
+       <COND (<==? .RES STACK>
+              <EMIT-PUSH <ADDR-TYPE-MQUOTE T> LONG>
+              <EMIT-PUSH <ADDR-VALUE-MQUOTE T> LONG>)
+             (ELSE <MOVE-TYPE T .RTAC> <MOVE-VALUE T .RVAC>)>
+       <GEN-BRANCH ,INST-BRB .ELAB <>>
+       <EMIT-LABEL .FLAB <>>
+       <COND (<==? .RES STACK>
+              <EMIT-PUSH <TYPE-WORD FALSE> LONG>
+              <CLEAR-PUSH>)
+             (ELSE <MOVE-TYPE <> .RTAC> <MOVE-VALUE <> .RVAC>)>
+       <EMIT-LABEL .ELAB <>>>
+
+<DEFINE BOOL-NTH-BRANCH (VADDR BNO BRANCH) 
+       #DECL ((VADDR) EFF-ADDR (BNO) FIX (BRANCH) <LIST ATOM ATOM>)
+       <EMIT ,INST-BTST NO-SIZE-WORD .VADDR <EXTWORD-DATA .BNO>>
+       <COND (<==? <1 .BRANCH> ->
+              <GEN-BRANCH ,INST-BBC <MA-IMM .BNO> .VADDR <2 .BRANCH> <>>)
+             (ELSE
+              <GEN-BRANCH ,INST-BBS <MA-IMM .BNO> .VADDR <2 .BRANCH> <>>)>>
+
+<DEFINE COUNT-STORE-REC (VAL TCADDR "AUX" (LV <FIND-CACHE-VAR .VAL>) AC)
+       #DECL ((VAL) VARTBL)
+       <COND (<OR <NOT .LV>
+                  <LINKVAR-COUNT-STORED .LV>
+                  <LINKVAR-COUNT-AC .LV>>
+              <EMIT-MOVE <VAR-COUNT-ADDRESS .VAL> .TCADDR WORD>)
+             (<SET AC <LINKVAR-TYPE-WORD-AC .LV>>
+              <EMIT ,INST-ROTL <MA-BYTE-IMM 16> <MA-REG .AC>
+                    <MA-REG <SET AC <GET-AC ANY-AC T>>>>
+              <EMIT-MOVE <MA-REG .AC> .TCADDR WORD>)>>
+              
\ No newline at end of file