!* %routine Int Unary Op(%integer Op,%record(Stkfmt)%name RHS) !*********************************************************************** !* supports INEG,IABS * !* descriptor to result on Estack * !*********************************************************************** %integer Reg,I %if RHS_form=DirVal %thenstart Reg=Checkregkey(data at,RHS_Base,RHS_Offset) %if Reg>=0 %thenstart Rform=RegVal RHS_Form=RegVal RHS_Reg=Reg %finish %finish %if Op=INEG %thenstart %if RHS_form=RegVal %thenstart Reg=RHS_Reg Gop RR(TRN,Reg,Reg) %finishelsestart Reg=Claim Reg Gop RX(LN,Reg,RHS) %finish %finishelsestart %if Op=INOT %thenstart %monitor;%stop %finishelsestart %unless Op=IABS %then Abort %monitor;%stop %finish %finish Stackr(Reg) %end;! Int Unary Op !* %routine Real Unary Op(%integer Op,%record(Stkfmt)%name RHS) !*********************************************************************** !* supports RNEG,RABS * !* descriptor to result on Estack * !*********************************************************************** %integer Reg,Bytes,I Bytes=RHS_Size %if RHS_form=DirVal %thenstart Reg=Checkregkey(data at,RHS_Base,RHS_Offset) %if Reg>=0 %thenstart Rform=RegVal RHS_Form=RegVal RHS_Reg=Reg %finish %finish %if Op=RNEG %thenstart %if RHS_form=FregVal %thenstart Reg=RHS_Reg Gop RR(TRN,Reg,Reg) %finishelsestart Reg=Claim Reg Gop RX(LN,Reg,RHS) %finish %finishelsestart %unless Op=IABS %then Abort %monitor;%stop %finish Stackfr(Reg,Bytes) %end;! Real Unary Op !* %routine Note Index(%integer Scale,%record(Stkfmt)%name Base,Index) !*********************************************************************** !* incorporate Index info into Base record * !*********************************************************************** %integer Reg,Form %switch F(0:21) %if Index_Size#4 %thenstart Convert II(Index,4) Elevel=Elevel-1 %finish %if Index_Form&31>=AddrDirMod %thenstart Reg=Load Reg(-1,Index) !# reguse(Reg)=-Elevel Index_Reg=Reg Index_Form=RegVal!Regflag %finish %if Index_Form=LitVal %thenstart Index_Intval=Index_Intval<F(Base_Form&31) !* F(IndRegVal): { ((reg)) } F(IndTempVal): { ((temp)) } F(IndDirVal): { ((dir)) } Base_Form=Base_Form+12 Set: Base_Modreg=Index_Reg Base_Modbase=Index_Base Base_Modform=Index_Form Base_Modoffset=Index_Offset Base_Scale=Scale %if Base_Modform&Regflag#0 %then DRegUse(Base_Modreg)=-Elevel %return !* F(AddrDir): { @dir } F(RegAddr): { (reg) is @ } F(TempAddr): { (temp) is @} F(DirAddr): { (dir) is @ } Base_Form=Base_Form+4 ->Set !* F(AddrDirMod): { @dir+M } F(RegModAddr): { (reg)+M } F(TempModAddr): { (temp)+M } F(DirModAddr): { (dir)+M } F(LitVal): { lit } F(ConstVal): { const } F(RegVal): { (reg) } F(TempVal): { (temp) } F(AddrConst): { @const } F(IndRegModVal): { ((reg)+M) } F(IndTempModVal): { ((temp)+M) } F(IndDirModVal): { ((dir)+M) } F(AddrDirModVal): { (@dir+M) } Reg=Load Int(Base,-1) dreguse(Reg)=-Elevel Base_Reg=Reg Base_Form=RegModAddr!regflag ->Set !* F(DirVal): { (dir) } ->F(IndDirVal) { IMP failing to Refer } !* F(FregVal): { (freg) } Abort !* %end;! Note Index