> > OP-HINT OP-BRANCH OP-DIR ATOM> > T <> <> T]> ) (STYPE1 <>) "AUX" (L .CODPTR) INCINS NXT (OP-INFO ,OP-INFO) (ADDVAL 0) STRUC2 OFF2 (ELTYPE1 <>) (ELTYPE2 <>) (EMPTY? <>) (ARGVEC ) (ARITH? <>) (ILDB? <>) OL (IDPB? <>) NINS RES1 RES2 (RES1? <>) (RES2? <>) PINS (STYPE2 <>) AMT CMPINS TMIML (NOPUT? <>)) #DECL ((CINS) ATOM (RES) (NXT) (L) ]>> (OP-INFO) OP-INFO) .NLA>)> >) (T ) (<==? .CINS NTHUU!-MIMOP> ) (<==? .CINS NTHUS!-MIMOP> ) (<==? .CINS NTHUB!-MIMOP> ) (<==? .CINS NTHL!-MIMOP> )>)> )> <==? .CINS ILDB!-MIMOP> <==? .CINS NTHL!-MIMOP>> 3> > FORM> > ,ARITH>> > <==? <1 > .RES> <==? .RES> >> > FORM>>) (T > T)> > >> > ,PUTU> <==? .PINS PUTL!-MIMOP> > > )>> ;"In case of CHTYPE here (for rest), will fall into normal code" > .RES>) (<==? <3 .ARGVEC> .RES>)>) (T)> ) (.ARITH? ; "Work for NTH ? ADD when NTH ? ADD ? PUT can't because of life/death" > )>) (T)>> >) (T)> ) (.IDPB? STRUCTURE-TYPE>>) (<==? .PINS PUTUV!-MIMOP> ) (<==? .PINS PUTL!-MIMOP> ) (<==? .PINS PUTUU!-MIMOP> ) (<==? .PINS PUTUS!-MIMOP> ) (<==? .PINS PUTUB!-MIMOP> )> >) (.NOPUT?) (T > TYPE>>)>)> ) (>)>) (<==? .STYPE1 BYTES> ) (<==? .STYPE1 STRING> ) (<==? .STYPE1 UVECTOR> )> > >> <>) ( .OFF2)> .ADDVAL .L .ILDB? .IDPB? .STYPE1 .STYPE2)> .ELTYPE1 .ELTYPE2)>> NORMAL)>) ( <==? .CINS NTHL!-MIMOP>> 1> > FORM>> ,LENU> EMPL?!-MIMOP> ,EMPU>>>> <==? <1 >> .RES> > ; "If empty?, make sure <3 .x> isn't used after the branch. WILL-DIE? on .L won't find this, because L has already been rested past the branch." .L>> >>>>> ;"Have > or >" .OP-INFO> CONDITIONAL-BRANCH) (T > 2> > FORM> '[LESS?!-MIMOP GRTR?!-MIMOP VEQUAL?!-MIMOP]> >>> > >) (<==? .ADDVAL <2 .ARGVEC>> > > LESS?!-MIMOP> ) (<==? .CMPINS GRTR?!-MIMOP> ) (T)>)> >> ;"Have length comparison of nth.." CONDITIONAL-BRANCH) (T NORMAL)>)>) (> ILDB!-MIMOP> <==? .NINS NTHL!-MIMOP>> >> STRUCTURE-TYPE>>) (<==? .NINS NTHL!-MIMOP> ) ( 3> '["UV" VECTOR "UU" UVECTOR "US" STRING "UB" BYTES]>>>)> >>> > >> > > > > FORM> '[LESS?!-MIMOP GRTR?!-MIMOP VEQUAL?!-MIMOP]> >> .L>>> >> ;"See comment above for EMPTY?" .NLA>)> .RES> .STRUC1) (<==? <1 .ARGVEC> .RES2> .STRUC2) (<1 .ARGVEC>)> .RES> .STRUC1) (<==? <2 .ARGVEC> .RES2> .STRUC2) (<2 .ARGVEC>)> <1 .NXT> .OP-INFO .OFF1) (<==? .RES2? 1> .OFF2)> .STYPE1) (<==? .RES2? 1> .STYPE2)> .OFF1) (<==? .RES2? 2> .OFF2)> .STYPE1) (<==? .RES2? 2> .STYPE2)>> CONDITIONAL-BRANCH) ( '[GRTR?!-MIMOP LESS?!-MIMOP VEQUAL?!-MIMOP]> .RES> <==? <2 .ARGVEC> .RES>> .L>> >> .RES> ) (<==? <2 .ARGVEC> .RES> )> )> )> <1 .NXT> .OP-INFO > CONDITIONAL-BRANCH)>)>> >>> > DONE>> > )> >> >)>>> ) (RES? <>) HINT (BRANCH? <>)) #DECL ((FRM) FORM (OP-INFO) OP-INFO) > > > > > ) (.BRANCH? > ) ( <==? .X +>> ) ( ) () (T <1 .ARGVEC .X> >)>) ( TYPE> <==? <1 .X> STRUCTURE-TYPE>> ) (<==? <1 .X> BRANCH-FALSE> > ) (<==? <1 .X> BRANCH-TRUE> > )>> > .OP-INFO> ,FLUSH-NEXT) (<- ,FLUSH-NEXT <- >>)>)) #DECL ((BEG-LABEL) ATOM (ARG) ANY (MIML) LIST (N) FIX) ) ) ( 1> > FORM>> JUMP!-MIMOP> > >>>> <==? <1 .ITM> RETURN!-MIMOP> <==? <2 .ITM> .ARG>> >) (T )>) (> ATOM> > > >) (> )> .NXT> )> ) (T )> >)>) ( > 0> >> > DEAD!-MIMOP> > ; "Definitely dies if DEADed" )>) (<==? .ITM RETURN!-MIMOP> ; "Dies if not returned" .ARG>>) (<==? .ITM END!-MIMOP> ; "Dies if run out of code" ) (<==? .ITM SET!-MIMOP> .ARG> ; "Dies if SET" ) (<==? <3 .NXT> .ARG> ; "Doesn't die if something set to this" >)>) ( <==? <2 .NXT> .ARG>> ; "If doing SETLR, current value is dead" ) (T ) (T >)> ; "Unconditional jump is special case, slightly" )) > .ARG> ; "Result of something, so dead" ) (T )>) (<==? .X .ARG> ; "Arg to something, so not dead" .LEAVE>)>> .NXT> ) (> > > .LEAVE>) (>) (> )>) (T )> .LEAVE>)>) (T .LEAVE>)>> >) ( > >>> > >> LIST> <==? <1 .ITM> BRANCH-FALSE> >>> ; "Jump" > .MIML>> ; "Hair to remember who's alive/dead at each place" > ; "If you hit a jump to the label where you started, and you don't know the variable is alive, then the jump won't make it live either. If the jump is unconditional, the variable is dead." )>) (> >) (> )>) (> )> ; "If dies at branch loc, might die here" )>) (T )> >)>) (T ; "Lose, so not dead" >)>)>)>)> >>)>> \ >) (ADDRTUP2 >) TMPAC (SELF? <>)) #DECL ((NTHINS) ATOM (INCINS) (STRUC) VARTBL) <==? .OFFSET1 .OFFSET2> >> .INCINS > > >> >>>> >>>> >> >>> ; "When we're dealing with the first element of a vector via ILDB/IDPB, might as well not try anything fancy here." .NG>)> ) (T 1>> .CODPTR>)> >> PREF-VAL>>)> > > ) (>> PREF-VAL>> )>)> ; "Struc1 is now in sac1, appropriately rested; struc2 is in sac2, also rested. (Two may be same, if struc1==struc2 and not rested" > > <==? .OFFSET1 .OFFSET2> <==? .STYPE2 VECTOR>> >>> >) ( >)>)> ) ( ) (T .STRUC2)> .SELF? .STYPE1>) (T <2 .ADDRTUP2> .SELF? WORD> ;"Decrement count on length" >) (<==? .INCINS RESTUU!-MIMOP> >) ()> <1 .ADDRTUP1> <1 .ADDRTUP2> .SELF? VECTOR>) (T <==? .INCINS RESTUB!-MIMOP>> >) (> > ) ()> .TMPAC .TMPAC>) (T > ) ()> >>)> <1 .ADDRTUP2> .SELF? VECTOR>)>)> )> )> NORMAL> ) > > >) (T > > ) ( ) ()> )>) (<==? .ST1 UVECTOR> > !.ADDR2>)> ) (T ) ()> )>) (T > !.ADDR2>)> )> ) (T ) ()> )>)>)> !<2 .TUP2>>)>)>> ) RAC) )> >> > )> FLOAT) (T FIX)>>)> FIX>> ) (<==? .INS AND!-MIMOP> FIX>>)>) ( <==? .INS AND!-MIMOP>> >> )>)> ,INST-BICL3) (<==? .INS XOR!-MIMOP> ,INST-XORL3) (<==? .INS OR!-MIMOP> ,INST-BISL3)> ) ()> >) (T ,INST-BICL3) (<==? .INS XOR!-MIMOP> ,INST-XORL3) (<==? .INS OR!-MIMOP> ,INST-BISL3)> ) ()> !.ADDR2>)>) (.SELF? ,INST-BICL2) (<==? .INS XOR!-MIMOP> ,INST-XORL2) (<==? .INS OR!-MIMOP> ,INST-BISL2)> ) ()> !.ADDR1>) (T ,INST-BICL3) (<==? .INS XOR!-MIMOP> ,INST-XORL3) (<==? .INS OR!-MIMOP> ,INST-BISL3)> !.ADDR1 ) ()> >) (T ,INST-BICL3) (<==? .INS XOR!-MIMOP> ,INST-XORL3) (<==? .INS OR!-MIMOP> ,INST-BISL3)> !.ADDR1 ) ()> !.ADDR2>)>)>) (> !.ADDR1>) (.SELF? ) ( >) ( ) (.AMOUNT)> !.ADDR1>) (T ) ( >) ( ) (.AMOUNT)> !.ADDR1 >) (T ) ( >) ( ) (.AMOUNT)> !.ADDR1 !.ADDR2>)>)>> > >) (<==? .OP SUB!-MIMOP> >) (<==? .OP MUL!-MIMOP> >) (<==? .OP DIV!-MIMOP> >) (T >)> <1 .TV>) (<==? .OP SUBF!-MIMOP> <2 .TV>) (<==? .OP MULF!-MIMOP> <3 .TV>) (<==? .OP DIVF!-MIMOP> <4 .TV>)>) ( <3 .TV>) (<==? .STYPE WORD> <2 .TV>) (<1 .TV>)>> ) (FULL? <>) "AUX" IDXAC) #DECL ((TUP) (SAC) AC (OFFSET) (STYPE) ATOM) > >>) (>)> )> )>) ( <==? .STYPE LIST>> <4 .TUP ()> <2 .TUP ()> <1 .TUP ()>) (<1 .TUP ()>)>) (T <4 .TUP (>>)> <2 .TUP (>>>)> <1 .TUP (>>>)>) (<==? .STYPE UVECTOR> <1 .TUP (>>)>) (T <1 .TUP (>)>)>)>) (T >>> .FULL?> PREF-VAL>>) (T > >)> <3 .TUP .IDXAC>) ( <==? .STYPE VECTOR>> > <3 .TUP .IDXAC>)> <4 .TUP ( )> <2 .TUP ( )> <1 .TUP ( )>) (<==? .STYPE UVECTOR> <1 .TUP ( )>) (T <1 .TUP ( )>)>)>> \ ]>) ) INS (REST? <>) (PUT? <>) NINS) >> > SETLR!-MIMOP> >> > FORM> <==? <1 .NINS> PUSH!-MIMOP> <==? <2 .NINS> <2 .FROB>> >> <2 .FROB STACK> )>) (> > > <==? <3 .FROB> 1>> ;"This could be something interesting" )>)>> .L>)>> ; "Find ILDB/IDPB case, put MIMA code for it into list, kill other half of operation. Form of ops is: " ) STRUC RES OP OTHOP PUTOP) #DECL ((L) ]> (OP-INFO) OP-INFO) .OP-INFO> >> > > > > ) INS HINT) )> .OTHOP> <==? <1 .FROB> .PUTOP>>> <==? <2 .FROB> .STRUC> <==? <3 .FROB> 1>> ;"We now have the paired guy" 4>>) ( 3>>)> ) (<=? .HINT "UU"> ) (<=? .HINT "US"> ) (T )> ,PUTU>> <1 .L
>) (<3 .ARGVEC>)> ) (.RES)> .HINT>> ) (<1 .L ) (.RES)> )> .HINT>> )> ) ( >> )>> >> "Generate ILDB/IDPB-like stuff. Call with NTH/PUT inst, structure, result of nth/put, result of rest, flag, new value for put" > ) "AUX" EHINT VINS STRAC ELAC (ELTAC <>) (DOUBLE? <>) LVAR TAC VAC ELADDR (NO-TYPE? <>)) #DECL ((STRUC) VARTBL (ELVAL) ANY) .HINT>> )> > >) (<==? .HINT UVECTOR> ) (<==? .HINT BYTES> ) ()>) (<==? .HINT STRING> ) ()>)> >> PREF-VAL>>)> ;"Get structure into AC" >)> ;"Get the address to use for the thing we're putting" > >) (>)> > >> >> ;"Case where all in acs or all not in acs" >) (T >)>) ( > >> ;"Everything safely on stack" >) (T ;"Type and value live in separate places, can't MOVQ" > > >>) (T >)> >)>) (.DOUBLE? >) (>)>) (.DOUBLE? >) (>)>) (<==? .ELVAL STACK> ;"Only happens in NTH case" LONG>)> >) (<==? .ELVAL .STRUC> >) (>)>) (> > <==? .ELAC>>>>> >) (>)>) (T > > ) (T >)>)> ;"Get AC[s] for result" .VINS .PUT? .NO-TYPE?> > .ELAC .ELVAL>) (>)> )>)> NORMAL> \ >) RAC) >> PREF-VAL>>)> <> T> >> >)> > > NORMAL> >)) #DECL ((OP-INFO) OP-INFO) >> PREF-VAL>>)> <> T> >) (>)>) ( >) (T >)> ,CEQ-CODE) (<==? .CMPINS EMPL?!-MIMOP> ,CEQ-CODE) (<==? .CMPINS VEQUAL?!-MIMOP> ,CEQ-CODE) (<==? .CMPINS LESS?!-MIMOP> ,CLT-CODE) (<==? .CMPINS GRTR?!-MIMOP> ,CGT-CODE)>> <>> CONDITIONAL-BRANCH> ) (SAC2 <>) (ADDR1 >) (ADDR2 >) (SHORT? <>) TMP FC) #DECL ((ADDR1 ADDR2) ) > )> > > > LESS?!-MIMOP) (<==? .CMPINS LESS?!-MIMOP> GRTR?!-MIMOP) (T .CMPINS)>>)> >> PREF-VAL>>)> )> >> PREF-VAL>>)> ) (T )>)> >) ( >) ( > >) (T >>)>) ( LIST> > >) (T >)> >) ( > >) (T >>)>) ( LIST> > >) (T >)>) ( ;"First guy had index register" <==? .OFF1 .OFF2> .SHORT?>> <3 .ADDR1>>) (T >)> <==? .STRUC2 0>> ! <1 .ADDR2>) (<1 .ADDR1>)>>) ( <==? .STRUC2 0.0>> <1 .ADDR2>) (<1 .ADDR1>)>>) ( > <1 .ADDR1>)((.ADDR1))> ! <1 .ADDR2>)((.ADDR2))>>) (T ! <1 .ADDR1>) ((.ADDR1))> ! <1 .ADDR2>) ((.ADDR2))>>)> ,CEQ-CODE) (<==? .CMPINS LESS?!-MIMOP> ,CLT-CODE) (<==? .CMPINS GRTR?!-MIMOP> ,CGT-CODE)>> <>> CONDITIONAL-BRANCH>