2009-07-16 3 views
4

ich derzeit versuche, einige DSP bezogenen Code mit Shark zu optimieren und fand, dass ich in einem Schwimmer viel Zeit vergeude Umwandlung in Integer:Schwimmer auf Integer Konvertierung mit iPhones SIMD Schwimmereinheit

SInt16 nextInt = nextFloat * 32768.0f + 0.5f; 

Da die iPhone scheint einen ARM11 FP-Co-Prozessor zu haben, ich frage mich, ob ich meinen Code durch den FTOSI-Befehl ersetzen kann. Es gibt einige documentation auf der ARM-Website, aber ich habe keine Erfahrung in Inlining Hand optimierte Montage. Hat jemand das schon mal gemacht?
Ich glaube, ich mit

__asm__ volatile 

den Code inline könnte Aber wie kann ich überprüfen, ob der Befehl verfügbar ist?
Wie kann ich meinen Wert weitergeben?

EDIT1: Wie schon Louis darauf hingewiesen, habe ich vergessen zu erwähnen, dass ich kompilieren mit "Compile for Thumb" ausgeschaltet bin.

EDIT2: Da ich float zu signierten Int16 und nicht vorzeichenlosen Int konvertieren möchte, änderte ich die ARM-Anweisung von FTOUI nach FTOSI. Dies war ein Fehler im ursprünglichen Beitrag.

Antwort

3

Das mag eine offensichtliche Frage sein, aber sind Sie sicher, dass Sie ARM anvisieren? Standardmäßig kompiliert das iPhone SDK alle Apps für THUMB, die Software Fließkomma-alles verwendet (einschließlich Float/Int-Konvertierung).

Wie auch immer, wenn das Gerät über einen VFP Coprozessor verfügt, hat es die Anweisung. Sie können überprüfen, ob ein geeigneter Coprozessor vorhanden ist, indem Sie das FPSID-Register lesen und sicherstellen, dass es ein unterstütztes Modell ist.

Ich vermute, dass es sicher ist anzunehmen, dass alle iPhones es unterstützen. Unter anderem unterstützt Apples Assembler den Opcode, und das LLVM ARM-Backend verwendet es für die Typkonvertierung, was bedeutet, dass Apple, wenn es schließlich LLVM auf dem Telefon unterstützt, seinen FTOUI-Befehl generieren wird.

+0

Da mein Code Fließkomma-intensiv ist, habe ich "Compile for Thumb" deaktiviert. (Ich denke, das setzt den "-marm" Compiler-Schalter) –

+1

Sie sind richtig, wollte nur sicher gehen. Es scheint irgendwie schockierend GCC verwendet FTOUI nicht für die Konvertierungen selbst und erfordert Inline-Asm, weshalb ich überprüft habe. Ich füge hinzu, was eine Antwort auf das sein sollte, was ich denke, dass Sie fragen. –

+0

Ich denke, GCC hat keine Chance zu erkennen, dass ich versuche, eine Float-to-Int-Konvertierung durchzuführen, da es sich nicht um einen einfachen Cast handelt, sondern um eine Mischung aus Mul, Add und Cast. Ich werde den Asm untersuchen, den GCC später ausgibt und hier posten. –