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

Diff of /trunk/xvidcore/src/quant/x86_asm/quantize_mpeg_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1540, Sun Aug 29 10:02:38 2004 UTC revision 1713, Mon Jul 10 08:09:59 2006 UTC
# Line 21  Line 21 
21  ; *  along with this program ; if not, write to the Free Software  ; *  along with this program ; if not, write to the Free Software
22  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23  ; *  ; *
24  ; * $Id: quantize_mpeg_mmx.asm,v 1.5 2004-08-29 10:02:38 edgomez Exp $  ; * $Id: quantize_mpeg_mmx.asm,v 1.6 2006-07-10 08:09:59 syskin Exp $
25  ; *  ; *
26  ; *************************************************************************/  ; *************************************************************************/
27    
# Line 129  Line 129 
129          times 4 dw 0          times 4 dw 0
130    
131  ;=============================================================================  ;=============================================================================
132    ; rounding
133    ;=============================================================================
134    
135    mmx_rounding:
136            dw (1<<13)
137            dw 0
138            dw (1<<13)
139            dw 0
140    
141    ;=============================================================================
142  ; Code  ; Code
143  ;=============================================================================  ;=============================================================================
144    
# Line 139  Line 149 
149  cglobal dequant_mpeg_intra_mmx  cglobal dequant_mpeg_intra_mmx
150  cglobal dequant_mpeg_inter_mmx  cglobal dequant_mpeg_inter_mmx
151    
152    
153    %macro QUANT_MMX        1
154            movq    mm0, [eax + 16*(%1)]                    ; data
155            movq    mm2, [ecx + 16*(%1) + 128]              ; intra_matrix_rec
156            movq    mm4, [eax + 16*(%1) + 8]                ; data
157            movq    mm6, [ecx + 16*(%1) + 128 + 8]  ; intra_matrix_rec
158    
159            movq    mm1, mm0
160            movq    mm5, mm4
161    
162            pmullw  mm0, mm2                                        ; low results
163            pmulhw  mm1, mm2                                        ; high results
164            pmullw  mm4, mm6                                        ; low results
165            pmulhw  mm5, mm6                                        ; high results
166    
167            movq    mm2, mm0
168            movq    mm6, mm4
169    
170            punpckhwd mm0, mm1
171            punpcklwd mm2, mm1
172            punpckhwd mm4, mm5
173            punpcklwd mm6, mm5
174    
175            paddd   mm2, mm7
176            paddd   mm0, mm7
177            paddd   mm6, mm7
178            paddd   mm4, mm7
179    
180            psrad   mm2, 14
181            psrad   mm0, 14
182            psrad   mm6, 14
183            psrad   mm4, 14
184    
185            packssdw mm2, mm0
186            packssdw mm6, mm4
187    
188            movq    [edi + 16*(%1)], mm2
189            movq    [edi + 16*(%1)+8], mm6
190    %endmacro
191    
192  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
193  ;  ;
194  ; uint32_t quant_mpeg_intra_mmx(int16_t * coeff,  ; uint32_t quant_mpeg_intra_mmx(int16_t * coeff,
# Line 152  Line 202 
202  ALIGN 16  ALIGN 16
203  quant_mpeg_intra_mmx:  quant_mpeg_intra_mmx:
204    
   push ecx  
   push esi  
205    push edi    push edi
206    push ebx    movq mm7, [mmx_rounding]
   
   mov edi, [esp + 16 + 4]       ; coeff  
   mov esi, [esp + 16 + 8]       ; data  
   mov eax, [esp + 16 + 12]      ; quant  
   mov ebx, [esp + 16 + 20]              ; mpeg_quant_matrices  
   
   movq mm5, [quantd + eax * 8 - 8] ; quantd -> mm5  
   
   xor ecx, ecx  
   cmp al, 1  
   jz near .q1loop  
   
   cmp al, 2  
   jz near .q2loop  
   
   movq mm7, [mmx_div + eax * 8 - 8] ; multipliers[quant] -> mm7  
   
 ALIGN 16  
 .loop  
   movq mm0, [esi + 8*ecx]       ; mm0 = [1st]  
   movq mm3, [esi + 8*ecx + 8]   ;  
   pxor mm1, mm1                 ; mm1 = 0  
   pxor mm4, mm4  
   pcmpgtw mm1, mm0              ; mm1 = (0 > mm0)  
   pcmpgtw mm4, mm3  
   pxor mm0, mm1                 ; mm0 = |mm0|  
   pxor mm3, mm4                 ;  
   psubw mm0, mm1                ; displace  
   psubw mm3, mm4                ;  
   psllw mm0, 4                  ; level << 4  
   psllw mm3, 4  
   movq mm2, [ebx + 8*ecx]  
   psrlw mm2, 1                  ; intra_matrix[i]>>1  
   paddw mm0, mm2  
   movq mm2, [ebx + 256 + ecx*8]  
   pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]  
   movq mm2, [ebx + 8*ecx + 8]  
   psrlw mm2, 1  
   paddw mm3, mm2  
   movq mm2, [ebx + 256 + ecx*8 + 8]  
   pmulhw mm3, mm2  
   paddw mm0, mm5                ; + quantd  
   paddw mm3, mm5  
   pmulhw mm0, mm7               ; mm0 = (mm0 / 2Q) >> 16  
   pmulhw mm3, mm7               ;  
   psrlw mm0, 1                  ; additional shift by 1 => 16 + 1 = 17  
   psrlw mm3, 1  
   pxor mm0, mm1                 ; mm0 *= sign(mm0)  
   pxor mm3, mm4                 ;  
   psubw mm0, mm1                ; undisplace  
   psubw mm3, mm4                ;  
   
   movq [edi + 8*ecx], mm0  
   movq [edi + 8*ecx + 8], mm3  
   
   add ecx,2  
   cmp ecx,16  
   jnz near .loop  
207    
208  .done    mov eax, [esp + 4 + 8]                ; data
209    ; caclulate  data[0] // (int32_t)dcscalar)    mov ecx, [esp + 4 + 20]               ; mpeg_quant_matrices
210    mov ecx, [esp + 16 + 16]  ; dcscalar    mov edi, [esp + 4 + 4]                ; coeff
211    
212      QUANT_MMX(0)
213      QUANT_MMX(1)
214      QUANT_MMX(2)
215      QUANT_MMX(3)
216      QUANT_MMX(4)
217      QUANT_MMX(5)
218      QUANT_MMX(6)
219      QUANT_MMX(7)
220    
221      ; calculate DC
222      movsx eax, word [eax]     ; data[0]
223      mov ecx, [esp + 4 + 16]   ; dcscalar
224    mov edx, ecx    mov edx, ecx
   movsx eax, word [esi]     ; data[0]  
225    shr edx, 1                ; edx = dcscalar /2    shr edx, 1                ; edx = dcscalar /2
226    cmp eax, 0    mov edi, edx
227    jg .gtzero    neg edi
228    
229      cmp eax, 0
230      cmovg edx, edi
231    sub eax, edx    sub eax, edx
232    jmp short .mul  
233  .gtzero    mov edi, [esp + 4 + 4]        ; coeff again
234    add eax, edx  
 .mul  
235    cdq                       ; expand eax -> edx:eax    cdq                       ; expand eax -> edx:eax
236    idiv ecx                  ; eax = edx:eax / dcscalar    idiv ecx                  ; eax = edx:eax / dcscalar
237    
238    mov [edi], ax             ; coeff[0] = ax    mov [edi], ax             ; coeff[0] = ax
239    
   pop ebx  
240    pop edi    pop edi
   pop esi  
   pop ecx  
241    
242    xor eax, eax              ; return(0);    xor eax, eax              ; return(0);
243    ret    ret
244    
 ALIGN 16  
 .q1loop  
   movq mm0, [esi + 8*ecx]       ; mm0 = [1st]  
   movq mm3, [esi + 8*ecx + 8]   ;  
   pxor mm1, mm1                 ; mm1 = 0  
   pxor mm4, mm4                 ;  
   pcmpgtw mm1, mm0              ; mm1 = (0 > mm0)  
   pcmpgtw mm4, mm3              ;  
   pxor mm0, mm1                 ; mm0 = |mm0|  
   pxor mm3, mm4                 ;  
   psubw mm0, mm1                ; displace  
   psubw mm3, mm4                ;  
   psllw mm0, 4  
   psllw mm3, 4  
   movq mm2, [ebx + 8*ecx]  
   psrlw mm2, 1  
   paddw mm0, mm2  
   movq mm2, [ebx + 256 + ecx*8]  
   pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]  
   movq mm2, [ebx + 8*ecx + 8]  
   psrlw mm2, 1  
   paddw mm3, mm2  
   movq mm2, [ebx + 256 + ecx*8 + 8]  
   pmulhw mm3, mm2  
   paddw mm0, mm5  
   paddw mm3, mm5  
   psrlw mm0, 1              ; mm0 >>= 1   (/2)  
   psrlw mm3, 1              ;  
   pxor mm0, mm1             ; mm0 *= sign(mm0)  
   pxor mm3, mm4             ;  
   psubw mm0, mm1            ; undisplace  
   psubw mm3, mm4            ;  
   movq [edi + 8*ecx], mm0  
   movq [edi + 8*ecx + 8], mm3  
   
   add ecx, 2  
   cmp ecx, 16  
   jnz near .q1loop  
   jmp near .done  
245    
246    
 ALIGN 16  
 .q2loop  
   movq mm0, [esi + 8*ecx]       ; mm0 = [1st]  
   movq mm3, [esi + 8*ecx + 8]   ;  
   pxor mm1, mm1                 ; mm1 = 0  
   pxor mm4, mm4                 ;  
   pcmpgtw mm1, mm0              ; mm1 = (0 > mm0)  
   pcmpgtw mm4, mm3              ;  
   pxor mm0, mm1                 ; mm0 = |mm0|  
   pxor mm3, mm4                 ;  
   psubw mm0, mm1                ; displace  
   psubw mm3, mm4                ;  
   psllw mm0, 4  
   psllw mm3, 4  
   movq mm2, [ebx + 8*ecx]  
   psrlw mm2, 1  
   paddw mm0, mm2  
   movq mm2, [ebx + 256 + ecx*8]  
   pmulhw mm0, mm2                       ; (level<<4 + intra_matrix[i]>>1) / intra_matrix[i]  
   movq mm2, [ebx + 8*ecx + 8]  
   psrlw mm2, 1  
   paddw mm3, mm2  
   movq mm2, [ebx + 256 + ecx*8 + 8]  
   pmulhw mm3, mm2  
   paddw mm0, mm5  
   paddw mm3, mm5  
   psrlw mm0, 2                  ; mm0 >>= 1   (/4)  
   psrlw mm3, 2                  ;  
   pxor mm0, mm1                 ; mm0 *= sign(mm0)  
   pxor mm3, mm4                 ;  
   psubw mm0, mm1                ; undisplace  
   psubw mm3, mm4            ;  
   movq [edi + 8*ecx], mm0  
   movq [edi + 8*ecx + 8], mm3  
   
   add ecx,2  
   cmp ecx,16  
   jnz near .q2loop  
   jmp near .done  
 .endfunc  
   
247  ;-----------------------------------------------------------------------------  ;-----------------------------------------------------------------------------
248  ;  ;
249  ; uint32_t quant_mpeg_inter_mmx(int16_t * coeff,  ; uint32_t quant_mpeg_inter_mmx(int16_t * coeff,

Legend:
Removed from v.1540  
changed lines
  Added in v.1713

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