Forum: Mikrocontroller und Digitale Elektronik Übersetzungsfehler in GCC


von Bremer (Gast)


Lesenswert?

Hallo,

ich bin gerade dabei eine FFT zu schreiben. Dazu müssen einige Summen 
und Differnzen gebildet werden. Leider funktioniert das beim Compilieren 
nicht. GCC verwirft in der Optimierung die Differenzenbildung. Ich weiß, 
nur leider nicht warum. Der Code in C lautet:
1
temp.real = fft[0].real;
2
  fft[0].real = (temp.real + fft[2].real)*8;
3
  fft[2].real = (temp.real - fft[2].real)*8;
4
  
5
  temp.real = fft[1].real;
6
  fft[1].real = temp.real + fft[3].real;
7
  fft[1].real *= 8;
8
  fft[3].imag = temp.real - fft[3].real;
9
  fft[3].imag *= 8;
10
  
11
  fft[4].real *= 8;
12
  fft[6].imag *= 8;
13
  // fft[4] = fft[4] + fft[6]
14
  // fft[6] = fft[4] - fft[6]
15
  
16
  temp.real = fft[5].real;
17
  fft[5].real = fft[5].real - fft[7].imag;  // fft[5] = fft[5] + fft[7]
18
  fft[5].real *= w4.real;
19
  fft[7].imag = temp.real + fft[7].imag;  // fft[7] = -fft[5] + fft[7]
20
  fft[7].imag *= w4.real;

und in Assembler wird er erste Block zu:
1
  temp.real = fft[0].real;
2
000003C8  LDD R6,Y+1    Load indirect with displacement 
3
000003C9  LDD R7,Y+2    Load indirect with displacement 
4
  fft[0].real = (temp.real + fft[2].real)*8;
5
000003CA  LDD R4,Y+9    Load indirect with displacement 
6
000003CB  LDD R5,Y+10    Load indirect with displacement 
7
000003CC  MOVW R20,R6    Copy register pair 
8
000003CD  ADD R20,R4    Add without carry 
9
000003CE  ADC R21,R5    Add with carry 
10
000003CF  LSL R20    Logical Shift Left 
11
000003D0  ROL R21    Rotate Left Through Carry 
12
000003D1  LSL R20    Logical Shift Left 
13
000003D2  ROL R21    Rotate Left Through Carry 
14
000003D3  LSL R20    Logical Shift Left 
15
000003D4  ROL R21    Rotate Left Through Carry

Kann mir einer sagen, welchen Fehler ich mache oder wie ich das Problem 
umgehen kann?

Danke im Voraus für die Antworten.

von Jim M. (turboj)


Lesenswert?

Ich sehe keinen Fehler im Assembler Code. Der macht ganz genau das was 
Du in C hingeschrieben hast: Eine Addition und einmal Multiplizieren mit 
8 in Form von 3 Left-Shifts, alles in 16 Bit.

von Bremer (Gast)


Lesenswert?

ja die Addition passt, aber die Subtraktion fehlt. Vielleicht war es 
missverständlich. Hier sind noch ein paar Zeilen mehr:
1
  temp.real = fft[0].real;
2
000003C8  LDD R6,Y+1    Load indirect with displacement 
3
000003C9  LDD R7,Y+2    Load indirect with displacement 
4
  fft[0].real = (temp.real + fft[2].real)*8;
5
000003CA  LDD R4,Y+9    Load indirect with displacement 
6
000003CB  LDD R5,Y+10    Load indirect with displacement 
7
000003CC  MOVW R20,R6    Copy register pair 
8
000003CD  ADD R20,R4    Add without carry 
9
000003CE  ADC R21,R5    Add with carry 
10
000003CF  LSL R20    Logical Shift Left 
11
000003D0  ROL R21    Rotate Left Through Carry 
12
000003D1  LSL R20    Logical Shift Left 
13
000003D2  ROL R21    Rotate Left Through Carry 
14
000003D3  LSL R20    Logical Shift Left 
15
000003D4  ROL R21    Rotate Left Through Carry 
16
  temp.real = fft[1].real;
17
000003D5  LDD R10,Y+5    Load indirect with displacement 
18
000003D6  LDD R11,Y+6    Load indirect with displacement 
19
  fft[1].real = temp.real + fft[3].real;
20
000003D7  LDD R8,Y+13    Load indirect with displacement 
21
000003D8  LDD R9,Y+14    Load indirect with displacement 
22
000003D9  MOVW R22,R10    Copy register pair 
23
000003DA  ADD R22,R8    Add without carry 
24
000003DB  ADC R23,R9    Add with carry 
25
  fft[1].real *= 8;
26
000003DC  LSL R22    Logical Shift Left 
27
000003DD  ROL R23    Rotate Left Through Carry 
28
000003DE  LSL R22    Logical Shift Left 
29
000003DF  ROL R23    Rotate Left Through Carry 
30
000003E0  LSL R22    Logical Shift Left 
31
000003E1  ROL R23    Rotate Left Through Carry 
32
  fft[4].real *= 8;
33
000003E2  LDD R26,Y+17    Load indirect with displacement 
34
000003E3  LDD R27,Y+18    Load indirect with displacement 
35
000003E4  LSL R26    Logical Shift Left 
36
000003E5  ROL R27    Rotate Left Through Carry 
37
000003E6  LSL R26    Logical Shift Left 
38
000003E7  ROL R27    Rotate Left Through Carry 
39
000003E8  LSL R26    Logical Shift Left 
40
000003E9  ROL R27    Rotate Left Through Carry 
41
  fft[6].imag *= 8;
42
000003EA  LDD R30,Y+27    Load indirect with displacement 
43
000003EB  LDD R31,Y+28    Load indirect with displacement 
44
000003EC  LSL R30    Logical Shift Left 
45
000003ED  ROL R31    Rotate Left Through Carry 
46
000003EE  LSL R30    Logical Shift Left 
47
000003EF  ROL R31    Rotate Left Through Carry 
48
000003F0  LSL R30    Logical Shift Left 
49
000003F1  ROL R31    Rotate Left Through Carry 
50
  temp.real = fft[5].real;

von Karl H. (kbuchegg)


Lesenswert?

Bremer schrieb:
> ja die Addition passt, aber die Subtraktion fehlt. Vielleicht war es
> missverständlich. Hier sind noch ein paar Zeilen mehr:

Noch mehr.

Denn da fehlt noch mehr. Auch das Zurückschreiben ins Array hab ich noch 
nicht gesehen.
Irgendwo muss das Zeugs ja sein.

von Gerald M. (gerald_m17)


Lesenswert?

Vielleicht benutzt du die berechneten Variablen nicht, weshalb sie 
wegoptimiert werden

von Bremer (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen,

hier ist der gesammte Quellcode der Funktion.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

blind?
Such in deiner .s Datei nach
"fft[2].real = (temp.real - fft[2].real)*8;"
und du wirst es finden.
Er hats einfach nur umsortiert.
Da er in der nachfolgenden Rechnung nicht auf "fft[2].real" zugrift 
berechnet er es eben irgendwo.

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.