Pregunta

GCC genera el código para la reproducción aleatoria () a continuación:

movaps xmm0,XMMWORD PTR [rip+0x125]
pshufb xmm4,xmm0

Lo ideal sería que esto debe ser:

pshufb xmm4,XMMWORD PTR [rip+0x125]

¿Cuál es la sintaxis extendida ASM para generar esta sola instrucción?

Muchas gracias, Adam

PS: El intrínseca comentado genera el código óptimo para este ejemplo. Esto no funciona en general (GCC es susceptible de generar copias de registros innecesarios en la presencia de variables globales del registro).

#include <stdint.h>

typedef int8_t xmm_t __attribute__ ((vector_size (16)));
const xmm_t xmm_shuf={128, 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15};
register xmm_t xmm __asm__("xmm4");

#define NTL ".intel_syntax noprefix\n"
#define ATT ".att_syntax\n"

void shuffle() {
  //xmm=__builtin_ia32_pshufb128(xmm, xmm_shuf);
  __asm__(NTL"pshufb %0, %1\n"ATT : "=x" (xmm) : "x" (xmm_shuf));
}

int main() {
}

$ gcc -Os -std = gnu99 -msse4.1 -flax-vector-conversiones pshufb_128bit_constant.c && objdump -d -m i386: x86-64: Intel a.out | menos

0000000000400494 <shuffle>:
  400494:       0f 28 05 25 01 00 00    movaps xmm0,XMMWORD PTR [rip+0x125]        # 4005c0 &lt;xmm_shuf+0x10&gt;
  40049b:       66 0f 38 00 e0          pshufb xmm4,xmm0
  4004a0:       c3                      ret   
¿Fue útil?

Solución

Cambiar la restricción del operando de entrada a "xm", de modo que las posiciones de memoria se les permite además a los registros de la ESS.

Sin embargo, cuando lo probé, el código generado por el compilador que no se sienta bien con la sintaxis de Intel. Así que, al final, esto es lo que he utilizado:

__asm__("pshufb %1, %0" : "+x" (xmm) : "xm" (xmm_shuf));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top