C51 V6.20 & V6.21 still have reported bug

On Nov. 11, 2001, I sent in a C51 V6.20 bug report via e-mail to support.us@keil.com. I never received a response, so assumed Keil's policy was to silently introduce the bug fix in a subsequent update. After downloading V6.21, I see that the bug is still present. Now I'm wondering whether my e-mailed bug report was ever acted upon, so I'm going to try the forum as the means to report the bug.

I have a section of code with pointer incrementation that compiles and executes correctly when the pointer is defined as a generic pointer or as an xdata pointer, or when the optimization setting is reduced from the default OT(8,SPEED) to OT(7,SPEED). However, when the pointer is defined as a data or idata pointer, the compiler does not emit code to increment the pointer with default optimization.

I have provided example code demonstrating the problem. The specific statement is line 50 below.

unsigned char idata u64[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
unsigned char idata s[21];

void U64ToStr( char idata *s, unsigned char idata *binP, unsigned char n )
{
    unsigned char        bcd;
    unsigned char idata *bcdP;
    unsigned char        bitMsk = 0x80;
    unsigned char        carry;
    unsigned char        i;

    /*  Zero the target buffer (NUL-terminating the string).
     */
    for (bcdP = s, i = n + 1; i != 0; *bcdP++ = 0, i--)
        ;

    /*  Convert 64 bits of binary to unpacked BCD.  For each bit, starting
     *  with the MSBit, BCD = (BCD * 2) + bit.
     */
    for (i = 64; i != 0; i--)
    {
        carry = (*binP & bitMsk) ? 1 : 0;

        for (bcdP = s + n; bcdP != s; /* Iter in body */)
        {
            bcd  = *--bcdP * 2;
            bcd += carry;

            if (bcd < 10)
                carry = 0;
            else
            {
                carry = 1;
                bcd  -= 10;
            }

            *bcdP = bcd;
        }

        if ((bitMsk >>= 1) == 0)
        {
            bitMsk = 0x80;
            binP++;
        }
    }

    /*  ASCII'fy BCD.
     */
    for (i = n; i != 0; i--)
        *bcdP++ += '0'; /* <-- C51 BUG: bcdP doesn't increment for (i)data */
}

void main( void )
{
    for (;;)
        U64ToStr( s, u64, 6 );
}

--Dan Henry

Parents
  • It's not a bug, its a great optimization. Think about, does anyone one look at bcdP after this loop? No. So why emit code to update this variable? To better understand this add

       i = *bcdP;
    
    after the loop. In this case no code what so ever is generated! So when debugging use an lower optimization level or mark the variable volatile.

Reply
  • It's not a bug, its a great optimization. Think about, does anyone one look at bcdP after this loop? No. So why emit code to update this variable? To better understand this add

       i = *bcdP;
    
    after the loop. In this case no code what so ever is generated! So when debugging use an lower optimization level or mark the variable volatile.

Children
More questions in this forum