Selon les définitions NEG et Negu,Mmix NEG et Negu opcodes
NEG $X,Y,$Z (negate signed): s($X) := Y - s($Z).
NEGU $X,Y,$Z (negate unsigned): u($X) := (Y - u($Z)) mod 2^64.
Supposons que $Z = s(-1)
ou u(2^64 - 1)
. Alors le premier opcode va mettre la valeur 1 dans le registre $X
quand Y = 0
, et le dernier donnera le même résultat car u(-(2^64 - 1)) mod 2^64 = 1
. Ai-je raison? L'instruction NEG
doit-elle déclencher une exception de dépassement de capacité lorsque $Z = -2^63
?
Pour le plaisir plus loin, vous pouvez l'exécuter avec MMIX -i program_name.mms pour pouvoir inspecter enregistrer le contenu à chaque étape du chemin – NickO
Soit dit en passant, si vous voulez la confirmation que le code ci-dessus est la façon correcte de gérer le débordement d'entier, consultez [ce post github] (https://github.com/ottocode/MMIX/blob/master/Nim/overflow.mms) – NickO