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

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