" 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 /. Note sexy AOS and SOS generator. Also note bug causing result to be left in AC even if not wanted." ) REG1 T1 (ATYP '![/ * - +!]>>) TT (MODE 1) (TEM <1 .K>) SEGF SHFT TRIN (COM <==? .ATYP 3>>) INA (DONE <>) (NEGF <>) (ONO .NO-KILL) (NO-KILL .NO-KILL)) #DECL ((NOD TEM TT) NODE (K) (ATYP MODE) FIX (REG1 REG) DATUM (WHERE COM) ANY (NO-KILL) ) > > .NO-KILL>> FIX> ;"All this hair to try for AOS or SOS." <==? .ATYP 2>> ;"+ or - only." <==? 2> <==? >> ,LVAL-CODE> <==? >> ,QUOTE-CODE> <==? 1> >>> <==? > ,SET-CODE> <==? > > >>> >>>> >> AC> .INA>> AC> .INA>>)> ,INACS <>> ! AC> .REG> (>)) (<==? ANY-AC> > (>)) (ELSE <2 .WHERE>>> ())> ! <> <1 >>>>> ,INACS .REG> 2> DATUM>>) (ELSE .REG)> .AG>) ( FIX> <==? 2> <==? > ,QUOTE-CODE>> <==? <1 .TRANSFORM>> > > 2> <==? <3 .TRIN> <- >>) (ELSE >)>>>>> 2 1> 3 <- >>) (ELSE >)>>) ( > 4> <==? <5 .TRIN> >>>>> 4 4> 5 >>) (ELSE <>)>> .WHERE> .AG>) (>> ,SEG-CODE> 2) (ELSE 0)> >) (<==? .ATYP 2> <- >>) (ELSE 0)> 2) (ELSE 4)>) (ELSE 0)> >) (ELSE 1)> 0 0>)) #DECL ((TRANSFORM) ) AC> >> ANY-AC>) (ELSE .REG)>>> > .AG>)>> <3 .TRANSFORM>>>)>)> >> ,SEG-CODE> >> > ANY-AC>>> >>>) (ELSE AC> >> ANY-AC>) (ELSE .REG)>>> FLOAT> >)> ATOM> >> >> ,SEG-CODE> >> > ANY-AC>>) (ELSE > > 2) (ELSE 1)> 0 0 0 0 0 0>> )>) (COM .COM)) #DECL ((N) (NXT REG) DATUM (MODE) FIX (NN) NODE (TRANSFORM) ) .NN .REG .NXT .MODE 0>> ) (ELSE >>> > >>> > FIX> >> )>) (<==? > FLOAT> >> )> AC>> AC>> )> > <==? .MODE 1> <==? ,QUOTE-CODE> >>> ) (ELSE > > <- 3 .ATYP>) (ELSE .ATYP)> .REG .NXT > <==? >> .MODE>>)>)>> > <==? <1 .TRANSFORM> > >>>> 1 1>) (ELSE >>)>)> > )) #DECL ((D1 D2) DATUM) <==? .ACQ >> > >>> )>> >) (ELSE )>)> .D2> .REG> > .SHFT) (ELSE <- .SHFT>)>>>> ) (TG ) (LOOP ) RAC) #DECL ((N) NODE (ATYP SL MD) FIX (REG REG2) DATUM (RAC SAC) AC) FIX> 1) (ELSE 2)>> > >> AC> > .REG>) (ELSE > )> >> > <==? .DEFLT 1> > > )> <==? .ATYP 4>> >) (ELSE )>) (ELSE <==? .TYP 2> >> > > >> >)> )> .MD> 1) (ELSE 2)>> ()>>) (ELSE [
]>>)>> .TG>>) (<==? .STYP LIST> ()>> .TG>>) (ELSE '[<2 (2)>]>> .TG>>)>> .TG>>) (ELSE .TG>>)>> <==? .TYP 1>> > > .SAC .STYP> >> >> ) (ELSE 0) (ELSE 1)> ()>)>> > .OFFS .ADD>> .OFFS .ADD>>) (ELSE .MD> .ATYP>> >> .OFFS .ADD>>)>> 0) (ELSE 1)> ()>>> " Do the actual arithmetic code generation here with all args set up." AC> > ,LAST-AC> <==? > 1>> >>>>) (> .TT>>>) ( AC> ,LAST-AC> >>> >>> > 1>> )>) (ELSE )> > >>>>> >) ( AC>> )> ,ACPROT T> > .MODE> .ATYP>> .REG>> > >) (ELSE > !>>)> >> ,ACPROT <>> > 1>>> .REG2) (ELSE .REG)>>> >) (K ) REG (MODE 1) REG1 SEGF (C 6>) TEM (ONO .NO-KILL) (NO-KILL .ONO)) #DECL ((NOD) NODE (MODE C) FIX (MAX?) ANY (REG) DATUM (K) (NO-KILL) ) .NO-KILL>> .WHERE>> >> ,SEG-CODE> >> > ANY-AC>>> > >>>) (ELSE > FLOAT> >)> ,SEG-CODE> >> > ANY-AC>>) (ELSE > )>)) #DECL ((NXT REG) DATUM (N) NODE (MODE) FIX) .N .REG .NXT .MODE 0>> ) (ELSE > FIX> >> )>) (<==? > FLOAT> >> )> AC>> AC>> )> AC> .REG>)> ;"Make sure in AC" ,ACPROT T> > > > ,ACPROT <>> )>> > > >) NUM (TRIN <>) (ABSFLG <==? ABS>) TEM T2 (DONE <>)) #DECL ((N K1) NODE (NUM) DATUM (TEM) (TRANSFORM) TRANS) )) #DECL ((TRANSFORM) ) ,LNTH-CODE> > ) (ELSE DONT-CARE)>>> >>> .ACT>)>> <==? <1 .TRANSFORM> > > >)> )) #DECL ((W) LIST) >) ( > AC> <==? ANY-AC>>> ) (ELSE >)>>> >>>> AC> .NUM>> !>>) (ELSE 1 1>)> ) ( AC>> >>>> AC> .NUM>> !>>) (ELSE 1 1>)> ) (>>> 1 1> ) (ELSE > >>> >) (ELSE > >> <==? >> .TEM> > !>> .NUM> )> ANY-AC> >) ( AC> .TEM>)> >)> ,ACLINK (.TEM !>)> .TEM> > !>>)> )>> > DONT-CARE>) NN (N2 >> DONT-CARE>) TEM T1 TT (ACE ,LAST-AC) (ACD ,LAST-AC-1)) #DECL ((N) NODE (N1 N2) DATUM (ACE ACD TT T1) AC) ,QUOTE-CODE> >> >> .N1> > 1>>>) (ELSE >> ) (> >>>) (> AC> .ACE> >>>> ) (ELSE 1>> <>>)>) (ELSE > )> 1>>> ,ACPROT T> > > .N1> 1>>>> )> .N1> > >> > >>)> > > > ) (A1 <1 .K>) (A2 <2 .K>) W1 W2 AC1) #DECL ((N A1 A2) NODE (K) (W1 W2) DATUM (AC1) AC) ,QUOTE-CODE> ;" LSH-ROT by fixed amount" > .W1> .W1> > >>) (ELSE ,SNODES> ,SNODES>> >> > >) (ELSE > >)> .W1> > > > ( AC>>)>> )> > >) TEM1 (RT ) BR TEM) #DECL ((N NUM) NODE (TEM TEM1) DATUM (BR) ATOM) ) (<==? FIX> >>> .TEM> ) (ELSE > >> >>> .TEM> > >> .TEM1> )>> >) (RT ) TEM TEM1 BR) #DECL ((N NUM) NODE (TEM TEM1) DATUM (BR) ATOM) FIX> ) (<==? .RT FLOAT> >> .TEM> ) (ELSE > >> >>> .TEM> > >> .TEM1> )>> ) "AUX" TT T RTM) #DECL ((DAT) DATUM (T) AC) >) (> .TT>>>) ( AC> > 1>> ) (ELSE )> > 1>> ,ACPROT T>> > 1>> ,ACPROT <>> 1>>>> >> )> 131072>> 172>> 155>> 1>> 1>>> .DAT>> ) "AUX" TEM TT (ACE ,LAST-AC) (ACD ,LAST-AC-1) T1 NXTAC) #DECL ((DAT) DATUM (ACE ACD TT TEM) AC) >> ) (> >>>) (> AC> .ACE> >>>>) (ELSE 1>> <>>)>) (ELSE > )> 1>>> ,ACPROT T> > > .DAT> > )> .DAT> >> )> 256>> >> () -163>> .DAT>> >>> >> > -1) (ELSE 1)>>>> >> ) "AUX" TT (W2 DONT-CARE) ( >> >) (ELSE .WHERE)>) TAG2) #DECL ((NOD) NODE (TT) DATUM) NO-RETURN> ,NO-DATUM) (> > .NOD .WHERE .NF .TAG .TF>) (.NF > > > ) (> .TT .TF > .WHERE>> .TT)>) (ELSE > > > )>> ,LNTH-CODE> <==? >>> LIST>>> ) (BRANCH <>) (DIR <>) "AUX" (REG ,NO-DATUM) (NN <1 >) (TRANSFORM >>)) #DECL ((TRANSFORM) (NOD NN) NODE (REG) DATUM) >> >>>>> 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>) ( <==? .NUM -1>> 1?> <==? >>> FIX>>> )> <1?-TEST .N .W .NF .BR .DI .REG .NEG>) (ELSE )>> ) B2 (RW .WHERE) (ARG <1 >) (SDIR .DIR) (ATYP >) (LDAT <>) S TT) #DECL ((NOD ARG) NODE (REG) DATUM (LDAT) (S) SYMTAB) > ,0-TST-CODE> >) (ELSE > >)>)>)> AC>> .ATYP <==? ,LVAL-CODE> >> > <2 >> 0>> >>> ,ACRESIDUE (.S)>)> >> >> > ) (ELSE > > .WHERE> .RW>> .RW)>) (ELSE >> > >> > .LDAT> .WHERE> >> > .WHERE> )>> ) > AC> >> .BR>>) (ELSE >> >) (ELSE 0)> !>> )>> ) (BRANCH <>) (DIR <>) "AUX" (REG ,NO-DATUM) (NN <1 >) (TRANSFORM >>)) #DECL ((NOD NN) NODE (REG) DATUM (TRANSFORM) ) >> >>>>> ) B2 (RW .WHERE) (K <1 >) (SDIR .DIR) (NM <>) (ATYP >) (RFLG ) (SDIR .DIR)) #DECL ((NOD K) NODE (REG) DATUM) ANY-AC>>> >> > >> > )> > ) (ELSE )> ) (ELSE > .B2 .SBR .NEG .NM>) (ELSE .B2 .NEG> .B2 .SBR .NEG .NM>)> .WHERE> .RW>> .RW)>) (ELSE > )> > >> > .SBR .NEG .NM>) (ELSE > .NEG> )> .WHERE> >> > .WHERE> )>> (TYP BR) ATOM) FIX> >> >> > > >> ) (ELSE .REG> >> > .BR>>)>) (ELSE > >> )>> `CAME ) (ELSE `CAMN )> > >> )>> )) #DECL ((DAT) DATUM (LABGOOD) ATOM) >> >> >> > ) (BRANCH <>) (DIR <>) "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 (REGT) DATUM (TRANSFORM) (TRANS1) TRANS (NO-KILL) ) FLUSHED) (ELSE )>> ,QUOTE-CODE> ,SNODES>> > ,SNODES>>> ,LVAL-CODE> >> 2> <2 .TEM>) (ELSE T)> > .TEM> >> .NO-KILL>>> <>) !.NO-KILL)>)> >> >>)> >> >> ANY-AC>> ,QUOTE-CODE> >> DONT-CARE) (.ATYP2 ) (ELSE )>> ,QUOTE-CODE> <==? .ATYP2 FLOAT>>) (ELSE > .S>> 6 1> 7 0>)> > >)> AC> > AC> >> )> ) (ELSE )>) (ELSE >)>) (ELSE <0? > <1? >> > .S>>)> 2 1> 3 >>)> ) (ELSE > )> > .TRANSFORM>) (ELSE )> >>>>> .TA>)> >>> >> > .ATYP2 .ATYP .REGT2 .REGT )> >)>> .WHERE> .RW>> .RW)>) (ELSE > .ATYP2 .ATYP .REGT2 .REGT .NOTF >> .WHERE> >> > .WHERE> )>> ) B2 (SBR )) #DECL ((NOD) NODE (REG) DATUM (NUM) ) FLUSHED) (ELSE )>> >)> >> > > .REG )> >)>> .WHERE> .RW>> .RW)>) (ELSE > >> >)> > .REG .NOTF >> .WHERE> >> > .WHERE> )>> (SB T1 T2 BR) ATOM) >> ) (<==? FIX> >> ) (ELSE > )> AC> > ,ACPROT T> >> > > > >>>