SRP is a SS1 instruction designed to shift the digits in a packed decimal field either left or right while leaving the sign of the field fixed in its position. For right shifts, the last digit that is shifted off can be rounded using a rounding factor. As digits are shifted off during a left shift, 0s are shifted in on the right. On the other hand, as digits are shifted off during a right shift, 0s are shifted in on the left.

 

Consider the explicit format for this instruction.

As we can see from the diagram, operand 1 specifies the field to be shifted and its length, while the third operand is a rounding factor. This factor is added to the last digit which is shifted off during right shifts. Typically, you would code the third operand as 5 in order to round up on a digit of 5 or greater. Coding 0 as the third operand indicates no rounding. A rounding factor must always be coded, even when shifting left.

 

The second operand above receives special treatment. The notation D2(B2) is converted to an effective address and the last 6 bits of this address is treated as a twos complement number that indicates the number of digits to be shifted and in which direction. A positive number indicates a left shift and a negative number indicates a right shift. Because of the explicit notation, there are two standard ways to code the second operand.

 

1) Displacement Only -

SRP XPK,3,0

 

In this case the shift factor, 3, is converted to 6-bit binary (B000011) and the result is interpreted as 6-bit 2s complement. In this format B000011 is considered to be positive 3 - a left shift by 3.

 

On the other hand consider the following example,

SRP XPK,62,5

 

The 62 is converted to its binary form (B111110) and interpreted as a 6-bit 2s complement integer. We see that B111110 = -2 in base 10. This means the previous shift is a 2-digit right shift.

 

There is a simple way to deal with the shift factor on right shifts. Simply express the shift factor as 64 - n, where n is the number of digits you wish to shift to the right. For example, the previous example could be expressed as SRP XPK,64-2,5 . The 64 - n expression produces the correct decimal number which will be interpreted as a negative 2s complement integer.

 

2) Base Register Only -

SRP XPK,0(R8),5

 

In this format the base register (R8) is initialized with a number representing the shift factor. Because 0 was coded for the displacement, the effective address will be computed to be the contents of the specified register. The number of digits to be shifted and the direction is solely determined by the contents of the register at the time the instruction is executed. This allows us to dynamically change the shift factor. Consider the code below.

 

LA R6,10 SHIFT FACTOR = 10 DIGITS LEFT

SRP XPK,0(R6),5 DYNAMIC SHIFT

 

The number 10 (indicating a 10-digit left shift) is loaded into R6. The effective address will be 10.

Here are two example SRPs that indicate what happens at the byte level.

 

 

Some unrelated SRPs:

APK DC PL4126 = X0000126C

BPK DC PL41122334 = X1122334C

RESULTS:

SRP APK,3,5 APK = X0126000C LEFT SHIFT 3

SRP APK,3,0 APK = X0126000C ROUNDING UNIMPORTANT

SRP APK,64-2,5 APK = X0000001C RIGHT SHIFT

SRP APK,64-1,5 APK = X0000013C ROUND UP >= 5

SRP BPK,1,5 OVERFLOW OCCURS ON LOSING SIG. DIGIT

SRP APK,-2,5 ASSEMBLY ERROR - NEGATIVE DISPLACEMENTS

ARE NOT ALLOWED

 

1. Keep in mind that you cannot left shift off a significant digit.

 

2. Be sure to use the 64-n notation when coding right shifts. It is easy to read, and provides excellent documentation.