{ File Name: BumpBitAddress.mc optimization version Description: Shifts a bit address by an integer number of bits. Author: MYT Created: July 21, 1986 Edited: Sep. 18, 1986 Oct. 07, 1986 *** This is a optimization version for BumpBitAddress , it will save about 7 clicks operation from the original version. } { Copyright (C) 1986 by XEROX corporation. All rights reserved.} @BumpBitAddress: at [0A,10,ESCAn] {**************************************************************************************** POP Parameters from stack ****************************************************************************************} { Get offset, bit number, word virtual address form stack to registers } offset ← TOS,L4 ← L4.BumpBitAddress, c1;{ L4 is used for micro caller } bitnum ← STK,pop, c2; rwrdaddh ← STK,pop, c3; rwrdaddl ← STK,fXpop,fZpop,push, c1; offset ← offset + bitnum,NegBr,GOTO[BBAMainEntry], c2; {**************************************************************************************** Processing both positive and negative offset cases ****************************************************************************************} BBASubEntry: { for microcaller - TrapzInit, TrapzSubs, ChainBlt: 8 cycles total} offset ← offset + bitnum, c*; BBAMainEntry: bitnum ← offset and 0F,BRANCH [$,neg], c*;{ generate result bit number } rtmpadd ← offset and ~0F,GOTO[either], c*;{ abs(offset) <= bitnum } neg: rtmpadd ← offset or 0F, c*;{ abs(offset) > bitnum } either: rtmpadd ← rtmpadd LRot12,XHDisp, c*;{ generate result address value} rwrdaddl ← rwrdaddl + rtmpadd,CarryBr,BRANCH[testCpos,testCneg,2], c*; { check carry for positive or negative case } testCpos: BRANCH[PushBackp2,$], c*; rwrdaddh ← rwrdaddh + 1,L4Disp,GOTO[PushBackc3], c*; PushBackp2: L4Disp,GOTO[PushBackc3], c*; testCneg: BRANCH[$,PushBackn2], c*; rwrdaddh ← rwrdaddh - 1,L4Disp,GOTO[PushBackc3], c*; PushBackn2: L4Disp, c*; PushBackc3: DISP4[BumpBitAddressRet], c*; {**************************************************************************************** Push Parameters back to stack ****************************************************************************************} { Push results - bit number, word address back to stack } STK ← rwrdaddl, push, c1, at[L4.BumpBitAddress,10,BumpBitAddressRet]; STK ← rwrdaddh, c2; TOS ← bitnum,GOTO [Bank1NxtInstc1], c3;