blur_asm.asm 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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 cols rdx
  8. %define filas 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. push r10
  29. push r11
  30. .init:
  31. mov r9, rdx ;salvo rdx por los mul
  32. mov rax, PIXEL_SIZE
  33. mul cols
  34. mul radius
  35. ;rax ahora es cols*pix_size*radius
  36. add src, rax ; Avanzo el radius filas (col*pix_size)
  37. add dst, rax ; idem
  38. mov rax, PIXEL_SIZE
  39. mul radius ;rax ahora es radius pixeles
  40. add src, rax ;avanzo radius pixeles (borde)
  41. add dst, rax ;idem
  42. mov cols, r9 ;recupero cols por el mul
  43. sub filas, radius ;acomodo filas para ignorar los bordes
  44. sub filas, radius ;acomodo filas para ignorar los bordes
  45. sub cols, rax ;acomodo cols para ignorar los bordes
  46. mov rax,PIXEL_SIZE
  47. mul cols
  48. mov cols, rax ;cols:=cols*pix_size
  49. xor r9,r9
  50. xor r10,r10
  51. .loop:
  52. cmp cols, r9 ; Comparo tamaño con el contador
  53. jl .finFila ; Si ya recorri la imagen voy al final
  54. ;movdqu xmm0, [src] ; Cargo la imagen 1 => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
  55. pxor xmm0,xmm0
  56. .write:
  57. movdqu [dst], xmm0 ; Escribo en el destino
  58. .endLoop:
  59. add src, PIXEL_SIZE * 4 ; Incremento 4 pixeles
  60. add dst, PIXEL_SIZE * 4
  61. add r9, PIXEL_SIZE * 4
  62. jmp .loop
  63. .finFila:
  64. inc r10
  65. cmp r10,filas
  66. jge .fin
  67. xor r9,r9
  68. mov r11, rdx ;salvo rdx
  69. mov rax, PIXEL_SIZE
  70. mul radius ;rax ahora es radius pixeles
  71. add src, rax ;agrego radius a la columna inicial
  72. add src, rax ;agrego radius a la columna inicial
  73. add dst, rax
  74. add dst, rax
  75. mov rdx, r11 ;recupero rdx
  76. jmp .loop
  77. .fin:
  78. pop r11
  79. pop r10
  80. pop r9
  81. pop rbp
  82. ret