Цитата(_Pasha @ Nov 15 2012, 14:28)

А заинлайнить BitShift() и Butterfly() слабо?

Когда там запилят уже fixed point в gcc? В С11 уже ж вроде попало. Или в 4.8 уже есть?
Сюда
Код
typedef int _Complex cmplx_t;
//cmplx_t a = 2 + 3I;
//cmplx_t b = -1 + 2I;
void foo(cmplx_t *px, cmplx_t *py, cmplx_t w, int len)
{
while(len--) {
cmplx_t temp = *px + *py * w;
*py = *px - *py * w;
*px = temp;
++px;
++py;
}
}
arm-none-eabi-gcc -Os -S -mcpu=cortex-m3 -mthumb cmplx-int.c
CODE
foo:
push {r4, r5, r6, r7, r8, lr}
ldr r4, [sp, #24]
b .L2
.L3:
ldmdb r1, {r5, r8}
mul r7, r2, r5
mls r7, r3, r8, r7
mul r8, r2, r8
mla r5, r3, r5, r8
ldr ip, [r0, #-8]
ldr r6, [r0, #-4]
rsb r8, r7, ip
str r8, [r1, #-8]
add r7, ip, r7
rsb r8, r5, r6
adds r5, r6, r5
str r8, [r1, #-4]
str r7, [r0, #-8]
str r5, [r0, #-4]
.L2:
subs r4, r4, #1
adds r0, r0, #8
adds r1, r1, #8
cmp r4, #-1
bne .L3
pop {r4, r5, r6, r7, r8, pc}
ещё fixed point встроенный, так и вообще хорошо.
(правда это Cortex-M3, тут ещё mla/mls хорошо пошли)
Закат солнца вручную тоже нормально выглядит:
Код
#define FIXED_FACTOR (1<<12)
typedef int _Complex cmplx_t;
void foo(cmplx_t *px, cmplx_t *py, cmplx_t w, int len)
{
while(len--) {
cmplx_t temp = *py * w / FIXED_FACTOR;
*px = *px + temp;
*py = *px - temp;
++px;
++py;
}
}
CODE
foo:
push {r4, r5, r6, r7, r8, lr}
ldr r4, [sp, #24]
b .L2
.L5:
ldmdb r1, {r5, r8}
mul r6, r2, r5
mls r6, r3, r8, r6
mul r8, r2, r8
mla r5, r3, r5, r8
cmp r6, #0
itt lt
addlt r6, r6, #4064
addlt r6, r6, #31
cmp r5, #0
ldr ip, [r0, #-8]
ldr r7, [r0, #-4]
itt lt
addlt r5, r5, #4064
addlt r5, r5, #31
add r6, ip, r6, asr #12
add r5, r7, r5, asr #12
str r6, [r0, #-8]
str r5, [r0, #-4]
str ip, [r1, #-8]
str r7, [r1, #-4]
.L2:
subs r4, r4, #1
adds r0, r0, #8
adds r1, r1, #8
cmp r4, #-1
bne .L5
pop {r4, r5, r6, r7, r8, pc}
(ой, ну по нормальному там не ++px; ++py; а раскрыв крыльев бабочки передавать надо)