Wir verwenden die Lite-Version des MicroChip PIC-Compilers, vielleicht ist das der Grund, aber diese einfache Ein-Bit-Verschiebung erzeugt eine Schleife, wo keine notwendig ist. Da die Anzahl der Verschiebungen 1 ist (eine Konstante), würde ich erwarten, dass der Compiler keine Schleife erstellt – eine elementare Optimierung.
Gibt es einen Compiler-Optimierungsschalter, der die Schleife lindern würde? Hier ist der Code für die Verschiebung:
long foo; // a 32-bit value
// Shift foo one bit.
// A one-iteration loop is created!
foo >>= 1;
Und hier ist der vom Compiler generierte Code. Wie Sie sehen können, wird die Verschiebung mit einer Schleife mit einer Iteration umschlossen.
07F6 3001 MOVLW 0x1
07F7 00F2 MOVWF 0x72
07F8 37F6 ASRF 0x76, F
07F9 0CF5 RRF 0x75, F
07FA 0CF4 RRF 0x74, F
07FB 0CF3 RRF 0x73, F
07FC 0BF2 DECFSZ 0x72, F
BEARBEITEN
Compiler-Version: HI-TECH C-Compiler für PIC10/12/16-MCUs (Lite-Modus) V9.81
Möglicherweise liegt dies an der fehlenden Optimierung der Lite-Version.
Du könntest es versuchen,
foo /= 2;
und sehen, ob es hilft.
Ich habe verschiedene Optimierungsoptionen ausprobiert, aber nichts hat den Compiler dazu gebracht, vernünftigen Code zu produzieren. Ähnliche Erfahrungen habe ich auch mit dem C18-Compiler gemacht. Ein Teil des Codes, den es generiert, ist erstaunlich dumm, und ich habe schließlich mehrere Arten von Makros und Tricks verwendet. Am Ende konnte ich es dazu bringen, Code zu generieren, der fast so gut ist wie handoptimierter Assembler, während es ziemlich lesbar bleibt.
Dieses nicht sehr schöne Makro erzeugt den richtigen Assembler für eine lange Rechtsverschiebung.
long foo;
#define R_SHIFT_LONG(x) asm("asrf _" #x "+3, f"); \
asm("rrf _" #x "+2, f"); \
asm("rrf _" #x "+1, f"); \
asm("rrf _" #x "+0, f");
void main(void)
{
foo=1234;
R_SHIFT_LONG(foo);
}
Jetzt, wo ich die Gelegenheit hatte, mir Ihren Code anzusehen, ist es wirklich nicht so unvernünftig. Abhängig von dem bestimmten Modell-PIC hätte dies in 4 oder 5 Anweisungen durchgeführt werden können, aber nur in dem speziellen Fall des Verschiebens um ein Bit . Es erscheint ziemlich vernünftig, dass der Compiler als Erstes Code für den allgemeinen Fall schreibt, in dem die Verschiebung für N Bits erfolgt. Ich wäre überrascht, wenn es eine Verschiebung um ein Bit nicht als Sonderfall mit aktivierten Optimierungen erkennen würde, aber wieso ist das nicht genau das, was Sie ohne Optimierung erwarten?
Wenn Sie sich jedoch für diese Detailgenauigkeit interessieren, sollten Sie in Assembler schreiben. Durch die Verwendung eines Compilers haben Sie die detaillierte Befehlsgenerierung delegiert. Außerdem ist es grob unfair, einen Compiler mit deaktivierten Optimierungen zu bewerten.
AndrejaKo
abdullah kahraman
Olin Lathrop
Raketenmagnet
Olin Lathrop
Raketenmagnet
abdullah kahraman
IJ Kennedy