Цитата(kons @ Mar 9 2009, 15:55)

Простенький пример - цикл вычисления FIR. Данные берутся из циркулярного буфера (DL_PTR, DL_BASE, DL_SIZE)...
конечно компилер так не сможет скомпилировать, потому что у вас куча допущений: например длина циклического буфера кратна 4 словам! и соотвественно STUFF_CNT тоже кратно 4. Если вы сумеете объяснить это компилятору...
По поводу раскрутки циклов IAR это делать умеет простой пример:
Код
unsigned test(unsigned *dl, unsigned *suff)
{
unsigned r;
unsigned cnt;
r = 0;
cnt = 16;
do {
r += (*(dl++)) * (*(suff++));
}while(--cnt);
return r;
}
получаем листинг
Код
1 unsigned test(unsigned *dl, unsigned *suff)
2 {
\ test:
\ 00000000 00402DE9 PUSH {LR}
\ 00000004 04D04DE2 SUB SP,SP,#+4
3 unsigned r;
4 unsigned cnt;
5 r = 0;
\ 00000008 0020A0E3 MOV R2,#+0
6 cnt = 16;
\ 0000000C 0430A0E3 MOV R3,#+4
7 do {
8 r += (*(dl++)) * (*(suff++));
\ ??test_0:
\ 00000010 04C090E4 LDR R12,[R0], #+4
\ 00000014 04E091E4 LDR LR,[R1], #+4
\ 00000018 9E2C22E0 MLA R2,LR,R12,R2
9 }while(--cnt);
\ 0000001C 04C090E4 LDR R12,[R0], #+4
\ 00000020 04E091E4 LDR LR,[R1], #+4
\ 00000024 9E2C22E0 MLA R2,LR,R12,R2
\ 00000028 04C090E4 LDR R12,[R0], #+4
\ 0000002C 04E091E4 LDR LR,[R1], #+4
\ 00000030 9E2C22E0 MLA R2,LR,R12,R2
\ 00000034 04C090E4 LDR R12,[R0], #+4
\ 00000038 04E091E4 LDR LR,[R1], #+4
\ 0000003C 9E2C22E0 MLA R2,LR,R12,R2
\ 00000040 013053E2 SUBS R3,R3,#+1
\ 00000044 F1FFFF1A BNE ??test_0
10 return r;
\ 00000048 0200A0E1 MOV R0,R2
\ 0000004C 04D08DE2 ADD SP,SP,#+4 ;; stack cleaning
\ 00000050 0080BDE8 POP {PC} ;; return
11 }
да LDMIA конечно не задействован, но раскрутка на лицо.
А если взять такую функцию (раскрутить цикл вручную)
Код
unsigned test(unsigned *dl, unsigned *suff, unsigned cnt)
{
unsigned r;
r = 0;
do {
unsigned d1,d2,d3,d4;
unsigned s1,s2,s3,s4;
d1 = *(dl++);
d2 = *(dl++);
d3 = *(dl++);
d4 = *(dl++);
s1 = *(suff++);
s2 = *(suff++);
s3 = *(suff++);
s4 = *(suff++);
r += s1*d1 + s2*d2 + s3*d3 + s4*d4;
}while(cnt-=4);
return r;
}
и взять компилер помощнее ( RVCT 4.0)
то получим такой asm
Код
; generated by ARM C/C++ Compiler, RVCT4.0 [Build 471]
; commandline armcc [-S -O3 -Otime test.c]
ARM
REQUIRE8
PRESERVE8
AREA ||.text||, CODE, READONLY, ALIGN=2
test PROC
PUSH {r4-r10}
MOV r3,#0
|L1.8|
LDR r12,[r0],#4
LDM r1!,{r7,r8,r10}
LDM r0!,{r4-r6}
MUL r12,r7,r12
MUL r5,r10,r5
MLA r12,r8,r4,r12
LDR r9,[r1],#4
SUBS r2,r2,#4
MLA r4,r9,r6,r5
ADD r12,r12,r4
ADD r3,r3,r12
BNE |L1.8|
POP {r4-r10}
MOV r0,r3
BX lr
ENDP
так что умеют компиляторы и LDMIA использовать

я конечно не утверждаю что надо без asm обходится! действительно многие вещи приходится писать на нем, но часто в силу того что на С не объснить компилеру некоторые ньюансы. Но не стоит недооценивать современные компиляторы.