Übersetzungsfehler in GCC

Gast #4405196
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.
Gast #4405214
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;

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.