Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct
- {
- float v0;
- float v1;
- float v2;
- float v3;
- }wektor;
- float dane[4][4] = {{1.5,9,10,8},
- {-1,4,-1,4},
- {10,4,11,8},
- {-1,2,-1.5,1}};
- // Zamiast calej macierzy 4 wektory
- float wyznacznik(wektor w0, wektor w1, wektor w2, wektor w3){
- /* X1 A'B' A"B"
- (a0*b1-a1*b0) = [x0] 0*1 1*0
- (a2*b0-a0*b2) = [x1] 2*0 0*2
- (a0*b3-a3*b0) = [x2] 0*3 3*0
- (a1*b2-a2*b1) = [x3] 1*2 2*1
- */
- wektor wynik;
- asm(
- "movaps (%rdi), %xmm0 \n" // A'
- "movaps (%rsi), %xmm1 \n" // B'
- "shufps $0x48, %xmm0, %xmm0 \n" // (0,2,0,1) 00 10 00 01 / 21
- "shufps $0xB1, %xmm1, %xmm1 \n" // (1,0,3,2) 01 00 11 10 / 4E
- "mulps %xmm0, %xmm1 \n" // Wynik A'B' w xmm1
- "movaps (%rdi), %xmm0 \n" // A"
- "movaps (%rsi), %xmm2 \n" // B"
- "shufps $0xB1, %xmm0, %xmm0 \n" // (1,0,3,2) /4E
- "shufps $0x48, %xmm2, %xmm2 \n" // (0,2,0,1) /21
- "mulps %xmm0, %xmm2 \n" // Wynik A"B" w xmm2
- // A'B' - A"B"
- "subps %xmm1, %xmm2 \n" // Wynik w xmm2
- /* X2 C'D' C"D"
- (c2*d3-c3*d2) 2*3 3*2
- (c1*d3-c3*d1) 1*3 3*1
- (c1*d2-c2*d1) 1*2 2*1
- (c0*d3-c3*d0) 0*3 3*0
- */
- "movaps (%rdx), %xmm3 \n" // C'
- "movaps (%rcx), %xmm4 \n" // D'
- "shufps $0x16, %xmm3, %xmm3 \n" // (2,1,1,0) 10 01 01 00 / 94
- "shufps $0xEF, %xmm4, %xmm4 \n" // (3,3,2,3) 11 11 10 11 / FB
- "mulps %xmm3, %xmm4 \n" // Wynik C'D' w xmm4
- "movaps (%rdx), %xmm3 \n" // C"
- "movaps (%rcx), %xmm5 \n" // D"
- "shufps $0xFB, %xmm3, %xmm3 \n" // (3,3,2,3) /FB
- "shufps $0xEF, %xmm5, %xmm5 \n" // (2,1,1,0) /94
- "mulps %xmm3, %xmm5 \n" // Wynik C"D" w xmm5
- // C'D' - C"D"
- "subps %xmm4, %xmm5\n" // Wynik w xmm5
- // Operacja X1 * X2
- "mulps %xmm2, %xmm5 \n" // Wynik w xmm5
- //Wolne rejestry xmm0, mm1, xmm2, xmm4
- /* X3 A'B' A"B"
- (a2*b3-a3*b2) 2*3 3*2
- (a3*b1-a1*b3) 3*1 1*3
- 0*0 0*0
- 0*0 0*0
- Dopisanie dodatkowych zer nic nie zmienia
- */
- "movaps (%rdi), %xmm0 \n" // A'
- "movaps (%rsi), %xmm1 \n" // B'
- "shufps $0x0E, %xmm0, %xmm0 \n" // (2,3,0,0) 10 11 00 00 / B0
- "shufps $0x07, %xmm1, %xmm1 \n" // (3,1,0,0) 11 01 00 00 / D0
- "mulps %xmm0, %xmm1 \n" // Wynik A'B' w xmm1
- "movaps (%rdi), %xmm0 \n" // A"
- "movaps (%rsi), %xmm2 \n" // B"
- "shufps $0x07, %xmm0, %xmm0 \n" // (3,1,0,0)
- "shufps $0x0E, %xmm2, %xmm2 \n" // (2,3,0,0)
- "mulps %xmm0, %xmm2 \n" // Wynik A"B" w xmm2
- // A'B' - A"B"
- "subps %xmm1, %xmm2 \n" // Wynik w xmm2
- /* X4 C'D' C"D"
- (c0*d1-c1*d0) 0*1 1*0
- (c0*d2-c2*d0) 0*2 2*0
- 0*0 0*0
- 0*0 0*0
- */
- "movaps (%rdx), %xmm3 \n" // C'
- "movaps (%rcx), %xmm4 \n" // D'
- "shufps $0x00, %xmm3, %xmm3 \n" // (0,0,0,0) 00 00 00 00 / 00
- "shufps $0x09, %xmm4, %xmm4 \n" // (1,2,0,0) 01 10 00 00 / 60
- "mulps %xmm3, %xmm4 \n" // Wynik C'D' w xmm4
- "movaps (%rdx), %xmm3 \n" // C"
- "movaps (%rcx), %xmm5 \n" // D"
- "shufps $0x09, %xmm3, %xmm3 \n" // (1,2,0,0) / 60
- "shufps $0x00, %xmm6, %xmm6 \n" // (0,0,0,0) / 00
- "mulps %xmm3, %xmm6 \n" // Wynik C"D" w xmm6
- // C'D' - C"D"
- "subps %xmm4, %xmm6 \n" // Wynik w xmm6
- // Operacja X3 * X4
- "mulps %xmm2, %xmm6 \n"
- "int3 \n"
- // Operacja X1*X2 + X3*X4
- "addps %xmm6, %xmm5 \n"
- "int3 \n"
- // Wynik w "wynik"
- "movaps %xmm5, (%r8)\n"
- "int3 \n"
- );
- return wynik.v0 + wynik.v1 + wynik.v2 + wynik.v3;
- }
- int main (){
- // Zapisanie liczb do wektorow
- wektor wektory[4];
- for (int i = 0; i < 4 ; i++){
- wektory[i].v0 = dane[i][0];
- wektory[i].v1 = dane[i][1];
- wektory[i].v2 = dane[i][2];
- wektory[i].v3 = dane[i][3];
- }
- printf("Wyznacznik: %f\n", wyznacznik( wektory[0], wektory[1], wektory[2], wektory[3]));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement