| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- 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
- %define cols rdx
- %define filas rcx
- %define sigma xmm0
- %define radius r8
- %define cont_c r9
- %define matriz r10
- ; Algunos defines ultiles
- %define PIXEL_SIZE 4
- ; Mascaras y esas cosas
- section .data
- section .text
- ;void blur_asm (
- ;unsigned char *src,
- ;unsigned char *dst,
- ;int filas,
- ;int cols,
- ;float sigma,
- ;int radius)
- _blur_asm:
- blur_asm:
- push rbp
- mov rbp, rsp ; Stack frame
- push r9
- push r10
- .init:
- mov r9, rdx ;salvo rdx por los mul
- mov rax, PIXEL_SIZE
- mul cols
- mul radius
- ; rax:=cols*pix_size*radius => cuantas filas debo saltear
- add src, rax ; Avanzo "radius" filas (col*pix_size*radius)
- add dst, rax
- sub filas, radius ;acomodo filas para ignorar los bordes
- sub filas, radius ;acomodo filas 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
- mul cols
- mov cols, rax ;cols:=cols*pix_size
- .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, 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:
- movd [dst], xmm0 ; Escribo en el destino
- .endLoop:
- add src, PIXEL_SIZE ; Incremento 4 pixeles
- add dst, PIXEL_SIZE
- add cont_c, PIXEL_SIZE
- jmp .loop
- .finFila:
- dec filas
- cmp filas, qword 0
- je .fin
- lea src, [src+PIXEL_SIZE*radius] ;agrego radius a la columna (termino la fila)
- lea dst, [dst+PIXEL_SIZE*radius]
- jmp .iniciarFila
- .fin:
- pop r10
- pop r9
- pop rbp
- ret
|