|
@@ -5,8 +5,8 @@ global blur_asm
|
|
|
; Alias para no volverme loco con los registros
|
|
; Alias para no volverme loco con los registros
|
|
|
%define src rdi
|
|
%define src rdi
|
|
|
%define dst rsi
|
|
%define dst rsi
|
|
|
-%define filas rdx
|
|
|
|
|
-%define cols rcx
|
|
|
|
|
|
|
+%define cols rdx
|
|
|
|
|
+%define filas rcx
|
|
|
%define sigma xmm0
|
|
%define sigma xmm0
|
|
|
%define radius r8
|
|
%define radius r8
|
|
|
|
|
|
|
@@ -30,8 +30,11 @@ blur_asm:
|
|
|
push rbp
|
|
push rbp
|
|
|
mov rbp, rsp ; Stack frame
|
|
mov rbp, rsp ; Stack frame
|
|
|
push r9
|
|
push r9
|
|
|
|
|
+ push r10
|
|
|
|
|
+ push r11
|
|
|
|
|
|
|
|
.init:
|
|
.init:
|
|
|
|
|
+ mov r9, rdx ;salvo rdx por los mul
|
|
|
mov rax, PIXEL_SIZE
|
|
mov rax, PIXEL_SIZE
|
|
|
mul cols
|
|
mul cols
|
|
|
mul radius
|
|
mul radius
|
|
@@ -39,17 +42,21 @@ blur_asm:
|
|
|
add src, rax ; Avanzo el radius filas (col*pix_size)
|
|
add src, rax ; Avanzo el radius filas (col*pix_size)
|
|
|
add dst, rax ; idem
|
|
add dst, rax ; idem
|
|
|
|
|
|
|
|
-; lea src, [rax+PIXEL_SIZE*cols*radius]
|
|
|
|
|
-
|
|
|
|
|
mov rax, PIXEL_SIZE
|
|
mov rax, PIXEL_SIZE
|
|
|
- mul radius ;rax ahora es pix_size*radius
|
|
|
|
|
|
|
+ mul radius ;rax ahora es radius pixeles
|
|
|
|
|
+
|
|
|
add src, rax ;avanzo radius pixeles (borde)
|
|
add src, rax ;avanzo radius pixeles (borde)
|
|
|
add dst, rax ;idem
|
|
add dst, rax ;idem
|
|
|
|
|
|
|
|
- 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
|
|
|
|
|
|
|
+ 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
|
|
sub cols, rax ;acomodo cols para ignorar los bordes
|
|
|
|
|
+
|
|
|
|
|
+ mov rax,PIXEL_SIZE
|
|
|
|
|
+ mul cols
|
|
|
|
|
+ mov cols, rax ;cols:=cols*pix_size
|
|
|
xor r9,r9
|
|
xor r9,r9
|
|
|
xor r10,r10
|
|
xor r10,r10
|
|
|
.loop:
|
|
.loop:
|
|
@@ -61,7 +68,6 @@ blur_asm:
|
|
|
.write:
|
|
.write:
|
|
|
movdqu [dst], xmm0 ; Escribo en el destino
|
|
movdqu [dst], xmm0 ; Escribo en el destino
|
|
|
.endLoop:
|
|
.endLoop:
|
|
|
- ; 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 src, PIXEL_SIZE * 4 ; Incremento 4 pixeles
|
|
|
add dst, PIXEL_SIZE * 4
|
|
add dst, PIXEL_SIZE * 4
|
|
|
add r9, PIXEL_SIZE * 4
|
|
add r9, PIXEL_SIZE * 4
|
|
@@ -71,9 +77,25 @@ blur_asm:
|
|
|
inc r10
|
|
inc r10
|
|
|
cmp r10,filas
|
|
cmp r10,filas
|
|
|
jge .fin
|
|
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
|
|
|
|
|
+
|
|
|
|
|
+ mov rdx, r11 ;recupero rdx
|
|
|
|
|
+
|
|
|
jmp .loop
|
|
jmp .loop
|
|
|
|
|
|
|
|
.fin:
|
|
.fin:
|
|
|
|
|
+ pop r11
|
|
|
pop r10
|
|
pop r10
|
|
|
|
|
+ pop r9
|
|
|
pop rbp
|
|
pop rbp
|
|
|
ret
|
|
ret
|