Keil - CM0 optimize kod uretiminde karsilastigim mantik

Başlatan z, 27 Ekim 2019, 07:43:34

z

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.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

OptimusPrime

O da senin ne yaptigina anlam vermemistir. :D

Gorunuse gore donguyu hizlandirmis. i yi 10 kere artirmiyorda 5 kere artirarak cozume gidiyor. ::ok
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

WrtM

Loop unrolling mantığı gibi geldi.birde optimizasyon ayarlarını değiştirip çıktıları incelemek
gerek
http://bertantaskin.com/loop-unrolling/