Wie behandelt der ARM-Compiler (Version 5) Gleitkommazahlen mit doppelter Genauigkeit in Geräten, deren Hardware für Gleitkommaeinheiten nur einfache Genauigkeit unterstützt?

Nach dem Lesen des Handbuchs von ARM Compiler Version 5 heißt es, dass bei Geräten ohne Gleitkommaeinheit Floats durch Softwareimplementierungen behandelt werden, was wahrscheinlich langsamer sein wird als mit einer Hardwareeinheit.

Ich konnte jedoch keine Informationen darüber finden, wie der ARM-Compiler 5 mit Double-Precision-Floats auf Geräten mit Single-Precision-FPUs umgehen würde. Meine Annahme wäre, dass es auch eine Softwareimplementierung verwenden würde, als ob die FPU nicht existierte, aber in meinem Code habe ich versucht, mir die Disassemblierung anzusehen, und es scheint, dass die FPU-spezifischen Anweisungen verwendet werden!

Zum Beispiel,

   696:         spectral_line[2] = 6869.955;     /* B */ 
0x0800250A ED9F0B81  VLDR          d0,[pc,#0x204]
0x0800250E ED800B04  VSTR          d0,[r0,#0x10]

Dieses obige Assemblercode-Segment wurde vom ARM 5-Compiler generiert, obwohl spectral_linees sich um ein Array von Doubles handelt!

Wie/was macht der Compiler hier, um die Zahlen mit doppelter Genauigkeit zu behandeln?

Ich kenne den ARM nicht speziell, aber viele Prozessoren verwenden eine "Falle" oder einen Software-Interrupt, um nicht implementierte Anweisungen zu verarbeiten. Wenn der Prozessor eine nicht implementierte Anweisung sieht, führt er eine Interrupt-Service-Routine aus, die herausfindet, welche Anweisung versucht wurde, und dann eine Software-Emulation dieser Funktion bereitstellt. Aus der Anwendungsperspektive sieht es so aus, als ob die nicht implementierte Anweisung nur sehr langsam lief.
Es hängt von Ihren Compiler-Optionen ab: embeddedartistry.com/blog/2017/10/9/…

Antworten (1)

und es scheint, dass die FPU-spezifischen Anweisungen verwendet werden!

Das ist in der Tat richtig. Auf den Einzelpräzisions-FPUs sind sowohl Lade- als auch Speicheranweisungen verfügbar, jedoch keine der eigentlichen Berechnungsanweisungen.

Beachten Sie, dass dies einige Software-Berechnungen verlangsamen kann double, da Funktionsargumente in der FPU liegen, aber zurück in die CPU-Register übertragen werden müssen, um sie tatsächlich zu verwenden .