Dans de nombreux MIPS implémentations, ces ops permettra à la fois de compiler à la même instruction, parce que généralement "mov $a, $b' est un idiome pour or $a, $b, $0 et li $r, x est un raccourci pour ori $r, $0, x:
move $t0, $0
li $t0, 0
et ces auront lieu tous les deux sur la même canalisation, d'être à l'architecture équivalent:
xor $t0, $t0, $t0
and $t0, $t0, $0
et dans tous les RISC mise en œuvre que j'ai jamais travaillé avec, ajouter, c'est sur le même canal que xor/et/ni/etc.
Fondamentalement, c'est tout particulier à la mise en œuvre d'une puce, mais ils devrions tous être d'horloge unique. Si la puce est hors de l'ordre, li ou and x, $0, $0pourrait être plus rapide parce qu'ils réduisent au minimum les fausses dépendances sur d'autres registres.
Je crois me souvenir que $0, que creted spécifiquement pour ce cas, je m'attends à ce que move $t0 $0 devrait être la méthode recommandée pour effacer un registre. Mais je n'ai pas fait MIPS pour près de 10 ans ...
Étant donné que l'ensemble de ces instructions, de prendre un seul pipeline cycle, il ne devrait pas être beaucoup de différence entre eux.
Le cas échéant, je m'attends à de la xor $t0, $t0, $t0 être le meilleur pour la vitesse, car il n'utilise pas d'autres registres, par conséquent, de garder leur libre pour d'autres valeurs et en réduisant potentiellement le fichier de registre de contention.
Le xor méthode est également traitée comme un idiome spécifique sur certains processeurs, qui permettent à l'utiliser moins de ressources (par exemple, ne pas avoir besoin de faire le XOR ALU opération.
CPU concepteurs d'optimiser les Processeurs x86 pour le xor-réinitialisation de l'idiome, car il a la plus petite de code-taille en x86 variable-length encoding. Cela a fait xor-réinitialisation de plus efficace que mov eax, 0 même, à part le code de la taille. Puisque ce n'est pas un facteur pour MIPS, je n'attendrais pas les Processeurs MIPS pour passer des transistors de détection que les deux opérandes sont les mêmes pour xor ou sub. Je voudrais aussi s'attendre à ce que la lecture de $0 est au moins aussi bon marché que la lecture de tout autre reg.
Sur la plupart des implémentations de l'architecture MIPS, toutes ces mesures doivent offrir les mêmes performances. Cependant, on peut envisager un superscalar système qui pourrait exécuter plusieurs instructions simultanément, aussi longtemps qu'elle est distincte des unités internes. Je n'ai aucun exemple réel d'un MIPS système qui fonctionne comme ça, mais c'est comment ça se passe sur les systèmes PowerPC. Un xor $t0, $t0, $t0 opcode à être exécutés sur le "integer calculs" (parce que c'est un xor), tandis que move $t0, $0 de ne pas utiliser cette unité; sur le plan conceptuel, ce dernier pourrait être exécutées en parallèle avec un autre opcode qui effectuent entier calculs.
En bref, si vous trouver un système où toutes les façons de liste ne sont pas aussi efficaces, puis j'attendrais la move $t0, $0 méthode la plus efficace.
Je pense que dans la plupart des implémentations mov est également sur l'entier de l'unité -- mov x,y est généralement synonyme de or x,y,0. C'était le cas sur l'EE, de toute façon. Pas familier avec MIPS, mais est le passage d'instruction de plus? Sur x86, plus instructions peut souvent finir plus que les "officiels" nombre de cycles en raison de la mémoire/le pipelining questions. Instructions courtes sont privilégiées... Knoblauch Nan -- le point de l'ensemble de MIPS (et RISC en général) est que chaque instruction est exactement la même longueur. Je ne dirais pas que c'est le "tout point", mais c'est en effet l'un des avantages des architectures RISC (même si c'est un peu moins prononcé avec le plus de 16 bits de sous-ensembles tels que mips16e et le Pouce).
Il dépend probablement de ce que d'autres instructions dans le pipeline en même temps: lorsque le registre a été utilisé en dernier, quand il va être utilisé et internes, les unités sont actuellement en cours d'utilisation.
Je ne suis pas familier avec le pipeline de la structure d'un processeur MIPS, mais votre compilateur doit être et je m'attends à elle de choisir celle qui serait la plus rapide dans une séquence de code.
Dans de nombreux MIPS implémentations, ces ops permettra à la fois de compiler à la même instruction, parce que généralement "mov $a, $b' est un idiome pour
or $a, $b, $0
etli $r, x
est un raccourci pourori $r, $0, x
:et ces auront lieu tous les deux sur la même canalisation, d'être à l'architecture équivalent:
et dans tous les RISC mise en œuvre que j'ai jamais travaillé avec, ajouter, c'est sur le même canal que xor/et/ni/etc.
Fondamentalement, c'est tout particulier à la mise en œuvre d'une puce, mais ils devrions tous être d'horloge unique. Si la puce est hors de l'ordre,
li
ouand x, $0, $0
pourrait être plus rapide parce qu'ils réduisent au minimum les fausses dépendances sur d'autres registres.memory_order_consume
). Si vous voulez absolument utiliser$0
comme seule source d'entrée de registre, peu importe ce que vous faites avec elle. IDK si tout de MIPS implémentations de reconnaître spécifiques de la réinitialisation des idiomes et de faire de même utiliser une unité d'exécution (comme les Processeurs x86 n')OriginalL'auteur Crashworks
Je crois me souvenir que $0, que creted spécifiquement pour ce cas, je m'attends à ce que
move $t0 $0
devrait être la méthode recommandée pour effacer un registre. Mais je n'ai pas fait MIPS pour près de 10 ans ...OriginalL'auteur Guillaume
Étant donné que l'ensemble de ces instructions, de prendre un seul pipeline cycle, il ne devrait pas être beaucoup de différence entre eux.
Le cas échéant, je m'attends à de la
xor $t0, $t0, $t0
être le meilleur pour la vitesse, car il n'utilise pas d'autres registres, par conséquent, de garder leur libre pour d'autres valeurs et en réduisant potentiellement le fichier de registre de contention.Le xor méthode est également traitée comme un idiome spécifique sur certains processeurs, qui permettent à l'utiliser moins de ressources (par exemple, ne pas avoir besoin de faire le XOR ALU opération.
mov eax, 0
même, à part le code de la taille. Puisque ce n'est pas un facteur pour MIPS, je n'attendrais pas les Processeurs MIPS pour passer des transistors de détection que les deux opérandes sont les mêmes pour xor ou sub. Je voudrais aussi s'attendre à ce que la lecture de$0
est au moins aussi bon marché que la lecture de tout autre reg.OriginalL'auteur andrewmu
Sur la plupart des implémentations de l'architecture MIPS, toutes ces mesures doivent offrir les mêmes performances. Cependant, on peut envisager un superscalar système qui pourrait exécuter plusieurs instructions simultanément, aussi longtemps qu'elle est distincte des unités internes. Je n'ai aucun exemple réel d'un MIPS système qui fonctionne comme ça, mais c'est comment ça se passe sur les systèmes PowerPC. Un
xor $t0, $t0, $t0
opcode à être exécutés sur le "integer calculs" (parce que c'est unxor
), tandis quemove $t0, $0
de ne pas utiliser cette unité; sur le plan conceptuel, ce dernier pourrait être exécutées en parallèle avec un autre opcode qui effectuent entier calculs.En bref, si vous trouver un système où toutes les façons de liste ne sont pas aussi efficaces, puis j'attendrais la
move $t0, $0
méthode la plus efficace.mov x,y
est généralement synonyme deor x,y,0
. C'était le cas sur l'EE, de toute façon.Pas familier avec MIPS, mais est le passage d'instruction de plus? Sur x86, plus instructions peut souvent finir plus que les "officiels" nombre de cycles en raison de la mémoire/le pipelining questions. Instructions courtes sont privilégiées...
Knoblauch Nan -- le point de l'ensemble de MIPS (et RISC en général) est que chaque instruction est exactement la même longueur.
Je ne dirais pas que c'est le "tout point", mais c'est en effet l'un des avantages des architectures RISC (même si c'est un peu moins prononcé avec le plus de 16 bits de sous-ensembles tels que mips16e et le Pouce).
OriginalL'auteur Thomas Pornin
Il dépend probablement de ce que d'autres instructions dans le pipeline en même temps: lorsque le registre a été utilisé en dernier, quand il va être utilisé et internes, les unités sont actuellement en cours d'utilisation.
Je ne suis pas familier avec le pipeline de la structure d'un processeur MIPS, mais votre compilateur doit être et je m'attends à elle de choisir celle qui serait la plus rapide dans une séquence de code.
OriginalL'auteur Andrew Aylett
Comment sur MOVZ? Il devrait purement simplement faire un MOV opeartion et rien d'autre.
OriginalL'auteur albert