Pour le code comme ceci:
int res = 0;
for (int i = 0; i < 32; i++)
{
res += 1 << i;
}
Ce code est généré (en mode release, pas de débogueur, 64 bits):
xor edx,edx
mov r8d,1
_loop:
lea ecx,[r8-1]
and ecx,1Fh ; why?
mov eax,1
shl eax,cl
add edx,eax
mov ecx,r8d
and ecx,1Fh ; why?
mov eax,1
shl eax,cl
add edx,eax
lea ecx,[r8+1]
and ecx,1Fh ; why?
mov eax,1
shl eax,cl
add edx,eax
lea ecx,[r8+2]
and ecx,1Fh ; why?
mov eax,1
shl eax,cl
add edx,eax
add r8d,4
cmp r8d,21h
jl _loop
Maintenant, je peux voir le point de la plupart des instructions, mais qu'est-ce avec la ET des instructions? ecx va jamais être plus de 0x1F dans le présent code, de toute façon, mais j'ai une excuse pour ne pas remarquer que (et aussi pour ne pas avoir remarqué que le résultat est une constante), ce n'est pas une avance sur le temps compilateur qui peut se permettre de passer beaucoup de temps sur l'analyse après tout. Mais plus important encore, SHL avec un 32 bits opérande masques cl par 0x1F déjà. Il me semble donc que ces ANDs sont tout à fait inutile. Pourquoi sont-ils générés? Ont-ils une raison qui m'échappe?