~ubuntu-branches/ubuntu/gutsy/blender/gutsy-security

« back to all changes in this revision

Viewing changes to extern/ffmpeg/libavcodec/liba52/resample_mmx.c

  • Committer: Bazaar Package Importer
  • Author(s): Lukas Fittl
  • Date: 2006-09-20 01:57:27 UTC
  • mfrom: (1.2.4 upstream)
  • Revision ID: james.westby@ubuntu.com-20060920015727-gmoqlxwstx9wwqs3
Tags: 2.42a-1ubuntu1
* Merge from Debian unstable (Closes: Malone #55903). Remaining changes:
  - debian/genpot: Add python scripts from Lee June <blender@eyou.com> to
    generate a reasonable PO template from the sources. Since gettext is used
    in a highly nonstandard way, xgettext does not work for this job.
  - debian/rules: Call the scripts, generate po/blender.pot, and clean it up
    in the clean target.
  - Add a proper header to the generated PO template.
* debian/control: Build depend on libavformat-dev >= 3:0.cvs20060823-3.1,
  otherwise this package will FTBFS

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
// MMX optimizations from Michael Niedermayer (michaelni@gmx.at) (under GPL)
 
3
 
 
4
/* optimization TODO / NOTES
 
5
    movntq is slightly faster (0.5% with the current test.c benchmark)
 
6
        (but thats just test.c so that needs to be testd in reallity)
 
7
        and it would mean (C / MMX2 / MMX / 3DNOW) versions
 
8
*/
 
9
 
 
10
static uint64_t __attribute__((aligned(8))) attribute_used magicF2W= 0x43c0000043c00000LL;
 
11
static uint64_t __attribute__((aligned(8))) attribute_used wm1010= 0xFFFF0000FFFF0000LL;
 
12
static uint64_t __attribute__((aligned(8))) attribute_used wm0101= 0x0000FFFF0000FFFFLL;
 
13
static uint64_t __attribute__((aligned(8))) attribute_used wm1100= 0xFFFFFFFF00000000LL;
 
14
 
 
15
static int a52_resample_MONO_to_5_MMX(float * _f, int16_t * s16){
 
16
    int32_t * f = (int32_t *) _f;
 
17
        asm volatile(
 
18
                "movl $-512, %%esi              \n\t"
 
19
                "movq "MANGLE(magicF2W)", %%mm7 \n\t"
 
20
                "movq "MANGLE(wm1100)", %%mm3   \n\t"
 
21
                "movq "MANGLE(wm0101)", %%mm4   \n\t"
 
22
                "movq "MANGLE(wm1010)", %%mm5   \n\t"
 
23
                "pxor %%mm6, %%mm6              \n\t"
 
24
                "1:                             \n\t"
 
25
                "movq (%1, %%esi, 2), %%mm0     \n\t"
 
26
                "movq 8(%1, %%esi, 2), %%mm1    \n\t"
 
27
                "leal (%%esi, %%esi, 4), %%edi  \n\t"
 
28
                "psubd %%mm7, %%mm0             \n\t"
 
29
                "psubd %%mm7, %%mm1             \n\t"
 
30
                "packssdw %%mm1, %%mm0          \n\t"
 
31
                "movq %%mm0, %%mm1              \n\t"
 
32
                "pand %%mm4, %%mm0              \n\t"
 
33
                "pand %%mm5, %%mm1              \n\t"
 
34
                "movq %%mm6, (%0, %%edi)        \n\t" // 0 0 0 0
 
35
                "movd %%mm0, 8(%0, %%edi)       \n\t" // A 0
 
36
                "pand %%mm3, %%mm0              \n\t"
 
37
                "movd %%mm6, 12(%0, %%edi)      \n\t" // 0 0
 
38
                "movd %%mm1, 16(%0, %%edi)      \n\t" // 0 B
 
39
                "pand %%mm3, %%mm1              \n\t"
 
40
                "movd %%mm6, 20(%0, %%edi)      \n\t" // 0 0
 
41
                "movq %%mm0, 24(%0, %%edi)      \n\t" // 0 0 C 0
 
42
                "movq %%mm1, 32(%0, %%edi)      \n\t" // 0 0 0 B
 
43
                "addl $8, %%esi                 \n\t"
 
44
                " jnz 1b                        \n\t"
 
45
                "emms                           \n\t"
 
46
                :: "r" (s16+1280), "r" (f+256)
 
47
                :"%esi", "%edi", "memory"
 
48
        );
 
49
    return 5*256;
 
50
}
 
51
 
 
52
static int a52_resample_STEREO_to_2_MMX(float * _f, int16_t * s16){
 
53
    int32_t * f = (int32_t *) _f;
 
54
/* benchmark scores are 0.3% better with SSE but we would need to set bias=0 and premultiply it
 
55
#ifdef HAVE_SSE
 
56
        asm volatile(
 
57
                "movl $-1024, %%esi             \n\t"
 
58
                "1:                             \n\t"
 
59
                "cvtps2pi (%1, %%esi), %%mm0    \n\t"
 
60
                "cvtps2pi 1024(%1, %%esi), %%mm2\n\t"
 
61
                "movq %%mm0, %%mm1              \n\t"
 
62
                "punpcklwd %%mm2, %%mm0         \n\t"
 
63
                "punpckhwd %%mm2, %%mm1         \n\t"
 
64
                "movq %%mm0, (%0, %%esi)        \n\t"
 
65
                "movq %%mm1, 8(%0, %%esi)       \n\t"
 
66
                "addl $16, %%esi                \n\t"
 
67
                " jnz 1b                        \n\t"
 
68
                "emms                           \n\t"
 
69
                :: "r" (s16+512), "r" (f+256)
 
70
                :"%esi", "memory"
 
71
        );*/
 
72
        asm volatile(
 
73
                "movl $-1024, %%esi             \n\t"
 
74
                "movq "MANGLE(magicF2W)", %%mm7 \n\t"
 
75
                "1:                             \n\t"
 
76
                "movq (%1, %%esi), %%mm0        \n\t"
 
77
                "movq 8(%1, %%esi), %%mm1       \n\t"
 
78
                "movq 1024(%1, %%esi), %%mm2    \n\t"
 
79
                "movq 1032(%1, %%esi), %%mm3    \n\t"
 
80
                "psubd %%mm7, %%mm0             \n\t"
 
81
                "psubd %%mm7, %%mm1             \n\t"
 
82
                "psubd %%mm7, %%mm2             \n\t"
 
83
                "psubd %%mm7, %%mm3             \n\t"
 
84
                "packssdw %%mm1, %%mm0          \n\t"
 
85
                "packssdw %%mm3, %%mm2          \n\t"
 
86
                "movq %%mm0, %%mm1              \n\t"
 
87
                "punpcklwd %%mm2, %%mm0         \n\t"
 
88
                "punpckhwd %%mm2, %%mm1         \n\t"
 
89
                "movq %%mm0, (%0, %%esi)        \n\t"
 
90
                "movq %%mm1, 8(%0, %%esi)       \n\t"
 
91
                "addl $16, %%esi                \n\t"
 
92
                " jnz 1b                        \n\t"
 
93
                "emms                           \n\t"
 
94
                :: "r" (s16+512), "r" (f+256)
 
95
                :"%esi", "memory"
 
96
        );
 
97
    return 2*256;
 
98
}
 
99
 
 
100
static int a52_resample_3F_to_5_MMX(float * _f, int16_t * s16){
 
101
    int32_t * f = (int32_t *) _f;
 
102
        asm volatile(
 
103
                "movl $-1024, %%esi             \n\t"
 
104
                "movq "MANGLE(magicF2W)", %%mm7 \n\t"
 
105
                "pxor %%mm6, %%mm6              \n\t"
 
106
                "movq %%mm7, %%mm5              \n\t"
 
107
                "punpckldq %%mm6, %%mm5         \n\t"
 
108
                "1:                             \n\t"
 
109
                "movd (%1, %%esi), %%mm0        \n\t"
 
110
                "punpckldq 2048(%1, %%esi), %%mm0\n\t"
 
111
                "movd 1024(%1, %%esi), %%mm1    \n\t"
 
112
                "punpckldq 4(%1, %%esi), %%mm1  \n\t"
 
113
                "movd 2052(%1, %%esi), %%mm2    \n\t"
 
114
                "movq %%mm7, %%mm3              \n\t"
 
115
                "punpckldq 1028(%1, %%esi), %%mm3\n\t"
 
116
                "movd 8(%1, %%esi), %%mm4       \n\t"
 
117
                "punpckldq 2056(%1, %%esi), %%mm4\n\t"
 
118
                "leal (%%esi, %%esi, 4), %%edi  \n\t"
 
119
                "sarl $1, %%edi                 \n\t"
 
120
                "psubd %%mm7, %%mm0             \n\t"
 
121
                "psubd %%mm7, %%mm1             \n\t"
 
122
                "psubd %%mm5, %%mm2             \n\t"
 
123
                "psubd %%mm7, %%mm3             \n\t"
 
124
                "psubd %%mm7, %%mm4             \n\t"
 
125
                "packssdw %%mm6, %%mm0          \n\t"
 
126
                "packssdw %%mm2, %%mm1          \n\t"
 
127
                "packssdw %%mm4, %%mm3          \n\t"
 
128
                "movq %%mm0, (%0, %%edi)        \n\t"
 
129
                "movq %%mm1, 8(%0, %%edi)       \n\t"
 
130
                "movq %%mm3, 16(%0, %%edi)      \n\t"
 
131
 
 
132
                "movd 1032(%1, %%esi), %%mm1    \n\t"
 
133
                "punpckldq 12(%1, %%esi), %%mm1\n\t"
 
134
                "movd 2060(%1, %%esi), %%mm2    \n\t"
 
135
                "movq %%mm7, %%mm3              \n\t"
 
136
                "punpckldq 1036(%1, %%esi), %%mm3\n\t"
 
137
                "pxor %%mm0, %%mm0              \n\t"
 
138
                "psubd %%mm7, %%mm1             \n\t"
 
139
                "psubd %%mm5, %%mm2             \n\t"
 
140
                "psubd %%mm7, %%mm3             \n\t"
 
141
                "packssdw %%mm1, %%mm0          \n\t"
 
142
                "packssdw %%mm3, %%mm2          \n\t"
 
143
                "movq %%mm0, 24(%0, %%edi)      \n\t"
 
144
                "movq %%mm2, 32(%0, %%edi)      \n\t"
 
145
 
 
146
                "addl $16, %%esi                \n\t"
 
147
                " jnz 1b                        \n\t"
 
148
                "emms                           \n\t"
 
149
                :: "r" (s16+1280), "r" (f+256)
 
150
                :"%esi", "%edi", "memory"
 
151
        );
 
152
    return 5*256;
 
153
}
 
154
 
 
155
static int a52_resample_2F_2R_to_4_MMX(float * _f, int16_t * s16){
 
156
    int32_t * f = (int32_t *) _f;
 
157
        asm volatile(
 
158
                "movl $-1024, %%esi             \n\t"
 
159
                "movq "MANGLE(magicF2W)", %%mm7 \n\t"
 
160
                "1:                             \n\t"
 
161
                "movq (%1, %%esi), %%mm0        \n\t"
 
162
                "movq 8(%1, %%esi), %%mm1       \n\t"
 
163
                "movq 1024(%1, %%esi), %%mm2    \n\t"
 
164
                "movq 1032(%1, %%esi), %%mm3    \n\t"
 
165
                "psubd %%mm7, %%mm0             \n\t"
 
166
                "psubd %%mm7, %%mm1             \n\t"
 
167
                "psubd %%mm7, %%mm2             \n\t"
 
168
                "psubd %%mm7, %%mm3             \n\t"
 
169
                "packssdw %%mm1, %%mm0          \n\t"
 
170
                "packssdw %%mm3, %%mm2          \n\t"
 
171
                "movq 2048(%1, %%esi), %%mm3    \n\t"
 
172
                "movq 2056(%1, %%esi), %%mm4    \n\t"
 
173
                "movq 3072(%1, %%esi), %%mm5    \n\t"
 
174
                "movq 3080(%1, %%esi), %%mm6    \n\t"
 
175
                "psubd %%mm7, %%mm3             \n\t"
 
176
                "psubd %%mm7, %%mm4             \n\t"
 
177
                "psubd %%mm7, %%mm5             \n\t"
 
178
                "psubd %%mm7, %%mm6             \n\t"
 
179
                "packssdw %%mm4, %%mm3          \n\t"
 
180
                "packssdw %%mm6, %%mm5          \n\t"
 
181
                "movq %%mm0, %%mm1              \n\t"
 
182
                "movq %%mm3, %%mm4              \n\t"
 
183
                "punpcklwd %%mm2, %%mm0         \n\t"
 
184
                "punpckhwd %%mm2, %%mm1         \n\t"
 
185
                "punpcklwd %%mm5, %%mm3         \n\t"
 
186
                "punpckhwd %%mm5, %%mm4         \n\t"
 
187
                "movq %%mm0, %%mm2              \n\t"
 
188
                "movq %%mm1, %%mm5              \n\t"
 
189
                "punpckldq %%mm3, %%mm0         \n\t"
 
190
                "punpckhdq %%mm3, %%mm2         \n\t"
 
191
                "punpckldq %%mm4, %%mm1         \n\t"
 
192
                "punpckhdq %%mm4, %%mm5         \n\t"
 
193
                "movq %%mm0, (%0, %%esi,2)      \n\t"
 
194
                "movq %%mm2, 8(%0, %%esi,2)     \n\t"
 
195
                "movq %%mm1, 16(%0, %%esi,2)    \n\t"
 
196
                "movq %%mm5, 24(%0, %%esi,2)    \n\t"
 
197
                "addl $16, %%esi                \n\t"
 
198
                " jnz 1b                        \n\t"
 
199
                "emms                           \n\t"
 
200
                :: "r" (s16+1024), "r" (f+256)
 
201
                :"%esi", "memory"
 
202
        );
 
203
    return 4*256;
 
204
}
 
205
 
 
206
static int a52_resample_3F_2R_to_5_MMX(float * _f, int16_t * s16){
 
207
    int32_t * f = (int32_t *) _f;
 
208
        asm volatile(
 
209
                "movl $-1024, %%esi             \n\t"
 
210
                "movq "MANGLE(magicF2W)", %%mm7 \n\t"
 
211
                "1:                             \n\t"
 
212
                "movd (%1, %%esi), %%mm0        \n\t"
 
213
                "punpckldq 2048(%1, %%esi), %%mm0\n\t"
 
214
                "movd 3072(%1, %%esi), %%mm1    \n\t"
 
215
                "punpckldq 4096(%1, %%esi), %%mm1\n\t"
 
216
                "movd 1024(%1, %%esi), %%mm2    \n\t"
 
217
                "punpckldq 4(%1, %%esi), %%mm2  \n\t"
 
218
                "movd 2052(%1, %%esi), %%mm3    \n\t"
 
219
                "punpckldq 3076(%1, %%esi), %%mm3\n\t"
 
220
                "movd 4100(%1, %%esi), %%mm4    \n\t"
 
221
                "punpckldq 1028(%1, %%esi), %%mm4\n\t"
 
222
                "movd 8(%1, %%esi), %%mm5       \n\t"
 
223
                "punpckldq 2056(%1, %%esi), %%mm5\n\t"
 
224
                "leal (%%esi, %%esi, 4), %%edi  \n\t"
 
225
                "sarl $1, %%edi                 \n\t"
 
226
                "psubd %%mm7, %%mm0             \n\t"
 
227
                "psubd %%mm7, %%mm1             \n\t"
 
228
                "psubd %%mm7, %%mm2             \n\t"
 
229
                "psubd %%mm7, %%mm3             \n\t"
 
230
                "psubd %%mm7, %%mm4             \n\t"
 
231
                "psubd %%mm7, %%mm5             \n\t"
 
232
                "packssdw %%mm1, %%mm0          \n\t"
 
233
                "packssdw %%mm3, %%mm2          \n\t"
 
234
                "packssdw %%mm5, %%mm4          \n\t"
 
235
                "movq %%mm0, (%0, %%edi)        \n\t"
 
236
                "movq %%mm2, 8(%0, %%edi)       \n\t"
 
237
                "movq %%mm4, 16(%0, %%edi)      \n\t"
 
238
 
 
239
                "movd 3080(%1, %%esi), %%mm0    \n\t"
 
240
                "punpckldq 4104(%1, %%esi), %%mm0\n\t"
 
241
                "movd 1032(%1, %%esi), %%mm1    \n\t"
 
242
                "punpckldq 12(%1, %%esi), %%mm1\n\t"
 
243
                "movd 2060(%1, %%esi), %%mm2    \n\t"
 
244
                "punpckldq 3084(%1, %%esi), %%mm2\n\t"
 
245
                "movd 4108(%1, %%esi), %%mm3    \n\t"
 
246
                "punpckldq 1036(%1, %%esi), %%mm3\n\t"
 
247
                "psubd %%mm7, %%mm0             \n\t"
 
248
                "psubd %%mm7, %%mm1             \n\t"
 
249
                "psubd %%mm7, %%mm2             \n\t"
 
250
                "psubd %%mm7, %%mm3             \n\t"
 
251
                "packssdw %%mm1, %%mm0          \n\t"
 
252
                "packssdw %%mm3, %%mm2          \n\t"
 
253
                "movq %%mm0, 24(%0, %%edi)      \n\t"
 
254
                "movq %%mm2, 32(%0, %%edi)      \n\t"
 
255
 
 
256
                "addl $16, %%esi                \n\t"
 
257
                " jnz 1b                        \n\t"
 
258
                "emms                           \n\t"
 
259
                :: "r" (s16+1280), "r" (f+256)
 
260
                :"%esi", "%edi", "memory"
 
261
        );
 
262
    return 5*256;
 
263
}
 
264
 
 
265
static int a52_resample_MONO_LFE_to_6_MMX(float * _f, int16_t * s16){
 
266
    int32_t * f = (int32_t *) _f;
 
267
        asm volatile(
 
268
                "movl $-1024, %%esi             \n\t"
 
269
                "movq "MANGLE(magicF2W)", %%mm7 \n\t"
 
270
                "pxor %%mm6, %%mm6              \n\t"
 
271
                "1:                             \n\t"
 
272
                "movq 1024(%1, %%esi), %%mm0    \n\t"
 
273
                "movq 1032(%1, %%esi), %%mm1    \n\t"
 
274
                "movq (%1, %%esi), %%mm2        \n\t"
 
275
                "movq 8(%1, %%esi), %%mm3       \n\t"
 
276
                "psubd %%mm7, %%mm0             \n\t"
 
277
                "psubd %%mm7, %%mm1             \n\t"
 
278
                "psubd %%mm7, %%mm2             \n\t"
 
279
                "psubd %%mm7, %%mm3             \n\t"
 
280
                "packssdw %%mm1, %%mm0          \n\t"
 
281
                "packssdw %%mm3, %%mm2          \n\t"
 
282
                "movq %%mm0, %%mm1              \n\t"
 
283
                "punpcklwd %%mm2, %%mm0         \n\t"
 
284
                "punpckhwd %%mm2, %%mm1         \n\t"
 
285
                "leal (%%esi, %%esi, 2), %%edi  \n\t"
 
286
                "movq %%mm6, (%0, %%edi)        \n\t"
 
287
                "movd %%mm0, 8(%0, %%edi)       \n\t"
 
288
                "punpckhdq %%mm0, %%mm0         \n\t"
 
289
                "movq %%mm6, 12(%0, %%edi)      \n\t"
 
290
                "movd %%mm0, 20(%0, %%edi)      \n\t"
 
291
                "movq %%mm6, 24(%0, %%edi)      \n\t"
 
292
                "movd %%mm1, 32(%0, %%edi)      \n\t"
 
293
                "punpckhdq %%mm1, %%mm1         \n\t"
 
294
                "movq %%mm6, 36(%0, %%edi)      \n\t"
 
295
                "movd %%mm1, 44(%0, %%edi)      \n\t"
 
296
                "addl $16, %%esi                \n\t"
 
297
                " jnz 1b                        \n\t"
 
298
                "emms                           \n\t"
 
299
                :: "r" (s16+1536), "r" (f+256)
 
300
                :"%esi", "%edi", "memory"
 
301
        );
 
302
    return 6*256;
 
303
}
 
304
 
 
305
static int a52_resample_STEREO_LFE_to_6_MMX(float * _f, int16_t * s16){
 
306
    int32_t * f = (int32_t *) _f;
 
307
        asm volatile(
 
308
                "movl $-1024, %%esi             \n\t"
 
309
                "movq "MANGLE(magicF2W)", %%mm7 \n\t"
 
310
                "pxor %%mm6, %%mm6              \n\t"
 
311
                "1:                             \n\t"
 
312
                "movq 1024(%1, %%esi), %%mm0    \n\t"
 
313
                "movq 2048(%1, %%esi), %%mm1    \n\t"
 
314
                "movq (%1, %%esi), %%mm5        \n\t"
 
315
                "psubd %%mm7, %%mm0             \n\t"
 
316
                "psubd %%mm7, %%mm1             \n\t"
 
317
                "psubd %%mm7, %%mm5             \n\t"
 
318
                "leal (%%esi, %%esi, 2), %%edi  \n\t"
 
319
 
 
320
                "pxor %%mm4, %%mm4              \n\t"
 
321
                "packssdw %%mm5, %%mm0          \n\t" // FfAa
 
322
                "packssdw %%mm4, %%mm1          \n\t" // 00Bb
 
323
                "punpckhwd %%mm0, %%mm4         \n\t" // F0f0
 
324
                "punpcklwd %%mm1, %%mm0         \n\t" // BAba
 
325
                "movq %%mm0, %%mm1              \n\t" // BAba
 
326
                "punpckldq %%mm4, %%mm3         \n\t" // f0XX
 
327
                "punpckldq %%mm6, %%mm0         \n\t" // 00ba
 
328
                "punpckhdq %%mm1, %%mm3         \n\t" // BAf0
 
329
 
 
330
                "movq %%mm0, (%0, %%edi)        \n\t" // 00ba
 
331
                "punpckhdq %%mm4, %%mm0         \n\t" // F000
 
332
                "movq %%mm3, 8(%0, %%edi)       \n\t" // BAf0
 
333
                "movq %%mm0, 16(%0, %%edi)      \n\t" // F000
 
334
                "addl $8, %%esi                 \n\t"
 
335
                " jnz 1b                        \n\t"
 
336
                "emms                           \n\t"
 
337
                :: "r" (s16+1536), "r" (f+256)
 
338
                :"%esi", "%edi", "memory"
 
339
        );
 
340
    return 6*256;
 
341
}
 
342
 
 
343
static int a52_resample_3F_LFE_to_6_MMX(float * _f, int16_t * s16){
 
344
    int32_t * f = (int32_t *) _f;
 
345
        asm volatile(
 
346
                "movl $-1024, %%esi             \n\t"
 
347
                "movq "MANGLE(magicF2W)", %%mm7 \n\t"
 
348
                "pxor %%mm6, %%mm6              \n\t"
 
349
                "1:                             \n\t"
 
350
                "movq 1024(%1, %%esi), %%mm0    \n\t"
 
351
                "movq 3072(%1, %%esi), %%mm1    \n\t"
 
352
                "movq 2048(%1, %%esi), %%mm4    \n\t"
 
353
                "movq (%1, %%esi), %%mm5        \n\t"
 
354
                "psubd %%mm7, %%mm0             \n\t"
 
355
                "psubd %%mm7, %%mm1             \n\t"
 
356
                "psubd %%mm7, %%mm4             \n\t"
 
357
                "psubd %%mm7, %%mm5             \n\t"
 
358
                "leal (%%esi, %%esi, 2), %%edi  \n\t"
 
359
 
 
360
                "packssdw %%mm4, %%mm0          \n\t" // EeAa
 
361
                "packssdw %%mm5, %%mm1          \n\t" // FfBb
 
362
                "movq %%mm0, %%mm2              \n\t" // EeAa
 
363
                "punpcklwd %%mm1, %%mm0         \n\t" // BAba
 
364
                "punpckhwd %%mm1, %%mm2         \n\t" // FEfe
 
365
                "movq %%mm0, %%mm1              \n\t" // BAba
 
366
                "punpckldq %%mm6, %%mm0         \n\t" // 00ba
 
367
                "punpckhdq %%mm1, %%mm1         \n\t" // BABA
 
368
 
 
369
                "movq %%mm0, (%0, %%edi)        \n\t"
 
370
                "punpckhdq %%mm2, %%mm0         \n\t" // FE00
 
371
                "punpckldq %%mm1, %%mm2         \n\t" // BAfe
 
372
                "movq %%mm2, 8(%0, %%edi)       \n\t"
 
373
                "movq %%mm0, 16(%0, %%edi)      \n\t"
 
374
                "addl $8, %%esi                 \n\t"
 
375
                " jnz 1b                        \n\t"
 
376
                "emms                           \n\t"
 
377
                :: "r" (s16+1536), "r" (f+256)
 
378
                :"%esi", "%edi", "memory"
 
379
        );
 
380
    return 6*256;
 
381
}
 
382
 
 
383
static int a52_resample_2F_2R_LFE_to_6_MMX(float * _f, int16_t * s16){
 
384
    int32_t * f = (int32_t *) _f;
 
385
        asm volatile(
 
386
                "movl $-1024, %%esi             \n\t"
 
387
                "movq "MANGLE(magicF2W)", %%mm7 \n\t"
 
388
//              "pxor %%mm6, %%mm6              \n\t"
 
389
                "1:                             \n\t"
 
390
                "movq 1024(%1, %%esi), %%mm0    \n\t"
 
391
                "movq 2048(%1, %%esi), %%mm1    \n\t"
 
392
                "movq 3072(%1, %%esi), %%mm2    \n\t"
 
393
                "movq 4096(%1, %%esi), %%mm3    \n\t"
 
394
                "movq (%1, %%esi), %%mm5        \n\t"
 
395
                "psubd %%mm7, %%mm0             \n\t"
 
396
                "psubd %%mm7, %%mm1             \n\t"
 
397
                "psubd %%mm7, %%mm2             \n\t"
 
398
                "psubd %%mm7, %%mm3             \n\t"
 
399
                "psubd %%mm7, %%mm5             \n\t"
 
400
                "leal (%%esi, %%esi, 2), %%edi  \n\t"
 
401
 
 
402
                "packssdw %%mm2, %%mm0          \n\t" // CcAa
 
403
                "packssdw %%mm3, %%mm1          \n\t" // DdBb
 
404
                "packssdw %%mm5, %%mm5          \n\t" // FfFf
 
405
                "movq %%mm0, %%mm2              \n\t" // CcAa
 
406
                "punpcklwd %%mm1, %%mm0         \n\t" // BAba
 
407
                "punpckhwd %%mm1, %%mm2         \n\t" // DCdc
 
408
                "pxor %%mm4, %%mm4              \n\t" // 0000
 
409
                "punpcklwd %%mm5, %%mm4         \n\t" // F0f0
 
410
                "movq %%mm0, %%mm1              \n\t" // BAba
 
411
                "movq %%mm4, %%mm3              \n\t" // F0f0
 
412
                "punpckldq %%mm2, %%mm0         \n\t" // dcba
 
413
                "punpckhdq %%mm1, %%mm1         \n\t" // BABA
 
414
                "punpckldq %%mm1, %%mm4         \n\t" // BAf0
 
415
                "punpckhdq %%mm3, %%mm2         \n\t" // F0DC
 
416
 
 
417
                "movq %%mm0, (%0, %%edi)        \n\t"
 
418
                "movq %%mm4, 8(%0, %%edi)       \n\t"
 
419
                "movq %%mm2, 16(%0, %%edi)      \n\t"
 
420
                "addl $8, %%esi                 \n\t"
 
421
                " jnz 1b                        \n\t"
 
422
                "emms                           \n\t"
 
423
                :: "r" (s16+1536), "r" (f+256)
 
424
                :"%esi", "%edi", "memory"
 
425
        );
 
426
    return 6*256;
 
427
}
 
428
 
 
429
static int a52_resample_3F_2R_LFE_to_6_MMX(float * _f, int16_t * s16){
 
430
    int32_t * f = (int32_t *) _f;
 
431
        asm volatile(
 
432
                "movl $-1024, %%esi             \n\t"
 
433
                "movq "MANGLE(magicF2W)", %%mm7 \n\t"
 
434
//              "pxor %%mm6, %%mm6              \n\t"
 
435
                "1:                             \n\t"
 
436
                "movq 1024(%1, %%esi), %%mm0    \n\t"
 
437
                "movq 3072(%1, %%esi), %%mm1    \n\t"
 
438
                "movq 4096(%1, %%esi), %%mm2    \n\t"
 
439
                "movq 5120(%1, %%esi), %%mm3    \n\t"
 
440
                "movq 2048(%1, %%esi), %%mm4    \n\t"
 
441
                "movq (%1, %%esi), %%mm5        \n\t"
 
442
                "psubd %%mm7, %%mm0             \n\t"
 
443
                "psubd %%mm7, %%mm1             \n\t"
 
444
                "psubd %%mm7, %%mm2             \n\t"
 
445
                "psubd %%mm7, %%mm3             \n\t"
 
446
                "psubd %%mm7, %%mm4             \n\t"
 
447
                "psubd %%mm7, %%mm5             \n\t"
 
448
                "leal (%%esi, %%esi, 2), %%edi  \n\t"
 
449
 
 
450
                "packssdw %%mm2, %%mm0          \n\t" // CcAa
 
451
                "packssdw %%mm3, %%mm1          \n\t" // DdBb
 
452
                "packssdw %%mm4, %%mm4          \n\t" // EeEe
 
453
                "packssdw %%mm5, %%mm5          \n\t" // FfFf
 
454
                "movq %%mm0, %%mm2              \n\t" // CcAa
 
455
                "punpcklwd %%mm1, %%mm0         \n\t" // BAba
 
456
                "punpckhwd %%mm1, %%mm2         \n\t" // DCdc
 
457
                "punpcklwd %%mm5, %%mm4         \n\t" // FEfe
 
458
                "movq %%mm0, %%mm1              \n\t" // BAba
 
459
                "movq %%mm4, %%mm3              \n\t" // FEfe
 
460
                "punpckldq %%mm2, %%mm0         \n\t" // dcba
 
461
                "punpckhdq %%mm1, %%mm1         \n\t" // BABA
 
462
                "punpckldq %%mm1, %%mm4         \n\t" // BAfe
 
463
                "punpckhdq %%mm3, %%mm2         \n\t" // FEDC
 
464
 
 
465
                "movq %%mm0, (%0, %%edi)        \n\t"
 
466
                "movq %%mm4, 8(%0, %%edi)       \n\t"
 
467
                "movq %%mm2, 16(%0, %%edi)      \n\t"
 
468
                "addl $8, %%esi                 \n\t"
 
469
                " jnz 1b                        \n\t"
 
470
                "emms                           \n\t"
 
471
                :: "r" (s16+1536), "r" (f+256)
 
472
                :"%esi", "%edi", "memory"
 
473
        );
 
474
    return 6*256;
 
475
}
 
476
 
 
477
 
 
478
static void* a52_resample_MMX(int flags, int ch){
 
479
    switch (flags) {
 
480
    case A52_MONO:
 
481
        if(ch==5) return a52_resample_MONO_to_5_MMX;
 
482
        break;
 
483
    case A52_CHANNEL:
 
484
    case A52_STEREO:
 
485
    case A52_DOLBY:
 
486
        if(ch==2) return a52_resample_STEREO_to_2_MMX;
 
487
        break;
 
488
    case A52_3F:
 
489
        if(ch==5) return a52_resample_3F_to_5_MMX;
 
490
        break;
 
491
    case A52_2F2R:
 
492
        if(ch==4) return a52_resample_2F_2R_to_4_MMX;
 
493
        break;
 
494
    case A52_3F2R:
 
495
        if(ch==5) return a52_resample_3F_2R_to_5_MMX;
 
496
        break;
 
497
    case A52_MONO | A52_LFE:
 
498
        if(ch==6) return a52_resample_MONO_LFE_to_6_MMX;
 
499
        break;
 
500
    case A52_CHANNEL | A52_LFE:
 
501
    case A52_STEREO | A52_LFE:
 
502
    case A52_DOLBY | A52_LFE:
 
503
        if(ch==6) return a52_resample_STEREO_LFE_to_6_MMX;
 
504
        break;
 
505
    case A52_3F | A52_LFE:
 
506
        if(ch==6) return a52_resample_3F_LFE_to_6_MMX;
 
507
        break;
 
508
    case A52_2F2R | A52_LFE:
 
509
        if(ch==6) return a52_resample_2F_2R_LFE_to_6_MMX;
 
510
        break;
 
511
    case A52_3F2R | A52_LFE:
 
512
        if(ch==6) return a52_resample_3F_2R_LFE_to_6_MMX;
 
513
        break;
 
514
    }
 
515
    return NULL;
 
516
}
 
517
 
 
518