Hallo zusammen,
ich habe einen Cortex M4 (STM32F446) und muß einen Haufen Berechnungen
der Form
int32_t a, b, c;
x(+)= a(*)b
und
x(-)= a(*)b
durchführen. Dabei soll sowohl die Addition als auch die Multiplikation
sättigendend sein (deswegen habe ich Multiplikations- und
Additionszeichen etwas abgewandelt).
Ich wühle mich gerade durch die arm_math.h, die jede Menge interessanter
Operationen bietet, aber eine so einfache häufig gebrauchte (zumindest
in der Computergrafik) Funktion nicht zu bieten scheint.
Der Cortex M3 bietet ja durchaus sättigende Operation im Instruction
Set. Wie kann ich diese Operation unter C sinnvoll nutzen?
*Muß es inline Assembler sein?
*Oder die Operation in C nachbauen und hoffen, daß der Compiler die
richtige Operation daraus macht?
*Oder gibt es einfach noch eine andere ARM-Mathe-Library, die ich
übersehen habe?
Viele Grüße
W.T.
Du sprichst ein (meines Wissens nach) Alleinstellungsmerkmal des ARM
Compilers an. Es gibt dort eine gewisse Palette an Idiomen, die
garantiert direkt in die entsprechenden DSP Befehle umgewandlt werden.
Eine Tabelle dieser Idiome hab ich mal eben angehängt.
Persönlich hab ich die Erfahrung gemacht, dass GCC leider nicht alle
dieser Formulierungen so direkt schluckt. Nutzt du alles GCC (oder
Clang?), dann würde ich zur Nutzung der inline Varianten raten... Die
lassen sich ja gegebenenfalls in eigenen Funktionen nach belieben
schachteln.
Hallo Vincent,
danke erstmal für die schöne Tabelle. Ist sie aus dem Buch von Joseph
Yiu?
Erste Erkenntnis: Die sättigenden Multiplikationen beziehen sich nur auf
1x2 Vektoren mit beiden Werten verpackt in einem 32-Bit Wert. Zwar
sicher nett für so manche Anwendung, aber für mich nicht hilfreich.
Zweite Erkenntnis: Es gibt keine sättigende Multiplikation zweier
32-Bit-Werte mit Sättigung auf INT32_MAX/MIN. Aber ich kann zwei
31-Bit-Werte multiplizieren und anschließend auf 31 Bit sättigen. Auch
gut.
Ich habe es mal ausprobiert: