~ubuntu-branches/ubuntu/lucid/mpg123/lucid

« back to all changes in this revision

Viewing changes to decode_3dnow.s

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Kobras
  • Date: 2004-09-07 15:57:57 UTC
  • Revision ID: james.westby@ubuntu.com-20040907155757-pgypftl9bt2uqyyl
Tags: 0.59r-16
* layer2.c: Fix buffer overflow in layer2 decoder (CVE ID CAN-2004-0805).
* Makefile: Fix compiler options to build for generic targets on ARM,
  but optimise for xscale. Closes: #261255
* README.3DNOW, dct36_3dnow.s, dct64_3dnow.s, decode_3dnow.s,
  decode_i386.c, equalizer_3dnow.s, getcpuflags.s, layer3.c, mpg123.c,
  mpg123.h, tabinit.c, debian/rules: Apply patch by KIMURA Takuhiro and
  Syuuhei Kashiyama to fix errors in 3dnow-optimised decoding.
  Thanks to Alberto Garcia for the patch-merging. Closes: #242212
* debian/prerm: De-register mp3-decoder alternative. Closes: #222982
* debian/changelog: Convert to utf8.
* debian/control: Bump standards version.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/ synth_1to1_3dnow works the same way as the c version of
2
 
/ synth_1to1. this assembler code based 'decode-i586.s'
3
 
/ (by Stefan Bieschewski <stb@acm.org>), two types of changes
4
 
/ have been made:
5
 
/ - use {MMX,3DNow!} instruction for reduce cpu 
6
 
/ - remove unused(?) local symbols
7
 
/
8
 
/ useful sources of information on optimizing 3DNow! code include:
9
 
/ AMD 3DNow! Technology Manual (Publication #21928)
10
 
/     English:  http://www.amd.com/K6/k6docs/pdf/21928d.pdf
11
 
/    (Japanese: http://www.amd.com/japan/K6/k6docs/j21928c.pdf)
12
 
/ AMD-K6-2 Processor Code Optimization Application Note (Publication #21924)
13
 
/     English:  http://www.amd.com/K6/k6docs/pdf/21924b.pdf
14
 
/
15
 
/ This code was tested only AMD-K6-2 processor Linux systems,
16
 
/ please tell me:
17
 
/ - whether this code works on other 3DNow! capable processors
18
 
/  (ex.IDT-C6-2) or not
19
 
/ - whether this code works on other OSes or not
20
 
/
21
 
/ by KIMURA Takuhiro <kim@hannah.ipc.miyakyo-u.ac.jp> - until 31.Mar.1998
22
 
/                    <kim@comtec.co.jp>               - after  1.Apr.1998
23
 
 
24
 
/ Enhancments for q-word operation by Michael Hipp
25
 
 
26
 
.bss
27
 
        .comm   buffs,4352,4
 
1
/
 
2
/ decode_3dnow.s - 3DNow! optimized synth_1to1()
 
3
/
 
4
/ This code based 'decode_3dnow.s' by Syuuhei Kashiyama
 
5
/ <squash@mb.kcom.ne.jp>,only two types of changes have been made:
 
6
/
 
7
/ - remove PREFETCH instruction for speedup
 
8
/ - change function name for support 3DNow! automatic detect
 
9
/ - femms moved to before 'call dct64_3dnow'
 
10
/
 
11
/ You can find Kashiyama's original 3dnow! support patch
 
12
/ (for mpg123-0.59o) at
 
13
/ http://user.ecc.u-tokyo.ac.jp/~g810370/linux-simd/ (Japanese).
 
14
/
 
15
/ by KIMURA Takuhiro <kim@hannah.ipc.miyakyo-u.ac.jp> - until 31.Mar.1999
 
16
/                    <kim@comtec.co.jp>               - after  1.Apr.1999
 
17
/
 
18
 
 
19
///
 
20
/// Replacement of synth_1to1() with AMD's 3DNow! SIMD operations support
 
21
/// 
 
22
/// Syuuhei Kashiyama <squash@mb.kcom.ne.jp>
 
23
/// 
 
24
/// The author of this program disclaim whole expressed or implied
 
25
/// warranties with regard to this program, and in no event shall the
 
26
/// author of this program liable to whatever resulted from the use of
 
27
/// this program. Use it at your own risk.
 
28
/// 
 
29
 
 
30
        .local  buffs.40
 
31
        .comm   buffs.40,4352,32
28
32
.data
29
33
        .align 4
30
 
bo:
 
34
        .type    bo.42,@object
 
35
        .size    bo.42,4
 
36
bo.42:
31
37
        .long 1
32
38
.text
33
39
.globl synth_1to1_3dnow
 
40
        .type    synth_1to1_3dnow,@function
34
41
synth_1to1_3dnow:
35
 
        subl $12,%esp
 
42
        subl $24,%esp
36
43
        pushl %ebp
37
44
        pushl %edi
 
45
        xorl %ebp,%ebp
38
46
        pushl %esi
39
47
        pushl %ebx
40
 
        movl 32(%esp),%eax
41
 
        movl 40(%esp),%esi
42
 
        movl $0,%edi
43
 
        movl bo,%ebp
44
 
        cmpl %edi,36(%esp)
45
 
        jne .L48
46
 
        decl %ebp
47
 
        andl $15,%ebp
48
 
        movl %ebp,bo
49
 
        movl $buffs,%ecx
50
 
        jmp .L49
51
 
.L48:
52
 
        addl $2,%esi
53
 
        movl $buffs+2176,%ecx
54
 
.L49:
55
 
        testl $1,%ebp
56
 
        je .L50
 
48
        movl 56(%esp),%esi
 
49
        movl 52(%esp),%edi
 
50
        movl 0(%esi),%esi
 
51
        movl 48(%esp),%ebx
 
52
        addl %edi,%esi
 
53
        movl %esi,16(%esp)
 
54
 
 
55
        femms
 
56
        /fixed by Takuhiro      
 
57
        cmpl $0,equalfile
 
58
        je .L25
 
59
        pushl %ebx
 
60
        pushl 48(%esp)
 
61
        call do_equalizer_3dnow
 
62
        addl $8,%esp
 
63
.L25:
 
64
        testl %ebx,%ebx
 
65
        jne .L26
 
66
        decl bo.42
 
67
        movl $buffs.40,%ecx
 
68
        andl $15,bo.42
 
69
        jmp .L27
 
70
.L26:
 
71
        addl $2,16(%esp)
 
72
        movl $buffs.40+2176,%ecx
 
73
.L27:
 
74
        movl bo.42,%edx
 
75
        testb $1,%dl
 
76
        je .L28
 
77
        movl %edx,36(%esp)
57
78
        movl %ecx,%ebx
58
 
        movl %ebp,16(%esp)
59
 
        pushl %eax
60
 
        movl 20(%esp),%edx
61
 
        leal (%ebx,%edx,4),%eax
62
 
        pushl %eax
63
 
        movl 24(%esp),%eax
 
79
        movl 44(%esp),%esi
 
80
        movl %edx,%edi
 
81
        pushl %esi
 
82
        sall $2,%edi
 
83
        movl %ebx,%eax
 
84
        movl %edi,24(%esp)
 
85
        addl %edi,%eax
 
86
        pushl %eax
 
87
        movl %edx,%eax
64
88
        incl %eax
65
89
        andl $15,%eax
66
90
        leal 1088(,%eax,4),%eax
67
91
        addl %ebx,%eax
68
 
        jmp .L74
69
 
.L50:
 
92
        pushl %eax
 
93
        call dct64_3dnow
 
94
        addl $12,%esp
 
95
        jmp .L29
 
96
.L28:
 
97
        leal 1(%edx),%esi
 
98
        movl 44(%esp),%edi
 
99
        movl %esi,36(%esp)
 
100
        leal 1092(%ecx,%edx,4),%eax
 
101
        pushl %edi
70
102
        leal 1088(%ecx),%ebx
71
 
        leal 1(%ebp),%edx
72
 
        movl %edx,16(%esp)
73
 
        pushl %eax
74
 
        leal 1092(%ecx,%ebp,4),%eax
75
 
        pushl %eax
76
 
        leal (%ecx,%ebp,4),%eax
77
 
.L74:
78
 
        pushl %eax
79
 
        call dct64
 
103
        pushl %eax
 
104
        sall $2,%esi
 
105
        leal (%ecx,%edx,4),%eax
 
106
        pushl %eax
 
107
        call dct64_3dnow
80
108
        addl $12,%esp
81
 
        movl 16(%esp),%edx
82
 
        leal 0(,%edx,4),%edx
83
 
        movl $decwin+64,%eax
84
 
        movl %eax,%ecx
85
 
        subl %edx,%ecx
86
 
        movl $16,%ebp
87
 
 
88
 
.L55:
89
 
        movq (%ecx),%mm4
90
 
        movq (%ebx),%mm3
91
 
        movq 8(%ecx),%mm0
92
 
        movq 8(%ebx),%mm1
93
 
        pfmul %mm3,%mm4
94
 
 
95
 
        movq 16(%ecx),%mm2
96
 
        pfmul %mm1,%mm0
97
 
        movq 16(%ebx),%mm3
98
 
        pfadd %mm0,%mm4
99
 
 
100
 
        movq 24(%ecx),%mm0
101
 
        pfmul %mm2,%mm3
102
 
        movq 24(%ebx),%mm1
103
 
        pfadd %mm3,%mm4
104
 
 
105
 
        movq 32(%ecx),%mm2
106
 
        pfmul %mm1,%mm0
107
 
        movq 32(%ebx),%mm3
108
 
        pfadd %mm0,%mm4
109
 
 
110
 
        movq 40(%ecx),%mm0
111
 
        pfmul %mm2,%mm3
112
 
        movq 40(%ebx),%mm1
113
 
        pfadd %mm3,%mm4
114
 
 
115
 
        movq 48(%ecx),%mm2
116
 
        pfmul %mm1,%mm0
117
 
        movq 48(%ebx),%mm3
118
 
        pfadd %mm0,%mm4
119
 
 
120
 
        movq 56(%ecx),%mm0
121
 
        pfmul %mm2,%mm3
122
 
        movq 56(%ebx),%mm1
123
 
        pfadd %mm3,%mm4
124
 
 
125
 
        pfmul %mm1,%mm0
126
 
        pfadd %mm0,%mm4
127
 
 
128
 
        movq %mm4,%mm0
129
 
        psrlq $32,%mm0
130
 
        pfsub %mm0,%mm4
131
 
 
132
 
        pf2id %mm4,%mm4
133
 
        movd %mm4,%eax
134
 
 
135
 
        sar     $16,%eax        / new clip
136
 
        movw %ax,(%esi)
137
 
 
 
109
        movl %esi,20(%esp)
 
110
.L29:
 
111
        movl $decwin+64,%edx
 
112
        movl $16,%ecx
 
113
        subl 20(%esp),%edx
 
114
        movl 16(%esp),%edi
 
115
 
 
116
        movq (%edx),%mm0
 
117
        movq (%ebx),%mm1
 
118
        .align 32
 
119
.L33:
 
120
        movq 8(%edx),%mm3
 
121
        pfmul %mm1,%mm0
 
122
        movq 8(%ebx),%mm4
 
123
        movq 16(%edx),%mm5
 
124
        pfmul %mm4,%mm3
 
125
        movq 16(%ebx),%mm6
 
126
        pfadd %mm3,%mm0
 
127
        movq 24(%edx),%mm1
 
128
        pfmul %mm6,%mm5
 
129
        movq 24(%ebx),%mm2
 
130
        pfadd %mm5,%mm0
 
131
        movq 32(%edx),%mm3
 
132
        pfmul %mm2,%mm1
 
133
        movq 32(%ebx),%mm4
 
134
        pfadd %mm1,%mm0
 
135
        movq 40(%edx),%mm5
 
136
        pfmul %mm4,%mm3
 
137
        movq 40(%ebx),%mm6
 
138
        pfadd %mm3,%mm0
 
139
        movq 48(%edx),%mm1
 
140
        pfmul %mm6,%mm5
 
141
        movq 48(%ebx),%mm2
 
142
        pfadd %mm0,%mm5
 
143
        movq 56(%edx),%mm3
 
144
        pfmul %mm1,%mm2
 
145
        movq 56(%ebx),%mm4
 
146
        pfadd %mm5,%mm2
138
147
        addl $64,%ebx
139
 
        subl $-128,%ecx
140
 
        addl $4,%esi
141
 
        decl %ebp
142
 
        jnz .L55
143
 
 
144
 
/ --- end of loop 1 ---
145
 
 
146
 
        movd (%ecx),%mm2
147
 
        movd (%ebx),%mm1
148
 
        pfmul %mm1,%mm2
149
 
 
150
 
        movd 8(%ecx),%mm0
151
 
        movd 8(%ebx),%mm1
152
 
        pfmul %mm0,%mm1
153
 
        pfadd %mm1,%mm2
154
 
 
155
 
        movd 16(%ecx),%mm0
156
 
        movd 16(%ebx),%mm1
157
 
        pfmul %mm0,%mm1
158
 
        pfadd %mm1,%mm2
159
 
 
160
 
        movd 24(%ecx),%mm0
161
 
        movd 24(%ebx),%mm1
162
 
        pfmul %mm0,%mm1
163
 
        pfadd %mm1,%mm2
164
 
 
165
 
        movd 32(%ecx),%mm0
166
 
        movd 32(%ebx),%mm1
167
 
        pfmul %mm0,%mm1
168
 
        pfadd %mm1,%mm2
169
 
 
170
 
        movd 40(%ecx),%mm0
171
 
        movd 40(%ebx),%mm1
172
 
        pfmul %mm0,%mm1
173
 
        pfadd %mm1,%mm2
174
 
 
175
 
        movd 48(%ecx),%mm0
176
 
        movd 48(%ebx),%mm1
177
 
        pfmul %mm0,%mm1
178
 
        pfadd %mm1,%mm2
179
 
 
180
 
        movd 56(%ecx),%mm0
181
 
        movd 56(%ebx),%mm1
182
 
        pfmul %mm0,%mm1
183
 
        pfadd %mm1,%mm2
184
 
 
 
148
        subl $-128,%edx
 
149
        movq (%edx),%mm0
 
150
        pfmul %mm4,%mm3
 
151
        movq (%ebx),%mm1
 
152
        pfadd %mm3,%mm2
 
153
        movq %mm2,%mm3
 
154
        psrlq $32,%mm3
 
155
        pfsub %mm3,%mm2
 
156
        incl %ebp
185
157
        pf2id %mm2,%mm2
 
158
        packssdw %mm2,%mm2
186
159
        movd %mm2,%eax
187
 
 
188
 
        sar $16,%eax    / new clip
189
 
 
190
 
        movw %ax,(%esi)
191
 
 
192
 
        addl $-64,%ebx
193
 
        addl $4,%esi
194
 
        addl $256,%ecx
195
 
        movl $15,%ebp
196
 
 
197
 
.L68:
198
 
        psubd     %mm0,%mm0
199
 
 
200
 
        movq    (%ebx),%mm1
201
 
        movq    (%ecx),%mm2
202
 
        pfmul     %mm1,%mm2
203
 
        pfsub     %mm2,%mm0
204
 
 
205
 
        movq   8(%ebx),%mm3
206
 
        movq   8(%ecx),%mm4
207
 
        pfmul     %mm3,%mm4
208
 
        pfsub     %mm4,%mm0
209
 
 
210
 
        movq  16(%ebx),%mm1
211
 
        movq  16(%ecx),%mm2
212
 
        pfmul     %mm1,%mm2
213
 
        pfsub     %mm2,%mm0
214
 
 
215
 
        movq  24(%ebx),%mm3
216
 
        movq  24(%ecx),%mm4
217
 
        pfmul     %mm3,%mm4
218
 
        pfsub     %mm4,%mm0
219
 
 
220
 
        movq  32(%ebx),%mm1
221
 
        movq  32(%ecx),%mm2
222
 
        pfmul     %mm1,%mm2
223
 
        pfsub     %mm2,%mm0
224
 
 
225
 
        movq  40(%ebx),%mm3
226
 
        movq  40(%ecx),%mm4
227
 
        pfmul     %mm3,%mm4
228
 
        pfsub     %mm4,%mm0
229
 
 
230
 
        movq  48(%ebx),%mm1
231
 
        movq  48(%ecx),%mm2
232
 
        pfmul     %mm1,%mm2
233
 
        pfsub     %mm2,%mm0
234
 
 
235
 
        movq  56(%ebx),%mm3
236
 
        movq  56(%ecx),%mm4
237
 
        pfmul     %mm3,%mm4
238
 
        pfsub     %mm4,%mm0
239
 
 
240
 
        pfacc     %mm0,%mm0
241
 
 
 
160
        movw %ax,0(%edi)
 
161
        addl $4,%edi
 
162
        decl %ecx
 
163
        jnz .L33
 
164
        
 
165
        movd (%ebx),%mm0
 
166
        movd (%edx),%mm1
 
167
        punpckldq 8(%ebx),%mm0
 
168
        punpckldq 8(%edx),%mm1
 
169
        movd 16(%ebx),%mm3
 
170
        movd 16(%edx),%mm4
 
171
        pfmul %mm1,%mm0
 
172
        punpckldq 24(%ebx),%mm3
 
173
        punpckldq 24(%edx),%mm4
 
174
        movd 32(%ebx),%mm5
 
175
        movd 32(%edx),%mm6
 
176
        pfmul %mm4,%mm3
 
177
        punpckldq 40(%ebx),%mm5
 
178
        punpckldq 40(%edx),%mm6
 
179
        pfadd %mm3,%mm0
 
180
        movd 48(%ebx),%mm1
 
181
        movd 48(%edx),%mm2
 
182
        pfmul %mm6,%mm5
 
183
        punpckldq 56(%ebx),%mm1
 
184
        punpckldq 56(%edx),%mm2
 
185
        pfadd %mm5,%mm0
 
186
        pfmul %mm2,%mm1
 
187
        pfadd %mm1,%mm0
 
188
        pfacc %mm1,%mm0
242
189
        pf2id %mm0,%mm0
 
190
        packssdw %mm0,%mm0
243
191
        movd %mm0,%eax
244
 
 
245
 
        sar $16,%eax    / new clip
246
 
 
247
 
        movw %ax,(%esi)
248
 
 
249
 
        addl $-64,%ebx
250
 
        subl $-128,%ecx
251
 
        addl $4,%esi
252
 
        decl %ebp
253
 
        jnz .L68
254
 
 
255
 
/ --- end of loop 2
 
192
        movw %ax,0(%edi)
 
193
        incl %ebp
 
194
        movl 36(%esp),%esi
 
195
        addl $-64,%ebx
 
196
        movl $15,%ebp
 
197
        addl $4,%edi
 
198
        leal -128(%edx,%esi,8),%edx
 
199
 
 
200
        movl $15,%ecx
 
201
        movd (%ebx),%mm0
 
202
        movd -4(%edx),%mm1
 
203
        punpckldq 4(%ebx),%mm0
 
204
        punpckldq -8(%edx),%mm1
 
205
        .align 32
 
206
.L46:                                           
 
207
        movd 8(%ebx),%mm3
 
208
        movd -12(%edx),%mm4
 
209
        pfmul %mm1,%mm0
 
210
        punpckldq 12(%ebx),%mm3
 
211
        punpckldq -16(%edx),%mm4
 
212
        movd 16(%ebx),%mm5
 
213
        movd -20(%edx),%mm6
 
214
        pfmul %mm4,%mm3
 
215
        punpckldq 20(%ebx),%mm5
 
216
        punpckldq -24(%edx),%mm6
 
217
        pfadd %mm3,%mm0
 
218
        movd 24(%ebx),%mm1              
 
219
        movd -28(%edx),%mm2             
 
220
        pfmul %mm6,%mm5
 
221
        punpckldq 28(%ebx),%mm1 
 
222
        punpckldq -32(%edx),%mm2
 
223
        pfadd %mm5,%mm0
 
224
        movd 32(%ebx),%mm3              
 
225
        movd -36(%edx),%mm4             
 
226
        pfmul %mm2,%mm1
 
227
        punpckldq 36(%ebx),%mm3 
 
228
        punpckldq -40(%edx),%mm4
 
229
        pfadd %mm1,%mm0                 
 
230
        movd 40(%ebx),%mm5              
 
231
        movd -44(%edx),%mm6             
 
232
        pfmul %mm4,%mm3                 
 
233
        punpckldq 44(%ebx),%mm5 
 
234
        punpckldq -48(%edx),%mm6
 
235
        pfadd %mm3,%mm0                 
 
236
        movd 48(%ebx),%mm1              
 
237
        movd -52(%edx),%mm2             
 
238
        pfmul %mm6,%mm5                 
 
239
        punpckldq 52(%ebx),%mm1 
 
240
        punpckldq -56(%edx),%mm2
 
241
        pfadd %mm0,%mm5
 
242
        movd 56(%ebx),%mm3              
 
243
        movd -60(%edx),%mm4             
 
244
        pfmul %mm2,%mm1
 
245
        punpckldq 60(%ebx),%mm3 
 
246
        punpckldq (%edx),%mm4
 
247
        pfadd %mm1,%mm5                 
 
248
        addl $-128,%edx                 
 
249
        addl $-64,%ebx
 
250
        movd (%ebx),%mm0
 
251
        movd -4(%edx),%mm1
 
252
        pfmul %mm4,%mm3
 
253
        punpckldq 4(%ebx),%mm0
 
254
        punpckldq -8(%edx),%mm1
 
255
        pfadd %mm5,%mm3
 
256
        pfacc %mm3,%mm3
 
257
        incl %ebp
 
258
        pf2id %mm3,%mm3
 
259
        movd %mm3,%eax
 
260
        negl %eax
 
261
        movd %eax,%mm3
 
262
        packssdw %mm3,%mm3
 
263
        movd %mm3,%eax
 
264
        movw %ax,(%edi)
 
265
        addl $4,%edi
 
266
        decl %ecx
 
267
        jnz .L46
256
268
 
257
269
        femms
258
 
 
259
 
        movl %edi,%eax
 
270
        movl 56(%esp),%esi
 
271
        movl %ebp,%eax
 
272
        subl $-128,0(%esi)
260
273
        popl %ebx
261
274
        popl %esi
262
275
        popl %edi
263
276
        popl %ebp
264
 
        addl $12,%esp
 
277
        addl $24,%esp
265
278
        ret