Advertisement
Guest User

Untitled

a guest
May 21st, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2.  
  3. typedef struct vector
  4. {
  5.     float s1, s2, s3, s4;
  6. } vector;
  7.  
  8. int main()
  9. {
  10.  
  11.     vector a, b, c, d, empty, result1, result2, resultCheck;
  12.     empty.s1 = 0;
  13.     empty.s2 = 0;
  14.     empty.s3 = 0;
  15.     empty.s4 = 0;
  16.  
  17.     // zmienic wartosci!!!
  18.     // TODO!!
  19.  
  20.     a.s1 = 11;
  21.     a.s2 = 12;
  22.     a.s3 = 13;
  23.     a.s4 = 14;
  24.     b.s1 = 1;
  25.     b.s2 = 2;
  26.     b.s3 = 3;
  27.     b.s4 = 4;
  28.     c.s1 = 17;
  29.     c.s2 = -8;
  30.     c.s3 = -11;
  31.     c.s4 = -2.4;
  32.     d.s1 = 6.6;
  33.     d.s2 = -1;
  34.     d.s3 = 0;
  35.     d.s4 = 0;
  36.  
  37.     // do sprawdzania
  38.     // asm(
  39.     //     "movups %1, %%xmm0\n\t"
  40.     //     "movups %2, %%xmm1\n\t"
  41.     //     "shufps $0x21, %%xmm0, %%xmm0\n\t"
  42.     //     "movups %%xmm0, %0\n"
  43.     //     : "=g"(resultCheck) //%0
  44.     //     : "g"(a), "g"(b), "g"(c), "g"(d), "g"(d)
  45.     //     : //%1       %2      %3          %4      %5
  46.     // );
  47.  
  48.     // printf("Wektor %f %f %f %f",resultCheck.s1, resultCheck.s2, resultCheck.s3, resultCheck.s4);
  49.  
  50.     asm(
  51.         // wektor A i B
  52.         // 1 Nawias lewe mnozenie
  53.         "movups %1, %%xmm0\n\t"
  54.         "movups %2, %%xmm1\n\t"
  55.         // 00 01 10 11
  56.         "shufps $0x21, %%xmm0, %%xmm0\n\t"
  57.         // 01 00 11 10
  58.         "shufps $0x4E, %%xmm1, %%xmm1\n\t"
  59.         "mulps %%xmm1, %%xmm0\n\t"
  60.         "movaps %%xmm0, %%xmm4\n\t" //wynik do [4]
  61.         // ----
  62.         // 1 Nawias prawe mnozenie
  63.         "movups %1, %%xmm0\n\t"
  64.         "movups %2, %%xmm1\n\t"
  65.         // 01 00 11 10
  66.         "shufps $0x4E, %%xmm0, %%xmm0\n\t"
  67.         // 00 01 10 11
  68.         "shufps $0x21, %%xmm1, %%xmm1\n\t"
  69.         "mulps %%xmm1, %%xmm0\n\t"
  70.         // Odejmowanie Lewe - Prawe
  71.         "subps %%xmm0, %%xmm4\n\t" // xmm4 - xmm0, wynik do [4]
  72.  
  73.         // wektor C i D
  74.         // 2 Nawias lewe mnozenie
  75.         "movups %3, %%xmm0\n\t"
  76.         "movups %4, %%xmm1\n\t"
  77.         // 10 01 01 00
  78.         "shufps $0x94, %%xmm0, %%xmm0\n\t"
  79.         // 11 11 10 11
  80.         "shufps $0xFB, %%xmm1, %%xmm1\n\t"
  81.         "mulps %%xmm1, %%xmm0\n\t"
  82.         "movaps %%xmm0, %%xmm3\n\t" //wynik do [3]
  83.         // 2 Nawias prawe mnozenie
  84.         "movups %3, %%xmm0\n\t"
  85.         "movups %4, %%xmm1\n\t"
  86.         // 11 11 10 11
  87.         "shufps $0xFB, %%xmm0, %%xmm0\n\t"
  88.         // 10 01 01 00
  89.         "shufps $0x94, %%xmm1, %%xmm1\n\t"
  90.         "mulps %%xmm1, %%xmm0\n\t"
  91.         // Odejmowanie Lewe - Prawe
  92.         "subps %%xmm0, %%xmm3\n\t" // xmm3 - xmm0, wynik do [3]
  93.  
  94.         // Pierwszy nawias x Drugi nawias
  95.         "mulps %%xmm3, %%xmm4\n\t" //WYNIK CZĄSTKOWY (L1-4) w [4]
  96.  
  97.         // --------------
  98.         // --------------
  99.         // ---------------------------------------
  100.  
  101.         // Linijki L5-6
  102.         // Pierwszy n
  103.         "movups %5, %%xmm5\n\t" //pusty wektor (0,0,0,0) do (5)
  104.         "movups %1, %%xmm0\n\t"
  105.         "movups %2, %%xmm1\n\t"
  106.  
  107.         "shufps $0x08, %%xmm5, %%xmm0\n\t" //0123 -> 02XX (X = 0.0)
  108.         "shufps $0x01, %%xmm5, %%xmm1\n\t" //0123 -> 10XX (X = 0.0)
  109.  
  110.         "mulps %%xmm1, %%xmm0\n\t"
  111.         "movaps %%xmm0, %%xmm3\n\t" //wynik na bok (3)
  112.                                     //Pierwszy nawias, drugie mnożenie
  113.         "movups %1, %%xmm0\n\t"
  114.         "movups %2, %%xmm1\n\t"
  115.         "shufps $0x01, %%xmm5, %%xmm0\n\t" //0123 -> 10XX (X = 0.0)
  116.         "shufps $0x08, %%xmm5, %%xmm1\n\t" //0123 -> 02XX (X = 0.0)
  117.         "mulps %%xmm1, %%xmm0\n\t"
  118.         //Pierwszy nawias, odejmowanie
  119.         "subps %%xmm0, %%xmm3\n\t" //wynik w (3)
  120.                                    //----------------------------
  121.                                    //3 i 4 wiersz (c,d), linijki 1-2
  122.                                    //Drugi nawias, pierwsze mnożenie
  123.         "movups %3, %%xmm0\n\t"
  124.         "movups %4, %%xmm1\n\t"
  125.         "shufps $0x06, %%xmm5, %%xmm0\n\t" //0123 -> 21XX (X = 0.0)
  126.         "shufps $0x0F, %%xmm5, %%xmm1\n\t" //0123 -> 33XX (X = 0.0)
  127.         "mulps %%xmm1, %%xmm0\n\t"
  128.         "movaps %%xmm0, %%xmm2\n\t" //wynik na bok(2)
  129.                                     //Drugi nawias, drugie mnożenie
  130.         "movups %3, %%xmm0\n\t"
  131.         "movups %4, %%xmm1\n\t"
  132.         "shufps $0x0F, %%xmm5, %%xmm0\n\t" //0123 -> 33XX (X = 0.0)
  133.         "shufps $0x06, %%xmm5, %%xmm1\n\t" //0123 -> 21XX (X = 0.0)
  134.         "mulps %%xmm1, %%xmm0\n\t"
  135.         //Drugi nawias, odejmowanie
  136.         "subps %%xmm0, %%xmm2\n\t" //wynik w (2)
  137.                                    //Mnożenie, pierwszy nawias x drugi nawias
  138.         "mulps %%xmm2, %%xmm3\n\t" //WYNIK CZĄSTKOWY (L1-2) w (3)
  139.                                    //Dodawanie linii 3-6 i 1-2
  140.         "addps %%xmm3, %%xmm4\n\t" //WYNIK KOŃCOWY (4)
  141.                                    //Przeniesienie wyniku
  142.  
  143.         "movups %%xmm0, %0\n"
  144.         : "=g"(resultCheck) //%0
  145.         : "g"(a), "g"(b), "g"(c), "g"(d), "g"(empty)
  146.         : //%1      %2      %3          %4      %5
  147.     );
  148.  
  149.         printf("Wektor %f",resultCheck.s1 + resultCheck.s2 + resultCheck.s3 + resultCheck.s4);
  150.  
  151.         return 0;
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement