[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 1540 - (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 1540 ; * $Id: reduced_mmx.asm,v 1.6 2004-08-29 10:02:38 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 : edgomez 1540 global _%1:function %1.endfunc-%1
32 :     %define %1 _%1:function %1.endfunc-%1
33 : edgomez 1535 %else
34 :     global _%1
35 :     %define %1 _%1
36 :     %endif
37 : edgomez 851 %else
38 : edgomez 1535 %ifdef MARK_FUNCS
39 : edgomez 1540 global %1:function %1.endfunc-%1
40 : edgomez 1535 %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 : edgomez 1540 .endfunc
275 : edgomez 851
276 :     ;===========================================================================
277 :     ;
278 : edgomez 1382 ; void xvid_Add_Upsampled_8x8_16To8_mmx(uint8_t *Dst,
279 : edgomez 851 ; const int16_t *Src, const int BpS);
280 :     ;
281 :     ;===========================================================================
282 :    
283 :     ; Note: grrr... the 'pcmpgtw' stuff are the "/4" and "/16" operators
284 : edgomez 1382 ; implemented with ">>2" and ">>4" using:
285 : edgomez 851 ; x/4 = ( (x-(x<0))>>2 ) + (x<0)
286 :     ; x/16 = ( (x-(x<0))>>4 ) + (x<0)
287 :    
288 :     %macro STORE_ADD_1 2
289 :     ; We substract the rounder '2' for corner pixels,
290 :     ; since when 'x' is negative, (x*4 + 2)/4 is *not*
291 :     ; equal to 'x'. In fact, the correct relation is:
292 :     ; (x*4 + 2)/4 = x - (x<0)
293 :     ; So, better revert to (x*4)/4 = x.
294 :    
295 :     psubsw %1, [Cst2000]
296 :     psubsw %2, [Cst0002]
297 :     pxor mm6, mm6
298 :     pxor mm7, mm7
299 :     pcmpgtw mm6, %1
300 :     pcmpgtw mm7, %2
301 :     paddsw %1, mm6
302 :     paddsw %2, mm7
303 :     psraw %1, 2
304 :     psraw %2, 2
305 :     psubsw %1, mm6
306 :     psubsw %2, mm7
307 :    
308 :     ; mix with destination [ecx]
309 :     movq mm6, [ecx]
310 :     movq mm7, [ecx]
311 :     punpcklbw mm6, [Cst0]
312 :     punpckhbw mm7, [Cst0]
313 :     paddsw %1, mm6
314 :     paddsw %2, mm7
315 :     packuswb %1,%2
316 :     movq [ecx], %1
317 :     %endmacro
318 :    
319 :     %macro STORE_ADD_2 2
320 :     pxor mm6, mm6
321 :     pxor mm7, mm7
322 :     pcmpgtw mm6, %1
323 :     pcmpgtw mm7, %2
324 :     paddsw %1, mm6
325 :     paddsw %2, mm7
326 :     psraw %1, 4
327 :     psraw %2, 4
328 :     psubsw %1, mm6
329 :     psubsw %2, mm7
330 :    
331 :     pxor mm6, mm6
332 :     pxor mm7, mm7
333 :     pcmpgtw mm6, mm4
334 :     pcmpgtw mm7, mm5
335 :     paddsw mm4, mm6
336 :     paddsw mm5, mm7
337 :     psraw mm4, 4
338 :     psraw mm5, 4
339 :     psubsw mm4, mm6
340 :     psubsw mm5, mm7
341 :    
342 :     ; mix with destination
343 :     movq mm6, [ecx]
344 :     movq mm7, [ecx]
345 :     punpcklbw mm6, [Cst0]
346 :     punpckhbw mm7, [Cst0]
347 :     paddsw %1, mm6
348 :     paddsw %2, mm7
349 :    
350 :     movq mm6, [ecx+eax]
351 :     movq mm7, [ecx+eax]
352 :    
353 :     punpcklbw mm6, [Cst0]
354 :     punpckhbw mm7, [Cst0]
355 :     paddsw mm4, mm6
356 :     paddsw mm5, mm7
357 :    
358 :     packuswb %1,%2
359 :     packuswb mm4, mm5
360 :    
361 :     movq [ecx], %1
362 :     movq [ecx+eax], mm4
363 :    
364 :     lea ecx, [ecx+2*eax]
365 :     %endmacro
366 :    
367 :     ;//////////////////////////////////////////////////////////////////////
368 :    
369 :     align 16
370 :     xvid_Add_Upsampled_8x8_16To8_mmx: ; 579c
371 :    
372 :     mov ecx, [esp+4] ; Dst
373 :     mov edx, [esp+8] ; Src
374 :     mov eax, [esp+12] ; BpS
375 :    
376 :     COL03 mm0, mm1, 0
377 : edgomez 1382 MUL_PACK mm0,mm1, [Up13], [Up31]
378 : edgomez 851 movq mm4, mm0
379 :     movq mm5, mm1
380 :     STORE_ADD_1 mm4, mm5
381 :     add ecx, eax
382 :    
383 :     COL03 mm2, mm3, 1
384 :     MUL_PACK mm2,mm3, [Up13], [Up31]
385 :     MIX_ROWS mm0, mm1, mm2, mm3
386 :     STORE_ADD_2 mm0, mm1
387 :    
388 :     COL03 mm0, mm1, 2
389 :     MUL_PACK mm0,mm1, [Up13], [Up31]
390 :     MIX_ROWS mm2, mm3, mm0, mm1
391 :     STORE_ADD_2 mm2, mm3
392 :    
393 :     COL03 mm2, mm3, 3
394 :     MUL_PACK mm2,mm3, [Up13], [Up31]
395 :     MIX_ROWS mm0, mm1, mm2, mm3
396 :     STORE_ADD_2 mm0, mm1
397 :    
398 :     COL03 mm0, mm1, 4
399 :     MUL_PACK mm0,mm1, [Up13], [Up31]
400 :     MIX_ROWS mm2, mm3, mm0, mm1
401 :     STORE_ADD_2 mm2, mm3
402 :    
403 :     COL03 mm2, mm3, 5
404 :     MUL_PACK mm2,mm3, [Up13], [Up31]
405 :     MIX_ROWS mm0, mm1, mm2, mm3
406 :     STORE_ADD_2 mm0, mm1
407 :    
408 :     COL03 mm0, mm1, 6
409 :     MUL_PACK mm0,mm1, [Up13], [Up31]
410 :     MIX_ROWS mm2, mm3, mm0, mm1
411 :     STORE_ADD_2 mm2, mm3
412 :    
413 :     COL03 mm2, mm3, 7
414 :     MUL_PACK mm2,mm3, [Up13], [Up31]
415 :     MIX_ROWS mm0, mm1, mm2, mm3
416 :     STORE_ADD_2 mm0, mm1
417 :    
418 :     STORE_ADD_1 mm2, mm3
419 :    
420 :    
421 :     mov ecx, [esp+4]
422 :     add ecx, 8
423 :    
424 :     COL47 mm0, mm1, 0
425 : edgomez 1382 MUL_PACK mm0,mm1, [Up13], [Up31]
426 : edgomez 851 movq mm4, mm0
427 : edgomez 1382 movq mm5, mm1
428 : edgomez 851 STORE_ADD_1 mm4, mm5
429 :     add ecx, eax
430 :    
431 :     COL47 mm2, mm3, 1
432 :     MUL_PACK mm2,mm3, [Up13], [Up31]
433 :     MIX_ROWS mm0, mm1, mm2, mm3
434 :     STORE_ADD_2 mm0, mm1
435 :    
436 :     COL47 mm0, mm1, 2
437 :     MUL_PACK mm0,mm1, [Up13], [Up31]
438 :     MIX_ROWS mm2, mm3, mm0, mm1
439 :     STORE_ADD_2 mm2, mm3
440 :    
441 :     COL47 mm2, mm3, 3
442 :     MUL_PACK mm2,mm3, [Up13], [Up31]
443 :     MIX_ROWS mm0, mm1, mm2, mm3
444 :     STORE_ADD_2 mm0, mm1
445 :    
446 :     COL47 mm0, mm1, 4
447 :     MUL_PACK mm0,mm1, [Up13], [Up31]
448 :     MIX_ROWS mm2, mm3, mm0, mm1
449 :     STORE_ADD_2 mm2, mm3
450 :    
451 :     COL47 mm2, mm3, 5
452 :     MUL_PACK mm2,mm3, [Up13], [Up31]
453 :     MIX_ROWS mm0, mm1, mm2, mm3
454 :     STORE_ADD_2 mm0, mm1
455 :    
456 :     COL47 mm0, mm1, 6
457 :     MUL_PACK mm0,mm1, [Up13], [Up31]
458 :     MIX_ROWS mm2, mm3, mm0, mm1
459 :     STORE_ADD_2 mm2, mm3
460 :    
461 :     COL47 mm2, mm3, 7
462 :     MUL_PACK mm2,mm3, [Up13], [Up31]
463 :     MIX_ROWS mm0, mm1, mm2, mm3
464 :     STORE_ADD_2 mm0, mm1
465 :    
466 :     STORE_ADD_1 mm2, mm3
467 :    
468 :     ret
469 : edgomez 1540 .endfunc
470 : edgomez 851
471 :     ;===========================================================================
472 :     ;
473 : edgomez 1382 ; void xvid_Copy_Upsampled_8x8_16To8_xmm(uint8_t *Dst,
474 : edgomez 851 ; const int16_t *Src, const int BpS);
475 :     ;
476 :     ;===========================================================================
477 :    
478 :     ; xmm version can take (little) advantage of 'pshufw'
479 :    
480 :     %macro COL03_SSE 3 ;%1/%2: regs, %3: row -trashes mm4/mm5
481 :     movq %2, [edx+%3*16+0*2] ; <- 0|1|2|3
482 :     pshufw %1, %2, (0+0*4+0*16+1*64) ; %1 = 0|0|0|1
483 :     pshufw mm4, %2, (0+1*4+1*16+2*64) ; mm4= 0|1|1|2
484 :     pshufw %2, %2, (1+2*4+2*16+3*64) ; %2 = 1|2|2|3
485 :     pshufw mm5, [edx+%3*16+2*2], (0+1*4+1*16+2*64) ; mm5 = 2|3|3|4
486 :     %endmacro
487 :    
488 :     %macro COL47_SSE 3 ;%1-%2: regs, %3: row -trashes mm4/mm5
489 :     pshufw %1, [edx+%3*16+2*2], (1+2*4+2*16+3*64) ; 3|4|4|5
490 :     movq mm5, [edx+%3*16+2*4] ; <- 4|5|6|7
491 :     pshufw mm4, mm5, (0+1*4+1*16+2*64) ; 4|5|5|6
492 :     pshufw %2, mm5, (1+2*4+2*16+3*64) ; 5|6|6|7
493 :     pshufw mm5, mm5, (2+3*4+3*16+3*64) ; 6|7|7|7
494 :     %endmacro
495 :    
496 :    
497 :     ;//////////////////////////////////////////////////////////////////////
498 :    
499 :     align 16
500 :     xvid_Copy_Upsampled_8x8_16To8_xmm: ; 315c
501 :    
502 :     mov ecx, [esp+4] ; Dst
503 :     mov edx, [esp+8] ; Src
504 :     mov eax, [esp+12] ; BpS
505 :    
506 :     movq mm6, [Up13]
507 :     movq mm7, [Up31]
508 :    
509 :     COL03_SSE mm0, mm1, 0
510 :     MUL_PACK mm0,mm1, mm6, mm7
511 :     movq mm4, mm0
512 :     movq mm5, mm1
513 :     STORE_1 mm4, mm5
514 :     add ecx, eax
515 :    
516 :     COL03_SSE mm2, mm3, 1
517 :     MUL_PACK mm2,mm3, mm6, mm7
518 :     MIX_ROWS mm0, mm1, mm2, mm3
519 :     STORE_2 mm0, mm1
520 :    
521 :     COL03_SSE mm0, mm1, 2
522 :     MUL_PACK mm0,mm1, mm6, mm7
523 :     MIX_ROWS mm2, mm3, mm0, mm1
524 :     STORE_2 mm2, mm3
525 :    
526 :     COL03_SSE mm2, mm3, 3
527 :     MUL_PACK mm2,mm3, mm6, mm7
528 :     MIX_ROWS mm0, mm1, mm2, mm3
529 :     STORE_2 mm0, mm1
530 :    
531 :     COL03_SSE mm0, mm1, 4
532 :     MUL_PACK mm0,mm1, mm6, mm7
533 :     MIX_ROWS mm2, mm3, mm0, mm1
534 :     STORE_2 mm2, mm3
535 :    
536 :     COL03_SSE mm2, mm3, 5
537 :     MUL_PACK mm2,mm3, mm6, mm7
538 :     MIX_ROWS mm0, mm1, mm2, mm3
539 :     STORE_2 mm0, mm1
540 :    
541 :     COL03_SSE mm0, mm1, 6
542 :     MUL_PACK mm0,mm1, mm6, mm7
543 :     MIX_ROWS mm2, mm3, mm0, mm1
544 :     STORE_2 mm2, mm3
545 :    
546 :     COL03_SSE mm2, mm3, 7
547 :     MUL_PACK mm2,mm3, mm6, mm7
548 :     MIX_ROWS mm0, mm1, mm2, mm3
549 :     STORE_2 mm0, mm1
550 :    
551 :     STORE_1 mm2, mm3
552 :    
553 :     mov ecx, [esp+4]
554 :     add ecx, 8
555 :    
556 :     COL47_SSE mm0, mm1, 0
557 :     MUL_PACK mm0,mm1, mm6, mm7
558 :     movq mm4, mm0
559 :     movq mm5, mm1
560 :     STORE_1 mm4, mm5
561 :     add ecx, eax
562 :    
563 :     COL47_SSE mm2, mm3, 1
564 :     MUL_PACK mm2,mm3, mm6, mm7
565 :     MIX_ROWS mm0, mm1, mm2, mm3
566 :     STORE_2 mm0, mm1
567 :    
568 :     COL47_SSE mm0, mm1, 2
569 :     MUL_PACK mm0,mm1, mm6, mm7
570 :     MIX_ROWS mm2, mm3, mm0, mm1
571 :     STORE_2 mm2, mm3
572 :    
573 :     COL47_SSE mm2, mm3, 3
574 :     MUL_PACK mm2,mm3, mm6, mm7
575 :     MIX_ROWS mm0, mm1, mm2, mm3
576 :     STORE_2 mm0, mm1
577 :    
578 :     COL47_SSE mm0, mm1, 4
579 :     MUL_PACK mm0,mm1, mm6, mm7
580 :     MIX_ROWS mm2, mm3, mm0, mm1
581 :     STORE_2 mm2, mm3
582 :    
583 :     COL47_SSE mm2, mm3, 5
584 :     MUL_PACK mm2,mm3, mm6, mm7
585 :     MIX_ROWS mm0, mm1, mm2, mm3
586 :     STORE_2 mm0, mm1
587 :    
588 :     COL47_SSE mm0, mm1, 6
589 :     MUL_PACK mm0,mm1, mm6, mm7
590 :     MIX_ROWS mm2, mm3, mm0, mm1
591 :     STORE_2 mm2, mm3
592 :    
593 :     COL47_SSE mm2, mm3, 7
594 :     MUL_PACK mm2,mm3, mm6, mm7
595 :     MIX_ROWS mm0, mm1, mm2, mm3
596 :     STORE_2 mm0, mm1
597 :    
598 :     STORE_1 mm2, mm3
599 :    
600 :     ret
601 : edgomez 1540 .endfunc
602 : edgomez 851
603 :     ;===========================================================================
604 :     ;
605 : edgomez 1382 ; void xvid_Add_Upsampled_8x8_16To8_xmm(uint8_t *Dst,
606 : edgomez 851 ; const int16_t *Src, const int BpS);
607 :     ;
608 :     ;===========================================================================
609 :    
610 :     align 16
611 :     xvid_Add_Upsampled_8x8_16To8_xmm: ; 549c
612 :    
613 :     mov ecx, [esp+4] ; Dst
614 :     mov edx, [esp+8] ; Src
615 :     mov eax, [esp+12] ; BpS
616 :    
617 :     COL03_SSE mm0, mm1, 0
618 : edgomez 1382 MUL_PACK mm0,mm1, [Up13], [Up31]
619 : edgomez 851 movq mm4, mm0
620 :     movq mm5, mm1
621 :     STORE_ADD_1 mm4, mm5
622 :     add ecx, eax
623 :    
624 :     COL03_SSE mm2, mm3, 1
625 :     MUL_PACK mm2,mm3, [Up13], [Up31]
626 :     MIX_ROWS mm0, mm1, mm2, mm3
627 :     STORE_ADD_2 mm0, mm1
628 :    
629 :     COL03_SSE mm0, mm1, 2
630 :     MUL_PACK mm0,mm1, [Up13], [Up31]
631 :     MIX_ROWS mm2, mm3, mm0, mm1
632 :     STORE_ADD_2 mm2, mm3
633 :    
634 :     COL03_SSE mm2, mm3, 3
635 :     MUL_PACK mm2,mm3, [Up13], [Up31]
636 :     MIX_ROWS mm0, mm1, mm2, mm3
637 :     STORE_ADD_2 mm0, mm1
638 :    
639 :     COL03_SSE mm0, mm1, 4
640 :     MUL_PACK mm0,mm1, [Up13], [Up31]
641 :     MIX_ROWS mm2, mm3, mm0, mm1
642 :     STORE_ADD_2 mm2, mm3
643 :    
644 :     COL03_SSE mm2, mm3, 5
645 :     MUL_PACK mm2,mm3, [Up13], [Up31]
646 :     MIX_ROWS mm0, mm1, mm2, mm3
647 :     STORE_ADD_2 mm0, mm1
648 :    
649 :     COL03_SSE mm0, mm1, 6
650 :     MUL_PACK mm0,mm1, [Up13], [Up31]
651 :     MIX_ROWS mm2, mm3, mm0, mm1
652 :     STORE_ADD_2 mm2, mm3
653 :    
654 :     COL03_SSE mm2, mm3, 7
655 :     MUL_PACK mm2,mm3, [Up13], [Up31]
656 :     MIX_ROWS mm0, mm1, mm2, mm3
657 :     STORE_ADD_2 mm0, mm1
658 :    
659 :     STORE_ADD_1 mm2, mm3
660 :    
661 :    
662 :     mov ecx, [esp+4]
663 :     add ecx, 8
664 :    
665 :     COL47_SSE mm0, mm1, 0
666 : edgomez 1382 MUL_PACK mm0,mm1, [Up13], [Up31]
667 : edgomez 851 movq mm4, mm0
668 : edgomez 1382 movq mm5, mm1
669 : edgomez 851 STORE_ADD_1 mm4, mm5
670 :     add ecx, eax
671 :    
672 :     COL47_SSE mm2, mm3, 1
673 :     MUL_PACK mm2,mm3, [Up13], [Up31]
674 :     MIX_ROWS mm0, mm1, mm2, mm3
675 :     STORE_ADD_2 mm0, mm1
676 :    
677 :     COL47_SSE mm0, mm1, 2
678 :     MUL_PACK mm0,mm1, [Up13], [Up31]
679 :     MIX_ROWS mm2, mm3, mm0, mm1
680 :     STORE_ADD_2 mm2, mm3
681 :    
682 :     COL47_SSE mm2, mm3, 3
683 :     MUL_PACK mm2,mm3, [Up13], [Up31]
684 :     MIX_ROWS mm0, mm1, mm2, mm3
685 :     STORE_ADD_2 mm0, mm1
686 :    
687 :     COL47_SSE mm0, mm1, 4
688 :     MUL_PACK mm0,mm1, [Up13], [Up31]
689 :     MIX_ROWS mm2, mm3, mm0, mm1
690 :     STORE_ADD_2 mm2, mm3
691 :    
692 :     COL47_SSE mm2, mm3, 5
693 :     MUL_PACK mm2,mm3, [Up13], [Up31]
694 :     MIX_ROWS mm0, mm1, mm2, mm3
695 :     STORE_ADD_2 mm0, mm1
696 :    
697 :     COL47_SSE mm0, mm1, 6
698 :     MUL_PACK mm0,mm1, [Up13], [Up31]
699 :     MIX_ROWS mm2, mm3, mm0, mm1
700 :     STORE_ADD_2 mm2, mm3
701 :    
702 :     COL47_SSE mm2, mm3, 7
703 :     MUL_PACK mm2,mm3, [Up13], [Up31]
704 :     MIX_ROWS mm0, mm1, mm2, mm3
705 :     STORE_ADD_2 mm0, mm1
706 :    
707 :     STORE_ADD_1 mm2, mm3
708 :    
709 :     ret
710 : edgomez 1540 .endfunc
711 : edgomez 851
712 :    
713 :     ;===========================================================================
714 :     ;
715 :     ; void xvid_HFilter_31_mmx(uint8_t *Src1, uint8_t *Src2, int Nb_Blks);
716 :     ; void xvid_VFilter_31_x86(uint8_t *Src1, uint8_t *Src2, const int BpS, int Nb_Blks);
717 :     ; void xvid_HFilter_31_x86(uint8_t *Src1, uint8_t *Src2, int Nb_Blks);
718 :     ;
719 :     ;===========================================================================
720 :    
721 :     ;//////////////////////////////////////////////////////////////////////
722 :     ;// horizontal/vertical filtering: [x,y] -> [ (3x+y+2)>>2, (x+3y+2)>>2 ]
723 :     ;//
724 :     ;// We use the trick: tmp = (x+y+2) -> [x = (tmp+2x)>>2, y = (tmp+2y)>>2]
725 :     ;//////////////////////////////////////////////////////////////////////
726 :    
727 :     align 16
728 :     xvid_HFilter_31_mmx:
729 :     push esi
730 :     push edi
731 :     mov esi, [esp+4 +8] ; Src1
732 :     mov edi, [esp+8 +8] ; Src2
733 :     mov eax, [esp+12 +8] ; Nb_Blks
734 :     lea eax,[eax*2]
735 :     movq mm5, [Cst2]
736 :     pxor mm7, mm7
737 :    
738 :     lea esi, [esi+eax*4]
739 :     lea edi, [edi+eax*4]
740 :    
741 :     neg eax
742 :    
743 :     .Loop: ;12c
744 : edgomez 1382 movd mm0, [esi+eax*4]
745 : edgomez 851 movd mm1, [edi+eax*4]
746 : edgomez 1382 movq mm2, mm5
747 : edgomez 851 punpcklbw mm0, mm7
748 :     punpcklbw mm1, mm7
749 :     paddsw mm2, mm0
750 :     paddsw mm0, mm0
751 :     paddsw mm2, mm1
752 :     paddsw mm1, mm1
753 :     paddsw mm0, mm2
754 :     paddsw mm1, mm2
755 :     psraw mm0, 2
756 :     psraw mm1, 2
757 :     packuswb mm0, mm7
758 :     packuswb mm1, mm7
759 :     movd [esi+eax*4], mm0
760 :     movd [edi+eax*4], mm1
761 :     add eax,1
762 :     jl .Loop
763 :    
764 :     pop edi
765 :     pop esi
766 :     ret
767 : edgomez 1540 .endfunc
768 : edgomez 851
769 :     ; mmx is of no use here. Better use plain ASM. Moreover,
770 :     ; this is for the fun of ASM coding, coz' every modern compiler can
771 :     ; end up with a code that looks very much like this one...
772 :    
773 :     align 16
774 :     xvid_VFilter_31_x86:
775 :     push esi
776 :     push edi
777 :     push ebx
778 :     push ebp
779 :     mov esi, [esp+4 +16] ; Src1
780 :     mov edi, [esp+8 +16] ; Src2
781 :     mov ebp, [esp+12 +16] ; BpS
782 :     mov eax, [esp+16 +16] ; Nb_Blks
783 :     lea eax,[eax*8]
784 :    
785 :     .Loop: ;7c
786 :     movzx ecx, byte [esi]
787 :     movzx edx, byte [edi]
788 :    
789 :     lea ebx, [ecx+edx+2]
790 :     lea ecx,[ebx+2*ecx]
791 :     lea edx,[ebx+2*edx]
792 :    
793 :     shr ecx,2
794 :     shr edx,2
795 :     mov [esi], cl
796 :     mov [edi], dl
797 :     lea esi, [esi+ebp]
798 :     lea edi, [edi+ebp]
799 :     dec eax
800 :     jg .Loop
801 :    
802 :     pop ebp
803 :     pop ebx
804 :     pop edi
805 :     pop esi
806 :     ret
807 : edgomez 1540 .endfunc
808 : edgomez 851
809 :     ; this one's just a little faster than gcc's code. Very little.
810 :    
811 :     align 16
812 :     xvid_HFilter_31_x86:
813 :     push esi
814 :     push edi
815 :     push ebx
816 :     mov esi, [esp+4 +12] ; Src1
817 :     mov edi, [esp+8 +12] ; Src2
818 :     mov eax, [esp+12 +12] ; Nb_Blks
819 :    
820 :     lea eax,[eax*8]
821 :     lea esi, [esi+eax]
822 :     lea edi, [esi+eax]
823 :     neg eax
824 :    
825 :     .Loop: ; 6c
826 :     movzx ecx, byte [esi+eax]
827 :     movzx edx, byte [edi+eax]
828 :    
829 :     lea ebx, [ecx+edx+2]
830 :     lea ecx,[ebx+2*ecx]
831 :     lea edx,[ebx+2*edx]
832 :     shr ecx,2
833 :     shr edx,2
834 :     mov [esi+eax], cl
835 :     mov [edi+eax], dl
836 :     inc eax
837 :    
838 :     jl .Loop
839 :    
840 :     pop ebx
841 :     pop edi
842 :     pop esi
843 :     ret
844 : edgomez 1540 .endfunc
845 : edgomez 851
846 :     ;//////////////////////////////////////////////////////////////////////
847 :     ;// 16b downsampling 16x16 -> 8x8
848 :     ;//////////////////////////////////////////////////////////////////////
849 :    
850 :     %macro HFILTER_1331 2 ;%1:src %2:dst reg. -trashes mm0/mm1/mm2
851 :     movq mm2, [Mask_ff]
852 :     movq %2, [%1-1] ;-10123456
853 :     movq mm0, [%1] ; 01234567
854 :     movq mm1, [%1+1] ; 12345678
855 :     pand %2, mm2 ;-1|1|3|5
856 :     pand mm0, mm2 ; 0|2|4|6
857 :     pand mm1, mm2 ; 1|3|5|7
858 :     pand mm2, [%1+2] ; 2|4|6|8
859 :     paddusw mm0, mm1
860 :     paddusw %2, mm2
861 :     pmullw mm0, mm7
862 :     paddusw %2, mm0
863 :     %endmacro
864 :    
865 :     %macro VFILTER_1331 4 ; %1-4: regs %1-%2: trashed
866 :     paddsw %1, [Cst32]
867 : edgomez 1382 paddsw %2, %3
868 : edgomez 851 pmullw %2, mm7
869 :     paddsw %1,%4
870 :     paddsw %1, %2
871 :     psraw %1, 6
872 :     %endmacro
873 :    
874 :     ;===========================================================================
875 :     ;
876 :     ; void xvid_Filter_18x18_To_8x8_mmx(int16_t *Dst,
877 :     ; const uint8_t *Src, const int BpS);
878 :     ;
879 :     ;===========================================================================
880 :    
881 :     %macro COPY_TWO_LINES_1331 1 ; %1: dst
882 :     HFILTER_1331 edx , mm5
883 :     HFILTER_1331 edx+eax, mm6
884 :     lea edx, [edx+2*eax]
885 :     VFILTER_1331 mm3,mm4,mm5, mm6
886 :     movq [%1], mm3
887 :    
888 :     HFILTER_1331 edx , mm3
889 :     HFILTER_1331 edx+eax, mm4
890 :     lea edx, [edx+2*eax]
891 :     VFILTER_1331 mm5,mm6,mm3,mm4
892 :     movq [%1+16], mm5
893 :     %endmacro
894 :    
895 :     align 16
896 :     xvid_Filter_18x18_To_8x8_mmx: ; 283c (~4.4c per output pixel)
897 :    
898 :     mov ecx, [esp+4] ; Dst
899 :     mov edx, [esp+8] ; Src
900 :     mov eax, [esp+12] ; BpS
901 :    
902 :     movq mm7, [Cst3]
903 :     sub edx, eax
904 :    
905 :     ; mm3/mm4/mm5/mm6 is used as a 4-samples delay line.
906 :    
907 :     ; process columns 0-3
908 :    
909 :     HFILTER_1331 edx , mm3 ; pre-load mm3/mm4
910 :     HFILTER_1331 edx+eax, mm4
911 :     lea edx, [edx+2*eax]
912 :    
913 :     COPY_TWO_LINES_1331 ecx + 0*16
914 :     COPY_TWO_LINES_1331 ecx + 2*16
915 :     COPY_TWO_LINES_1331 ecx + 4*16
916 :     COPY_TWO_LINES_1331 ecx + 6*16
917 :    
918 :     ; process columns 4-7
919 :    
920 :     mov edx, [esp+8]
921 :     sub edx, eax
922 :     add edx, 8
923 :    
924 :     HFILTER_1331 edx , mm3 ; pre-load mm3/mm4
925 :     HFILTER_1331 edx+eax, mm4
926 :     lea edx, [edx+2*eax]
927 :    
928 :     COPY_TWO_LINES_1331 ecx + 0*16 +8
929 :     COPY_TWO_LINES_1331 ecx + 2*16 +8
930 :     COPY_TWO_LINES_1331 ecx + 4*16 +8
931 :     COPY_TWO_LINES_1331 ecx + 6*16 +8
932 :    
933 :     ret
934 : edgomez 1540 .endfunc
935 : edgomez 851
936 :     ;===========================================================================
937 :     ;
938 :     ; void xvid_Filter_Diff_18x18_To_8x8_mmx(int16_t *Dst,
939 :     ; const uint8_t *Src, const int BpS);
940 :     ;
941 :     ;===========================================================================
942 :    
943 :     %macro DIFF_TWO_LINES_1331 1 ; %1: dst
944 :     HFILTER_1331 edx , mm5
945 :     HFILTER_1331 edx+eax, mm6
946 :     lea edx, [edx+2*eax]
947 :     movq mm2, [%1]
948 :     VFILTER_1331 mm3,mm4,mm5, mm6
949 :     psubsw mm2, mm3
950 :     movq [%1], mm2
951 :    
952 :     HFILTER_1331 edx , mm3
953 :     HFILTER_1331 edx+eax, mm4
954 :     lea edx, [edx+2*eax]
955 :     movq mm2, [%1+16]
956 :     VFILTER_1331 mm5,mm6,mm3,mm4
957 :     psubsw mm2, mm5
958 :     movq [%1+16], mm2
959 :     %endmacro
960 :    
961 :     align 16
962 :     xvid_Filter_Diff_18x18_To_8x8_mmx: ; 302c
963 :    
964 :     mov ecx, [esp+4] ; Dst
965 :     mov edx, [esp+8] ; Src
966 :     mov eax, [esp+12] ; BpS
967 :    
968 :     movq mm7, [Cst3]
969 :     sub edx, eax
970 :    
971 :     ; mm3/mm4/mm5/mm6 is used as a 4-samples delay line.
972 :    
973 :     ; process columns 0-3
974 :    
975 :     HFILTER_1331 edx , mm3 ; pre-load mm3/mm4
976 :     HFILTER_1331 edx+eax, mm4
977 :     lea edx, [edx+2*eax]
978 :    
979 :     DIFF_TWO_LINES_1331 ecx + 0*16
980 :     DIFF_TWO_LINES_1331 ecx + 2*16
981 :     DIFF_TWO_LINES_1331 ecx + 4*16
982 :     DIFF_TWO_LINES_1331 ecx + 6*16
983 :    
984 :     ; process columns 4-7
985 :     mov edx, [esp+8]
986 :     sub edx, eax
987 :     add edx, 8
988 :    
989 :     HFILTER_1331 edx , mm3 ; pre-load mm3/mm4
990 :     HFILTER_1331 edx+eax, mm4
991 :     lea edx, [edx+2*eax]
992 :    
993 :     DIFF_TWO_LINES_1331 ecx + 0*16 +8
994 :     DIFF_TWO_LINES_1331 ecx + 2*16 +8
995 :     DIFF_TWO_LINES_1331 ecx + 4*16 +8
996 :     DIFF_TWO_LINES_1331 ecx + 6*16 +8
997 :    
998 :     ret
999 : edgomez 1540 .endfunc
1000 : edgomez 851
1001 :     ;//////////////////////////////////////////////////////////////////////
1002 :    
1003 :     ; pfeewwww... Never Do That On Stage Again. :)
1004 :    

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