rem

rem

Assembleur RISC-V Référence

lyszt.net couvre rem et d'autres instructions RISC-V plus en détail.

Format d'encodage

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 renvoie le reste d'une division, c'est-à-dire le nombre restant. La division de 17 par 5 donne 3 fois 17 avec un reste de 2. div renvoie le 3 et rem renvoie le 2. Le nom est l'abréviation de « remainder » (reste). La syntaxe est indiquée ci-dessous et signifie que rd = le reste de la division de rs1 par rs2.

rem rd, rs1, rs2

Elle appartient à la même extension mathématique optionnelle M que div.

Ces deux instructions agissent sur la même paire de nombres et fournissent ensemble le quotient et le reste. rem est la forme en langage assembleur de l’opérateur % (modulo) utilisé dans les langages de haut niveau.

Avec des nombres négatifs, le reste prend le signe du nombre divisé. 7 divisé par 2 donne un reste de 1, et -7 divisé par 2 donne un reste de -1. Un test pour les nombres impairs qui vérifie si le reste de la division par 2 est égal à 1 donne une réponse erronée pour les nombres négatifs. Vérifier si le reste est égal à zéro permet de déterminer si le nombre est pair ou impair, quel que soit son signe.

Le manuel RISC-V indique que rem fournit le reste de la division correspondante et qu’un résultat non nul a le signe du dividende. Toute division sans débordement satisfait la relation : dividende = diviseur multiplié par le quotient plus le reste. Un reste par zéro est égal au dividende, et le cas de débordement signé, à savoir le nombre le plus négatif divisé par -1, donne un reste égal à zéro. Pour obtenir le quotient et le reste d’une même division, le manuel recommande d’utiliser d’abord div, puis rem sur les mêmes opérandes, ce qu’un processeur peut fusionner en une seule division.

Les restes sont utilisés pour faire revenir un compteur au début d’un tampon, pour retirer des chiffres d’un nombre et pour répartir des éléments entre différents emplacements. Un reste par zéro renvoie le nombre d’origine. L’exemple calcule 17 modulo 5 et laisse 2 dans t2.

Exemple

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