Ich caste mir mit AVR gcc gerade den Wolf, aber es will nicht klappen:
Ich brauche eine Multiplikation von zwei uint16_t, das Ergebnis davon
hat 32 bit Breite. Von diesem will ich ferner nur die obere Hälfte
weiterverwenden, die untere ist sozusagen der Nachkommateil.
Etwa in der Art:
1 | uint16_t a;
|
2 | uint16_t b;
|
3 | uint16_t c;
|
4 | ...
|
5 | c = (a*b) >> 16;
|
Der Compiler sieht das so wohl als Multiplikation mit 16 Bit
Ergebnisbreite an. Außerdem erkennt er, das anschließend die 16 gültigen
Ergebnisbits rausgeschoben werden, und optimiert die Multiplikation weg.
Hieraus entsteht also gar kein Code.
Wenn ich in einem hilflosen Versuch z.B. einen Operanden auf 32 bit
caste,
1 | c = ((uint32_t)a*b) >> 16;
|
dann wird gleich die Bibliotheksfunktion __mulsi3 instantiiert und
aufgerufen, das ist volle Breitseite 32*32 bit.
Habe ich eine Chance, das hier effizienterer Code erzeugt wird?