
Umsetzung auf dem ARM7TDMI
Der Algorithmus wurde in der IDE »µVision 3« von Keil zunächst in C-Code umgesetzt. Hierbei gelten folgende Datentypen per Definition als Vereinbarung: »Byte«: 8 Bit vorzeichenbehaftet für Q0.7, »Word«: 16 Bit vorzeichenbehaftet für Q0.15, »dWord«: 32 Bit vorzeichenbehaftet für Q0.31, »Float«: 32 Bit nach IEEE.
Die C-Routine für Q0.15 stehe beispielhaft für die drei betrachteten Festkommaformate (Kasten »C-Code«). Die nachfolgenden Routinen arbeiten alle nach dem gleichen Algorithmus, der eine aufgerollte Programmstruktur nutzt (ohne Schleifendurchlauf).
Die Laufzeitmessung ergibt bei einem Core-Takt von 60 MHz die folgenden Zeiten: Float: 83,7 µs, signed Q0.7: 9,1 µs, signed Q0.15: 9,9 µs, signed Q0.31: 24,9 µs. Der C-Compiler arbeitet dabei mit der höchsten Optimierungsstufe hinsichtlich Laufzeit.
Als nächster Schritt findet die Handoptimierung für das Festkommaformat auf Assemblerebene statt, wobei der gleiche Programmablauf verwendet wird. Bei den Formaten Q0.7 und Q0.15 greifen die Befehle des ARM-Befehlssatzes mit dem flexiblen zweiten Operanden besonders. Durch diesen zweiten Operanten lässt sich beispielsweise die Addition eines Koeffizienten zusammen mit der Kommastellenkorrektur und dem Runden aus der vorherigen Multiplikation in einem Befehl ausführen (Beispiel: »add r2,r4,r2,asr #15«). Beim Q0.31-Format spielt die 64-Bit-Multiplikation ihre Stärke aus. Die Laufzeitmessung ergibt die folgenden Zeiten: signed Q0.7: 8,8 µs, signed Q0.15: 9,7 µs, signed Q0.31: 16,2 µs.
Als nächstes steht die Implementierung des Algorithmus’ im Thumb-Befehlssatz an. Hierfür wurde der C- und Assembler-Code auf Thumb umgeschrieben. Bei identischen Testbedingungen ergeben sich für die Laufzeiten der C-Routinen folgende Werte: 90,0 µs für Float, 11,5 µs für signed Q0.7, 12,7 µs für signed Q0.15 und 51,3 µs für signed Q0.31.