--- /dev/null
+<SETG LB-DOPE <+ <CHTYPE <LSH 18 16> FIX> *40* 770>>
+<SETG LB-OBJ 0>
+<SETG LB-ATOM 8>
+<SETG LB-DECL 12>
+<SETG LB-PREV 20>
+<SETG LB-LAST 24>
+<SETG LB-BID 28>
+<MANIFEST LB-DOPE LB-OBJ LB-ATOM LB-DECL LB-PREV LB-LAST LB-BID>
+
+<DEFINE GEN-BBIND (ATM DECL FIXUP? "OPT" INIT "AUX" AC ATMADDR)
+ #DECL ((ATM) ATOM (FIXUP?) <OR ATOM FALSE>)
+ <EMIT-PUSH <MA-IMM ,LB-DOPE> LONG> ;"Push the dope word"
+ <COND (<ASSIGNED? INIT>
+ <PUSH-GEN .INIT>)
+ (T
+ <EMIT-PUSH <MA-IMM 0> DOUBLE>)> ; "Push the value"
+ <SET AC <GET-AC PREF-VAL T>>
+ <EMIT-MOVE <ADDR-VALUE-MQUOTE .ATM>
+ <SET ATMADDR <MA-REG .AC>> LONG> ; "load the atom"
+ <EMIT-MOVE .ATMADDR <MA-AINC ,AC-TP> LONG> ; "stuff it in the binding"
+ <PUSH-GEN .DECL> ;"PUSH THE DECL"
+ <EMIT-PUSH <MA-ABS ,SPSTO-LOC> LONG> ;"PUSH THE PREVIOUS BINDING"
+ <EMIT-PUSH <MA-DISP .AC 4> LONG> ;"PUSH THE ATOM'S OLD BINDING"
+ <EMIT-PUSH <MA-ABS ,BINDID-LOC> LONG> ;"PUSH BINDID"
+ <EMIT ,INST-MOVAL <MA-DISP ,AC-TP -32> <MA-ABS ,SPSTO-LOC>>
+ <COND (.FIXUP? ;"IF FIXUP, STUFF BINDING INTO ATOM"
+ <EMIT ,INST-MOVAL <MA-DISP ,AC-TP -32>
+ <MA-LD .AC 4>>)>
+ NORMAL>
+
+<DEFINE GEN-ASSIGNED? (FROB DIR LABEL)
+ <CALL-RTE ,IASSQ!-MIMOP CALL <> <> .FROB>
+ <EMIT ,INST-TSTL <MA-REG ,AC-1>>
+ <COND (<==? .DIR ->
+ <GEN-BRANCH ,INST-BEQL .LABEL CONDITIONAL-BRANCH>)
+ (T
+ <GEN-BRANCH ,INST-BNEQ .LABEL CONDITIONAL-BRANCH>)>
+ CONDITIONAL-BRANCH>
+
+<DEFINE GEN-LVAL (ATM RES)
+ #DECL ((ATM) <OR ATOM VARTBL>)
+ <CALL-RTE ,ILVAL!-MIMOP CALL .RES <> .ATM>
+ NORMAL>
+
+<DEFINE GEN-SET (ATM VAL)
+ <CALL-RTE ,ISET!-MIMOP CALL <> <> .ATM .VAL>
+ NORMAL>
+
+<DEFINE MOVSTK-GEN (AMT "OPTIONAL" (RES <>) HINT TYP)
+ <CALL-RTE ,IMOVSTK!-MIMOP CALL .RES <> .AMT>
+ NORMAL>
+
+<DEFINE GETSTK-GEN (UV "OPTIONAL" (RES <>) HINT TYP)
+ <CALL-RTE ,IGETSTK!-MIMOP CALL .RES <> .UV>
+ NORMAL>
+
+<DEFINE GETTTY-GEN (FROB "OPTIONAL" (RES <>) HINT TYP)
+ <CALL-RTE ,IGETTTY!-MIMOP CALL .RES <> .FROB>
+ NORMAL>
+
+<DEFINE SAVTTY-GEN (OLD NEW "OPTIONAL" (RES <>) HINT TYP)
+ <CALL-RTE ,ISAVTTY!-MIMOP CALL .RES <> .OLD .NEW>
+ NORMAL>
+
+<DEFINE SETZONE-GEN (ZONE "OPT" (RES <>) HINT TYP)
+ <CALL-RTE ,ISETZONE!-MIMOP CALL .RES <> .ZONE>
+ NORMAL>
+
+<DEFINE LEGAL-GEN (OBJ "OPT" (RES <>) HINT TYP)
+ <CALL-RTE ,ILEGAL?!-MIMOP CALL .RES <> .OBJ>
+ NORMAL>
+
+<DEFINE TEMPLATE-TABLE-GEN (OFFS TBL "OPTIONAL" HINT)
+ <CALL-RTE ,ITTABLE!-MIMOP CALL <> <> .OFFS .TBL>
+ NORMAL>
+
+<DEFINE FATAL-GEN ("OPTIONAL" (STR <>) HINT)
+ <CALL-RTE ,IFATAL!-MIMOP CALL <> <> .STR>
+ NORMAL>
+
+<DEFINE QUIT-GEN ("OPTIONAL" (ARG -1) HINT)
+ <CALL-RTE ,IQUIT!-MIMOP CALL <> <> .ARG>
+ NORMAL>
+
+<DEFINE CONS-GEN (NEARG LARG RES "OPTIONAL" HINT)
+ #DECL ((LARG) <OR VARTBL LIST> (NEARG) ANY (RES) <OR VARTBL ATOM>)
+ <CALL-RTE ,ICONS!-MIMOP CALL .RES LIST .LARG .NEARG>
+ NORMAL>
+
+<DEFINE UBLOCK-GEN (TYPARG NUMARG RES "OPTIONAL" HINT "AUX" VEC)
+ #DECL ((TYPARG) ATOM (NUMARG) <OR FIX VARTBL>)
+ <GET-AC ,AC-0 T>
+ <COND (<SET VEC <MEMQ .TYPARG ,TYPE-WORDS>>
+ <LOAD-CONSTANT ,AC-0 <2 .VEC>>)
+ (ELSE <EMIT-MOVE <TYPE-CODE .TYPARG> <MA-REG ,AC-0> LONG>)>
+ <CALL-RTE ,IBLOCK!-MIMOP CALL .RES .TYPARG .NUMARG>
+ NORMAL>
+
+<DEFINE UUBLOCK-GEN (TYPARG NUMARG RES "OPTIONAL" HINT "AUX" VEC)
+ #DECL ((TYPARG) ATOM (NUMARG) <OR FIX VARTBL>)
+ <GET-AC ,AC-0 T>
+ <COND (<SET VEC <MEMQ .TYPARG ,TYPE-WORDS>>
+ <LOAD-CONSTANT ,AC-0 <2 .VEC>>)
+ (T
+ <EMIT-MOVE <TYPE-CODE .TYPARG> <MA-REG ,AC-0> LONG>)>
+ <CALL-RTE ,UIBLOCK!-MIMOP CALL .RES .TYPARG .NUMARG>
+ NORMAL>
+
+<DEFINE CHTYPE-GEN (VAR TYP RES "OPTIONAL" HINT "AUX" VAC CAC TYVAR LV)
+ #DECL ((VAR) ANY (TYVAR) VARTBL (TYP) <OR ATOM FORM VARTBL>
+ (RES) <OR ATOM VARTBL>)
+ <COND
+ (<TYPE? .VAR VARTBL>
+ <COND
+ (<AND <==? .RES .VAR> <VAR-COUNT-STORED? .VAR>>
+ <EMIT ,INST-MOVW <COND (<TYPE? .TYP ATOM> <TYPE-CODE .TYP>)
+ (<TYPE? .TYP VARTBL> <VAR-VALUE-ADDRESS .TYP>)
+ (ELSE <VAR-TYPE-ADDRESS <2 .TYP>>)>
+ <VAR-TYPE-ADDRESS .VAR TYPE-WORD>>
+ <COND (<SET LV <FIND-CACHE-VAR .VAR>>
+ ;<PUT .LV ,LINKVAR-TYPE-AC <>>
+ ;<PUT .LV ,LINKVAR-TYPE-WORD-AC <>>
+ <COND (<LINKVAR-TYPE-WORD-AC .LV>
+ <PUT .LV ,LINKVAR-TYPE-STORED <>>)>)>)
+ (<OR <NOT <TYPE? .TYP ATOM>> <COUNT-NEEDED? .TYP>>
+ <COND (<==? .RES STACK>
+ <EMIT-PUSH <VAR-TYPE-ADDRESS .VAR TYPE-WORD> LONG>
+ <COND (<TYPE? .TYP VARTBL>
+ <EMIT ,INST-MOVW <VAR-VALUE-ADDRESS .TYP>
+ <MA-DISP ,AC-TP -4>>)
+ (<TYPE? .TYP FORM>
+ <EMIT ,INST-MOVW <VAR-TYPE-ADDRESS <2 .TYP>>
+ <MA-DISP ,AC-TP -4>>)
+ (ELSE <EMIT ,INST-MOVW <TYPE-CODE .TYP>
+ <MA-DISP ,AC-TP -4>>)>
+ <EMIT-PUSH <VAR-VALUE-ADDRESS .VAR> LONG>)
+ (ELSE
+ <SET VAC <LOAD-VAR .VAR VALUE <> PREF-VAL>>
+ <PROTECT .VAC>
+ <COND (<AND <TYPE? .TYP ATOM>
+ <VAR-TYPE-WORD-IN-AC? .VAR>>
+ <SET CAC <LOAD-VAR .VAR TYPE-WORD T PREF-TYPE>>
+ <EMIT ,INST-MOVW <TYPE-CODE .TYP> <MA-REG .CAC>>
+ <DEST-PAIR .VAC .CAC .RES>)
+ (<TYPE? .TYP ATOM>
+ <SET CAC <LOAD-VAR .VAR COUNT <> PREF-TYPE>>
+ <DEST-COUNT-DECL .VAC .CAC .RES .TYP>)
+ (<TYPE? .TYP FORM>
+ <SET CAC <LOAD-VAR .VAR TYPE-WORD T PREF-TYPE>>
+ <EMIT ,INST-MOVW
+ <VAR-TYPE-ADDRESS <2 .TYP> TYPE>
+ <MA-REG .CAC>>
+ <DEST-PAIR .VAC .CAC .RES>)
+ (ELSE
+ <SET CAC <LOAD-VAR .VAR TYPE-WORD T PREF-TYPE>>
+ <EMIT ,INST-MOVW
+ <VAR-VALUE-ADDRESS .TYP>
+ <MA-REG .CAC>>
+ <DEST-PAIR .VAC .CAC .RES>)>)>)
+ (ELSE
+ <COND (<==? .RES STACK>
+ <EMIT-PUSH <TYPE-WORD .TYP> LONG>
+ <EMIT-PUSH <VAR-VALUE-ADDRESS .VAR> LONG>)
+ (ELSE
+ <SET VAC <LOAD-VAR-APP .VAR <>>>
+ <DEST-DECL .VAC .RES .TYP>)>)>)
+ (<COUNT-NEEDED? <TYPE .VAR>>
+ ; "Some structured thing"
+ <COND (<==? .RES STACK>
+ <EMIT-PUSH <ADDR-TYPE-M <ADD-MVEC .VAR>>>
+ <COND (<TYPE? .TYP VARTBL>
+ <EMIT ,INST-MOVW <VAR-VALUE-ADDRESS .TYP>
+ <MA-DISP ,AC-TP -4>>)
+ (<TYPE? .TYP FORM>
+ <EMIT ,INST-MOVW <VAR-TYPE-ADDRESS <2 .TYP>>
+ <MA-DISP ,AC-TP -4>>)
+ (T
+ <EMIT ,INST-MOVW <TYPE-CODE .TYP>
+ <MA-DISP ,AC-TP -4>>)>
+ <EMIT-PUSH <ADDR-VAL-M .VAR> LONG>)
+ (T
+ <SET-GEN .RES .VAR>
+ <CHTYPE-GEN .RES .TYP .RES>)>)
+ (T
+ <COND (<==? .RES STACK>
+ <COND (<TYPE? .TYP VARTBL>
+ <EMIT-PUSH <VAR-VALUE-ADDRESS .TYP> LONG>)
+ (<TYPE? .TYP FORM>
+ <EMIT-PUSH <VAR-TYPE-ADDRESS <2 .TYP> LONG>>)
+ (T
+ <EMIT-PUSH <TYPE-CODE .TYP> LONG>)>
+ <EMIT-PUSH <MA-IMM <FIX-CONSTANT? .VAR>> LONG>)
+ (T
+ <SET-GEN .RES .VAR>
+ <CHTYPE-GEN .RES .TYP .RES>)>)>
+ NORMAL>
+
+<SETG GVAL-CAREFUL <>>
+<DEFINE GVAL-GEN (ATM RES "OPTIONAL" (HINT <>) "AUX" VAC ATMADDR TYP TAC
+ ELABEL NLABEL ATMOFF)
+ #DECL ((ATM) <OR ATOM VARTBL> (RES) <OR ATOM VARTBL>
+ (HINT) <OR FALSE HINT>)
+ <COND (.HINT <SET TYP <PARSE-HINT .HINT TYPE>>) (ELSE <SET TYP <>>)>
+ <COND (,BOOT-MODE <SET ATMADDR <ADDR-VALUE-MQUOTE .ATM>>)
+ (<TYPE? .ATM VARTBL>)
+ (T
+ <SET ATMADDR
+ <MA-DEF-DISP ,AC-M <SET ATMOFF
+ <+ <ADD-MVEC <CHTYPE .ATM XGLOC>> 4>>>>
+ ;<SET ATMADDR <ADDR-VALUE-MQUOTE <CHTYPE .ATM XGLOC>>>)>
+ <COND (,BOOT-MODE
+ <SET VAC <GET-AC PREF-VAL T>>
+ <PROTECT .VAC>
+ <EMIT-MOVE .ATMADDR <MA-REG .VAC> LONG>
+ <EMIT-MOVE <MA-REGD .VAC> <MA-REG .VAC> LONG>
+ <COND (<==? .RES STACK> <EMIT-PUSH <MA-REGD .VAC> DOUBLE>)
+ (ELSE
+ <COND (<OR <NOT .TYP> <COUNT-NEEDED? .TYP>>
+ <SET TYP <>>
+ <SET TAC <GET-AC DOUBLE T>>
+ <EMIT ,INST-MOVQ <MA-REGD .VAC> <MA-REG .TAC>>
+ <SET VAC <NEXT-AC .TAC>>)
+ (ELSE
+ <EMIT ,INST-MOVL <MA-DISP .VAC 4> <MA-REG .VAC>>)>
+ <COND (<NOT .TYP> <DEST-PAIR .VAC .TAC .RES T>)
+ (<DEST-DECL .VAC .RES .TYP T>)>)>)
+ (<AND <TYPE? .ATM VARTBL>
+ <NOT ,GVAL-CAREFUL>>
+ <COND (<SET TAC <VAR-VALUE-IN-AC? .ATM>>
+ <PROTECT .TAC>
+ ; "If atom is in AC, can win immediate"
+ <COND (<==? .RES STACK>
+ <EMIT-PUSH <MA-BDD .TAC 0> DOUBLE>)
+ (T
+ <SET VAC <GET-AC DOUBLE T>>
+ <EMIT ,INST-MOVQ <MA-BDD .TAC 0> <MA-REG .VAC>>)>)
+ (T
+ <SET VAC <GET-AC DOUBLE T>>
+ ; "Otherwise, pick up gbind through pointer on stack"
+ <EMIT ,INST-MOVL <GEN-LOC .ATM 4 T> <MA-REG .VAC>>
+ ; "Then get value out of that"
+ <COND (<==? .RES STACK>
+ <EMIT-PUSH <MA-REGD .VAC> DOUBLE>)
+ (T
+ <EMIT ,INST-MOVQ <MA-REGD .VAC> <MA-REG .VAC>>)>)>
+ <COND (<N==? .RES STACK>
+ <DEST-PAIR <NEXT-AC .VAC> .VAC .RES T>)>)
+ (<AND ,GVAL-CAREFUL <N==? .ATM M$$BINDID>>
+ <FLUSH-ALL-ACS>
+ <SET TAC <GET-AC ,AC-0 T>>
+ <SET VAC <GET-AC ,AC-1 T>>
+ <SET ELABEL <MAKE-LABEL>>
+ <SET NLABEL <MAKE-LABEL>>
+ <COND (<TYPE? .ATM VARTBL>
+ ; "Pick up gbind"
+ <EMIT ,INST-MOVL <GEN-LOC .ATM 4 T> <MA-REG .VAC>>
+ ; "Barf if not there"
+ <GEN-BRANCH ,INST-BEQL .NLABEL <>>
+ ; "Pick up gval"
+ <EMIT ,INST-MOVQ <MA-REGD .VAC> <MA-REG .TAC>>)
+ (T
+ <EMIT ,INST-MOVQ .ATMADDR <MA-REG .TAC>>)>
+ ; "Win if have gval"
+ <GEN-BRANCH ,INST-BNEQ .ELABEL <>>
+ <EMIT-LABEL .NLABEL <>>
+ <COND (<TYPE? .ATM VARTBL>
+ <EMIT ,INST-PUSHAL <VAR-VALUE-ADDRESS .ATM>>)
+ (T <EMIT ,INST-PUSHAL <MA-DISP ,AC-M .ATMOFF>>)>
+ <CALL-RTE ,IGVERR!-MIMOP CALL <COND (<N==? .RES STACK> .RES)>
+ <>>
+ <EMIT-LABEL .ELABEL <>>
+ <COND (<==? .RES STACK>
+ <EMIT-PUSH <MA-REG .TAC> DOUBLE>)
+ (T
+ <DEST-PAIR <NEXT-AC .TAC> .TAC .RES T>)>)
+ (T
+ <COND (<==? .RES STACK>
+ <EMIT-PUSH .ATMADDR DOUBLE>)
+ (T
+ <SET TAC <GET-AC DOUBLE T>>
+ <EMIT ,INST-MOVQ .ATMADDR <MA-REG .TAC>>
+ <DEST-PAIR <NEXT-AC .TAC> .TAC .RES T>)>)>
+ NORMAL>
+
+
+<DEFINE SETG-GEN (ATM VAL
+ "OPTIONAL" HINT
+ "AUX" VAC ATMADDR (A1 <>) (A2 <>) (TWOM <>) LV)
+ #DECL ((ATM) ATOM (RES) ANY)
+ <COND (<AND <TYPE? .VAL VARTBL> <SET LV <FIND-CACHE-VAR .VAL>>>
+ <SET A1 <LINKVAR-TYPE-WORD-AC .LV>>
+ <SET A2 <LINKVAR-VALUE-AC .LV>>)
+ (T <SET LV <>>)>
+ <COND (,BOOT-MODE <SET ATMADDR <ADDR-VALUE-MQUOTE .ATM>>)
+ (<OR <FIX-CONSTANT? .VAL>
+ <AND .LV
+ <NOT <AND <LINKVAR-VALUE-STORED .LV>
+ <LINKVAR-TYPE-STORED .LV>
+ <LINKVAR-COUNT-STORED .LV>>>
+ <NOT <AND .A1 <==? .A2 <NEXT-AC .A1>>>>>>
+ <SET TWOM T>
+ <SET ATMADDR <ADDR-VALUE-MQUOTE <CHTYPE .ATM XGLOC>>>)
+ (T
+ <SET ATMADDR
+ <MA-DEF-DISP ,AC-M <+ <ADD-MVEC <CHTYPE .ATM XGLOC>> 4>>>
+ ;<SET ATMADDR <ADDR-VALUE-MQUOTE <CHTYPE .ATM XGLOC>>>)>
+ <COND (<OR ,BOOT-MODE .TWOM>
+ <COND (.A1 <PROTECT .A1>)>
+ <COND (.A2 <PROTECT .A2>)>
+ <SET VAC <GET-AC PREF-VAL T>>
+ <EMIT ,INST-MOVL .ATMADDR <MA-REG .VAC>>
+ <PROTECT .VAC>
+ <COND (<NOT .TWOM>
+ <EMIT ,INST-MOVL <MA-REGD .VAC> <MA-REG .VAC>>)>
+ <COND (<OR <TYPE? .VAL VARTBL> <FIX-CONSTANT? .VAL>>
+ <MOVE-TYPE .VAL <MA-REGD .VAC> <MA-DISP .VAC 2>>
+ <MOVE-VALUE .VAL <MA-DISP .VAC 4>>)
+ (ELSE
+ <EMIT-MOVE <ADDR-TYPE-MQUOTE .VAL>
+ <MA-REGD .VAC>
+ DOUBLE>)>)
+ (<TYPE? .VAL VARTBL>
+ <EMIT ,INST-MOVQ <VAR-TYPE-ADDRESS .VAL TYPE-WORD> .ATMADDR>)
+ (T <EMIT ,INST-MOVQ <ADDR-TYPE-MQUOTE .VAL> .ATMADDR>)>
+ NORMAL>
+
+<SETG BE-COMPATIBLE T>
+
+<DEFINE SET-GEN (VAR VAL "OPTIONAL" (HINT <>) "AUX" VAC TAC CAC DCL LV)
+ #DECL ((VAR) VARTBL (VAL) ANY (HINT) <OR FALSE HINT>)
+ <DEAD-VAR .VAR>
+ <COND (<TYPE? .VAL VARTBL>
+ <SET VAC <LOAD-VAR-APP .VAL <> <VARTBL-DECL .VAL> <>>>
+ <LINK-VAR-TO-AC .VAR .VAC VALUE <>>
+ <COND (<OR <SET DCL <VARTBL-DECL .VAR>>
+ <SET DCL <VARTBL-DECL .VAL>>>
+ <INDICATE-CACHED-VARIABLE-DECL .VAR .DCL>
+ <COND (<COUNT-NEEDED? .DCL>
+ <SET CAC <LOAD-VAR .VAL TYPE-WORD <> PREF-TYPE
+ <> <>>>
+ <LINK-VAR-TO-AC .VAR .CAC TYPE-WORD <>>)>)
+ (ELSE
+ <SET TAC <LOAD-VAR .VAL TYPE-WORD <> PREF-TYPE <> <>>>
+ <LINK-VAR-TO-AC .VAR .TAC TYPE-WORD <>>)>)
+ (<N==? <PRIMTYPE .VAL> FIX>
+ <SET TAC <GET-AC DOUBLE T>>
+ <EMIT ,INST-MOVQ <ADDR-TYPE-M <ADD-MVEC .VAL>> <MA-REG .TAC>>
+ <DEST-PAIR <NEXT-AC .TAC> .TAC .VAR>
+ <INDICATE-CACHED-VARIABLE-DECL .VAR <TYPE .VAL>>)
+ (ELSE
+ <SET VAC
+ <GEN-CONSTANT .VAL PREF-VAL PREF-TYPE COUNT-IF-NECESSARY>>
+ <LINK-VAR-TO-AC .VAR .VAC VALUE <>>
+ <AND ,CONSTANT-COUNT-AC
+ <LINK-VAR-TO-AC .VAR ,CONSTANT-COUNT-AC COUNT <>>>
+ <INDICATE-CACHED-VARIABLE-DECL .VAR <TYPE .VAL>>)>
+ <PROCESS-DESTINATION-HINT .HINT .VAR>
+ NORMAL>
+
+<DEFINE MRETURN-GEN (TVAR FVAR "OPTIONAL" RES)
+ <INDICATE-ALL-DEAD>
+ <COND (<TYPE? .TVAR VARTBL> <PUT .TVAR ,VARTBL-DEAD? <>>)>
+ <COND (<TYPE? .FVAR VARTBL> <PUT .FVAR ,VARTBL-DEAD? <>>)>
+ <EMIT ,INST-MOVL
+ <COND (<TYPE? .TVAR VARTBL> <VAR-VALUE-ADDRESS .TVAR>)
+ (<MA-IMM .TVAR>)>
+ <MA-REG ,AC-1>>
+ <PROTECT ,AC-1>
+ <COND (<==? .FVAR 0>
+ <COND (<AND ,MAKTUP-FLAG <0? ,ICALL-LEVEL>>
+ <EMIT ,INST-MOVL <MA-DISP ,AC-F -4> <MA-REG ,AC-2>>)
+ (ELSE
+ <EMIT ,INST-MOVL <MA-REG ,AC-F> <MA-REG ,AC-2>>)>)
+ (ELSE
+ <EMIT ,INST-MOVL <VAR-VALUE-ADDRESS .FVAR> <MA-REG ,AC-2>>)>
+ <PROTECT ,AC-2>
+ <CALL-RTE ,IMRETURN!-MIMOP JUMP <> <>>
+ UNCONDITIONAL-BRANCH>
+
+<DEFINE RETURN-GEN (VAL "OPTIONAL" (FRM <>) RES)
+ #DECL ((VAL) ANY (FRM) <OR FALSE VARTBL>)
+ <INDICATE-ALL-DEAD>
+ <COND (<TYPE? .FRM VARTBL> <PUT .FRM ,VARTBL-DEAD? <>>)>
+ <COND (<TYPE? .VAL VARTBL>
+ <PUT .VAL ,VARTBL-DEAD? <>>
+ <LOAD-VAR .VAL VALUE <> ,AC-1>
+ <LOAD-VAR .VAL TYPE-WORD <> ,AC-0>)
+ (ELSE <GEN-CONSTANT .VAL ,AC-1 ,AC-0 TYPE-WORD>)>
+ <PROTECT ,AC-1>
+ <PROTECT ,AC-0>
+ <COND (.FRM <EMIT ,INST-MOVL <VAR-VALUE-ADDRESS .FRM> <MA-REG ,AC-F>>)
+ (<AND ,MAKTUP-FLAG <0? ,ICALL-LEVEL>>
+ <EMIT ,INST-MOVL <MA-DISP ,AC-F -4> <MA-REG ,AC-F>>)>
+ <CALL-RTE ,FINIS!-MIMOP JUMP <> <>>
+ UNCONDITIONAL-BRANCH>
+
+<DEFINE DISPATCH-GEN (VAR BASE "TUPLE" LABELS "AUX" (CT <LENGTH .LABELS>))
+ #DECL ((CT) FIX (LABELS) <TUPLE [REST ATOM]> (BASE) <PRIMTYPE WORD>)
+ <STORE-ALL-ACS>
+ <EMIT ,INST-CASEL
+ <VAR-VALUE-ADDRESS .VAR>
+ <MA-IMM .BASE>
+ <MA-IMM <- .CT 1>>>
+ <MAPF <>
+ <FUNCTION (AC)
+ <STORE-AC .AC T>>
+ ,ALL-ACS>
+ <MAPF <>
+ <FUNCTION (LABEL "AUX" XREF)
+ <SET XREF <EMIT-LABEL-WORD .LABEL>>
+ <SAVE-XREF-AC-INFO .XREF <SAVE-STATE> <SAVE-LOAD-STATE>>>
+ .LABELS>
+ CONDITIONAL-BRANCH>
+
+<DEFINE OPDISP-GEN (RNUM TRONUM "TUPLE" LABELS "AUX" (NARGS .RNUM))
+ #DECL ((RNUM) FIX (TRONUM) <OR FALSE FIX> (LABELS) <TUPLE [REST
+ ATOM]>)
+ <PROTECT ,AC-0>
+ <EMIT ,INST-CASEW
+ <MA-REG ,AC-0>
+ <MA-LIT .RNUM>
+ <MA-LIT <COND (.TRONUM <- .TRONUM .RNUM>)
+ (ELSE <- <LENGTH .LABELS> 1>)>>>
+ <MAPF <>
+ <FCN (LABEL)
+ <EMIT-LABEL-WORD .LABEL>
+ <ADD-INTERNAL-ENTRY .NARGS .LABEL>
+ <SET NARGS <+ .NARGS 1>>>
+ .LABELS>
+ NORMAL>
+
+<DEFINE MAKTUP-GEN ("TUPLE" TEMPS
+ "AUX" RES (TLEN <LENGTH .TEMPS>) (ARGS ,ARGLIST-VARS)
+ LNOARG TVAR)
+ <SET RES <NTH .TEMPS .TLEN>>
+ <TEMP-PROCESS .RES>
+ <GEN-LOC <SET TVAR <FIND-VAR .RES>> 0>
+ <PUT .TVAR ,VARTBL-TEMP? <>>
+ <MAPR ,TEMP-PROCESS
+ <FCN (TEMPS "AUX" (TEMP <1 .TEMPS>))
+ <COND (<==? .TEMP => <MAPSTOP>)
+ (<OR <==? .RES .TEMP>
+ <=? .RES .TEMP>
+ <COND (<AND <TYPE? .RES ADECL>
+ <TYPE? .TEMP ADECL>>
+ <==? <1 .RES> <1 .TEMP>>)
+ (<AND <TYPE? .RES ADECL>
+ <TYPE? .TEMP ATOM>>
+ <==? <1 .RES> .TEMP>)
+ (<AND <TYPE? .RES ATOM>
+ <TYPE? .TEMP ADECL>>
+ <==? .RES <1 .TEMP>>)>>
+ <MAPRET>)
+ (<MAPRET .TEMP>)>>
+ .TEMPS>
+ <EMIT ,INST-MOVL <MA-REG ,AC-0> <MA-REG ,AC-1>>
+ <COND (<NOT <EMPTY? .ARGS>>
+ <ADD-CONSTANT-TO-AC <- <LENGTH .ARGS>> ,AC-1>
+ <SET LNOARG <MAKE-LABEL>>
+ <GEN-BRANCH ,INST-BGEQ .LNOARG <>>
+ <EMIT ,INST-CLRL <MA-REG ,AC-1>>
+ <EMIT-LABEL .LNOARG <>>)>
+ <SETG MAKTUP-FLAG T>
+ <EMIT-PUSH <TYPE-CODE TUPLE> WORD>
+ <EMIT-PUSH <MA-REG ,AC-1> WORD>
+ <CLEAR-PUSH>
+ <EMIT-PUSH <TYPE-WORD T$FRAME> LONG>
+ <EMIT-PUSH <MA-REG ,AC-F> LONG>
+ <EMIT ,INST-MOVL <MA-REG ,AC-TP> <MA-REG ,AC-2>>
+ <MAPF <> <FCN (VAR) <EMIT-PUSH <ADDR-VAR-TYPE .VAR> DOUBLE>> .ARGS>
+ <EMIT-PUSH <TYPE-CODE TUPLE> WORD>
+ <EMIT-PUSH <MA-REG ,AC-1> WORD>
+ <EMIT-PUSH <MA-REG ,AC-F> LONG>
+ <OR <0? <LENGTH .ARGS>>
+ <EMIT ,INST-ADDL2
+ <MA-IMM <* <LENGTH .ARGS> 8>>
+ <MA-DISP ,AC-TP -4>>>
+ <EMIT ,INST-MOVL <MA-REG ,AC-2> <MA-REG ,AC-F>>
+ <INDICATE-TEMP-PATCH <ADD-PATCH TEMPORARIES>>
+ NORMAL>
+
+<COND (<NOT <GASSIGNED? ICALL-LEVEL>> <SETG ICALL-LEVEL 0>)>
+
+<DEFINE ICALL-GEN (LABEL "OPTIONAL" (RES <>) "AUX" VADDR TADDR TLAB)
+ #DECL ((LABEL) ATOM (RES) <OR FALSE ATOM VARTBL>)
+ <FLUSH-ALL-ACS>
+ <SETG ICALL-LEVEL <+ ,ICALL-LEVEL 1>>
+ <COND (<TYPE? .RES VARTBL>
+ <SET TADDR <ADDR-VAR-TYPE .RES>>
+ <SET VADDR <ADDR-VAR-VALUE .RES>>)>
+ <SETG ICALL-LABELS (.LABEL !,ICALL-LABELS)>
+ <NEW-MODEL <CREATE-MODEL>>
+ <CALL-RTE ,INCALL!-MIMOP CALL <> <>>
+ <SET TLAB <MAKE-LABEL>>
+ <EMIT-BRANCH ,INST-BRB .TLAB <> 0 <> T>
+ <COND (<==? .RES STACK> <EMIT-PUSH <MA-REG ,AC-0> DOUBLE>)
+ (<TYPE? .RES VARTBL> <EMIT ,INST-MOVQ <MA-REG ,AC-0> .TADDR>)>
+ <GEN-BRANCH ,INST-BRB .LABEL UNCONDITIONAL-BRANCH>
+ <EMIT-LABEL .TLAB <>>
+ NORMAL>
+
+"Args are: LOCAL variable being set; FRAME where new val is coming from;
+ variable in that frame for new value."
+<DEFINE SETLR-GEN (LVAR FVAR NLVAR
+ "OPTIONAL" (HINT <>)
+ "AUX" TAC FAC (SADDR <ADDR-VAR-OFFSET .NLVAR>) (TYP <>) REFNUM)
+ #DECL ((NLVAR) VARTBL (LVAR) <OR VARTBL ATOM>)
+ ; "If we don't call GEN-LOC, this frob may never get a stack slot"
+ <AND .HINT <SET TYP <PARSE-HINT .HINT TYPE>>>
+ <PROTECT-VAL .NLVAR>
+ <COND (<AND <TYPE? .LVAR VARTBL>
+ <N==? .LVAR .FVAR>>
+ <DEAD-VAR .LVAR>)>
+ ; "Don't leave the old guy around in ACs"
+ <PROTECT <SET FAC <LOAD-VAR .FVAR VALUE <> PREF-VAL>>>
+ <COND (<==? .LVAR STACK>
+ ; "Handle case of pushing non-local value (code hacked
+ in ILDB-LOOKAHEAD pass)"
+ <EMIT-PUSH <MA-DISP .FAC .SADDR> DOUBLE>)
+ (<AND .TYP <NOT <COUNT-NEEDED? .TYP>>>
+ <SET TAC <GET-AC PREF-VAL T>>
+ ; "Don't clobber frame AC; these guys run in sets"
+ <EMIT ,INST-MOVL <MA-DISP .FAC <+ .SADDR 4>> <MA-REG .TAC>>
+ <DEST-DECL .TAC .LVAR .TYP>)
+ (ELSE
+ <SET TAC <GET-AC DOUBLE T>>
+ <EMIT ,INST-MOVQ <MA-DISP .FAC .SADDR> <MA-REG .TAC>>
+ <DEST-PAIR <NEXT-AC .TAC> .TAC .LVAR>)>
+ NORMAL>
+
+"Args are: FRAME where new value is going; variable in that frame; value
+ for variable (often local var, often not)"
+<DEFINE SETRL-GEN (FVAR NLVAR LVAR
+ "OPTIONAL" (HINT <>)
+ "AUX" FAC (SADDR <ADDR-VAR-OFFSET .NLVAR>) REFNUM TAC CADDR
+ (TYP <>) LV T1 T2)
+ #DECL ((NLVAR FVAR) VARTBL (SADDR) FIX)
+ <PROTECT-VAL .LVAR>
+ <PROTECT <SET FAC <LOAD-VAR .FVAR VALUE <> PREF-VAL>>>
+ <AND .HINT <SET TYP <PARSE-HINT .HINT TYPE>>>
+ <COND (.TYP)
+ (<TYPE? .LVAR VARTBL> <SET TYP <VARTBL-DECL .LVAR>>)
+ (<SET TYP <TYPE .LVAR>>)>
+ <COND (<TYPE? .LVAR VARTBL>
+ <COND (<OR <NOT <SET LV <FIND-CACHE-VAR .LVAR>>>
+ <AND <SET T1 <LINKVAR-VALUE-AC .LV>>
+ <SET T2 <LINKVAR-TYPE-WORD-AC .LV>>
+ <==? .T1 <NEXT-AC .T2>>>
+ <AND <LINKVAR-VALUE-STORED .LV>
+ <LINKVAR-TYPE-STORED .LV>
+ <LINKVAR-COUNT-STORED .LV>>>
+ <EMIT ,INST-MOVQ
+ <COND (<AND .LV .T1> <MA-REG .T2>)
+ (ELSE
+ <ADDR-VAR-TYPE-VALUE .LVAR>)>
+ <MA-DISP .FAC .SADDR>>)
+ (.TYP
+ <EMIT ,INST-MOVL
+ <VAR-VALUE-ADDRESS .LVAR>
+ <MA-DISP .FAC <+ .SADDR 4>>>
+ <EMIT ,INST-MOVW
+ <TYPE-CODE .TYP WORD>
+ <MA-DISP .FAC .SADDR>>
+ <COND (<COUNT-NEEDED? .TYP>
+ <COND (<SET TAC <VAR-COUNT-IN-AC? .LVAR>>
+ <EMIT ,INST-MOVW
+ <MA-REG .TAC>
+ <MA-DISP .FAC <+ .SADDR 2>>>)
+ (<SET CADDR <VAR-COUNT-STORED? .LVAR>>
+ <EMIT ,INST-MOVW
+ .CADDR
+ <MA-DISP .FAC <+ .SADDR 2>>>)
+ (<ERROR "COUNT NOT FOUND" SETRL-GEN>)>)>)
+ (ELSE
+ <EMIT ,INST-MOVL
+ <VAR-TYPE-ADDRESS .LVAR TYPE-WORD>
+ <MA-DISP .FAC .SADDR>>
+ <EMIT ,INST-MOVL
+ <VAR-VALUE-ADDRESS .LVAR>
+ <MA-DISP .FAC <+ .SADDR 4>>>)>)
+ (ELSE
+ <EMIT ,INST-MOVQ <ADDR-TYPE-MQUOTE .LVAR> <MA-DISP .FAC .SADDR>>)>
+ NORMAL>
+
+<DEFINE FIXBIND-GEN () <CALL-RTE ,IFIXBND!-MIMOP CALL <> <>> NORMAL>
+
+<DEFINE BIND-GEN (RES "OPTIONAL" HINT)
+ #DECL ((RES) <OR ATOM VARTBL>)
+ <CALL-RTE ,IBIND!-MIMOP CALL .RES <>>>
+
+<DEFINE CFRAME-GEN (RES "OPTIONAL" HINT "AUX" VAC TLAB)
+ #DECL ((RES) <OR ATOM VARTBL>)
+ <SET VAC <GET-AC PREF-VAL T>>
+ <COND (<AND ,MAKTUP-FLAG <0? ,ICALL-LEVEL>>
+ <EMIT ,INST-MOVL <MA-DISP ,AC-F -4> <MA-REG .VAC>>)
+ (<EMIT ,INST-MOVL <MA-REG ,AC-F> <MA-REG .VAC>>)>
+ <EMIT ,INST-TSTL <MA-DISP .VAC -4>>
+ <SET TLAB <MAKE-LABEL>>
+ <GEN-BRANCH ,INST-BLSS .TLAB <>>
+ <EMIT-MOVE <MA-DISP .VAC -4> <MA-REG .VAC> LONG>
+ <EMIT-LABEL .TLAB <>>
+ <DEST-DECL .VAC .RES T$FRAME>
+ NORMAL>
+
+<DEFINE UNBIND-GEN (VAR)
+ #DECL ((VAR) VARTBL)
+ <CALL-RTE ,IUNBIND!-MIMOP CALL <> <> .VAR>
+ NORMAL>
+
+<DEFINE GETS-GEN (CASE RES "OPTIONAL" HINT "AUX" CE AC)
+ #DECL ((CASE) ATOM)
+ <COND (<MEMBER <SPNAME .CASE> '["PURVEC" "DBVEC"]>
+ <COND (<==? .RES STACK>
+ <EMIT ,INST-MOVQ <ADDR-TYPE-M <ADD-MVEC <>>>
+ <MA-AINC ,AC-TP>>)
+ (T
+ <SET-GEN .RES <>>)>)
+ (<MEMBER <SPNAME .CASE> '["BIND" "BINDID"]>
+ <COND (<==? .RES STACK>
+ <COND (<=? <SPNAME .CASE> "BIND">
+ <EMIT-PUSH <TYPE-WORD LBIND> LONG>
+ <EMIT-PUSH <MA-ABS ,SPSTO-LOC> LONG>)
+ (T
+ <EMIT-PUSH <TYPE-CODE FIX> LONG>
+ <EMIT-PUSH <MA-ABS ,BINDID-LOC> LONG>)>)
+ (T
+ <COND (<SET AC <VAR-VALUE-IN-AC? .RES>>
+ <STORE-AC .AC <> <FIND-CACHE-VAR .RES>>)
+ (T
+ <SET AC <GET-AC PREF-VAL T>>)>
+ <COND (<=? <SPNAME .CASE> "BIND">
+ <EMIT-MOVE <MA-ABS ,SPSTO-LOC> <MA-REG .AC> LONG>
+ <DEST-DECL .AC .RES LBIND>)
+ (T
+ <EMIT-MOVE <MA-ABS ,BINDID-LOC> <MA-REG .AC> LONG>
+ <DEST-DECL .AC .RES FIX>)>)>)
+ (T
+ <SET CE <FIND-CASE-ENTRY .CASE>>
+ <CALL-RTE ,IGETS!-MIMOP CALL .RES
+ <CSENT-VTYP .CE> <CSENT-OFF .CE>>)>
+ NORMAL>
+
+<DEFINE SETS-GEN (CASE VAL "AUX" CE)
+ <COND (<MEMBER <SPNAME .CASE> '["BIND" "BINDID"]>
+ <EMIT-MOVE <COND (<TYPE? .VAL VARTBL>
+ <VAR-VALUE-ADDRESS .VAL>)
+ (T
+ <MA-IMM .VAL>)>
+ <COND (<=? <SPNAME .CASE> "BIND">
+ <MA-ABS ,SPSTO-LOC>)
+ (<MA-ABS ,BINDID-LOC>)> LONG>)
+ (<NOT <MEMBER <SPNAME .CASE> ["PURVEC" "DBVEC"]>>
+ <SET CE <FIND-CASE-ENTRY .CASE>>
+ <CALL-RTE ,ISETS!-MIMOP CALL <> <> .VAL <CSENT-OFF .CE>>)>
+ NORMAL>
+
+<NEWSTRUC CASE-ENTRY VECTOR
+ CSENT-KIND ATOM
+ CSENT-OFF FIX
+ CSENT-VTYP ATOM>
+
+<DEFINE CREATE-CASE-ENTRY (KIND OFF VTYP)
+ #DECL ((KIND VTYP) ATOM (OFF) FIX)
+ <CHTYPE <VECTOR .KIND .OFF .VTYP> CASE-ENTRY>>
+
+<GDECL (CASE-ENTRY-TABLE) <VECTOR [REST CASE-ENTRY]>>
+
+<DEFINE FIND-CASE-ENTRY (KIND)
+ <MAPF <>
+ <FCN (CE)
+ <COND (<=? <SPNAME .KIND> <SPNAME <CSENT-KIND .CE>>>
+ <MAPLEAVE .CE>)>>
+ ,CASE-ENTRY-TABLE>>
+
+<DEFINE RECORD-GEN (TYPARG "TUPLE" ARGS)
+ #DECL ((TYPARG) <OR ATOM FIX>)
+ <COND (<TYPE? .TYPARG ATOM>
+ <SET TYPARG <2 <MEMQ .TYPARG ,TYPE-WORDS>>>)>
+ <CALL-STACK-FUNCTION .ARGS ,BRECORD!-MIMOP <> .TYPARG>
+ NORMAL>
+
+<DEFINE LIST-GEN (LEN RES "OPTIONAL" HINT)
+ #DECL ((LEN) <OR FIX VARTBL> (RES) <OR VARTBL ATOM>)
+ <CALL-RTE ,BLIST!-MIMOP CALL .RES LIST .LEN>
+ NORMAL>
+
+<DEFINE RTUPLE-GEN (TVAR FVAR "OPTIONAL" RES)
+ <CALL-RTE ,IRTUPLE!-MIMOP JUMP <> <> .TVAR .FVAR>
+ UNCONDITIONAL-BRANCH>
+
+<DEFINE AGAIN-GEN (TVAR "OPTIONAL" RES)
+ #DECL ((TVAR) VARTBL)
+ <CALL-RTE ,IAGAIN!-MIMOP JUMP <> <> .TVAR>
+ UNCONDITIONAL-BRANCH>
+
+<DEFINE RETRY-GEN (TVAR "OPTIONAL" RES)
+ #DECL ((TVAR) VARTBL)
+ <CALL-RTE ,IRETRY!-MIMOP JUMP <> <> .TVAR>
+ UNCONDITIONAL-BRANCH>
+
+<DEFINE ACTIVATION-GEN ("OPTIONAL" VAR)
+ <CALL-RTE ,IACTIVATION!-MIMOP CALL <> <>>
+ NORMAL>
+
+<DEFINE TUPLE-GEN (NUM DEST "OPTIONAL" HINT)
+ #DECL ((NUM) <OR FIX VARTBL> (DEST) VARTBL)
+ <CALL-RTE ,ITUPLE!-MIMOP CALL .DEST TUPLE .NUM>>
+
+<DEFINE SBLOCK-GEN (TYPARG NUMARG RES "OPTIONAL" HINT "AUX" VEC)
+ #DECL ((TYPARG) ATOM (NUMARG) <OR FIX VARTBL>)
+ <GET-AC ,AC-0 T>
+ <COND (<SET VEC <MEMQ .TYPARG ,TYPE-WORDS>>
+ <LOAD-CONSTANT ,AC-0 <2 .VEC>>)
+ (T
+ <EMIT-MOVE <TYPE-CODE .TYPARG> <MA-REG ,AC-0> LONG>)>
+ <CALL-RTE ,ISBLOCK!-MIMOP CALL .RES .TYPARG .NUMARG>
+ NORMAL>
+
+<DEFINE USBLOCK-GEN (TYPARG NUMARG RES "OPTIONAL" HINT "AUX" VEC)
+ #DECL ((TYPARG) ATOM (NUMARG) <OR FIX VARTBL>)
+ <GET-AC ,AC-0 T>
+ <COND (<SET VEC <MEMQ .TYPARG ,TYPE-WORDS>>
+ <LOAD-CONSTANT ,AC-0 <2 .VEC>>)
+ (T
+ <EMIT-MOVE <TYPE-CODE .TYPARG> <MA-REG ,AC-0> LONG>)>
+ <CALL-RTE ,UISBLOCK!-MIMOP CALL .RES .TYPARG .NUMARG>
+ NORMAL>
+
+<DEFINE INTGO-GEN ("AUX" (LAB <MAKE-LABEL>))
+ <COND (<AND <NOT ,BOOT-MODE>
+ <NOT ,GC-MODE>
+ <NOT ,DONT-INTERRUPT?>>
+ <EMIT ,INST-TSTL <MA-ABS ,INTFLG-LOC>>
+ <GEN-BRANCH ,INST-BEQL .LAB <>>
+ <CALL-RTE ,LCKINT!-MIMOP CALL <> <>>
+ <EMIT-LABEL .LAB <>>)>
+ NORMAL>
+
+<DEFINE TYPE-GEN (VAL RES "OPTIONAL" HINT "AUX" DAC)
+ #DECL ((VAL) VARTBL (RES) <OR ATOM VARTBL>)
+ <SET DAC <LOAD-VAR .VAL TYPE <> PREF-TYPE>>
+ <DEST-DECL .DAC .RES FIX>>
+
+<DEFINE NEWTYPE-GEN (VAL1 RES "OPTIONAL" HINT)
+ #DECL ((VAL1) VARTBL (RES) <OR ATOM VARTBL>)
+ <CALL-RTE ,INEWTYPE!-MIMOP CALL .RES FIX .VAL1>>
+
+<DEFINE TYPEW-GEN (ARG1 ARG2 RES "OPTIONAL" HINT)
+ #DECL ((ARG1 ARG2) VARTBL (RES) <OR ATOM VARTBL>)
+ <CALL-RTE ,ITYPEW!-MIMOP CALL .RES TYPE-W .ARG1 .ARG2>>
+
+<DEFINE TYPEWC-GEN (ARG1 RES "OPTIONAL" HINT "AUX" VAC)
+ #DECL ((ARG1) VARTBL (RES) <OR ATOM VARTBL>)
+ <CALL-RTE ,ITYPEWC!-MIMOP CALL .RES TYPE-C .ARG1>>
+
+<DEFINE OPEN-GEN (MODE BYTESZ NAME RES "OPTIONAL" (HINT <>))
+ #DECL ((MODE BYTESZ) <OR VARTBL FIX> (NAME) <OR STRING VARTBL>
+ (RES) <OR ATOM VARTBL>)
+ <CALL-RTE ,IOPEN!-MIMOP CALL .RES .HINT .MODE .BYTESZ .NAME>
+ NORMAL>
+
+<DEFINE CLOSE-GEN (CH "OPTIONAL" RES)
+ #DECL ((CH) <OR FIX VARTBL>)
+ <CALL-RTE ,ICLOSE!-MIMOP CALL <> <> .CH>
+ NORMAL>
+
+<DEFINE RESET-GEN (CH "OPTIONAL" RES)
+ #DECL ((CH) <OR FIX VARTBL>)
+ <CALL-RTE ,IRESET!-MIMOP CALL <> <> .CH>
+ NORMAL>
+
+<DEFINE READ-GEN (CHN STR NUMARGS GARB "OPTIONAL" (RES <>))
+ #DECL ((CHN NUMARGS) <OR VARTBL FIX> (STR) VARTBL)
+ <CALL-RTE ,IREAD!-MIMOP CALL .RES FIX .CHN .STR .NUMARGS .GARB>>
+
+<DEFINE PRINT-GEN (CHN STR NUMARGS)
+ #DECL ((CHN NUMARGS) <OR VARTBL FIX> (STR) VARTBL)
+ <CALL-RTE ,IPRINT!-MIMOP CALL <> <> .CHN .STR .NUMARGS>>
+
+<DEFINE RNTIME-GEN ("OPTIONAL" (RES <>))
+ <CALL-RTE ,IRNTIME!-MIMOP CALL .RES <>>>
+
+<DEFINE SAVE-GEN (CHN "OPTIONAL" (ATMZN <>) (PURZN <>) (RES <>))
+ #DECL ((CHN) <OR VARTBL FIX>)
+ <CALL-RTE ,ISAVE!-MIMOP CALL .RES <> .CHN .ATMZN .PURZN>
+ NORMAL>
+
+<DEFINE RESTORE-GEN (CHN "OPTIONAL" (RES <>))
+ #DECL ((CHN) <OR VARTBL FIX>)
+ <CALL-RTE ,IRESTORE!-MIMOP CALL .RES <> .CHN>
+ NORMAL>
+
+<DEFINE COMPERR-GEN () <CALL-RTE ,ICOMPERR!-MIMOP CALL <> <>> NORMAL>
+
+<DEFINE UNWCNT-GEN () <CALL-RTE ,IUNWCNT!-MIMOP JUMP <> <>> NORMAL>
+
+<DEFINE IRECORD-GEN (TYPEC NARGS NWORDS RES "OPTIONAL" (HINT <>))
+ #DECL ((TYPEC NARGS NWORDS) <OR VARTBL FIX> (RES) <OR ATOM VARTBL>)
+ <CALL-RTE ,BIREC!-MIMOP CALL .RES .HINT .TYPEC .NARGS .NWORDS>
+ NORMAL>
+
+<DEFINE ADJ-GEN (AMT "AUX" VAC LVAR)
+ #DECL ((AMT) <OR FIX VARTBL>)
+ <COND (<TYPE? .AMT FIX> <ADD-CONSTANT-TO-AC <* .AMT 8> ,AC-TP>)
+ (<AND <SET LVAR <FIND-CACHE-VAR .AMT>>
+ <SET VAC <LINKVAR-VALUE-AC .LVAR>>>
+ <EMIT ,INST-ASHL <MA-IMM 3> <MA-REG .VAC>
+ <MA-REG <SET VAC <GET-AC PREF-VAL T>>>>
+ <EMIT ,INST-ADDL2 <MA-REG .VAC> <MA-REG ,AC-TP>>)
+ (ELSE
+ <EMIT ,INST-ASHL <MA-IMM 3> <VAR-VALUE-ADDRESS .AMT>
+ <MA-REG <SET VAC <GET-AC PREF-VAL T>>>>
+ <EMIT ,INST-ADDL2 <MA-REG .VAC> <MA-REG ,AC-TP>>)>
+ NORMAL>
+
+<DEFINE NTHU-GEN (STRUC NUM RES "OPTIONAL" (HINT <>))
+ <CALL-RTE ,INTHU!-MIMOP CALL .RES .HINT .STRUC .NUM>
+ NORMAL>
+
+<DEFINE RESTU-GEN (STRUC NUM RES "OPTIONAL" (HINT <>))
+ <CALL-RTE ,IRESTU!-MIMOP CALL .RES .HINT .STRUC .NUM>
+ NORMAL>
+
+<DEFINE PUTU-GEN (STRUC NUM VAL "OPTIONAL" (HINT <>))
+ <CALL-RTE ,IPUTU!-MIMOP CALL <> <> .STRUC .NUM .VAL>
+ NORMAL>
+
+<DEFINE ATIC-GEN (ARG "OPTIONAL" (RES <>) (HINT <>))
+ <CALL-RTE ,IATIC!-MIMOP CALL .RES .HINT .ARG>
+ NORMAL>
+
+<DEFINE PFRAME-GEN (FRM RES "OPTIONAL" HINT "AUX" VAC TAC NPL TLAB)
+ #DECL ((FRM) VARTBL (RES) <OR ATOM VARTBL>)
+ <SET TAC <GET-AC>>
+ <SET VAC <LOAD-VAR .FRM VALUE <> ANY-AC>>
+ <EMIT ,INST-MOVL <MA-DISP .VAC -12> <MA-REG .VAC>>
+ <SET TLAB <MAKE-LABEL>>
+ <EMIT-LABEL .TLAB T>
+ <EMIT ,INST-TSTB <MA-DISP .VAC -1>>
+ <SET NPL <MAKE-LABEL>>
+ <GEN-BRANCH ,INST-BLSS .NPL <>>
+ <EMIT ,INST-MOVL <MA-DISP .VAC -4> <MA-REG .VAC>>
+ <GEN-BRANCH ,INST-BRB .TLAB UNCONDITIONAL-BRANCH>
+ <EMIT-LABEL .NPL <>>
+ <EMIT ,INST-MOVL <TYPE-WORD FRAME> <MA-REG .TAC>>
+ <DEST-PAIR .VAC .TAC .RES>
+ NORMAL>
+
+<DEFINE ARGS-GEN (FRM "OPTIONAL" (RES <>) (HINT <>))
+ #DECL ((FRM) VARTBL)
+ <CALL-RTE ,IARGS!-MIMOP CALL .RES .HINT .FRM>>
+
+<DEFINE VALUE-GEN (VAL RES "OPTIONAL" HINT "AUX" VAC)
+ #DECL ((RES) <OR ATOM VARTBL>)
+ <SET VAC <GET-AC>>
+ <MOVE-VALUE .VAL .VAC>
+ <DEST-DECL .VAC .RES FIX>
+ NORMAL>
+
+<DEFINE OBJECT-GEN (TYP CNT VAL RES "AUX" TAC VAC (TDONE? <>))
+ <COND (<==? .RES STACK>
+ <COND (<TYPE? .TYP VARTBL>
+ <EMIT-PUSH <VAR-VALUE-ADDRESS .TYP> WORD>)
+ (<EMIT-PUSH <MA-IMM .TYP> WORD>)>
+ <COND (<TYPE? .CNT VARTBL>
+ <EMIT-PUSH <VAR-VALUE-ADDRESS .CNT> WORD>)
+ (<EMIT-PUSH <MA-IMM .CNT> WORD>)>
+ <COND (<TYPE? .VAL VARTBL>
+ <EMIT-PUSH <VAR-VALUE-ADDRESS .VAL> LONG>)
+ (<EMIT-PUSH <MA-IMM .VAL> LONG>)>)
+ (T
+ <SET TAC <GET-AC DOUBLE T>>
+ <COND (<NOT <TYPE? .CNT VARTBL>>
+ <COND (<==? .CNT 0>
+ <SET TDONE? T>
+ <COND (<TYPE? .TYP VARTBL>
+ <EMIT ,INST-MOVZWL <VAR-VALUE-ADDRESS .TYP>
+ <MA-REG .TAC>>)
+ (T
+ <EMIT-MOVE <MA-IMM .TYP> <MA-REG .TAC> LONG>)>)
+ (<NOT <TYPE? .TYP VARTBL>>
+ <SET TDONE? T>
+ <EMIT-MOVE <MA-IMM <ORB .TYP <LSH .CNT 16>>>
+ <MA-REG .TAC> LONG>)>)>
+ <COND (<NOT .TDONE?>
+ <EMIT ,INST-MOVW <COND (<TYPE? .CNT VARTBL>
+ <VAR-VALUE-ADDRESS .CNT>)
+ (<MA-IMM .CNT>)> <MA-REG .TAC>>
+ <EMIT ,INST-ASHL <MA-LIT 16> <MA-REG .TAC> <MA-REG .TAC>>
+ <EMIT ,INST-MOVW <COND (<TYPE? .TYP VARTBL>
+ <VAR-VALUE-ADDRESS .TYP>)
+ (<MA-IMM .TYP>)> <MA-REG .TAC>>)>
+ <EMIT ,INST-MOVL <COND (<TYPE? .VAL VARTBL>
+ <VAR-VALUE-ADDRESS .VAL>)
+ (<MA-IMM .VAL>)>
+ <MA-REG <SET VAC <NEXT-AC .TAC>>>>
+ <DEST-PAIR .VAC .TAC .RES T>)>
+ NORMAL>
+
+<DEFINE NTH1-GEN (VAL RES "OPTIONAL" (HINT <>))
+ <CALL-RTE ,CINTH!-MIMOP CALL .RES .HINT .VAL>>
+
+<DEFINE REST1-GEN (VAL RES "OPTIONAL" (HINT <>))
+ <CALL-RTE ,CIRST!-MIMOP CALL .RES .HINT .VAL>>
+
+<DEFINE EMPTY?-GEN (VAR DIR LABEL "AUX" XLABEL)
+ #DECL ((VAR) VARTBL (DIR LABEL) ATOM)
+ <CALL-RTE ,CIEMP!-MIMOP CALL <> <> .VAR>
+ <COND (<==? .DIR +>
+ <GEN-BRANCH ,INST-BRB <SET XLABEL <MAKE-LABEL>>
+ UNCONDITIONAL-BRANCH <> T>)>
+ <GEN-BRANCH ,INST-BRB .LABEL UNCONDITIONAL-BRANCH <> <==? .DIR ->>
+ <COND (<==? .DIR +> <EMIT-LABEL .XLABEL <>>)>>
+
+<DEFINE GASSIGNED?-GEN (VAL RES "OPTIONAL" (HINT <>))
+ <CALL-RTE ,CIGAS!-MIMOP CALL .RES .HINT .VAL>>
+
+<DEFINE MONAD?-GEN (VAR DIR LABEL "AUX" XLABEL)
+ #DECL ((VAR) VARTBL (DIR LABEL) ATOM)
+ <CALL-RTE ,CIMON!-MIMOP CALL <> <> .VAR>
+ <COND (<==? .DIR +>
+ <GEN-BRANCH ,INST-BRB <SET XLABEL <MAKE-LABEL>>
+ UNCONDITIONAL-BRANCH <> T>)>
+ <GEN-BRANCH ,INST-BRB .LABEL UNCONDITIONAL-BRANCH <> <==? .DIR ->>
+ <COND (<==? .DIR +> <EMIT-LABEL .XLABEL <>>)>>
+
+<DEFINE FGVAL-GEN (VAL RES "OPTIONAL" (HINT <>))
+ <CALL-RTE ,CIGVL!-MIMOP CALL .RES .HINT .VAL>>
+
+<DEFINE ACALL-GEN (SBR NARG "OPT" (RES <>) (HINT <>))
+ <CALL-RTE ,IACALL!-MIMOP CALL .RES .HINT .SBR .NARG>>
+
+; "return 0 if pointer is not to stack; 1 if to unused stack area; -1 if to
+ actual stack"
+<DEFINE ON-STACK?-GEN (OBJ RES "OPTIONAL" (HINT <>) (LABEL <MAKE-LABEL>) TAC)
+ #DECL ((OBJ) VARTBL)
+ <SET TAC <GET-AC PREF-VAL T>>
+ <LOAD-CONSTANT .TAC 0>
+ <DEST-DECL .TAC .RES FIX>
+ <EMIT ,INST-CMPL <MA-ABS ,STKBOT-LOC> <VAR-VALUE-ADDRESS .OBJ>>
+ <GEN-BRANCH ,INST-BGTR .LABEL <>> ; "Below stack"
+ <EMIT ,INST-CMPL <MA-ABS ,STKTOP-LOC> <VAR-VALUE-ADDRESS .OBJ>>
+ <GEN-BRANCH ,INST-BLSS .LABEL <>> ; "Above stack area"
+ <LOAD-CONSTANT .TAC 1> ; "Assume loser"
+ <EMIT ,INST-CMPL <MA-REG ,AC-TP> <VAR-VALUE-ADDRESS .OBJ>>
+ <GEN-BRANCH ,INST-BLSS .LABEL <>> ; "Above top of stack"
+ <LOAD-CONSTANT .TAC -1>
+ <EMIT-LABEL .LABEL <>>
+ NORMAL>