Почему генерируются инструкции И?

Для такого кода:

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

Теперь я вижу смысл большинства инструкций, но что случилось с И инструкции? ecx в любом случае никогдане будет больше 0x1F в этом коде, но я извиняюсь за то, что не заметил этого (а также за то, что не заметил, что результат является константой), это не опережающий компилятор, который может позволить себе потратить много времени на анализ в конце концов. Но что более важно, SHL с 32-битным операндом уже маскирует cl под 0x1F. Так что мне кажется, что эти И совершенно бесполезны. Почему они генерируются? У них есть какая-то цель, которую я упускаю?

34
задан harold 1 May 2012 в 09:12
поделиться