J'essaie actuellement d'écrire un programme pour l'unité VFP de l'iPhone en utilisant le code d'assemblage ARM. Le VFP peut faire des calculs en virgule flottante, mais AFAIK pas d'arithmétique entière. Cependant, il peut convertir un flottant en un entier signé (4 octets). En outre, selon ce QuickReference: http://www.voti.nl/hvu/arm/ARMquickref.pdf il semble qu'il ne supporte pas les opérations de décalageAssemblage: convertir la valeur du point flottant en octet signé
ce que je voudrais faire est de convertir 4 flotteurs dont je suis sûr que chacun est plus grand que -127 et inférieur à 127 en 4 octets signés. Si j'avais des opérations de décalage disponibles, je pourrais convertir le flottant en entier signé, puis décaler la valeur de 12 octets vers la gauche (8 et 4 octets pour les deux prochaines valeurs respectivement) et le bit OU tous les quatre ensemble .
Toutefois, étant donné que le décalage n'est pas disponible, j'ai besoin de trouver un autre moyen de le faire. Aussi - je ne peux pas utiliser arithmétique entière (donc je ne peux pas multiplier l'entier déjà converti par 2^n afin de décaler mais je dois travailler sur le flotteur à la place).
Quelqu'un sait comment je pourrais y parvenir?
btw pour ceux qui connaissent l'architecture ARM - je ne veux pas passer aux instructions Thumb, car cela se fait dans une boucle opérant sur de nombreux éléments et je ne veux pas basculer entre les instructions de pouce et bras à l'intérieur boucle (puisque c'est cher)
Merci!
modifier:
autre question: comment puis-je normaliser un vecteur avec trois éléments?
oui je sais cela - mais le problème est la conversion de int signé à octet signé! à la fin, je ne veux pas avoir 4 entiers 4byte, mais 4 octets signés 1 octet dans un seul registre – genesys
Désolé; il n'était pas du tout clair que c'est ce que vous vouliez de votre question ("alors décalez la valeur de 12 octets vers la gauche", etc). Vous pouvez le faire directement sur NEON, mais sur les cœurs ARM qui ont uniquement VFP, vous devrez replacer les valeurs converties dans les registres généraux et les réduire en octets. –
en êtes-vous sûr? il ya bitwise OU - donc je pense peut-être que je pourrais construire quelque chose en utilisant l'arithmétique à virgule flottante. Si j'avais mon float dans l'intervalle de -127 <= f <= 127, ne pourrais-je pas le multiplier par # 4096 (= 2^12) et le convertir en int en utilisant ftosis? cela n'entraînerait-il pas la même chose que de déplacer l'int converti de 12 bits vers la gauche? - Sinon, peut-être pourriez-vous me répondre ma deuxième question? (voir la modification dans la question ci-dessus) – genesys