es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo sumar horizontalmente bytes firmados en XMM.

Estoy escribiendo código en ensamblador x64 y usando SIMD.

Tengo 9 bytes empaquetados en el registro “xmm15”. Para simplificar, vamos a analizar el siguiente código:

.data
Masks BYTE 0, -1, 0, -1, 5, -1, 0, -1, 0

.code
GetSumOfMasks proc

movdqu xmm15, xmmword ptr [Masks]
; xmm15 ahora contiene { 0,-1,0,-1,5,-1,0,-1,0,0,0,0,0,0,0,0 }

; suma los elementos horizontalmente - el resultado debería ser 1
; convierte la suma a un QWORD y colócalo en RAX

GetSumOfMasks endp

¿Cómo puedo obtener la suma horizontal de los elementos que están en “xmm15”?

He intentado con “haddps”, pero parece que solo funciona con DWORDs sin signo, y no pude encontrar una alternativa que opere en bytes.

¿Qué instrucción(es) SSE puedo utilizar para sumar los bytes con signo en esta situación?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para sumar los bytes con signo en xmm15, se puede utilizar la instrucción phaddd. Esta instrucción suma pares adyacentes de doublewords con signo dentro del registro xmm horizontalmente, resultando en dos sumas de doubleword con signo. Luego, se puede utilizar movq para mover el lower doubleword dentro de rax, que contendrá la suma de los bytes con signo en xmm15. Así es como se puede modificar el código para utilizar phaddd y obtener la suma horizontal:

    .data
    Masks BYTE 0, -1, 0, -1, 5, -1, 0, -1, 0
    
    .code
    GetSumOfMasks proc
    
    movdqu xmm15, xmmword ptr [Masks] ; xmm15 ahora contiene { 0,-1,0,-1,5,-1,0,-1,0,0,0,0,0,0,0,0 }
    
    phaddd xmm15, xmm15 ; suma horizontalmente doublewords con signo adyacentes, resultando en dos sumas de doubleword con signo
    
    movq rax, xmm15 ; mueve la suma del lower doubleword a rax
    
    GetSumOfMasks endp
    

    Después de ejecutar estas instrucciones, rax contendrá la suma horizontal de los bytes con signo en xmm15, que en este caso debería ser 1.

Comments are closed.