int a;
int main(void)
{
int i;
for (i=0;i<10;i++)
{
a=a+1;
if (a>5) a=a+2;
}
}
CM0 islemci icin yukaridaki kodu yazip hiz acisindan 3 seviyesinde optimizasyonla derledim ve asm ciktisina baktigimda sanki kodu asagidaki gibi yazmisim da derlemisim gibi kod uretildigini gordum.
int a;
int main(void)
{
int i;
for (i=0;i<5;i++)
{
a=a+1;
if (a>5) a=a+2;
a=a+1;
if (a>5) a=a+2;
}
}
Derleyici hiz kazanmak icin nasil bir sorun gordu de kodu boyle derledi?
Ilk akla gelen jmp komutlarindan dolayi pipeline bosaltma durumu.
Fakat for dongusu icin ve if a>5 icin zaten jmp kullaniyor. Dolayisi ile dongu sayisini yari yariya dusururken if sayisindan dolayi loop icindeki jmp sayisini 2 ye katliyor.
Bir anlam veremedim.
O da senin ne yaptigina anlam vermemistir. :D
Gorunuse gore donguyu hizlandirmis. i yi 10 kere artirmiyorda 5 kere artirarak cozume gidiyor. ::ok
Loop unrolling mantığı gibi geldi.birde optimizasyon ayarlarını değiştirip çıktıları incelemek
gerek
http://bertantaskin.com/loop-unrolling/