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