MD5 optimized in MMX part3
ってのがMD5のコアの部分をマクロ化した所なのですよ。*1
#define MD5STEP(f, w, x, y, z, data, s) \
( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
f()関数、rotation部*2はpart2で発見した最適化ですべてMMX化できます。
問題は足し算しているところなのです。32bitだとオーバーフローしていいところなのだろうけど(定かではないが)MMXレジスタは32bit変数を二つ並べて持っているわけだから
さて、どうするべきか〜。
http://homepage1.nifty.com/herumi/adv/adv10.html
http://www1.kcn.ne.jp/~robe/pf/pf009.html
http://hp.vector.co.jp/authors/VA014520/asmhsp/chap8.html
http://mcierror.axisz.jp/wares/c_tips/mmx_1.html
を読んでみてもっと考えてみようと思う。記事と著者に感謝。
解決:padddとか使えば別に普通に大丈夫みたいですね。ではでは。
*1:出展:google:GNETのmd5.c public domainです。
*2:カンマで区切っている2番目のところ