Bläddra i källkod

commitinicial que recorre como idiota

David 11 år sedan
förälder
incheckning
0cdd3f58f5
1 ändrade filer med 37 tillägg och 17 borttagningar
  1. 37 17
      filtros/blur_asm.asm

+ 37 - 17
filtros/blur_asm.asm

@@ -5,10 +5,10 @@ global blur_asm
 ; Alias para no volverme loco con los registros
 %define src 	rdi
 %define dst 	rsi
-%define cont 	rdx
-%define size 	rcx
-%define sigma 	r8
-%define radius 	r9
+%define filas 	rdx
+%define cols 	rcx
+%define sigma 	xmm0
+%define radius 	r8
 
 ; Algunos defines ultiles
 %define PIXEL_SIZE  4
@@ -29,21 +29,34 @@ _blur_asm:
 blur_asm:
     push rbp
     mov rbp, rsp                ; Stack frame
+	push r9
 
-.calc_size:                     ; Calculo el tamaño de la imagen en bytes
-    mov rax, cont               ; Cargo filas
-    mul size                    ; Multiplico por las columnas
-    mov rbx, PIXEL_SIZE         ; Multiplico temporal
-    mul rbx                     ; Multiplico por el tamaño del pixel
-    mov size, rax               ; Guardo el tamaño
-    xor cont, cont              ; Limpio el contador
+.init:
+	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
 
-.loop:
-    cmp cont, size              ; Comparo tamaño con el contador
-    jge .fin                    ; 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)|......|
+;	lea src, [rax+PIXEL_SIZE*cols*radius]
+
+	mov rax, PIXEL_SIZE
+	mul radius					;rax ahora es pix_size*radius
+	add src, rax				;avanzo radius pixeles (borde)
+	add dst, rax				;idem
 
-.cuentas:                       ; Resto componente a componente de 4 pixeles de cada imagen
+	sub filas, rax				;acomodo filas para ignorar los bordes
+	sub filas, rax				;acomodo filas para ignorar los bordes
+	sub cols, rax				;acomodo cols para ignorar los bordes
+	sub cols, rax				;acomodo cols para ignorar los bordes
+	xor r9,r9
+	xor r10,r10
+.loop:
+    cmp cols, r9              	; Comparo tamaño con el contador
+    jl .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
@@ -51,9 +64,16 @@ blur_asm:
     ; TODO: Si el tamaño de la imagen no es multiplo de 4 acá va a sumar y hacer invalid read al llegar al final
     add src, PIXEL_SIZE * 4     ; Incremento 4 pixeles
     add dst, PIXEL_SIZE * 4
-    add cont, PIXEL_SIZE * 4
+    add r9, PIXEL_SIZE * 4
     jmp .loop
 
+.finFila:
+	inc r10 
+	cmp r10,filas
+	jge .fin
+	jmp .loop
+
 .fin:
+	pop r10
     pop rbp
     ret