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

тоесть число итерацй известно на этапе компиляции
Оно известно. Я на простейшей функции тестирую.
Код
void TestUnroll(unsigned char* ptr1, unsigned char* ptr2)
{
unsigned int i;
for(i = 0; i <100; i++) *ptr2++ = *ptr1++;
}
Получил с -O3 и -funroll-all-loops
Код
void TestUnroll(unsigned char* ptr1, unsigned char* ptr2)
{
E92D4010 stmfd sp!, {r4, lr}
{
E1A0C001 mov r12, r1
E1A0E000 mov lr, r0
E3A04000 mov r4, #0x00000000
unsigned int i;
for(i = 0; i <100; i++) *ptr2++ = *ptr1++;
E1A0000E mov r0, lr
E4D03001 ldrb r3, [r0], #+0x001
E1A0100C mov r1, r12
E4C13001 strb r3, [r1], #+0x001
E5DE2001 ldrb r2, [lr, #+0x001]
E5CC2001 strb r2, [r12, #+0x001]
E5D03001 ldrb r3, [r0, #+0x001]
E5C13001 strb r3, [r1, #+0x001]
E5DE0003 ldrb r0, [lr, #+0x003]
E5CC0003 strb r0, [r12, #+0x003]
E5DE2004 ldrb r2, [lr, #+0x004]
E5CC2004 strb r2, [r12, #+0x004]
E5DE3005 ldrb r3, [lr, #+0x005]
E5CC3005 strb r3, [r12, #+0x005]
E5DE1006 ldrb r1, [lr, #+0x006]
E5CC1006 strb r1, [r12, #+0x006]
E5DE0007 ldrb r0, [lr, #+0x007]
E5CC0007 strb r0, [r12, #+0x007]
E5DE2008 ldrb r2, [lr, #+0x008]
E5CC2008 strb r2, [r12, #+0x008]
E284400A add r4, r4, #0x0000000A
E5DE3009 ldrb r3, [lr, #+0x009]
E3540064 cmp r4, #0x00000064
E5CC3009 strb r3, [r12, #+0x009]
E28EE00A add lr, lr, #0x0000000A
E28CC00A add r12, r12, #0x0000000A
1AFFFFE4 bne 0x000002C0
E8BD8010 ldmfd sp!, {r4, pc}
Я видимо не правильно вопрос задал потому как циклы все же разворачивает, но частично - 100 итераций превращаются в 10 по 10. Сразу в 100 не хочет.
Где то это ограничение задается?