Цитата
проснулся чисто спортивно-исследовательский интерес
Это полезно

А какая у Вас в основном работа идет с пикселями исходного изображения? Имеется в виду - попиксельно или группами (блоками)?
Если попиксельно - рассмотрите вопрос о хранении пикселей исходной картинки, например, в виде 00rrr00ggg00bb00, по 16 бит на пиксель (конечно, буфер экрана будет весить в 2 раза больше). Тогда операцию усреднения можно выполнять сразу над пикселями и обращений к таблице будет намного меньше. Нечто такое:
Код
void foo(volatile unsigned char *dst, unsigned int *src)
{
unsigned int t;
//Пиксели по *src хранятся в виде
//00rrr00ggg00bb00
t=src[64];
t+=*src++;
t+=t<<16;
//Имеем после сложения четырех пикселей
//rrrxxgggxxbbxx00----------------
//По таблице конвертируем r- и g-составляющую в rrrggg00, а составляющую b обрабатываем банальным сдвигом
*dst=pal[t>>24]|((t>>20)&3);
//Повторяем
t=src[64];t+=*src++;t+=t<<16;*dst=pal[t>>24]|((t>>20)&3);
t=src[64];t+=*src++;t+=t<<16;*dst=pal[t>>24]|((t>>20)&3);
t=src[64];t+=*src++;t+=t<<16;*dst=pal[t>>24]|((t>>20)&3);
t=src[64];t+=*src++;t+=t<<16;*dst=pal[t>>24]|((t>>20)&3);
}
В результате, одна итерация выглядит так (после IAR'а)
Код
\ 0000002C 002193E5 LDR R2,[R3, #+256]
\ 00000030 04C093E4 LDR R12,[R3], #+4
\ 00000034 02208CE0 ADD R2,R12,R2
\ 00000038 022882E0 ADD R2,R2,R2, LSL #+16
\ 0000003C 22CCD1E7 LDRB R12,[R1, +R2, LSR #+24]
\ 00000040 222AA0E1 LSR R2,R2,#+20
\ 00000044 032002E2 AND R2,R2,#0x3
\ 00000048 0C2082E1 ORR R2,R2,R12
\ 0000004C 0020C0E5 STRB R2,[R0, #+0]
Вроде ниче не напутал.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин