2012-01-27 142 views
7

我試圖混合使用gcc中的SSE2內聯函數和內聯彙編器。但是,如果我指定一個變量爲xmm0 /寄存器作爲輸入,然後在一些的情況下,我得到一個編譯器錯誤。例如:使用SSE2內在函數和gcc內聯彙編器

#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

謝謝:)

回答

11

你應該讓編譯器做的寄存器分配。下面是pshufb範例(gcc太老了,tmmintrin爲SSSE3):

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既是輸入參數又是輸出參數。如果你對這些修飾語sl(不樂(例如,僅在需要"+x"時使用"=x"才表示輸出),您將遇到有時可以正常工作並且有時無法正常工作的情況。

+0

你是明星!謝謝 :) – 2012-01-27 21:54:25