Certains ensembles d'instructions sont limités à un décalage d'un bit par instruction. Et certains ensembles d'instructions vous permettent de spécifier n'importe quel nombre de bits à décaler en une seule instruction, ce qui prend généralement un cycle d'horloge sur les processeurs modernes (moderne étant un mot intentionnellement vague). Voir la réponse de dan04 à propos d'un shifter en cascade, un circuit qui décale plus d'un bit en une seule opération.
Tout se résume à l'algorithme logique. Chaque bit du résultat est une fonction logique basée sur l'entrée. Pour un simple décalage à droite, l'algorithme serait quelque chose comme :
- Si l'instruction est [décalage à droite] et que le bit 1 de l'entrée est 1, alors le bit 0 du résultat est 1, sinon le bit 0 est 0.
- Si l'instruction est [décalage à droite], alors le bit 1 = bit 2.
- etc.
Mais l'équation logique pourrait aussi bien être :
- Si l'instruction est [décalage à droite] et que l'opérande est de 1, alors le bit 0 du résultat = bit 1 décalé de l'entrée.
- si la quantité est de 2 alors le bit 0 = bit 2.
- et ainsi de suite.
Les portes logiques, étant asynchrones, peuvent faire tout cela en un seul cycle d'horloge. Cependant, il est vrai que le décalage unique permet un cycle d'horloge plus rapide et moins de portes à stabiliser, si tout ce que vous comparez sont ces deux variantes d'une instruction. Ou l'alternative est de laisser le temps de se stabiliser, donc l'instruction prend 2 ou 3 cycles d'horloge ou autre, et la logique compte jusqu'à 3 puis verrouille le résultat.
Le MSP430, par exemple, n'a que des instructions de rotation d'un seul bit vers la droite (car vous pouvez effectuer un décalage d'un seul bit ou une rotation à gauche avec une autre instruction, que je laisse au lecteur le soin de comprendre).
L'ensemble d'instructions ARM permet des rotations multibits basées à la fois sur un registre et immédiates, des décalages arithmétiques et logiques. Je pense qu'il n'y a qu'une seule instruction de rotation réelle et le reste est un alias, car tourner à gauche de 1 est la même chose qu'une rotation à droite de 32, il vous suffit d'un shifter en cascade dans une direction pour implémenter un décalage multibit.
SHL dans le x86 permet plus d'un bit par instruction, mais cela prenait plus d'un cycle autrefois.
et ainsi de suite, vous pouvez facilement examiner n'importe lequel des ensembles d'instructions disponibles.
La réponse à votre question est que ce n'est pas fixe. Parfois c'est une opération, un cycle, une instruction. Parfois c'est une instruction, plusieurs cycles d'horloge. Parfois ce sont plusieurs instructions, plusieurs cycles d'horloge.
Les compilateurs optimisent souvent pour ce genre de choses. Disons que vous avez un ensemble d'instructions de registres de 16 bits avec une instruction d'échange de byte et une instruction AND avec une valeur immédiate, mais un seul décalage de bit. Vous pourriez penser qu'un décalage de 8 bits nécessiterait 8 cycles d'instructions de décalage, mais vous pourriez simplement échanger les bytes (une instruction) et ensuite effectuer un ET avec la moitié inférieure mise à zéro (ce qui pourrait prendre deux instructions, ou pourrait être une instruction de longueur variable de deux mots, ou pourrait être encodée en une seule instruction) donc cela ne prend que 2 ou 3 cycles d'instructions/d'horloge au lieu de 8. Pour un décalage de 9 bits, vous pouvez faire la même chose et ajouter un décalage, ce qui le rendrait de 9 cycles contre 3 ou 4. De plus, sur certaines architectures, il est plus rapide de multiplier par 256 que de décaler de 8 bits, etc., etc. Chaque ensemble d'instructions a ses propres limites et astuces.
Ce n'est même pas le cas que la plupart des ensembles d'instructions fournissent du multi bit ou limitent à un bit. Les processeurs qui entrent dans la catégorie "informatique", comme X86, ARM, PowerPC et MIPS, pencheront vers une opération de décalage. En élargissant à tous les processeurs mais pas nécessairement les "ordinateurs" couramment utilisés aujourd'hui, le tendance s'inverse, je dirais que la plupart d'entre eux sont à un seul bit plutôt que multi bits, donc plusieurs opérations sont nécessaires pour réaliser un décalage multibits.
0 votes
Est-ce qu'ils nécessitent plus d'opérations pour se décaler vers la gauche de 31?
2 votes
Ma connaissance en matière de CPU est assez ancienne, mais chaque instruction de décalage que j'ai vue décale d'un bit, donc vous avez besoin d'exécuter une boucle pour décaler plus d'une fois. Je suppose qu'il est possible que les CPU modernes aient des instructions de décalage qui décalent d'un nombre spécifié de bits en un cycle d'horloge.
1 votes
Sur ma machine
int test(int i) { return i << 30; }
devientsall $30, %eax
0 votes
Lorsque vous descendez à l'assemblée, c'est comme shl ou shr sur x86
9 votes
Les
shl
etshr
d'assembleur x86 permettent des décomptes de décalage arbitraires, mais les cycles CPU réels nécessaires dépendent de ce que vous faites et du CPU lui-même. Pour les 286, c'est O(n), pour les 386+, c'est O(1).2 votes
@Robert Harvey, l'instruction shr/shl sur x86 peut prendre un nombre de bits à décaler depuis au moins 8086, soit depuis 1978. Vous avez certainement besoin de rafraîchir vos connaissances en matière de CPU ;)
0 votes
@awoodland Est-ce du java ou du C# ?
0 votes
@MarcB zsmith.co/intel/intel_s.html#sal a de bons détails sur
sall
1 votes
@unbeli: Oui, mais cela ne signifie pas nécessairement que ces opérations sont O(1).
0 votes
Le manuel Cortex-M4 indique qu'il faut 1 cycle. developer.arm.com/documentation/ddi0439/b/Programmers-Model/…