2009-07-16 34 views
4

Je suis actuellement en train d'optimiser certains DSP code lié avec Shark et trouvé que je suis en train de perdre beaucoup de temps dans un flotteur à la conversion integer:flottant à la conversion entier en utilisant l'iPhone SIMD unité flottante

SInt16 nextInt = nextFloat * 32768.0f + 0.5f; 

Comme le L'iPhone semble avoir un coprocesseur ARM11 FP, je me demande si je peux remplacer mon code par l'instruction FTOSI. Il y a quelques documentation disponibles sur le site Web d'ARM, mais je n'ai aucune expérience en matière d'assemblage optimisé à la main. Est-ce que quelqu'un a déjà fait ça?
Je pense que je pourrais inline le code avec

__asm__ volatile 

Mais comment puis-je vérifier si l'instruction est disponible?
Comment puis-je transmettre ma valeur? Comme l'a déjà souligné Louis, j'ai oublié de mentionner que je compile avec "Compile for Thumb" désactivé. Comme je veux convertir float en Int16 signé et Int non signé, j'ai changé l'instruction ARM de FTOUI en FTOSI. C'était une erreur dans le message original.

Répondre

3

Cela peut être une question évidente, mais êtes-vous sûr que vous ciblez ARM? Par défaut, le SDK iPhone compile toutes les applications pour THUMB, qui utilise tout le logiciel à virgule flottante (y compris la conversion float/int). Quoi qu'il en soit, si l'appareil dispose d'un coprocesseur VFP, il a l'instruction. Vous pouvez vérifier s'il a un coprocesseur approprié en lisant le registre FPSID et en vous assurant qu'il s'agit d'un modèle pris en charge.

Je suppose qu'il est sûr de supposer que tous les iPhones le supportent. Entre autres choses, l'assembleur d'Apple prend en charge l'opcode, et le backend LLVM ARM l'utilise pour les conversions de type, ce qui signifie que lorsqu'Apple finit par supporter LLVM sur le téléphone, son compilateur va générer des instructions FTOUI.

+0

Comme mon code est à virgule flottante intensive, j'ai désactivé "Compiler pour le pouce". (Je pense que cela met le commutateur "-marm" du compilateur) –

+1

Vous avez raison, je voulais juste m'assurer. Il semble assez choquant que GCC n'utilise pas FTOUI pour les conversions en elles-mêmes et nécessite inline asm, c'est pourquoi je vérifiais. J'ajoute ce qui devrait être une réponse à ce que je pense que vous demandez. –

+0

Je pense que GCC n'a aucune chance de détecter que j'essaie de faire une conversion entre float et int, car ce n'est pas une simple distribution, mais une combinaison de mul, add et cast. J'étudierai l'asm que GCC sortira plus tard et l'afficherai ici. –