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 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.


Anmelden zum Antworten