2016-05-10 11 views
1

So in c zu funktionieren, ich versuche, zwei Vektoren fügen Sie einige Assembler-Code verwenden, aber ich habe ein Problem mit:Passing struct

sse_vector4_add(set_vector(2,2,2,2),set_vector(4,2,4,2)); 

Ich bin nicht sicher, wie diese Vektoren auf diese Funktion zu übergeben.

typedef struct vector4 { 
    float x, y, z, w;  
} vector4; 

// Set values to a vector4 
vector4 set_vector(float x, float y, float z, float w) { 
    vector4 ret_vector = { x, y, z, w }; 
    return ret_vector; 
} 

// Use sse to add the elements of two vectors a + b 
vector4 sse_vector4_add(vector4 *op_a,vector4 *op_b) { 
    vector4 ret_vector; 
    asm( 
     "mov %%eax,op_a \n"    // Load pointers into CPU regs 
     "mov %%ebx,op_b \n" 
     "movups %%XMM0,(%%EAX) \n"  // Move the vectors to SSE regs 
     "movups %%XMM1,(%%EBX) \n" 
     "addps %%XMM0,%%XMM1 \n"  // Add elements 
     "movups (ret_vector),%%XMM0 \n" // Save the return vector 
     : 
    ); 
    return ret_vector; 
} 

void main() { 
    // Add two vectors 
    sse_vector4_add(set_vector (2,2,2,2),set_vector(4,2,4,2)); 
    getchar(); 
} 

Funktion sse_vector4_add wurde aus einer ähnlichen Funktion, aber in C++ gemacht.

+2

Sofern Sie nicht in einer freistehenden Umgebung sind, gibt 'main'' int' zurück. – jxh

+0

möglicherweise ist eine Option, die Vektor-Add-Funktion zu ändern, um Argumente nach Wert zu übernehmen –

Antwort

2

Erstellen Sie Variablen mit set_vector, um sie zu initialisieren. Übergeben Sie dann ihre Adressen an die Funktion.

vector4 a = set_vector(2,2,2,2); 
vector4 b = set_vector(4,2,4,2); 
vector4 c = sse_vector4_add(&a, &b); 
+0

Wäre es nicht möglich, auch Zeiger auf Strukturen von 'set_vector()' zurückzugeben und die Zeiger auf 'sse_vector4_add()'? Also 'vector4 * set_vector()' und dann 'sse_vector4_add (set_vector (...), set_vectcor (...));' – KevinDTimm

+0

@KevinDTimm: Ich wollte die vorhandenen Schnittstellen nicht ändern. Außerdem können Sie Zeiger nicht zurückgeben, um lokale Variablen zu verwenden. Wenn Sie dynamisch zuordnen, muss der Empfänger die Zuordnung aufheben. Die bestehende Schnittstelle ist schon ziemlich sauber. – jxh

+0

Verstanden - und ja, Sie müssten die Interna von 'set_vector()' stark modifizieren, damit mein Vorschlag funktioniert. Ich wollte mich nur selbst besänftigen, dass ich noch immer Zeiger spreche. – KevinDTimm