[svn] / branches / dev-api-4 / xvidcore / src / image / x86_asm / reduced_mmx.asm Repository:
ViewVC logotype

Annotation of /branches/dev-api-4/xvidcore/src/image/x86_asm/reduced_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1192 - (view) (download)

1 : edgomez 851 ;/*****************************************************************************
2 :     ; *
3 :     ; * XVID MPEG-4 VIDEO CODEC
4 : edgomez 1192 ; * - Reduced-Resolution utilities -
5 : edgomez 851 ; *
6 :     ; * Copyright(C) 2002 Pascal Massimino <skal@planet-d.net>
7 :     ; *
8 :     ; * XviD is free software; you can redistribute it and/or modify it
9 :     ; * under the terms of the GNU General Public License as published by
10 :     ; * the Free Software Foundation; either version 2 of the License, or
11 :     ; * (at your option) any later version.
12 :     ; *
13 :     ; * This program is distributed in the hope that it will be useful,
14 :     ; * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 :     ; * GNU General Public License for more details.
17 :     ; *
18 :     ; * You should have received a copy of the GNU General Public License
19 :     ; * along with this program; if not, write to the Free Software
20 :     ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 :     ; *
22 : edgomez 1192 ; * $Id: reduced_mmx.asm,v 1.2.2.1 2003-10-28 22:23:03 edgomez Exp $
23 : edgomez 851 ; *
24 :     ; *************************************************************************/
25 :    
26 : edgomez 1192 BITS 32
27 : edgomez 851
28 : edgomez 1192 %macro cglobal 1
29 : edgomez 851 %ifdef PREFIX
30 : edgomez 1192 global _%1
31 : edgomez 851 %define %1 _%1
32 :     %else
33 :     global %1
34 :     %endif
35 :     %endmacro
36 :    
37 :     ;===========================================================================
38 :    
39 : edgomez 1192 SECTION .rodata
40 : edgomez 851
41 :     align 16
42 :     Up31 dw 3, 1, 3, 1
43 :     Up13 dw 1, 3, 1, 3
44 :     Up93 dw 9, 3, 9, 3
45 :     Up39 dw 3, 9, 3, 9
46 :     Cst0 dw 0, 0, 0, 0
47 :     Cst2 dw 2, 2, 2, 2
48 :     Cst3 dw 3, 3, 3, 3
49 :     Cst32 dw 32,32,32,32
50 :     Cst2000 dw 2, 0, 0, 0
51 :     Cst0002 dw 0, 0, 0, 2
52 :    
53 :     Mask_ff dw 0xff,0xff,0xff,0xff
54 :    
55 :     ;===========================================================================
56 :    
57 : edgomez 1192 SECTION .text
58 : edgomez 851
59 :     cglobal xvid_Copy_Upsampled_8x8_16To8_mmx
60 :     cglobal xvid_Add_Upsampled_8x8_16To8_mmx
61 :     cglobal xvid_Copy_Upsampled_8x8_16To8_xmm
62 :     cglobal xvid_Add_Upsampled_8x8_16To8_xmm
63 :    
64 :     cglobal xvid_HFilter_31_mmx
65 :     cglobal xvid_VFilter_31_x86
66 :     cglobal xvid_HFilter_31_x86
67 :    
68 :     cglobal xvid_Filter_18x18_To_8x8_mmx
69 :     cglobal xvid_Filter_Diff_18x18_To_8x8_mmx
70 :    
71 :    
72 :     ;//////////////////////////////////////////////////////////////////////
73 :     ;// 8x8 -> 16x16 upsampling (16b)
74 :     ;//////////////////////////////////////////////////////////////////////
75 :    
76 :     %macro MUL_PACK 4 ; %1/%2: regs %3/%4/%5: Up13/Up31
77 :     pmullw %1, %3 ; [Up13]
78 :     pmullw mm4, %4 ; [Up31]
79 :     pmullw %2, %3 ; [Up13]
80 :     pmullw mm5, %4 ; [Up31]
81 :     paddsw %1, [Cst2]
82 :     paddsw %2, [Cst2]
83 :     paddsw %1, mm4
84 :     paddsw %2, mm5
85 :     %endmacro
86 :    
87 :     ; MMX-way of reordering columns...
88 :    
89 :     %macro COL03 3 ;%1/%2: regs, %3: row -output: mm4/mm5
90 :     movq %1, [edx+%3*16+0*2] ; %1 = 0|1|2|3
91 :     movq %2,[edx+%3*16+1*2] ; %2 = 1|2|3|4
92 :     movq mm5, %1 ; mm5 = 0|1|2|3
93 :     movq mm4, %1 ; mm4 = 0|1|2|3
94 :     punpckhwd mm5,%2 ; mm5 = 2|3|3|4
95 :     punpcklwd mm4,%2 ; mm4 = 0|1|1|2
96 :     punpcklwd %1,%1 ; %1 = 0|0|1|1
97 :     punpcklwd %2, mm5 ; %2 = 1|2|2|3
98 :     punpcklwd %1, mm4 ; %1 = 0|0|0|1
99 :     %endmacro
100 :    
101 :     %macro COL47 3 ;%1-%2: regs, %3: row -output: mm4/mm5
102 :     movq mm5, [edx+%3*16+4*2] ; mm5 = 4|5|6|7
103 :     movq %1, [edx+%3*16+3*2] ; %1 = 3|4|5|6
104 :     movq %2, mm5 ; %2 = 4|5|6|7
105 :     movq mm4, mm5 ; mm4 = 4|5|6|7
106 :     punpckhwd %2, %2 ; %2 = 6|6|7|7
107 :     punpckhwd mm5, %2 ; mm5 = 6|7|7|7
108 :     movq %2, %1 ; %2 = 3|4|5|6
109 :     punpcklwd %1, mm4 ; %1 = 3|4|4|5
110 :     punpckhwd %2, mm4 ; %2 = 5|6|6|7
111 :     punpcklwd mm4, %2 ; mm4 = 4|5|5|6
112 :     %endmacro
113 :    
114 :     %macro MIX_ROWS 4 ; %1/%2:prev %3/4:cur (preserved) mm4/mm5: output
115 :     ; we need to perform: (%1,%3) -> (%1 = 3*%1+%3, mm4 = 3*%3+%1), %3 preserved.
116 :     movq mm4, [Cst3]
117 :     movq mm5, [Cst3]
118 :     pmullw mm4, %3
119 :     pmullw mm5, %4
120 :     paddsw mm4, %1
121 :     paddsw mm5, %2
122 :     pmullw %1, [Cst3]
123 :     pmullw %2, [Cst3]
124 :     paddsw %1, %3
125 :     paddsw %2, %4
126 :     %endmacro
127 :    
128 :     ;===========================================================================
129 :     ;
130 : edgomez 1192 ; void xvid_Copy_Upsampled_8x8_16To8_mmx(uint8_t *Dst,
131 : edgomez 851 ; const int16_t *Src, const int BpS);
132 :     ;
133 :     ;===========================================================================
134 :    
135 : edgomez 1192 ; Note: we can use ">>2" instead of "/4" here, since we
136 : edgomez 851 ; are (supposed to be) averaging positive values
137 :    
138 :     %macro STORE_1 2
139 :     psraw %1, 2
140 :     psraw %2, 2
141 : edgomez 1192 packuswb %1,%2
142 : edgomez 851 movq [ecx], %1
143 :     %endmacro
144 :    
145 :     %macro STORE_2 2 ; pack and store (%1,%2) + (mm4,mm5)
146 :     psraw %1, 4
147 :     psraw %2, 4
148 :     psraw mm4, 4
149 :     psraw mm5, 4
150 :     packuswb %1,%2
151 :     packuswb mm4, mm5
152 :     movq [ecx], %1
153 :     movq [ecx+eax], mm4
154 :     lea ecx, [ecx+2*eax]
155 :     %endmacro
156 :    
157 :     ;//////////////////////////////////////////////////////////////////////
158 :    
159 :     align 16
160 :     xvid_Copy_Upsampled_8x8_16To8_mmx: ; 344c
161 :    
162 :     mov ecx, [esp+4] ; Dst
163 :     mov edx, [esp+8] ; Src
164 :     mov eax, [esp+12] ; BpS
165 :    
166 :     movq mm6, [Up13]
167 :     movq mm7, [Up31]
168 :    
169 :     COL03 mm0, mm1, 0
170 :     MUL_PACK mm0,mm1, mm6, mm7
171 :     movq mm4, mm0
172 :     movq mm5, mm1
173 :     STORE_1 mm4, mm5
174 :     add ecx, eax
175 :    
176 :     COL03 mm2, mm3, 1
177 :     MUL_PACK mm2,mm3, mm6, mm7
178 :     MIX_ROWS mm0, mm1, mm2, mm3
179 :     STORE_2 mm0, mm1
180 :    
181 :     COL03 mm0, mm1, 2
182 :     MUL_PACK mm0,mm1, mm6, mm7
183 :     MIX_ROWS mm2, mm3, mm0, mm1
184 :     STORE_2 mm2, mm3
185 :    
186 :     COL03 mm2, mm3, 3
187 :     MUL_PACK mm2,mm3, mm6, mm7
188 :     MIX_ROWS mm0, mm1, mm2, mm3
189 :     STORE_2 mm0, mm1
190 :    
191 :     COL03 mm0, mm1, 4
192 :     MUL_PACK mm0,mm1, mm6, mm7
193 :     MIX_ROWS mm2, mm3, mm0, mm1
194 :     STORE_2 mm2, mm3
195 :    
196 :     COL03 mm2, mm3, 5
197 :     MUL_PACK mm2,mm3, mm6, mm7
198 :     MIX_ROWS mm0, mm1, mm2, mm3
199 :     STORE_2 mm0, mm1
200 :    
201 :     COL03 mm0, mm1, 6
202 :     MUL_PACK mm0,mm1, mm6, mm7
203 :     MIX_ROWS mm2, mm3, mm0, mm1
204 :     STORE_2 mm2, mm3
205 :    
206 :     COL03 mm2, mm3, 7
207 :     MUL_PACK mm2,mm3, mm6, mm7
208 :     MIX_ROWS mm0, mm1, mm2, mm3
209 :     STORE_2 mm0, mm1
210 :    
211 :     STORE_1 mm2, mm3
212 :    
213 :     mov ecx, [esp+4]
214 :     add ecx, 8
215 :    
216 :     COL47 mm0, mm1, 0
217 :     MUL_PACK mm0,mm1, mm6, mm7
218 :     movq mm4, mm0
219 :     movq mm5, mm1
220 :     STORE_1 mm4, mm5
221 :     add ecx, eax
222 :    
223 :     COL47 mm2, mm3, 1
224 :     MUL_PACK mm2,mm3, mm6, mm7
225 :     MIX_ROWS mm0, mm1, mm2, mm3
226 :     STORE_2 mm0, mm1
227 :    
228 :     COL47 mm0, mm1, 2
229 :     MUL_PACK mm0,mm1, mm6, mm7
230 :     MIX_ROWS mm2, mm3, mm0, mm1
231 :     STORE_2 mm2, mm3
232 :    
233 :     COL47 mm2, mm3, 3
234 :     MUL_PACK mm2,mm3, mm6, mm7
235 :     MIX_ROWS mm0, mm1, mm2, mm3
236 :     STORE_2 mm0, mm1
237 :    
238 :     COL47 mm0, mm1, 4
239 :     MUL_PACK mm0,mm1, mm6, mm7
240 :     MIX_ROWS mm2, mm3, mm0, mm1
241 :     STORE_2 mm2, mm3
242 :    
243 :     COL47 mm2, mm3, 5
244 :     MUL_PACK mm2,mm3, mm6, mm7
245 :     MIX_ROWS mm0, mm1, mm2, mm3
246 :     STORE_2 mm0, mm1
247 :    
248 :     COL47 mm0, mm1, 6
249 :     MUL_PACK mm0,mm1, mm6, mm7
250 :     MIX_ROWS mm2, mm3, mm0, mm1
251 :     STORE_2 mm2, mm3
252 :    
253 :     COL47 mm2, mm3, 7
254 :     MUL_PACK mm2,mm3, mm6, mm7
255 :     MIX_ROWS mm0, mm1, mm2, mm3
256 :     STORE_2 mm0, mm1
257 :    
258 :     STORE_1 mm2, mm3
259 :    
260 :     ret
261 :    
262 :     ;===========================================================================
263 :     ;
264 : edgomez 1192 ; void xvid_Add_Upsampled_8x8_16To8_mmx(uint8_t *Dst,
265 : edgomez 851 ; const int16_t *Src, const int BpS);
266 :     ;
267 :     ;===========================================================================
268 :    
269 :     ; Note: grrr... the 'pcmpgtw' stuff are the "/4" and "/16" operators
270 : edgomez 1192 ; implemented with ">>2" and ">>4" using:
271 : edgomez 851 ; x/4 = ( (x-(x<0))>>2 ) + (x<0)
272 :     ; x/16 = ( (x-(x<0))>>4 ) + (x<0)
273 :    
274 :     %macro STORE_ADD_1 2
275 :     ; We substract the rounder '2' for corner pixels,
276 :     ; since when 'x' is negative, (x*4 + 2)/4 is *not*
277 :     ; equal to 'x'. In fact, the correct relation is:
278 :     ; (x*4 + 2)/4 = x - (x<0)
279 :     ; So, better revert to (x*4)/4 = x.
280 :    
281 :     psubsw %1, [Cst2000]
282 :     psubsw %2, [Cst0002]
283 :     pxor mm6, mm6
284 :     pxor mm7, mm7
285 :     pcmpgtw mm6, %1
286 :     pcmpgtw mm7, %2
287 :     paddsw %1, mm6
288 :     paddsw %2, mm7
289 :     psraw %1, 2
290 :     psraw %2, 2
291 :     psubsw %1, mm6
292 :     psubsw %2, mm7
293 :    
294 :     ; mix with destination [ecx]
295 :     movq mm6, [ecx]
296 :     movq mm7, [ecx]
297 :     punpcklbw mm6, [Cst0]
298 :     punpckhbw mm7, [Cst0]
299 :     paddsw %1, mm6
300 :     paddsw %2, mm7
301 :     packuswb %1,%2
302 :     movq [ecx], %1
303 :     %endmacro
304 :    
305 :     %macro STORE_ADD_2 2
306 :     pxor mm6, mm6
307 :     pxor mm7, mm7
308 :     pcmpgtw mm6, %1
309 :     pcmpgtw mm7, %2
310 :     paddsw %1, mm6
311 :     paddsw %2, mm7
312 :     psraw %1, 4
313 :     psraw %2, 4
314 :     psubsw %1, mm6
315 :     psubsw %2, mm7
316 :    
317 :     pxor mm6, mm6
318 :     pxor mm7, mm7
319 :     pcmpgtw mm6, mm4
320 :     pcmpgtw mm7, mm5
321 :     paddsw mm4, mm6
322 :     paddsw mm5, mm7
323 :     psraw mm4, 4
324 :     psraw mm5, 4
325 :     psubsw mm4, mm6
326 :     psubsw mm5, mm7
327 :    
328 :     ; mix with destination
329 :     movq mm6, [ecx]
330 :     movq mm7, [ecx]
331 :     punpcklbw mm6, [Cst0]
332 :     punpckhbw mm7, [Cst0]
333 :     paddsw %1, mm6
334 :     paddsw %2, mm7
335 :    
336 :     movq mm6, [ecx+eax]
337 :     movq mm7, [ecx+eax]
338 :    
339 :     punpcklbw mm6, [Cst0]
340 :     punpckhbw mm7, [Cst0]
341 :     paddsw mm4, mm6
342 :     paddsw mm5, mm7
343 :    
344 :     packuswb %1,%2
345 :     packuswb mm4, mm5
346 :    
347 :     movq [ecx], %1
348 :     movq [ecx+eax], mm4
349 :    
350 :     lea ecx, [ecx+2*eax]
351 :     %endmacro
352 :    
353 :     ;//////////////////////////////////////////////////////////////////////
354 :    
355 :     align 16
356 :     xvid_Add_Upsampled_8x8_16To8_mmx: ; 579c
357 :    
358 :     mov ecx, [esp+4] ; Dst
359 :     mov edx, [esp+8] ; Src
360 :     mov eax, [esp+12] ; BpS
361 :    
362 :     COL03 mm0, mm1, 0
363 : edgomez 1192 MUL_PACK mm0,mm1, [Up13], [Up31]
364 : edgomez 851 movq mm4, mm0
365 :     movq mm5, mm1
366 :     STORE_ADD_1 mm4, mm5
367 :     add ecx, eax
368 :    
369 :     COL03 mm2, mm3, 1
370 :     MUL_PACK mm2,mm3, [Up13], [Up31]
371 :     MIX_ROWS mm0, mm1, mm2, mm3
372 :     STORE_ADD_2 mm0, mm1
373 :    
374 :     COL03 mm0, mm1, 2
375 :     MUL_PACK mm0,mm1, [Up13], [Up31]
376 :     MIX_ROWS mm2, mm3, mm0, mm1
377 :     STORE_ADD_2 mm2, mm3
378 :    
379 :     COL03 mm2, mm3, 3
380 :     MUL_PACK mm2,mm3, [Up13], [Up31]
381 :     MIX_ROWS mm0, mm1, mm2, mm3
382 :     STORE_ADD_2 mm0, mm1
383 :    
384 :     COL03 mm0, mm1, 4
385 :     MUL_PACK mm0,mm1, [Up13], [Up31]
386 :     MIX_ROWS mm2, mm3, mm0, mm1
387 :     STORE_ADD_2 mm2, mm3
388 :    
389 :     COL03 mm2, mm3, 5
390 :     MUL_PACK mm2,mm3, [Up13], [Up31]
391 :     MIX_ROWS mm0, mm1, mm2, mm3
392 :     STORE_ADD_2 mm0, mm1
393 :    
394 :     COL03 mm0, mm1, 6
395 :     MUL_PACK mm0,mm1, [Up13], [Up31]
396 :     MIX_ROWS mm2, mm3, mm0, mm1
397 :     STORE_ADD_2 mm2, mm3
398 :    
399 :     COL03 mm2, mm3, 7
400 :     MUL_PACK mm2,mm3, [Up13], [Up31]
401 :     MIX_ROWS mm0, mm1, mm2, mm3
402 :     STORE_ADD_2 mm0, mm1
403 :    
404 :     STORE_ADD_1 mm2, mm3
405 :    
406 :    
407 :     mov ecx, [esp+4]
408 :     add ecx, 8
409 :    
410 :     COL47 mm0, mm1, 0
411 : edgomez 1192 MUL_PACK mm0,mm1, [Up13], [Up31]
412 : edgomez 851 movq mm4, mm0
413 : edgomez 1192 movq mm5, mm1
414 : edgomez 851 STORE_ADD_1 mm4, mm5
415 :     add ecx, eax
416 :    
417 :     COL47 mm2, mm3, 1
418 :     MUL_PACK mm2,mm3, [Up13], [Up31]
419 :     MIX_ROWS mm0, mm1, mm2, mm3
420 :     STORE_ADD_2 mm0, mm1
421 :    
422 :     COL47 mm0, mm1, 2
423 :     MUL_PACK mm0,mm1, [Up13], [Up31]
424 :     MIX_ROWS mm2, mm3, mm0, mm1
425 :     STORE_ADD_2 mm2, mm3
426 :    
427 :     COL47 mm2, mm3, 3
428 :     MUL_PACK mm2,mm3, [Up13], [Up31]
429 :     MIX_ROWS mm0, mm1, mm2, mm3
430 :     STORE_ADD_2 mm0, mm1
431 :    
432 :     COL47 mm0, mm1, 4
433 :     MUL_PACK mm0,mm1, [Up13], [Up31]
434 :     MIX_ROWS mm2, mm3, mm0, mm1
435 :     STORE_ADD_2 mm2, mm3
436 :    
437 :     COL47 mm2, mm3, 5
438 :     MUL_PACK mm2,mm3, [Up13], [Up31]
439 :     MIX_ROWS mm0, mm1, mm2, mm3
440 :     STORE_ADD_2 mm0, mm1
441 :    
442 :     COL47 mm0, mm1, 6
443 :     MUL_PACK mm0,mm1, [Up13], [Up31]
444 :     MIX_ROWS mm2, mm3, mm0, mm1
445 :     STORE_ADD_2 mm2, mm3
446 :    
447 :     COL47 mm2, mm3, 7
448 :     MUL_PACK mm2,mm3, [Up13], [Up31]
449 :     MIX_ROWS mm0, mm1, mm2, mm3
450 :     STORE_ADD_2 mm0, mm1
451 :    
452 :     STORE_ADD_1 mm2, mm3
453 :    
454 :     ret
455 :    
456 :     ;===========================================================================
457 :     ;
458 : edgomez 1192 ; void xvid_Copy_Upsampled_8x8_16To8_xmm(uint8_t *Dst,
459 : edgomez 851 ; const int16_t *Src, const int BpS);
460 :     ;
461 :     ;===========================================================================
462 :    
463 :     ; xmm version can take (little) advantage of 'pshufw'
464 :    
465 :     %macro COL03_SSE 3 ;%1/%2: regs, %3: row -trashes mm4/mm5
466 :     movq %2, [edx+%3*16+0*2] ; <- 0|1|2|3
467 :     pshufw %1, %2, (0+0*4+0*16+1*64) ; %1 = 0|0|0|1
468 :     pshufw mm4, %2, (0+1*4+1*16+2*64) ; mm4= 0|1|1|2
469 :     pshufw %2, %2, (1+2*4+2*16+3*64) ; %2 = 1|2|2|3
470 :     pshufw mm5, [edx+%3*16+2*2], (0+1*4+1*16+2*64) ; mm5 = 2|3|3|4
471 :     %endmacro
472 :    
473 :     %macro COL47_SSE 3 ;%1-%2: regs, %3: row -trashes mm4/mm5
474 :     pshufw %1, [edx+%3*16+2*2], (1+2*4+2*16+3*64) ; 3|4|4|5
475 :     movq mm5, [edx+%3*16+2*4] ; <- 4|5|6|7
476 :     pshufw mm4, mm5, (0+1*4+1*16+2*64) ; 4|5|5|6
477 :     pshufw %2, mm5, (1+2*4+2*16+3*64) ; 5|6|6|7
478 :     pshufw mm5, mm5, (2+3*4+3*16+3*64) ; 6|7|7|7
479 :     %endmacro
480 :    
481 :    
482 :     ;//////////////////////////////////////////////////////////////////////
483 :    
484 :     align 16
485 :     xvid_Copy_Upsampled_8x8_16To8_xmm: ; 315c
486 :    
487 :     mov ecx, [esp+4] ; Dst
488 :     mov edx, [esp+8] ; Src
489 :     mov eax, [esp+12] ; BpS
490 :    
491 :     movq mm6, [Up13]
492 :     movq mm7, [Up31]
493 :    
494 :     COL03_SSE mm0, mm1, 0
495 :     MUL_PACK mm0,mm1, mm6, mm7
496 :     movq mm4, mm0
497 :     movq mm5, mm1
498 :     STORE_1 mm4, mm5
499 :     add ecx, eax
500 :    
501 :     COL03_SSE mm2, mm3, 1
502 :     MUL_PACK mm2,mm3, mm6, mm7
503 :     MIX_ROWS mm0, mm1, mm2, mm3
504 :     STORE_2 mm0, mm1
505 :    
506 :     COL03_SSE mm0, mm1, 2
507 :     MUL_PACK mm0,mm1, mm6, mm7
508 :     MIX_ROWS mm2, mm3, mm0, mm1
509 :     STORE_2 mm2, mm3
510 :    
511 :     COL03_SSE mm2, mm3, 3
512 :     MUL_PACK mm2,mm3, mm6, mm7
513 :     MIX_ROWS mm0, mm1, mm2, mm3
514 :     STORE_2 mm0, mm1
515 :    
516 :     COL03_SSE mm0, mm1, 4
517 :     MUL_PACK mm0,mm1, mm6, mm7
518 :     MIX_ROWS mm2, mm3, mm0, mm1
519 :     STORE_2 mm2, mm3
520 :    
521 :     COL03_SSE mm2, mm3, 5
522 :     MUL_PACK mm2,mm3, mm6, mm7
523 :     MIX_ROWS mm0, mm1, mm2, mm3
524 :     STORE_2 mm0, mm1
525 :    
526 :     COL03_SSE mm0, mm1, 6
527 :     MUL_PACK mm0,mm1, mm6, mm7
528 :     MIX_ROWS mm2, mm3, mm0, mm1
529 :     STORE_2 mm2, mm3
530 :    
531 :     COL03_SSE mm2, mm3, 7
532 :     MUL_PACK mm2,mm3, mm6, mm7
533 :     MIX_ROWS mm0, mm1, mm2, mm3
534 :     STORE_2 mm0, mm1
535 :    
536 :     STORE_1 mm2, mm3
537 :    
538 :     mov ecx, [esp+4]
539 :     add ecx, 8
540 :    
541 :     COL47_SSE mm0, mm1, 0
542 :     MUL_PACK mm0,mm1, mm6, mm7
543 :     movq mm4, mm0
544 :     movq mm5, mm1
545 :     STORE_1 mm4, mm5
546 :     add ecx, eax
547 :    
548 :     COL47_SSE mm2, mm3, 1
549 :     MUL_PACK mm2,mm3, mm6, mm7
550 :     MIX_ROWS mm0, mm1, mm2, mm3
551 :     STORE_2 mm0, mm1
552 :    
553 :     COL47_SSE mm0, mm1, 2
554 :     MUL_PACK mm0,mm1, mm6, mm7
555 :     MIX_ROWS mm2, mm3, mm0, mm1
556 :     STORE_2 mm2, mm3
557 :    
558 :     COL47_SSE mm2, mm3, 3
559 :     MUL_PACK mm2,mm3, mm6, mm7
560 :     MIX_ROWS mm0, mm1, mm2, mm3
561 :     STORE_2 mm0, mm1
562 :    
563 :     COL47_SSE mm0, mm1, 4
564 :     MUL_PACK mm0,mm1, mm6, mm7
565 :     MIX_ROWS mm2, mm3, mm0, mm1
566 :     STORE_2 mm2, mm3
567 :    
568 :     COL47_SSE mm2, mm3, 5
569 :     MUL_PACK mm2,mm3, mm6, mm7
570 :     MIX_ROWS mm0, mm1, mm2, mm3
571 :     STORE_2 mm0, mm1
572 :    
573 :     COL47_SSE mm0, mm1, 6
574 :     MUL_PACK mm0,mm1, mm6, mm7
575 :     MIX_ROWS mm2, mm3, mm0, mm1
576 :     STORE_2 mm2, mm3
577 :    
578 :     COL47_SSE mm2, mm3, 7
579 :     MUL_PACK mm2,mm3, mm6, mm7
580 :     MIX_ROWS mm0, mm1, mm2, mm3
581 :     STORE_2 mm0, mm1
582 :    
583 :     STORE_1 mm2, mm3
584 :    
585 :     ret
586 :    
587 :     ;===========================================================================
588 :     ;
589 : edgomez 1192 ; void xvid_Add_Upsampled_8x8_16To8_xmm(uint8_t *Dst,
590 : edgomez 851 ; const int16_t *Src, const int BpS);
591 :     ;
592 :     ;===========================================================================
593 :    
594 :     align 16
595 :     xvid_Add_Upsampled_8x8_16To8_xmm: ; 549c
596 :    
597 :     mov ecx, [esp+4] ; Dst
598 :     mov edx, [esp+8] ; Src
599 :     mov eax, [esp+12] ; BpS
600 :    
601 :     COL03_SSE mm0, mm1, 0
602 : edgomez 1192 MUL_PACK mm0,mm1, [Up13], [Up31]
603 : edgomez 851 movq mm4, mm0
604 :     movq mm5, mm1
605 :     STORE_ADD_1 mm4, mm5
606 :     add ecx, eax
607 :    
608 :     COL03_SSE mm2, mm3, 1
609 :     MUL_PACK mm2,mm3, [Up13], [Up31]
610 :     MIX_ROWS mm0, mm1, mm2, mm3
611 :     STORE_ADD_2 mm0, mm1
612 :    
613 :     COL03_SSE mm0, mm1, 2
614 :     MUL_PACK mm0,mm1, [Up13], [Up31]
615 :     MIX_ROWS mm2, mm3, mm0, mm1
616 :     STORE_ADD_2 mm2, mm3
617 :    
618 :     COL03_SSE mm2, mm3, 3
619 :     MUL_PACK mm2,mm3, [Up13], [Up31]
620 :     MIX_ROWS mm0, mm1, mm2, mm3
621 :     STORE_ADD_2 mm0, mm1
622 :    
623 :     COL03_SSE mm0, mm1, 4
624 :     MUL_PACK mm0,mm1, [Up13], [Up31]
625 :     MIX_ROWS mm2, mm3, mm0, mm1
626 :     STORE_ADD_2 mm2, mm3
627 :    
628 :     COL03_SSE mm2, mm3, 5
629 :     MUL_PACK mm2,mm3, [Up13], [Up31]
630 :     MIX_ROWS mm0, mm1, mm2, mm3
631 :     STORE_ADD_2 mm0, mm1
632 :    
633 :     COL03_SSE mm0, mm1, 6
634 :     MUL_PACK mm0,mm1, [Up13], [Up31]
635 :     MIX_ROWS mm2, mm3, mm0, mm1
636 :     STORE_ADD_2 mm2, mm3
637 :    
638 :     COL03_SSE mm2, mm3, 7
639 :     MUL_PACK mm2,mm3, [Up13], [Up31]
640 :     MIX_ROWS mm0, mm1, mm2, mm3
641 :     STORE_ADD_2 mm0, mm1
642 :    
643 :     STORE_ADD_1 mm2, mm3
644 :    
645 :    
646 :     mov ecx, [esp+4]
647 :     add ecx, 8
648 :    
649 :     COL47_SSE mm0, mm1, 0
650 : edgomez 1192 MUL_PACK mm0,mm1, [Up13], [Up31]
651 : edgomez 851 movq mm4, mm0
652 : edgomez 1192 movq mm5, mm1
653 : edgomez 851 STORE_ADD_1 mm4, mm5
654 :     add ecx, eax
655 :    
656 :     COL47_SSE mm2, mm3, 1
657 :     MUL_PACK mm2,mm3, [Up13], [Up31]
658 :     MIX_ROWS mm0, mm1, mm2, mm3
659 :     STORE_ADD_2 mm0, mm1
660 :    
661 :     COL47_SSE mm0, mm1, 2
662 :     MUL_PACK mm0,mm1, [Up13], [Up31]
663 :     MIX_ROWS mm2, mm3, mm0, mm1
664 :     STORE_ADD_2 mm2, mm3
665 :    
666 :     COL47_SSE mm2, mm3, 3
667 :     MUL_PACK mm2,mm3, [Up13], [Up31]
668 :     MIX_ROWS mm0, mm1, mm2, mm3
669 :     STORE_ADD_2 mm0, mm1
670 :    
671 :     COL47_SSE mm0, mm1, 4
672 :     MUL_PACK mm0,mm1, [Up13], [Up31]
673 :     MIX_ROWS mm2, mm3, mm0, mm1
674 :     STORE_ADD_2 mm2, mm3
675 :    
676 :     COL47_SSE mm2, mm3, 5
677 :     MUL_PACK mm2,mm3, [Up13], [Up31]
678 :     MIX_ROWS mm0, mm1, mm2, mm3
679 :     STORE_ADD_2 mm0, mm1
680 :    
681 :     COL47_SSE mm0, mm1, 6
682 :     MUL_PACK mm0,mm1, [Up13], [Up31]
683 :     MIX_ROWS mm2, mm3, mm0, mm1
684 :     STORE_ADD_2 mm2, mm3
685 :    
686 :     COL47_SSE mm2, mm3, 7
687 :     MUL_PACK mm2,mm3, [Up13], [Up31]
688 :     MIX_ROWS mm0, mm1, mm2, mm3
689 :     STORE_ADD_2 mm0, mm1
690 :    
691 :     STORE_ADD_1 mm2, mm3
692 :    
693 :     ret
694 :    
695 :    
696 :     ;===========================================================================
697 :     ;
698 :     ; void xvid_HFilter_31_mmx(uint8_t *Src1, uint8_t *Src2, int Nb_Blks);
699 :     ; void xvid_VFilter_31_x86(uint8_t *Src1, uint8_t *Src2, const int BpS, int Nb_Blks);
700 :     ; void xvid_HFilter_31_x86(uint8_t *Src1, uint8_t *Src2, int Nb_Blks);
701 :     ;
702 :     ;===========================================================================
703 :    
704 :     ;//////////////////////////////////////////////////////////////////////
705 :     ;// horizontal/vertical filtering: [x,y] -> [ (3x+y+2)>>2, (x+3y+2)>>2 ]
706 :     ;//
707 :     ;// We use the trick: tmp = (x+y+2) -> [x = (tmp+2x)>>2, y = (tmp+2y)>>2]
708 :     ;//////////////////////////////////////////////////////////////////////
709 :    
710 :     align 16
711 :     xvid_HFilter_31_mmx:
712 :     push esi
713 :     push edi
714 :     mov esi, [esp+4 +8] ; Src1
715 :     mov edi, [esp+8 +8] ; Src2
716 :     mov eax, [esp+12 +8] ; Nb_Blks
717 :     lea eax,[eax*2]
718 :     movq mm5, [Cst2]
719 :     pxor mm7, mm7
720 :    
721 :     lea esi, [esi+eax*4]
722 :     lea edi, [edi+eax*4]
723 :    
724 :     neg eax
725 :    
726 :     .Loop: ;12c
727 : edgomez 1192 movd mm0, [esi+eax*4]
728 : edgomez 851 movd mm1, [edi+eax*4]
729 : edgomez 1192 movq mm2, mm5
730 : edgomez 851 punpcklbw mm0, mm7
731 :     punpcklbw mm1, mm7
732 :     paddsw mm2, mm0
733 :     paddsw mm0, mm0
734 :     paddsw mm2, mm1
735 :     paddsw mm1, mm1
736 :     paddsw mm0, mm2
737 :     paddsw mm1, mm2
738 :     psraw mm0, 2
739 :     psraw mm1, 2
740 :     packuswb mm0, mm7
741 :     packuswb mm1, mm7
742 :     movd [esi+eax*4], mm0
743 :     movd [edi+eax*4], mm1
744 :     add eax,1
745 :     jl .Loop
746 :    
747 :     pop edi
748 :     pop esi
749 :     ret
750 :    
751 :     ; mmx is of no use here. Better use plain ASM. Moreover,
752 :     ; this is for the fun of ASM coding, coz' every modern compiler can
753 :     ; end up with a code that looks very much like this one...
754 :    
755 :     align 16
756 :     xvid_VFilter_31_x86:
757 :     push esi
758 :     push edi
759 :     push ebx
760 :     push ebp
761 :     mov esi, [esp+4 +16] ; Src1
762 :     mov edi, [esp+8 +16] ; Src2
763 :     mov ebp, [esp+12 +16] ; BpS
764 :     mov eax, [esp+16 +16] ; Nb_Blks
765 :     lea eax,[eax*8]
766 :    
767 :     .Loop: ;7c
768 :     movzx ecx, byte [esi]
769 :     movzx edx, byte [edi]
770 :    
771 :     lea ebx, [ecx+edx+2]
772 :     lea ecx,[ebx+2*ecx]
773 :     lea edx,[ebx+2*edx]
774 :    
775 :     shr ecx,2
776 :     shr edx,2
777 :     mov [esi], cl
778 :     mov [edi], dl
779 :     lea esi, [esi+ebp]
780 :     lea edi, [edi+ebp]
781 :     dec eax
782 :     jg .Loop
783 :    
784 :     pop ebp
785 :     pop ebx
786 :     pop edi
787 :     pop esi
788 :     ret
789 :    
790 :     ; this one's just a little faster than gcc's code. Very little.
791 :    
792 :     align 16
793 :     xvid_HFilter_31_x86:
794 :     push esi
795 :     push edi
796 :     push ebx
797 :     mov esi, [esp+4 +12] ; Src1
798 :     mov edi, [esp+8 +12] ; Src2
799 :     mov eax, [esp+12 +12] ; Nb_Blks
800 :    
801 :     lea eax,[eax*8]
802 :     lea esi, [esi+eax]
803 :     lea edi, [esi+eax]
804 :     neg eax
805 :    
806 :     .Loop: ; 6c
807 :     movzx ecx, byte [esi+eax]
808 :     movzx edx, byte [edi+eax]
809 :    
810 :     lea ebx, [ecx+edx+2]
811 :     lea ecx,[ebx+2*ecx]
812 :     lea edx,[ebx+2*edx]
813 :     shr ecx,2
814 :     shr edx,2
815 :     mov [esi+eax], cl
816 :     mov [edi+eax], dl
817 :     inc eax
818 :    
819 :     jl .Loop
820 :    
821 :     pop ebx
822 :     pop edi
823 :     pop esi
824 :     ret
825 :    
826 :     ;//////////////////////////////////////////////////////////////////////
827 :     ;// 16b downsampling 16x16 -> 8x8
828 :     ;//////////////////////////////////////////////////////////////////////
829 :    
830 :     %macro HFILTER_1331 2 ;%1:src %2:dst reg. -trashes mm0/mm1/mm2
831 :     movq mm2, [Mask_ff]
832 :     movq %2, [%1-1] ;-10123456
833 :     movq mm0, [%1] ; 01234567
834 :     movq mm1, [%1+1] ; 12345678
835 :     pand %2, mm2 ;-1|1|3|5
836 :     pand mm0, mm2 ; 0|2|4|6
837 :     pand mm1, mm2 ; 1|3|5|7
838 :     pand mm2, [%1+2] ; 2|4|6|8
839 :     paddusw mm0, mm1
840 :     paddusw %2, mm2
841 :     pmullw mm0, mm7
842 :     paddusw %2, mm0
843 :     %endmacro
844 :    
845 :     %macro VFILTER_1331 4 ; %1-4: regs %1-%2: trashed
846 :     paddsw %1, [Cst32]
847 : edgomez 1192 paddsw %2, %3
848 : edgomez 851 pmullw %2, mm7
849 :     paddsw %1,%4
850 :     paddsw %1, %2
851 :     psraw %1, 6
852 :     %endmacro
853 :    
854 :     ;===========================================================================
855 :     ;
856 :     ; void xvid_Filter_18x18_To_8x8_mmx(int16_t *Dst,
857 :     ; const uint8_t *Src, const int BpS);
858 :     ;
859 :     ;===========================================================================
860 :    
861 :     %macro COPY_TWO_LINES_1331 1 ; %1: dst
862 :     HFILTER_1331 edx , mm5
863 :     HFILTER_1331 edx+eax, mm6
864 :     lea edx, [edx+2*eax]
865 :     VFILTER_1331 mm3,mm4,mm5, mm6
866 :     movq [%1], mm3
867 :    
868 :     HFILTER_1331 edx , mm3
869 :     HFILTER_1331 edx+eax, mm4
870 :     lea edx, [edx+2*eax]
871 :     VFILTER_1331 mm5,mm6,mm3,mm4
872 :     movq [%1+16], mm5
873 :     %endmacro
874 :    
875 :     align 16
876 :     xvid_Filter_18x18_To_8x8_mmx: ; 283c (~4.4c per output pixel)
877 :    
878 :     mov ecx, [esp+4] ; Dst
879 :     mov edx, [esp+8] ; Src
880 :     mov eax, [esp+12] ; BpS
881 :    
882 :     movq mm7, [Cst3]
883 :     sub edx, eax
884 :    
885 :     ; mm3/mm4/mm5/mm6 is used as a 4-samples delay line.
886 :    
887 :     ; process columns 0-3
888 :    
889 :     HFILTER_1331 edx , mm3 ; pre-load mm3/mm4
890 :     HFILTER_1331 edx+eax, mm4
891 :     lea edx, [edx+2*eax]
892 :    
893 :     COPY_TWO_LINES_1331 ecx + 0*16
894 :     COPY_TWO_LINES_1331 ecx + 2*16
895 :     COPY_TWO_LINES_1331 ecx + 4*16
896 :     COPY_TWO_LINES_1331 ecx + 6*16
897 :    
898 :     ; process columns 4-7
899 :    
900 :     mov edx, [esp+8]
901 :     sub edx, eax
902 :     add edx, 8
903 :    
904 :     HFILTER_1331 edx , mm3 ; pre-load mm3/mm4
905 :     HFILTER_1331 edx+eax, mm4
906 :     lea edx, [edx+2*eax]
907 :    
908 :     COPY_TWO_LINES_1331 ecx + 0*16 +8
909 :     COPY_TWO_LINES_1331 ecx + 2*16 +8
910 :     COPY_TWO_LINES_1331 ecx + 4*16 +8
911 :     COPY_TWO_LINES_1331 ecx + 6*16 +8
912 :    
913 :     ret
914 :    
915 :     ;===========================================================================
916 :     ;
917 :     ; void xvid_Filter_Diff_18x18_To_8x8_mmx(int16_t *Dst,
918 :     ; const uint8_t *Src, const int BpS);
919 :     ;
920 :     ;===========================================================================
921 :    
922 :     %macro DIFF_TWO_LINES_1331 1 ; %1: dst
923 :     HFILTER_1331 edx , mm5
924 :     HFILTER_1331 edx+eax, mm6
925 :     lea edx, [edx+2*eax]
926 :     movq mm2, [%1]
927 :     VFILTER_1331 mm3,mm4,mm5, mm6
928 :     psubsw mm2, mm3
929 :     movq [%1], mm2
930 :    
931 :     HFILTER_1331 edx , mm3
932 :     HFILTER_1331 edx+eax, mm4
933 :     lea edx, [edx+2*eax]
934 :     movq mm2, [%1+16]
935 :     VFILTER_1331 mm5,mm6,mm3,mm4
936 :     psubsw mm2, mm5
937 :     movq [%1+16], mm2
938 :     %endmacro
939 :    
940 :     align 16
941 :     xvid_Filter_Diff_18x18_To_8x8_mmx: ; 302c
942 :    
943 :     mov ecx, [esp+4] ; Dst
944 :     mov edx, [esp+8] ; Src
945 :     mov eax, [esp+12] ; BpS
946 :    
947 :     movq mm7, [Cst3]
948 :     sub edx, eax
949 :    
950 :     ; mm3/mm4/mm5/mm6 is used as a 4-samples delay line.
951 :    
952 :     ; process columns 0-3
953 :    
954 :     HFILTER_1331 edx , mm3 ; pre-load mm3/mm4
955 :     HFILTER_1331 edx+eax, mm4
956 :     lea edx, [edx+2*eax]
957 :    
958 :     DIFF_TWO_LINES_1331 ecx + 0*16
959 :     DIFF_TWO_LINES_1331 ecx + 2*16
960 :     DIFF_TWO_LINES_1331 ecx + 4*16
961 :     DIFF_TWO_LINES_1331 ecx + 6*16
962 :    
963 :     ; process columns 4-7
964 :     mov edx, [esp+8]
965 :     sub edx, eax
966 :     add edx, 8
967 :    
968 :     HFILTER_1331 edx , mm3 ; pre-load mm3/mm4
969 :     HFILTER_1331 edx+eax, mm4
970 :     lea edx, [edx+2*eax]
971 :    
972 :     DIFF_TWO_LINES_1331 ecx + 0*16 +8
973 :     DIFF_TWO_LINES_1331 ecx + 2*16 +8
974 :     DIFF_TWO_LINES_1331 ecx + 4*16 +8
975 :     DIFF_TWO_LINES_1331 ecx + 6*16 +8
976 :    
977 :     ret
978 :    
979 :     ;//////////////////////////////////////////////////////////////////////
980 :    
981 :     ; pfeewwww... Never Do That On Stage Again. :)
982 :    

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4