This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

A bug in C51 code generation

I think Keil C51 version 8 has a bug in the code generation. The following source shows the bug:

typedef unsigned char BYTE;
typedef unsigned short WORD;

#define FIXED_VAULE     64

#define MAKEWORD(h, l)  (((WORD )(h) << 8) | (BYTE )(l))

void main(void)
{
    BYTE    x = 2;
    BYTE    y = 2;
    WORD    z;

    // The code generation for this line is incorrect
    z = MAKEWORD(FIXED_VAULE - x - 1, FIXED_VAULE - y - 1);

    // The Keil v8 asm listing shows the generated code for this
    // line is different to the previous line's.
    z = MAKEWORD(FIXED_VAULE - 1 - x, FIXED_VAULE - 1 - y);

    // However, if MAKEWORD is defined as:
    // #define MAKEWORD(h, l)  (((WORD )(h) << 8) | (WORD )(l))
    // the ASM code for 2 lines are the same.
}

0