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

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