[svn] / trunk / xvidcore / src / utils / x86_asm / mem_transfer_mmx.asm Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/utils/x86_asm/mem_transfer_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1540 - (view) (download)

1 : edgomez 1382 ;/****************************************************************************
2 : Isibaar 3 ; *
3 : edgomez 1382 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - 8<->16 bit transfer functions -
5 : Isibaar 3 ; *
6 : edgomez 1382 ; * Copyright (C) 2001 Peter Ross <pross@xvid.org>
7 :     ; * 2001 Michael Militzer <isibaar@xvid.org>
8 :     ; * 2002 Pascal Massimino <skal@planet-d.net>
9 : Isibaar 3 ; *
10 : edgomez 1382 ; * This program is free software ; you can redistribute it and/or modify
11 :     ; * it under the terms of the GNU General Public License as published by
12 :     ; * the Free Software Foundation ; either version 2 of the License, or
13 :     ; * (at your option) any later version.
14 : Isibaar 3 ; *
15 : edgomez 1382 ; * This program is distributed in the hope that it will be useful,
16 :     ; * but WITHOUT ANY WARRANTY ; without even the implied warranty of
17 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 :     ; * GNU General Public License for more details.
19 : Isibaar 3 ; *
20 : edgomez 1382 ; * You should have received a copy of the GNU General Public License
21 :     ; * along with this program ; if not, write to the Free Software
22 :     ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 : Isibaar 3 ; *
24 : edgomez 1540 ; * $Id: mem_transfer_mmx.asm,v 1.15 2004-08-29 10:02:38 edgomez Exp $
25 : Isibaar 3 ; *
26 : edgomez 1382 ; ***************************************************************************/
27 : Isibaar 3
28 : edgomez 1382 BITS 32
29 : Isibaar 3
30 : edgomez 1382 %macro cglobal 1
31 : Isibaar 3 %ifdef PREFIX
32 : edgomez 1535 %ifdef MARK_FUNCS
33 : edgomez 1540 global _%1:function %1.endfunc-%1
34 :     %define %1 _%1:function %1.endfunc-%1
35 : edgomez 1535 %else
36 :     global _%1
37 :     %define %1 _%1
38 :     %endif
39 : Isibaar 3 %else
40 : edgomez 1535 %ifdef MARK_FUNCS
41 : edgomez 1540 global %1:function %1.endfunc-%1
42 : edgomez 1535 %else
43 :     global %1
44 :     %endif
45 : Isibaar 3 %endif
46 :     %endmacro
47 :    
48 : edgomez 1382 ;=============================================================================
49 :     ; Read only data
50 :     ;=============================================================================
51 : Isibaar 3
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 : Isibaar 3
58 : edgomez 1382 ALIGN 16
59 :     mmx_one:
60 :     dw 1, 1, 1, 1
61 :    
62 :     ;=============================================================================
63 :     ; Code
64 :     ;=============================================================================
65 :    
66 :     SECTION .text
67 :    
68 : Isibaar 226 cglobal transfer_8to16copy_mmx
69 :     cglobal transfer_16to8copy_mmx
70 :     cglobal transfer_8to16sub_mmx
71 : edgomez 851 cglobal transfer_8to16subro_mmx
72 : Isibaar 226 cglobal transfer_8to16sub2_mmx
73 :     cglobal transfer_8to16sub2_xmm
74 :     cglobal transfer_16to8add_mmx
75 :     cglobal transfer8x8_copy_mmx
76 : Isibaar 3
77 : edgomez 1382 ;-----------------------------------------------------------------------------
78 : Isibaar 3 ;
79 :     ; void transfer_8to16copy_mmx(int16_t * const dst,
80 :     ; const uint8_t * const src,
81 :     ; uint32_t stride);
82 :     ;
83 : edgomez 1382 ;-----------------------------------------------------------------------------
84 : Isibaar 3
85 : Isibaar 226 %macro COPY_8_TO_16 1
86 :     movq mm0, [eax]
87 :     movq mm1, [eax+edx]
88 :     movq mm2, mm0
89 :     movq mm3, mm1
90 :     punpcklbw mm0, mm7
91 :     movq [ecx+%1*32], mm0
92 :     punpcklbw mm1, mm7
93 :     movq [ecx+%1*32+16], mm1
94 :     punpckhbw mm2, mm7
95 :     punpckhbw mm3, mm7
96 : edgomez 1382 lea eax, [eax+2*edx]
97 : Isibaar 226 movq [ecx+%1*32+8], mm2
98 :     movq [ecx+%1*32+24], mm3
99 :     %endmacro
100 :    
101 : edgomez 1382 ALIGN 16
102 : Isibaar 226 transfer_8to16copy_mmx:
103 : Isibaar 3
104 : Isibaar 226 mov ecx, [esp+ 4] ; Dst
105 :     mov eax, [esp+ 8] ; Src
106 :     mov edx, [esp+12] ; Stride
107 : edgomez 1382 pxor mm7, mm7
108 : Isibaar 3
109 : Isibaar 226 COPY_8_TO_16 0
110 :     COPY_8_TO_16 1
111 :     COPY_8_TO_16 2
112 :     COPY_8_TO_16 3
113 :     ret
114 : edgomez 1540 .endfunc
115 : Isibaar 3
116 : edgomez 1382 ;-----------------------------------------------------------------------------
117 : Isibaar 3 ;
118 :     ; void transfer_16to8copy_mmx(uint8_t * const dst,
119 :     ; const int16_t * const src,
120 :     ; uint32_t stride);
121 :     ;
122 : edgomez 1382 ;-----------------------------------------------------------------------------
123 : Isibaar 3
124 : Isibaar 226 %macro COPY_16_TO_8 1
125 :     movq mm0, [eax+%1*32]
126 :     movq mm1, [eax+%1*32+8]
127 :     packuswb mm0, mm1
128 :     movq [ecx], mm0
129 :     movq mm2, [eax+%1*32+16]
130 :     movq mm3, [eax+%1*32+24]
131 :     packuswb mm2, mm3
132 :     movq [ecx+edx], mm2
133 :     %endmacro
134 :    
135 : edgomez 1382 ALIGN 16
136 : Isibaar 226 transfer_16to8copy_mmx:
137 : Isibaar 3
138 : Isibaar 226 mov ecx, [esp+ 4] ; Dst
139 :     mov eax, [esp+ 8] ; Src
140 :     mov edx, [esp+12] ; Stride
141 : Isibaar 3
142 : Isibaar 226 COPY_16_TO_8 0
143 :     lea ecx,[ecx+2*edx]
144 :     COPY_16_TO_8 1
145 :     lea ecx,[ecx+2*edx]
146 :     COPY_16_TO_8 2
147 :     lea ecx,[ecx+2*edx]
148 :     COPY_16_TO_8 3
149 :     ret
150 : edgomez 1540 .endfunc
151 : Isibaar 3
152 : edgomez 1382 ;-----------------------------------------------------------------------------
153 : Isibaar 3 ;
154 :     ; void transfer_8to16sub_mmx(int16_t * const dct,
155 :     ; uint8_t * const cur,
156 :     ; const uint8_t * const ref,
157 :     ; const uint32_t stride);
158 :     ;
159 : edgomez 1382 ;-----------------------------------------------------------------------------
160 : Isibaar 3
161 : edgomez 851 ; when second argument == 1, reference (ebx) block is to current (eax)
162 :     %macro COPY_8_TO_16_SUB 2
163 : Isibaar 226 movq mm0, [eax] ; cur
164 :     movq mm2, [eax+edx]
165 : edgomez 1425 movq mm1, mm0
166 :     movq mm3, mm2
167 : Isibaar 3
168 : edgomez 1425 punpcklbw mm0, mm7
169 :     punpcklbw mm2, mm7
170 : Isibaar 226 movq mm4, [ebx] ; ref
171 : edgomez 1425 punpckhbw mm1, mm7
172 :     punpckhbw mm3, mm7
173 : Isibaar 226 movq mm5, [ebx+edx] ; ref
174 : Isibaar 3
175 : edgomez 1425 movq mm6, mm4
176 : edgomez 851 %if %2 == 1
177 : Isibaar 226 movq [eax], mm4
178 :     movq [eax+edx], mm5
179 : edgomez 851 %endif
180 : edgomez 1425 punpcklbw mm4, mm7
181 :     punpckhbw mm6, mm7
182 :     psubsw mm0, mm4
183 :     psubsw mm1, mm6
184 :     movq mm6, mm5
185 :     punpcklbw mm5, mm7
186 :     punpckhbw mm6, mm7
187 :     psubsw mm2, mm5
188 : edgomez 1382 lea eax, [eax+2*edx]
189 : edgomez 1425 psubsw mm3, mm6
190 : Isibaar 226 lea ebx,[ebx+2*edx]
191 : Isibaar 3
192 : Isibaar 226 movq [ecx+%1*32+ 0], mm0 ; dst
193 : edgomez 851 movq [ecx+%1*32+ 8], mm1
194 :     movq [ecx+%1*32+16], mm2
195 :     movq [ecx+%1*32+24], mm3
196 : Isibaar 226 %endmacro
197 : Isibaar 3
198 : edgomez 1382 ALIGN 16
199 : Isibaar 226 transfer_8to16sub_mmx:
200 :     mov ecx, [esp + 4] ; Dst
201 :     mov eax, [esp + 8] ; Cur
202 :     push ebx
203 :     mov ebx, [esp+4+12] ; Ref
204 :     mov edx, [esp+4+16] ; Stride
205 :     pxor mm7, mm7
206 : Isibaar 3
207 : edgomez 851 COPY_8_TO_16_SUB 0, 1
208 :     COPY_8_TO_16_SUB 1, 1
209 :     COPY_8_TO_16_SUB 2, 1
210 :     COPY_8_TO_16_SUB 3, 1
211 : Isibaar 3
212 : Isibaar 226 pop ebx
213 :     ret
214 : edgomez 1540 .endfunc
215 : Isibaar 3
216 : edgomez 851
217 : edgomez 1382 ALIGN 16
218 : edgomez 851 transfer_8to16subro_mmx:
219 :     mov ecx, [esp + 4] ; Dst
220 :     mov eax, [esp + 8] ; Cur
221 :     push ebx
222 :     mov ebx, [esp+4+12] ; Ref
223 :     mov edx, [esp+4+16] ; Stride
224 :     pxor mm7, mm7
225 :    
226 :     COPY_8_TO_16_SUB 0, 0
227 :     COPY_8_TO_16_SUB 1, 0
228 :     COPY_8_TO_16_SUB 2, 0
229 :     COPY_8_TO_16_SUB 3, 0
230 :    
231 :     pop ebx
232 :     ret
233 : edgomez 1540 .endfunc
234 : edgomez 851
235 :    
236 : edgomez 1382 ;-----------------------------------------------------------------------------
237 : Isibaar 226 ;
238 :     ; void transfer_8to16sub2_mmx(int16_t * const dct,
239 :     ; uint8_t * const cur,
240 :     ; const uint8_t * ref1,
241 :     ; const uint8_t * ref2,
242 :     ; const uint32_t stride)
243 :     ;
244 : edgomez 1382 ;-----------------------------------------------------------------------------
245 : Isibaar 3
246 : Isibaar 226 %macro COPY_8_TO_16_SUB2_MMX 1
247 :     movq mm0, [eax] ; cur
248 :     movq mm2, [eax+edx]
249 : edgomez 1425
250 : edgomez 1382 ; mm4 <- (ref1+ref2+1) / 2
251 : Isibaar 226 movq mm4, [ebx] ; ref1
252 :     movq mm1, [esi] ; ref2
253 : edgomez 1425 movq mm6, mm4
254 :     movq mm3, mm1
255 :     punpcklbw mm4, mm7
256 :     punpcklbw mm1, mm7
257 :     punpckhbw mm6, mm7
258 :     punpckhbw mm3, mm7
259 :     paddusw mm4, mm1
260 :     paddusw mm6, mm3
261 :     paddusw mm4, [mmx_one]
262 :     paddusw mm6, [mmx_one]
263 :     psrlw mm4, 1
264 :     psrlw mm6, 1
265 :     packuswb mm4, mm6
266 :     movq [eax], mm4
267 :    
268 :     ; mm5 <- (ref1+ref2+1) / 2
269 : Isibaar 226 movq mm5, [ebx+edx] ; ref1
270 :     movq mm1, [esi+edx] ; ref2
271 : edgomez 1425 movq mm6, mm5
272 :     movq mm3, mm1
273 :     punpcklbw mm5, mm7
274 :     punpcklbw mm1, mm7
275 :     punpckhbw mm6, mm7
276 :     punpckhbw mm3, mm7
277 :     paddusw mm5, mm1
278 :     paddusw mm6, mm3
279 :     paddusw mm5, [mmx_one]
280 :     paddusw mm6, [mmx_one]
281 : edgomez 1382 lea esi, [esi+2*edx]
282 : edgomez 1425 psrlw mm5, 1
283 :     psrlw mm6, 1
284 :     packuswb mm5, mm6
285 :     movq [eax+edx], mm5
286 :    
287 :     movq mm1, mm0
288 :     movq mm3, mm2
289 :     punpcklbw mm0, mm7
290 :     punpcklbw mm2, mm7
291 :     punpckhbw mm1, mm7
292 :     punpckhbw mm3, mm7
293 :    
294 :     movq mm6, mm4
295 :     punpcklbw mm4, mm7
296 :     punpckhbw mm6, mm7
297 :     psubsw mm0, mm4
298 :     psubsw mm1, mm6
299 :     movq mm6, mm5
300 :     punpcklbw mm5, mm7
301 :     punpckhbw mm6, mm7
302 :     psubsw mm2, mm5
303 : edgomez 1382 lea eax, [eax+2*edx]
304 : edgomez 1425 psubsw mm3, mm6
305 : edgomez 1382 lea ebx, [ebx+2*edx]
306 : edgomez 1425
307 : Isibaar 226 movq [ecx+%1*32+ 0], mm0 ; dst
308 : edgomez 1382 movq [ecx+%1*32+ 8], mm1
309 :     movq [ecx+%1*32+16], mm2
310 :     movq [ecx+%1*32+24], mm3
311 : Isibaar 226 %endmacro
312 : Isibaar 3
313 : edgomez 1382 ALIGN 16
314 : Isibaar 226 transfer_8to16sub2_mmx:
315 :     mov ecx, [esp + 4] ; Dst
316 :     mov eax, [esp + 8] ; Cur
317 :     push ebx
318 :     mov ebx, [esp+4+12] ; Ref1
319 :     push esi
320 :     mov esi, [esp+8+16] ; Ref2
321 :     mov edx, [esp+8+20] ; Stride
322 :     pxor mm7, mm7
323 : Isibaar 3
324 : Isibaar 226 COPY_8_TO_16_SUB2_MMX 0
325 :     COPY_8_TO_16_SUB2_MMX 1
326 :     COPY_8_TO_16_SUB2_MMX 2
327 :     COPY_8_TO_16_SUB2_MMX 3
328 : Isibaar 3
329 : Isibaar 226 pop esi
330 :     pop ebx
331 :     ret
332 : edgomez 1540 .endfunc
333 : Isibaar 3
334 : edgomez 1382 ;-----------------------------------------------------------------------------
335 : edgomez 215 ;
336 :     ; void transfer_8to16sub2_xmm(int16_t * const dct,
337 : Isibaar 226 ; uint8_t * const cur,
338 :     ; const uint8_t * ref1,
339 :     ; const uint8_t * ref2,
340 :     ; const uint32_t stride)
341 : edgomez 215 ;
342 : edgomez 1382 ;-----------------------------------------------------------------------------
343 : Isibaar 3
344 : Isibaar 226 %macro COPY_8_TO_16_SUB2_SSE 1
345 :     movq mm0, [eax] ; cur
346 :     movq mm2, [eax+edx]
347 : edgomez 1425 movq mm1, mm0
348 :     movq mm3, mm2
349 : edgomez 215
350 : edgomez 1425 punpcklbw mm0, mm7
351 :     punpcklbw mm2, mm7
352 : edgomez 1382 movq mm4, [ebx] ; ref1
353 : Isibaar 226 pavgb mm4, [esi] ; ref2
354 : edgomez 1425 movq [eax], mm4
355 :     punpckhbw mm1, mm7
356 :     punpckhbw mm3, mm7
357 : edgomez 1382 movq mm5, [ebx+edx] ; ref
358 : Isibaar 226 pavgb mm5, [esi+edx] ; ref2
359 : edgomez 1425 movq [eax+edx], mm5
360 : edgomez 215
361 : edgomez 1425 movq mm6, mm4
362 :     punpcklbw mm4, mm7
363 :     punpckhbw mm6, mm7
364 :     psubsw mm0, mm4
365 :     psubsw mm1, mm6
366 : edgomez 1382 lea esi, [esi+2*edx]
367 : edgomez 1425 movq mm6, mm5
368 :     punpcklbw mm5, mm7
369 :     punpckhbw mm6, mm7
370 :     psubsw mm2, mm5
371 : edgomez 1382 lea eax, [eax+2*edx]
372 : edgomez 1425 psubsw mm3, mm6
373 : edgomez 1382 lea ebx, [ebx+2*edx]
374 : edgomez 1425
375 : Isibaar 226 movq [ecx+%1*32+ 0], mm0 ; dst
376 : edgomez 1382 movq [ecx+%1*32+ 8], mm1
377 :     movq [ecx+%1*32+16], mm2
378 :     movq [ecx+%1*32+24], mm3
379 : Isibaar 226 %endmacro
380 : edgomez 215
381 : edgomez 1382 ALIGN 16
382 : Isibaar 226 transfer_8to16sub2_xmm:
383 :     mov ecx, [esp + 4] ; Dst
384 :     mov eax, [esp + 8] ; Cur
385 :     push ebx
386 :     mov ebx, [esp+4+12] ; Ref1
387 :     push esi
388 :     mov esi, [esp+8+16] ; Ref2
389 :     mov edx, [esp+8+20] ; Stride
390 :     pxor mm7, mm7
391 : edgomez 215
392 : Isibaar 226 COPY_8_TO_16_SUB2_SSE 0
393 :     COPY_8_TO_16_SUB2_SSE 1
394 :     COPY_8_TO_16_SUB2_SSE 2
395 :     COPY_8_TO_16_SUB2_SSE 3
396 : edgomez 215
397 : Isibaar 226 pop esi
398 :     pop ebx
399 :     ret
400 : edgomez 1540 .endfunc
401 : edgomez 215
402 : edgomez 1382 ;-----------------------------------------------------------------------------
403 : Isibaar 3 ;
404 :     ; void transfer_16to8add_mmx(uint8_t * const dst,
405 :     ; const int16_t * const src,
406 :     ; uint32_t stride);
407 :     ;
408 : edgomez 1382 ;-----------------------------------------------------------------------------
409 : Isibaar 3
410 : Isibaar 226 %macro COPY_16_TO_8_ADD 1
411 : edgomez 1425 movq mm0, [ecx]
412 :     movq mm2, [ecx+edx]
413 :     movq mm1, mm0
414 :     movq mm3, mm2
415 :     punpcklbw mm0, mm7
416 :     punpcklbw mm2, mm7
417 :     punpckhbw mm1, mm7
418 :     punpckhbw mm3, mm7
419 :     paddsw mm0, [eax+%1*32+ 0]
420 :     paddsw mm1, [eax+%1*32+ 8]
421 :     paddsw mm2, [eax+%1*32+16]
422 :     paddsw mm3, [eax+%1*32+24]
423 :     packuswb mm0, mm1
424 :     movq [ecx], mm0
425 :     packuswb mm2, mm3
426 :     movq [ecx+edx], mm2
427 : Isibaar 226 %endmacro
428 : Isibaar 3
429 :    
430 : edgomez 1382 ALIGN 16
431 : Isibaar 226 transfer_16to8add_mmx:
432 :     mov ecx, [esp+ 4] ; Dst
433 :     mov eax, [esp+ 8] ; Src
434 :     mov edx, [esp+12] ; Stride
435 : edgomez 1425 pxor mm7, mm7
436 : Isibaar 3
437 : Isibaar 226 COPY_16_TO_8_ADD 0
438 :     lea ecx,[ecx+2*edx]
439 :     COPY_16_TO_8_ADD 1
440 :     lea ecx,[ecx+2*edx]
441 :     COPY_16_TO_8_ADD 2
442 :     lea ecx,[ecx+2*edx]
443 :     COPY_16_TO_8_ADD 3
444 :     ret
445 : edgomez 1540 .endfunc
446 : Isibaar 3
447 : edgomez 1382 ;-----------------------------------------------------------------------------
448 : Isibaar 3 ;
449 :     ; void transfer8x8_copy_mmx(uint8_t * const dst,
450 :     ; const uint8_t * const src,
451 :     ; const uint32_t stride);
452 :     ;
453 :     ;
454 : edgomez 1382 ;-----------------------------------------------------------------------------
455 : Isibaar 3
456 : edgomez 1425 %macro COPY_8_TO_8 0
457 :     movq mm0, [eax]
458 :     movq mm1, [eax+edx]
459 :     movq [ecx], mm0
460 :     lea eax, [eax+2*edx]
461 :     movq [ecx+edx], mm1
462 :     %endmacro
463 :    
464 : edgomez 1382 ALIGN 16
465 : Isibaar 226 transfer8x8_copy_mmx:
466 : edgomez 1425 mov ecx, [esp+ 4] ; Dst
467 : Isibaar 226 mov eax, [esp+ 8] ; Src
468 :     mov edx, [esp+12] ; Stride
469 : Isibaar 3
470 : edgomez 1425 COPY_8_TO_8
471 :     lea ecx,[ecx+2*edx]
472 :     COPY_8_TO_8
473 :     lea ecx,[ecx+2*edx]
474 :     COPY_8_TO_8
475 :     lea ecx,[ecx+2*edx]
476 :     COPY_8_TO_8
477 :     ret
478 : edgomez 1540 .endfunc
479 :    

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