Parcourir la source

Merge branch 'master' of ssh://git.davidventura.com.ar:443/david/orga2-simd

Fabian il y a 11 ans
Parent
commit
6e13a13800
1 fichiers modifiés avec 30 ajouts et 40 suppressions
  1. 30 40
      filtros/blur_asm.asm

+ 30 - 40
filtros/blur_asm.asm

@@ -1,7 +1,8 @@
-default rel
-global _blur_asm
+default rel global _blur_asm
 global blur_asm
 
+extern convulcion_matriz
+
 ; Alias para no volverme loco con los registros
 %define src 	rdi
 %define dst 	rsi
@@ -9,6 +10,8 @@ global blur_asm
 %define filas 	rcx
 %define sigma 	xmm0
 %define radius 	r8
+%define cont_c	r9
+%define matriz	r10
 
 ; Algunos defines ultiles
 %define PIXEL_SIZE  4
@@ -31,70 +34,57 @@ blur_asm:
     mov rbp, rsp                ; Stack frame
 	push r9
 	push r10
-	push r11
 
 .init:
 	mov r9, rdx					;salvo rdx por los mul
 	mov rax, PIXEL_SIZE
 	mul cols
 	mul radius 
-								;rax ahora es cols*pix_size*radius
-	add src, rax				; Avanzo el radius filas (col*pix_size)
-	add dst, rax				; idem
-
-	mov rax, PIXEL_SIZE
-	mul radius					;rax ahora es radius pixeles
+								; rax:=cols*pix_size*radius => cuantas filas debo saltear
+	add src, rax				; Avanzo "radius" filas (col*pix_size*radius)
+	add dst, rax				
 
-	add src, rax				;avanzo radius pixeles (borde)
-	add dst, rax				;idem
-
-	mov cols, r9				;recupero cols  por el mul
 	sub filas, radius			;acomodo filas para ignorar los bordes
 	sub filas, radius			;acomodo filas para ignorar los bordes
 
-	sub cols, rax				;acomodo cols para ignorar los bordes
+	mov cols, r9				;recupero cols por el mul
+	sub cols, radius			;resto radius columnas 
+	sub cols, radius			;resto radius columnas
 
-	mov rax,PIXEL_SIZE 
+	mov rax, PIXEL_SIZE
 	mul cols
 	mov cols, rax 				;cols:=cols*pix_size
-	xor r9,r9
-	xor r10,r10
+
+.iniciarFila:
+	lea src, [src+PIXEL_SIZE*radius]	;avanzo radius pixeles (borde)
+	lea dst, [dst+PIXEL_SIZE*radius]	;avanzo radius pixeles (borde)
+	xor cont_c,cont_c
+
 .loop:
-    cmp cols, r9              	; Comparo tamaño con el contador
-    jl .finFila                    ; Si ya recorri la imagen voy al final
+    cmp cols, cont_c           	; Comparo tamaño con el contador
+    je .finFila                    ; Si ya recorri la imagen voy al final
     ;movdqu xmm0, [src]          ; Cargo la imagen 1 => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
 	pxor xmm0,xmm0
 
 .write:
-    movdqu [dst], xmm0          ; Escribo en el destino
+    movd [dst], xmm0          ; Escribo en el destino
 .endLoop:
-    add src, PIXEL_SIZE * 4     ; Incremento 4 pixeles
-    add dst, PIXEL_SIZE * 4
-    add r9, PIXEL_SIZE * 4
+    add src, PIXEL_SIZE      ; Incremento 4 pixeles
+    add dst, PIXEL_SIZE
+    add cont_c, PIXEL_SIZE
     jmp .loop
 
 .finFila:
-	inc r10 
-	cmp r10,filas
-	jge .fin
-
-	xor r9,r9
-
-	mov r11, rdx				;salvo rdx
-	mov rax, PIXEL_SIZE
-	mul radius					;rax ahora es radius pixeles
-
-	add src, rax				;agrego radius a la columna inicial
-	add src, rax				;agrego radius a la columna inicial
-	add dst, rax
-	add dst, rax
+	dec filas
+	cmp filas, qword 0
+	je .fin
 
-	mov rdx, r11				;recupero rdx
+	lea src, [src+PIXEL_SIZE*radius]	;agrego radius a la columna (termino la fila)
+	lea dst, [dst+PIXEL_SIZE*radius]
 
-	jmp .loop
+	jmp .iniciarFila
 
 .fin:
-	pop r11
 	pop r10
 	pop r9
     pop rbp