最適化


asm volatile (
"ldrsh r4, [ %[pblock] ] \n\t"
"ldrb r5, [ %[pdest] ] \n\t"
"tst r4, #0x80000000 \n\t"
"add r6, r4, r5 \n\t"
"movmi r5, #0x20000000 \n\t"
"tst r6, #0x100 \n\t"
"orreq r5, r5, #0x40000000 \n\t"
"msr cpsr_f, r5 \n\t"
"movhi r6, #0x00 \n\t"
"eor r5, r5, #0x20000000 \n\t"
"msr cpsr_f, r5 \n\t"
"movhi r6, #0xFF \n\t"
"mov %0, r6 \n\t"
: "=r"(a)
: [pblock] "r"(block), [pdest] "r"(dest), "r"(line_size)
: "r4", "r5", "r6", "r7", "r8", "cc", "memory" );

どうも飽和つきsigned short + unsigned charを並列でやるのは無理っぽい。*1
あきらめて1要素づつ演算するようにした。結果、ロード/ストアを除いた部分は分岐無しの10命令になった。条件コードはサイクル数にペナルティ無いよね?

あとはdestからldrbしてるところをワード単位でロードするようにすれば。速くなるといいなぁ。余計に遅くなってるような気もしてきた。

  • -

出来た!

結果は……0.7%の速度向上(笑)。意味無ぇ。

uchar+ucharだと勘違いしてたから、劇的に速くなるぞー、と意気込んでいたんだけどね。
まぁせっかく作ったから入れておこう。

*1:PentiumMMXにはそのものの命令があるから、iWMMXにもあるんだろうなぁ。PXA270積んだ機種だしてくれ〜