Para el código como este:¿Por qué se generan AND instrucciones?
int res = 0;
for (int i = 0; i < 32; i++)
{
res += 1 << i;
}
Este código se genera (modo de lanzamiento, sin depurador asociado, de 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
ahora puedo ver el punto de la mayoría de las instrucciones allí, pero lo que es con las instrucciones AND? ecx será nunca sea más de 0x1F en este código de todos modos, pero lo disculpo por no darme cuenta (y también por no darme cuenta de que el resultado es una constante), no es un compilador anticipado que puede gastar mucho tiempo en el análisis después de todo. Pero más importante aún, SHL con un operando de 32 bits enmascara cl por 0x1F ya. Entonces me parece que estos AND son completamente inútiles. ¿Por qué se generan? ¿Tienen algún propósito que me estoy perdiendo?
Fuera de interés, ¿tiene un enlace sobre SHL ya enmascarado? Miré en un par de lugares pero no pude encontrar ninguna declaración al respecto. (Ataque eso, acabo de encontrarlo.) –
No es un experto, así que disculpe si es una pregunta estúpida, pero cómo se llena el registro 'cl'. ¿Es la operación 'y' la manera más rápida de poblar eso quizás? – weston
Este código generado en su totalidad me parece gibero. ¿Por qué dividir un lote de instrucciones simple en tantos subjuegos? No tengo Visual Studio disponible en este momento, pero realmente me cuesta creer que el compilador JIT produzca este tipo de ensamblaje ..... – Polity