gccのインラインアセンブラのデモ

何となく作ってみたgccインラインアセンブラを使った超簡単なサンプルプログラム。
ついでにSSE2命令を使ってみた。

#include 

void test()
{
    int i[4];
    int j[4] = { 1, 2, 3, 4 };
    int k[4] = { 5, 6, 7, 8 };

    asm("movdqa %0, %%xmm0" : "=m" (j));
    asm("movdqa %0, %%xmm1" : "=m" (k));
    asm("paddd  %xmm1, %xmm0");
    asm("movdqa %%xmm0, %0" : "=m" (i));

    printf("%d, %d, %d, %d\n", i[0], i[1], i[2], i[3]);
}

int main()
{
    test();

    return 0;
}


配列j、kの中身を足してiに代入する。
実行すると下記のようになる。

$ gcc test.c
$ ./a.out
6, 8, 10, 12


本来なら下記のようにやるのを、128ビットのレジスタを使って一気に代入してる。

i[0] = j[0] + k[0];
i[1] = j[1] + k[1];
i[2] = j[2] + k[2];
i[3] = j[3] + k[3];