[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 1425 - (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 1425 ; * $Id: mem_transfer_mmx.asm,v 1.12 2004-04-13 20:06:53 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 1382 global _%1
33 : Isibaar 3 %define %1 _%1
34 :     %else
35 :     global %1
36 :     %endif
37 :     %endmacro
38 :    
39 : edgomez 1382 ;=============================================================================
40 :     ; Read only data
41 :     ;=============================================================================
42 : Isibaar 3
43 : edgomez 1382 %ifdef FORMAT_COFF
44 :     SECTION .rodata data
45 :     %else
46 :     SECTION .rodata data align=16
47 :     %endif
48 : Isibaar 3
49 : edgomez 1382 ALIGN 16
50 :     mmx_one:
51 :     dw 1, 1, 1, 1
52 :    
53 :     ;=============================================================================
54 :     ; Code
55 :     ;=============================================================================
56 :    
57 :     SECTION .text
58 :    
59 : Isibaar 226 cglobal transfer_8to16copy_mmx
60 :     cglobal transfer_16to8copy_mmx
61 :     cglobal transfer_8to16sub_mmx
62 : edgomez 851 cglobal transfer_8to16subro_mmx
63 : Isibaar 226 cglobal transfer_8to16sub2_mmx
64 :     cglobal transfer_8to16sub2_xmm
65 :     cglobal transfer_16to8add_mmx
66 :     cglobal transfer8x8_copy_mmx
67 : Isibaar 3
68 : edgomez 1382 ;-----------------------------------------------------------------------------
69 : Isibaar 3 ;
70 :     ; void transfer_8to16copy_mmx(int16_t * const dst,
71 :     ; const uint8_t * const src,
72 :     ; uint32_t stride);
73 :     ;
74 : edgomez 1382 ;-----------------------------------------------------------------------------
75 : Isibaar 3
76 : Isibaar 226 %macro COPY_8_TO_16 1
77 :     movq mm0, [eax]
78 :     movq mm1, [eax+edx]
79 :     movq mm2, mm0
80 :     movq mm3, mm1
81 :     punpcklbw mm0, mm7
82 :     movq [ecx+%1*32], mm0
83 :     punpcklbw mm1, mm7
84 :     movq [ecx+%1*32+16], mm1
85 :     punpckhbw mm2, mm7
86 :     punpckhbw mm3, mm7
87 : edgomez 1382 lea eax, [eax+2*edx]
88 : Isibaar 226 movq [ecx+%1*32+8], mm2
89 :     movq [ecx+%1*32+24], mm3
90 :     %endmacro
91 :    
92 : edgomez 1382 ALIGN 16
93 : Isibaar 226 transfer_8to16copy_mmx:
94 : Isibaar 3
95 : Isibaar 226 mov ecx, [esp+ 4] ; Dst
96 :     mov eax, [esp+ 8] ; Src
97 :     mov edx, [esp+12] ; Stride
98 : edgomez 1382 pxor mm7, mm7
99 : Isibaar 3
100 : Isibaar 226 COPY_8_TO_16 0
101 :     COPY_8_TO_16 1
102 :     COPY_8_TO_16 2
103 :     COPY_8_TO_16 3
104 :     ret
105 : Isibaar 3
106 : edgomez 1382 ;-----------------------------------------------------------------------------
107 : Isibaar 3 ;
108 :     ; void transfer_16to8copy_mmx(uint8_t * const dst,
109 :     ; const int16_t * const src,
110 :     ; uint32_t stride);
111 :     ;
112 : edgomez 1382 ;-----------------------------------------------------------------------------
113 : Isibaar 3
114 : Isibaar 226 %macro COPY_16_TO_8 1
115 :     movq mm0, [eax+%1*32]
116 :     movq mm1, [eax+%1*32+8]
117 :     packuswb mm0, mm1
118 :     movq [ecx], mm0
119 :     movq mm2, [eax+%1*32+16]
120 :     movq mm3, [eax+%1*32+24]
121 :     packuswb mm2, mm3
122 :     movq [ecx+edx], mm2
123 :     %endmacro
124 :    
125 : edgomez 1382 ALIGN 16
126 : Isibaar 226 transfer_16to8copy_mmx:
127 : Isibaar 3
128 : Isibaar 226 mov ecx, [esp+ 4] ; Dst
129 :     mov eax, [esp+ 8] ; Src
130 :     mov edx, [esp+12] ; Stride
131 : Isibaar 3
132 : Isibaar 226 COPY_16_TO_8 0
133 :     lea ecx,[ecx+2*edx]
134 :     COPY_16_TO_8 1
135 :     lea ecx,[ecx+2*edx]
136 :     COPY_16_TO_8 2
137 :     lea ecx,[ecx+2*edx]
138 :     COPY_16_TO_8 3
139 :     ret
140 : Isibaar 3
141 : edgomez 1382 ;-----------------------------------------------------------------------------
142 : Isibaar 3 ;
143 :     ; void transfer_8to16sub_mmx(int16_t * const dct,
144 :     ; uint8_t * const cur,
145 :     ; const uint8_t * const ref,
146 :     ; const uint32_t stride);
147 :     ;
148 : edgomez 1382 ;-----------------------------------------------------------------------------
149 : Isibaar 3
150 : edgomez 851 ; when second argument == 1, reference (ebx) block is to current (eax)
151 :     %macro COPY_8_TO_16_SUB 2
152 : Isibaar 226 movq mm0, [eax] ; cur
153 :     movq mm2, [eax+edx]
154 : edgomez 1425 movq mm1, mm0
155 :     movq mm3, mm2
156 : Isibaar 3
157 : edgomez 1425 punpcklbw mm0, mm7
158 :     punpcklbw mm2, mm7
159 : Isibaar 226 movq mm4, [ebx] ; ref
160 : edgomez 1425 punpckhbw mm1, mm7
161 :     punpckhbw mm3, mm7
162 : Isibaar 226 movq mm5, [ebx+edx] ; ref
163 : Isibaar 3
164 : edgomez 1425 movq mm6, mm4
165 : edgomez 851 %if %2 == 1
166 : Isibaar 226 movq [eax], mm4
167 :     movq [eax+edx], mm5
168 : edgomez 851 %endif
169 : edgomez 1425 punpcklbw mm4, mm7
170 :     punpckhbw mm6, mm7
171 :     psubsw mm0, mm4
172 :     psubsw mm1, mm6
173 :     movq mm6, mm5
174 :     punpcklbw mm5, mm7
175 :     punpckhbw mm6, mm7
176 :     psubsw mm2, mm5
177 : edgomez 1382 lea eax, [eax+2*edx]
178 : edgomez 1425 psubsw mm3, mm6
179 : Isibaar 226 lea ebx,[ebx+2*edx]
180 : Isibaar 3
181 : Isibaar 226 movq [ecx+%1*32+ 0], mm0 ; dst
182 : edgomez 851 movq [ecx+%1*32+ 8], mm1
183 :     movq [ecx+%1*32+16], mm2
184 :     movq [ecx+%1*32+24], mm3
185 : Isibaar 226 %endmacro
186 : Isibaar 3
187 : edgomez 1382 ALIGN 16
188 : Isibaar 226 transfer_8to16sub_mmx:
189 :     mov ecx, [esp + 4] ; Dst
190 :     mov eax, [esp + 8] ; Cur
191 :     push ebx
192 :     mov ebx, [esp+4+12] ; Ref
193 :     mov edx, [esp+4+16] ; Stride
194 :     pxor mm7, mm7
195 : Isibaar 3
196 : edgomez 851 COPY_8_TO_16_SUB 0, 1
197 :     COPY_8_TO_16_SUB 1, 1
198 :     COPY_8_TO_16_SUB 2, 1
199 :     COPY_8_TO_16_SUB 3, 1
200 : Isibaar 3
201 : Isibaar 226 pop ebx
202 :     ret
203 : Isibaar 3
204 : edgomez 851
205 : edgomez 1382 ALIGN 16
206 : edgomez 851 transfer_8to16subro_mmx:
207 :     mov ecx, [esp + 4] ; Dst
208 :     mov eax, [esp + 8] ; Cur
209 :     push ebx
210 :     mov ebx, [esp+4+12] ; Ref
211 :     mov edx, [esp+4+16] ; Stride
212 :     pxor mm7, mm7
213 :    
214 :     COPY_8_TO_16_SUB 0, 0
215 :     COPY_8_TO_16_SUB 1, 0
216 :     COPY_8_TO_16_SUB 2, 0
217 :     COPY_8_TO_16_SUB 3, 0
218 :    
219 :     pop ebx
220 :     ret
221 :    
222 :    
223 : edgomez 1382 ;-----------------------------------------------------------------------------
224 : Isibaar 226 ;
225 :     ; void transfer_8to16sub2_mmx(int16_t * const dct,
226 :     ; uint8_t * const cur,
227 :     ; const uint8_t * ref1,
228 :     ; const uint8_t * ref2,
229 :     ; const uint32_t stride)
230 :     ;
231 : edgomez 1382 ;-----------------------------------------------------------------------------
232 : Isibaar 3
233 : Isibaar 226 %macro COPY_8_TO_16_SUB2_MMX 1
234 :     movq mm0, [eax] ; cur
235 :     movq mm2, [eax+edx]
236 : edgomez 1425
237 : edgomez 1382 ; mm4 <- (ref1+ref2+1) / 2
238 : Isibaar 226 movq mm4, [ebx] ; ref1
239 :     movq mm1, [esi] ; ref2
240 : edgomez 1425 movq mm6, mm4
241 :     movq mm3, mm1
242 :     punpcklbw mm4, mm7
243 :     punpcklbw mm1, mm7
244 :     punpckhbw mm6, mm7
245 :     punpckhbw mm3, mm7
246 :     paddusw mm4, mm1
247 :     paddusw mm6, mm3
248 :     paddusw mm4, [mmx_one]
249 :     paddusw mm6, [mmx_one]
250 :     psrlw mm4, 1
251 :     psrlw mm6, 1
252 :     packuswb mm4, mm6
253 :     movq [eax], mm4
254 :    
255 :     ; mm5 <- (ref1+ref2+1) / 2
256 : Isibaar 226 movq mm5, [ebx+edx] ; ref1
257 :     movq mm1, [esi+edx] ; ref2
258 : edgomez 1425 movq mm6, mm5
259 :     movq mm3, mm1
260 :     punpcklbw mm5, mm7
261 :     punpcklbw mm1, mm7
262 :     punpckhbw mm6, mm7
263 :     punpckhbw mm3, mm7
264 :     paddusw mm5, mm1
265 :     paddusw mm6, mm3
266 :     paddusw mm5, [mmx_one]
267 :     paddusw mm6, [mmx_one]
268 : edgomez 1382 lea esi, [esi+2*edx]
269 : edgomez 1425 psrlw mm5, 1
270 :     psrlw mm6, 1
271 :     packuswb mm5, mm6
272 :     movq [eax+edx], mm5
273 :    
274 :     movq mm1, mm0
275 :     movq mm3, mm2
276 :     punpcklbw mm0, mm7
277 :     punpcklbw mm2, mm7
278 :     punpckhbw mm1, mm7
279 :     punpckhbw mm3, mm7
280 :    
281 :     movq mm6, mm4
282 :     punpcklbw mm4, mm7
283 :     punpckhbw mm6, mm7
284 :     psubsw mm0, mm4
285 :     psubsw mm1, mm6
286 :     movq mm6, mm5
287 :     punpcklbw mm5, mm7
288 :     punpckhbw mm6, mm7
289 :     psubsw mm2, mm5
290 : edgomez 1382 lea eax, [eax+2*edx]
291 : edgomez 1425 psubsw mm3, mm6
292 : edgomez 1382 lea ebx, [ebx+2*edx]
293 : edgomez 1425
294 : Isibaar 226 movq [ecx+%1*32+ 0], mm0 ; dst
295 : edgomez 1382 movq [ecx+%1*32+ 8], mm1
296 :     movq [ecx+%1*32+16], mm2
297 :     movq [ecx+%1*32+24], mm3
298 : Isibaar 226 %endmacro
299 : Isibaar 3
300 : edgomez 1382 ALIGN 16
301 : Isibaar 226 transfer_8to16sub2_mmx:
302 :     mov ecx, [esp + 4] ; Dst
303 :     mov eax, [esp + 8] ; Cur
304 :     push ebx
305 :     mov ebx, [esp+4+12] ; Ref1
306 :     push esi
307 :     mov esi, [esp+8+16] ; Ref2
308 :     mov edx, [esp+8+20] ; Stride
309 :     pxor mm7, mm7
310 : Isibaar 3
311 : Isibaar 226 COPY_8_TO_16_SUB2_MMX 0
312 :     COPY_8_TO_16_SUB2_MMX 1
313 :     COPY_8_TO_16_SUB2_MMX 2
314 :     COPY_8_TO_16_SUB2_MMX 3
315 : Isibaar 3
316 : Isibaar 226 pop esi
317 :     pop ebx
318 :     ret
319 : Isibaar 3
320 : edgomez 1382 ;-----------------------------------------------------------------------------
321 : edgomez 215 ;
322 :     ; void transfer_8to16sub2_xmm(int16_t * const dct,
323 : Isibaar 226 ; uint8_t * const cur,
324 :     ; const uint8_t * ref1,
325 :     ; const uint8_t * ref2,
326 :     ; const uint32_t stride)
327 : edgomez 215 ;
328 : edgomez 1382 ;-----------------------------------------------------------------------------
329 : Isibaar 3
330 : Isibaar 226 %macro COPY_8_TO_16_SUB2_SSE 1
331 :     movq mm0, [eax] ; cur
332 :     movq mm2, [eax+edx]
333 : edgomez 1425 movq mm1, mm0
334 :     movq mm3, mm2
335 : edgomez 215
336 : edgomez 1425 punpcklbw mm0, mm7
337 :     punpcklbw mm2, mm7
338 : edgomez 1382 movq mm4, [ebx] ; ref1
339 : Isibaar 226 pavgb mm4, [esi] ; ref2
340 : edgomez 1425 movq [eax], mm4
341 :     punpckhbw mm1, mm7
342 :     punpckhbw mm3, mm7
343 : edgomez 1382 movq mm5, [ebx+edx] ; ref
344 : Isibaar 226 pavgb mm5, [esi+edx] ; ref2
345 : edgomez 1425 movq [eax+edx], mm5
346 : edgomez 215
347 : edgomez 1425 movq mm6, mm4
348 :     punpcklbw mm4, mm7
349 :     punpckhbw mm6, mm7
350 :     psubsw mm0, mm4
351 :     psubsw mm1, mm6
352 : edgomez 1382 lea esi, [esi+2*edx]
353 : edgomez 1425 movq mm6, mm5
354 :     punpcklbw mm5, mm7
355 :     punpckhbw mm6, mm7
356 :     psubsw mm2, mm5
357 : edgomez 1382 lea eax, [eax+2*edx]
358 : edgomez 1425 psubsw mm3, mm6
359 : edgomez 1382 lea ebx, [ebx+2*edx]
360 : edgomez 1425
361 : Isibaar 226 movq [ecx+%1*32+ 0], mm0 ; dst
362 : edgomez 1382 movq [ecx+%1*32+ 8], mm1
363 :     movq [ecx+%1*32+16], mm2
364 :     movq [ecx+%1*32+24], mm3
365 : Isibaar 226 %endmacro
366 : edgomez 215
367 : edgomez 1382 ALIGN 16
368 : Isibaar 226 transfer_8to16sub2_xmm:
369 :     mov ecx, [esp + 4] ; Dst
370 :     mov eax, [esp + 8] ; Cur
371 :     push ebx
372 :     mov ebx, [esp+4+12] ; Ref1
373 :     push esi
374 :     mov esi, [esp+8+16] ; Ref2
375 :     mov edx, [esp+8+20] ; Stride
376 :     pxor mm7, mm7
377 : edgomez 215
378 : Isibaar 226 COPY_8_TO_16_SUB2_SSE 0
379 :     COPY_8_TO_16_SUB2_SSE 1
380 :     COPY_8_TO_16_SUB2_SSE 2
381 :     COPY_8_TO_16_SUB2_SSE 3
382 : edgomez 215
383 : Isibaar 226 pop esi
384 :     pop ebx
385 :     ret
386 : edgomez 215
387 : edgomez 1382 ;-----------------------------------------------------------------------------
388 : Isibaar 3 ;
389 :     ; void transfer_16to8add_mmx(uint8_t * const dst,
390 :     ; const int16_t * const src,
391 :     ; uint32_t stride);
392 :     ;
393 : edgomez 1382 ;-----------------------------------------------------------------------------
394 : Isibaar 3
395 : Isibaar 226 %macro COPY_16_TO_8_ADD 1
396 : edgomez 1425 movq mm0, [ecx]
397 :     movq mm2, [ecx+edx]
398 :     movq mm1, mm0
399 :     movq mm3, mm2
400 :     punpcklbw mm0, mm7
401 :     punpcklbw mm2, mm7
402 :     punpckhbw mm1, mm7
403 :     punpckhbw mm3, mm7
404 :     paddsw mm0, [eax+%1*32+ 0]
405 :     paddsw mm1, [eax+%1*32+ 8]
406 :     paddsw mm2, [eax+%1*32+16]
407 :     paddsw mm3, [eax+%1*32+24]
408 :     packuswb mm0, mm1
409 :     movq [ecx], mm0
410 :     packuswb mm2, mm3
411 :     movq [ecx+edx], mm2
412 : Isibaar 226 %endmacro
413 : Isibaar 3
414 :    
415 : edgomez 1382 ALIGN 16
416 : Isibaar 226 transfer_16to8add_mmx:
417 :     mov ecx, [esp+ 4] ; Dst
418 :     mov eax, [esp+ 8] ; Src
419 :     mov edx, [esp+12] ; Stride
420 : edgomez 1425 pxor mm7, mm7
421 : Isibaar 3
422 : Isibaar 226 COPY_16_TO_8_ADD 0
423 :     lea ecx,[ecx+2*edx]
424 :     COPY_16_TO_8_ADD 1
425 :     lea ecx,[ecx+2*edx]
426 :     COPY_16_TO_8_ADD 2
427 :     lea ecx,[ecx+2*edx]
428 :     COPY_16_TO_8_ADD 3
429 :     ret
430 : Isibaar 3
431 : edgomez 1382 ;-----------------------------------------------------------------------------
432 : Isibaar 3 ;
433 :     ; void transfer8x8_copy_mmx(uint8_t * const dst,
434 :     ; const uint8_t * const src,
435 :     ; const uint32_t stride);
436 :     ;
437 :     ;
438 : edgomez 1382 ;-----------------------------------------------------------------------------
439 : Isibaar 3
440 : edgomez 1425 %macro COPY_8_TO_8 0
441 :     movq mm0, [eax]
442 :     movq mm1, [eax+edx]
443 :     movq [ecx], mm0
444 :     lea eax, [eax+2*edx]
445 :     movq [ecx+edx], mm1
446 :     %endmacro
447 :    
448 : edgomez 1382 ALIGN 16
449 : Isibaar 226 transfer8x8_copy_mmx:
450 : edgomez 1425 mov ecx, [esp+ 4] ; Dst
451 : Isibaar 226 mov eax, [esp+ 8] ; Src
452 :     mov edx, [esp+12] ; Stride
453 : Isibaar 3
454 : edgomez 1425 COPY_8_TO_8
455 :     lea ecx,[ecx+2*edx]
456 :     COPY_8_TO_8
457 :     lea ecx,[ecx+2*edx]
458 :     COPY_8_TO_8
459 :     lea ecx,[ecx+2*edx]
460 :     COPY_8_TO_8
461 :     ret

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