2012-01-27 6 views
7

SSE2イントリンシックとインラインアセンブラをgccに混在させようとしました。しかし、変数としてxmm0/registerを入力として指定した場合、にはというケースがありますが、コンパイラエラーが発生します。例:SSE2イントリンシックとgccインラインアセンブラの両方を使用

>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で動作するということです。私が得る

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

gccのバージョン4.6.1でコンパイルされましたxmm1などは入力できません。別のケースでは、xmm0-xmm4は指定できましたが、上記は指定できませんでした。このことについて不満を/少し混乱:S

感謝:)

答えて

11

あなたはコンパイラがレジスタの割り当てを行うようにする必要があります。ここでpshufbの例としては、(SSSE3ためtmmintrinを持つことが古すぎるgcc用)です:

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"が必要な場合のみです)、時にはうまく動作しないことがあります。

+0

あなたはスターです!ありがとう:) –

関連する問題