ercand
15-09-2008, 23:17
Salve a tutti, sto cercando di scrivere una classe che sfrutte le sse così da velocizzare il tutto, questa è la classe
class Vector4
{
public:
__forceinline Vector4();
__forceinline Vector4(const Vector4& v);
__forceinline Vector4(const float* vec);
// Operatori unari
__forceinline Vector4 operator - ();
// Operatori binari
Vector4 __cdecl operator + (Vector4& vec);
__m128 vector;
};
questo è il metodo che mi da problemi, somma semplicemente vec con this->vector.
Il metodo è dichiarato come naked per evitare il codice di prolog e epilog che mi rende lentissimo il codice ( con lento intendo che scivere il metodo senza sse è più veloce )
__declspec(naked) Vector4 __cdecl Vector4::operator +(Vector4& vec)
{
__asm
{
// questo per le funzioni naked
mov eax, dword ptr[esp + 12]
mov ecx, dword ptr[esp + 4] // esp+4 primo parametro
// somma
movaps xmm0, xmmword ptr[eax]
movaps xmm1, xmmword ptr[ecx]
addps xmm0, xmm1
}
}
questo è il main per testare la classe
int _tmain(int argc, _TCHAR* argv[])
{
Vector4 v1, v2, v3;
v1 = v2 + v3;
return 0;
}
Quello che non riesco a fare è far si che v1 assuma il risultato di xmm0, ci sto sbattendo la testa da tre giorni e non riesco a venirne fuori, qualcuno potrebbe darmi un indizio su come procedere.
Grazie mille:p
Per i moderatori, mi sono dimenticato di aggiungere il titolo della discussione dopo [asm e c++], se potete modificarlo aggiungete "Come far ritornare un parametro?", grazie:p.
class Vector4
{
public:
__forceinline Vector4();
__forceinline Vector4(const Vector4& v);
__forceinline Vector4(const float* vec);
// Operatori unari
__forceinline Vector4 operator - ();
// Operatori binari
Vector4 __cdecl operator + (Vector4& vec);
__m128 vector;
};
questo è il metodo che mi da problemi, somma semplicemente vec con this->vector.
Il metodo è dichiarato come naked per evitare il codice di prolog e epilog che mi rende lentissimo il codice ( con lento intendo che scivere il metodo senza sse è più veloce )
__declspec(naked) Vector4 __cdecl Vector4::operator +(Vector4& vec)
{
__asm
{
// questo per le funzioni naked
mov eax, dword ptr[esp + 12]
mov ecx, dword ptr[esp + 4] // esp+4 primo parametro
// somma
movaps xmm0, xmmword ptr[eax]
movaps xmm1, xmmword ptr[ecx]
addps xmm0, xmm1
}
}
questo è il main per testare la classe
int _tmain(int argc, _TCHAR* argv[])
{
Vector4 v1, v2, v3;
v1 = v2 + v3;
return 0;
}
Quello che non riesco a fare è far si che v1 assuma il risultato di xmm0, ci sto sbattendo la testa da tre giorni e non riesco a venirne fuori, qualcuno potrebbe darmi un indizio su come procedere.
Grazie mille:p
Per i moderatori, mi sono dimenticato di aggiungere il titolo della discussione dopo [asm e c++], se potete modificarlo aggiungete "Come far ritornare un parametro?", grazie:p.