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?
davy.ai
Para sumar los bytes con signo en
xmm15
, se puede utilizar la instrucciónphaddd
. Esta instrucción suma pares adyacentes de doublewords con signo dentro del registroxmm
horizontalmente, resultando en dos sumas de doubleword con signo. Luego, se puede utilizarmovq
para mover el lower doubleword dentro derax
, que contendrá la suma de los bytes con signo enxmm15
. Así es como se puede modificar el código para utilizarphaddd
y obtener la suma horizontal:Después de ejecutar estas instrucciones,
rax
contendrá la suma horizontal de los bytes con signo enxmm15
, que en este caso debería ser1
.