[svn] / trunk / xvidcore / src / quant / x86_asm / quantize4_mmx.asm Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/quant/x86_asm/quantize4_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4 - (view) (download)

1 : Isibaar 3 ;/******************************************************************************
2 :     ; * *
3 :     ; * This file is part of XviD, a free MPEG-4 video encoder/decoder *
4 :     ; * *
5 :     ; * XviD is an implementation of a part of one or more MPEG-4 Video tools *
6 :     ; * as specified in ISO/IEC 14496-2 standard. Those intending to use this *
7 :     ; * software module in hardware or software products are advised that its *
8 :     ; * use may infringe existing patents or copyrights, and any such use *
9 :     ; * would be at such party's own risk. The original developer of this *
10 :     ; * software module and his/her company, and subsequent editors and their *
11 :     ; * companies, will have no liability for use of this software or *
12 :     ; * modifications or derivatives thereof. *
13 :     ; * *
14 :     ; * XviD is free software; you can redistribute it and/or modify it *
15 :     ; * under the terms of the GNU General Public License as published by *
16 :     ; * the Free Software Foundation; either version 2 of the License, or *
17 :     ; * (at your option) any later version. *
18 :     ; * *
19 :     ; * XviD is distributed in the hope that it will be useful, but *
20 :     ; * WITHOUT ANY WARRANTY; without even the implied warranty of *
21 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
22 :     ; * GNU General Public License for more details. *
23 :     ; * *
24 :     ; * You should have received a copy of the GNU General Public License *
25 :     ; * along with this program; if not, write to the Free Software *
26 :     ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
27 :     ; * *
28 :     ; ******************************************************************************/
29 :     ;
30 :     ;/******************************************************************************
31 :     ; * *
32 :     ; * quantize4.asm, MMX optimized MPEG quantization/dequantization *
33 :     ; * *
34 :     ; * Copyright (C) 2002 - Peter Ross <pross@cs.rmit.edu.au> *
35 :     ; * Copyright (C) 2002 - Michael Militzer <isibaar@xvid.org> *
36 :     ; * *
37 :     ; * For more information visit the XviD homepage: http://www.xvid.org *
38 :     ; * *
39 :     ; ******************************************************************************/
40 :     ;
41 :     ;/******************************************************************************
42 :     ; * *
43 :     ; * Revision history: *
44 :     ; * *
45 :     ; * 22.01.2002 initial version *
46 :     ; * *
47 :     ; ******************************************************************************/
48 :    
49 :     ; data/text alignment
50 :     %define ALIGN 8
51 :    
52 :     %define SATURATE
53 :    
54 :     bits 32
55 :    
56 :     section .data
57 :    
58 :     %macro cglobal 1
59 :     %ifdef PREFIX
60 :     global _%1
61 :     %define %1 _%1
62 :     %else
63 :     global %1
64 :     %endif
65 :     %endmacro
66 :    
67 : Isibaar 4 %macro cextern 1
68 :     %ifdef PREFIX
69 :     extern _%1
70 :     %define %1 _%1
71 :     %else
72 :     extern %1
73 :     %endif
74 :     %endmacro
75 :    
76 : Isibaar 3 mmx_one times 4 dw 1
77 :    
78 :     ;===========================================================================
79 :     ;
80 :     ; divide by 2Q table
81 :     ;
82 :     ;===========================================================================
83 :    
84 :     %macro MMX_DIV 1
85 :     times 4 dw (1 << 17) / (%1 * 2) + 1
86 :     %endmacro
87 :    
88 :     align ALIGN
89 :     mmx_div
90 :     MMX_DIV 1
91 :     MMX_DIV 2
92 :     MMX_DIV 3
93 :     MMX_DIV 4
94 :     MMX_DIV 5
95 :     MMX_DIV 6
96 :     MMX_DIV 7
97 :     MMX_DIV 8
98 :     MMX_DIV 9
99 :     MMX_DIV 10
100 :     MMX_DIV 11
101 :     MMX_DIV 12
102 :     MMX_DIV 13
103 :     MMX_DIV 14
104 :     MMX_DIV 15
105 :     MMX_DIV 16
106 :     MMX_DIV 17
107 :     MMX_DIV 18
108 :     MMX_DIV 19
109 :     MMX_DIV 20
110 :     MMX_DIV 21
111 :     MMX_DIV 22
112 :     MMX_DIV 23
113 :     MMX_DIV 24
114 :     MMX_DIV 25
115 :     MMX_DIV 26
116 :     MMX_DIV 27
117 :     MMX_DIV 28
118 :     MMX_DIV 29
119 :     MMX_DIV 30
120 :     MMX_DIV 31
121 :    
122 :    
123 :     ;===========================================================================
124 :     ;
125 : Isibaar 4 ; intra matrix
126 : Isibaar 3 ;
127 :     ;===========================================================================
128 :    
129 : Isibaar 4 cextern intra_matrix
130 :     cextern intra_matrix_fix
131 : Isibaar 3
132 :     ;===========================================================================
133 :     ;
134 : Isibaar 4 ; inter matrix
135 : Isibaar 3 ;
136 :     ;===========================================================================
137 :    
138 : Isibaar 4 cextern inter_matrix
139 :     cextern inter_matrix_fix
140 : Isibaar 3
141 :    
142 :     %define VM18P 3
143 :     %define VM18Q 4
144 :    
145 : Isibaar 4
146 : Isibaar 3 ;===========================================================================
147 :     ;
148 :     ; quantd table
149 :     ;
150 :     ;===========================================================================
151 :    
152 :     %macro MMX_QUANTD 1
153 :     times 4 dw ((VM18P*%1) + (VM18Q/2)) / VM18Q
154 :     %endmacro
155 :    
156 :     quantd
157 :     MMX_QUANTD 1
158 :     MMX_QUANTD 2
159 :     MMX_QUANTD 3
160 :     MMX_QUANTD 4
161 :     MMX_QUANTD 5
162 :     MMX_QUANTD 6
163 :     MMX_QUANTD 7
164 :     MMX_QUANTD 8
165 :     MMX_QUANTD 9
166 :     MMX_QUANTD 10
167 :     MMX_QUANTD 11
168 :     MMX_QUANTD 12
169 :     MMX_QUANTD 13
170 :     MMX_QUANTD 14
171 :     MMX_QUANTD 15
172 :     MMX_QUANTD 16
173 :     MMX_QUANTD 17
174 :     MMX_QUANTD 18
175 :     MMX_QUANTD 19
176 :     MMX_QUANTD 20
177 :     MMX_QUANTD 21
178 :     MMX_QUANTD 22
179 :     MMX_QUANTD 23
180 :     MMX_QUANTD 24
181 :     MMX_QUANTD 25
182 :     MMX_QUANTD 26
183 :     MMX_QUANTD 27
184 :     MMX_QUANTD 28
185 :     MMX_QUANTD 29
186 :     MMX_QUANTD 30
187 :     MMX_QUANTD 31
188 :    
189 :    
190 :     ;===========================================================================
191 :     ;
192 :     ; multiple by 2Q table
193 :     ;
194 :     ;===========================================================================
195 :    
196 :     %macro MMX_MUL_QUANT 1
197 :     times 4 dw %1
198 :     %endmacro
199 :    
200 :     mmx_mul_quant
201 :     MMX_MUL_QUANT 1
202 :     MMX_MUL_QUANT 2
203 :     MMX_MUL_QUANT 3
204 :     MMX_MUL_QUANT 4
205 :     MMX_MUL_QUANT 5
206 :     MMX_MUL_QUANT 6
207 :     MMX_MUL_QUANT 7
208 :     MMX_MUL_QUANT 8
209 :     MMX_MUL_QUANT 9
210 :     MMX_MUL_QUANT 10
211 :     MMX_MUL_QUANT 11
212 :     MMX_MUL_QUANT 12
213 :     MMX_MUL_QUANT 13
214 :     MMX_MUL_QUANT 14
215 :     MMX_MUL_QUANT 15
216 :     MMX_MUL_QUANT 16
217 :     MMX_MUL_QUANT 17
218 :     MMX_MUL_QUANT 18
219 :     MMX_MUL_QUANT 19
220 :     MMX_MUL_QUANT 20
221 :     MMX_MUL_QUANT 21
222 :     MMX_MUL_QUANT 22
223 :     MMX_MUL_QUANT 23
224 :     MMX_MUL_QUANT 24
225 :     MMX_MUL_QUANT 25
226 :     MMX_MUL_QUANT 26
227 :     MMX_MUL_QUANT 27
228 :     MMX_MUL_QUANT 28
229 :     MMX_MUL_QUANT 29
230 :     MMX_MUL_QUANT 30
231 :     MMX_MUL_QUANT 31
232 :    
233 :     ;===========================================================================
234 :     ;
235 :     ; saturation limits
236 :     ;
237 :     ;===========================================================================
238 :    
239 :     align 16
240 :     mmx_32768_minus_2048 times 4 dw (32768-2048)
241 :     mmx_32767_minus_2047 times 4 dw (32767-2047)
242 :    
243 :     section .text
244 :    
245 :     ;===========================================================================
246 :     ;
247 :     ; void quant_intra4_mmx(int16_t * coeff,
248 :     ; const int16_t const * data,
249 :     ; const uint32_t quant,
250 :     ; const uint32_t dcscalar);
251 :     ;
252 :     ;===========================================================================
253 :    
254 :     align ALIGN
255 :     cglobal quant4_intra_mmx
256 :     quant4_intra_mmx
257 :    
258 :     push ecx
259 :     push esi
260 :     push edi
261 :    
262 :     mov edi, [esp + 12 + 4] ; coeff
263 :     mov esi, [esp + 12 + 8] ; data
264 :     mov eax, [esp + 12 + 12] ; quant
265 :    
266 :     movq mm5, [quantd + eax * 8 - 8] ; quantd -> mm5
267 :    
268 :     xor ecx, ecx
269 :     cmp al, 1
270 :     jz near .q1loop
271 :    
272 :     cmp al, 2
273 :     jz near .q2loop
274 :    
275 :     movq mm7, [mmx_div + eax * 8 - 8] ; multipliers[quant] -> mm7
276 :    
277 :     align ALIGN
278 :     .loop
279 :     movq mm0, [esi + 8*ecx] ; mm0 = [1st]
280 :     movq mm3, [esi + 8*ecx + 8] ;
281 :    
282 :     pxor mm1, mm1 ; mm1 = 0
283 :     pxor mm4, mm4
284 :    
285 :     pcmpgtw mm1, mm0 ; mm1 = (0 > mm0)
286 :     pcmpgtw mm4, mm3
287 :    
288 :     pxor mm0, mm1 ; mm0 = |mm0|
289 :     pxor mm3, mm4 ;
290 :     psubw mm0, mm1 ; displace
291 :     psubw mm3, mm4 ;
292 :    
293 :     psllw mm0, 4 ; level << 4
294 :     psllw mm3, 4 ;
295 :    
296 : Isibaar 4 movq mm2, [intra_matrix + 8*ecx]
297 : Isibaar 3 psrlw mm2, 1 ; intra_matrix[i]>>1
298 :     paddw mm0, mm2
299 :    
300 : Isibaar 4 movq mm2, [intra_matrix_fix + ecx*8]
301 : Isibaar 3 pmulhw mm0, mm2 ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]
302 :    
303 : Isibaar 4 movq mm2, [intra_matrix + 8*ecx + 8]
304 : Isibaar 3 psrlw mm2, 1
305 :     paddw mm3, mm2
306 :    
307 : Isibaar 4 movq mm2, [intra_matrix_fix + ecx*8 + 8]
308 : Isibaar 3 pmulhw mm3, mm2
309 :    
310 :     paddw mm0, mm5 ; + quantd
311 :     paddw mm3, mm5
312 :    
313 :     pmulhw mm0, mm7 ; mm0 = (mm0 / 2Q) >> 16
314 :     pmulhw mm3, mm7 ;
315 :     psrlw mm0, 1 ; additional shift by 1 => 16 + 1 = 17
316 :     psrlw mm3, 1
317 :    
318 :     pxor mm0, mm1 ; mm0 *= sign(mm0)
319 :     pxor mm3, mm4 ;
320 :     psubw mm0, mm1 ; undisplace
321 :     psubw mm3, mm4 ;
322 :    
323 :     movq [edi + 8*ecx], mm0
324 :     movq [edi + 8*ecx + 8], mm3
325 :    
326 :     add ecx,2
327 :     cmp ecx,16
328 :     jnz near .loop
329 :    
330 :     .done
331 :     ; caclulate data[0] // (int32_t)dcscalar)
332 :    
333 :     mov ecx, [esp + 12 + 16] ; dcscalar
334 :     mov edx, ecx
335 :     movsx eax, word [esi] ; data[0]
336 :     shr edx, 1 ; edx = dcscalar /2
337 :     cmp eax, 0
338 :     jg .gtzero
339 :    
340 :     sub eax, edx
341 :     jmp short .mul
342 :     .gtzero
343 :     add eax, edx
344 :     .mul
345 :     cdq ; expand eax -> edx:eax
346 :     idiv ecx ; eax = edx:eax / dcscalar
347 :    
348 :     mov [edi], ax ; coeff[0] = ax
349 :    
350 :     pop edi
351 :     pop esi
352 :     pop ecx
353 :    
354 :     ret
355 :    
356 :     align ALIGN
357 :     .q1loop
358 :     movq mm0, [esi + 8*ecx] ; mm0 = [1st]
359 :     movq mm3, [esi + 8*ecx + 8] ;
360 :    
361 :     pxor mm1, mm1 ; mm1 = 0
362 :     pxor mm4, mm4 ;
363 :    
364 :     pcmpgtw mm1, mm0 ; mm1 = (0 > mm0)
365 :     pcmpgtw mm4, mm3 ;
366 :    
367 :     pxor mm0, mm1 ; mm0 = |mm0|
368 :     pxor mm3, mm4 ;
369 :     psubw mm0, mm1 ; displace
370 :     psubw mm3, mm4 ;
371 :    
372 :     psllw mm0, 4
373 :     psllw mm3, 4
374 :    
375 : Isibaar 4 movq mm2, [intra_matrix + 8*ecx]
376 : Isibaar 3 psrlw mm2, 1
377 :     paddw mm0, mm2
378 :    
379 : Isibaar 4 movq mm2, [intra_matrix_fix + ecx*8]
380 : Isibaar 3 pmulhw mm0, mm2 ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]
381 :    
382 : Isibaar 4 movq mm2, [intra_matrix + 8*ecx + 8]
383 : Isibaar 3 psrlw mm2, 1
384 :     paddw mm3, mm2
385 :    
386 : Isibaar 4 movq mm2, [intra_matrix_fix + ecx*8 + 8]
387 : Isibaar 3 pmulhw mm3, mm2
388 :    
389 :     paddw mm0, mm5
390 :     paddw mm3, mm5
391 :    
392 :     psrlw mm0, 1 ; mm0 >>= 1 (/2)
393 :     psrlw mm3, 1 ;
394 :    
395 :     pxor mm0, mm1 ; mm0 *= sign(mm0)
396 :     pxor mm3, mm4 ;
397 :     psubw mm0, mm1 ; undisplace
398 :     psubw mm3, mm4 ;
399 :    
400 :     movq [edi + 8*ecx], mm0
401 :     movq [edi + 8*ecx + 8], mm3
402 :    
403 :     add ecx,2
404 :     cmp ecx,16
405 :     jnz near .q1loop
406 :     jmp near .done
407 :    
408 :    
409 :     align ALIGN
410 :     .q2loop
411 :     movq mm0, [esi + 8*ecx] ; mm0 = [1st]
412 :     movq mm3, [esi + 8*ecx + 8] ;
413 :    
414 :     pxor mm1, mm1 ; mm1 = 0
415 :     pxor mm4, mm4 ;
416 :    
417 :     pcmpgtw mm1, mm0 ; mm1 = (0 > mm0)
418 :     pcmpgtw mm4, mm3 ;
419 :    
420 :     pxor mm0, mm1 ; mm0 = |mm0|
421 :     pxor mm3, mm4 ;
422 :     psubw mm0, mm1 ; displace
423 :     psubw mm3, mm4 ;
424 :    
425 :     psllw mm0, 4
426 :     psllw mm3, 4
427 :    
428 : Isibaar 4 movq mm2, [intra_matrix + 8*ecx]
429 : Isibaar 3 psrlw mm2, 1
430 :     paddw mm0, mm2
431 :    
432 : Isibaar 4 movq mm2, [intra_matrix_fix + ecx*8]
433 : Isibaar 3 pmulhw mm0, mm2 ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]
434 :    
435 : Isibaar 4 movq mm2, [intra_matrix + 8*ecx + 8]
436 : Isibaar 3 psrlw mm2, 1
437 :     paddw mm3, mm2
438 :    
439 : Isibaar 4 movq mm2, [intra_matrix_fix + ecx*8 + 8]
440 : Isibaar 3 pmulhw mm3, mm2
441 :    
442 :     paddw mm0, mm5
443 :     paddw mm3, mm5
444 :    
445 :     psrlw mm0, 2 ; mm0 >>= 1 (/4)
446 :     psrlw mm3, 2 ;
447 :    
448 :     pxor mm0, mm1 ; mm0 *= sign(mm0)
449 :     pxor mm3, mm4 ;
450 :     psubw mm0, mm1 ; undisplace
451 :     psubw mm3, mm4 ;
452 :    
453 :     movq [edi + 8*ecx], mm0
454 :     movq [edi + 8*ecx + 8], mm3
455 :    
456 :     add ecx,2
457 :     cmp ecx,16
458 :     jnz near .q2loop
459 :     jmp near .done
460 :    
461 :    
462 :     ;===========================================================================
463 :     ;
464 :     ; uint32_t quant4_inter_mmx(int16_t * coeff,
465 :     ; const int16_t const * data,
466 :     ; const uint32_t quant);
467 :     ;
468 :     ;===========================================================================
469 :    
470 :     align ALIGN
471 :     cglobal quant4_inter_mmx
472 :     quant4_inter_mmx
473 :    
474 :     push ecx
475 :     push esi
476 :     push edi
477 :    
478 :     mov edi, [esp + 12 + 4] ; coeff
479 :     mov esi, [esp + 12 + 8] ; data
480 :     mov eax, [esp + 12 + 12] ; quant
481 :    
482 :     xor ecx, ecx
483 :    
484 :     pxor mm5, mm5 ; sum
485 :    
486 :     cmp al, 1
487 :     jz near .q1loop
488 :    
489 :     cmp al, 2
490 :     jz near .q2loop
491 :    
492 :     movq mm7, [mmx_div + eax * 8 - 8] ; divider
493 :    
494 :     align ALIGN
495 :     .loop
496 :     movq mm0, [esi + 8*ecx] ; mm0 = [1st]
497 :     movq mm3, [esi + 8*ecx + 8] ;
498 :     pxor mm1, mm1 ; mm1 = 0
499 :     pxor mm4, mm4 ;
500 :     pcmpgtw mm1, mm0 ; mm1 = (0 > mm0)
501 :     pcmpgtw mm4, mm3 ;
502 :     pxor mm0, mm1 ; mm0 = |mm0|
503 :     pxor mm3, mm4 ;
504 :     psubw mm0, mm1 ; displace
505 :     psubw mm3, mm4 ;
506 :    
507 :     psllw mm0, 4
508 :     psllw mm3, 4
509 :    
510 : Isibaar 4 movq mm2, [inter_matrix + 8*ecx]
511 : Isibaar 3 psrlw mm2, 1
512 :     paddw mm0, mm2
513 :    
514 : Isibaar 4 movq mm2, [inter_matrix_fix + ecx*8]
515 : Isibaar 3 pmulhw mm0, mm2 ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
516 :    
517 : Isibaar 4 movq mm2, [inter_matrix + 8*ecx + 8]
518 : Isibaar 3 psrlw mm2, 1
519 :     paddw mm3, mm2
520 :    
521 : Isibaar 4 movq mm2, [inter_matrix_fix + ecx*8 + 8]
522 : Isibaar 3 pmulhw mm3, mm2
523 :    
524 :     pmulhw mm0, mm7 ; mm0 = (mm0 / 2Q) >> 16
525 :     pmulhw mm3, mm7 ;
526 :     psrlw mm0, 1 ; additional shift by 1 => 16 + 1 = 17
527 :     psrlw mm3, 1
528 :    
529 :     paddw mm5, mm0 ; sum += mm0
530 :     pxor mm0, mm1 ; mm0 *= sign(mm0)
531 :     paddw mm5, mm3 ;
532 :     pxor mm3, mm4 ;
533 :     psubw mm0, mm1 ; undisplace
534 :     psubw mm3, mm4
535 :     movq [edi + 8*ecx], mm0
536 :     movq [edi + 8*ecx + 8], mm3
537 :    
538 :     add ecx, 2
539 :     cmp ecx, 16
540 :     jnz near .loop
541 :    
542 :     .done
543 :     pmaddwd mm5, [mmx_one]
544 :     movq mm0, mm5
545 :     psrlq mm5, 32
546 :     paddd mm0, mm5
547 :     movd eax, mm0 ; return sum
548 :    
549 :     pop edi
550 :     pop esi
551 :     pop ecx
552 :    
553 :     ret
554 :    
555 :     align ALIGN
556 :     .q1loop
557 :     movq mm0, [esi + 8*ecx] ; mm0 = [1st]
558 :     movq mm3, [esi + 8*ecx+ 8]
559 :     ;
560 :     pxor mm1, mm1 ; mm1 = 0
561 :     pxor mm4, mm4 ;
562 :    
563 :     pcmpgtw mm1, mm0 ; mm1 = (0 > mm0)
564 :     pcmpgtw mm4, mm3 ;
565 :    
566 :     pxor mm0, mm1 ; mm0 = |mm0|
567 :     pxor mm3, mm4 ;
568 :     psubw mm0, mm1 ; displace
569 :     psubw mm3, mm4 ;
570 :    
571 :     psllw mm0, 4
572 :     psllw mm3, 4
573 :    
574 : Isibaar 4 movq mm2, [inter_matrix + 8*ecx]
575 : Isibaar 3 psrlw mm2, 1
576 :     paddw mm0, mm2
577 :    
578 : Isibaar 4 movq mm2, [inter_matrix_fix + ecx*8]
579 : Isibaar 3 pmulhw mm0, mm2 ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
580 :    
581 : Isibaar 4 movq mm2, [inter_matrix + 8*ecx + 8]
582 : Isibaar 3 psrlw mm2, 1
583 :     paddw mm3, mm2
584 :    
585 : Isibaar 4 movq mm2, [inter_matrix_fix + ecx*8 + 8]
586 : Isibaar 3 pmulhw mm3, mm2
587 :    
588 :     psrlw mm0, 1 ; mm0 >>= 1 (/2)
589 :     psrlw mm3, 1 ;
590 :    
591 :     paddw mm5, mm0 ; sum += mm0
592 :     pxor mm0, mm1 ; mm0 *= sign(mm0)
593 :     paddw mm5, mm3 ;
594 :     pxor mm3, mm4 ;
595 :     psubw mm0, mm1 ; undisplace
596 :     psubw mm3, mm4
597 :    
598 :     movq [edi + 8*ecx], mm0
599 :     movq [edi + 8*ecx + 8], mm3
600 :    
601 :     add ecx,2
602 :     cmp ecx,16
603 :     jnz near .q1loop
604 :    
605 :     jmp .done
606 :    
607 :    
608 :     align ALIGN
609 :     .q2loop
610 :     movq mm0, [esi + 8*ecx] ; mm0 = [1st]
611 :     movq mm3, [esi + 8*ecx+ 8]
612 :     ;
613 :     pxor mm1, mm1 ; mm1 = 0
614 :     pxor mm4, mm4 ;
615 :    
616 :     pcmpgtw mm1, mm0 ; mm1 = (0 > mm0)
617 :     pcmpgtw mm4, mm3 ;
618 :    
619 :     pxor mm0, mm1 ; mm0 = |mm0|
620 :     pxor mm3, mm4 ;
621 :     psubw mm0, mm1 ; displace
622 :     psubw mm3, mm4 ;
623 :    
624 :     psllw mm0, 4
625 :     psllw mm3, 4
626 :    
627 : Isibaar 4 movq mm2, [inter_matrix + 8*ecx]
628 : Isibaar 3 psrlw mm2, 1
629 :     paddw mm0, mm2
630 :    
631 : Isibaar 4 movq mm2, [inter_matrix_fix + ecx*8]
632 : Isibaar 3 pmulhw mm0, mm2 ; (level<<4 + inter_matrix[i]>>1) / inter_matrix[i]
633 :    
634 : Isibaar 4 movq mm2, [inter_matrix + 8*ecx + 8]
635 : Isibaar 3 psrlw mm2, 1
636 :     paddw mm3, mm2
637 :    
638 : Isibaar 4 movq mm2, [inter_matrix_fix + ecx*8 + 8]
639 : Isibaar 3 pmulhw mm3, mm2
640 :    
641 :     psrlw mm0, 2 ; mm0 >>= 1 (/2)
642 :     psrlw mm3, 2 ;
643 :    
644 :     paddw mm5, mm0 ; sum += mm0
645 :     pxor mm0, mm1 ; mm0 *= sign(mm0)
646 :     paddw mm5, mm3 ;
647 :     pxor mm3, mm4 ;
648 :     psubw mm0, mm1 ; undisplace
649 :     psubw mm3, mm4
650 :    
651 :     movq [edi + 8*ecx], mm0
652 :     movq [edi + 8*ecx + 8], mm3
653 :    
654 :     add ecx,2
655 :     cmp ecx,16
656 :     jnz near .q2loop
657 :    
658 :     jmp .done
659 :    
660 :    
661 :     ;===========================================================================
662 :     ;
663 :     ; void dequant4_intra_mmx(int16_t *data,
664 :     ; const int16_t const *coeff,
665 :     ; const uint32_t quant,
666 :     ; const uint32_t dcscalar);
667 :     ;
668 :     ;===========================================================================
669 :    
670 :     align 16
671 :     cglobal dequant4_intra_mmx
672 :     dequant4_intra_mmx
673 :    
674 :     push esi
675 :     push edi
676 :    
677 :     mov edi, [esp + 8 + 4] ; data
678 :     mov esi, [esp + 8 + 8] ; coeff
679 :     mov eax, [esp + 8 + 12] ; quant
680 :    
681 :     movq mm7, [mmx_mul_quant + eax*8 - 8]
682 :    
683 :     xor eax, eax
684 :    
685 :    
686 :     align 16
687 :     .loop
688 :     movq mm0, [esi + 8*eax] ; mm0 = [coeff]
689 :    
690 :     pxor mm1, mm1 ; mm1 = 0
691 :     pcmpeqw mm1, mm0 ; mm1 = (0 == mm0)
692 :    
693 :     pxor mm2, mm2 ; mm2 = 0
694 :     pcmpgtw mm2, mm0 ; mm2 = (0 > mm0)
695 :     pxor mm0, mm2 ; mm0 = |mm0|
696 :     psubw mm0, mm2 ; displace
697 :    
698 :     pmullw mm0, mm7 ; mm0 *= quant
699 :    
700 : Isibaar 4 movq mm3, [intra_matrix + 8*eax]
701 : Isibaar 3
702 :     movq mm4, mm0 ;
703 :     pmullw mm0, mm3 ; mm0 = low(mm0 * mm3)
704 :     pmulhw mm3, mm4 ; mm3 = high(mm0 * mm3)
705 :    
706 :     movq mm4, mm0 ; mm0,mm4 = unpack(mm3, mm0)
707 :     punpcklwd mm0, mm3 ;
708 :     punpckhwd mm4, mm3 ;
709 :     psrld mm0, 3 ; mm0,mm4 /= 8
710 :     psrld mm4, 3 ;
711 :     packssdw mm0, mm4 ; mm0 = pack(mm4, mm0)
712 :    
713 :     pxor mm0, mm2 ; mm0 *= sign(mm0)
714 :     psubw mm0, mm2 ; undisplace
715 :     pandn mm1, mm0 ; mm1 = ~(iszero) & mm0
716 :    
717 :     %ifdef SATURATE
718 :     movq mm2, [mmx_32767_minus_2047]
719 :     movq mm6, [mmx_32768_minus_2048]
720 :     paddsw mm1, mm2
721 :     psubsw mm1, mm2
722 :     psubsw mm1, mm6
723 :     paddsw mm1, mm6
724 :     %endif
725 :    
726 :     movq [edi + 8*eax], mm1 ; [data] = mm0
727 :    
728 :     add eax, 1
729 :     cmp eax, 16
730 :     jnz near .loop
731 :    
732 :     mov ax, [esi] ; ax = data[0]
733 :     imul ax, [esp + 8 + 16] ; eax = data[0] * dcscalar
734 :     mov [edi], ax ; data[0] = ax
735 :    
736 :     %ifdef SATURATE
737 :     cmp ax, -2048
738 :     jl .set_n2048
739 :     cmp ax, 2047
740 :     jg .set_2047
741 :     %endif
742 :    
743 :     pop edi
744 :     pop esi
745 :     ret
746 :    
747 :     %ifdef SATURATE
748 :     .set_n2048
749 :     mov word [edi], -2048
750 :     pop edi
751 :     pop esi
752 :     ret
753 :    
754 :     .set_2047
755 :     mov word [edi], 2047
756 :     pop edi
757 :     pop esi
758 :    
759 :     ret
760 :     %endif
761 :    
762 :    
763 :    
764 :     ;===========================================================================
765 :     ;
766 :     ; void dequant4_inter_mmx(int16_t * data,
767 :     ; const int16_t * const coeff,
768 :     ; const uint32_t quant);
769 :     ;
770 :     ;===========================================================================
771 :    
772 :     align 16
773 :     cglobal dequant4_inter_mmx
774 :     dequant4_inter_mmx
775 :    
776 :     push esi
777 :     push edi
778 :    
779 :     mov edi, [esp + 8 + 4] ; data
780 :     mov esi, [esp + 8 + 8] ; coeff
781 :     mov eax, [esp + 8 + 12] ; quant
782 :     movq mm7, [mmx_mul_quant + eax*8 - 8]
783 :     movq mm6, [mmx_one]
784 :     xor eax, eax
785 :     pxor mm5, mm5 ; mismatch sum
786 :    
787 :    
788 :     align 16
789 :     .loop
790 :     movq mm0, [esi + 8*eax] ; mm0 = [coeff]
791 :    
792 :     pxor mm1, mm1 ; mm1 = 0
793 :     pcmpeqw mm1, mm0 ; mm1 = (0 == mm0)
794 :    
795 :     pxor mm2, mm2 ; mm2 = 0
796 :     pcmpgtw mm2, mm0 ; mm2 = (0 > mm0)
797 :     pxor mm0, mm2 ; mm0 = |mm0|
798 :     psubw mm0, mm2 ; displace
799 :    
800 :     psllw mm0, 1 ;
801 :     paddsw mm0, mm6 ; mm0 = 2*mm0 + 1
802 :     pmullw mm0, mm7 ; mm0 *= quant
803 :    
804 : Isibaar 4 movq mm3, [inter_matrix + 8*eax]
805 : Isibaar 3
806 :     movq mm4, mm0
807 :     pmullw mm0, mm3 ; mm0 = low(mm0 * mm3)
808 :     pmulhw mm3, mm4 ; mm3 = high(mm0 * mm3)
809 :    
810 :     movq mm4, mm0 ; mm0,mm4 = unpack(mm3, mm0)
811 :     punpcklwd mm0, mm3 ;
812 :     punpckhwd mm4, mm3 ;
813 :    
814 :     psrad mm0, 4 ; mm0,mm4 /= 16
815 :     psrad mm4, 4 ;
816 :     packssdw mm0, mm4 ; mm0 = pack(mm4, mm0)
817 :    
818 :     pxor mm0, mm2 ; mm0 *= sign(mm0)
819 :     psubw mm0, mm2 ; undisplace
820 :     pandn mm1, mm0 ; mm1 = ~(iszero) & mm0
821 :    
822 :    
823 :     ;%ifdef SATURATE
824 :     movq mm2, [mmx_32767_minus_2047]
825 :     movq mm4, [mmx_32768_minus_2048]
826 :     paddsw mm1, mm2
827 :     psubsw mm1, mm2
828 :     psubsw mm1, mm4
829 :     paddsw mm1, mm4
830 :     ;%endif
831 :    
832 :     pxor mm5, mm1 ; mismatch
833 :    
834 :     movq [edi + 8*eax], mm1 ; [data] = mm0
835 :    
836 :     add eax, 1
837 :     cmp eax, 16
838 :     jnz near .loop
839 :    
840 :     ; mismatch control
841 :    
842 :     movq mm0, mm5
843 :     movq mm1, mm5
844 :     movq mm2, mm5
845 :     psrlq mm0, 48
846 :     psrlq mm1, 32
847 :     psrlq mm2, 16
848 :     pxor mm5, mm0
849 :     pxor mm5, mm1
850 :     pxor mm5, mm2
851 :    
852 :     movd eax, mm5
853 :     test eax, 0x1
854 :     jnz .done
855 :    
856 :     xor word [edi + 2*63], 1
857 :    
858 :     .done
859 :     pop edi
860 :     pop esi
861 :    
862 :     ret

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