|
@@ -14,7 +14,7 @@ global diff_asm
|
|
|
; Algunos defines ultiles
|
|
; Algunos defines ultiles
|
|
|
%define PIXEL_SIZE 4
|
|
%define PIXEL_SIZE 4
|
|
|
%define SHIFT_VALUE 8 ; Potencia de 2 para hacer el calculo del promedio en enteros.
|
|
%define SHIFT_VALUE 8 ; Potencia de 2 para hacer el calculo del promedio en enteros.
|
|
|
-%define DIV_VALUE (2^SHIFT_VALUE)/3 ; Multiplico por el valor sobre 3 para hacer un shift de 8bits a la derecha. (DIV * P)>>8
|
|
|
|
|
|
|
+%define DIV_VALUE 85 ; Multiplico por el valor sobre 3 para hacer un shift de 8bits a la derecha. (DIV * P)>>8
|
|
|
; TODO: El valor SHIFT_VALUE NO PUEDE ser mayor a 8 o pierdo información en la multiplicacion
|
|
; TODO: El valor SHIFT_VALUE NO PUEDE ser mayor a 8 o pierdo información en la multiplicacion
|
|
|
; Para ser mayor tengo que multiplicar y tener en cuenta la parte alta (pmulhw)
|
|
; Para ser mayor tengo que multiplicar y tener en cuenta la parte alta (pmulhw)
|
|
|
; Se que el valor máximo que va a haber que multiplicar es es (255*3), por eso puedo
|
|
; Se que el valor máximo que va a haber que multiplicar es es (255*3), por eso puedo
|
|
@@ -62,7 +62,6 @@ diff_asm:
|
|
|
movdqu xmm1, xmm0 ; Copio xmm0 a xmm1
|
|
movdqu xmm1, xmm0 ; Copio xmm0 a xmm1
|
|
|
punpckhbw xmm0, xmm2 ; Desempaqueto la parte alta => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|R(P2)|A(P2)|
|
|
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)|
|
|
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:
|
|
; 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, 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 |
|
|
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 |
|
|
@@ -70,9 +69,8 @@ diff_asm:
|
|
|
.dividir:
|
|
.dividir:
|
|
|
pmullw xmm0, xmm3 ; Multiplico y almaceno parte baja, no llego a usar la parte alta si SHIFT_VALUE < 8
|
|
pmullw xmm0, xmm3 ; Multiplico y almaceno parte baja, no llego a usar la parte alta si SHIFT_VALUE < 8
|
|
|
psrlw xmm0, SHIFT_VALUE ; Divido por el valor
|
|
psrlw xmm0, SHIFT_VALUE ; Divido por el valor
|
|
|
-
|
|
|
|
|
|
|
+.shuffle:
|
|
|
packuswb xmm0, xmm2 ; xmm0 = |P1|P2|P3|P4|0x0|0x0|0x0|0x0|0x0|....|
|
|
packuswb xmm0, xmm2 ; xmm0 = |P1|P2|P3|P4|0x0|0x0|0x0|0x0|0x0|....|
|
|
|
-
|
|
|
|
|
movdqu xmm2, [SHUFFLE_MASK] ; Cargo la mascara para shuffle
|
|
movdqu xmm2, [SHUFFLE_MASK] ; Cargo la mascara para shuffle
|
|
|
pshufb xmm0, xmm2 ; Le hago un shuffle a xmm0 con los nuevos valores calculados
|
|
pshufb xmm0, xmm2 ; Le hago un shuffle a xmm0 con los nuevos valores calculados
|
|
|
.write:
|
|
.write:
|