gccのインラインアセンブラのデモ
何となく作ってみたgccのインラインアセンブラを使った超簡単なサンプルプログラム。
ついでにSSE2命令を使ってみた。
#includevoid 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];