Forum: PC Hard- und Software Helix MP3 Decoder für x86 Linux


von Mampf F. (mampf) Benutzerseite


Lesenswert?

Guten Morgen :)

hatte vor einiger Zeit mal einen MP3-Player mit Equalizer und 
Dynamik-Kompression für ein DIY-Board mit STM32F429 gebaut und jetzt den 
Code nach Linux für einen x86 portiert (alles hardwarespezifische 
rausgeschmissen, statt UART Netzwerk, statt I2S-DMA ALSA eingebaut und 
statt FATFS normale File-Funktionen verwendet und möchte ihn später dann 
auf einem Raspi laufen lassen)

Um die Änderungen minimal zu lassen - Faulheit siegt - hab ich einfach 
den Helix-MP3 auch für x86 kompiliert und der hat erstmal gemeckert, 
dass er keinen Assembler-Code für ARM kompilieren kann, was auch logisch 
ist.

Der Helix kann mit einem Define auch x86-Code erzeugen, allerdings sind 
die Assembler-Funktionen nur für Win32 verfügbar (d.h. Intel-Style 
Assembler, aber kein AT&T Style).

Ich hab dann schlicht die 6 Funktionen einfach in Plain-C nachgebaut:
1
static __inline int MULSHIFT32(int x, int y)
2
{
3
  return ((int64_t) x*(int64_t) y) >> 32ll;
4
}
5
6
static __inline int FASTABS(int x)
7
{
8
  int sign;
9
10
  sign = x >> (sizeof(int) * 8 - 1);
11
  x ^= sign;
12
  x -= sign;
13
14
  return x;
15
}
16
17
static __inline int CLZ(int x)
18
{
19
  int numZeros;
20
21
  if (!x)
22
    return (sizeof(int) * 8);
23
24
  numZeros = 0;
25
  while (!(x & 0x80000000)) {
26
    numZeros++;
27
    x <<= 1;
28
  }
29
30
  return numZeros;
31
}
32
33
static __inline int64_t MADD64(int64_t sum, int32_t x, int32_t y)
34
{
35
  return sum+(int64_t)x*y;
36
}
37
38
static __inline int64_t SHL64(int64_t x, int n)
39
{
40
  return x << n;
41
}
42
43
static __inline int64_t SAR64(int64_t x, int n)
44
{
45
  return x >> n;
46
}

(FASTABS und CLZ gab es schon als C-Code).

Funktionieren tut es, aber Assembler wäre nett.

Hat jemand eine Idee, ob es eine GCC-kompilierbare Version mit 
Assembler-Support für x86 gibt?

Würde mich fast wundern, wenn sich da noch niemand die Arbeit gemacht 
hätte ... Aber per Google hat sich nichts auffinden lassen.

Normalerweise scheue ich mich nicht vor Assembler (hab Jahrelang bis 
SSE3 Assembler programmiert), aber ich hab den GCC Inline Assembler 
niemals "verhirnt" ...

Weiß jemand etwas?

VG
Mampf

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Mampf F. schrieb:
> Funktionieren tut es, aber Assembler wäre nett.

Du dürftest die Arbeitsweise moderner C- Compiler deutlich 
unterschätzen. Es ist ein Riesenaufwand da Assembler Code zu schreiben 
der echt schneller ist.

Außerdem ist X86 so schnell dass sich die Optimierung überhaupt nicht 
lohnt.

Übrigens müsste es nasm auch für Linux geben, das sollte die Intel 
Syntax können.

von Vka (Gast)


Lesenswert?

Hast du mal ins Assembly Listing geschaut was der Compiler daraus macht?
Das sind ja absolut winzige Inline Funktionen, ich kann mir vorstellen 
dass die schon sehr gut optimiert sind. Oder auch komplett untergehen, 
je nachdem wie stark der Kontext optimiert/umgebaut wird.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Ja, wahrscheinlich habt ihr recht ... Im Debug-Modus (-Og) werden nur 
10% einer einzigen CPU verbraucht :)

Dann lass ich es so und konzentrier mich lieber auf die Raspi-Portation 
:) Da werd ich dann eh wieder den ARM-Assembler-Teil aktivieren, dann 
ist es nochmal egaler :)

Danke!

: Bearbeitet durch User
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.