|
|
@@ -21,6 +21,9 @@ extern convulcion_matrix
|
|
|
|
|
|
; Mascaras y esas cosas
|
|
|
section .data
|
|
|
+ ;copiar: db 0,1,2,3,0,1,2,3,3,2,1,0,3,2,1,0;0,1,2,3,0,1,2,3
|
|
|
+ copiar: db 0,1,2,3
|
|
|
+ ;copiar: db 3,2,1,0,3,2,1,0,3,2,1,0,3,2,1,0
|
|
|
|
|
|
section .text
|
|
|
;void blur_asm (
|
|
|
@@ -100,6 +103,8 @@ blur_asm:
|
|
|
add filas_faltan, radius
|
|
|
inc filas_faltan ; 2r+1 filas
|
|
|
mov tmp_src, src
|
|
|
+ pxor xmm10,xmm10
|
|
|
+ movdqu xmm11,[copiar]
|
|
|
.loopInterno:
|
|
|
mov col_faltan, radius
|
|
|
add col_faltan, radius
|
|
|
@@ -112,7 +117,7 @@ blur_asm:
|
|
|
.loopFila:
|
|
|
|
|
|
;levanto 4px
|
|
|
- movdqu xmm2, [src] ; Cargo 4 pix de la imagen 1 => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
|
|
|
+ movdqu xmm2, [src] ; Cargo 4 pix de la imagen 1 => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
|
|
|
cmp col_faltan, 3
|
|
|
jg .normal ;no qiuero shiftear
|
|
|
je .tres ;quiero borrar 3 elem
|
|
|
@@ -126,18 +131,38 @@ blur_asm:
|
|
|
psrldq xmm2, 3;ok, borre los que no queria
|
|
|
.normal:
|
|
|
;desempaqueto cada pixel a un registro (cada elem como dword)
|
|
|
- punpcklbw xmm2, xmm3
|
|
|
- punpckhbw xmm2, xmm4
|
|
|
-
|
|
|
- punpcklwd xmm3, xmm5
|
|
|
- punpckhwd xmm3, xmm6
|
|
|
- punpcklwd xmm4, xmm7
|
|
|
- punpckhwd xmm4, xmm8
|
|
|
+ pxor xmm3,xmm3
|
|
|
+ pxor xmm4,xmm4
|
|
|
+ pxor xmm5,xmm5
|
|
|
+ pxor xmm6,xmm6
|
|
|
+ pxor xmm7,xmm7
|
|
|
+ pxor xmm8,xmm8
|
|
|
+ pxor xmm11,xmm11
|
|
|
+
|
|
|
+ movdqa xmm12, xmm2 ;salvo
|
|
|
+ punpcklbw xmm3, xmm2 ;pix a,b
|
|
|
+ punpckhbw xmm4, xmm2 ;pix c,d
|
|
|
+
|
|
|
+ punpcklwd xmm5, xmm3 ;pix a
|
|
|
+ punpckhwd xmm6, xmm3 ;pix b
|
|
|
+ punpcklwd xmm7, xmm4 ;pix c
|
|
|
+ punpckhwd xmm8, xmm4 ;pix d
|
|
|
|
|
|
;cargo 1 elem de matriz como single
|
|
|
movd xmm9, [matriz]
|
|
|
- ;TODO lo clono con mascara a los 4 elem del xmm
|
|
|
-
|
|
|
+ ;pshufb xmm9, xmm11;lo clono con mascara a los 4 elem del xmm
|
|
|
+ pshufd xmm9, xmm9, 0x00
|
|
|
+
|
|
|
+
|
|
|
+ psrldq xmm5, 3
|
|
|
+ psrldq xmm6, 3
|
|
|
+ psrldq xmm7, 3
|
|
|
+ psrldq xmm8, 3
|
|
|
+ ;int2float
|
|
|
+ CVTDQ2PS xmm5,xmm5
|
|
|
+ CVTDQ2PS xmm6,xmm6
|
|
|
+ CVTDQ2PS xmm7,xmm7
|
|
|
+ CVTDQ2PS xmm8,xmm8
|
|
|
;multiplico cada pixel por su coeficiente de la matriz(float)
|
|
|
mulps xmm5, xmm9
|
|
|
mulps xmm6, xmm9
|
|
|
@@ -180,8 +205,13 @@ blur_asm:
|
|
|
;faltan >0 filas? jmp .loopInterno
|
|
|
|
|
|
.sumar:
|
|
|
+ xor rax,rax
|
|
|
.write:
|
|
|
- movdqu [dst], xmm10 ; Escribo en el destino
|
|
|
+ ;packusdw xmm10,xmm10
|
|
|
+ ;packuswb xmm10,xmm10
|
|
|
+ CVTPS2DQ xmm10,xmm10
|
|
|
+ ;me quedan 4 int dword<=255, necesito moverlos a 4byte en la parte baja
|
|
|
+ movd [dst], xmm10 ; Escribo en el destino
|
|
|
.endLoop:
|
|
|
mov src, tmp_src
|
|
|
add src, PIXEL_SIZE ; Incremento 1 pixel
|