Hmmmm:
https://godbolt.org/g/sVg5LBEn -O3 il deroule la boucle et produit enormement de code utilisant la vectorisation, c'est interessant, mais rend vraiment illisible. En -Os c'est plus interesant.
calc() va appeler
strlen a chaque boucle, alors que
calc2 non (ca parait logique vu le code, et passer un "const char *" n'y change rien) fait intéressant,
calc2 utilise deux index,
rbx comme position dans la chaine,
rcx comme compteur, et le compteur lui est décentrementé. Donc le compilateur est tout a fait capable d'inverser le comptage pour rendre les choses "plus simple"
Autre point interessant, GCC ne produit pas le meme code:
https://godbolt.org/g/4ySEsNstrlen est inliné pour les deux fonction (
repnz scasb) et n'est executé qu'une seule fois dans le cas de
calc