X-Git-Url: https://jxself.org/git/?p=pdp10-muddle.git;a=blobdiff_plain;f=mim%2Fdevelopment%2Fmim%2Fmimc%2Fcargen.mud;fp=mim%2Fdevelopment%2Fmim%2Fmimc%2Fcargen.mud;h=9dd0aa3bfd79477797deef38d609fe2b5a9c2171;hp=0000000000000000000000000000000000000000;hb=d73ace3f3292e320b461b8fcd2e9f5dc5d9684d7;hpb=d530283ea60fb0ddcc28e9c5bd072456afe06e07 diff --git a/mim/development/mim/mimc/cargen.mud b/mim/development/mim/mimc/cargen.mud new file mode 100644 index 0000000..9dd0aa3 --- /dev/null +++ b/mim/development/mim/mimc/cargen.mud @@ -0,0 +1,1103 @@ + + + + + + + +" This file contains analyzers and code generators for arithmetic + SUBRs and predicates. For convenience many of the SUBRs that are +similar are combined into one analyzer/generator. For more info +on analyzers see SYMANA and on generators see CODGEN. +" + +"A type TRANS specifies to an inferior node what arithmetic transforms are +prohibited, permitted or desired. A transform consists of 3 main elements: +a NODE, an input, an output. The input and output are UVECTORS of 7 fixes: + +1) negative ok 0-no, 1-ok, 2-pref +2) + or - const ok 0-no, 1-ok, 2-pref +3) const for + or - +4) * or / const ok 0-no, 1-* ok, 2-* pref, 3-/ ok, 4-/ pref +5) hw ok 0-no, 1-ok, 2-pref +6) hw swapped also 0-no, 1-ok, 2-pref +" + +> + +> + +> + + (N NN) NODE (CD1 CD) FIX (L) LIST) + )) + )> + >>> )> + >>> + > + >>>>> + > + >>> ,QUOTE-CODE> + <==? .CD1 ,QUOTE-CODE>> + >> + >> + + ) + (<==? .CD ,QUOTE-CODE> ) + (> + + + >> + + >> 2> <2 .TT>) + (ELSE T)> + > + + .TT> >> + .L>>> + <>) !.L)>)> + + + )>)> + >>> + > )> + .K> + .L> + +" Generate code for +,-,* and /." + +) REG1 T1 + (ATYP + '[/ * - +]> + VECTOR>>) + TT (MODE 1) (TEM <1 .K>) SEGF SHFT TRIN + (COM <==? .ATYP 3>>) INA + (DONE <>) (NEGF <>) (ONO .NO-KILL) + (NO-KILL .NO-KILL) TRAN) + #DECL ((NOD TEM TT) NODE (K) (ATYP MODE) FIX + (WHERE COM) ANY (NO-KILL) + (TRANSFORM TRAN) TRANS) + > + + .NO-KILL>> + FIX> + <==? 2> + <==? > ,QUOTE-CODE>> + + <==? <1 >> + > + + > + 2> + <==? <3 .TRIN> + + <- > FIX>>) + (ELSE >)>>>>> + 2 1> + 3 + <- > FIX>>) + (ELSE >)>>) + ( + > + 4> + <==? <5 .TRIN> >>>>> + 4 4> 5 >>) + (ELSE <>)>> + .WHERE> .AG>) + (>> ,SEG-CODE> + 2) (ELSE 0)> + >) + (<==? .ATYP 2> <- > + FIX>>) + (ELSE 0)> + + 2) (ELSE 4)>) + (ELSE 0)> + >) (ELSE 1)> + 0 + 0>)) + #DECL ((TRANSFORM) ) + > + + + > + .AG>)>> + <3 .TRANSFORM>>>)>)> + >> ,SEG-CODE> + >> >>> + + >>) + (> + 0>> + >) + (ELSE .WHERE)>> + .REG1 + 1 + >>>) + (ELSE + > + + + 2>> + ) + (<==? .WHERE DONT-CARE> >>)> + >>> + >>)> + FLOAT> )>)> + + >> ,SEG-CODE> + + >>>) + (ELSE + > + > 2) + (ELSE 1)> + 0 + 0 + 0 + 0 + 0 + 0>> + )>) (COM .COM) + (LAST >)) + #DECL ((N) (MODE) FIX (NN) NODE + (TRANSFORM) ) + > 1>> + >>>)> + .NN .REG .NXT .MODE 0>> + ) + (ELSE + + >>> + > + >>> + + > FIX> + >>)>) + (<==? > FLOAT> + >> + )> + + <==? .MODE 1> + <==? ,QUOTE-CODE> + >>> + >) + (ELSE + > + > + <- 3 .ATYP>) + (ELSE .ATYP)> + .REG + .NXT + .MODE + .LAST + .WHERE>>)> + )>> + > + + <==? <1 > > + >>>> + 1 1>) + (ELSE )>)> + + > + + )> + 0>> + + .DAT) + ( ) + (ELSE .DAT)>> + + .SHFT) (ELSE <- .SHFT>)> + > + > + + ) + ( .W) + (ELSE .W)>) + ( .REG) + (ELSE >)>>> + .REG> + +) (TG ) + (LOOP ) RAC) + #DECL ((N) NODE (ATYP SL MD) FIX) + FIX> 1) (ELSE 2)>> + > + >> + + <==? .DEFLT 1> > + + FIX) (ELSE FLOAT)>)> + )> + <==? .ATYP 4>> + > + + >) + (ELSE )>) + ( <==? .TYP 2>> + >>)> + )> + + + + + .MD> + + 1) (ELSE 2)>> + + ) + (<==? .STYP UVECTOR> + ) + (ELSE + )>> + + + + >) + (<==? .STYP VECTOR> + + >) + (ELSE + + >)>> + + + ) + (<==? .STYP VECTOR> + ) + (ELSE + )>> + +)) + #DECL ((TYP MD ATYP) FIX) + <==? .TYP 1>> + + + ) + (ELSE )> + > + +)) + #DECL ((MD ATYP) FIX) + + > .RAC .ADD + .TG> + + ) + (ELSE + .ATYP>> + FIX) (ELSE FLOAT)>)>)>> + + >)> + ) + (<==? .STYP VECTOR> ) + (ELSE )> + .RAC> + + + +]>> + +" Do the actual arithmetic code generation here with all args set up." + + .ATYP>> + > + > + + FIX) + (ELSE FLOAT)>>) + ( + FIX) + (ELSE FLOAT)>> .W) + (ELSE .W)>) + (> .REG) + ( 1>> + .REG) + ( 1>> + FIX) + (ELSE FLOAT)>> + .W) + (ELSE + + FIX) + (ELSE FLOAT)>>)>> + '(`TYPE FLOAT))(ELSE '(`TYPE FIX))>> + .REG> + +>) (K ) REG + (MODE 1) REG1 SEGF (C 6>) TEM + (ONO .NO-KILL) (NO-KILL .ONO)) + #DECL ((NOD) NODE (MODE C) FIX (MAX?) ANY (K) + (NO-KILL) ) + .NO-KILL>> + >> + >> ,SEG-CODE> + >> >>> + > > + >>> + ) + (ELSE + > + FLOAT> >)> + + ,SEG-CODE> + + >> >>) + (ELSE > )>) TG) + #DECL ((N) NODE (MODE) FIX) + .N .REG .NXT .MODE 0>>) + (ELSE + + > FIX> + >>)>) + (<==? > FLOAT> + >> + )> + .REG .NXT - + >> + FLOAT) + (ELSE FIX)>)> + + )>> + > + + > + +>) NUM (TRIN <>) + (ABSFLG <==? ABS>) (DONE <>) W1 + TG (RT )) + #DECL ((N K1) NODE (TRANSFORM) TRANS) + )) + #DECL ((TRANSFORM) ) + DONT-CARE) (ELSE .W)>>> + >>> + .ACT>)>> + + <==? <1 .TRANSFORM> > + > + >)> + >>> + 1 1> + ) + (ELSE + .RT>) + ( 1>> + ) + (ELSE >)> + + >>)> + > .RT> + + + >) + (ELSE + + + 1>> + ) + (<==? .W DONT-CARE> >)> + + )>)> + .W)>> + + FIX> ) + (<==? FLOAT> + ) + (ELSE + > + > + > + + + + >> + >)> + + )>> + + + FIX> + ) + (<==? FLOAT> + ) + (ELSE + > + > + > + + + + >>> + >)> + + )>> + +>) (N2 <2 >) + W1 W2) + #DECL ((N) NODE) + ,QUOTE-CODE> + >> + >> + FIX> 1> = + + + .W) + (<==? .W DONT-CARE> + >) + (ELSE .W)>>) + (ELSE + ,SNODES> + ,SNODES>> + >> + > + > + >) + (ELSE + > + > + >)> + > + > + >) + ( )> + )> + .W> + +> + +> + +) (A1 <1 .K>) (A2 <2 .K>) W1 W2) + #DECL ((N A1 A2) NODE (K) ) + ,QUOTE-CODE> + ;" LSH-ROT by fixed amount" + > + > + >) + ( )> + = .W '(`TYPE FIX)>) + (ELSE + ,SNODES> + ,SNODES>> + >> + > + > + >) + (ELSE + > + > + >)> + > + > + >) + ( )> + )> + .W> + +>) TEM1 (RT ) TG + TEM) + #DECL ((N NUM) NODE (TG) ATOM) + + + ) + (<==? FIX> + > + > + >) + ( )> + + .W) + (ELSE + > + > + ANY>> + >>) + (ELSE )> + > + > + + + + ) + (ELSE .W)>)>> + +>) (RT ) TEM TEM1 + BR) + #DECL ((N NUM) NODE (BR) ATOM) + FIX> + + ) + (<==? .RT FLOAT> + > + > + >) + ( )> + + .W) + (ELSE + > + > + ANY>> + >>) + (ELSE )> + > + > T> + + + ) + (ELSE .W)>)>> + + ) + (ELSE + + .W)>> + +>)) + ) + (ELSE + + .W)>> + +>>> + + VECTOR>>> + > -1) (ELSE 1)>>>> + + + + 0>> + + ,LNTH-CODE> + <==? >>> LIST>>> + +) (BRANCH <>) (DIR <>) (SETF <>) + "AUX" (REG ,NO-DATUM) (NN <1 >) + (TRANSFORM + >>)) + #DECL ((TRANSFORM) (NOD NN) NODE) + > + >)> + + >>> + .SETF>> + + 0) + (ELSE 1)>> + + ] + TRANS>> + +) (NN >)) + #DECL ((TR) TRANS (N) FIX (X) ) + > >> >>> + >) + (<==? .NN L=?> >)>)> + >> >)> + >> >>)> + 2> >>) + (>> >>)> + >> + FIX>> + >> + .N> FIX>>)>)> + .N> + +) FLG) + #DECL ((TR) TRANS) + >> 2) (ELSE 0)> + >>> 2) (ELSE 0)> + ) (ELSE 0)> + 2>> 4) + (>>> 2) + (ELSE 0)> + ) (ELSE 1)> + >> 2) (ELSE 0)> + >> 2) (ELSE 0)>>> + + (N) NODE) + ) + (<0? .NUM> <0-TEST1 .N .W .NF .BR .DI .REG .NEG .SF>) + ( <==? .NUM 1.0> <==? .NUM -1>> + 1?> + <==? >>> FIX>>> + )> + <1?-TEST .N .W .NF .BR .DI .REG .NEG .SF>) + (ELSE )>> + +) B2 (RW .WHERE) + (ARG <1 >) (SDIR .DIR) + (ATYP >) (LDAT <>) S TT) + #DECL ((NOD ARG) NODE (S) SYMTAB) + >) (ELSE .WHERE)>> + ,0-TST-CODE> >) + (ELSE + > + >)>)>)> + >> + >> + > .WHERE>>)> + + + ,NO-DATUM) + (ELSE + > + > + + + >) + (ELSE .RW)>>> + + + .RW)>) + (ELSE + >> + > .ATYP> + .WHERE> + >> + + > .WHERE> + + )>> + + + VECTOR>>) + (B1 ) (B2 )) + .REG + 0) + (ELSE 0.0)> .BR + (`TYPE .ATYP)> + ) + (<==? `VEQUAL?> + .BR '(`TYPE FIX)> + ) + (ELSE + .REG 0 .BR> + )>> + + + + + + + +) (BRANCH <>) (DIR <>) (SETF <>) + "AUX" (REG ,NO-DATUM) (NN <1 >) + (TRANSFORM + >>)) + #DECL ((NOD NN) NODE (TRANSFORM) ) + > + >)> + + >>> + .SETF>> + +) B2 (RW .WHERE) + (K <1 >) (SDIR .DIR) (NM <>) + (ATYP >)) + #DECL ((NOD K) NODE) + >) (ELSE .WHERE)>> + >> + > .WHERE>>)> + + + ,NO-DATUM) + (ELSE + > + .B2 .SBR .NEG .NM> + .WHERE> .RW>> + + + .RW)>) + (ELSE + >) + (ELSE .WHERE)>> + > + .SBR + .NEG + .NM> + .WHERE> + >> + + > .WHERE> + + )>> + +) (LBL2 )) + #DECL ((BR) ATOM) + <==? .TYP FLOAT>> + >)> + + VECTOR>>>>> + .REG + ) + (ELSE )> + <2 .TEM> + .BR + (`TYPE .TYP)> + ) + (ELSE + > + + + + + '(`TYPE FLOAT)> + ) + (ELSE )> + + > + + + .BR + '(`TYPE FIX)> + + )>> + +) (BRANCH <>) (DIR <>) (SETF <>) + "AUX" (K <1 >) (K2 <2 >) REGT REGT2 + (S >) TRANSFORM ATYP ATYP2 B2 + (SDIR .DIR) (RW .WHERE) TRANS1 (FLS <==? .RW FLUSHED>) + TEM (ONO .NO-KILL) (NO-KILL .ONO) + "ACT" TA) + #DECL ((NOD K K2) NODE (TRANSFORM) (TRANS1) TRANS + (NO-KILL) ) + FLUSHED) + (<==? .WHERE DONT-CARE> >) + (ELSE .WHERE)>> + ,QUOTE-CODE> + ,SNODES>> + > + ,SNODES>>> + ,LVAL-CODE> + >> 2> + <2 .TEM>) + (ELSE T)> + > + + .TEM> >> + .NO-KILL>>> + <>) !.NO-KILL)>)> + + >> + >>)> + >> + >> + ,QUOTE-CODE> + <==? .ATYP2 FIX>> >) + (ELSE DONT-CARE)>>> + + + >)> + > + <==? .ATYP FIX>> >) + (ELSE DONT-CARE)>>>) + (ELSE + <==? 0>> + > .S>>)> + + 2 1> 3 >>)> + ) (ELSE >)> + + > .TRANSFORM>) + (ELSE )> + + >>>> + .SETF> + .TA>)> + + + ' + '>>> + >> + > .WHERE>>)> + > + .ATYP2 + .ATYP + .REGT + .REGT2 + )> + >)>> + + .WHERE> .RW>> + + + .RW)>) + (ELSE + > + .ATYP2 + .ATYP + .REGT + .REGT2 + .NOTF + >> + .WHERE>> + >> + + > .WHERE> + + )>> + +) B2 + (SBR )) + #DECL ((NOD) NODE (NUM) ) + FLUSHED) + (<==? .WHERE DONT-CARE> >) + (ELSE .WHERE)>> + >)> + >> + > .WHERE>>)> + + <> + + .REG + )> + >)>> + + .WHERE> .RW>> + + + .RW)>) + (ELSE + >> + >)> + + <> + + .REG + .NOTF + >> + .WHERE> + >> + + > .WHERE> + + )>> + +>> + > + + + >)> + + + >)>)> + >)> + >)> + + VECTOR>>>>> + .R2 + .R1 + <2 .TEM> + .BR + (`TYPE )>> + + VECTOR>>>> + + <>) + (<==? .X> FIX> .X> + )> + FIX>> + >>)>> + + ]> + +]> + (0SUBRS 0SKPS 0JSENS CMSUBRS) + + (DF-VALS) + VECTOR> + + + + + +