Berechnungen auf avr 8 bit

#870512
Lesenswert?

Zweiteres ist schneller, einfach GCC fragen (hier avr-gcc 3.4.6, 
ATmega8, -Os)

:-))
1
unsigned int foo1 (unsigned int zahl, unsigned int i)
2
{
3
    return (zahl<<1)-(i<<9);
4
}    
5

6
unsigned int foo2 (unsigned int zahl, unsigned int i)
7
{
8
    return (zahl-256*i)*2;
9
}
1
foo1:
2
  movw r18,r22   ;  i, i   ;  4  *movhi/1  [length = 1]
3
  lsl r24   ;  tmp45   ;  31  *ashlhi3_const/2  [length = 2]
4
  rol r25   ;  tmp45
5
  mov r19,r18   ;  i   ;  30  *ashlhi3_const/5  [length = 3]
6
  clr r18   ;  i
7
  lsl r19   ;  i
8
  sub r24,r18   ;  <result>, i   ;  22  subhi3/1  [length = 2]
9
  sbc r25,r19   ;  <result>, i
10
  ret
11
/* function foo1 size 9 (8) */
12

13
foo2:
14
  movw r18,r22   ;  i, i   ;  4  *movhi/1  [length = 1]
15
  mov r19,r18   ;  tmp45, i   ;  33  *ashlhi3_const/3  [length = 2]
16
  clr r18   ;  tmp45
17
  sub r24,r18   ;  tmp47, tmp45   ;  14  subhi3/1  [length = 2]
18
  sbc r25,r19   ;  tmp47, tmp45
19
  lsl r24   ;  <result>   ;  32  *ashlhi3_const/2  [length = 2]
20
  rol r25   ;  <result>
21
  ret
22
/* function foo2 size 8 (7) */

Kann er aber noch etwas besser (-Os -morder1):
1
foo2:
2
  mov r19,r22   ;  tmp45, i   ;  35  *ashlhi3_const/3  [length = 2]
3
  clr r18   ;  tmp45
4
  sub r24,r18   ;  zahl, tmp45   ;  14  subhi3/1  [length = 2]
5
  sbc r25,r19   ;  zahl, tmp45
6
  lsl r24   ;  <result>   ;  34  *ashlhi3_const/2  [length = 2]
7
  rol r25   ;  <result>
8
  ret
9
/* function foo2 size 7 (6) */
#870665
Lesenswert?

rechner wrote:
> aber was ist -morder1 ?

avr-gcc bietet 2 undokumentierte Optionen, welche die 
Registerallokierung (d.h. Abbildung von pseudo-regs auf hard-regs) 
beeinflussen. Neben der Standard-Rgisterreihenfolge gibt's noch -morder1 
und -morder2 (zumindest in avr-gcc 3.4.x). Wahrscheinlich von Chertikov 
zum Rumexperimentieren?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren