> 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




_______________________________________________
AVR-GCC-list mailing list
AVR-GCC-list@nongnu.org
http://lists.nongnu.org/mailman/listinfo/avr-gcc-list

Reply via email to