Advertisement
jazz_vico

orga 2 1erRecu1C2018

Nov 26th, 2018
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;a
  2. ;rdi=char* str
  3. .promedio:
  4.     push rbp ;alinea
  5.     mov rbp rsp
  6.  
  7.     pxor xmm13 xmm13 ;xmm13=0
  8.     xor rcx rcx
  9.     xor r9 r9
  10.     .ciclo
  11.         movdqu xmm1 [rdi+rcx] ;rcx sirve comocontador y ademas es el largo
  12.         movdqu xmm4 xmm1
  13.         ;para determinar si es el ultimo
  14.         pcmpeqb xmm1 xmm13
  15.         PMOVMSKB rax xmm1
  16.         xor rdx rdx
  17.         cmp dx ax
  18.         jne .ultimo
  19.         lea rcx [rcx+16]
  20.         ;para hacer la suma
  21.         movdqu xmm1 xmm4       
  22.         punpcklbw xmm1 xmm13 ;desempaqueto convirtiendo a word la parte baja ->8
  23.         punpckhbw xmm4 xmm13 ; xmm4= desempaqueto a word la parte alta ->8
  24.         paddw xmm1 xmm4  ;suma->8 words
  25.         phaddw xmm1 xmm13 ;phadd words y me quedan 4
  26.         punpcklwd xmm1 xmm13 ;desempaqueto a double
  27.         phaddd xmm1 xmm13 ; sumo y me quedan 2 doubles
  28.         punpckldq xmm1 xmm13 ;desempaqueto a quadword
  29.         movdqu xmm2 xmm1
  30.         psrldq xmm2, 8 ;parte alta             
  31.         paddq xmm1 xmm2
  32.         paddq xmm0
  33.         jmp .ciclo
  34.  
  35.         .ultimo:    ;vamos a recorrer byte a byte  
  36.         .cicloUltimo:
  37.             cmp byte[r8+rcx], 0
  38.             ;para largo
  39.             je.fin
  40.             inc rcx
  41.             ;para sumar
  42.             xor rax rax
  43.             mov rax byte[r8+rcx]   
  44.             movq xmm1 rax
  45.             paddq xmm0 xmm1
  46.             jmp .cicloUltimo
  47.     .fin:
  48.         ;convertir xmm0 a double
  49.         cvtdq2pd xmm0 xmm0     
  50.         ;hacer la div con el largo q esta guardado en rcx
  51.         movq xmm1 rcx
  52.         divpd xmm0 xmm1
  53.  
  54.         pop rbp
  55.         ret
  56.  
  57. ;b
  58. ;asumo que la longitud que me dan es sin el pading
  59. ;rdi=char*str rsi=int longiutd dx=char viejo cx=char nuevo
  60. .reemplazar:
  61.     push rbp
  62.     mov rbp rsp
  63.  
  64.     ;hacer mascara de nuevo
  65.     movq xmm15 rcx
  66.     pxor xmm13 xmm13 ;utilizo una mascara de 0 para el shuflle->copia en todos los bytes el bbyte mas bajo del xmmi
  67.     pshufb xmm15, xmm13 ;xmm15 = mascara con nuevo en cada byte
  68.     pshufb xmm14, xmm13 ;xmm14= mascara con viejo en cada byte
  69.     xor rcx rcx
  70.     .ciclo:
  71.         movdqu xmm1 [rdi+rcx]
  72.         movdqu xmm2 xmm1
  73.         pcmpeqb xmm2 xmm14 ; mascara con 1s en los lugares donde esta el viejo
  74.         movdqu xmm3 xmm2
  75.         pand xmm3 xmm15 ;mascara con nuevo en los lugares a reemplazar
  76.         pandn xmm2 xmm1 ; mascara con los valores originales y ceros en los lugares de viejo
  77.         por xmm2 xmm3
  78.         movdqu [rdi+rcx] xmm2
  79.         lea rcx [rcx+16]
  80.         cmp rcx rsi
  81.         je .fin
  82.         jg .acomodar
  83.         jmp .ciclo
  84.     .acomodar:
  85.         lea rcx [rsi-16]
  86.         jmp .ciclo 
  87. .fin:
  88.     pop rbp
  89.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement