D
Diablo_bth
Guest
ich habe nun einige Versuche unternommen trigonometrische Routinen zu optimieren. Hier ein Beispiel ( fast doppelt so schnell wie die Standartfunktion )
wenn man jetzt z.B. statische Fließkommazahlen benötiget ( wie z.B. beim acrus sinus ) habe ich bisher eher schandhaft gecodet: ( glaube ich )
die Methode mit der der M$-Compiler variablen anlegt finde ich etwas zu kompliziert ( mit rep stos ... )
Nun meine Frage: gibt es nicht direkt einen Weg um z.B. ein 1.0f ein ein Fließkommeregister zu laden ??
wenn man z.B. fld 3F800000h oder fld 1.0f probiert gibts da immer Fehler!
kann mir da jemadn helfen??
Code:
__forceinline static
__declspec( naked ) float __fastcall
sinf( float )
{
__asm {
fld dword ptr [esp+4]
fsin
ret 4
}
}
wenn man jetzt z.B. statische Fließkommazahlen benötiget ( wie z.B. beim acrus sinus ) habe ich bisher eher schandhaft gecodet: ( glaube ich )
Code:
__forceinline static
__declspec( naked ) float __fastcall
asinf( float )
{
// return arctan( r / sqr( 1.0f - r * r ) );
__asm {
push ebp
mov ebp,esp
mov dword ptr [ebp-4],3F800000h // 1.0f;
fld dword ptr [ebp+8] // r0 = r
fld dword ptr [ebp+8] // r1 = r0, r0 = r
fmul dword ptr [ebp+8] // r0 = r0 * r
fsubr dword ptr [ebp-4] // r0 = r0 - 1.0f
fsqrt // r0 = sqrtf( r0 )
fdiv // r0 = r1 / r0
fld1 // r0 =
fpatan // atan( r0 )
pop ebp
ret 4
}
}
die Methode mit der der M$-Compiler variablen anlegt finde ich etwas zu kompliziert ( mit rep stos ... )
Nun meine Frage: gibt es nicht direkt einen Weg um z.B. ein 1.0f ein ein Fließkommeregister zu laden ??
wenn man z.B. fld 3F800000h oder fld 1.0f probiert gibts da immer Fehler!
kann mir da jemadn helfen??