[svn] / trunk / xvidcore / src / quant / x86_asm / quantize_h263_mmx.asm Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/quant/x86_asm/quantize_h263_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1540 - (view) (download)

1 : edgomez 1382 ;/*****************************************************************************
2 :     ; *
3 :     ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - MPEG4 Quantization H263 implementation / MMX optimized -
5 :     ; *
6 :     ; * Copyright(C) 2001-2003 Peter Ross <pross@xvid.org>
7 :     ; * 2002-2003 Pascal Massimino <skal@planet-d.net>
8 : edgomez 1424 ; * 2004 Jean-Marc Bastide <jmtest@voila.fr>
9 : edgomez 1382 ; *
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 :     ; *
15 :     ; * 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 :     ; *
20 :     ; * 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 :     ; *
24 : edgomez 1540 ; * $Id: quantize_h263_mmx.asm,v 1.7 2004-08-29 10:02:38 edgomez Exp $
25 : edgomez 1382 ; *
26 :     ; ****************************************************************************/
27 :    
28 :     ; enable dequant saturate [-2048,2047], test purposes only.
29 :     %define SATURATE
30 :    
31 :     BITS 32
32 :    
33 :     %macro cglobal 1
34 : edgomez 1535 %ifdef PREFIX
35 :     %ifdef MARK_FUNCS
36 : edgomez 1540 global _%1:function %1.endfunc-%1
37 :     %define %1 _%1:function %1.endfunc-%1
38 : edgomez 1535 %else
39 :     global _%1
40 :     %define %1 _%1
41 :     %endif
42 : edgomez 1382 %else
43 : edgomez 1535 %ifdef MARK_FUNCS
44 : edgomez 1540 global %1:function %1.endfunc-%1
45 : edgomez 1535 %else
46 :     global %1
47 :     %endif
48 : edgomez 1382 %endif
49 :     %endmacro
50 :    
51 :     ;=============================================================================
52 :     ; Read only Local data
53 :     ;=============================================================================
54 :    
55 :     %ifdef FORMAT_COFF
56 : edgomez 1519 SECTION .rodata
57 : edgomez 1382 %else
58 : edgomez 1519 SECTION .rodata align=16
59 : edgomez 1382 %endif
60 :    
61 :     ALIGN 16
62 :     plus_one:
63 :     times 8 dw 1
64 :    
65 :     ;-----------------------------------------------------------------------------
66 :     ;
67 : edgomez 1424 ; quant table
68 :     ;
69 :     ;-----------------------------------------------------------------------------
70 :    
71 :     ALIGN 16
72 :     mmx_quant:
73 :     %assign quant 0
74 :     %rep 32
75 :     times 4 dw quant
76 :     %assign quant quant+1
77 :     %endrep
78 :    
79 :     ;-----------------------------------------------------------------------------
80 :     ;
81 : edgomez 1382 ; subtract by Q/2 table
82 :     ;
83 :     ;-----------------------------------------------------------------------------
84 :    
85 :     ALIGN 16
86 :     mmx_sub:
87 :     %assign quant 1
88 :     %rep 31
89 :     times 4 dw quant / 2
90 :     %assign quant quant+1
91 :     %endrep
92 :    
93 :     ;-----------------------------------------------------------------------------
94 :     ;
95 :     ; divide by 2Q table
96 :     ;
97 :     ; use a shift of 16 to take full advantage of _pmulhw_
98 :     ; for q=1, _pmulhw_ will overflow so it is treated seperately
99 :     ; (3dnow2 provides _pmulhuw_ which wont cause overflow)
100 :     ;
101 :     ;-----------------------------------------------------------------------------
102 :    
103 :     ALIGN 16
104 :     mmx_div:
105 :     %assign quant 1
106 :     %rep 31
107 :     times 4 dw (1<<16) / (quant*2) + 1
108 :     %assign quant quant+1
109 :     %endrep
110 :    
111 :     ;=============================================================================
112 :     ; Code
113 :     ;=============================================================================
114 :    
115 :     SECTION .text
116 :    
117 :     cglobal quant_h263_intra_mmx
118 :     cglobal quant_h263_intra_sse2
119 :     cglobal quant_h263_inter_mmx
120 :     cglobal quant_h263_inter_sse2
121 :     cglobal dequant_h263_intra_mmx
122 :     cglobal dequant_h263_intra_xmm
123 :     cglobal dequant_h263_intra_sse2
124 :     cglobal dequant_h263_inter_mmx
125 :     cglobal dequant_h263_inter_xmm
126 :     cglobal dequant_h263_inter_sse2
127 :    
128 :     ;-----------------------------------------------------------------------------
129 :     ;
130 :     ; uint32_t quant_h263_intra_mmx(int16_t * coeff,
131 :     ; const int16_t const * data,
132 :     ; const uint32_t quant,
133 :     ; const uint32_t dcscalar,
134 :     ; const uint16_t *mpeg_matrices);
135 :     ;
136 :     ;-----------------------------------------------------------------------------
137 :    
138 :     ALIGN 16
139 :     quant_h263_intra_mmx:
140 :    
141 :     push esi
142 :    
143 : edgomez 1424 mov esi, [esp + 4 + 8] ; data
144 : edgomez 1432 mov ecx,[esp + 4 + 16] ; dcscalar
145 : edgomez 1424 movsx eax, word [esi] ; data[0]
146 : edgomez 1432
147 :     sar ecx,1 ; dcscalar /2
148 : edgomez 1424 mov edx,eax
149 : edgomez 1432 sar edx,31 ; sgn(data[0])
150 :     xor ecx,edx ; *sgn(data[0])
151 :     sub eax,edx
152 :     add eax,ecx ; + (dcscalar/2)*sgn(data[0])
153 :    
154 : edgomez 1424 mov ecx, [esp + 4 + 12] ; quant
155 :     cdq
156 :     idiv dword [esp + 4 + 16] ; dcscalar
157 :     cmp ecx, 1
158 :     mov edx, [esp + 4 + 4] ; coeff
159 :     je .low
160 :    
161 :     movq mm7, [mmx_div+ecx * 8 - 8]
162 :     mov ecx,4
163 : edgomez 1382
164 :     .loop
165 : edgomez 1424 movq mm0, [esi] ; data
166 :     pxor mm4,mm4
167 :     movq mm1, [esi + 8]
168 :     pcmpgtw mm4,mm0 ; (data<0)
169 :     pxor mm5,mm5
170 :     pmulhw mm0,mm7 ; /(2*quant)
171 :     pcmpgtw mm5,mm1
172 :     movq mm2, [esi+16]
173 :     psubw mm0,mm4 ; +(data<0)
174 :     pmulhw mm1,mm7
175 :     pxor mm4,mm4
176 :     movq mm3,[esi+24]
177 :     pcmpgtw mm4,mm2
178 :     psubw mm1,mm5
179 :     pmulhw mm2,mm7
180 :     pxor mm5,mm5
181 :     pcmpgtw mm5,mm3
182 :     pmulhw mm3,mm7
183 :     psubw mm2,mm4
184 :     psubw mm3,mm5
185 :     movq [edx], mm0
186 :     lea esi, [esi+32]
187 :     movq [edx + 8], mm1
188 :     movq [edx + 16], mm2
189 :     movq [edx + 24], mm3
190 :    
191 :     dec ecx
192 :     lea edx, [edx+32]
193 :     jne .loop
194 :     jmp .end
195 :    
196 :     .low
197 :     movd mm7,ecx
198 :     mov ecx,4
199 :     .loop_low
200 :     movq mm0, [esi]
201 :     pxor mm4,mm4
202 :     movq mm1, [esi + 8]
203 :     pcmpgtw mm4,mm0
204 :     pxor mm5,mm5
205 :     psubw mm0,mm4
206 :     pcmpgtw mm5,mm1
207 :     psraw mm0,mm7
208 :     psubw mm1,mm5
209 :     movq mm2,[esi+16]
210 :     pxor mm4,mm4
211 :     psraw mm1,mm7
212 :     pcmpgtw mm4,mm2
213 :     pxor mm5,mm5
214 :     psubw mm2,mm4
215 :     movq mm3,[esi+24]
216 :     pcmpgtw mm5,mm3
217 :     psraw mm2,mm7
218 :     psubw mm3,mm5
219 :     movq [edx], mm0
220 :     psraw mm3,mm7
221 :     movq [edx + 8], mm1
222 :     movq [edx+16],mm2
223 :     lea esi, [esi+32]
224 :     movq [edx+24],mm3
225 :    
226 :     dec ecx
227 :     lea edx, [edx+32]
228 :     jne .loop_low
229 :    
230 :     .end
231 :     mov edx, [esp + 4 + 4] ; coeff
232 :     mov [edx],ax
233 :     xor eax,eax ; return 0
234 : edgomez 1382
235 :     pop esi
236 :     ret
237 : edgomez 1540 .endfunc
238 : edgomez 1424
239 : edgomez 1382
240 :     ;-----------------------------------------------------------------------------
241 :     ;
242 :     ; uint32_t quant_h263_intra_sse2(int16_t * coeff,
243 :     ; const int16_t const * data,
244 :     ; const uint32_t quant,
245 :     ; const uint32_t dcscalar,
246 :     ; const uint16_t *mpeg_matrices);
247 :     ;
248 :     ;-----------------------------------------------------------------------------
249 :    
250 :     ALIGN 16
251 :     quant_h263_intra_sse2:
252 :    
253 :     push esi
254 :    
255 : edgomez 1424 mov esi, [esp + 4 + 8] ; data
256 :    
257 :     movsx eax, word [esi] ; data[0]
258 :    
259 :     mov ecx,[esp + 4 + 16] ; dcscalar
260 :     mov edx,eax
261 :     sar ecx,1
262 :     add eax,ecx
263 :     sub edx,ecx
264 :     cmovl eax,edx ; +/- dcscalar/2
265 :     mov ecx, [esp + 4 + 12] ; quant
266 :     cdq
267 :     idiv dword [esp + 4 + 16] ; dcscalar
268 :     cmp ecx, 1
269 :     mov edx, [esp + 4 + 4] ; coeff
270 :     movq xmm7, [mmx_div+ecx * 8 - 8]
271 :     je .low
272 :    
273 :     mov ecx,2
274 :     movlhps xmm7,xmm7
275 : edgomez 1382
276 : edgomez 1424 .loop
277 :     movdqa xmm0, [esi]
278 :     pxor xmm4,xmm4
279 :     movdqa xmm1, [esi + 16]
280 :     pcmpgtw xmm4,xmm0
281 :     pxor xmm5,xmm5
282 :     pmulhw xmm0,xmm7
283 :     pcmpgtw xmm5,xmm1
284 :     movdqa xmm2, [esi+32]
285 :     psubw xmm0,xmm4
286 :     pmulhw xmm1,xmm7
287 :     pxor xmm4,xmm4
288 :     movdqa xmm3,[esi+48]
289 :     pcmpgtw xmm4,xmm2
290 :     psubw xmm1,xmm5
291 :     pmulhw xmm2,xmm7
292 :     pxor xmm5,xmm5
293 :     pcmpgtw xmm5,xmm3
294 :     pmulhw xmm3,xmm7
295 :     psubw xmm2,xmm4
296 :     psubw xmm3,xmm5
297 :     movdqa [edx], xmm0
298 :     lea esi, [esi+64]
299 :     movdqa [edx + 16], xmm1
300 :     movdqa [edx + 32], xmm2
301 :     movdqa [edx + 48], xmm3
302 :    
303 :     dec ecx
304 :     lea edx, [edx+64]
305 :     jne .loop
306 :     jmp .end
307 :    
308 :     .low
309 :     movd xmm7,ecx
310 :     mov ecx,2
311 :     .loop_low
312 :     movdqa xmm0, [esi]
313 :     pxor xmm4,xmm4
314 :     movdqa xmm1, [esi + 16]
315 :     pcmpgtw xmm4,xmm0
316 :     pxor xmm5,xmm5
317 :     psubw xmm0,xmm4
318 :     pcmpgtw xmm5,xmm1
319 :     psraw xmm0,xmm7
320 :     psubw xmm1,xmm5
321 :     movdqa xmm2,[esi+32]
322 :     pxor xmm4,xmm4
323 :     psraw xmm1,xmm7
324 :     pcmpgtw xmm4,xmm2
325 :     pxor xmm5,xmm5
326 :     psubw xmm2,xmm4
327 :     movdqa xmm3,[esi+48]
328 :     pcmpgtw xmm5,xmm3
329 :     psraw xmm2,xmm7
330 :     psubw xmm3,xmm5
331 :     movdqa [edx], xmm0
332 :     psraw xmm3,xmm7
333 :     movdqa [edx+16], xmm1
334 :     movdqa [edx+32],xmm2
335 :     lea esi, [esi+64]
336 :     movdqa [edx+48],xmm3
337 :    
338 :     dec ecx
339 :     lea edx, [edx+64]
340 :     jne .loop_low
341 :    
342 :     .end
343 :     mov edx, [esp + 4 + 4] ; coeff
344 :     mov [edx],ax
345 :     xor eax,eax ; return 0
346 : edgomez 1382
347 :     pop esi
348 :     ret
349 : edgomez 1540 .endfunc
350 : edgomez 1424
351 : edgomez 1382 ;-----------------------------------------------------------------------------
352 :     ;
353 :     ; uint32_t quant_h263_inter_mmx(int16_t * coeff,
354 :     ; const int16_t const * data,
355 :     ; const uint32_t quant,
356 :     ; const uint16_t *mpeg_matrices);
357 :     ;
358 :     ;-----------------------------------------------------------------------------
359 : edgomez 1424
360 : edgomez 1382 ALIGN 16
361 :     quant_h263_inter_mmx:
362 :    
363 :     push ecx
364 :     push esi
365 :     push edi
366 :    
367 :     mov edi, [esp + 12 + 4] ; coeff
368 :     mov esi, [esp + 12 + 8] ; data
369 :     mov eax, [esp + 12 + 12] ; quant
370 :    
371 :     xor ecx, ecx
372 :    
373 :     pxor mm5, mm5 ; sum
374 :     movq mm6, [mmx_sub + eax * 8 - 8] ; sub
375 :    
376 :     cmp al, 1
377 :     jz .q1loop
378 :    
379 :     movq mm7, [mmx_div + eax * 8 - 8] ; divider
380 :    
381 :     ALIGN 8
382 :     .loop
383 :     movq mm0, [esi + 8*ecx] ; mm0 = [1st]
384 :     movq mm3, [esi + 8*ecx + 8]
385 :     pxor mm1, mm1 ; mm1 = 0
386 :     pxor mm4, mm4 ;
387 :     pcmpgtw mm1, mm0 ; mm1 = (0 > mm0)
388 :     pcmpgtw mm4, mm3 ;
389 :     pxor mm0, mm1 ; mm0 = |mm0|
390 :     pxor mm3, mm4 ;
391 :     psubw mm0, mm1 ; displace
392 :     psubw mm3, mm4 ;
393 :     psubusw mm0, mm6 ; mm0 -= sub (unsigned, dont go < 0)
394 :     psubusw mm3, mm6 ;
395 :     pmulhw mm0, mm7 ; mm0 = (mm0 / 2Q) >> 16
396 :     pmulhw mm3, mm7 ;
397 :     paddw mm5, mm0 ; sum += mm0
398 :     pxor mm0, mm1 ; mm0 *= sign(mm0)
399 :     paddw mm5, mm3 ;
400 :     pxor mm3, mm4 ;
401 :     psubw mm0, mm1 ; undisplace
402 :     psubw mm3, mm4
403 :     movq [edi + 8*ecx], mm0
404 :     movq [edi + 8*ecx + 8], mm3
405 :    
406 :     add ecx, 2
407 :     cmp ecx, 16
408 :     jnz .loop
409 :    
410 :     .done
411 :     pmaddwd mm5, [plus_one]
412 :     movq mm0, mm5
413 :     psrlq mm5, 32
414 :     paddd mm0, mm5
415 :    
416 :     movd eax, mm0 ; return sum
417 :     pop edi
418 :     pop esi
419 :     pop ecx
420 :    
421 :     ret
422 :    
423 :     ALIGN 8
424 :     .q1loop
425 :     movq mm0, [esi + 8*ecx] ; mm0 = [1st]
426 :     movq mm3, [esi + 8*ecx+ 8] ;
427 :     pxor mm1, mm1 ; mm1 = 0
428 :     pxor mm4, mm4 ;
429 :     pcmpgtw mm1, mm0 ; mm1 = (0 > mm0)
430 :     pcmpgtw mm4, mm3 ;
431 :     pxor mm0, mm1 ; mm0 = |mm0|
432 :     pxor mm3, mm4 ;
433 :     psubw mm0, mm1 ; displace
434 :     psubw mm3, mm4 ;
435 :     psubusw mm0, mm6 ; mm0 -= sub (unsigned, dont go < 0)
436 :     psubusw mm3, mm6 ;
437 :     psrlw mm0, 1 ; mm0 >>= 1 (/2)
438 :     psrlw mm3, 1 ;
439 :     paddw mm5, mm0 ; sum += mm0
440 :     pxor mm0, mm1 ; mm0 *= sign(mm0)
441 :     paddw mm5, mm3 ;
442 :     pxor mm3, mm4 ;
443 :     psubw mm0, mm1 ; undisplace
444 :     psubw mm3, mm4
445 :     movq [edi + 8*ecx], mm0
446 :     movq [edi + 8*ecx + 8], mm3
447 :    
448 :     add ecx, 2
449 :     cmp ecx, 16
450 :     jnz .q1loop
451 :    
452 :     jmp .done
453 : edgomez 1540 .endfunc
454 : edgomez 1382
455 :    
456 :    
457 :     ;-----------------------------------------------------------------------------
458 :     ;
459 :     ; uint32_t quant_h263_inter_sse2(int16_t * coeff,
460 :     ; const int16_t const * data,
461 :     ; const uint32_t quant,
462 :     ; const uint16_t *mpeg_matrices);
463 :     ;
464 :     ;-----------------------------------------------------------------------------
465 :    
466 :     ALIGN 16
467 :     quant_h263_inter_sse2:
468 :    
469 :     push esi
470 :     push edi
471 :    
472 :     mov edi, [esp + 8 + 4] ; coeff
473 :     mov esi, [esp + 8 + 8] ; data
474 :     mov eax, [esp + 8 + 12] ; quant
475 :    
476 :     xor ecx, ecx
477 :    
478 :     pxor xmm5, xmm5 ; sum
479 :    
480 :     movq mm0, [mmx_sub + eax*8 - 8] ; sub
481 :     movq2dq xmm6, mm0 ; load into low 8 bytes
482 :     movlhps xmm6, xmm6 ; duplicate into high 8 bytes
483 :    
484 :     cmp al, 1
485 :     jz near .qes2_q1loop
486 :    
487 :     .qes2_not1
488 :     movq mm0, [mmx_div + eax*8 - 8] ; divider
489 :     movq2dq xmm7, mm0
490 :     movlhps xmm7, xmm7
491 :    
492 :     ALIGN 16
493 :     .qes2_loop
494 :     movdqa xmm0, [esi + ecx*8] ; xmm0 = [1st]
495 :     movdqa xmm3, [esi + ecx*8 + 16] ; xmm3 = [2nd]
496 :     pxor xmm1, xmm1
497 :     pxor xmm4, xmm4
498 :     pcmpgtw xmm1, xmm0
499 :     pcmpgtw xmm4, xmm3
500 :     pxor xmm0, xmm1
501 :     pxor xmm3, xmm4
502 :     psubw xmm0, xmm1
503 :     psubw xmm3, xmm4
504 :     psubusw xmm0, xmm6
505 :     psubusw xmm3, xmm6
506 :     pmulhw xmm0, xmm7
507 :     pmulhw xmm3, xmm7
508 :     paddw xmm5, xmm0
509 :     pxor xmm0, xmm1
510 :     paddw xmm5, xmm3
511 :     pxor xmm3, xmm4
512 :     psubw xmm0, xmm1
513 :     psubw xmm3, xmm4
514 :     movdqa [edi + ecx*8], xmm0
515 :     movdqa [edi + ecx*8 + 16], xmm3
516 :    
517 :     add ecx, 4
518 :     cmp ecx, 16
519 :     jnz .qes2_loop
520 :    
521 :     .qes2_done
522 :     movdqu xmm6, [plus_one]
523 :     pmaddwd xmm5, xmm6
524 :     movhlps xmm6, xmm5
525 :     paddd xmm5, xmm6
526 :     movdq2q mm0, xmm5
527 :    
528 :     movq mm5, mm0
529 :     psrlq mm5, 32
530 :     paddd mm0, mm5
531 :    
532 :     movd eax, mm0 ; return sum
533 :    
534 :     pop edi
535 :     pop esi
536 :    
537 :     ret
538 :    
539 :     ALIGN 16
540 :     .qes2_q1loop
541 :     movdqa xmm0, [esi + ecx*8] ; xmm0 = [1st]
542 :     movdqa xmm3, [esi + ecx*8 + 16] ; xmm3 = [2nd]
543 :     pxor xmm1, xmm1
544 :     pxor xmm4, xmm4
545 :     pcmpgtw xmm1, xmm0
546 :     pcmpgtw xmm4, xmm3
547 :     pxor xmm0, xmm1
548 :     pxor xmm3, xmm4
549 :     psubw xmm0, xmm1
550 :     psubw xmm3, xmm4
551 :     psubusw xmm0, xmm6
552 :     psubusw xmm3, xmm6
553 :     psrlw xmm0, 1
554 :     psrlw xmm3, 1
555 :     paddw xmm5, xmm0
556 :     pxor xmm0, xmm1
557 :     paddw xmm5, xmm3
558 :     pxor xmm3, xmm4
559 :     psubw xmm0, xmm1
560 :     psubw xmm3, xmm4
561 :     movdqa [edi + ecx*8], xmm0
562 :     movdqa [edi + ecx*8 + 16], xmm3
563 :    
564 :     add ecx, 4
565 :     cmp ecx, 16
566 :     jnz .qes2_q1loop
567 :     jmp .qes2_done
568 : edgomez 1540 .endfunc
569 : edgomez 1382
570 :    
571 :     ;-----------------------------------------------------------------------------
572 :     ;
573 :     ; uint32_t dequant_h263_intra_mmx(int16_t *data,
574 :     ; const int16_t const *coeff,
575 :     ; const uint32_t quant,
576 :     ; const uint32_t dcscalar,
577 :     ; const uint16_t *mpeg_matrices);
578 :     ;
579 :     ;-----------------------------------------------------------------------------
580 :    
581 :     ALIGN 16
582 :     dequant_h263_intra_mmx:
583 :    
584 : edgomez 1424 mov ecx, [esp+12] ; quant
585 :     mov eax, [esp+ 8] ; coeff
586 :     pcmpeqw mm0,mm0
587 :     movq mm6, [mmx_quant + ecx*8] ; quant
588 :     shl ecx,31 ; quant & 1 ? 0 : - 1
589 :     movq mm7,mm6
590 :     movq mm5,mm0
591 :     movd mm1,ecx
592 : edgomez 1382 mov edx, [esp+ 4] ; data
593 : edgomez 1424 psllw mm0,mm1
594 :     paddw mm7,mm7 ; 2*quant
595 :     paddw mm6,mm0 ; quant-1
596 :     psllw mm5,12
597 :     mov ecx,8
598 :     psrlw mm5,1
599 : edgomez 1382
600 : edgomez 1424 .loop:
601 :     movq mm0,[eax]
602 :     pxor mm2,mm2
603 :     pxor mm4,mm4
604 :     pcmpgtw mm2,mm0
605 :     pcmpeqw mm4,mm0
606 :     pmullw mm0,mm7 ; * 2 * quant
607 :     movq mm1,[eax+8]
608 :     psubw mm0,mm2
609 :     pxor mm2,mm6
610 :     pxor mm3,mm3
611 :     pandn mm4,mm2
612 :     pxor mm2,mm2
613 :     pcmpgtw mm3,mm1
614 :     pcmpeqw mm2,mm1
615 :     pmullw mm1,mm7
616 :     paddw mm0,mm4
617 :     psubw mm1,mm3
618 :     pxor mm3,mm6
619 :     pandn mm2,mm3
620 :     paddsw mm0, mm5 ; saturate
621 :     paddw mm1,mm2
622 :    
623 :     paddsw mm1, mm5
624 :     psubsw mm0, mm5
625 :     psubsw mm1, mm5
626 :     psubsw mm0, mm5
627 :     psubsw mm1, mm5
628 :     paddsw mm0, mm5
629 :     paddsw mm1, mm5
630 :    
631 :     movq [edx],mm0
632 :     lea eax,[eax+16]
633 :     movq [edx+8],mm1
634 :    
635 :     dec ecx
636 :     lea edx,[edx+16]
637 :     jne .loop
638 :    
639 :     ; deal with DC
640 :     mov eax, [esp+ 8] ; coeff
641 : edgomez 1432 movd mm1,[esp+16] ; dcscalar
642 :     movd mm0,[eax] ; coeff[0]
643 :     pmullw mm0,mm1 ; * dcscalar
644 : edgomez 1424 mov edx, [esp+ 4] ; data
645 : edgomez 1432 paddsw mm0, mm5 ; saturate +
646 :     psubsw mm0, mm5
647 :     psubsw mm0, mm5 ; saturate -
648 :     paddsw mm0, mm5
649 :     movd eax,mm0
650 : edgomez 1382 mov [edx], ax
651 :    
652 : edgomez 1424 xor eax, eax ; return 0
653 : edgomez 1382 ret
654 : edgomez 1540 .endfunc
655 : edgomez 1382
656 :     ;-----------------------------------------------------------------------------
657 :     ;
658 :     ; uint32_t dequant_h263_intra_xmm(int16_t *data,
659 :     ; const int16_t const *coeff,
660 :     ; const uint32_t quant,
661 :     ; const uint32_t dcscalar,
662 :     ; const uint16_t *mpeg_matrices);
663 :     ;
664 :     ;-----------------------------------------------------------------------------
665 :    
666 : edgomez 1424
667 :     ALIGN 16
668 : edgomez 1382 dequant_h263_intra_xmm:
669 :    
670 : edgomez 1424 mov ecx, [esp+12] ; quant
671 :     mov eax, [esp+ 8] ; coeff
672 :    
673 :     movd mm6,ecx ; quant
674 :     pcmpeqw mm0,mm0
675 :     pshufw mm6,mm6,0 ; all quant
676 :     shl ecx,31
677 :     movq mm5,mm0
678 :     movq mm7,mm6
679 :     movd mm1,ecx
680 : edgomez 1382 mov edx, [esp+ 4] ; data
681 : edgomez 1424 psllw mm0,mm1 ; quant & 1 ? 0 : - 1
682 :     movq mm4,mm5
683 :     paddw mm7,mm7 ; quant*2
684 :     paddw mm6,mm0 ; quant-1
685 :     psrlw mm4,5 ; mm4=2047
686 :     mov ecx,8
687 :     pxor mm5,mm4 ; mm5=-2048
688 :    
689 :     .loop:
690 :     movq mm0,[eax]
691 :     pxor mm2,mm2
692 :     pxor mm3,mm3
693 : edgomez 1382
694 : edgomez 1424 pcmpgtw mm2,mm0
695 :     pcmpeqw mm3,mm0 ; if coeff==0...
696 :     pmullw mm0,mm7 ; * 2 * quant
697 :     movq mm1,[eax+8]
698 :    
699 :     psubw mm0,mm2
700 :     pxor mm2,mm6
701 :     pandn mm3,mm2 ; ...then data=0
702 :     pxor mm2,mm2
703 :     paddw mm0,mm3
704 :     pxor mm3,mm3
705 :     pcmpeqw mm2,mm1
706 :     pcmpgtw mm3,mm1
707 :     pmullw mm1,mm7
708 :    
709 :     pminsw mm0,mm4
710 :     psubw mm1,mm3
711 :     pxor mm3,mm6
712 :     pandn mm2,mm3
713 :     paddw mm1,mm2
714 :    
715 :     pmaxsw mm0,mm5
716 :     pminsw mm1,mm4
717 :     movq [edx],mm0
718 :     pmaxsw mm1,mm5
719 :     lea eax,[eax+16]
720 :     movq [edx+8],mm1
721 :    
722 :     dec ecx
723 :     lea edx,[edx+16]
724 :     jne .loop
725 :    
726 :     ; deal with DC
727 :     mov eax, [esp+ 8] ; coeff
728 : edgomez 1432 movd mm1,[esp+16] ; dcscalar
729 :     movd mm0, [eax]
730 :     pmullw mm0, mm1
731 : edgomez 1424 mov edx, [esp+ 4] ; data
732 :     pminsw mm0,mm4
733 :     pmaxsw mm0,mm5
734 : edgomez 1382 movd eax, mm0
735 :     mov [edx], ax
736 :    
737 : edgomez 1424 xor eax, eax ; return 0
738 : edgomez 1382 ret
739 : edgomez 1540 .endfunc
740 : edgomez 1382
741 :    
742 :     ;-----------------------------------------------------------------------------
743 :     ;
744 :     ; uint32_t dequant_h263_intra_sse2(int16_t *data,
745 :     ; const int16_t const *coeff,
746 :     ; const uint32_t quant,
747 :     ; const uint32_t dcscalar,
748 :     ; const uint16_t *mpeg_matrices);
749 :     ;
750 :     ;-----------------------------------------------------------------------------
751 :    
752 : edgomez 1424 ALIGN 16
753 : edgomez 1382 dequant_h263_intra_sse2:
754 :    
755 : edgomez 1424 mov ecx, [esp+12] ; quant
756 :     mov eax, [esp+ 8] ; coeff
757 :    
758 :     movd xmm6,ecx ; quant
759 : edgomez 1432
760 : edgomez 1424 shl ecx,31
761 :     pshuflw xmm6,xmm6,0
762 :     pcmpeqw xmm0,xmm0
763 :     movlhps xmm6,xmm6 ; all quant
764 :     movd xmm1,ecx
765 :     movdqa xmm5,xmm0
766 :     movdqa xmm7,xmm6
767 :     mov edx, [esp+ 4] ; data
768 :     paddw xmm7,xmm7 ; quant *2
769 :     psllw xmm0,xmm1 ; quant & 1 ? 0 : - 1
770 :     movdqa xmm4,xmm5
771 :     paddw xmm6,xmm0 ; quant-1
772 :     psrlw xmm4,5 ; 2047
773 :     mov ecx,4
774 :     pxor xmm5,xmm4 ; mm5=-2048
775 :    
776 :     .loop:
777 :     movdqa xmm0,[eax]
778 :     pxor xmm2,xmm2
779 :     pxor xmm3,xmm3
780 : edgomez 1382
781 : edgomez 1424 pcmpgtw xmm2,xmm0
782 :     pcmpeqw xmm3,xmm0
783 :     pmullw xmm0,xmm7 ; * 2 * quant
784 :     movdqa xmm1,[eax+16]
785 :    
786 :     psubw xmm0,xmm2
787 :     pxor xmm2,xmm6
788 :     pandn xmm3,xmm2
789 :     pxor xmm2,xmm2
790 :     paddw xmm0,xmm3
791 :     pxor xmm3,xmm3
792 :     pcmpeqw xmm2,xmm1
793 :     pcmpgtw xmm3,xmm1
794 :     pmullw xmm1,xmm7
795 :    
796 :     pminsw xmm0,xmm4
797 :     psubw xmm1,xmm3
798 :     pxor xmm3,xmm6
799 :     pandn xmm2,xmm3
800 :     paddw xmm1,xmm2
801 :    
802 :     pmaxsw xmm0,xmm5
803 :     pminsw xmm1,xmm4
804 :     movdqa [edx],xmm0
805 :     pmaxsw xmm1,xmm5
806 :     lea eax,[eax+32]
807 :     movdqa [edx+16],xmm1
808 :    
809 :     dec ecx
810 :     lea edx,[edx+32]
811 :     jne .loop
812 :    
813 :     ; deal with DC
814 : edgomez 1382
815 : edgomez 1424 mov eax, [esp+ 8] ; coeff
816 :     movsx eax,word [eax]
817 : edgomez 1432 imul dword [esp+16] ; dcscalar
818 :     mov edx, [esp+ 4] ; data
819 : edgomez 1424 movd xmm0,eax
820 :     pminsw xmm0,xmm4
821 :     pmaxsw xmm0,xmm5
822 :     movd eax,xmm0
823 :    
824 : edgomez 1382 mov [edx], ax
825 :    
826 : edgomez 1432 xor eax, eax ; return 0
827 : edgomez 1382 ret
828 : edgomez 1540 .endfunc
829 : edgomez 1382
830 :     ;-----------------------------------------------------------------------------
831 :     ;
832 :     ; uint32t dequant_h263_inter_mmx(int16_t * data,
833 :     ; const int16_t * const coeff,
834 :     ; const uint32_t quant,
835 :     ; const uint16_t *mpeg_matrices);
836 :     ;
837 :     ;-----------------------------------------------------------------------------
838 :    
839 :     ALIGN 16
840 :     dequant_h263_inter_mmx:
841 :    
842 : edgomez 1424 mov ecx, [esp+12] ; quant
843 :     mov eax, [esp+ 8] ; coeff
844 :     pcmpeqw mm0,mm0
845 :     movq mm6, [mmx_quant + ecx*8] ; quant
846 :     shl ecx,31 ; odd/even
847 :     movq mm7,mm6
848 :     movd mm1,ecx
849 :     mov edx, [esp+ 4] ; data
850 :     movq mm5,mm0
851 :     psllw mm0,mm1 ; quant & 1 ? 0 : - 1
852 :     paddw mm7,mm7 ; quant*2
853 :     paddw mm6,mm0 ; quant & 1 ? quant : quant - 1
854 :     psllw mm5,12
855 :     mov ecx,8
856 :     psrlw mm5,1 ; 32767-2047 (32768-2048)
857 : edgomez 1382
858 : edgomez 1424 .loop:
859 :     movq mm0,[eax]
860 :     pxor mm4,mm4
861 :     pxor mm2,mm2
862 :     pcmpeqw mm4,mm0 ; if coeff==0...
863 :     pcmpgtw mm2,mm0
864 :     pmullw mm0,mm7 ; * 2 * quant
865 :     pxor mm3,mm3
866 :     psubw mm0,mm2
867 :     movq mm1,[eax+8]
868 :     pxor mm2,mm6
869 :     pcmpgtw mm3,mm1
870 :     pandn mm4,mm2 ; ... then data==0
871 :     pmullw mm1,mm7
872 :     pxor mm2,mm2
873 :     pcmpeqw mm2,mm1
874 :     psubw mm1,mm3
875 :     pxor mm3,mm6
876 :     pandn mm2,mm3
877 :     paddw mm0,mm4
878 :     paddw mm1,mm2
879 :    
880 :     paddsw mm0, mm5 ; saturate
881 :     paddsw mm1, mm5
882 :     psubsw mm0, mm5
883 :     psubsw mm1, mm5
884 :     psubsw mm0, mm5
885 :     psubsw mm1, mm5
886 :     paddsw mm0, mm5
887 :     paddsw mm1, mm5
888 :    
889 :     movq [edx],mm0
890 :     lea eax,[eax+16]
891 :     movq [edx+8],mm1
892 :    
893 :     dec ecx
894 :     lea edx,[edx+16]
895 :     jne .loop
896 :    
897 :     xor eax, eax ; return 0
898 :     ret
899 : edgomez 1540 .endfunc
900 : edgomez 1382
901 :    
902 :     ;-----------------------------------------------------------------------------
903 :     ;
904 :     ; uint32_t dequant_h263_inter_xmm(int16_t * data,
905 :     ; const int16_t * const coeff,
906 :     ; const uint32_t quant,
907 :     ; const uint16_t *mpeg_matrices);
908 :     ;
909 :     ;-----------------------------------------------------------------------------
910 : edgomez 1424 ALIGN 16
911 : edgomez 1382 dequant_h263_inter_xmm:
912 :    
913 : edgomez 1424 mov ecx, [esp+12] ; quant
914 :     mov eax, [esp+ 8] ; coeff
915 :     pcmpeqw mm0,mm0
916 :     movq mm6, [mmx_quant + ecx*8] ; quant
917 :     shl ecx,31
918 :     movq mm5,mm0
919 :     movd mm1,ecx
920 :     movq mm7,mm6
921 :     psllw mm0,mm1
922 :     mov edx, [esp+ 4] ; data
923 :     movq mm4,mm5
924 :     paddw mm7,mm7
925 :     paddw mm6,mm0 ; quant-1
926 : edgomez 1382
927 : edgomez 1424 psrlw mm4,5
928 :     mov ecx,8
929 :     pxor mm5,mm4 ; mm5=-2048
930 :    
931 :     .loop:
932 :     movq mm0,[eax]
933 :     pxor mm3,mm3
934 :     pxor mm2,mm2
935 :     pcmpeqw mm3,mm0
936 :     pcmpgtw mm2,mm0
937 :     pmullw mm0,mm7 ; * 2 * quant
938 :     pandn mm3,mm6
939 :     movq mm1,[eax+8]
940 :     psubw mm0,mm2
941 :     pxor mm2,mm3
942 :     pxor mm3,mm3
943 :     paddw mm0,mm2
944 :     pxor mm2,mm2
945 :     pcmpgtw mm3,mm1
946 :     pcmpeqw mm2,mm1
947 :     pmullw mm1,mm7
948 :     pandn mm2,mm6
949 :     psubw mm1,mm3
950 :     pxor mm3,mm2
951 :     paddw mm1,mm3
952 :    
953 :     pminsw mm0,mm4
954 :     pminsw mm1,mm4
955 :     pmaxsw mm0,mm5
956 :     pmaxsw mm1,mm5
957 :    
958 :     movq [edx],mm0
959 :     lea eax,[eax+16]
960 :     movq [edx+8],mm1
961 :    
962 :     dec ecx
963 :     lea edx,[edx+16]
964 :     jne .loop
965 : edgomez 1382
966 : edgomez 1424 xor eax, eax ; return 0
967 : edgomez 1382 ret
968 : edgomez 1540 .endfunc
969 : edgomez 1382
970 : edgomez 1424
971 : edgomez 1382 ;-----------------------------------------------------------------------------
972 :     ;
973 :     ; uint32_t dequant_h263_inter_sse2(int16_t * data,
974 :     ; const int16_t * const coeff,
975 :     ; const uint32_t quant,
976 :     ; const uint16_t *mpeg_matrices);
977 :     ;
978 :     ;-----------------------------------------------------------------------------
979 :    
980 :     ALIGN 16
981 :     dequant_h263_inter_sse2:
982 :    
983 : edgomez 1424 mov ecx, [esp+12] ; quant
984 :     mov eax, [esp+ 8] ; coeff
985 : edgomez 1382
986 : edgomez 1424 movq xmm6, [mmx_quant + ecx*8] ; quant
987 :     inc ecx
988 :     pcmpeqw xmm5,xmm5
989 :     and ecx,1
990 :     movlhps xmm6,xmm6
991 :     movd xmm0,ecx
992 :     movdqa xmm7,xmm6
993 :     pshuflw xmm0,xmm0,0
994 :     movdqa xmm4,xmm5
995 :     mov edx, [esp+ 4] ; data
996 :     movlhps xmm0,xmm0
997 :     paddw xmm7,xmm7
998 :     psubw xmm6,xmm0
999 :     psrlw xmm4,5 ; 2047
1000 :     mov ecx,4
1001 :     pxor xmm5,xmm4 ; mm5=-2048
1002 :    
1003 :     .loop:
1004 :     movdqa xmm0,[eax]
1005 :     pxor xmm3,xmm3
1006 :     pxor xmm2,xmm2
1007 :     pcmpeqw xmm3,xmm0
1008 :     pcmpgtw xmm2,xmm0
1009 :     pmullw xmm0,xmm7 ; * 2 * quant
1010 :     pandn xmm3,xmm6
1011 :     movdqa xmm1,[eax+16]
1012 :     psubw xmm0,xmm2
1013 :     pxor xmm2,xmm3
1014 :     pxor xmm3,xmm3
1015 :     paddw xmm0,xmm2
1016 :     pxor xmm2,xmm2
1017 :     pcmpgtw xmm3,xmm1
1018 :     pcmpeqw xmm2,xmm1
1019 :     pmullw xmm1,xmm7
1020 :     pandn xmm2,xmm6
1021 :     psubw xmm1,xmm3
1022 :     pxor xmm3,xmm2
1023 :     paddw xmm1,xmm3
1024 :    
1025 :     pminsw xmm0,xmm4
1026 :     pminsw xmm1,xmm4
1027 :     pmaxsw xmm0,xmm5
1028 :     pmaxsw xmm1,xmm5
1029 :    
1030 :     movdqa [edx],xmm0
1031 :     lea eax,[eax+32]
1032 :     movdqa [edx+16],xmm1
1033 :    
1034 :     dec ecx
1035 :     lea edx,[edx+32]
1036 :     jne .loop
1037 : edgomez 1382
1038 : edgomez 1424 xor eax, eax ; return 0
1039 :     ret
1040 : edgomez 1540 .endfunc
1041 : edgomez 1382

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