[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.20.2.1 - (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 : Isibaar 1.20 ; * 2001-2008 Michael Militzer <michael@xvid.org>
8 : edgomez 1.10 ; * 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 : Isibaar 1.20.2.1 ; * $Id: mem_transfer_mmx.asm,v 1.20 2008/11/26 01:04:34 Isibaar Exp $
25 : Isibaar 1.1 ; *
26 : edgomez 1.10 ; ***************************************************************************/
27 : Isibaar 1.1
28 : Isibaar 1.20 %include "nasm.inc"
29 : Isibaar 1.1
30 : edgomez 1.10 ;=============================================================================
31 :     ; Read only data
32 :     ;=============================================================================
33 :    
34 : Isibaar 1.20 DATA
35 : edgomez 1.10
36 : Isibaar 1.20 ALIGN SECTION_ALIGN
37 : edgomez 1.10 mmx_one:
38 :     dw 1, 1, 1, 1
39 :    
40 :     ;=============================================================================
41 :     ; Code
42 :     ;=============================================================================
43 : Isibaar 1.1
44 : Isibaar 1.20.2.1 TEXT
45 : Isibaar 1.1
46 : Isibaar 1.5 cglobal transfer_8to16copy_mmx
47 :     cglobal transfer_16to8copy_mmx
48 :     cglobal transfer_8to16sub_mmx
49 : edgomez 1.9 cglobal transfer_8to16subro_mmx
50 : Isibaar 1.5 cglobal transfer_8to16sub2_mmx
51 :     cglobal transfer_8to16sub2_xmm
52 : syskin 1.16 cglobal transfer_8to16sub2ro_xmm
53 : Isibaar 1.5 cglobal transfer_16to8add_mmx
54 :     cglobal transfer8x8_copy_mmx
55 : suxen_drol 1.17 cglobal transfer8x4_copy_mmx
56 : Isibaar 1.1
57 : edgomez 1.10 ;-----------------------------------------------------------------------------
58 : Isibaar 1.1 ;
59 :     ; void transfer_8to16copy_mmx(int16_t * const dst,
60 :     ; const uint8_t * const src,
61 :     ; uint32_t stride);
62 :     ;
63 : edgomez 1.10 ;-----------------------------------------------------------------------------
64 : Isibaar 1.1
65 : Isibaar 1.5 %macro COPY_8_TO_16 1
66 : Isibaar 1.20 movq mm0, [_EAX]
67 :     movq mm1, [_EAX+TMP1]
68 : Isibaar 1.5 movq mm2, mm0
69 :     movq mm3, mm1
70 :     punpcklbw mm0, mm7
71 : Isibaar 1.20 movq [TMP0+%1*32], mm0
72 : Isibaar 1.5 punpcklbw mm1, mm7
73 : Isibaar 1.20 movq [TMP0+%1*32+16], mm1
74 : Isibaar 1.5 punpckhbw mm2, mm7
75 :     punpckhbw mm3, mm7
76 : Isibaar 1.20 lea _EAX, [_EAX+2*TMP1]
77 :     movq [TMP0+%1*32+8], mm2
78 :     movq [TMP0+%1*32+24], mm3
79 : Isibaar 1.5 %endmacro
80 :    
81 : Isibaar 1.20 ALIGN SECTION_ALIGN
82 : Isibaar 1.5 transfer_8to16copy_mmx:
83 : Isibaar 1.1
84 : Isibaar 1.20 mov TMP0, prm1 ; Dst
85 :     mov _EAX, prm2 ; Src
86 :     mov TMP1, prm3 ; Stride
87 : edgomez 1.10 pxor mm7, mm7
88 : Isibaar 1.5
89 :     COPY_8_TO_16 0
90 :     COPY_8_TO_16 1
91 :     COPY_8_TO_16 2
92 :     COPY_8_TO_16 3
93 :     ret
94 : Isibaar 1.19 ENDFUNC
95 : Isibaar 1.1
96 : edgomez 1.10 ;-----------------------------------------------------------------------------
97 : Isibaar 1.1 ;
98 :     ; void transfer_16to8copy_mmx(uint8_t * const dst,
99 :     ; const int16_t * const src,
100 :     ; uint32_t stride);
101 :     ;
102 : edgomez 1.10 ;-----------------------------------------------------------------------------
103 : Isibaar 1.1
104 : Isibaar 1.5 %macro COPY_16_TO_8 1
105 : Isibaar 1.20 movq mm0, [_EAX+%1*32]
106 :     movq mm1, [_EAX+%1*32+8]
107 : Isibaar 1.5 packuswb mm0, mm1
108 : Isibaar 1.20 movq [TMP0], mm0
109 :     movq mm2, [_EAX+%1*32+16]
110 :     movq mm3, [_EAX+%1*32+24]
111 : Isibaar 1.5 packuswb mm2, mm3
112 : Isibaar 1.20 movq [TMP0+TMP1], mm2
113 : Isibaar 1.5 %endmacro
114 :    
115 : Isibaar 1.20 ALIGN SECTION_ALIGN
116 : Isibaar 1.5 transfer_16to8copy_mmx:
117 : Isibaar 1.1
118 : Isibaar 1.20 mov TMP0, prm1 ; Dst
119 :     mov _EAX, prm2 ; Src
120 :     mov TMP1, prm3 ; Stride
121 : Isibaar 1.5
122 :     COPY_16_TO_8 0
123 : Isibaar 1.20 lea TMP0,[TMP0+2*TMP1]
124 : Isibaar 1.5 COPY_16_TO_8 1
125 : Isibaar 1.20 lea TMP0,[TMP0+2*TMP1]
126 : Isibaar 1.5 COPY_16_TO_8 2
127 : Isibaar 1.20 lea TMP0,[TMP0+2*TMP1]
128 : Isibaar 1.5 COPY_16_TO_8 3
129 :     ret
130 : Isibaar 1.19 ENDFUNC
131 : Isibaar 1.1
132 : edgomez 1.10 ;-----------------------------------------------------------------------------
133 : Isibaar 1.1 ;
134 :     ; void transfer_8to16sub_mmx(int16_t * const dct,
135 :     ; uint8_t * const cur,
136 :     ; const uint8_t * const ref,
137 :     ; const uint32_t stride);
138 :     ;
139 : edgomez 1.10 ;-----------------------------------------------------------------------------
140 : Isibaar 1.1
141 : Isibaar 1.20 ; when second argument == 1, reference (ebx) block is to current (_EAX)
142 : edgomez 1.9 %macro COPY_8_TO_16_SUB 2
143 : Isibaar 1.20 movq mm0, [_EAX] ; cur
144 :     movq mm2, [_EAX+TMP1]
145 : edgomez 1.12 movq mm1, mm0
146 :     movq mm3, mm2
147 : Isibaar 1.5
148 : edgomez 1.12 punpcklbw mm0, mm7
149 :     punpcklbw mm2, mm7
150 : Isibaar 1.20 movq mm4, [_EBX] ; ref
151 : edgomez 1.12 punpckhbw mm1, mm7
152 :     punpckhbw mm3, mm7
153 : Isibaar 1.20 movq mm5, [_EBX+TMP1] ; ref
154 : Isibaar 1.5
155 : edgomez 1.12 movq mm6, mm4
156 : edgomez 1.9 %if %2 == 1
157 : Isibaar 1.20 movq [_EAX], mm4
158 :     movq [_EAX+TMP1], mm5
159 : edgomez 1.9 %endif
160 : edgomez 1.12 punpcklbw mm4, mm7
161 :     punpckhbw mm6, mm7
162 :     psubsw mm0, mm4
163 :     psubsw mm1, mm6
164 :     movq mm6, mm5
165 :     punpcklbw mm5, mm7
166 :     punpckhbw mm6, mm7
167 :     psubsw mm2, mm5
168 : Isibaar 1.20 lea _EAX, [_EAX+2*TMP1]
169 : edgomez 1.12 psubsw mm3, mm6
170 : Isibaar 1.20 lea _EBX,[_EBX+2*TMP1]
171 : Isibaar 1.5
172 : Isibaar 1.20 movq [TMP0+%1*32+ 0], mm0 ; dst
173 :     movq [TMP0+%1*32+ 8], mm1
174 :     movq [TMP0+%1*32+16], mm2
175 :     movq [TMP0+%1*32+24], mm3
176 : Isibaar 1.5 %endmacro
177 :    
178 : Isibaar 1.20 ALIGN SECTION_ALIGN
179 : Isibaar 1.5 transfer_8to16sub_mmx:
180 : Isibaar 1.20 mov TMP0, prm1 ; Dst
181 :     mov _EAX, prm2 ; Cur
182 :     mov TMP1, prm4 ; Stride
183 :    
184 :     push _EBX
185 :     %ifdef ARCH_IS_X86_64
186 :     mov _EBX, prm3
187 :     %else
188 :     mov _EBX, [_ESP+4+12] ; Ref
189 :     %endif
190 : Isibaar 1.5 pxor mm7, mm7
191 : Isibaar 1.1
192 : edgomez 1.9 COPY_8_TO_16_SUB 0, 1
193 :     COPY_8_TO_16_SUB 1, 1
194 :     COPY_8_TO_16_SUB 2, 1
195 :     COPY_8_TO_16_SUB 3, 1
196 :    
197 : Isibaar 1.20 pop _EBX
198 : edgomez 1.9 ret
199 : Isibaar 1.19 ENDFUNC
200 : edgomez 1.9
201 :    
202 : Isibaar 1.20 ALIGN SECTION_ALIGN
203 : edgomez 1.9 transfer_8to16subro_mmx:
204 : Isibaar 1.20 mov TMP0, prm1 ; Dst
205 :     mov _EAX, prm2 ; Cur
206 :     mov TMP1, prm4 ; Stride
207 :    
208 :     push _EBX
209 :     %ifdef ARCH_IS_X86_64
210 :     mov _EBX, prm3
211 :     %else
212 :     mov _EBX, [_ESP+4+12] ; Ref
213 :     %endif
214 : edgomez 1.9 pxor mm7, mm7
215 :    
216 :     COPY_8_TO_16_SUB 0, 0
217 :     COPY_8_TO_16_SUB 1, 0
218 :     COPY_8_TO_16_SUB 2, 0
219 :     COPY_8_TO_16_SUB 3, 0
220 : Isibaar 1.1
221 : Isibaar 1.20 pop _EBX
222 : Isibaar 1.5 ret
223 : Isibaar 1.19 ENDFUNC
224 : edgomez 1.9
225 : Isibaar 1.1
226 : edgomez 1.10 ;-----------------------------------------------------------------------------
227 : Isibaar 1.5 ;
228 :     ; void transfer_8to16sub2_mmx(int16_t * const dct,
229 :     ; uint8_t * const cur,
230 :     ; const uint8_t * ref1,
231 :     ; const uint8_t * ref2,
232 :     ; const uint32_t stride)
233 :     ;
234 : edgomez 1.10 ;-----------------------------------------------------------------------------
235 : Isibaar 1.5
236 :     %macro COPY_8_TO_16_SUB2_MMX 1
237 : Isibaar 1.20 movq mm0, [_EAX] ; cur
238 :     movq mm2, [_EAX+TMP1]
239 : edgomez 1.12
240 : edgomez 1.10 ; mm4 <- (ref1+ref2+1) / 2
241 : Isibaar 1.20 movq mm4, [_EBX] ; ref1
242 :     movq mm1, [_ESI] ; ref2
243 : edgomez 1.12 movq mm6, mm4
244 :     movq mm3, mm1
245 :     punpcklbw mm4, mm7
246 :     punpcklbw mm1, mm7
247 :     punpckhbw mm6, mm7
248 :     punpckhbw mm3, mm7
249 :     paddusw mm4, mm1
250 :     paddusw mm6, mm3
251 :     paddusw mm4, [mmx_one]
252 :     paddusw mm6, [mmx_one]
253 :     psrlw mm4, 1
254 :     psrlw mm6, 1
255 :     packuswb mm4, mm6
256 : Isibaar 1.20 movq [_EAX], mm4
257 : edgomez 1.12
258 :     ; mm5 <- (ref1+ref2+1) / 2
259 : Isibaar 1.20 movq mm5, [_EBX+TMP1] ; ref1
260 :     movq mm1, [_ESI+TMP1] ; ref2
261 : edgomez 1.12 movq mm6, mm5
262 :     movq mm3, mm1
263 :     punpcklbw mm5, mm7
264 :     punpcklbw mm1, mm7
265 :     punpckhbw mm6, mm7
266 :     punpckhbw mm3, mm7
267 :     paddusw mm5, mm1
268 :     paddusw mm6, mm3
269 :     paddusw mm5, [mmx_one]
270 :     paddusw mm6, [mmx_one]
271 : Isibaar 1.20 lea _ESI, [_ESI+2*TMP1]
272 : edgomez 1.12 psrlw mm5, 1
273 :     psrlw mm6, 1
274 :     packuswb mm5, mm6
275 : Isibaar 1.20 movq [_EAX+TMP1], mm5
276 : edgomez 1.12
277 :     movq mm1, mm0
278 :     movq mm3, mm2
279 :     punpcklbw mm0, mm7
280 :     punpcklbw mm2, mm7
281 :     punpckhbw mm1, mm7
282 :     punpckhbw mm3, mm7
283 :    
284 :     movq mm6, mm4
285 :     punpcklbw mm4, mm7
286 :     punpckhbw mm6, mm7
287 :     psubsw mm0, mm4
288 :     psubsw mm1, mm6
289 :     movq mm6, mm5
290 :     punpcklbw mm5, mm7
291 :     punpckhbw mm6, mm7
292 :     psubsw mm2, mm5
293 : Isibaar 1.20 lea _EAX, [_EAX+2*TMP1]
294 : edgomez 1.12 psubsw mm3, mm6
295 : Isibaar 1.20 lea _EBX, [_EBX+2*TMP1]
296 : edgomez 1.12
297 : Isibaar 1.20 movq [TMP0+%1*32+ 0], mm0 ; dst
298 :     movq [TMP0+%1*32+ 8], mm1
299 :     movq [TMP0+%1*32+16], mm2
300 :     movq [TMP0+%1*32+24], mm3
301 : Isibaar 1.5 %endmacro
302 : Isibaar 1.1
303 : Isibaar 1.20 ALIGN SECTION_ALIGN
304 : Isibaar 1.5 transfer_8to16sub2_mmx:
305 : Isibaar 1.20 mov TMP0, prm1 ; Dst
306 :     mov TMP1d, prm5d ; Stride
307 :     mov _EAX, prm2 ; Cur
308 :    
309 :     push _EBX
310 :     %ifdef ARCH_IS_X86_64
311 :     mov _EBX, prm3
312 :     %else
313 :     mov _EBX, [_ESP+4+12] ; Ref1
314 :     %endif
315 :    
316 :     push _ESI
317 :     %ifdef ARCH_IS_X86_64
318 :     mov _ESI, prm4
319 :     %else
320 :     mov _ESI, [_ESP+8+16] ; Ref2
321 :     %endif
322 :    
323 : Isibaar 1.5 pxor mm7, mm7
324 :    
325 :     COPY_8_TO_16_SUB2_MMX 0
326 :     COPY_8_TO_16_SUB2_MMX 1
327 :     COPY_8_TO_16_SUB2_MMX 2
328 :     COPY_8_TO_16_SUB2_MMX 3
329 :    
330 : Isibaar 1.20 pop _ESI
331 :     pop _EBX
332 : Isibaar 1.5 ret
333 : Isibaar 1.19 ENDFUNC
334 : Isibaar 1.1
335 : edgomez 1.10 ;-----------------------------------------------------------------------------
336 : edgomez 1.2 ;
337 :     ; void transfer_8to16sub2_xmm(int16_t * const dct,
338 : Isibaar 1.5 ; uint8_t * const cur,
339 :     ; const uint8_t * ref1,
340 :     ; const uint8_t * ref2,
341 :     ; const uint32_t stride)
342 : edgomez 1.2 ;
343 : edgomez 1.10 ;-----------------------------------------------------------------------------
344 : edgomez 1.2
345 : Isibaar 1.5 %macro COPY_8_TO_16_SUB2_SSE 1
346 : Isibaar 1.20 movq mm0, [_EAX] ; cur
347 :     movq mm2, [_EAX+TMP1]
348 : edgomez 1.12 movq mm1, mm0
349 :     movq mm3, mm2
350 : Isibaar 1.5
351 : edgomez 1.12 punpcklbw mm0, mm7
352 :     punpcklbw mm2, mm7
353 : Isibaar 1.20 movq mm4, [_EBX] ; ref1
354 :     pavgb mm4, [_ESI] ; ref2
355 :     movq [_EAX], mm4
356 : edgomez 1.12 punpckhbw mm1, mm7
357 :     punpckhbw mm3, mm7
358 : Isibaar 1.20 movq mm5, [_EBX+TMP1] ; ref
359 :     pavgb mm5, [_ESI+TMP1] ; ref2
360 :     movq [_EAX+TMP1], mm5
361 : Isibaar 1.5
362 : edgomez 1.12 movq mm6, mm4
363 :     punpcklbw mm4, mm7
364 :     punpckhbw mm6, mm7
365 :     psubsw mm0, mm4
366 :     psubsw mm1, mm6
367 : Isibaar 1.20 lea _ESI, [_ESI+2*TMP1]
368 : edgomez 1.12 movq mm6, mm5
369 :     punpcklbw mm5, mm7
370 :     punpckhbw mm6, mm7
371 :     psubsw mm2, mm5
372 : Isibaar 1.20 lea _EAX, [_EAX+2*TMP1]
373 : edgomez 1.12 psubsw mm3, mm6
374 : Isibaar 1.20 lea _EBX, [_EBX+2*TMP1]
375 : edgomez 1.12
376 : Isibaar 1.20 movq [TMP0+%1*32+ 0], mm0 ; dst
377 :     movq [TMP0+%1*32+ 8], mm1
378 :     movq [TMP0+%1*32+16], mm2
379 :     movq [TMP0+%1*32+24], mm3
380 : Isibaar 1.5 %endmacro
381 :    
382 : Isibaar 1.20 ALIGN SECTION_ALIGN
383 : Isibaar 1.5 transfer_8to16sub2_xmm:
384 : Isibaar 1.20 mov TMP0, prm1 ; Dst
385 :     mov _EAX, prm2 ; Cur
386 :     mov TMP1d, prm5d ; Stride
387 :    
388 :     push _EBX
389 :     %ifdef ARCH_IS_X86_64
390 :     mov _EBX, prm3 ; Ref1
391 :     %else
392 :     mov _EBX, [_ESP+4+12] ; Ref1
393 :     %endif
394 :    
395 :     push _ESI
396 :     %ifdef ARCH_IS_X86_64
397 :     mov _ESI, prm4 ; Ref1
398 :     %else
399 :     mov _ESI, [_ESP+8+16] ; Ref2
400 :     %endif
401 :    
402 : Isibaar 1.5 pxor mm7, mm7
403 :    
404 :     COPY_8_TO_16_SUB2_SSE 0
405 :     COPY_8_TO_16_SUB2_SSE 1
406 :     COPY_8_TO_16_SUB2_SSE 2
407 :     COPY_8_TO_16_SUB2_SSE 3
408 :    
409 : Isibaar 1.20 pop _ESI
410 :     pop _EBX
411 : Isibaar 1.5 ret
412 : Isibaar 1.19 ENDFUNC
413 : Isibaar 1.1
414 : syskin 1.16
415 :     ;-----------------------------------------------------------------------------
416 :     ;
417 :     ; void transfer_8to16sub2ro_xmm(int16_t * const dct,
418 :     ; const uint8_t * const cur,
419 :     ; const uint8_t * ref1,
420 :     ; const uint8_t * ref2,
421 :     ; const uint32_t stride)
422 :     ;
423 :     ;-----------------------------------------------------------------------------
424 :    
425 :     %macro COPY_8_TO_16_SUB2RO_SSE 1
426 : Isibaar 1.20 movq mm0, [_EAX] ; cur
427 :     movq mm2, [_EAX+TMP1]
428 : syskin 1.16 movq mm1, mm0
429 :     movq mm3, mm2
430 :    
431 :     punpcklbw mm0, mm7
432 :     punpcklbw mm2, mm7
433 : Isibaar 1.20 movq mm4, [_EBX] ; ref1
434 :     pavgb mm4, [_ESI] ; ref2
435 : syskin 1.16 punpckhbw mm1, mm7
436 :     punpckhbw mm3, mm7
437 : Isibaar 1.20 movq mm5, [_EBX+TMP1] ; ref
438 :     pavgb mm5, [_ESI+TMP1] ; ref2
439 : syskin 1.16
440 :     movq mm6, mm4
441 :     punpcklbw mm4, mm7
442 :     punpckhbw mm6, mm7
443 :     psubsw mm0, mm4
444 :     psubsw mm1, mm6
445 : Isibaar 1.20 lea _ESI, [_ESI+2*TMP1]
446 : syskin 1.16 movq mm6, mm5
447 :     punpcklbw mm5, mm7
448 :     punpckhbw mm6, mm7
449 :     psubsw mm2, mm5
450 : Isibaar 1.20 lea _EAX, [_EAX+2*TMP1]
451 : syskin 1.16 psubsw mm3, mm6
452 : Isibaar 1.20 lea _EBX, [_EBX+2*TMP1]
453 : syskin 1.16
454 : Isibaar 1.20 movq [TMP0+%1*32+ 0], mm0 ; dst
455 :     movq [TMP0+%1*32+ 8], mm1
456 :     movq [TMP0+%1*32+16], mm2
457 :     movq [TMP0+%1*32+24], mm3
458 : syskin 1.16 %endmacro
459 :    
460 : Isibaar 1.20 ALIGN SECTION_ALIGN
461 : syskin 1.16 transfer_8to16sub2ro_xmm:
462 :     pxor mm7, mm7
463 : Isibaar 1.20 mov TMP0, prm1 ; Dst
464 :     mov _EAX, prm2 ; Cur
465 :     mov TMP1d, prm5d ; Stride
466 :    
467 :     push _EBX
468 :     %ifdef ARCH_IS_X86_64
469 :     mov _EBX, prm3
470 :     %else
471 :     mov _EBX, [_ESP+4+12] ; Ref1
472 :     %endif
473 :    
474 :     push _ESI
475 :     %ifdef ARCH_IS_X86_64
476 :     mov _ESI, prm4
477 :     %else
478 :     mov _ESI, [_ESP+8+16] ; Ref2
479 :     %endif
480 : syskin 1.16
481 :     COPY_8_TO_16_SUB2RO_SSE 0
482 :     COPY_8_TO_16_SUB2RO_SSE 1
483 :     COPY_8_TO_16_SUB2RO_SSE 2
484 :     COPY_8_TO_16_SUB2RO_SSE 3
485 :    
486 : Isibaar 1.20 pop _ESI
487 :     pop _EBX
488 : syskin 1.16 ret
489 : Isibaar 1.19 ENDFUNC
490 : syskin 1.16
491 :    
492 : edgomez 1.10 ;-----------------------------------------------------------------------------
493 : Isibaar 1.1 ;
494 :     ; void transfer_16to8add_mmx(uint8_t * const dst,
495 :     ; const int16_t * const src,
496 :     ; uint32_t stride);
497 :     ;
498 : edgomez 1.10 ;-----------------------------------------------------------------------------
499 : Isibaar 1.1
500 : Isibaar 1.5 %macro COPY_16_TO_8_ADD 1
501 : Isibaar 1.20 movq mm0, [TMP0]
502 :     movq mm2, [TMP0+TMP1]
503 : edgomez 1.12 movq mm1, mm0
504 :     movq mm3, mm2
505 :     punpcklbw mm0, mm7
506 :     punpcklbw mm2, mm7
507 :     punpckhbw mm1, mm7
508 :     punpckhbw mm3, mm7
509 : Isibaar 1.20 paddsw mm0, [_EAX+%1*32+ 0]
510 :     paddsw mm1, [_EAX+%1*32+ 8]
511 :     paddsw mm2, [_EAX+%1*32+16]
512 :     paddsw mm3, [_EAX+%1*32+24]
513 : edgomez 1.12 packuswb mm0, mm1
514 : Isibaar 1.20 movq [TMP0], mm0
515 : edgomez 1.12 packuswb mm2, mm3
516 : Isibaar 1.20 movq [TMP0+TMP1], mm2
517 : Isibaar 1.5 %endmacro
518 : Isibaar 1.1
519 :    
520 : Isibaar 1.20 ALIGN SECTION_ALIGN
521 : Isibaar 1.5 transfer_16to8add_mmx:
522 : Isibaar 1.20 mov TMP0, prm1 ; Dst
523 :     mov _EAX, prm2 ; Src
524 :     mov TMP1, prm3 ; Stride
525 : edgomez 1.12 pxor mm7, mm7
526 : Isibaar 1.5
527 :     COPY_16_TO_8_ADD 0
528 : Isibaar 1.20 lea TMP0,[TMP0+2*TMP1]
529 : Isibaar 1.5 COPY_16_TO_8_ADD 1
530 : Isibaar 1.20 lea TMP0,[TMP0+2*TMP1]
531 : Isibaar 1.5 COPY_16_TO_8_ADD 2
532 : Isibaar 1.20 lea TMP0,[TMP0+2*TMP1]
533 : Isibaar 1.5 COPY_16_TO_8_ADD 3
534 :     ret
535 : Isibaar 1.19 ENDFUNC
536 : Isibaar 1.1
537 : edgomez 1.10 ;-----------------------------------------------------------------------------
538 : Isibaar 1.1 ;
539 :     ; void transfer8x8_copy_mmx(uint8_t * const dst,
540 :     ; const uint8_t * const src,
541 :     ; const uint32_t stride);
542 :     ;
543 :     ;
544 : edgomez 1.10 ;-----------------------------------------------------------------------------
545 : Isibaar 1.1
546 : edgomez 1.12 %macro COPY_8_TO_8 0
547 : Isibaar 1.20 movq mm0, [_EAX]
548 :     movq mm1, [_EAX+TMP1]
549 :     movq [TMP0], mm0
550 :     lea _EAX, [_EAX+2*TMP1]
551 :     movq [TMP0+TMP1], mm1
552 : edgomez 1.12 %endmacro
553 :    
554 : Isibaar 1.20 ALIGN SECTION_ALIGN
555 : Isibaar 1.5 transfer8x8_copy_mmx:
556 : Isibaar 1.20 mov TMP0, prm1 ; Dst
557 :     mov _EAX, prm2 ; Src
558 :     mov TMP1, prm3 ; Stride
559 : edgomez 1.12
560 :     COPY_8_TO_8
561 : Isibaar 1.20 lea TMP0,[TMP0+2*TMP1]
562 : edgomez 1.12 COPY_8_TO_8
563 : Isibaar 1.20 lea TMP0,[TMP0+2*TMP1]
564 : edgomez 1.12 COPY_8_TO_8
565 : Isibaar 1.20 lea TMP0,[TMP0+2*TMP1]
566 : edgomez 1.12 COPY_8_TO_8
567 :     ret
568 : Isibaar 1.19 ENDFUNC
569 : edgomez 1.15
570 : suxen_drol 1.17 ;-----------------------------------------------------------------------------
571 :     ;
572 :     ; void transfer8x4_copy_mmx(uint8_t * const dst,
573 :     ; const uint8_t * const src,
574 :     ; const uint32_t stride);
575 :     ;
576 :     ;
577 :     ;-----------------------------------------------------------------------------
578 :    
579 : Isibaar 1.20 ALIGN SECTION_ALIGN
580 : suxen_drol 1.17 transfer8x4_copy_mmx:
581 : Isibaar 1.20 mov TMP0, prm1 ; Dst
582 :     mov _EAX, prm2 ; Src
583 :     mov TMP1, prm3 ; Stride
584 : suxen_drol 1.17
585 :     COPY_8_TO_8
586 : Isibaar 1.20 lea TMP0,[TMP0+2*TMP1]
587 : suxen_drol 1.17 COPY_8_TO_8
588 :     ret
589 : Isibaar 1.19 ENDFUNC
590 : suxen_drol 1.17
591 : Isibaar 1.18
592 :     %ifidn __OUTPUT_FORMAT__,elf
593 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
594 :     %endif
595 :    

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