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

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