Je pense que je cherche une réponse à une question triviale. J'essaie de comprendre pourquoi l'architecture MIPS utilise une valeur "zéro" explicite dans un registre alors que vous pouvez réaliser la même chose en XOR simplement n'importe quel registre contre lui-même. On pourrait dire que l'opération est déjà faite pour vous; cependant, je ne peux pas vraiment imaginer une situation où vous utiliseriez beaucoup de valeurs "zéro". J'ai lu les articles originaux de Hennessey, et il attribue simplement un zéro en fait sans aucune justification réelle.
Existe-t-il une raison logique d'avoir une affectation binaire codée en dur de zéro?
mise à jour: Dans 8k d'un exécutable de xc32-gcc pour le noyau MIPS dans le PIC32MZ, j'ai une seule instance de "zéro".
add t3,t1,zero
la réponse réelle: j'ai attribué la prime à la personne qui avait les informations sur MIPS et les codes de condition. La réponse réside en fait dans l'architecture MIPS pour les conditions. Bien que je ne veuille initialement pas y consacrer de temps, j'ai examiné l'architecture pour opensparc , MIPS-V et OpenPOWER (ce document était interne) et voici les résultats résumés. Le registre R0 nécessaire à la comparaison sur les branches en raison de l'architecture du pipeline.
- comparaison entre un entier et zéro et une branche (bgez, bgtz, blez, bltz)
- entier comparer deux registres et branche (beq, bne)
- entier compare deux registres et piège (teq, tge, tlt, tne)
- registre de comparaison entier et immédiat et piège (teqi, tgei, tlti, tnei)
Cela se résume simplement à l'apparence du matériel dans la mise en œuvre. Dans le manuel MIPS-V, il y a une citation non référencée à la page 68:
Les branches conditionnelles ont été conçues pour inclure des opérations de comparaison arithmétique entre deux registres (comme cela est également fait dans PA-RISC et Xtensa ISA), plutôt que d'utiliser des codes de condition (x86, ARM, SPARC, PowerPC), ou pour comparer uniquement un registre contre zéro ( Alpha, MIPS), ou deux registres uniquement pour l'égalité (MIPS). Cette conception a été motivée par l'observation qu'une instruction combinée de comparaison et de dérivation se transforme en un pipeline régulier, évite un état de code de condition supplémentaire ou l'utilisation d'un registre temporaire, et réduit la taille du code statique et la récupération dynamique des instructions trac. Un autre point est que les comparaisons avec zéro nécessitent un retard de circuit non trivial (en particulier après le passage à la logique statique dans les processus avancés) et sont donc presque aussi chères que les comparaisons d'amplitude arithmétique. Un autre avantage d'une instruction de comparaison et de dérivation fusionnée est que les dérivations sont observées plus tôt dans le flux d'instructions frontales et peuvent donc être prédites plus tôt. Il y a peut-être un avantage à une conception avec des codes de condition dans le cas où plusieurs branches peuvent être prises sur la base des mêmes codes de condition, mais nous pensons que ce cas est relativement rare.
Le document MIPS-V ne frappe pas l'auteur de la section citée. Je remercie chacun pour son temps et sa considération.