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

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