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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1535 - (view) (download)

1 : edgomez 1382 ;/****************************************************************************
2 : edgomez 851 ; *
3 : edgomez 1382 ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - 8<->16 bit transfer functions -
5 : edgomez 851 ; *
6 : edgomez 1382 ; * Copyright (C) 2002 Jaan Kalda
7 : edgomez 851 ; *
8 : edgomez 1382 ; * This program is free software ; you can redistribute it and/or modify
9 :     ; * it 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 : edgomez 851 ; *
13 : edgomez 1382 ; * 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 : edgomez 851 ; *
18 : edgomez 1382 ; * 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 : edgomez 851 ; *
22 : edgomez 1535 ; * $Id: mem_transfer_3dne.asm,v 1.5 2004-08-22 11:46:10 edgomez Exp $
23 : edgomez 1382 ; *
24 :     ; ***************************************************************************/
25 : edgomez 851
26 : edgomez 1382 ; these 3dne functions are compatible with iSSE, but are optimized specifically
27 :     ; for K7 pipelines
28 : edgomez 851
29 : edgomez 1382 BITS 32
30 : edgomez 851
31 : edgomez 1382 %macro cglobal 1
32 : edgomez 851 %ifdef PREFIX
33 : edgomez 1535 %ifdef MARK_FUNCS
34 :     global _%1:function
35 :     %define %1 _%1:function
36 :     %else
37 :     global _%1
38 :     %define %1 _%1
39 :     %endif
40 : edgomez 851 %else
41 : edgomez 1535 %ifdef MARK_FUNCS
42 :     global %1:function
43 :     %else
44 :     global %1
45 :     %endif
46 : edgomez 851 %endif
47 :     %endmacro
48 : edgomez 1382
49 :     ;=============================================================================
50 :     ; Read only data
51 :     ;=============================================================================
52 :    
53 :     %ifdef FORMAT_COFF
54 : edgomez 1519 SECTION .rodata
55 : edgomez 1382 %else
56 : edgomez 1519 SECTION .rodata align=16
57 : edgomez 1382 %endif
58 :    
59 :     ALIGN 8
60 :     mm_zero:
61 :     dd 0,0
62 :     ;=============================================================================
63 :     ; Macros
64 :     ;=============================================================================
65 :    
66 : edgomez 851 %macro nop4 0
67 : edgomez 1382 db 08Dh, 074h, 026h, 0
68 : edgomez 851 %endmacro
69 :    
70 : edgomez 1382 ;=============================================================================
71 :     ; Code
72 :     ;=============================================================================
73 : edgomez 851
74 : edgomez 1382 SECTION .text
75 :    
76 : edgomez 851 cglobal transfer_8to16copy_3dne
77 :     cglobal transfer_16to8copy_3dne
78 :     cglobal transfer_8to16sub_3dne
79 :     cglobal transfer_8to16subro_3dne
80 :     cglobal transfer_8to16sub2_3dne
81 :     cglobal transfer_16to8add_3dne
82 :     cglobal transfer8x8_copy_3dne
83 :    
84 : edgomez 1382 ;-----------------------------------------------------------------------------
85 : edgomez 851 ;
86 :     ; void transfer_8to16copy_3dne(int16_t * const dst,
87 :     ; const uint8_t * const src,
88 :     ; uint32_t stride);
89 :     ;
90 : edgomez 1382 ;-----------------------------------------------------------------------------
91 : edgomez 851
92 : edgomez 1382 ALIGN 16
93 : edgomez 851 transfer_8to16copy_3dne:
94 :    
95 :     mov eax, [esp+ 8] ; Src
96 :     mov edx, [esp+12] ; Stride
97 :     mov ecx, [esp+ 4] ; Dst
98 :     punpcklbw mm0, [byte eax]
99 :     punpcklbw mm1, [eax+4]
100 : edgomez 1382 movq mm2, [eax+edx]
101 :     movq mm3, [eax+edx]
102 :     pxor mm7, mm7
103 :     lea eax, [eax+2*edx]
104 :     punpcklbw mm2, mm7
105 :     punpckhbw mm3, mm7
106 :     psrlw mm0, 8
107 :     psrlw mm1, 8
108 : edgomez 851 punpcklbw mm4, [eax]
109 :     punpcklbw mm5, [eax+edx+4]
110 :     movq [byte ecx+0*64], mm0
111 :     movq [ecx+0*64+8], mm1
112 :     punpcklbw mm6, [eax+edx]
113 :     punpcklbw mm7, [eax+4]
114 : edgomez 1382 lea eax, [byte eax+2*edx]
115 :     psrlw mm4, 8
116 :     psrlw mm5, 8
117 : edgomez 851 punpcklbw mm0, [eax]
118 :     punpcklbw mm1, [eax+edx+4]
119 :     movq [ecx+0*64+16], mm2
120 :     movq [ecx+0*64+24], mm3
121 : edgomez 1382 psrlw mm6, 8
122 :     psrlw mm7, 8
123 : edgomez 851 punpcklbw mm2, [eax+edx]
124 :     punpcklbw mm3, [eax+4]
125 : edgomez 1382 lea eax, [byte eax+2*edx]
126 : edgomez 851 movq [byte ecx+0*64+32], mm4
127 :     movq [ecx+0*64+56], mm5
128 : edgomez 1382 psrlw mm0, 8
129 :     psrlw mm1, 8
130 : edgomez 851 punpcklbw mm4, [eax]
131 :     punpcklbw mm5, [eax+edx+4]
132 :     movq [byte ecx+0*64+48], mm6
133 :     movq [ecx+0*64+40], mm7
134 : edgomez 1382 psrlw mm2, 8
135 :     psrlw mm3, 8
136 : edgomez 851 punpcklbw mm6, [eax+edx]
137 :     punpcklbw mm7, [eax+4]
138 :     movq [byte ecx+1*64], mm0
139 :     movq [ecx+1*64+24], mm1
140 : edgomez 1382 psrlw mm4, 8
141 :     psrlw mm5, 8
142 : edgomez 851 movq [ecx+1*64+16], mm2
143 :     movq [ecx+1*64+8], mm3
144 : edgomez 1382 psrlw mm6, 8
145 :     psrlw mm7, 8
146 : edgomez 851 movq [byte ecx+1*64+32], mm4
147 : edgomez 1382 movq [ecx+1*64+56], mm5
148 : edgomez 851 movq [byte ecx+1*64+48], mm6
149 :     movq [ecx+1*64+40], mm7
150 : edgomez 1382 ret
151 : edgomez 851
152 : edgomez 1382
153 :    
154 :     ;-----------------------------------------------------------------------------
155 : edgomez 851 ;
156 :     ; void transfer_16to8copy_3dne(uint8_t * const dst,
157 :     ; const int16_t * const src,
158 :     ; uint32_t stride);
159 :     ;
160 : edgomez 1382 ;-----------------------------------------------------------------------------
161 : edgomez 851
162 : edgomez 1382 ALIGN 16
163 : edgomez 851 transfer_16to8copy_3dne:
164 :    
165 :     mov eax, [esp+ 8] ; Src
166 :     mov ecx, [esp+ 4] ; Dst
167 :     mov edx, [esp+12] ; Stride
168 :    
169 :     movq mm0, [byte eax+0*32]
170 : edgomez 1382 packuswb mm0, [eax+0*32+8]
171 : edgomez 851 movq mm1, [eax+0*32+16]
172 : edgomez 1382 packuswb mm1, [eax+0*32+24]
173 : edgomez 851 movq mm5, [eax+2*32+16]
174 :     movq mm2, [eax+1*32]
175 : edgomez 1382 packuswb mm2, [eax+1*32+8]
176 : edgomez 851 movq mm3, [eax+1*32+16]
177 :     packuswb mm3, [eax+1*32+24]
178 : edgomez 1382 movq mm6, [eax+3*32]
179 : edgomez 851 movq mm4, [eax+2*32]
180 : edgomez 1382 packuswb mm4, [eax+2*32+8]
181 : edgomez 851 packuswb mm5, [eax+2*32+24]
182 :     movq mm7, [eax+3*32+16]
183 :     packuswb mm7, [eax+3*32+24]
184 : edgomez 1382 packuswb mm6, [eax+3*32+8]
185 : edgomez 851 movq [ecx], mm0
186 : edgomez 1382 lea eax, [3*edx]
187 :     add eax, ecx
188 : edgomez 851 movq [ecx+edx], mm1
189 :     movq [ecx+2*edx], mm2
190 :     movq [byte eax], mm3
191 :     movq [ecx+4*edx], mm4
192 : edgomez 1382 lea ecx, [byte ecx+4*edx]
193 : edgomez 851 movq [eax+2*edx], mm5
194 :     movq [eax+4*edx], mm7
195 :     movq [ecx+2*edx], mm6
196 :     ret
197 :    
198 : edgomez 1382 ;-----------------------------------------------------------------------------
199 : edgomez 851 ;
200 :     ; void transfer_8to16sub_3dne(int16_t * const dct,
201 :     ; uint8_t * const cur,
202 :     ; const uint8_t * const ref,
203 :     ; const uint32_t stride);
204 :     ;
205 : edgomez 1382 ;-----------------------------------------------------------------------------
206 : edgomez 851
207 :     ; when second argument == 1, reference (ebx) block is to current (eax)
208 :     %macro COPY_8_TO_16_SUB 2
209 :     movq mm1, [eax] ; cur
210 :     movq mm0, mm1
211 :     movq mm4, [ecx] ; ref
212 :     movq mm6, mm4
213 :     %if %2 == 1
214 :     movq [eax], mm4
215 :     %endif
216 :     punpckhbw mm1, mm7
217 :     punpckhbw mm6, mm7
218 :     punpcklbw mm4, mm7
219 : edgomez 1382 ALIGN 8
220 : edgomez 851 movq mm2, [byte eax+edx]
221 :     punpcklbw mm0, mm7
222 :     movq mm3, [byte eax+edx]
223 :     punpcklbw mm2, mm7
224 :     movq mm5, [byte ecx+edx] ; ref
225 :     punpckhbw mm3, mm7
226 :     %if %2 == 1
227 :     movq [byte eax+edx], mm5
228 :     %endif
229 :     psubsw mm1, mm6
230 :    
231 :     movq mm6, mm5
232 :     psubsw mm0, mm4
233 : edgomez 1382 %if (%1 < 3)
234 : edgomez 851 lea eax,[eax+2*edx]
235 :     lea ecx,[ecx+2*edx]
236 :     %else
237 :     mov ecx,[esp]
238 :     add esp,byte 4
239 :     %endif
240 :     movq [edi+%1*32+ 8], mm1
241 :     movq [byte edi+%1*32+ 0], mm0 ; dst
242 :     punpcklbw mm5, mm7
243 :     punpckhbw mm6, mm7
244 :     psubsw mm2, mm5
245 :     psubsw mm3, mm6
246 :     movq [edi+%1*32+16], mm2
247 :     movq [edi+%1*32+24], mm3
248 :     %endmacro
249 :    
250 : edgomez 1382 ALIGN 16
251 : edgomez 851 transfer_8to16sub_3dne:
252 :     mov eax, [esp + 8] ; Cur
253 :     mov ecx, [esp +12] ; Ref
254 :     push edi
255 :     mov edx, [dword esp+4+16] ; Stride
256 :     mov edi, [esp+4+ 4] ; Dst
257 :     pxor mm7, mm7
258 :     nop
259 : edgomez 1382 ALIGN 4
260 : edgomez 851 COPY_8_TO_16_SUB 0, 1
261 :     COPY_8_TO_16_SUB 1, 1
262 :     COPY_8_TO_16_SUB 2, 1
263 :     COPY_8_TO_16_SUB 3, 1
264 : edgomez 1382 mov edi, ecx
265 : edgomez 851 ret
266 :    
267 : edgomez 1382 ALIGN 16
268 : edgomez 851 transfer_8to16subro_3dne:
269 :     mov eax, [esp + 8] ; Cur
270 :     mov ecx, [esp +12] ; Ref
271 :     push edi
272 :     mov edx, [dword esp+4+16] ; Stride
273 :     mov edi, [esp+4+ 4] ; Dst
274 :     pxor mm7, mm7
275 :     nop
276 : edgomez 1382 ALIGN 4
277 : edgomez 851 COPY_8_TO_16_SUB 0, 0
278 :     COPY_8_TO_16_SUB 1, 0
279 :     COPY_8_TO_16_SUB 2, 0
280 :     COPY_8_TO_16_SUB 3, 0
281 : edgomez 1382 mov edi, ecx
282 : edgomez 851 ret
283 :    
284 :    
285 : edgomez 1382 ;-----------------------------------------------------------------------------
286 : edgomez 851 ;
287 :     ; void transfer_8to16sub2_3dne(int16_t * const dct,
288 :     ; uint8_t * const cur,
289 :     ; const uint8_t * ref1,
290 :     ; const uint8_t * ref2,
291 :     ; const uint32_t stride)
292 :     ;
293 : edgomez 1382 ;-----------------------------------------------------------------------------
294 : edgomez 851
295 :     %macro COPY_8_TO_16_SUB2_SSE 1
296 : edgomez 1382 db 0Fh, 6Fh, 44h, 20h, 00 ;movq mm0, [byte eax] ; cur
297 : edgomez 851 punpcklbw mm0, mm7
298 :     movq mm2, [byte eax+edx]
299 :     punpcklbw mm2, mm7
300 :     db 0Fh, 6Fh, 4ch, 20h, 00 ;movq mm1, [byte eax]
301 :     punpckhbw mm1, mm7
302 :     movq mm3, [byte eax+edx]
303 :     punpckhbw mm3, mm7
304 : edgomez 1382
305 : edgomez 851 movq mm4, [byte ebx] ; ref1
306 :     pavgb mm4, [byte esi] ; ref2
307 : edgomez 1382 movq [eax], mm4
308 : edgomez 851 movq mm5, [ebx+edx] ; ref
309 :     pavgb mm5, [esi+edx] ; ref2
310 : edgomez 1382 movq [eax+edx], mm5
311 : edgomez 851 movq mm6, mm4
312 :     punpcklbw mm4, mm7
313 :     punpckhbw mm6, mm7
314 :     %if (%1 < 3)
315 :     lea esi,[esi+2*edx]
316 :     lea ebx,[byte ebx+2*edx]
317 :     lea eax,[eax+2*edx]
318 :     %else
319 :     mov esi,[esp]
320 :     mov ebx,[esp+4]
321 :     add esp,byte 8
322 : edgomez 1382 %endif
323 : edgomez 851 psubsw mm0, mm4
324 :     psubsw mm1, mm6
325 :     movq mm6, mm5
326 :     punpcklbw mm5, mm7
327 :     punpckhbw mm6, mm7
328 :     psubsw mm2, mm5
329 :     psubsw mm3, mm6
330 :     movq [byte ecx+%1*32+ 0], mm0 ; dst
331 :     movq [ecx+%1*32+ 8], mm1
332 :     movq [ecx+%1*32+16], mm2
333 :     movq [ecx+%1*32+24], mm3
334 :     %endmacro
335 :    
336 : edgomez 1382 ALIGN 16
337 : edgomez 851 transfer_8to16sub2_3dne:
338 :     mov edx, [esp +20] ; Stride
339 :     mov ecx, [esp + 4] ; Dst
340 :     mov eax, [esp + 8] ; Cur
341 :     push ebx
342 :     lea ebp,[byte ebp]
343 :     mov ebx, [esp+4+12] ; Ref1
344 :     push esi
345 :     pxor mm7, mm7
346 :     mov esi, [esp+8+16] ; Ref2
347 : edgomez 1382 nop4
348 : edgomez 851 COPY_8_TO_16_SUB2_SSE 0
349 :     COPY_8_TO_16_SUB2_SSE 1
350 :     COPY_8_TO_16_SUB2_SSE 2
351 :     COPY_8_TO_16_SUB2_SSE 3
352 :    
353 :     ret
354 :    
355 :    
356 : edgomez 1382 ;-----------------------------------------------------------------------------
357 : edgomez 851 ;
358 :     ; void transfer_16to8add_3dne(uint8_t * const dst,
359 :     ; const int16_t * const src,
360 :     ; uint32_t stride);
361 :     ;
362 : edgomez 1382 ;-----------------------------------------------------------------------------
363 : edgomez 851
364 :     %macro COPY_16_TO_8_ADD 1
365 :     db 0Fh, 6Fh, 44h, 21h, 00 ;movq mm0, [byte ecx]
366 :     punpcklbw mm0, mm7
367 :     movq mm2, [byte ecx+edx]
368 :     punpcklbw mm2, mm7
369 :     db 0Fh, 6Fh, 4ch, 21h, 00 ;movq mm1, [byte ecx]
370 :     punpckhbw mm1, mm7
371 :     movq mm3, [byte ecx+edx]
372 :     punpckhbw mm3, mm7
373 :     paddsw mm0, [byte eax+%1*32+ 0]
374 :     paddsw mm1, [eax+%1*32+ 8]
375 :     paddsw mm2, [eax+%1*32+16]
376 :     paddsw mm3, [eax+%1*32+24]
377 :     packuswb mm0, mm1
378 :     packuswb mm2, mm3
379 : edgomez 1382 mov esp,esp
380 : edgomez 851 movq [byte ecx], mm0
381 :     movq [ecx+edx], mm2
382 :     %endmacro
383 :    
384 :    
385 : edgomez 1382 ALIGN 16
386 : edgomez 851 transfer_16to8add_3dne:
387 :     mov ecx, [esp+ 4] ; Dst
388 :     mov edx, [esp+12] ; Stride
389 :     mov eax, [esp+ 8] ; Src
390 :     pxor mm7, mm7
391 :     nop
392 :    
393 :     COPY_16_TO_8_ADD 0
394 :     lea ecx,[byte ecx+2*edx]
395 :     COPY_16_TO_8_ADD 1
396 :     lea ecx,[byte ecx+2*edx]
397 :     COPY_16_TO_8_ADD 2
398 :     lea ecx,[byte ecx+2*edx]
399 :     COPY_16_TO_8_ADD 3
400 :     ret
401 :    
402 : edgomez 1382 ;-----------------------------------------------------------------------------
403 : edgomez 851 ;
404 :     ; void transfer8x8_copy_3dne(uint8_t * const dst,
405 :     ; const uint8_t * const src,
406 :     ; const uint32_t stride);
407 :     ;
408 :     ;
409 : edgomez 1382 ;-----------------------------------------------------------------------------
410 : edgomez 851
411 :     %macro COPY_8_TO_8 0
412 :     movq mm0, [byte eax]
413 :     movq mm1, [eax+edx]
414 :     movq [byte ecx], mm0
415 :     lea eax,[byte eax+2*edx]
416 :     movq [ecx+edx], mm1
417 :     %endmacro
418 :    
419 : edgomez 1382 ALIGN 16
420 : edgomez 851 transfer8x8_copy_3dne:
421 :     mov eax, [esp+ 8] ; Src
422 :     mov edx, [esp+12] ; Stride
423 :     mov ecx, [esp+ 4] ; Dst
424 :    
425 :     COPY_8_TO_8
426 :     lea ecx,[byte ecx+2*edx]
427 :     COPY_8_TO_8
428 :     lea ecx,[byte ecx+2*edx]
429 :     COPY_8_TO_8
430 :     lea ecx,[byte ecx+2*edx]
431 :     COPY_8_TO_8
432 :     ret

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