gb

http://d.hatena.ne.jp/kikx/20090306#1236365725

これはくやしいなぁ、と思う。 mag01[y & 1] を odd 3 でやる方法を思いついた時は小躍りしたのだけど、まだ縮むのかー。普通にやると、

spu_and(spu_cmpeq(spu_and(y, 1), 1), mag01)

とかで、 even 3 つ使うことになるんだと思う。たぶん。 1 と and を取って、結果が 1 なら一旦全 bit に 1 を立てる命令 cmpeq で 1 を立てて、それと mag01 の and を取れば欲しい結果が入る、と。

でまぁこれは下位 1bit だけを使えば良いので、下位 1bit だけ集めてくる gb という命令が odd 側にあるので、これを使うと、

si_lqx(spu_slqw(spu_gather(y), 4), mag_mem)

とかにすることができる。何をやってるかというと、 4 words の下位 bit 4 つを集めてきて、それを 4 つ左シフトすることによって 16 倍する。するとその部分は、

0, 16, 32, 64, ..., 240

とかになるので、これを index とするようにメモリからテーブル引きすれば良い。

でもまだなんかあるらしいので楽しみ。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h