Преглед на файлове

arreglo muchos avances/retrocesos de byte a pixel

David преди 11 години
родител
ревизия
58ee3cbf6e
променени са 1 файла, в които са добавени 16 реда и са изтрити 21 реда
  1. 16 21
      filtros/blur_asm.asm

+ 16 - 21
filtros/blur_asm.asm

@@ -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: