|
|
@@ -17,6 +17,7 @@ global diff_asm
|
|
|
section .data
|
|
|
; Mascara para realizar un shuffle para repetir los valores del diff
|
|
|
SHUFFLE_MASK: db 2,2,2,255,3,3,3,255,0,0,0,255,1,1,1,255
|
|
|
+ DIVIDIR: dw 21,21,21,21,0,0,0,0
|
|
|
|
|
|
section .text
|
|
|
;void diff_asm (
|
|
|
@@ -60,8 +61,15 @@ diff_asm:
|
|
|
punpckhbw xmm0, xmm2 ; Desempaqueto la parte alta => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|R(P2)|A(P2)|
|
|
|
punpcklbw xmm1, xmm2 ; Desempaqueto la parte baja => xmm1 = |B(P3)|G(P3)|R(P3)|A(P3)|B(P4)|G(P4)|R(P4)|A(P4)|
|
|
|
|
|
|
+ ; Sumo horizontalmente los pixeles:
|
|
|
phaddw xmm0, xmm1 ; xmm0 = |B(P1)+G(P1)|R(P1)+A(P1)|B(P2)+G(P2)|R(P2)+A(P2)|....|
|
|
|
phaddw xmm0, xmm2 ; xmm0 = |B+G+R+A (P1)| B+G+R+A(P2) | B+G+R+A(P3) | B+G+R+A(P4)| 0x0 | 0x0 | 0x0 | 0x0 |
|
|
|
+
|
|
|
+.dividir:
|
|
|
+ movdqu xmm3, [DIVIDIR] ; Cargo la mascara para dividir
|
|
|
+ pmullw xmm0, xmm3 ; Multiplico y almaceno parte baja TODO: Demostrar que no puedo llegar a la parte alta
|
|
|
+ psrlw xmm0, 6 ; Divido por 64
|
|
|
+
|
|
|
packuswb xmm0, xmm2 ; xmm0 = |P1|P2|P3|P4|0x0|0x0|0x0|0x0|0x0|....|
|
|
|
|
|
|
movdqu xmm2, [SHUFFLE_MASK] ; Cargo la mascara para shuffle
|