|
|
@@ -69,13 +69,12 @@ blur_asm:
|
|
|
pop dst
|
|
|
pop src
|
|
|
|
|
|
- ;mov r14,rcx ;guardo rcx para loop
|
|
|
mov r9, rdx ;salvo rdx por los mul
|
|
|
mov rax, PIXEL_SIZE
|
|
|
mul cols
|
|
|
mul radius
|
|
|
; rax:=cols*pix_size*radius => cuantas filas debo saltear
|
|
|
- ;add src, rax
|
|
|
+ add src, rax
|
|
|
add dst, rax ; Avanzo "radius" filas (col*pix_size*radius)
|
|
|
|
|
|
sub filas, radius ;acomodo filas para ignorar los bordes
|
|
|
@@ -86,9 +85,7 @@ blur_asm:
|
|
|
sub cols, radius ;resto radius columnas
|
|
|
|
|
|
|
|
|
- mov rax, PIXEL_SIZE
|
|
|
- mul cols
|
|
|
- mov cols, rax ;cols:=cols*pix_size
|
|
|
+ shl cols, 2 ;multiplico por 4 pixel->byte
|
|
|
|
|
|
.iniciarFila:
|
|
|
lea src, [src+PIXEL_SIZE*radius] ;avanzo radius pixeles (borde)
|
|
|
@@ -99,20 +96,16 @@ blur_asm:
|
|
|
cmp cols, cont_c ; Comparo tamaño con el contador
|
|
|
je .finFila ; Si ya recorri la imagen voy al final
|
|
|
mov filas_faltan, radius
|
|
|
- add filas_faltan, radius
|
|
|
+ shl filas_faltan, 1
|
|
|
inc filas_faltan ; 2r+1 filas
|
|
|
- mov tmp_src, src
|
|
|
+ mov tmp_src, src ;salvo para avanzar despues
|
|
|
pxor xmm10,xmm10
|
|
|
mov matriz, r15 ;voy al inicio de la matriz
|
|
|
- .loopInterno:
|
|
|
+ .loopInterno: ;matriz convulsion
|
|
|
mov col_faltan, radius
|
|
|
- add col_faltan, radius
|
|
|
+ shl col_faltan, 1
|
|
|
inc col_faltan ; 2r+1 columnas
|
|
|
- mov basura, rdx
|
|
|
- mov rax,PIXEL_SIZE
|
|
|
- mul col_faltan ;destruyo rdx
|
|
|
- mov col_faltan, rax
|
|
|
- mov rdx, basura ;recupero rdx
|
|
|
+ shl col_faltan, 2 ; multiplico por 4 para hacer pixel->byte
|
|
|
.loopFila:
|
|
|
movdqu xmm2, [src] ;levanto 4px
|
|
|
cmp col_faltan, 3*PIXEL_SIZE
|
|
|
@@ -120,12 +113,12 @@ blur_asm:
|
|
|
je .tres ;quiero borrar 1 elem
|
|
|
|
|
|
;quiero borrar 3 elem
|
|
|
- pslldq xmm2, 3;ok, borre los que no queria
|
|
|
- psrldq xmm2, 3;ok, borre los que no queria
|
|
|
+ pslldq xmm2, 3*PIXEL_SIZE;ok, borre los que no queria
|
|
|
+ psrldq xmm2, 3*PIXEL_SIZE;ok, borre los que no queria
|
|
|
jmp .normal
|
|
|
.tres:
|
|
|
- pslldq xmm2, 1;ok, borre los que no queria
|
|
|
- psrldq xmm2, 1;ok, borre los que no queria
|
|
|
+ pslldq xmm2, 1*PIXEL_SIZE ;ok, borre los que no queria
|
|
|
+ psrldq xmm2, 1*PIXEL_SIZE ;ok, borre los que no queria
|
|
|
.normal:
|
|
|
;desempaqueto cada pixel a un registro (cada elem como dword)
|
|
|
pxor xmm3,xmm3
|
|
|
@@ -177,7 +170,7 @@ blur_asm:
|
|
|
;actualizo cuantos faltan
|
|
|
sub col_faltan, 4*PIXEL_SIZE
|
|
|
|
|
|
- cmp col_faltan, 0
|
|
|
+ cmp col_faltan, 0 ;termine
|
|
|
jle .finFilaInterna
|
|
|
|
|
|
cmp col_faltan, 4*PIXEL_SIZE ;me faltan entre 0 y 4 pixeles, retrocedo suficiente para que me falten 4 exactos
|
|
|
@@ -188,8 +181,10 @@ blur_asm:
|
|
|
jmp .loopFila
|
|
|
|
|
|
.retroceder:
|
|
|
- lea src, [src-(4-col_faltan)]
|
|
|
- lea matriz, [matriz-(4-col_faltan)] ;retrocedo 1-3
|
|
|
+ mov basura, PIXEL_SIZE*4 ;cargo 4 pixeles por tanda
|
|
|
+ sub basura, col_faltan
|
|
|
+ sub src, basura
|
|
|
+ sub matriz, basura
|
|
|
jmp .loopFila
|
|
|
|
|
|
.finFilaInterna:
|