2013-10-29 9 views
5

Ich muss MSB (höchstwertiges Bit) auf Millionen von 32-Bit-Ganzzahlen auf dem iPad sehr schnell berechnen. Ich habe meine eigene (hässliche) Implementierung von MSB geschrieben auf Ebene C, die langsam ist. ARM-Prozessoren haben CLZ (Zähle führende Nullen) Hardwarebefehl, was sehr nützlich sein kann. Nach ARM reference gibt es eine intrinsische C-Funktion __CLZ. Wie kann ich meinem Xcode-Projekt die Unterstützung von ARM-Eigenfunktionen hinzufügen?Wie ARM-Eigenarten in iOS verwenden?

P.S. Es ist mir gelungen, die Möglichkeit zu finden, von NEON auf die Hardware-CLZ zuzugreifen (einschließlich arm_neon.h), aber das ist nicht das, was ich brauche, weil es nur mit Vektor funktioniert, aber ich brauche skalares MSB.

+1

Können Sie nicht einfach Inline-Asm-Code verwenden? – tarmes

+0

Ich weiß nicht, wie man inline asm schreibt, aber ;-) –

Antwort

4

Ich fand ARM intrinsische Funktionen Namen auf Seite 44 von ARM C language extensions. Einige von ihnen arbeiten in Xcode. Dies druckt 31, wie erwartet:

NSLog(@"%u", __builtin_clz(1)); 

Hinweise:

  • Ich habe alle Verweise von diesem in Apple-docs nicht gefunden. Wahrscheinlich hat Xcode diese Funktionen von LLVM oder CLANG geerbt.
  • Sie müssen keine speziellen Header oder Frameworks zur Verwendung dieser Funktionen hinzufügen. Xcode IDE Autocomplete weiß nichts über sie.
  • Nur ein paar Funktionen aus der Erweiterungsliste sind implementiert. Laut den Seiten 12-13 des gleichen Dokuments sollte es zwei Header-Dateien sein: arm_acle.h für Nicht-NEON-Intrinsics und arm_neon.h für NEON-Intrinsics. Xcode hat nur die zweite Datei, aber einige der Funktionen aus der ersten Datei deklariert woanders.
0

Dies ist offensichtlich, aber wenn Sie ARM-spezifische Anweisungen verwenden, können Sie Ihre App nicht im iOS-Simulator ausführen. Der Simulator verwendet die native x86-64-Hardware Ihres Mac.

Sie könnten eine Wrapper-Funktion erstellen, die eine Compiler-Direktive verwendet, um den ARM-Befehl zu verwenden oder auf den "hässlichen" Code zurückzugreifen, wenn Sie keine Unterstützung haben.

+0

Ich benutze keinen Simulator. Können Sie erklären, wie ich CLZ Code hinzufügen kann? Ich habe versucht, '' clz, CLZ, __clz, __builtin_clz__', etc ... Funktionen hinzuzufügen, aber sie werden einfach nirgendwo deklariert. Ich habe auch '' grep -R "clz"/Programme/Xcode.app/Contents/Entwickler/Toolchains/XcodeDefault.xctoolchain'' versucht, aber nur Links zu NEON und x86 gefunden –