| ; | |
| ; Copyright (c) 2010 The WebM project authors. All Rights Reserved. | |
| ; | |
| ; Use of this source code is governed by a BSD-style license | |
| ; that can be found in the LICENSE file in the root of the source | |
| ; tree. An additional intellectual property rights grant can be found | |
| ; in the file PATENTS. All contributing project authors may | |
| ; be found in the AUTHORS file in the root of the source tree. | |
| ; | |
| %include "vpx_ports/x86_abi_support.asm" | |
| ;int vp8_fast_quantize_b_impl_mmx(short *coeff_ptr, short *zbin_ptr, | |
| ; short *qcoeff_ptr,short *dequant_ptr, | |
| ; short *scan_mask, short *round_ptr, | |
| ; short *quant_ptr, short *dqcoeff_ptr); | |
| global sym(vp8_fast_quantize_b_impl_mmx) PRIVATE | |
| sym(vp8_fast_quantize_b_impl_mmx): | |
| push rbp | |
| mov rbp, rsp | |
| SHADOW_ARGS_TO_STACK 8 | |
| push rsi | |
| push rdi | |
| ; end prolog | |
| mov rsi, arg(0) ;coeff_ptr | |
| movq mm0, [rsi] | |
| mov rax, arg(1) ;zbin_ptr | |
| movq mm1, [rax] | |
| movq mm3, mm0 | |
| psraw mm0, 15 | |
| pxor mm3, mm0 | |
| psubw mm3, mm0 ; abs | |
| movq mm2, mm3 | |
| pcmpgtw mm1, mm2 | |
| pandn mm1, mm2 | |
| movq mm3, mm1 | |
| mov rdx, arg(6) ;quant_ptr | |
| movq mm1, [rdx] | |
| mov rcx, arg(5) ;round_ptr | |
| movq mm2, [rcx] | |
| paddw mm3, mm2 | |
| pmulhuw mm3, mm1 | |
| pxor mm3, mm0 | |
| psubw mm3, mm0 ;gain the sign back | |
| mov rdi, arg(2) ;qcoeff_ptr | |
| movq mm0, mm3 | |
| movq [rdi], mm3 | |
| mov rax, arg(3) ;dequant_ptr | |
| movq mm2, [rax] | |
| pmullw mm3, mm2 | |
| mov rax, arg(7) ;dqcoeff_ptr | |
| movq [rax], mm3 | |
| ; next 8 | |
| movq mm4, [rsi+8] | |
| mov rax, arg(1) ;zbin_ptr | |
| movq mm5, [rax+8] | |
| movq mm7, mm4 | |
| psraw mm4, 15 | |
| pxor mm7, mm4 | |
| psubw mm7, mm4 ; abs | |
| movq mm6, mm7 | |
| pcmpgtw mm5, mm6 | |
| pandn mm5, mm6 | |
| movq mm7, mm5 | |
| movq mm5, [rdx+8] | |
| movq mm6, [rcx+8] | |
| paddw mm7, mm6 | |
| pmulhuw mm7, mm5 | |
| pxor mm7, mm4 | |
| psubw mm7, mm4;gain the sign back | |
| mov rdi, arg(2) ;qcoeff_ptr | |
| movq mm1, mm7 | |
| movq [rdi+8], mm7 | |
| mov rax, arg(3) ;dequant_ptr | |
| movq mm6, [rax+8] | |
| pmullw mm7, mm6 | |
| mov rax, arg(7) ;dqcoeff_ptr | |
| movq [rax+8], mm7 | |
| ; next 8 | |
| movq mm4, [rsi+16] | |
| mov rax, arg(1) ;zbin_ptr | |
| movq mm5, [rax+16] | |
| movq mm7, mm4 | |
| psraw mm4, 15 | |
| pxor mm7, mm4 | |
| psubw mm7, mm4 ; abs | |
| movq mm6, mm7 | |
| pcmpgtw mm5, mm6 | |
| pandn mm5, mm6 | |
| movq mm7, mm5 | |
| movq mm5, [rdx+16] | |
| movq mm6, [rcx+16] | |
| paddw mm7, mm6 | |
| pmulhuw mm7, mm5 | |
| pxor mm7, mm4 | |
| psubw mm7, mm4;gain the sign back | |
| mov rdi, arg(2) ;qcoeff_ptr | |
| movq mm1, mm7 | |
| movq [rdi+16], mm7 | |
| mov rax, arg(3) ;dequant_ptr | |
| movq mm6, [rax+16] | |
| pmullw mm7, mm6 | |
| mov rax, arg(7) ;dqcoeff_ptr | |
| movq [rax+16], mm7 | |
| ; next 8 | |
| movq mm4, [rsi+24] | |
| mov rax, arg(1) ;zbin_ptr | |
| movq mm5, [rax+24] | |
| movq mm7, mm4 | |
| psraw mm4, 15 | |
| pxor mm7, mm4 | |
| psubw mm7, mm4 ; abs | |
| movq mm6, mm7 | |
| pcmpgtw mm5, mm6 | |
| pandn mm5, mm6 | |
| movq mm7, mm5 | |
| movq mm5, [rdx+24] | |
| movq mm6, [rcx+24] | |
| paddw mm7, mm6 | |
| pmulhuw mm7, mm5 | |
| pxor mm7, mm4 | |
| psubw mm7, mm4;gain the sign back | |
| mov rdi, arg(2) ;qcoeff_ptr | |
| movq mm1, mm7 | |
| movq [rdi+24], mm7 | |
| mov rax, arg(3) ;dequant_ptr | |
| movq mm6, [rax+24] | |
| pmullw mm7, mm6 | |
| mov rax, arg(7) ;dqcoeff_ptr | |
| movq [rax+24], mm7 | |
| mov rdi, arg(4) ;scan_mask | |
| mov rsi, arg(2) ;qcoeff_ptr | |
| pxor mm5, mm5 | |
| pxor mm7, mm7 | |
| movq mm0, [rsi] | |
| movq mm1, [rsi+8] | |
| movq mm2, [rdi] | |
| movq mm3, [rdi+8]; | |
| pcmpeqw mm0, mm7 | |
| pcmpeqw mm1, mm7 | |
| pcmpeqw mm6, mm6 | |
| pxor mm0, mm6 | |
| pxor mm1, mm6 | |
| psrlw mm0, 15 | |
| psrlw mm1, 15 | |
| pmaddwd mm0, mm2 | |
| pmaddwd mm1, mm3 | |
| movq mm5, mm0 | |
| paddd mm5, mm1 | |
| movq mm0, [rsi+16] | |
| movq mm1, [rsi+24] | |
| movq mm2, [rdi+16] | |
| movq mm3, [rdi+24]; | |
| pcmpeqw mm0, mm7 | |
| pcmpeqw mm1, mm7 | |
| pcmpeqw mm6, mm6 | |
| pxor mm0, mm6 | |
| pxor mm1, mm6 | |
| psrlw mm0, 15 | |
| psrlw mm1, 15 | |
| pmaddwd mm0, mm2 | |
| pmaddwd mm1, mm3 | |
| paddd mm5, mm0 | |
| paddd mm5, mm1 | |
| movq mm0, mm5 | |
| psrlq mm5, 32 | |
| paddd mm0, mm5 | |
| ; eob adjustment begins here | |
| movq rcx, mm0 | |
| and rcx, 0xffff | |
| xor rdx, rdx | |
| sub rdx, rcx ; rdx=-rcx | |
| bsr rax, rcx | |
| inc rax | |
| sar rdx, 31 | |
| and rax, rdx | |
| ; Substitute the sse assembly for the old mmx mixed assembly/C. The | |
| ; following is kept as reference | |
| ; movq rcx, mm0 | |
| ; bsr rax, rcx | |
| ; | |
| ; mov eob, rax | |
| ; mov eee, rcx | |
| ; | |
| ;if(eee==0) | |
| ;{ | |
| ; eob=-1; | |
| ;} | |
| ;else if(eee<0) | |
| ;{ | |
| ; eob=15; | |
| ;} | |
| ;d->eob = eob+1; | |
| ; begin epilog | |
| pop rdi | |
| pop rsi | |
| UNSHADOW_ARGS | |
| pop rbp | |
| ret |