POOL32A 000000 |
rt |
rs |
rd |
0 |
DIV 0100011000 |
POOL32A 000000 |
rt |
rs |
rd |
0 |
MOD 0101011000 |
POOL32A 000000 |
rt |
rs |
rd |
0 |
DIVU 0110011000 |
POOL32A 000000 |
rt |
rs |
rd |
0 |
MODU 0111011000 |
6 |
5 |
5 |
5 |
1 |
10 |
POOL32S 010110 |
rt |
rs |
rd |
00 |
DDIV 100011000 |
POOL32S 010110 |
rt |
rs |
rd |
00 |
DMOD 101011000 |
POOL32S 010110 |
rt |
rs |
rd |
00 |
DDIVU 110011000 |
POOL32S 010110 |
rt |
rs |
rd |
00 |
DMODU 111011000 |
6 |
5 |
5 |
5 |
2 |
9 |
DIV MOD DIVU MODU DDIV DMOD DDIVU DMODU |
Divide Words Signed | |
DIV rd,rs,rt |
microMIPS32 Release 6 |
Divide Words Signed |
MOD rd,rs,rt |
microMIPS32 Release 6 |
Modulo Words Signed |
DIVU rd,rs,rt |
microMIPS32 Release 6 |
Divide Words Unsigned |
MODU rd,rs,rt |
microMIPS32 Release 6 |
Modulo Words Unsigned |
DDIV rd,rs,rt |
microMIPS64 Release 6 |
Divide Doublewords Signed |
DMOD rd,rs,rt |
microMIPS64 Release 6 |
Modulo Doublewords Signed |
DDIVU rd,rs,rt |
microMIPS64 Release 6 |
Divide Doublewords Unsigned |
DMODU rd,rs,rt |
microMIPS64 Release 6 |
Modulo Doublewords Unsigned |
Divide Integers (with result to GPR)
DIV: Divide Words Signed
MOD: Modulo Words Signed
DIVU: Divide Words Unsigned
MODU: Modulo Words Unsigned
DDIV: Divide Doublewords Signed
DMOD: Modulo Doublewords Signed
DDIVU: Divide Doublewords Unsigned
DMODU: Modulo Doublewords Unsigned
DIV: GPR[rd] = sign_extend.32( divide.signed( GPR[rs], GPR[rt] ) MOD: GPR[rd] = sign_extend.32( modulo.signed( GPR[rs], GPR[rt] ) DIVU: GPR[rd] = sign_extend.32( divide.unsigned( GPR[rs], GPR[rt] ) MODU: GPR[rd] = sign_extend.32( modulo.unsigned( GPR[rs], GPR[rt] ) DDIV: GPR[rd] = divide.signed( GPR[rs], GPR[rt] ) DMOD: GPR[rd] = modulo.signed( GPR[rs], GPR[rt] ) DDIVU: GPR[rd] = divide.unsigned( GPR[rs], GPR[rt] ) DMODU: GPR[rd] = modulo.unsigned( GPR[rs], GPR[rt] )
The Release 6 divide and modulo instructions divide the operands in GPR rs and GPR rt, and place the quotient or remainder in GPR rd.
For each of the div/mod operator pairs DIV/M OD, DIVU/MODU, DDIV/DMOD, DDIVU/DMODU the results satisfy the equation (A div
B)*B + (A mod B) = A, where (A mod B) has same sign as the dividend A, and abs(A mod B) < abs(B). This equation uniquely defines the results.
NOTE: if the divisor B=0, this equation cannot be satisfied, and the result is UNPREDICTABLE. This is commonly called "truncated division".
DIV performs a signed 32-bit integer division, and places the 32-bit quotient result in the destination register.
MOD performs a signed 32-bit integer division, and places the 32-bit remainder result in the destination register. The remainder result has the same sign as the dividend.
DIVU performs an unsigned 32-bit integer division, and places the 32-bit quotient result in the destination register.
MODU performs an unsigned 32-bit integer division, and places the 32-bit remainder result in the destination register.
DDIV performs a signed 64-bit integer division, and places the 64-bit quotient result in the destination register.
DMOD performs a signed 64-bit integer division, and places the 64-bit remainder result in the destination register.
The remainder result has the same sign as the dividend.
DDIVU performs an unsigned 64-bit integer division, and places the 64-bit quotient result in the destination register.
DMODU performs an unsigned 64-bit integer division, and places the 64-bit remainder result in the destination register.
If the divisor in GPR rt is zero, the result value is UNPREDICTABLE.
On a 64-bit CPU, the 32-bit signed divide (DIV) and modulo (MOD) instructions are UNPREDICTABLE if inputs are not signed extended 32-bit integers.
Special provision is made for the inputs to unsigned 32-bit divide and modulo on a 64-bit CPU. Since many 32-bit instructions sign extend 32 bits to 64 even for unsigned computation, properly sign extended numbers must be accepted as input, and truncated to 32 bits, clearing bits 32-63. However, it is also desirable to accept zero extended
32-bit integers, with bits 32-63 all 0.
On a 64-bit CPU, DIVU and MODU are UNPREDICTABLE if their inputs are not zero or sign extended 32-bit integers.
On a 64-bit CPU, the 32-bit divide and modulo instructions, both signed and unsigned, sign extend the result as if it is a 32-bit signed integer.
DDIV, DMOD, DDIVU, DMODU: Reserved Instruction exception if 64-bit instructions are not enabled.
These instructions are introduced by and required as of Release 6.
Release 6 divide instructions have the same opcode mnemonic as the pre-Release 6 divide instructions (DIV, DIVU,
DDIV, DDIVU). The instruction encodings are different, as are the instruction semantics: the Release 6 instruction produces only the quotient, whereas the pre-Release 6 instruction produces quotient and remainder in HI/LO registers respectively, and separate modulo instructions are required to obtain the remainder.
The assembly syntax distinguishes the Release 6 from the pre-Release 6 divide instructions. For example, Release 6
"DIVrd,rs,rt" specifies 3 register operands, versus pre-Release 6 "DIV rs,rt", which has only two register arguments, with the HI/LO registers implied.
Some assemblers accept the pseudo-instruction syntax
"DIVrd,rs,rt" and expand it to do "DIV rs,rt;MFHI rd". Phrases such as "DIV with GPR output" and
"DIV with HI/LO output" may be used when disambiguation is necessary.
Pre-Release 6 divide instructions that produce quotient and remainder in the HI/LO registers produce a Reserved
Instruction exception on Release 6. In the future, the instruction encoding may be reused for other instructions.
Because the divide and modulo instructions are defined to not trap if dividing by zero, it is safe to emit code that checks for zero-divide after the divide or modulo instruction.
Operation
DDIV, DMOD, DDIVU, DMODU: if not Are64bitOperationsEnabled then SignalException(ReservedInstruction) endif if NotWordValue(GPR[rs]) then UNPREDICTABLE endif if NotWordValue(GPR[rt]) then UNPREDICTABLE endif /* recommended implementation: ignore bits 32-63 for DIV, MOD, DIVU, MODU */ DIV, MOD: s1 = signed_word(GPR[rs]) s2 = signed_word(GPR[rt]) DIVU, MODU: s1 = unsigned_word(GPR[rs]) s2 = unsigned_word(GPR[rt]) DDIV, DMOD: s1 = signed_doubleword(GPR[rs]) s2 = signed_doubleword(GPR[rt]) DDIVU, DMODU: s1 = unsigned_doubleword(GPR[rs]) s2 = unsigned_doubleword(GPR[rt]) DIV, DIVU, DDIV, DDIVU: quotient = s1 div s2 MOD, MODU, DMOD, DMODU: remainder = s1 mod s2 DIV: GPR[rd] = sign_extend.32( quotient ) MOD: GPR[rd] = sign_extend.32( remainder ) DIVU: GPR[rd] = sign_extend.32( quotient ) MODU: GPR[rd] = sign_extend.32( remainder ) DDIV: GPR[rd] = quotient DMOD: GPR[rd] = remainder DDIVU: GPR[rd] = quotient DMODU: GPR[rd] = remainder /* end of instruction */ where function zero_or_sign_extended.32(val) if value63..32 = (value31)32 then return true if value63..32 = (0)32 then return true return false end function
DIV, MOD, DIVU, MODU: No arithmetic exceptions occur. Division by zero produces an UNPREDICTABLE result.
DDIV, DMOD, DDIVU, DMODU: Reserved Instruction.