Included below is a small piece of code that attempts
to "shift down" some unsigned long's in an array. The
2nd assignment in "shiftArray()" fails:


// Code start --- mspgcc_bug.c ---------------------------------
//
unsigned long temp[3] = {
  0x11112222L,
  0x33334444L,
  0x00000000L
};

void shiftArray(unsigned long *t)
{
  t[2] = t[1];   // OK    - Code generated was (r15 is pointer to temp):
                 //            mov  4(r15), 8(r15)
                 //            mov  6(r15), 10(r15)

  t[1] = t[0];   // Fails - Generated code:
                 //            mov  @r15+, 4(r15)
                 //            mov  @r15+, 6(r15)
}

int main(void)
{
  shiftArray(temp);
  return 0;
}
//
// Code end ---------------------------------------------


The problem is that r15 is being autoincremented in the last
two fetches/sources. It's also being used as an index for the
destination, without compensating for the fact that the fetches
have altered r15.

Background info:

 OS: Redhat 9.0
 Tools: Built from sources, Oct 20, 2003
 CPU: MSP430F149
 Cmd Line: msp430-gcc -mmcu=msp430x149 -O2 -Wall -g -o mspgcc_bug
mspgcc_bug.c

Am I doing something stupid, or is this really a compiler bug?

Thanks,
Mike


Reply via email to