Verwendung der Multiply Accumulate Inline Assembly Assembly in C ++

9

Ich implementiere einen FIR-Filter auf einem ARM9-Prozessor und versuche, den SMLAL-Befehl zu verwenden.

Anfangs hatte ich den folgenden Filter implementiert und es funktionierte perfekt, außer dass diese Methode zu viel Verarbeitungsleistung verwendet, um in unserer Anwendung verwendet zu werden.

%Vor%

Ich habe versucht, die Multiply Accumulate durch Inline-Assembly zu ersetzen, da GCC selbst bei eingeschalteter Optimierung keinen MAC-Befehl verwendet. Ich habe die for-Schleife durch folgende ersetzt:

%Vor%

Die Ausgabe, die ich jetzt mit der Anweisung SMLAL erhalte, ist nicht die gefilterte Daten, die ich erwartet habe. Ich habe zufällige Werte erhalten, die anscheinend kein Muster oder keine Verbindung zum ursprünglichen Signal oder den Daten haben, die ich erwarte.

Ich habe das Gefühl, dass ich etwas falsch mache, wenn ich den 64-Bit-Akkumulator in die oberen und unteren Register für die Anweisung aufspalte, oder ich setze sie falsch zusammen. Wie auch immer, ich weiß nicht, warum ich nicht in der Lage bin, die richtige Ausgabe zu erhalten, indem ich den C-Code mit der Inline-Baugruppe vertausche.

    
John C 23.08.2010, 17:59
quelle

1 Antwort

3

Welche Compiler-Version verwenden Sie? Ich habe versucht, Ihren C-Code mit GCC 4.4.3 mit den Optionen -O3 -march = armv5te zu kompilieren und es erzeugte die smlal-Anweisungen.

    
Nils Pipenbrinck 25.08.2010 12:16
quelle

Tags und Links