Frage zu AM library
-
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 berechnenHier 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.