[svn] / trunk / xvidcore / src / image / x86_asm / reduced_mmx.asm Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/image/x86_asm/reduced_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1535 - (view) (download)

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

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