Per il codice come questo:Perché vengono generate istruzioni AND?
int res = 0;
for (int i = 0; i < 32; i++)
{
res += 1 << i;
}
Questo codice viene generato (modalità di rilascio, senza debugger, 64bit):
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
ora posso vedere il punto di maggior parte delle istruzioni lì, ma ciò che è con le istruzioni AND? ecx sarà mai essere più di 0x1F in questo codice comunque, ma lo scuso per non averlo notato (e anche per non notare che il risultato è una costante), non è un compilatore in anticipo che può permettersi di spendere molto tempo dopo l'analisi. Ma ancora più importante, SHL con un operando a 32 bit maschera già per 0x1F. Quindi mi sembra che questi AND siano completamente inutili. Perché vengono generati? Hanno uno scopo che mi manca?
Per motivi di interesse, hai già un collegamento su SHL che maschera? Ho cercato in un paio di posti ma non sono riuscito a trovare alcuna dichiarazione in tal senso. (Colpiscilo - trovalo.) –
Non un esperto - quindi scusa se domanda stupida, ma come si popola il registro 'cl'. L'operazione 'e' è il modo più veloce per farlo, forse? – weston
Questo intero codice generato mi sembra giberiano. perché rompere un semplice batch di istruzioni in così tanti sottogruppi? Non ho studio visivo disponibile in questo momento, ma ho davvero difficoltà a credere che il compilatore JIT produca questo tipo di assemblaggio ..... – Polity