
The Divide Register instruction performs 2’s complement binary
integer division and returns a quotient and a remainder. Operand 1 names an even register of an
“even-odd” consecutive register pair.
For instance, R2 would be used to name the R2 / R3 even-odd register
pair, and R8 would be used to name the R8 / R9 even-odd register pair. Operand 2 names a register that contains the
divisor. Before the division, the even-odd register pair must be
initialized with the dividend, which is effectively a 64-bit 2’s complement
integer. After the division, the
remainder is contained in the even register and the quotient is contained in
the odd register. The sign of the
quotient is determined by the laws of algebra, and the sign of the remainder is
the same as the sign of the dividend.

In preparing to divide a fullword, a common practice is to load
the fullword in the even register and algebraically shift it to the odd
register using SRDA. This practice propagates the appropriate
sign bit throughout the even register. (If the dividend is positive, the even
register is populated with binary 0’s.
If the dividend is negative, the even register is populated with binary
1’s.) Here is an example where we
compute A/B where A and B are fullwords.
L R8,A PUT THE
DIVIDEND IN THE EVEN REGISTER
SRDA R8,32 ALGEBRAICALLY SHIFT R8 INTO R9
L R5,B PUT THE
DIVISOR IN R5
DR R8,R5 DIVIDE A BY
B
...
A DC F’19’ DIVIDEND
B DC F’5’ DIVISOR
The diagram below illustrates the above division just after R8
has been shifted.
The diagram illustrates that
the results of the integer division of 19 by 5 is a remainder of 4 in R8, and a
quotient of 3 in R9.
Some Unrelated Divide Register Instructions
L
R6,=F’100’ DIVIDEND INITIALLY
GOES IN THE EVEN REGISTER
SRDA R6,32 ... AND IS SHIFTED TO THE ODD REGISTER
L
R9,=F’10’ DIVISOR GOES IN R9
DR
R6,R9 ... BEFORE DIVIDING
R6 (REMAINDER) =
X’00000000’,
R7 (QUOTIENT) = X’0000000A’
L
R6,=F’100’ DIVIDEND INITIALLY
GOES IN THE EVEN REGISTER
SRDA R6,32 ... AND IS SHIFTED TO THE ODD REGISTER
L
R4,=F’8’ DIVISOR GOES IN R4
DR
R6,R4 ... BEFORE DIVIDING
R6 (REMAINDER) =
X’00000004’,
R7 (QUOTIENT) = X’0000000C’
L
R6,=F’100’ DIVIDEND INITIALLY
GOES IN THE EVEN REGISTER
SRDA R6,32 ... AND IS SHIFTED
TO THE ODD REGISTER
SR
R5,R5 ZERO OUT R5
DR
R6,R5 ... BEFORE DIVIDING
ABEND - DIVISION BY 0
NOT ALLOWED
L
R6,=F’-100’ DIVIDEND INITIALLY
GOES IN THE EVEN REGISTER
SRDA R6,32 ... AND IS SHIFTED TO THE ODD REGISTER
L
R10,=F’-8’ DIVISOR GOES IN R8
DR
R6,R10 ... BEFORE DIVIDING
R6 (REMAINDER) =
X’FFFFFFFC’,
R7 (QUOTIENT) = X’0000000C’

1) Know your data! If the
divisor might be zero, you must protect your divisions by testing the divisor
beforehand.
LTR R5,R5 ASSUME DIVISOR IS IN R5
BZ ZERODIV BRANCH IF DIVISOR IS 0
DR R8,R5 O.K. TO DIVIDE NOW
...
ZERODIV EQU
*
(CODE TO HANDLE A ZERO
DIVISOR)
2) Unlike the MR instruction, you must initialize the even
register. The even/odd register pair
must contain a 64 bit binary integer before you execute the instruction.