floating point mit inline-Asm(M$VC++)

  • Themenstarter Themenstarter Diablo_bth
  • Beginndatum Beginndatum
D

Diablo_bth

Guest
ich habe nun einige Versuche unternommen trigonometrische Routinen zu optimieren. Hier ein Beispiel ( fast doppelt so schnell wie die Standartfunktion )
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??
 
ooobs, in Sachen floating-point kenne ich mich leider noch nicht so gut aus, dass ich deinen Ausführungen hätte folgen können. Kannst Du vielleicht mal ein wenig Code posten, bzw. wie würdest Du mein Problem lösen wenn Du mit wenig Aufwand einfach 1.0f abzeiehn willst? ? Das dürfte die Sache für mich klarer machen. - thx

*edit*
oder kennt vielleicht jemand ein gutes Tut zu asm&floating-point?
 
Zurück
Oben