Advertisement
Guest User

Untitled

a guest
May 25th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.00 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct
  5. {
  6. float v0;
  7. float v1;
  8. float v2;
  9. float v3;
  10. }wektor;
  11.  
  12. float dane[4][4] = {{1.5,9,10,8},
  13. {-1,4,-1,4},
  14. {10,4,11,8},
  15. {-1,2,-1.5,1}};
  16.  
  17. // Zamiast calej macierzy 4 wektory
  18.  
  19. float wyznacznik(wektor w0, wektor w1, wektor w2, wektor w3){
  20.  
  21. /* X1 A'B' A"B"
  22. (a0*b1-a1*b0) = [x0] 0*1 1*0
  23. (a2*b0-a0*b2) = [x1] 2*0 0*2
  24. (a0*b3-a3*b0) = [x2] 0*3 3*0
  25. (a1*b2-a2*b1) = [x3] 1*2 2*1
  26. */
  27. wektor wynik;
  28. asm(
  29. "movaps (%rdi), %xmm0 \n" // A'
  30. "movaps (%rsi), %xmm1 \n" // B'
  31. "shufps $0x48, %xmm0, %xmm0 \n" // (0,2,0,1) 00 10 00 01 / 21
  32. "shufps $0xB1, %xmm1, %xmm1 \n" // (1,0,3,2) 01 00 11 10 / 4E
  33. "mulps %xmm0, %xmm1 \n" // Wynik A'B' w xmm1
  34.  
  35. "movaps (%rdi), %xmm0 \n" // A"
  36. "movaps (%rsi), %xmm2 \n" // B"
  37. "shufps $0xB1, %xmm0, %xmm0 \n" // (1,0,3,2) /4E
  38. "shufps $0x48, %xmm2, %xmm2 \n" // (0,2,0,1) /21
  39. "mulps %xmm0, %xmm2 \n" // Wynik A"B" w xmm2
  40.  
  41. // A'B' - A"B"
  42. "subps %xmm1, %xmm2 \n" // Wynik w xmm2
  43.  
  44. /* X2 C'D' C"D"
  45. (c2*d3-c3*d2) 2*3 3*2
  46. (c1*d3-c3*d1) 1*3 3*1
  47. (c1*d2-c2*d1) 1*2 2*1
  48. (c0*d3-c3*d0) 0*3 3*0
  49. */
  50. "movaps (%rdx), %xmm3 \n" // C'
  51. "movaps (%rcx), %xmm4 \n" // D'
  52. "shufps $0x16, %xmm3, %xmm3 \n" // (2,1,1,0) 10 01 01 00 / 94
  53. "shufps $0xEF, %xmm4, %xmm4 \n" // (3,3,2,3) 11 11 10 11 / FB
  54. "mulps %xmm3, %xmm4 \n" // Wynik C'D' w xmm4
  55.  
  56. "movaps (%rdx), %xmm3 \n" // C"
  57. "movaps (%rcx), %xmm5 \n" // D"
  58. "shufps $0xFB, %xmm3, %xmm3 \n" // (3,3,2,3) /FB
  59. "shufps $0xEF, %xmm5, %xmm5 \n" // (2,1,1,0) /94
  60. "mulps %xmm3, %xmm5 \n" // Wynik C"D" w xmm5
  61.  
  62. // C'D' - C"D"
  63. "subps %xmm4, %xmm5\n" // Wynik w xmm5
  64.  
  65. // Operacja X1 * X2
  66. "mulps %xmm2, %xmm5 \n" // Wynik w xmm5
  67.  
  68. //Wolne rejestry xmm0, mm1, xmm2, xmm4
  69.  
  70. /* X3 A'B' A"B"
  71. (a2*b3-a3*b2) 2*3 3*2
  72. (a3*b1-a1*b3) 3*1 1*3
  73. 0*0 0*0
  74. 0*0 0*0
  75. Dopisanie dodatkowych zer nic nie zmienia
  76. */
  77. "movaps (%rdi), %xmm0 \n" // A'
  78. "movaps (%rsi), %xmm1 \n" // B'
  79. "shufps $0x0E, %xmm0, %xmm0 \n" // (2,3,0,0) 10 11 00 00 / B0
  80. "shufps $0x07, %xmm1, %xmm1 \n" // (3,1,0,0) 11 01 00 00 / D0
  81. "mulps %xmm0, %xmm1 \n" // Wynik A'B' w xmm1
  82.  
  83. "movaps (%rdi), %xmm0 \n" // A"
  84. "movaps (%rsi), %xmm2 \n" // B"
  85. "shufps $0x07, %xmm0, %xmm0 \n" // (3,1,0,0)
  86. "shufps $0x0E, %xmm2, %xmm2 \n" // (2,3,0,0)
  87. "mulps %xmm0, %xmm2 \n" // Wynik A"B" w xmm2
  88.  
  89. // A'B' - A"B"
  90. "subps %xmm1, %xmm2 \n" // Wynik w xmm2
  91.  
  92. /* X4 C'D' C"D"
  93. (c0*d1-c1*d0) 0*1 1*0
  94. (c0*d2-c2*d0) 0*2 2*0
  95. 0*0 0*0
  96. 0*0 0*0
  97. */
  98. "movaps (%rdx), %xmm3 \n" // C'
  99. "movaps (%rcx), %xmm4 \n" // D'
  100. "shufps $0x00, %xmm3, %xmm3 \n" // (0,0,0,0) 00 00 00 00 / 00
  101. "shufps $0x09, %xmm4, %xmm4 \n" // (1,2,0,0) 01 10 00 00 / 60
  102. "mulps %xmm3, %xmm4 \n" // Wynik C'D' w xmm4
  103.  
  104. "movaps (%rdx), %xmm3 \n" // C"
  105. "movaps (%rcx), %xmm5 \n" // D"
  106. "shufps $0x09, %xmm3, %xmm3 \n" // (1,2,0,0) / 60
  107. "shufps $0x00, %xmm6, %xmm6 \n" // (0,0,0,0) / 00
  108. "mulps %xmm3, %xmm6 \n" // Wynik C"D" w xmm6
  109.  
  110. // C'D' - C"D"
  111. "subps %xmm4, %xmm6 \n" // Wynik w xmm6
  112.  
  113. // Operacja X3 * X4
  114. "mulps %xmm2, %xmm6 \n"
  115. "int3 \n"
  116.  
  117. // Operacja X1*X2 + X3*X4
  118. "addps %xmm6, %xmm5 \n"
  119. "int3 \n"
  120.  
  121. // Wynik w "wynik"
  122. "movaps %xmm5, (%r8)\n"
  123. "int3 \n"
  124. );
  125.  
  126. return wynik.v0 + wynik.v1 + wynik.v2 + wynik.v3;
  127. }
  128.  
  129. int main (){
  130. // Zapisanie liczb do wektorow
  131.  
  132. wektor wektory[4];
  133.  
  134. for (int i = 0; i < 4 ; i++){
  135. wektory[i].v0 = dane[i][0];
  136. wektory[i].v1 = dane[i][1];
  137. wektory[i].v2 = dane[i][2];
  138. wektory[i].v3 = dane[i][3];
  139. }
  140. printf("Wyznacznik: %f\n", wyznacznik( wektory[0], wektory[1], wektory[2], wektory[3]));
  141. return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement