blur_asm.asm 1.9 KB

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