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

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