Hallo!
Ich möchte die Differenz zweier unsigned-short-Variablen möglichst
schnell zu einer signed-long-long-Variable addieren. Da das Ergebnis der
Differenz (lastadcvalue - zero) im Bereich von +/- 65536 liegt, reichen
ja 3 Byte (lastadcvalue, tempA) für den Inhalt des Wertes aus. Ein
weiteres Byte (tempB) nimmt dann die eventuellen Einsen des
Zweierkomplements für vorstehende Bytes auf.
Mein dazu gehörender C-Code sieht so aus:
1
unsignedshortus_temp;
2
asmvolatile(// rec_adcsum[rec_samplescounter] += (signed long long)rec_lastadcvalue - zero;
Wie man sieht, funktioniert die Registerzuordnung der oberen 4 Byte der
long-long-Variable mit den Buchstaben E bis H nicht, weil sie alle auf
den A-Wert mit Register 18 zeigen. Kann man etwa keine
long-long-Variablen in Inline-Assembler verwenden?
Danke für Antworten!
Christian
@ Schawwi (Gast)
>Ich möchte die Differenz zweier unsigned-short-Variablen möglichst>schnell zu einer signed-long-long-Variable addieren.
Warum glaubst du das mit Inline Assembler machen zu müssen? SOOOO
schlecht ist dein Compiler nicht.
Lass den Käse und schreibs einfach hin.
Hallo Falk!
Ich finde schon, dass er das schlecht macht.
Die Sache ist, dass die Differenz größer sein kann als signed short.
Demnach müsste ich hierfür signed long nehmen.
Also lautet mein C-Code:
@ Schawwi (Gast)
>Ich finde schon, dass er das schlecht macht.>Die Sache ist, dass die Differenz größer sein kann als signed short.>Demnach müsste ich hierfür signed long nehmen.
Ja. Musst du aber auch in ASM (naja, man kann mit 24 Bit rechen, bringt
aber nicht viel wenn es um die Summe mit long long geht, CARRY!).
>Also lautet mein C-Code:>Und der Assembler-Code wird deutlich länger als das, was bei meiner>Variante nötig wäre.
MOMENT! Das sind Indizierungen drin. Die werden dadurch nicht kürzer.
Optimierung eingeschaltet? Denn ohne ist das reichlich sinnlos.
MFg
Falk
Hallo Falk!
Doch, Optimierung ist an. Habe auch alle Stufen durchprobiert und von
der Länge ändert sich auf einen groben Blick nichts.
Hast Du andere Ideen?
Grüße,
Christian
@ Schawwi (Gast)
>Doch, Optimierung ist an. Habe auch alle Stufen durchprobiert und von>der Länge ändert sich auf einen groben Blick nichts.>Hast Du andere Ideen?
Leider nein. So richtig sehe ich da nicht durch. Aber wie es scheint
kann/will der GCC die Operanden nicht in den Registern halten (hat ja
nur 32 Stück . . .) und läd immer über ldd nach. Wobei eine 8 + 8 Byte
Addition nun wirklich nicht die Welt ist. :-(
Da musst du dich wohl oder übel mehr mit Inline Assembler rumschlagen.
Aber vielleicht ist es besser, die Berechnug in eine Funktion
auszulagern und richtig in Assembler zu programmieren. Das soll
einfacher sein.
MFg
Falk