Avez-vous des moyens simples de faire une valeur dans un registre dans MIPS comme valeur absolue? p>
5 Réponses :
Le moyen le plus simple serait de faire un peu de mathématiques binaires sur les valeurs. p>
Voici un moyen assez simple de le faire.
#assume you want the absolute value of r1 ori $2, $zero, $1 #copy r1 into r2 slt $3, $1, $zero #is value < 0 ? beq $3, $zero, foobar #if r1 is positive, skip next inst sub $2, $zero, $1 #r2 = 0 - r1 foobar: #r2 now contains the absolute value of r1
Notez que c'est pour un MIPS sans i> Slots de délai de branche, comme Mars / Spim simulez par défaut. Sinon, vous voudriez réorganiser le déplacer code> (
ori code>) dans le logement de délai de branche.
Voici une variante sans succursale:
# input and output in $t0 sra $t1,$t0,31 xor $t0,$t0,$t1 sub $t0,$t0,$t1
AVERTISSEMENT: Cette méthode est couverte par le brevet US 6073150. Probablement invalide comme l'enfer, cependant, car on sait plus de 1997.
@Myria: Les compilateurs tels que GCC l'utilisent depuis des années sur diverses ISAS. par exemple. GCC4.4 pour x86-64: goodbolt.org/z/mv843o . (Affiche également les MIPS 64 bits GCC5.4 à l'aide d'un déplacement conditionnel, MOVN code>, pour sélectionner entre
x code> et
-x code> comme Clang le fait pour x86. )
moyen le plus simple de tous.
Il y a une instruction pseudo qui fait: prendra la valeur absolue de la valeur dans le registre $ T1 et le placera en $ T1 p> p> p>
Cette pseudo-instruction est la séquence SRA / XOR / SUB CODE> affichée dans une autre réponse.
Voici une version optimisée de taille. Il est plus lent que la réponse SRA / XOR / SUBU, en raison de problèmes de prédiction des succursales, mais c'est une instruction plus petite:
bgtz $t0, label label: subu $t0, $zero, $t0