Hinski2

Untitled

May 24th, 2024
12
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.61 KB | None | 0 0
  1. # zad3
  2.  
  3. ---
  4.  
  5. `niezmienniki pętli` - zmienne (lub właściwości) które są takie sają przed i po wykonaniu się pętli
  6. `zmienne indukcyjne` - zmienne, które są używane w pętlach do liczenia iteracji
  7. `Strength reduction` - technika optymalizacji , która polega na zastąpieniu kosztownych operacji arytmetycznych mniej kosztownymi operacjami.
  8.  
  9. ```c
  10. void foobar(long a[], size_t n, long y, long z) {
  11. for (int i = 0; i < n; i++) {
  12. long x = y - z;
  13. long j = 7 * i;
  14. a[i] = j + x * x;
  15. }
  16. }
  17. ```
  18.  
  19. ```nasm
  20. argumenty :
  21. a[] - rdi
  22. n - rsi
  23. y - rdx
  24. z - rcx
  25.  
  26. foobar:
  27. subq %rcx, %rdx ; y -= z
  28. xorl %eax, %eax ; nasza zmienna inkukcyjna (i)
  29. imulq %rdx, %rdx ; (y - z) * (y - z) -> wyciągamy x * x przed pętle
  30. .L2:
  31. cmpq %rax, %rsi
  32. je .L5
  33. movq %rdx, (%rdi,%rax,8) ; dajemy x * x + i * 7 do a[i] czyli na początku x * x + 0 potem x * x + 7 ...
  34. incq %rax ; i++
  35. addq $7, %rdx
  36. jmp .L2
  37. .L5:
  38. ret
  39.  
  40. ; zamiast liczyć j * 7 za każdym razem trzymamy j w rdx i w każdym obrocie pętli zwiększamy rdx o 7
  41. ; więc niezmiennikiem pętli będzie to że rdx trzyma x * x + (liczba obrotów pętli) * 7
  42. ; innym niezmiennikiem pętli jest x * x
  43. ```
  44.  
  45. przed pętle wyrzuciliśmy x * x, żeby go nie liczyć w każdym obrobie pętli bo x * x jest niezmiennikiem pętli
  46.  
  47. osłabieniu uległo j = i * 7, w asemblerze nie używamy j, zamiast tego w każdym obrocie pętli do rdx dodajemy 7 więc mamy rdx = x * x + (liczba obrotów pętli) * 7
Add Comment
Please, Sign In to add comment