2012-01-27 8 views
7

Ho provato a mescolare l'intrinseco SSE2 e l'assemblatore inline in gcc. Ma se specifico una variabile come xmm0/registro come input, allora in alcuni casi ricevo un errore del compilatore. Esempio:Usa sia l'intrinseco SSE2 che l'assemblatore in-gcc

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

Quando compilato con gcc version 4.6.1 ottengo:

>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 

La cosa strana è che in alcuni casi in cui ho altre variabili di input/registri allora funziona improvvisamente con xmm0 come input ma non xmm1, ecc. E in un altro caso sono stato in grado di specificare xmm0-xmm4 ma non sopra. Un po 'confuso/frustrato per questo: S

Grazie :)

risposta

11

Si dovrebbe lasciare il compilatore fare l'assegnazione registro. Ecco un esempio di pshufb (per gcc troppo vecchia per avere tmmintrin per 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; 
} 

Nota la qualificazione "x" sugli argomenti e semplicemente %0 nell'assieme stessa, dove il compilatore sostituirà nel registrarlo selezionato.

Fare attenzione a utilizzare i modificatori corretti. "+x" significa che xmm è sia un parametro di input che di output. Se sei sciatto con questi modificatori (ad esempio usando "=x" significa uscita solo quando hai bisogno di "+x") ti imbatterai in casi in cui a volte funziona e talvolta no.

+0

Sei una stella! Grazie :) –