[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