[GNUインラインアセンブラ] SIMD命令
下記のようなGNUインラインアセンブラを含むプログラムをMac Book Airにてgccでコンパイルして実行するとPSUBSW命令は、mm0 - mm1の結果がmm0に入りますが、IntelのDevelopper's manualのPSUBSW命令の説明においては、mm1-mm0の結果がmm1に入るとなっています。
これは、なぜなのでしょうか。
---- Begin source code -----
1 #include <stdio.h>
2
3 int
4 main()
5 {
6 short int a[4] = {1111,1112,1113,1114};
7 short int b[4] = {1111,2112,3113,4114};
8 short int c[4];
9
10 asm volatile (
11 "movq (%1),%%mm0\n\t"
12 "movq (%2),%%mm1\n\t"
13 "psubsw %%mm1,%%mm0\n\t"
14 "movq %%mm0,%0\n\t"
15 "emms"
16 : "=g"(c): "r"(&a),"r"(&b));
17
18 printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);
19
20 return 0;
21 }
---- End source code -----
Intel developper's manual (http://www.intel.co.jp/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf)
PSUBSW mm, mm/m64
Subtract signed packed words in mm/m64 from signed packed words in mm and saturate results.
補足
ありがとうございます。うまくいきました。 しかしなぜマッチング制約を利用するのかわかりません。 できれば説明をお願いします。もしくはサイトだけでもお願いします。