[elektro] C kérdés
potyo
potyo.ada at gmail.com
Wed Sep 23 16:00:32 CEST 2009
2009/9/23 Moczik Gabor <pm_levlista at progzmaster.hu>
> Ágó István wrote:
> > De jó az is, de akkor is kellene, hogy b értékétől függően melyik bájton
> > végezze el a műveletet. Vagy van valami ötleted rá? Itt szerintem az a
> gond,
> > hogy első körben végigfut a preprocesszor, a bit_test helyére behajigálja
> az
> > (#if (b>7...) dolgot, és utána már a fordító akarná ezt fordítani, annak
> > viszont már az #if ismeretlen dolog.
>
> sima if-et irj, ha a feltetel erteke forditasi idoben mar ismert, akkor egy
> valamire valo fordito csak fixen az else utani vagy elotti reszt forditja
> bele, nem lesz ugro utasitas meg feltetel kiertekeles sem.
>
> Ahogy Palasik Sandor irta, ugy jonak kell lennie.
>
Igen, azt kipróbáltam, és valóban a fordító kioptimalizálja a nem szükséges
ágat. Ez a megoldás eszembe sem jutott, eleve kényszeríteni akartam a
preprocesszorral.
Egyébként csináltam néhány tesztet, hogy mi adja a legjobb kódot, és a
castolástól jobbat nem tudtam elérni semmi módon (ez már ugyanazt adja, mint
amit én írnék kézzel asm-ben)
Néhány példa a listing fájlból különféle próbálkozásokra (minden
optimalizálás be van kapcsolva)
144: if (address&(1<<10)) EE_A10_IO=1; else
EE_A10_IO=0;
00078 010F MOVLB 0xf
0007A 5121 MOVF 0x21, W, BANKED
0007C 0B00 ANDLW 0
0007E E002 BZ 0x84
00080 8090 BSF LATH, 0, ACCESS
00082 D001 BRA 0x86
00084 9090 BCF LATH, 0, ACCESS
145: if (*((unsigned
char*)((&address)+1))&(1<<(10-8))) EE_A10_IO=1; else EE_A10_IO=0;
00086 010F MOVLB 0xf
00088 A523 BTFSS 0x23, 0x2, BANKED
0008A D002 BRA 0x90
0008C 8090 BSF LATH, 0, ACCESS
0008E D001 BRA 0x92
00090 9090 BCF LATH, 0, ACCESS
146: address&(1<<10)?(EE_A10_IO=1):(EE_A10_IO=0);
000A0 010F MOVLB 0xf
000A2 5121 MOVF 0x21, W, BANKED
000A4 0B00 ANDLW 0
000A6 E003 BZ 0xae
000A8 8090 BSF LATH, 0, ACCESS
000AA 0E01 MOVLW 0x1
000AC D002 BRA 0xb2
000AE 9090 BCF LATH, 0, ACCESS
000B0 0E00 MOVLW 0
147: EE_A10_IO=((address&(1<<10))==(1<<10));
000B2 010F MOVLB 0xf
000B4 5121 MOVF 0x21, W, BANKED
000B6 0B00 ANDLW 0
000B8 E002 BZ 0xbe
000BA 0E00 MOVLW 0
000BC D001 BRA 0xc0
000BE 0E01 MOVLW 0x1
000C0 B0E8 BTFSC WREG, 0, ACCESS
000C2 8090 BSF LATH, 0, ACCESS
000C4 A0E8 BTFSS WREG, 0, ACCESS
000C6 9090 BCF LATH, 0, ACCESS
Tehát mint látható, a castolásos módszer adja a legkisebb kódot. Az első
kettő sem rossz, de van egy felesleges ANDLW művelet benne. Szimulátorral
kimértem a végrehajtási időket, sorban 6,5,7,11 utasításciklus kell nekik
(ugyan itt még hibás a castolás, de ebből a szemponból nem lényeges)
More information about the Elektro
mailing list