Forum: Mikrocontroller und Digitale Elektronik Berechnungen auf avr 8 bit


von rechner (Gast)


Lesenswert?

Morgen,

mal ne frage, was geht schneller auf nem avr 8 bit:

unsigned int j=(zahl<<1)-(i<<9);

unsigned int j=(zahl-256*i)*2;

von Hmm... (Gast)


Lesenswert?

Ersteres, da keine Multiplikation...

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Ohne die Aequivalenz der Operationen vorauszusetzen natuerlich 
ersteres...

von Steven (. (ovular) Benutzerseite


Lesenswert?

Seht doch einfach nach der Anzahl der Operatoren? Das reicht in dem Fall 
schon...

Ich wünsche noch eine angenehme Nacht!
Gruß Ovular

von rechner (Gast)


Lesenswert?

Jo, danke

macht sinn.
hab ja schon umgeformt ...

wenn man die klammer auflöst steht da ja : 2*j-512*i

von rechner (Gast)


Lesenswert?

Äh,
wenn man die klammer auflöst steht da ja : j= 2*zahl-512*j


so gute nach :)

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Das sind immernoch zwei Multiplikationen Schnuffel :D

von rechner (Gast)


Lesenswert?

ja schon,
aber zahl<<1 ist zahl*2
und  j<<9 ist j*512

mir ist nicht klar ob der compiler oder wer auch immer, nicht auch 
einfach schiebt bei *2, warscheinlich schon oder?

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Kannste nicht von ausgehen ;)

von G. L. (sprintersb)


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) */

von rechner (Gast)


Lesenswert?

jau, danke.

-Os ist optimiert auf size, aber was ist -morder1 ?

von G. L. (sprintersb)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.