J
Hi,
habe eine Frage zur AM library von Intel, die optimierte mathematische Berechnungen mit SSE und SSE2 zur Verfügung stellt.
Wenn ich diese library so verwenden will, wie sie ist (zu AMath.lib linken und AMath.h includen), dann bringt der Compiler die Meldung, dass die lib-Datei "libm.lib" nicht gefunden werden kann. Gut, dann hab ich, da auch der unkompilierte Quellcode von AM mitgeliefert wird, das Ganze einfach per Copy und Paste in mein Projekt kopiert, und dann versucht, den Sinus zu berechnen
Hier ist die Sinus-Funktion von AM library:
__m128 __declspec(naked) __stdcall am_sin_ss(__m128 x)
{
__asm
{
movss [esp - 4], xmm0
movss xmm1, _ps_am_inv_sign_mask
mov eax, [esp - 4]
mulss xmm0, _ps_am_2_o_pi
andps xmm0, xmm1
and eax, 0x80000000
cvttss2si ecx, xmm0
movss xmm1, _ps_am_1
mov edx, ecx
shl edx, (31 - 1)
cvtsi2ss xmm2, ecx
and ecx, 0x1
and edx, 0x80000000
subss xmm0, xmm2
movss xmm6, _sincos_masks[ecx * 4]
minss xmm0, xmm1
movss xmm5, _ps_sincos_p3
subss xmm1, xmm0
andps xmm1, xmm6
andnps xmm6, xmm0
orps xmm1, xmm6
movss xmm4, _ps_sincos_p2
movss xmm0, xmm1
mulss xmm1, xmm1
movss xmm7, _ps_sincos_p1
xor eax, edx
movss xmm2, xmm1
mulss xmm1, xmm5
movss xmm5, _ps_sincos_p0
mov [esp - 4], eax
addss xmm1, xmm4
mulss xmm1, xmm2
movss xmm3, [esp - 4]
addss xmm1, xmm7
mulss xmm1, xmm2
orps xmm0, xmm3
addss xmm1, xmm5
mulss xmm0, xmm1
ret 16
}
}
Wie verwende ich die Funktion, um den Sinus zu berechnen?
Anhand der Deklaration der Struktur __m128 habe ich folgendes probiert:
inline float FSIN(float x)
{
__m128 Angle;
Angle.m128_f32[0] = x;
Angle = am_sin_ss(Angle);
return Angle.m128_f32[0];
}
Das geht auch zu kompilieren, der m128_f32-Member ist ein float Array der Länge vier.
Nur stürzt das Programm ab, sobald ich FSIN() für einen Winkel aufrufe. Wo genau, dass kann ich per Debugger nicht erkennen.
Ach ja, ich hab eine P4, also am "falschen" Prozessor kann es eigentlich nicht
liegen.
Hat irendjemand Erfahrung mit der AM library, muss ich noch irgendwelche Dinge beachten, z.B. Compiler-Einstellungen etc.?
In der "Dokumentation" von AM library steht nicht viel dazu, außer:
AM Library functions follow the __stdcall calling convention. They expect the first __m128 argument in xmm0 register and the second __m128 argument (if present) in xmm1 register.
The result is returned in xmm0 register.