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

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

Re: [avr-gcc-list] Optimiser bloats code


From: Wouter van Gulik
Subject: Re: [avr-gcc-list] Optimiser bloats code
Date: Wed, 1 Aug 2007 11:33:02 +0200 (CEST)
User-agent: SquirrelMail/1.4.8

> Return values are promoted to an int.
>

Why? Is this a bug or a feature? Am I doing something wrong or is an u08
return always promoted to an int?

> You probably already know this, but you could also do:
>
> return PINB >> 5;
>
> which returns the same answer using the following:
>
>         in r24,54-0x20
>         swap r24
>         lsr r24
>         andi r24,0x7
>         clr r25
>         ret
>

Yes I know, (it is written above my example) I wanted to point out how bad
the results is when compiler start to "optimise" this.

Just curious, is there any faster way to bit invert as in my foo3 example
(see below). It now takes 9 instructions which is good but less is always
better.
A loop requires more instructions and is much slower. Anyone an idea on
smaller bit inversion for just 3 bits? Because if this is the smallest
way, you cant tell the compiler to do so :(

HTH

Wouter

//Force the compiler and voila! Optimal!
//Not bit inverted or bit inverted, the result is the same
uint8_t foo3(void) { //good
  e0:   88 27           eor     r24, r24

  uint8_t temp = 0;
  asm volatile("clr %0" : "=r" (temp) :);
  if(PINB & (1<<5)) temp |= (1<<2);
  e2:   1d 99           sbic    0x03, 5 ; 3
  e4:   84 60           ori     r24, 0x04       ; 4
  if(PINB & (1<<6)) temp |= (1<<1);
  e6:   1e 99           sbic    0x03, 6 ; 3
  e8:   82 60           ori     r24, 0x02       ; 2
  if(PINB & (1<<7)) temp |= (1<<0);
  ea:   1f 99           sbic    0x03, 7 ; 3
  ec:   81 60           ori     r24, 0x01       ; 1

  return temp;
}
  ee:   99 27           eor     r25, r25
  f0:   08 95           ret






reply via email to

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