301 Moved Permanently

Moved to https://vow.g.hatena.ne.jp/vow/

あるふぁブレンド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? いえ知らない子ですね・・・。

*1:・・・というのはもちろん冗談であって、11bit精度というのはその除算の商の真値からの相対誤差の上限なので、ある特定の絶対値の桁から数えて8bit分の精度があるとは限らないのが当然の帰結である。ばなな。