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