Для кода, такого как:
int res = 0;
for (int i = 0; i < 32; i++)
{
res += 1 << i;
}
Этот код сгенерирован (режим выпуска, без отладчика, 64 бит):
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
Теперь я вижу там большинство инструкций, но что с инструкциями AND? ecx никогда не будет больше 0x1F в этом коде в любом случае, но я извиняюсь за это, не замечая этого (а также не замечая, что результат является константой), это не передовой компилятор, который может позволить себе потратить много времени по анализу в конце концов. Но что более важно, SHL с 32-битным операндом маскирует cl на 0x1F уже. Поэтому мне кажется, что эти ИО совершенно бесполезны. Почему они генерируются? У них есть какая-то цель, которую я не хватает?