Gömülü mimarimizde, 64-bit IAB (Talimat Hizalama Tamponu) var. Getirme sırasını optimize etmek için, bir ilmiğin gövdesinin bir 8 bayt sınırına hizalanmaya başlaması gerekir.C döngü için vücut C ile nasıl hizalanır?
Bunu, .balign
yönergesini kullanarak derlemede gerçekleştirmek kolaydır, ancak C derleyicisinin kodu hizalaması için ipucu verecek bir sözdizimi bulamıyorum.
.balign
yönergesiyle satır içi derlemeyle for döngüsünden önce gelmeye çalışmak, döngü döngüsünün kendisinin değil, döngü prologunu (kurulum) hizaladığından çalışmaz.
Döngünün içinde asm()
satırının olduğu yerde aynı işlemi yapmak, döngü döngüsüne nop
-s ekleyen döngü gövdesine ekler.
DÜZENLEME 1: İlk c=a+b
bir 8 bayt adresine uyumlu hale getirilmesi istediğiniz
__asm__ volatile("nop");
__asm__ volatile("nop");
for (j0=0; j0<N; j0+=4)
{
c[j0+ 0] = a[j0+ 0] + b[j0+ 0];
c[j0+ 1] = a[j0+ 1] + b[j0+ 1];
c[j0+ 2] = a[j0+ 2] + b[j0+ 2];
c[j0+ 3] = a[j0+ 3] + b[j0+ 3];
}
: kodunu varsayalım. Ön derlemeden sonra yukarıdaki gibi nop
-s ekleyebilirim, ancak bu 1. kod değişikliği ile kırılacak bir geçici çözümdür.
DÜZEN 2: @R .. sayesinde, çözüm -falign-loops=8
derleyici seçeneğini kullanmaktır.
Yani özünde, döngü * gövdesinin * hizalanmasına neden olacak nop-s'leri istiyorsun, ama bu nop'lerin döngüden önce çıkmasını istiyorsun * prolog *? – ruakh
@ruakh - evet, döngü bitimindeki döngü yönergesi hizalanmış bir bellek konumuna işaret ettiği sürece, nop'lerin prologda kendiliğinden oluşturulup oluşturulmadığı umurumda değil. – ysap
Anlaşıldı. Bu harika bir soru! – ruakh