7

SSE2組み込み関数とインラインアセンブラをgccでミックスしようとしました。しかし、変数をxmm0 / registerとして入力として指定すると、場合によってはコンパイラエラーが発生します。例:

#include <emmintrin.h>
int main() {
  __m128i test = _mm_setzero_si128(); 
  asm ("pxor %%xmm0, %%xmm0" : : "xmm0" (test) : );
}

gccバージョン4.6.1でコンパイルすると、次のようになります。

>gcc asm_xmm.c
asm_xmm.c: In function ‘main’:
asm_xmm.c:10:3: error: matching constraint references invalid operand number
asm_xmm.c:7:5: error: matching constraint references invalid operand number

奇妙なことに、他の入力変数/レジスタがある場合、突然xmm0が入力として機能しますが、xmm1などは機能しません。また、別のケースでは、xmm0〜xmm4を指定できましたが、上記は指定できませんでした。これについて少し混乱/イライラ:S

ありがとう :)

4

1 に答える 1

11

コンパイラにレジスタの割り当てを行わせる必要があります。以下に例を示しますpshufb( SSSE3gccには古すぎるtmmintrinため):

static inline __m128i __attribute__((always_inline))
_mm_shuffle_epi8(__m128i xmm, __m128i xmm_shuf)
{
    __asm__("pshufb %1, %0" : "+x" (xmm) : "xm" (xmm_shuf));
    return xmm;
}

"x"引数と、単にアセンブリ自体の修飾子に注意してください%0。コンパイラは、選択したレジスタで置換します。

適切な修飾子を使用するように注意してください。 "+x"xmm、入力パラメーターと出力パラメーターの両方です。これらの修飾子がお粗末な場合(たとえば"=x"、必要な場合にのみ意味出力を使用する"+x"場合)、機能する場合と機能しない場合があります。

于 2012-01-27T21:39:49.053 に答える