> XR Rn,Rn is faster than SR.
> But does it matter?
> Such an instruction should be executed only once, and once only.
> It shouldn't be in the loop.

Response from hardware designer:

Here are some thoughts on the best way to zero a register.

First, on the z196 and prior generations, all of the common
instructions for zeroing a register are actually executed in the
fixed-point execution unit.  Starting with the zEC12 generation
the following instructions are actually "executed" in the
register renaming stage of the pipeline (where "R" is the
same register number for a given instruction):  XR R,R; SR R,R;
SLR R,R; LA R,0(0,0); LHI R,0 (plus other small constant values);
LGHI R,0 (plus other small constant values); SGR R,R; SLGR R,R;
XGR R,R; IIHF R,0; IILF R,0.

On the z196 and earlier processors, since they are actually
executed, use of an XR or SR may set up an unnecessary register
dependency.  For example:
....
AL   5,MEM1   Using GR5 for some prior calculation
ST   5,MEM2
...
XR   5,5      This instruction is dependent on the AL
....
So although the XR will zero the register, regardless of its
prior value, it still appears to be dependent on the AL so
it can not execute early.

Other points of interest...the XR/SR/SLR are 2-byte
instructions so they have a smaller instruction footprint, but
this is a second or third order performance effect in most
cases.  The IILF/IIHF are 6 byte instructions, so there would
be little reason to use them.

To conclude, the LHI and LGHI are probably the best overall
instructions for clearing a register on any generation processor.
I can not imagine we would ever design a machine where these
instructions were not at least as fast as XR/SR/SLR for clearing
a register, and they have some benefits on prior models.

Jim Mulder   z/OS System Test   IBM Corp.  Poughkeepsie,  NY

Reply via email to