Mercurial > SDL_sound_CoreAudio
comparison decoders/libmpg123/decode_i586_dither.S @ 562:7e08477b0fc1
MP3 decoder upgrade work.
Ripped out SMPEG and mpglib support, replaced it with "mpg123.c" and libmpg123.
libmpg123 is a much better version of mpglib, so it should solve all the
problems about MP3's not seeking, or most modern MP3's not playing at all,
etc. Since you no longer have to make a tradeoff with SMPEG for features, and
SMPEG is basically rotting, I removed it from the project.
There is still work to be done with libmpg123...there are MMX, 3DNow, SSE,
Altivec, etc decoders which we don't have enabled at the moment, and the
build system could use some work to make this compile more cleanly, etc.
Still: huge win.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Fri, 30 Jan 2009 02:44:47 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
561:f2985e08589c | 562:7e08477b0fc1 |
---|---|
1 /* | |
2 decode_i586_dither: asm synth with dither noise | |
3 | |
4 copyright ?-2007 by the mpg123 project - free software under the terms of the LGPL 2.1 | |
5 see COPYING and AUTHORS files in distribution or http://mpg123.org | |
6 initially written by Stefan Bieschewski as decode_i586.s without dither | |
7 | |
8 This version uses "circular" 64k dither noise. | |
9 (Patch by Adrian <adrian.bacon@xs4all.nl>) | |
10 | |
11 Thomas learned something about assembler and the stack while making this one thread safe (removing static data). | |
12 */ | |
13 | |
14 #include "mangle.h" | |
15 | |
16 .data | |
17 #ifndef __APPLE__ | |
18 .section .rodata | |
19 #endif | |
20 ALIGN8 | |
21 .LC0: | |
22 .long 0x0,0x40dfffc0 | |
23 ALIGN8 | |
24 .LC1: | |
25 .long 0x0,0xc0e00000 | |
26 ALIGN8 | |
27 .text | |
28 /* int synth_1to1_i586_asm_dither(real *bandPtr, int channel, unsigned char *out, unsigned char *buffs, int bo_and_ditherindex[2], real *decwin); */ | |
29 .globl ASM_NAME(synth_1to1_i586_asm_dither) | |
30 ASM_NAME(synth_1to1_i586_asm_dither): | |
31 subl $16,%esp | |
32 pushl %ebp | |
33 pushl %edi | |
34 pushl %esi | |
35 pushl %ebx | |
36 /* stack: 0(%esp)=%ebx 4=esi 8=edi 12=ebp 16,20,24,28=local 32=back 36=bandptr 40=channel 44=out 48=buffs 52=bo 56=decwin */ | |
37 #define BANDPTR 36(%esp) | |
38 #define CHANNEL 40(%esp) | |
39 #define OUT 44(%esp) | |
40 #define BUFFS 48(%esp) | |
41 #define BO 52(%esp) | |
42 #define DECWIN 56(%esp) | |
43 #define LOC0 16(%esp) | |
44 #define LOC1 20(%esp) | |
45 #define LOC2 24(%esp) | |
46 #define DITHERINDEX 28(%esp) | |
47 movl BANDPTR,%eax | |
48 movl OUT,%esi | |
49 movl BO, %ebx | |
50 movl (%ebx),%ebp /* get bo value */ | |
51 movl 4(%ebx),%edi; /* get the ditherindex behind bo */ | |
52 movl %edi,DITHERINDEX | |
53 xorl %edi,%edi | |
54 cmpl %edi,CHANNEL | |
55 jne .L48 | |
56 decl %ebp | |
57 andl $15,%ebp | |
58 movl %ebp,(%ebx) /* save bo back */ | |
59 movl BUFFS,%ecx | |
60 jmp .L49 | |
61 .L48: | |
62 /* In stereo mode , "rewind" dither pointer 32 samples , so 2nd channel */ | |
63 /* has same dither values. Tested OK for mono and stereo MP2 and MP3 */ | |
64 subl $128,DITHERINDEX /* better move to %edi for the two calculations? */ | |
65 andl $0x0003fffc,DITHERINDEX | |
66 addl $2,%esi | |
67 movl BUFFS,%ecx | |
68 addl $2176,%ecx | |
69 .L49: | |
70 /* now the call of dct64 is prepared, stuff pushed to the stack, but soon after it's removed again */ | |
71 testl $1,%ebp | |
72 je .L50 | |
73 movl %ecx,%ebx | |
74 movl %ebp,LOC0 | |
75 pushl %eax | |
76 movl LOC1,%edx | |
77 leal (%ebx,%edx,4),%eax | |
78 pushl %eax | |
79 movl LOC2,%eax | |
80 incl %eax | |
81 andl $15,%eax | |
82 leal 1088(,%eax,4),%eax | |
83 addl %ebx,%eax | |
84 jmp .L74 | |
85 .L50: | |
86 leal 1088(%ecx),%ebx | |
87 leal 1(%ebp),%edx | |
88 movl %edx,LOC0 | |
89 pushl %eax | |
90 leal 1092(%ecx,%ebp,4),%eax | |
91 pushl %eax | |
92 leal (%ecx,%ebp,4),%eax | |
93 .L74: | |
94 pushl %eax | |
95 call ASM_NAME(dct64_i386) | |
96 addl $12,%esp | |
97 /* Now removed the parameters. | |
98 stack: 0(%esp)=%ebx 4=esi 8=edi 12=ebp 16,20,24,28=local 32=back 36=bandptr 40=channel 44=out 48=buffs 52=bo */ | |
99 movl LOC0,%edx | |
100 leal 0(,%edx,4),%edx | |
101 /* movl $ASM_NAME(decwin)+64,%eax */ | |
102 movl DECWIN,%eax | |
103 addl $64,%eax | |
104 movl %eax,%ecx | |
105 subl %edx,%ecx | |
106 movl $16,%ebp | |
107 .L55: | |
108 flds (%ecx) | |
109 fmuls (%ebx) | |
110 flds 4(%ecx) | |
111 fmuls 4(%ebx) | |
112 fxch %st(1) | |
113 flds 8(%ecx) | |
114 fmuls 8(%ebx) | |
115 fxch %st(2) | |
116 fsubrp %st,%st(1) | |
117 flds 12(%ecx) | |
118 fmuls 12(%ebx) | |
119 fxch %st(2) | |
120 faddp %st,%st(1) | |
121 flds 16(%ecx) | |
122 fmuls 16(%ebx) | |
123 fxch %st(2) | |
124 fsubrp %st,%st(1) | |
125 flds 20(%ecx) | |
126 fmuls 20(%ebx) | |
127 fxch %st(2) | |
128 faddp %st,%st(1) | |
129 flds 24(%ecx) | |
130 fmuls 24(%ebx) | |
131 fxch %st(2) | |
132 fsubrp %st,%st(1) | |
133 flds 28(%ecx) | |
134 fmuls 28(%ebx) | |
135 fxch %st(2) | |
136 faddp %st,%st(1) | |
137 flds 32(%ecx) | |
138 fmuls 32(%ebx) | |
139 fxch %st(2) | |
140 fsubrp %st,%st(1) | |
141 flds 36(%ecx) | |
142 fmuls 36(%ebx) | |
143 fxch %st(2) | |
144 faddp %st,%st(1) | |
145 flds 40(%ecx) | |
146 fmuls 40(%ebx) | |
147 fxch %st(2) | |
148 fsubrp %st,%st(1) | |
149 flds 44(%ecx) | |
150 fmuls 44(%ebx) | |
151 fxch %st(2) | |
152 faddp %st,%st(1) | |
153 flds 48(%ecx) | |
154 fmuls 48(%ebx) | |
155 fxch %st(2) | |
156 fsubrp %st,%st(1) | |
157 flds 52(%ecx) | |
158 fmuls 52(%ebx) | |
159 fxch %st(2) | |
160 faddp %st,%st(1) | |
161 flds 56(%ecx) | |
162 fmuls 56(%ebx) | |
163 fxch %st(2) | |
164 fsubrp %st,%st(1) | |
165 flds 60(%ecx) | |
166 fmuls 60(%ebx) | |
167 fxch %st(2) | |
168 subl $4,%esp | |
169 faddp %st,%st(1) | |
170 fxch %st(1) | |
171 fsubrp %st,%st(1) | |
172 | |
173 addl $4,DITHERINDEX | |
174 andl $0x0003fffc,DITHERINDEX | |
175 movl $ASM_NAME(dithernoise),%edi | |
176 addl DITHERINDEX,%edi | |
177 | |
178 fadd (%edi) | |
179 | |
180 /* fistpl and popl as a unit keep the stack unchanged */ | |
181 fistpl (%esp) | |
182 popl %eax | |
183 cmpl $32767,%eax | |
184 jg 1f | |
185 cmpl $-32768,%eax | |
186 jl 2f | |
187 movw %ax,(%esi) | |
188 jmp 4f | |
189 1: movw $32767,(%esi) | |
190 jmp 3f | |
191 2: movw $-32768,(%esi) | |
192 3: | |
193 /* incl %edi */ | |
194 4: | |
195 .L54: | |
196 addl $64,%ebx | |
197 subl $-128,%ecx | |
198 addl $4,%esi | |
199 decl %ebp | |
200 jnz .L55 | |
201 flds (%ecx) | |
202 fmuls (%ebx) | |
203 flds 8(%ecx) | |
204 fmuls 8(%ebx) | |
205 flds 16(%ecx) | |
206 fmuls 16(%ebx) | |
207 fxch %st(2) | |
208 faddp %st,%st(1) | |
209 flds 24(%ecx) | |
210 fmuls 24(%ebx) | |
211 fxch %st(2) | |
212 faddp %st,%st(1) | |
213 flds 32(%ecx) | |
214 fmuls 32(%ebx) | |
215 fxch %st(2) | |
216 faddp %st,%st(1) | |
217 flds 40(%ecx) | |
218 fmuls 40(%ebx) | |
219 fxch %st(2) | |
220 faddp %st,%st(1) | |
221 flds 48(%ecx) | |
222 fmuls 48(%ebx) | |
223 fxch %st(2) | |
224 faddp %st,%st(1) | |
225 flds 56(%ecx) | |
226 fmuls 56(%ebx) | |
227 fxch %st(2) | |
228 subl $4,%esp | |
229 faddp %st,%st(1) | |
230 fxch %st(1) | |
231 faddp %st,%st(1) | |
232 | |
233 addl $4,DITHERINDEX | |
234 andl $0x0003fffc,DITHERINDEX | |
235 movl $ASM_NAME(dithernoise),%edi | |
236 addl DITHERINDEX,%edi | |
237 | |
238 fadd (%edi) | |
239 /* fistpl and popl as a unit keep the stack unchanged */ | |
240 fistpl (%esp) | |
241 popl %eax | |
242 cmpl $32767,%eax | |
243 jg 1f | |
244 cmpl $-32768,%eax | |
245 jl 2f | |
246 movw %ax,(%esi) | |
247 jmp 4f | |
248 1: movw $32767,(%esi) | |
249 jmp 3f | |
250 2: movw $-32768,(%esi) | |
251 3: | |
252 /* incl %edi */ | |
253 4: | |
254 .L62: | |
255 addl $-64,%ebx | |
256 addl $4,%esi | |
257 movl LOC0,%edx | |
258 leal -128(%ecx,%edx,8),%ecx | |
259 movl $15,%ebp | |
260 .L68: | |
261 flds -4(%ecx) | |
262 fchs | |
263 fmuls (%ebx) | |
264 flds -8(%ecx) | |
265 fmuls 4(%ebx) | |
266 fxch %st(1) | |
267 flds -12(%ecx) | |
268 fmuls 8(%ebx) | |
269 fxch %st(2) | |
270 fsubrp %st,%st(1) | |
271 flds -16(%ecx) | |
272 fmuls 12(%ebx) | |
273 fxch %st(2) | |
274 fsubrp %st,%st(1) | |
275 flds -20(%ecx) | |
276 fmuls 16(%ebx) | |
277 fxch %st(2) | |
278 fsubrp %st,%st(1) | |
279 flds -24(%ecx) | |
280 fmuls 20(%ebx) | |
281 fxch %st(2) | |
282 fsubrp %st,%st(1) | |
283 flds -28(%ecx) | |
284 fmuls 24(%ebx) | |
285 fxch %st(2) | |
286 fsubrp %st,%st(1) | |
287 flds -32(%ecx) | |
288 fmuls 28(%ebx) | |
289 fxch %st(2) | |
290 fsubrp %st,%st(1) | |
291 flds -36(%ecx) | |
292 fmuls 32(%ebx) | |
293 fxch %st(2) | |
294 fsubrp %st,%st(1) | |
295 flds -40(%ecx) | |
296 fmuls 36(%ebx) | |
297 fxch %st(2) | |
298 fsubrp %st,%st(1) | |
299 flds -44(%ecx) | |
300 fmuls 40(%ebx) | |
301 fxch %st(2) | |
302 fsubrp %st,%st(1) | |
303 flds -48(%ecx) | |
304 fmuls 44(%ebx) | |
305 fxch %st(2) | |
306 fsubrp %st,%st(1) | |
307 flds -52(%ecx) | |
308 fmuls 48(%ebx) | |
309 fxch %st(2) | |
310 fsubrp %st,%st(1) | |
311 flds -56(%ecx) | |
312 fmuls 52(%ebx) | |
313 fxch %st(2) | |
314 fsubrp %st,%st(1) | |
315 flds -60(%ecx) | |
316 fmuls 56(%ebx) | |
317 fxch %st(2) | |
318 fsubrp %st,%st(1) | |
319 flds (%ecx) | |
320 fmuls 60(%ebx) | |
321 fxch %st(2) | |
322 subl $4,%esp | |
323 fsubrp %st,%st(1) | |
324 fxch %st(1) | |
325 fsubrp %st,%st(1) | |
326 | |
327 addl $4,DITHERINDEX | |
328 andl $0x0003fffc,DITHERINDEX | |
329 movl $ASM_NAME(dithernoise),%edi | |
330 addl DITHERINDEX,%edi | |
331 | |
332 fadd (%edi) | |
333 /* fistpl and popl as a unit keep the stack unchanged */ | |
334 fistpl (%esp) | |
335 popl %eax | |
336 cmpl $32767,%eax | |
337 jg 1f | |
338 cmpl $-32768,%eax | |
339 jl 2f | |
340 movw %ax,(%esi) | |
341 jmp 4f | |
342 1: movw $32767,(%esi) | |
343 jmp 3f | |
344 2: movw $-32768,(%esi) | |
345 3: | |
346 /* incl %edi */ | |
347 4: | |
348 .L67: | |
349 addl $-64,%ebx | |
350 addl $-128,%ecx | |
351 addl $4,%esi | |
352 decl %ebp | |
353 jnz .L68 | |
354 /* return ipv edi 0 in eax */ | |
355 movl $0,%eax | |
356 /* save ditherindex */ | |
357 movl BO,%ebx | |
358 movl DITHERINDEX,%esi | |
359 movl %esi,4(%ebx); | |
360 /* stack: 0=ebx 4=esi 8=edi 12=ebp 16,20,24,28=local 32=back 36=bandptr 40=channel 44=out 48=buffs 52=bo */ | |
361 popl %ebx | |
362 popl %esi | |
363 popl %edi | |
364 popl %ebp | |
365 addl $16,%esp | |
366 /* The stack must be now: 0=back 4=bandptr 8=channel 12=out 16=buffs 20=bo */ | |
367 ret | |
368 | |
369 /* Mark non-executable stack. */ | |
370 #if defined(__linux__) && defined(__ELF__) | |
371 .section .note.GNU-stack,"",%progbits | |
372 #endif |