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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1198 - (view) (download)

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

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