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

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