26
votes

I'm reading about division in MIPS and I've found that div

Divides $s by $t and stores the quotient in $LO and the remainder in $HI

https://web.archive.org/web/20201111203150/http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html

And Wikipedia says

HI and LO are used to access the multiplier/divider results, accessed by the mfhi (move from high) and mflo commands.

http://en.wikipedia.org/wiki/MIPS_architecture

Are HI and LO registers? What number registers are they?

3
And if they are not registers, are they spots in memory?hodgesmr
No, they are registers, it is just that they can't be encoded in the 5 bit register fields in MIPS instructions. Those "numbered" registers are accessed by using the appropriate number on the register field. The HI/LO registers have special instructions that allow them to be transfered to a "numbered" register.Richard Pennington
Related: Difference between rem and mfhi in MIPS. They exist to avoid write-back conflicts with normal 1-cycle latency instructions, and to simplify hazard detection for the general-purpose integer registers.Peter Cordes
note that they were removed in MIPS release 6phuclv

3 Answers

31
votes

These are special registers used to store the result of multiplication and division. They are separate from the $0 .. $31 general purpose registers, not directly addressable. Their contents are accessed with special instructions mfhi and mflo (Move From HI/LO).

They are present in the Multiply Unit and are 32-bits each. More info here. As a pair, they hold the 64-bit full result of a 32x32-bit integer mult.


Raymond Chen's blog article The MIPS R4000, part 3: Multiplication, division, and the temperamental HI and LO registers has some very good info about early MIPS's non-intuitive behaviours, including mtlo / mtlo invalidating the previous hi / lo (respectively).

The incomplete integer instruction-set reference (linked in the question) for early MIPS also has some details, http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html, or see MIPS's official PDF manuals, or PDFs of manuals for classic MIPS CPUs.

11
votes

HI and LO are not numbered registers, IIRC. They are only used to store the results of operations that would not fit in a single register (e.g. multiplying two 32-bit integers could result in a 64 bit integer, so the overflow goes in HI).

edit: according to this class description, they are indeed special registers, so they are not numbered, and only accessible using special commands.

2
votes

What LO does is that for multiplication, it stores the least significant bits, and HI stores the rest of the bits, but mainly, we just focus on the LO part for multiplication. In division, we focus on both. LO in division is where the quotient should be stored at and HI is the remainder.