コメント:バイト順は以下のプログラムを考える
#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を提出しました。
はい、これも私の理解です。しかし、コメント '#xmm0 = zero ...'は同意していないようです。 –
@AlbertNetymkコメントは 'xmm0'の前の状態を参照します。これは、シフトが実行される前に、実際には最も低い位置に1を含みます。 – fuz
これは非常に直観的ではないでしょう。 '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] 。 –