あるふぁブレンドw/MMX
たぶん探し方が悪い
(続き)
どこにでもありそうなコード片のはずなのに、ちょろっと探した程度では意外と見つからなかったので無から書いてみ、た、ものの・・・普段あまり扱わない分野だけにどうにも慣れのなさがガガ。おかしいなぁ、こんな苦労するつもりじゃなかったんだけど・・・。
; 作業用定数 mov eax, 0FFh movd mm5, eax pshufw mm5, mm5, 15h pxor mm7, mm7 ; 入力: eax=ARGB S:α付ピクセル ; edx=aRGB D:合成先背景 movd mm0, eax movd mm1, edx punpcklbw mm0, mm7 punpcklbw mm1, mm7 sar eax, 24 por mm0, mm5 movd mm2, eax psubw mm0, mm1 pshufw mm3, mm2, 55h punpcklbw mm2, mm2 movq mm4, mm3 pshufw mm2, mm2, 0 pand mm3, mm0 paddw mm0, mm0 pxor mm2, mm4 paddw mm1, mm3 pmulhw mm0, mm2 paddw mm1, mm1 pxor mm0, mm4 paddw mm0, mm1 pavgw mm0, mm7 packuswb mm0, mm0 ; 出力: mm0=aRGB:aRGB
ええとこれ16bit幅の乗算1回で誤差なく計算する方法は恐らく他に無い、というか、中途半端にうまくいくような余地はたぶんなさそうな気がするわけで、つまりうっとうしくめんどくさいわりに結論だけは誰が書いても同じになるとかいう絶望展開の悪寒。すなわち車輪は再発明される定めなのです。いやていうか昔どっかで見たような気はするんだよなぁ実際。うぅーん。
実のところなにがしかの2Dレンダリングエンジンの類をあたれば当然あるはずで、探し方はたぶん悪いではなく明らかに悪いが正解。とはいえ探すのがめんどくさくなって書き始めたものを今更答え合わせのために探し直す気力なんて逆立ちしてもありはしないので、うんもう動いたからいいや。まる。
乗算以降の直列依存をこれ以上減らす方法は無いと思います。乗算より前はあまり自信がない。出力のaが不定でいいならmm5は不要です。いずれにせよこのままだと冒頭のpunpck+sarとか乗算の後とか明らかに詰まりますが、アンロールしての練り込みは用途の状況次第なのでコード片としてはこの程度で終わりでしょう。ということにしておこう。
そしてとりあえずSSEはどこまでいってもゴミであった。どう目算してもARGBを1回ブレンドするだけでは出入りのオーバーヘッドを取り返せない。なるほど MMX is King. である。とはいえARGB×ARGBの合成なら定数でない除算が入り込むのでそれならrcpssの出番が・・・と思いきや、これがまたちゃんと漸近を一段追加しないと精度不足で誤差が残る始末。そんなばなな。11bit精度で8bitの結果を計算して誤差が残るというのは何か釈然としない・・・けれど、ばななのことを深く考えても仕方がないので打ち切り終了。*1
AVX? いえ知らない子ですね・・・。