I have function for caseless compare:
int strnicmp (const char *s1, const char *s2, int maxlen) {
char c1, c2;
   do {
     c1=*s1++;
     if (c1>='a' && c1<='z') c1&=0xDF;
     c2=*s2++;
     if (c2>='a' && c2<='z') c2&=0xDF;
// problematic code
     if (c1==c2) maxlen--;
   } while (maxlen && c1 && c2 && c1==c2);
// problematic code end
   if ((!c1 && !c2) || !maxlen) return 0;
   if ((!c1 && c2) || (c1<c2)) return -1;
   return 1;
}

Problematic code is compiled into this assembly:
;Common.c:31: if (c1==c2) maxlen--;
;       genCmpEq
; genCmpEq: left 1, right 1, result 1
;4
        ld      a,c
        sub     b               ;A=c1-c2
        jr      NZ,00139$
        ld      a,#0x01         ;A=1
        jr      00140$
00139$:
        xor     a,a             ;A=0
00140$:
;6
;       genIfx
        or      a,a             ;using A
        jr      Z,00113$
;       genMinus
        dec     de
;       genLabel
00113$:
;Common.c:32: } while (maxlen && c1 && c2 && c1==c2);
;       genIfx
        ld      a,e             ;overwriting A!!!
        or      a,d
        jr      Z,00114$
;       genIfx
        xor     a,a
        or      a,c
        jr      Z,00114$
;       genIfx
        xor     a,a
        or      a,b
        jr      Z,00114$
;       genIfx
        or      a,a             ;seems wants to use A???
        jp      NZ,00112$

It seems that it wants to use previously computed result stored in A but 
later this is overwritten. What to do to get correctly compiled program?

Thanks
Hynek Sladky

------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to