rem

rem

RISC-V Assembly Reference

lyszt.net covers rem and other RISC-V instructions in more detail.

Encoding format

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Description

rem gives the remainder of a division, which is the amount left over. Dividing 17 by 5 goes in 3 times with 2 left over. div returns the 3 and rem returns the 2. The name is short for remainder. The form is shown below and means rd = the remainder of rs1 divided by rs2.

rem rd, rs1, rs2

It belongs to the same optional M math extension as div.

The two instructions work on the same pair of numbers and together give the quotient and what is left. rem is the assembly form of the % (modulo) operator in higher-level languages.

With negative numbers the remainder takes the sign of the number being divided. 7 remainder 2 is 1, and -7 remainder 2 is -1. A test for odd numbers that checks whether the remainder by 2 equals 1 gives the wrong answer for negative numbers. Checking whether the remainder is zero decides even or odd for every sign.

The RISC-V manual says rem provides the remainder of the corresponding division and that a nonzero result has the sign of the dividend. Every division that does not overflow satisfies dividend = divisor times quotient plus remainder. A remainder by zero equals the dividend, and the signed overflow case, the most negative number divided by -1, gives a remainder of zero. To get the quotient and the remainder of the same division, the manual recommends div and then rem on the same operands, which a processor can fuse into a single division.

Remainders are used to wrap a counter back to the start of a buffer, to take digits off a number and to spread items across slots. A remainder by zero returns the original number. The example computes 17 remainder 5 and leaves 2 in t2.

Example

li t0, 17
li t1, 5
rem t2, t0, t1   # t2 = 2