toge's diary

コンピュータ関連の趣味をつらつらと。

shufpsにはまる

MMX2 命令の pshufw とは挙動が違うのに注意してください.

ぐへ、本当だよ。まさかこんな仕様になっているとは...。

#include 

int main ()
{
  float a[4] = {1.0, 2.0, 3.0, 4.0};
  float b[4] = {5.0, 6.0, 7.0, 8.0};
  float c[4];

  asm (" \
       movups (%1), %%xmm1;\
       movups (%2), %%xmm2;\
       shufps $4, %%xmm2, %%xmm1;\
       movups %%xmm1,%0;\
       "
       : "=g" (c) : "r" (&a), "r" (&b));

  printf ("c={%g,%g,%g,%g}\n", c[0], c[1], c[2], c[3]);
  return 0;
}

この結果は"c={1,2,5,5}"になるのでした。がっくし。