2016-06-12 9 views
1

コメント:バイト順は以下のプログラムを考える

#include "emmintrin.h" 

int main(int argc, char *argv[]) 
{ 
    volatile __m128i x = _mm_set_epi64x(1, 0); 
    return 0; 
} 

を私は(唯一の興味深い部分をリスト)clang -O -S test.cを使用してアセンブリを取得できます。

... 
movl $1, %eax 
movd %rax, %xmm0 
pslldq $8, %xmm0    # xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7] 
... 

_mm_set_epi64xのマニュアルによると、 %xmm0[0, 1, 0, 0]であり、各要素は整数(32ビット)である必要があります。

ただし、コメントによれば、%xmm0[0, 0, 0, 1]を保持します。私はここでエンディアンが関連しているとは思わない。なぜなら私はレジスターだけを見ているからだ。

私はそれがclangアセンブリのコメントで使用されている表記法に関連していると思っていますが、インターネット上で有用な情報を見つけることはできません。

==編集:

が打ち鳴らすためにbugを提出しました。

答えて

1

clangコードは、2つのステップで値を読み込みます。まず、値1がレジスタの下位64ビットにロードされます。それから、全体が8バイナリの場所にシフトされたままになるので、値1はあなたのコードが指定するように上位64ビットになります。

+0

はい、これも私の理解です。しかし、コメント '#xmm0 = zero ...'は同意していないようです。 –

+0

@AlbertNetymkコメントは 'xmm0'の前の状態を参照します。これは、シフトが実行される前に、実際には最も低い位置に1を含みます。 – fuz

+0

これは非常に直観的ではないでしょう。 'xmm0 =ゼロ、ゼロ、ゼロ、ゼロ、ゼロ、ゼロ、ゼロ、xmm0 [0,1,2,3,4,5,6,7]'は割り当てのように読まれます。このコメントは、以前の状態ではなく、その後のレジスタの状態を反映していることを示しています。IMOは、揮発性__m128i y = _mm_set1_epi32(1); '=>' movaps .LCPI0_0(%rip)、%xmm0#xmm0 = [4294967297,4294967297] 。 –

1

の内容は(コンパイル時には分かっていますが)pslldqという操作が記述されているようです。

_mm_setが使用する通常のハイエファーストファースト([ 3 2 1 0 ])とは逆の順番になり、「左」シフトが意味をなさないと思われます。

ベクトルを格納していれば、メモリに格納されるバイトオーダーです。

これはclangにとって典型的なものなのか、私は忘れています。今は別の例を確認する時間がありません。

関連する問題