Wir verwenden die Lite-Version des MicroChip PIC-Compilers. Vielleicht ist das der Grund, aber diese einfache Ein-Bit-Verschiebung erzeugt eine Schleife, in der keine erforderlich ist. Da die Verschiebungszahl 1 (eine Konstante) ist, würde ich erwarten, dass der Compiler keine Schleife erstellt - eine elementare Optimierung.
Gibt es einen Compiler-Optimierungsschalter, der die Schleife verringern würde? Hier ist der Code für die Schicht:
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
pic
c
microchip
hi-tech-compiler
IJ Kennedy
quelle
quelle
Antworten:
Möglicherweise liegt dies daran, dass die Lite-Version nicht optimiert wurde.
Du könntest es versuchen,
und sehen, ob es hilft.
quelle
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 am Ende habe ich verschiedene Arten von Makros und Tricks verwendet. Am Ende war ich in der Lage, Code so gut wie handoptimierten Assembler zu generieren und dabei ziemlich lesbar zu bleiben.
Dieses nicht sehr schöne Makro generiert den richtigen Assembler für eine lange Rechtsverschiebung.
quelle
Jetzt, wo ich die Gelegenheit hatte, mir Ihren Code anzusehen, ist das wirklich nicht so unvernünftig. Je nach PIC-Modell könnte dies in 4 oder 5 Anweisungen erfolgen, jedoch nur im speziellen Fall einer Verschiebung 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 gilt. Es würde mich wundern, wenn eine Verschiebung um ein Bit nicht als Sonderfall mit aktivierten Optimierungen erkannt würde, aber wie ist das nicht genau das, was Sie ohne Optimierung erwarten?
Wenn Sie sich jedoch für diesen Detaillierungsgrad interessieren, sollten Sie in Assembler schreiben. Durch die Verwendung eines Compilers haben Sie die detaillierte Befehlsgenerierung entfernt. Außerdem ist es grob unfair, einen Compiler mit deaktivierten Optimierungen zu bewerten.
quelle