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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.14 - (view) (download)

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

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