リスト4●リスト3の処理を自分でアセンブリ言語で書き直した
プリフェッチ命令を使って,メモリー・アクセスの高速化も図った
void CChildView::OnEditBwAsm()
{
int nMaxX = m_Image.GetWidth(); //画像の横方向の画素数(幅)
int nMaxY = m_Image.GetHeight(); //画像の縦方向の画素数(高さ)
MyRGB* data = (MyRGB*)malloc( sizeof(MyRGB) * nMaxX * nMaxY );
<画素を抜き出す処理・省略>
//モノクロ変換
int cnt = nMaxX * nMaxY; //繰り返し回数
__asm
{
push esi
push edi
mov ecx, cnt
mov esi, data
$loop:
mov eax, [esi].G
mov edx, [esi].R
lea ebx, [eax*2 + eax] ;ebx = G*3
lea edi, [edx*2 + edx] ;edi = R*3
mov eax, [esi].B
lea edx, [ebx*2 + edi] ;edx = G*6 + R*3
add eax, edx ;eax = G*6 + R*3 + B
mov ebx, 10
xor edx, edx
div ebx ;eax = (G*6 + R*3 + B) / 10
mov [esi].Result, eax
add esi, 16 ;次の画素のアドレス
lea ebx, [esi+16]
prefetcht0 [ebx] ;すべてのキャッシュにプリフェッチ
dec ecx
jnz $loop
pop edi
pop esi
}
<画像に反映する処理・省略>
}