RGB565におけるRGBtoBGRの高速化(2)

それでは、16bit環境における高速化されたコードを示そう。

void rgb2bgr(WORD& data) {
data = data xor (data<<11);
data = data xor (data>>11);
data = data xor (data<<11);
}

9 step/pixel
0 work memory

ただし、シフトは論理シフトでないといけない。
C言語の場合はシフトが論理シフトか算術シフトかが決まっていない。(環境依存)
算術シフトの場合(data>>11)が((data>>11)&0x1F)となり1step増えるが、環境に依存しなくなる。
さらにもう一つ環境依存関連だが、ビッグエンディアンを想定して書いているので注意。

さて、最近は32bitのコントローラが多い。(ex.ARM7-TDMI,SH-2)
この場合は2pixel同時処理が可能である。

void rgb2bgr(DWORD& data) {
data = data xor ( (data<<11) & 0xF800F800) );
data = data xor ( (data>>11) & 0x001F001F) );
data = data xor ( (data<<11) & 0xF800F800) );
}
12 step/2pixel = 6step/pixel
0 work memory

はじめは14step/pixelだったのが、6step/pixelとなった。2倍以上速くなっている。

さてこれはハードウェアで実装するとアホみたいに安くできる。
ただ単に配線を入れ替えればいいだけだからだ。