|
@@ -112,22 +112,20 @@ blur_asm:
|
|
|
mov rax,PIXEL_SIZE
|
|
mov rax,PIXEL_SIZE
|
|
|
mul col_faltan ;destruyo rdx
|
|
mul col_faltan ;destruyo rdx
|
|
|
mov col_faltan, rax
|
|
mov col_faltan, rax
|
|
|
- mov rdx, basura ;salvo rdx
|
|
|
|
|
|
|
+ mov rdx, basura ;recupero rdx
|
|
|
.loopFila:
|
|
.loopFila:
|
|
|
|
|
+ movdqu xmm2, [src] ;levanto 4px
|
|
|
|
|
+ cmp col_faltan, 3*PIXEL_SIZE
|
|
|
|
|
+ jg .normal ;no quiero shiftear
|
|
|
|
|
+ je .tres ;quiero borrar 1 elem
|
|
|
|
|
|
|
|
- ;levanto 4px
|
|
|
|
|
- movdqu xmm2, [src] ; Cargo 4 pix de la imagen 1 => xmm0 = |B(P1)|G(P1)|R(P1)|A(P1)|B(P2)|G(P2)|......|
|
|
|
|
|
- cmp col_faltan, 3
|
|
|
|
|
- jg .normal ;no qiuero shiftear
|
|
|
|
|
- je .tres ;quiero borrar 3 elem
|
|
|
|
|
- ;quiero borrar 1 elem
|
|
|
|
|
-
|
|
|
|
|
- .uno:
|
|
|
|
|
- ;shift (4-faltantes) bytes
|
|
|
|
|
- psrldq xmm2, 1;ok, borre los que no queria
|
|
|
|
|
|
|
+ ;quiero borrar 3 elem
|
|
|
|
|
+ pslldq xmm2, 3;ok, borre los que no queria
|
|
|
|
|
+ psrldq xmm2, 3;ok, borre los que no queria
|
|
|
jmp .normal
|
|
jmp .normal
|
|
|
.tres:
|
|
.tres:
|
|
|
- psrldq xmm2, 3;ok, borre los que no queria
|
|
|
|
|
|
|
+ pslldq xmm2, 1;ok, borre los que no queria
|
|
|
|
|
+ psrldq xmm2, 1;ok, borre los que no queria
|
|
|
.normal:
|
|
.normal:
|
|
|
;desempaqueto cada pixel a un registro (cada elem como dword)
|
|
;desempaqueto cada pixel a un registro (cada elem como dword)
|
|
|
pxor xmm3,xmm3
|
|
pxor xmm3,xmm3
|
|
@@ -145,15 +143,15 @@ blur_asm:
|
|
|
punpcklwd xmm7, xmm4 ;pix c
|
|
punpcklwd xmm7, xmm4 ;pix c
|
|
|
punpckhwd xmm8, xmm4 ;pix d
|
|
punpckhwd xmm8, xmm4 ;pix d
|
|
|
|
|
|
|
|
- ;cargo 1 elem de matriz como single
|
|
|
|
|
- movdqu xmm9, [matriz] ;traje 4 float.
|
|
|
|
|
|
|
+ ;cargo 4 elem de matriz como single
|
|
|
|
|
+ movdqu xmm9, [matriz]
|
|
|
|
|
|
|
|
- pshufd xmm11, xmm9, 0x00
|
|
|
|
|
- pshufd xmm12, xmm9, 0x55
|
|
|
|
|
- pshufd xmm13, xmm9, 0xAA
|
|
|
|
|
- pshufd xmm14, xmm9, 0xFF
|
|
|
|
|
|
|
+ pshufd xmm11, xmm9, 0x00 ;primer elem en las 4 pos
|
|
|
|
|
+ pshufd xmm12, xmm9, 0x55 ;2do...
|
|
|
|
|
+ pshufd xmm13, xmm9, 0xAA ;3ro..
|
|
|
|
|
+ pshufd xmm14, xmm9, 0xFF ;4to..
|
|
|
|
|
|
|
|
- ;acomodo los registros
|
|
|
|
|
|
|
+ ;acomodo los registros (byte->dword)
|
|
|
psrldq xmm5, 3
|
|
psrldq xmm5, 3
|
|
|
psrldq xmm6, 3
|
|
psrldq xmm6, 3
|
|
|
psrldq xmm7, 3
|
|
psrldq xmm7, 3
|
|
@@ -182,35 +180,30 @@ blur_asm:
|
|
|
cmp col_faltan, 0
|
|
cmp col_faltan, 0
|
|
|
jle .finFilaInterna
|
|
jle .finFilaInterna
|
|
|
|
|
|
|
|
- cmp col_faltan, 4
|
|
|
|
|
- jle .retroceder ;me faltan entre 0 y 4 pixeles, retrocedo suficiente para que me falten 4 exactos
|
|
|
|
|
-
|
|
|
|
|
|
|
+ cmp col_faltan, 4*PIXEL_SIZE ;me faltan entre 0 y 4 pixeles, retrocedo suficiente para que me falten 4 exactos
|
|
|
|
|
+ jle .retroceder
|
|
|
|
|
|
|
|
add src, PIXEL_SIZE*4 ; Incremento 4 pixeles
|
|
add src, PIXEL_SIZE*4 ; Incremento 4 pixeles
|
|
|
- add matriz, PIXEL_SIZE*4
|
|
|
|
|
|
|
+ add matriz, PIXEL_SIZE*4 ; me faltan al menos 4 pixeles en esta fila
|
|
|
jmp .loopFila
|
|
jmp .loopFila
|
|
|
|
|
|
|
|
.retroceder:
|
|
.retroceder:
|
|
|
lea src, [src-(4-col_faltan)]
|
|
lea src, [src-(4-col_faltan)]
|
|
|
|
|
+ lea matriz, [matriz-(4-col_faltan)] ;retrocedo 1-3
|
|
|
jmp .loopFila
|
|
jmp .loopFila
|
|
|
|
|
|
|
|
.finFilaInterna:
|
|
.finFilaInterna:
|
|
|
dec filas_faltan
|
|
dec filas_faltan
|
|
|
cmp filas_faltan, 0
|
|
cmp filas_faltan, 0
|
|
|
- je .sumar
|
|
|
|
|
|
|
+ je .write
|
|
|
|
|
|
|
|
jmp .loopInterno
|
|
jmp .loopInterno
|
|
|
|
|
|
|
|
- ;avanzo ancho img - (2k+1 pix)
|
|
|
|
|
- ;faltan >0 filas? jmp .loopInterno
|
|
|
|
|
-
|
|
|
|
|
-.sumar:
|
|
|
|
|
- xor rax,rax
|
|
|
|
|
.write:
|
|
.write:
|
|
|
CVTPS2DQ xmm10,xmm10 ;me quedan 4 int (dword) <=255, necesito moverlos a 4byte en la parte baja
|
|
CVTPS2DQ xmm10,xmm10 ;me quedan 4 int (dword) <=255, necesito moverlos a 4byte en la parte baja
|
|
|
movdqu xmm11, [cosa] ;uso xmm11 de tmp
|
|
movdqu xmm11, [cosa] ;uso xmm11 de tmp
|
|
|
- pshufb xmm10, xmm11
|
|
|
|
|
- movd [dst], xmm10 ; Escribo en el destino
|
|
|
|
|
|
|
+ pshufb xmm10, xmm11 ;dejo 0000,0000,0000,rgba
|
|
|
|
|
+ movd [dst], xmm10 ; Escribo en el destino
|
|
|
.endLoop:
|
|
.endLoop:
|
|
|
mov src, tmp_src
|
|
mov src, tmp_src
|
|
|
add src, PIXEL_SIZE ; Incremento 1 pixel
|
|
add src, PIXEL_SIZE ; Incremento 1 pixel
|