significado de las restricciones de ensamblaje en línea g ++ (igual a más, etc.)

He estado usando esta pequeña función en gcc/x86 para hacer un intercambio rápido de bytes de int16_t:

static inline int16_t MySwapInt16t(int16_t val)
{
   __asm__ ("xchgb %b0, %h0" : "=Q" (val) : "0" (val));
   return val;
}

... hoy, mientras navegaba por el código de otra persona en línea, vi que tenía una función similar que se ve así:

static inline int16_t HisSwapInt16t(int16_t val)
{
   __asm__ ("xchgb %h0, %b0" : "+Q" (val));
   return val;
}

Las diferencias entre mi función y su función (AFAICT) son:

  1. Especifica "+Q" en lugar de "=Q"
  2. Las posiciones de %h0 y %b0 se intercambian
  3. No tiene cláusula : "0" (val) al final de su función

Por lo que puedo decir, ambas implementaciones parecen funcionar correctamente, pero el ensamblaje en línea es un poco un arte negro para mí, por lo que alguien con conocimientos puede explicar:

  1. ¿Cuál es el significado de las tres diferencias enumeradas anteriormente?
  2. ¿Es una de las dos implementaciones mejor o más rápida que la otra, o ambas funcionarán de manera equivalente?

preguntado el 12 de junio de 12 a las 19:06

1 Respuestas

Especifica "+Q" en lugar de "=Q"

No tiene cláusula : "0" (val) al final de su función

La + El modificador representa un operando de entrada y salida, por lo tanto, no es necesario agregar una lista de entrada, verifique el manual de instrucciones sobre eso.

Las posiciones de %h0 y %b0 se intercambian

Supongo que no importa desde el xchg instrucción hace un intercambio de contenido entre los dos operandos.

¿Es una de las dos implementaciones mejor o más rápida que la otra, o ambas funcionarán de manera equivalente?

Para encontrar la mejor implementación, compilaría ambos y consultaría con objdump cómo el compilador envolvió estas funciones ya que la función central será la misma instrucción única.

Espero que esto ayude!

Respondido el 20 de junio de 20 a las 10:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.