| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- default rel
- global _blur_asm
- global blur_asm
- ; Alias para no volverme loco con los registros
- %define src rdi
- %define dst rsi
- %define filas rdx
- %define cols rcx
- %define sigma xmm0
- %define radius r8
- ; 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
- .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
- ; 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
- 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
- .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 dst, 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
|