~ubuntu-branches/ubuntu/karmic/mpg123/karmic

« back to all changes in this revision

Viewing changes to src/libmpg123/decode_i586.S

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Kobras
  • Date: 2008-09-07 17:02:54 UTC
  • mfrom: (5.1.6 intrepid)
  • Revision ID: james.westby@ubuntu.com-20080907170254-m83mo5cgdk0hrqnp
Tags: 1.4.3-4
* src/wav.c: Backport upstream patch for writing WAV output to stdout
  via '-w -'. Fixes regression from etch. Closes: #493285
* debian/rules: Only include ALSA dependencies when respective plugin has
  been built. Original patch thanks to Petr Salinger. Fixes build failure
  on GNU/kFreeBSD. Closes: #493423

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 decode_i586: asm synth
 
3
 
 
4
 copyright ?-2006 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
 
7
 
 
8
 synth_1to1 works the same way as the c version of this
 
9
 file.  only two types of changes have been made:
 
10
 - reordered floating point instructions to
 
11
   prevent pipline stalls
 
12
 - made WRITE_SAMPLE use integer instead of
 
13
   (slower) floating point
 
14
 all kinds of x86 processors should benefit from these
 
15
 modifications.
 
16
 
 
17
 useful sources of information on optimizing x86 code include:
 
18
 
 
19
     Intel Architecture Optimization Manual
 
20
     http://www.intel.com/design/pentium/manuals/242816.htm
 
21
 
 
22
     Cyrix 6x86 Instruction Set Summary
 
23
     ftp://ftp.cyrix.com/6x86/6x-dbch6.pdf
 
24
 
 
25
     AMD-K5 Processor Software Development
 
26
     http://www.amd.com/products/cpg/techdocs/appnotes/20007e.pdf
 
27
 
 
28
 Stefan Bieschewski <stb@acm.org>
 
29
 
 
30
 $Id: decode_i586.s 1 2004-09-18 13:30:08Z thomas $
 
31
*/
 
32
 
 
33
#include "mangle.h"
 
34
 
 
35
.data
 
36
#ifndef __APPLE__
 
37
.section .rodata
 
38
#endif
 
39
        ALIGN8
 
40
.LC0:
 
41
        .long 0x0,0x40dfffc0
 
42
        ALIGN8
 
43
.LC1:
 
44
        .long 0x0,0xc0e00000
 
45
        ALIGN8
 
46
.text
 
47
/* int synth_1to1_i586_asm(real *bandPtr, int channel, unsigned char *out, unsigned char *buffs, int *bo, real *decwin); */
 
48
.globl ASM_NAME(synth_1to1_i586_asm)
 
49
ASM_NAME(synth_1to1_i586_asm):
 
50
        subl $12,%esp
 
51
        pushl %ebp
 
52
        pushl %edi
 
53
        pushl %esi
 
54
        pushl %ebx
 
55
/* stack: 0=ebx, 4=esi, 8=edi, 12=ebp, 16,20,24=local, 28=back, 32=bandPtr, 36=channel, 40=out, 44=buffs, 48=bo, 52=decwin */
 
56
        movl 32(%esp),%eax /* *bandPtr */
 
57
        movl 40(%esp),%esi /* *out */
 
58
        movl 48(%esp),%edi /* *bo */
 
59
        movl (%edi),%ebp   /* store bo value in ebp */
 
60
        xorl %edi,%edi
 
61
        cmpl %edi,36(%esp)
 
62
        jne .L48           /* if(!channel) */
 
63
        decl %ebp          /* bo-- */
 
64
        andl $15,%ebp      /* bo &= 0xf */
 
65
        movl 48(%esp),  %edi /* *bo */
 
66
        movl %ebp,(%edi)   /* write back bo */
 
67
        xorl %edi,%edi     /* restore %edi to 0; it's used later */
 
68
        movl 44(%esp),%ecx /* use buffs */
 
69
        jmp .L49
 
70
.L48: /* if(channel) use buffs+2176 */
 
71
        addl $2,%esi
 
72
        movl 44(%esp),%ecx /* *buffs */
 
73
        addl $2176,%ecx
 
74
.L49:
 
75
        testl $1,%ebp
 
76
        je .L50
 
77
        movl %ecx,%ebx
 
78
        movl %ebp,16(%esp)
 
79
        pushl %eax
 
80
        movl 20(%esp),%edx
 
81
        leal (%ebx,%edx,4),%eax
 
82
        pushl %eax
 
83
        movl 24(%esp),%eax
 
84
        incl %eax
 
85
        andl $15,%eax
 
86
        leal 1088(,%eax,4),%eax
 
87
        addl %ebx,%eax
 
88
        jmp .L74
 
89
.L50:
 
90
        leal 1088(%ecx),%ebx
 
91
        leal 1(%ebp),%edx
 
92
        movl %edx,16(%esp)
 
93
        pushl %eax
 
94
        leal 1092(%ecx,%ebp,4),%eax
 
95
        pushl %eax
 
96
        leal (%ecx,%ebp,4),%eax
 
97
.L74:
 
98
        pushl %eax
 
99
        call ASM_NAME(dct64_i386)
 
100
        addl $12,%esp
 
101
/* stack now back on track */
 
102
        movl 16(%esp),%edx
 
103
        leal 0(,%edx,4),%edx
 
104
        movl 52(%esp),%eax /* decwin */
 
105
        addl $64,%eax
 
106
        movl %eax,%ecx
 
107
        subl %edx,%ecx
 
108
        movl $16,%ebp
 
109
.L55:
 
110
        flds (%ecx)
 
111
        fmuls (%ebx)
 
112
        flds 4(%ecx)
 
113
        fmuls 4(%ebx)
 
114
        fxch %st(1)
 
115
        flds 8(%ecx)
 
116
        fmuls 8(%ebx)
 
117
        fxch %st(2)
 
118
        fsubrp %st,%st(1)
 
119
        flds 12(%ecx)
 
120
        fmuls 12(%ebx)
 
121
        fxch %st(2)
 
122
        faddp %st,%st(1)
 
123
        flds 16(%ecx)
 
124
        fmuls 16(%ebx)
 
125
        fxch %st(2)
 
126
        fsubrp %st,%st(1)
 
127
        flds 20(%ecx)
 
128
        fmuls 20(%ebx)
 
129
        fxch %st(2)
 
130
        faddp %st,%st(1)
 
131
        flds 24(%ecx)
 
132
        fmuls 24(%ebx)
 
133
        fxch %st(2)
 
134
        fsubrp %st,%st(1)
 
135
        flds 28(%ecx)
 
136
        fmuls 28(%ebx)
 
137
        fxch %st(2)
 
138
        faddp %st,%st(1)
 
139
        flds 32(%ecx)
 
140
        fmuls 32(%ebx)
 
141
        fxch %st(2)
 
142
        fsubrp %st,%st(1)
 
143
        flds 36(%ecx)
 
144
        fmuls 36(%ebx)
 
145
        fxch %st(2)
 
146
        faddp %st,%st(1)
 
147
        flds 40(%ecx)
 
148
        fmuls 40(%ebx)
 
149
        fxch %st(2)
 
150
        fsubrp %st,%st(1)
 
151
        flds 44(%ecx)
 
152
        fmuls 44(%ebx)
 
153
        fxch %st(2)
 
154
        faddp %st,%st(1)
 
155
        flds 48(%ecx)
 
156
        fmuls 48(%ebx)
 
157
        fxch %st(2)
 
158
        fsubrp %st,%st(1)
 
159
        flds 52(%ecx)
 
160
        fmuls 52(%ebx)
 
161
        fxch %st(2)         
 
162
        faddp %st,%st(1)
 
163
        flds 56(%ecx)
 
164
        fmuls 56(%ebx)
 
165
        fxch %st(2)
 
166
        fsubrp %st,%st(1)
 
167
        flds 60(%ecx)
 
168
        fmuls 60(%ebx)
 
169
        fxch %st(2)
 
170
        subl $4,%esp
 
171
        faddp %st,%st(1)
 
172
        fxch %st(1)
 
173
        fsubrp %st,%st(1)
 
174
        fistpl (%esp)
 
175
        popl %eax
 
176
        cmpl $32767,%eax
 
177
        jg 1f
 
178
        cmpl $-32768,%eax
 
179
        jl 2f
 
180
        movw %ax,(%esi)
 
181
        jmp 4f
 
182
1:      movw $32767,(%esi)
 
183
        jmp 3f
 
184
2:      movw $-32768,(%esi)
 
185
3:      incl %edi
 
186
4:
 
187
.L54:
 
188
        addl $64,%ebx
 
189
        subl $-128,%ecx
 
190
        addl $4,%esi
 
191
        decl %ebp
 
192
        jnz .L55
 
193
        flds (%ecx)
 
194
        fmuls (%ebx)
 
195
        flds 8(%ecx)
 
196
        fmuls 8(%ebx)
 
197
        flds 16(%ecx)
 
198
        fmuls 16(%ebx)
 
199
        fxch %st(2)
 
200
        faddp %st,%st(1)
 
201
        flds 24(%ecx)
 
202
        fmuls 24(%ebx)
 
203
        fxch %st(2)
 
204
        faddp %st,%st(1)
 
205
        flds 32(%ecx)
 
206
        fmuls 32(%ebx)
 
207
        fxch %st(2)
 
208
        faddp %st,%st(1)
 
209
        flds 40(%ecx)
 
210
        fmuls 40(%ebx)
 
211
        fxch %st(2)
 
212
        faddp %st,%st(1)
 
213
        flds 48(%ecx)
 
214
        fmuls 48(%ebx)
 
215
        fxch %st(2)
 
216
        faddp %st,%st(1)
 
217
        flds 56(%ecx)
 
218
        fmuls 56(%ebx)
 
219
        fxch %st(2)
 
220
        subl $4,%esp
 
221
        faddp %st,%st(1)
 
222
        fxch %st(1)
 
223
        faddp %st,%st(1)
 
224
        fistpl (%esp)
 
225
        popl %eax
 
226
        cmpl $32767,%eax
 
227
        jg 1f
 
228
        cmpl $-32768,%eax
 
229
        jl 2f
 
230
        movw %ax,(%esi)
 
231
        jmp 4f
 
232
1:      movw $32767,(%esi)
 
233
        jmp 3f
 
234
2:      movw $-32768,(%esi)
 
235
3:      incl %edi
 
236
4:
 
237
.L62:
 
238
        addl $-64,%ebx
 
239
        addl $4,%esi
 
240
        movl 16(%esp),%edx
 
241
        leal -128(%ecx,%edx,8),%ecx
 
242
        movl $15,%ebp
 
243
.L68:
 
244
        flds -4(%ecx)
 
245
        fchs
 
246
        fmuls (%ebx)
 
247
        flds -8(%ecx)
 
248
        fmuls 4(%ebx)
 
249
        fxch %st(1)
 
250
        flds -12(%ecx)
 
251
        fmuls 8(%ebx)
 
252
        fxch %st(2)
 
253
        fsubrp %st,%st(1)
 
254
        flds -16(%ecx)
 
255
        fmuls 12(%ebx)
 
256
        fxch %st(2)
 
257
        fsubrp %st,%st(1)
 
258
        flds -20(%ecx)
 
259
        fmuls 16(%ebx)
 
260
        fxch %st(2)
 
261
        fsubrp %st,%st(1)
 
262
        flds -24(%ecx)
 
263
        fmuls 20(%ebx)
 
264
        fxch %st(2)
 
265
        fsubrp %st,%st(1)
 
266
        flds -28(%ecx)
 
267
        fmuls 24(%ebx)
 
268
        fxch %st(2)
 
269
        fsubrp %st,%st(1)
 
270
        flds -32(%ecx)
 
271
        fmuls 28(%ebx)
 
272
        fxch %st(2)
 
273
        fsubrp %st,%st(1)
 
274
        flds -36(%ecx)
 
275
        fmuls 32(%ebx)
 
276
        fxch %st(2)
 
277
        fsubrp %st,%st(1)
 
278
        flds -40(%ecx)
 
279
        fmuls 36(%ebx)
 
280
        fxch %st(2)
 
281
        fsubrp %st,%st(1)
 
282
        flds -44(%ecx)
 
283
        fmuls 40(%ebx)
 
284
        fxch %st(2)
 
285
        fsubrp %st,%st(1)
 
286
        flds -48(%ecx)
 
287
        fmuls 44(%ebx)
 
288
        fxch %st(2)
 
289
        fsubrp %st,%st(1)
 
290
        flds -52(%ecx)
 
291
        fmuls 48(%ebx)
 
292
        fxch %st(2)
 
293
        fsubrp %st,%st(1)
 
294
        flds -56(%ecx)
 
295
        fmuls 52(%ebx)
 
296
        fxch %st(2)
 
297
        fsubrp %st,%st(1)
 
298
        flds -60(%ecx)
 
299
        fmuls 56(%ebx)
 
300
        fxch %st(2)
 
301
        fsubrp %st,%st(1)
 
302
        flds (%ecx)
 
303
        fmuls 60(%ebx)
 
304
        fxch %st(2)
 
305
        subl $4,%esp
 
306
        fsubrp %st,%st(1)
 
307
        fxch %st(1)
 
308
        fsubrp %st,%st(1)
 
309
        fistpl (%esp)
 
310
        popl %eax
 
311
        cmpl $32767,%eax
 
312
        jg 1f
 
313
        cmpl $-32768,%eax
 
314
        jl 2f
 
315
        movw %ax,(%esi)
 
316
        jmp 4f
 
317
1:      movw $32767,(%esi)
 
318
        jmp 3f
 
319
2:      movw $-32768,(%esi)
 
320
3:      incl %edi
 
321
4:
 
322
.L67:
 
323
        addl $-64,%ebx
 
324
        addl $-128,%ecx
 
325
        addl $4,%esi
 
326
        decl %ebp
 
327
        jnz .L68
 
328
        movl %edi,%eax
 
329
        popl %ebx
 
330
        popl %esi
 
331
        popl %edi
 
332
        popl %ebp
 
333
        addl $12,%esp
 
334
        ret
 
335