
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, 0’s are shifted in
on the right. On the other hand, as
digits are shifted off during a right shift, 0’s 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 two’s
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 (B’000011’) and the result is
interpreted as 6-bit 2’s complement. In
this format B’000011’ 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 (B’111110’) and
interpreted as a 6-bit 2’s complement integer.
We see that B’111110’ = -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 2’s 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 SRP’s that indicate what happens at the
byte level.

Some unrelated SRP’s:
APK
DC PL4’126’ = X’0000126C’
BPK
DC PL4’1122334’ = X’1122334C’
RESULTS:
SRP APK,3,5 APK =
X’0126000C’ LEFT SHIFT 3
SRP APK,3,0 APK =
X’0126000C’ ROUNDING UNIMPORTANT
SRP APK,64-2,5 APK =
X’0000001C’ RIGHT SHIFT
SRP APK,64-1,5 APK =
X’0000013C’ 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.