Różne programy na zajęcia laboratoryjne z AK2
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

suma_sse.s 1.3KB

123456789101112131415161718192021222324252627282930313233343536
  1. # Jan Potocki 2019
  2. # Suma 2 tablic liczb int (32-bitowych) za pomoca jednostki SSE
  3. .globl suma_sse
  4. .type sume_sse, @function
  5. suma_sse:
  6. pushq %rbp # Wejscie do funkcji
  7. movq %rsp, %rbp
  8. # rdi - wskaznik na 1. tablice
  9. # rsi - wskaznik na 2. tablice
  10. # rdx - wskaznik na tablice przeznaczona na wynik
  11. # rcx - dlugosc tablic
  12. # Obliczenie dlugosci tablicy w bajtach (ograniczenie petli)
  13. pushq %rdx # Zapisanie wartosci rdx na stosie
  14. movq %rcx, %rax # Przygotowanie mnozenia...
  15. movq $4, %rcx # int = 4 bajty (w modelu danych LP64)
  16. mulq %rcx # Mnozenie (wynik w rdx:rax)
  17. popq %rdx # Przywrocenie wartosci rdx ze stosu
  18. # Sumowanie wektorowe
  19. mov $0, %r8 # r8 - indeks petli
  20. suma:
  21. movdqu (%rdi, %r8, 1), %xmm0 # xmm0 - 4 liczby z pierwszej tablicy
  22. movdqu (%rsi, %r8, 1), %xmm1 # xmm1 - 4 liczby z drugiej tablicy
  23. paddd %xmm1, %xmm0 # Rownoczesna suma 4 liczb
  24. movdqu %xmm0, (%rdx, %r8, 1) # Zapisanie wyniku w pamieci
  25. add $16, %r8 # Przesuniecie o 16 bajtow (4x int)
  26. cmp %rax, %r8 # sprawdzenie czy osiagnieto koniec tablicy
  27. jne suma
  28. popq %rbp # Wyjscie z funkcji
  29. ret