2012-01-27 15 views
7

SSE2 intrinsics'i ve inline assembler'ı gcc'de karıştırmaya çalıştım. Ama bir değişken xmm0/register olarak girdiysem bazı durumlarında bir derleyici hatası alıyorum. Örnek:Hem SSE2 intrinsics'i hem de gcc inline assembler'ı kullanın.

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

gcc sürümü 4.6.1 ile derlenmiş zaman olsun:

>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 

garip şey diğer giriş değişkenleri sahip aynı vakalarda/kayıtları sonra aniden xmm0 olarak çalışmasıdır giriş ama değil xmm1, vb. Ve başka bir durumda xmm0-xmm4 belirtmek mümkün ama yukarıda değil. Bu konuda sinirli/Biraz karıştı:

Teşekkür :)

cevap

11

Sen derleyici izin vermeli S kayıt atama yapmak. İşte pshufb bir örnek (SSSE3 için tmmintrin olmayan çok eski gcc için) var:

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; 
} 

Not derleyici seçilen register içinde yerine yerleştirir "x" argümanlar üzerinde eleme ve montaj kendisinde sadece %0.

Doğru değiştiricileri kullanmaya dikkat edin. "+x", xmm'un hem giriş hem de çıkış parametresi anlamına gelir. Bu değiştiricilerle özensiz iseniz (örneğin, "=x" sadece "+x"'a ihtiyaç duyduğunuzda çıkış anlamına gelir), bazen çalıştığı ve bazen bulunmadığı durumlarda karşılaşırsınız.

+0

Sen bir yıldızsın! Teşekkürler :) –

İlgili konular