Manipulation de bits : C vs ASM
UPDATE : Fil déplacé (la discussion originale avait commencé ici : http://www.developpez.net/forums/d60...ilier-sprintf/ )
Citation:
Envoyé par
Jean-Marc.Bourguet
Mince alors... je l'ai fait sans assembleur. Pire, je ne vois pas en quoi l'assembleur aide beaucoup -- enfin, un peu les perfs du calcul entier multiprécision qui est nécessaire, mais les drapeaux de controles de la FPU n'aident pas beaucoup pour cela.
Alors, d'un point de vue complètement parallèle à cette discussion, je peux témoigner qu'il est beaucoup plus confortable de coder en assembleur les routines de calcul arithmétique et logique, notamment grâce aux facilités de manipulation de bits. L'exemple le plus direct est la rotation des bits d'un entier de longueur arbitraire. Quand on fait un décalage d'un bit, on peut utiliser directement la retenue du processeur et faire des ROL en cascade. Sur Intel, il existe même des instruction de manipulation de chaîne, comme LODS, STOS, MOVS et le préfixe répétiteur REP. Bref, tout ce qu'il faut pour faire de la manipulation de données, principale tâche du CPU.
En C, il n'y a - à ma connaissance (quiquonque peut élargir le cercle de mes connaissances étant le bienvenu) - pas de manière facile d'extraire un bit sortant. Le plus rapide que j'ai trouvé pour récupérer la valeur du bit de poids fort d'un entier quelquonque et le ramener en première position en évitant les sauts conditionnels est :
Code:
((x & (~0 >> 1))-1)&1)
Ça a l'avantage d'utiliser des instructions fondamentales et implicites (potentiellement sans accès au bus) du microprocesseur. Par contre, ça s'éloigne beaucoup, dans la syntaxe, de l'algo initial et le compilateur aura bien du mal à faire les optimisations nécessaires.
Un autre exemple : les trois instructions de mon post #9 dans cette discussion : http://www.developpez.net/forums/d58...r/#post3552842
Difficile d'expliquer çà au C, même si celui-ci y met la meilleure volonté du monde.