Hola a todos. Estoy intentando optimizar un programa en C utilizando código de ensamblador y trabajando con MMX de forma inline. El problema que tengo es que tras escribir el código y compilar tengo varios errores de compilación que no esperaba y no se como solucionar.
A continuación os podré un fragmento de código y los errores. Aparecen varios errores, pero si uno se fija un poco, son casi todos debidos a la misma razón, al mover algo de los registros del tipo "eax", "ebx", "edi", "esi", ... a registros del tipo mmx.
En principio, empleo para ello la instrucción "movl" pero no compila con ella. También he probado "movq" y "movd" con idéntico resultado. A ver si alguien me puede iluminar un poco.
Fragmento de código:
237 __asm__ ("movl %%ebx, %mm2"); // Movemos la letra a mm2
238 __asm__ ("psrlw %mm2, 1"); // Desplazamos para coger el primer bit
239 __asm__ ("movq %mm2, %mm0");
240 __asm__ ("movl %%esi, %mm1");
241 __asm__ ("pand %mm1, %mm0");
242 __asm__ ("movl %0, %%ecx": : "g" (img.imagen[cont]));
243 __asm__ ("movl %%ecx, %mm1");
244 __asm__ ("movl %%edi, %mm2");
245 __asm__ ("pand %mm2, %mm1");
246 __asm__ ("por %mm1, %mm0");
247 __asm__ ("movl %mm0, %%eax");
248 __asm__ ("movl %%eax, %0": "=g" (img.imagen[cont]));
Errores al compilar: gcc -g -Wall -o a a.c
a.c: Assembler messages:
a.c:237: Error: bad register name `%%ebx'
a.c:238: Error: suffix or operands invalid for `psrlw'
a.c:240: Error: bad register name `%%esi'
a.c:242: Error: suffix or operands invalid for `mov'
a.c:243: Error: bad register name `%%ecx'
a.c:244: Error: bad register name `%%edi'
a.c:247: Error: bad register name `%%eax'
make: *** [compm] Error 1
Gracias por vuestra ayuda.