|
|
|
|
|
|
|
|
|
|
|
|
|
|
Multiplication, Division |
|
|
|
|
Result of multiplying 2
32-bit numbers can be up to 64 bits |
|
|
Instructions |
|
Semantics |
|
|
|
Type |
|
mult $rs, $rt |
|
(HI, LO) = R[s] * R[t] |
signed |
R |
|
multu $rs, $rt |
|
|
unsigned |
R |
|
|
HI:
high 32 bits |
|
|
|
|
LO: low
32 bits |
|
|
|
|
Note that $rd does not appear (set to 00000 in
instruction) |
|
|
Division |
|
|
|
|
div $rs, $rt |
|
LO = R[s] / R[t] |
|
signed |
R |
|
divu $rs, $rt |
|
HI = R[s] % R[t] |
|
unsigned |
R |
|
|
LO:
quotient |
|
|
|
HI:
remainder |
|
|
To access HI, LO: |
|
|
|
mfhi $rd |
|
R[d] = HI |
|
R |
|
mflo $rd |
|
R[d] = LO |
|
R |
|
|
Note that $rs, $rt both 00000 |
|
|
Multiplication, division
are slow: results not available for 2 instructions afterward. |
|
How can we ensure that? |
|
|
|
|
nop: "no
operation" |
|
|
|
|
sll $0, $0, 0 |
# shift reg 0 left 0
bits; store result in $0 |
|
|
Machine code: all 0's |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|