J'ai quelques aspects supplémentaires ici:
Considérez l'opération "a = b / c" x86 implémenterait cela comme
mov eax,b
xor edx,edx
div dword ptr c
mov a,eax
Comme bonus supplémentaire de l'instruction div edx contiendra le reste.
Un processeur RISC exigerait d'abord le chargement des adresses de b et c, le chargement de b et c de la mémoire vers les registres, la division et le chargement de l'adresse de a, puis le stockage du résultat. Syntaxe Dst, src:
mov r5,addr b
mov r5,[r5]
mov r6,addr c
mov r6,[r6]
div r7,r5,r6
mov r5,addr a
mov [r5],r7
Ici, il n'y aura généralement pas de reste.
Si des variables doivent être chargées via des pointeurs, les deux séquences peuvent devenir plus longues bien que ce soit moins une possibilité pour le RISC car il peut avoir un ou plusieurs pointeurs déjà chargés dans un autre registre. x86 a moins de registres, donc la probabilité que le pointeur se trouve dans l'un d'entre eux est plus petite.
Avantages et inconvénients:
Les instructions RISC peuvent être mélangées avec le code environnant pour améliorer la planification des instructions, c'est moins une possibilité avec x86 qui fait plutôt ce travail (plus ou moins bien selon la séquence) à l'intérieur du CPU lui-même. La séquence RISC ci-dessus aura généralement une longueur de 28 octets (7 instructions de 32 bits / 4 octets chacune) sur une architecture 32 bits. Cela entraînera un plus grand fonctionnement de la mémoire hors puce lors de la récupération des instructions (sept extractions). La séquence x86 plus dense contient moins d'instructions et bien que leurs largeurs varient, vous regardez probablement aussi une moyenne de 4 octets / instruction. Même si vous avez des caches d'instructions pour accélérer ces sept récupérations, cela signifie que vous aurez un déficit de trois ailleurs à compenser par rapport au x86.
L'architecture x86 avec moins de registres à sauvegarder / restaurer signifie qu'elle effectuera probablement des commutateurs de thread et gérera les interruptions plus rapidement que RISC. Plus de registres à enregistrer et à restaurer nécessitent plus d'espace de pile RAM temporaire pour effectuer des interruptions et plus d'espace de pile permanent pour stocker les états des threads. Ces aspects devraient faire de x86 un meilleur candidat pour exécuter du RTOS pur.
Sur une note plus personnelle, je trouve qu'il est plus difficile d'écrire l'assemblage RISC que x86. Je résous cela en écrivant la routine RISC en C, en compilant et en modifiant le code généré. C'est plus efficace du point de vue de la production de code et probablement moins efficace du point de vue de l'exécution. Tous ces 32 registres à suivre. Avec x86, c'est l'inverse: 6-8 registres avec des noms «réels» rend le problème plus gérable et instille plus de confiance que le code produit fonctionnera comme prévu.
Laid? C'est dans les yeux du spectateur. Je préfère «différent».