X-Git-Url: https://jxself.org/git/?p=pdp10-muddle.git;a=blobdiff_plain;f=mim%2Fdevelopment%2Fmim%2Fvaxc%2Flookahead.mud;fp=mim%2Fdevelopment%2Fmim%2Fvaxc%2Flookahead.mud;h=67e08c0666ed4d893fd2975b33c182b3a9233536;hp=0000000000000000000000000000000000000000;hb=d73ace3f3292e320b461b8fcd2e9f5dc5d9684d7;hpb=d530283ea60fb0ddcc28e9c5bd072456afe06e07 diff --git a/mim/development/mim/vaxc/lookahead.mud b/mim/development/mim/vaxc/lookahead.mud new file mode 100644 index 0000000..67e08c0 --- /dev/null +++ b/mim/development/mim/vaxc/lookahead.mud @@ -0,0 +1,1172 @@ + +> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +> + + + 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> \ No newline at end of file