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

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