前回のエントリーで説明した書き方では大変分かりにくいので、図で示す。 Aのような配置のとき、128bitレジスタではBに示しているように白と黒をそれぞれ上位と下位64bitにして別々にした形で持っている。 この配置のうち、一番上の一行を16bit整数にする場合を取り上げる。 もちろん一番簡単な方法は0byte目と8byte目を取り出して連結することだが、それでは縦の列を計算する場合別の方法をとらなければならない。また、黒白反転は値を入れ替えればよいものの、左右対称のコードをつくる場合簡単にはいかない。(spu_reverseというような関数があればよかったのだが) そこで汎用性があり、それほど性能的なペナルティもなさそうな方法として、Cに示した以下のような方法を採用した。 spu_shuffleで、一番上の行を下位8bitに、上位8bitが0の16bit整数8つからなるベクトルを生成する(