Frage

Ich versuche zur Zeit ein Programm für die VFP-Einheit des iPhone mit ARM-Assembler-Code zu schreiben. Die VFP kann Gleitpunktumgebung Berechnungen tun, aber AFAIK keine Integer-Arithmetik. Jedoch kann es einen Schwimmer in eine vorzeichenbehaftete Ganzzahl (4 Byte) konvertieren. Auch nach diesem Schnellverweis: http://www.voti.nl/hvu/arm /ARMquickref.pdf es scheint es keine Schaltvorgänge unterstützt

Was ich möchte, ist tun 4 Schwimmern zu konvertieren, von denen ich sicher bin, dass jeder größer als -127 und kleiner als 127 in 4 signierte Bytes.

, wenn i Operationen zur Verfügung Verschiebung hätte, könnte ich den Schwimmer Ganzzahl mit umzuwandeln, dann die Wertverschiebung von 12 Bytes auf der linke Seite (8 und 4 Bytes für die nächsten zwei Werte, die jeweils) und bitweise oder alle vier zusammen.

Da jedoch Verschieben nicht verfügbar ist, muss ich einen anderen Weg finden, es zu tun. Auch - i nicht Integer-Arithmetik verwenden kann (so kann ich nicht mehrfach die bereits konvertierte ganze Zahl von 2 ^ n, um Verschiebung, aber ich muß die Arbeit an dem Schwimmer statt)

.

Wer weiß, wie ich das erreichen kann?

btw für diejenigen familar mit der ARM-Architektur - ich will nicht zu Schalter Thumb Anweisungen, da diese in einer Schleife Betrieb auf vielen Elemente getan und ich will nicht, um zwischen Daumen und Arm Anweisungen innerhalb dieser Schleife (denn das ist teuer)

Danke!

edit:

weitere Frage: Wie kann ich einen Vektor mit drei Elementen normalisieren

War es hilfreich?

Lösung

Sie möchten die VFP ftosis Anweisung, die einen mit einfacher Genauigkeit FP-Wert auf einen 4-Byte-Ganzzahl konvertiert. Wenn Sie vier Schwimmer in s0-s3, dann nach tun:

ftosis s0, s0
ftosis s1, s1
ftosis s2, s2
ftosis s3, s3

Sie haben vier 4-Byte-Zahlen in s0-s3, die nacheinander mit einem fstm im Speicher abgelegt werden kann.

Auf einem ARM-Prozessor mit Unterstützung für NEON, Sie vcvt.s32.f32 q0, q0 können vier Conversions mit einem Befehl zu tun.


Bearbeiten Ihre Follow-up-Frage zu beantworten, hier ist ein einfaches Beispiel Funktion, die als Eingabe einen Zeiger auf vier Schwimmer im Speicher und gibt die umgewandelten Werte verpackt in einer einzigen int32_t nimmt:

_floatToPackedInt:
    fldmias   r0,  {s4-s7}
    ftosizs   s0,   s4
    ftosizs   s1,   s5
    ftosizs   s2,   s6
    ftosizs   s3,   s7
    fmrrs r0, r1,  {s0,s1}
    fmrrs r2, r3,  {s2,s3}
    uxtb      r0,   r0
    uxtb      r1,   r1
    uxtb      r2,   r2
    orr       r0,   r0, r1, lsl #8
    orr       r0,   r0, r2, lsl #16
    orr       r0,   r0, r3, lsl #24
    bx        lr

Ich habe stellen eigentlich keine Mühe in dieser Abstimmung, weil Sie nicht Konvertierungen auf diese Weise wollen würden, tun, wenn sie leistungskritische waren; Sie würde lieber arbeiten entweder auf große Arrays von Werten und Pipeline diesen Code so dass mehrere Konvertierungen gleichzeitig im Flug waren, oder Verschachtelung mit anderen Operationen, die nützliche Arbeit als gut tun.

Sie können auch mögen ssats vor dem uxtbs einzufügen alle Out-of-Range-Werte zu machen sättigen statt Verpackung.

Seien Sie auch, beachten Sie, dass dieser Code eine schlechte Leistung auf ARMv7 Kerne haben wird; Sie werden auf jeden Fall wollen die NEON Vektoroperationen auf dieser Plattform verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top