Цитата(klen @ Dec 23 2009, 20:59)

для начала он должен быть разворачивыймым
тоесть число итерацй известно на этапе компиляции иначе непонятно сколько его разворачивать
Да если захочет, то и такие разворачивает. Берёт какое-то число операций для тела - чтобы не одну, сначала выбирает остаток, потом гонит цикл с этим числом.
Код
extern unsigned arr[];
void foo(unsigned cnt)
{
unsigned i;
for(i=0;i<cnt;++i)
arr[i] = i;
}
gcc -O3 -funroll-all-loops
Код
.file "c.c"
.text
.p2align 4,,15
.globl _foo
.def _foo; .scl 2; .type 32; .endef
_foo:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %ecx
testl %ecx, %ecx
je L7
xorl %edx, %edx
leal -1(%ecx), %eax
andl $7, %eax
movl %edx, _arr
movl $1, %edx
cmpl %ecx, %edx
jae L7
testl %eax, %eax
je L8
cmpl $1, %eax
je L35
cmpl $2, %eax
je L36
cmpl $3, %eax
je L37
cmpl $4, %eax
je L38
cmpl $5, %eax
je L39
cmpl $6, %eax
je L40
movl $1, %eax
movl $2, %edx
movl %eax, _arr+4
L40:
movl %edx, _arr(,%edx,4)
incl %edx
L39:
movl %edx, _arr(,%edx,4)
incl %edx
L38:
movl %edx, _arr(,%edx,4)
incl %edx
L37:
movl %edx, _arr(,%edx,4)
incl %edx
L36:
movl %edx, _arr(,%edx,4)
incl %edx
L35:
movl %edx, _arr(,%edx,4)
incl %edx
cmpl %ecx, %edx
jae L7
L8:
movl %edx, _arr(,%edx,4)
leal 1(%edx), %eax
movl %eax, _arr(,%eax,4)
leal 2(%edx), %eax
movl %eax, _arr(,%eax,4)
leal 3(%edx), %eax
movl %eax, _arr(,%eax,4)
leal 4(%edx), %eax
movl %eax, _arr(,%eax,4)
leal 5(%edx), %eax
movl %eax, _arr(,%eax,4)
leal 6(%edx), %eax
movl %eax, _arr(,%eax,4)
leal 7(%edx), %eax
addl $8, %edx
movl %eax, _arr(,%eax,4)
cmpl %ecx, %edx
jb L8
L7:
popl %ebp
ret