2012-01-27 15 views
7

He intentado mezclar intrínsecos SSE2 y ensamblador en línea en gcc. Pero si especifico una variable como xmm0/register como entrada, entonces en algunos casos obtengo un error de compilación. Ejemplo:Use intrínsecos SSE2 y ensamblador en línea gcc

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

cuando se compila con gcc versión 4.6.1 consigo:

>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 

Lo curioso es que en los mismos casos en los que tengo otras variables de entrada/registros luego de repente trabaja con xmm0 como entrada pero no xmm1, etc. Y en otro caso pude especificar xmm0-xmm4 pero no arriba. Un poco confundido/frustrado por esto: S

Gracias :)

Respuesta

11

Debe dejar que el compilador de hacer la asignación de registro. He aquí un ejemplo de pshufb (por gcc demasiado viejo para tener tmmintrin para 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 del "x" calificador en los argumentos y simplemente %0 en el montaje en sí, donde el compilador va a sustituir en el registro se seleccionaron.

Tenga cuidado de usar los modificadores correctos. "+x" significa xmm es tanto un parámetro de entrada como de salida. Si está descuidado con estos modificadores (por ejemplo, usando "=x" significando salida solo cuando necesitó "+x") se encontrará con casos en los que a veces funciona y otras veces no.

+0

¡Eres una estrella! Gracias :) –

Cuestiones relacionadas