SFMTをSPUで動かしてみる。

どこかでやってたネタではあるが(チラッと見ただけなので、どこのどなたか覚えてない…)、練習がてらSFMTをSPUに移植してみる。
SFMTというのは SIMD-oriented Fast Mersenne Twister という疑似乱数生成器で、 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index-jp.html が本家のページである。名前の通りSIMD対応しており、現状最新の1.3.3を見ると、x86系のSSE2PowerPC系のAltiVecに対応しているようだ。今回はAltiVec版をベースにSPUへ移植する。ただ動かすだけの移植はそれほど難しくなく、とゆーのもSPUのSIMDAltiVecに似てるため、ほとんど直訳だった。
対応関係をまとめてみると、

vec_perm() -> spu_shuffle()
vec_sl() -> spu_sl()
vec_xor() -> spu_xor()
vec_and() -> spu_and()

ここまでは完全に直訳で、引数まで同じなため文字列置換でOKだった。
ちょっと迷ったのが右シフトで、

vec_sr() -> spu_rlmask()

という左シフト命令の一種に対して、シフト量をマイナスで指定すると右シフトになる。