blur_asm.asm 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. default rel global _blur_asm
  2. global blur_asm
  3. extern convulcion_matriz
  4. ; Alias para no volverme loco con los registros
  5. %define src rdi
  6. %define dst rsi
  7. %define cols rdx
  8. %define filas r14
  9. %define sigma xmm0
  10. %define radius r8
  11. %define cont_c r9
  12. %define matriz r10
  13. ; Algunos defines ultiles
  14. %define PIXEL_SIZE 4
  15. ; Mascaras y esas cosas
  16. section .data
  17. section .text
  18. ;void blur_asm (
  19. ;unsigned char *src,
  20. ;unsigned char *dst,
  21. ;int filas,
  22. ;int cols,
  23. ;float sigma,
  24. ;int radius)
  25. _blur_asm:
  26. blur_asm:
  27. push rbp
  28. mov rbp, rsp ; Stack frame
  29. push r9
  30. push r10
  31. push r14
  32. push r15
  33. .init:
  34. mov r14,rcx ;guardo rcx para loop
  35. mov r9, rdx ;salvo rdx por los mul
  36. mov rax, PIXEL_SIZE
  37. mul cols
  38. mul radius
  39. ; rax:=cols*pix_size*radius => cuantas filas debo saltear
  40. ;add src, rax
  41. add dst, rax ; Avanzo "radius" filas (col*pix_size*radius)
  42. sub filas, radius ;acomodo filas para ignorar los bordes
  43. sub filas, radius ;acomodo filas para ignorar los bordes
  44. mov cols, r9 ;recupero cols por el mul
  45. sub cols, radius ;resto radius columnas
  46. sub cols, radius ;resto radius columnas
  47. mov rax, PIXEL_SIZE
  48. mul cols
  49. mov cols, rax ;cols:=cols*pix_size
  50. .iniciarFila:
  51. ;lea src, [src+PIXEL_SIZE*radius] ;avanzo radius pixeles (borde)
  52. lea dst, [dst+PIXEL_SIZE*radius] ;avanzo radius pixeles (borde)
  53. xor cont_c,cont_c
  54. .loop:
  55. cmp cols, cont_c ; Comparo tamaño con el contador
  56. je .finFila ; Si ya recorri la imagen voy al final
  57. ;pxor xmm1,xmm1
  58. ;float == dword
  59. movd xmm1, [src] ; Cargo la imagen 1 => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
  60. .write:
  61. movd [dst], xmm1 ; Escribo en el destino
  62. .endLoop:
  63. add src, PIXEL_SIZE ; Incremento 4 pixeles
  64. add dst, PIXEL_SIZE
  65. add cont_c, PIXEL_SIZE
  66. jmp .loop
  67. .finFila:
  68. dec filas
  69. cmp filas, qword 0
  70. je .fin
  71. lea src, [src+PIXEL_SIZE*radius] ;agrego radius a la columna (termino la fila)
  72. lea dst, [dst+PIXEL_SIZE*radius]
  73. jmp .iniciarFila
  74. .fin:
  75. pop r15
  76. pop r14
  77. pop r10
  78. pop r9
  79. pop rbp
  80. ret