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

Annotation of /branches/dev-api-4/xvidcore/src/utils/x86_asm/mem_transfer_3dne.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1201 - (view) (download)

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

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