Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;a
- ;rdi=char* str
- .promedio:
- push rbp ;alinea
- mov rbp rsp
- pxor xmm13 xmm13 ;xmm13=0
- xor rcx rcx
- xor r9 r9
- .ciclo
- movdqu xmm1 [rdi+rcx] ;rcx sirve comocontador y ademas es el largo
- movdqu xmm4 xmm1
- ;para determinar si es el ultimo
- pcmpeqb xmm1 xmm13
- PMOVMSKB rax xmm1
- xor rdx rdx
- cmp dx ax
- jne .ultimo
- lea rcx [rcx+16]
- ;para hacer la suma
- movdqu xmm1 xmm4
- punpcklbw xmm1 xmm13 ;desempaqueto convirtiendo a word la parte baja ->8
- punpckhbw xmm4 xmm13 ; xmm4= desempaqueto a word la parte alta ->8
- paddw xmm1 xmm4 ;suma->8 words
- phaddw xmm1 xmm13 ;phadd words y me quedan 4
- punpcklwd xmm1 xmm13 ;desempaqueto a double
- phaddd xmm1 xmm13 ; sumo y me quedan 2 doubles
- punpckldq xmm1 xmm13 ;desempaqueto a quadword
- movdqu xmm2 xmm1
- psrldq xmm2, 8 ;parte alta
- paddq xmm1 xmm2
- paddq xmm0
- jmp .ciclo
- .ultimo: ;vamos a recorrer byte a byte
- .cicloUltimo:
- cmp byte[r8+rcx], 0
- ;para largo
- je.fin
- inc rcx
- ;para sumar
- xor rax rax
- mov rax byte[r8+rcx]
- movq xmm1 rax
- paddq xmm0 xmm1
- jmp .cicloUltimo
- .fin:
- ;convertir xmm0 a double
- cvtdq2pd xmm0 xmm0
- ;hacer la div con el largo q esta guardado en rcx
- movq xmm1 rcx
- divpd xmm0 xmm1
- pop rbp
- ret
- ;b
- ;asumo que la longitud que me dan es sin el pading
- ;rdi=char*str rsi=int longiutd dx=char viejo cx=char nuevo
- .reemplazar:
- push rbp
- mov rbp rsp
- ;hacer mascara de nuevo
- movq xmm15 rcx
- pxor xmm13 xmm13 ;utilizo una mascara de 0 para el shuflle->copia en todos los bytes el bbyte mas bajo del xmmi
- pshufb xmm15, xmm13 ;xmm15 = mascara con nuevo en cada byte
- pshufb xmm14, xmm13 ;xmm14= mascara con viejo en cada byte
- xor rcx rcx
- .ciclo:
- movdqu xmm1 [rdi+rcx]
- movdqu xmm2 xmm1
- pcmpeqb xmm2 xmm14 ; mascara con 1s en los lugares donde esta el viejo
- movdqu xmm3 xmm2
- pand xmm3 xmm15 ;mascara con nuevo en los lugares a reemplazar
- pandn xmm2 xmm1 ; mascara con los valores originales y ceros en los lugares de viejo
- por xmm2 xmm3
- movdqu [rdi+rcx] xmm2
- lea rcx [rcx+16]
- cmp rcx rsi
- je .fin
- jg .acomodar
- jmp .ciclo
- .acomodar:
- lea rcx [rsi-16]
- jmp .ciclo
- .fin:
- pop rbp
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement