2016-10-01 37 views
1

我正在試着做一個函數,總結2 CGVectors如何在C/Objective C中使用SSE指令集?

這是我的嘗試:

包括:

@import GLKit; 
@import Foundations; 


    // Defenition of CGVector 
    struct CGVector { 
     CGFloat dx; 
     CGFloat dy; 
    }; 

    typedef struct CGVector CGVector; 

    inline CGVector CGVECADD(CGVector v1 , CGVector v2){ 
    #ifdef GLK_SSE3_INTRINSICS 
     __m128d v; 
     v = _mm_add_sd(*(__m128d *)&v1, *(__m128d *)&v2); 

     return *(CGVector *)& v; 
    #else 
     return CGVectorMake(v1.dx + v2.dx, v1.dy + v2.dy); 
    #endif 
    } 

然後我試圖使用它像

CGVector v1, v2 , v3; 
    v1 = CGVectorMake(2, 3); 
    v2 = CGVectorMake(4, 4);; 
    v3 = CGVECADD(v1, v2); //(6, 7) expected 
    NSLog(@"V3 = (%lf, %lf)", v3.dx , v3.dy); 

沒有編譯器錯誤,但我從日誌中得到的是

V3 =(6.000000,3.000000)

我預計將有6,7 :-)

我做了什麼錯?

回答

0

你應該能夠做到:

CGVector v1, v2, v3; 
v1 = CGVectorMake(2, 3); 
v2 = CGVectorMake(4, 4); 
v3 = CGVectorMake(v1.dx + v2.dx, v1.dy + v2.dy); 
NSLog(@"V3 = (%f, %f)", v3.dx, v3.dy); 

輸出

V3 = (6.000000, 7.000000) 
+0

但整體思想是用SSE2 – ColdSteel

+0

使其目前還不清楚,如果你正在內的obj-嘗試這種c文件或c。也許包括該信息和包括,進口太...換句話說,其餘的代碼。 :) –

+0

編輯:該文件是.m,但它只包含C函數 – ColdSteel