avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avr-gcc-list] Optimization - what is bad on this code ?


From: Vaclav Peroutka
Subject: [avr-gcc-list] Optimization - what is bad on this code ?
Date: Sun, 04 Oct 2009 21:33:13 +0200 (CEST)

Hello all,

I am sorry, but maybe somebody has expierience why the following code is 
deleted during optimization. I have two functions for printing of numbers 
(uart_puts() just send string to UART) :
void uart_putux( unsigned int aInt)
{
  unsigned char buf[5];
  unsigned char icnt = 4;

  buf[icnt--] = 0x00;
  while(icnt+1) {
    buf[icnt] = (aInt&0x0f) + 0x30;
    if (buf[icnt] > 0x39) {
      buf[icnt] += 0x07;
    }
    aInt >>= 4;
    icnt--;
  }
  uart_puts( buf);
}

void uart_putlx( unsigned long aInt)
{
  unsigned char buf[9];
  unsigned char icnt = 8;

  buf[icnt--] = 0x00;
  while(icnt+1) {
    buf[icnt] = (aInt&0x0f) + 0x30;
    if (buf[icnt] > 0x39) {
      buf[icnt] += 0x07;
    }
    aInt >>= 4;
    icnt--;
  }
  uart_puts( buf);
}

After I compile and link the code, in .LST I see following:
void uart_putux( unsigned int aInt)
{
 35a:   ff cf           rjmp    .-2             ; 0x35a <uart_putux>

0000035c <uart_putlx>:
  }
  uart_puts( buf);
}

void uart_putlx( unsigned long aInt)
{
 35c:   ff cf           rjmp    .-2             ; 0x35c <uart_putlx>

For compilation I use following:
/opt/avr-gcc.4.3.4/bin/avr-gcc -g -mmcu=atmega16 -Wall -Wstrict-prototypes -Os 
-mcall-prologues -I /opt/avr-gcc.4.3.4/bin/include -fno-inline-small-functions 
-fno-reorder-blocks -fno-reorder-blocks-and-partition -fno-reorder-functions 
-fno-toplevel-reorder -fno-move-loop-invariants   -c -o hal.o hal.c

If I remove "-Os", the code is there. But if I understand correctly, gcc sees 
the code unusable. What is bad inside ? The code worked in older avr-gcc...

Thank you for help,
Vaclav




reply via email to

[Prev in Thread] Current Thread [Next in Thread]