div
lyszt.net couvre div et d'autres instructions RISC-V plus en détail.
Format d'encodage
Description
div divise un registre par un autre. Il lit les registres sources rs1 et rs2, divise le premier par le second, et écrit le résultat dans le registre de destination rd. La forme ci-dessous signifie rd = rs1 / rs2.
div rd, rs1, rs2
Comme la multiplication, elle appartient à l'extension M des instructions mathématiques optionnelles, que ce simulateur inclut.
Il s'agit d'une division entière, donc la partie fractionnaire est abandonnée. 7 divisé par 2 donne 3. Le reste 1 provient de rem, qui calcule le reste des deux mêmes nombres. Les résultats négatifs arrondissent vers zéro, donc -7 / 2 donne -3.
La division par zéro renvoie -1, un registre dont tous les bits sont à 1. Le matériel ne donne aucun avertissement, donc le code qui doit traiter un diviseur nul comme une erreur vérifie le diviseur avant de diviser.
Le manuel RISC-V spécifie les cas particuliers. La division par zéro donne un quotient dont tous les bits sont à 1, ce qui se lit comme -1 pour div, et un reste égal au dividende. Le débordement signé ne se produit que lorsque le nombre le plus négatif est divisé par -1. Le quotient est alors égal au dividende et le reste est nul. Le manuel indique qu'un piège sur la division par zéro a été envisagé et rejeté, car il serait le seul piège arithmétique du jeu d'instructions, et que tous les bits à 1 garde le circuit diviseur simple.
Pour toute division qui ne déborde pas, le dividende est égal au diviseur multiplié par le quotient plus le reste. Lorsque le quotient et le reste sont tous deux nécessaires, le manuel recommande les deux lignes ci-dessous, avec rdq différent de rs1 et rs2. Un processeur peut alors fusionner les deux en une seule division.
div rdq, rs1, rs2 rem rdr, rs1, rs2
La division est l'arithmétique la plus lente qu'un processeur effectue, souvent plusieurs fois plus lente que la multiplication. Diviser par une puissance de deux (2, 4, 8 et ainsi de suite) peut utiliser un décalage à droite à la place (voir srai). L'exemple divise 17 par 5. 5 entre dans 17 trois fois entières avec 2 restants, donc le quotient 3 va dans t2.
Exemple
li t0, 17 li t1, 5 div t2, t0, t1 # t2 = 3
