" 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>