|
|
@@ -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
|