blur_asm.asm 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. default rel
  2. global _blur_asm
  3. global blur_asm
  4. ; Alias para no volverme loco con los registros
  5. %define src rdi
  6. %define dst rsi
  7. %define filas rdx
  8. %define cols rcx
  9. %define sigma xmm0
  10. %define radius r8
  11. ; Algunos defines ultiles
  12. %define PIXEL_SIZE 4
  13. ; Mascaras y esas cosas
  14. section .data
  15. section .text
  16. ;void blur_asm (
  17. ;unsigned char *src,
  18. ;unsigned char *dst,
  19. ;int filas,
  20. ;int cols,
  21. ;float sigma,
  22. ;int radius)
  23. _blur_asm:
  24. blur_asm:
  25. push rbp
  26. mov rbp, rsp ; Stack frame
  27. push r9
  28. .init:
  29. mov rax, PIXEL_SIZE
  30. mul cols
  31. mul radius
  32. ;rax ahora es cols*pix_size*radius
  33. add src, rax ; Avanzo el radius filas (col*pix_size)
  34. add dst, rax ; idem
  35. ; lea src, [rax+PIXEL_SIZE*cols*radius]
  36. mov rax, PIXEL_SIZE
  37. mul radius ;rax ahora es pix_size*radius
  38. add src, rax ;avanzo radius pixeles (borde)
  39. add dst, rax ;idem
  40. sub filas, rax ;acomodo filas para ignorar los bordes
  41. sub filas, rax ;acomodo filas para ignorar los bordes
  42. sub cols, rax ;acomodo cols para ignorar los bordes
  43. sub cols, rax ;acomodo cols para ignorar los bordes
  44. xor r9,r9
  45. xor r10,r10
  46. .loop:
  47. cmp cols, r9 ; Comparo tamaño con el contador
  48. jl .finFila ; Si ya recorri la imagen voy al final
  49. ;movdqu xmm0, [src] ; Cargo la imagen 1 => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
  50. pxor xmm0,xmm0
  51. .write:
  52. movdqu [dst], xmm0 ; Escribo en el destino
  53. .endLoop:
  54. ; 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
  55. add src, PIXEL_SIZE * 4 ; Incremento 4 pixeles
  56. add dst, PIXEL_SIZE * 4
  57. add r9, PIXEL_SIZE * 4
  58. jmp .loop
  59. .finFila:
  60. inc r10
  61. cmp r10,filas
  62. jge .fin
  63. jmp .loop
  64. .fin:
  65. pop r10
  66. pop rbp
  67. ret