michael@0: ; michael@0: ; Copyright (c) 2010 The WebM project authors. All Rights Reserved. michael@0: ; michael@0: ; Use of this source code is governed by a BSD-style license michael@0: ; that can be found in the LICENSE file in the root of the source michael@0: ; tree. An additional intellectual property rights grant can be found michael@0: ; in the file PATENTS. All contributing project authors may michael@0: ; be found in the AUTHORS file in the root of the source tree. michael@0: ; michael@0: michael@0: michael@0: %include "vpx_ports/x86_abi_support.asm" michael@0: michael@0: michael@0: ;void vp8_dequantize_b_impl_mmx(short *sq, short *dq, short *q) michael@0: global sym(vp8_dequantize_b_impl_mmx) PRIVATE michael@0: sym(vp8_dequantize_b_impl_mmx): michael@0: push rbp michael@0: mov rbp, rsp michael@0: SHADOW_ARGS_TO_STACK 3 michael@0: push rsi michael@0: push rdi michael@0: ; end prolog michael@0: michael@0: mov rsi, arg(0) ;sq michael@0: mov rdi, arg(1) ;dq michael@0: mov rax, arg(2) ;q michael@0: michael@0: movq mm1, [rsi] michael@0: pmullw mm1, [rax+0] ; mm4 *= kernel 0 modifiers. michael@0: movq [rdi], mm1 michael@0: michael@0: movq mm1, [rsi+8] michael@0: pmullw mm1, [rax+8] ; mm4 *= kernel 0 modifiers. michael@0: movq [rdi+8], mm1 michael@0: michael@0: movq mm1, [rsi+16] michael@0: pmullw mm1, [rax+16] ; mm4 *= kernel 0 modifiers. michael@0: movq [rdi+16], mm1 michael@0: michael@0: movq mm1, [rsi+24] michael@0: pmullw mm1, [rax+24] ; mm4 *= kernel 0 modifiers. michael@0: movq [rdi+24], mm1 michael@0: michael@0: ; begin epilog michael@0: pop rdi michael@0: pop rsi michael@0: UNSHADOW_ARGS michael@0: pop rbp michael@0: ret michael@0: michael@0: michael@0: ;void dequant_idct_add_mmx( michael@0: ;short *input, 0 michael@0: ;short *dq, 1 michael@0: ;unsigned char *dest, 2 michael@0: ;int stride) 3 michael@0: global sym(vp8_dequant_idct_add_mmx) PRIVATE michael@0: sym(vp8_dequant_idct_add_mmx): michael@0: push rbp michael@0: mov rbp, rsp michael@0: SHADOW_ARGS_TO_STACK 4 michael@0: GET_GOT rbx michael@0: push rdi michael@0: ; end prolog michael@0: michael@0: mov rax, arg(0) ;input michael@0: mov rdx, arg(1) ;dq michael@0: michael@0: michael@0: movq mm0, [rax ] michael@0: pmullw mm0, [rdx] michael@0: michael@0: movq mm1, [rax +8] michael@0: pmullw mm1, [rdx +8] michael@0: michael@0: movq mm2, [rax+16] michael@0: pmullw mm2, [rdx+16] michael@0: michael@0: movq mm3, [rax+24] michael@0: pmullw mm3, [rdx+24] michael@0: michael@0: mov rdx, arg(2) ;dest michael@0: michael@0: pxor mm7, mm7 michael@0: michael@0: michael@0: movq [rax], mm7 michael@0: movq [rax+8], mm7 michael@0: michael@0: movq [rax+16],mm7 michael@0: movq [rax+24],mm7 michael@0: michael@0: michael@0: movsxd rdi, dword ptr arg(3) ;stride michael@0: michael@0: psubw mm0, mm2 ; b1= 0-2 michael@0: paddw mm2, mm2 ; michael@0: michael@0: movq mm5, mm1 michael@0: paddw mm2, mm0 ; a1 =0+2 michael@0: michael@0: pmulhw mm5, [GLOBAL(x_s1sqr2)]; michael@0: paddw mm5, mm1 ; ip1 * sin(pi/8) * sqrt(2) michael@0: michael@0: movq mm7, mm3 ; michael@0: pmulhw mm7, [GLOBAL(x_c1sqr2less1)]; michael@0: michael@0: paddw mm7, mm3 ; ip3 * cos(pi/8) * sqrt(2) michael@0: psubw mm7, mm5 ; c1 michael@0: michael@0: movq mm5, mm1 michael@0: movq mm4, mm3 michael@0: michael@0: pmulhw mm5, [GLOBAL(x_c1sqr2less1)] michael@0: paddw mm5, mm1 michael@0: michael@0: pmulhw mm3, [GLOBAL(x_s1sqr2)] michael@0: paddw mm3, mm4 michael@0: michael@0: paddw mm3, mm5 ; d1 michael@0: movq mm6, mm2 ; a1 michael@0: michael@0: movq mm4, mm0 ; b1 michael@0: paddw mm2, mm3 ;0 michael@0: michael@0: paddw mm4, mm7 ;1 michael@0: psubw mm0, mm7 ;2 michael@0: michael@0: psubw mm6, mm3 ;3 michael@0: michael@0: movq mm1, mm2 ; 03 02 01 00 michael@0: movq mm3, mm4 ; 23 22 21 20 michael@0: michael@0: punpcklwd mm1, mm0 ; 11 01 10 00 michael@0: punpckhwd mm2, mm0 ; 13 03 12 02 michael@0: michael@0: punpcklwd mm3, mm6 ; 31 21 30 20 michael@0: punpckhwd mm4, mm6 ; 33 23 32 22 michael@0: michael@0: movq mm0, mm1 ; 11 01 10 00 michael@0: movq mm5, mm2 ; 13 03 12 02 michael@0: michael@0: punpckldq mm0, mm3 ; 30 20 10 00 michael@0: punpckhdq mm1, mm3 ; 31 21 11 01 michael@0: michael@0: punpckldq mm2, mm4 ; 32 22 12 02 michael@0: punpckhdq mm5, mm4 ; 33 23 13 03 michael@0: michael@0: movq mm3, mm5 ; 33 23 13 03 michael@0: michael@0: psubw mm0, mm2 ; b1= 0-2 michael@0: paddw mm2, mm2 ; michael@0: michael@0: movq mm5, mm1 michael@0: paddw mm2, mm0 ; a1 =0+2 michael@0: michael@0: pmulhw mm5, [GLOBAL(x_s1sqr2)]; michael@0: paddw mm5, mm1 ; ip1 * sin(pi/8) * sqrt(2) michael@0: michael@0: movq mm7, mm3 ; michael@0: pmulhw mm7, [GLOBAL(x_c1sqr2less1)]; michael@0: michael@0: paddw mm7, mm3 ; ip3 * cos(pi/8) * sqrt(2) michael@0: psubw mm7, mm5 ; c1 michael@0: michael@0: movq mm5, mm1 michael@0: movq mm4, mm3 michael@0: michael@0: pmulhw mm5, [GLOBAL(x_c1sqr2less1)] michael@0: paddw mm5, mm1 michael@0: michael@0: pmulhw mm3, [GLOBAL(x_s1sqr2)] michael@0: paddw mm3, mm4 michael@0: michael@0: paddw mm3, mm5 ; d1 michael@0: paddw mm0, [GLOBAL(fours)] michael@0: michael@0: paddw mm2, [GLOBAL(fours)] michael@0: movq mm6, mm2 ; a1 michael@0: michael@0: movq mm4, mm0 ; b1 michael@0: paddw mm2, mm3 ;0 michael@0: michael@0: paddw mm4, mm7 ;1 michael@0: psubw mm0, mm7 ;2 michael@0: michael@0: psubw mm6, mm3 ;3 michael@0: psraw mm2, 3 michael@0: michael@0: psraw mm0, 3 michael@0: psraw mm4, 3 michael@0: michael@0: psraw mm6, 3 michael@0: michael@0: movq mm1, mm2 ; 03 02 01 00 michael@0: movq mm3, mm4 ; 23 22 21 20 michael@0: michael@0: punpcklwd mm1, mm0 ; 11 01 10 00 michael@0: punpckhwd mm2, mm0 ; 13 03 12 02 michael@0: michael@0: punpcklwd mm3, mm6 ; 31 21 30 20 michael@0: punpckhwd mm4, mm6 ; 33 23 32 22 michael@0: michael@0: movq mm0, mm1 ; 11 01 10 00 michael@0: movq mm5, mm2 ; 13 03 12 02 michael@0: michael@0: punpckldq mm0, mm3 ; 30 20 10 00 michael@0: punpckhdq mm1, mm3 ; 31 21 11 01 michael@0: michael@0: punpckldq mm2, mm4 ; 32 22 12 02 michael@0: punpckhdq mm5, mm4 ; 33 23 13 03 michael@0: michael@0: pxor mm7, mm7 michael@0: michael@0: movd mm4, [rdx] michael@0: punpcklbw mm4, mm7 michael@0: paddsw mm0, mm4 michael@0: packuswb mm0, mm7 michael@0: movd [rdx], mm0 michael@0: michael@0: movd mm4, [rdx+rdi] michael@0: punpcklbw mm4, mm7 michael@0: paddsw mm1, mm4 michael@0: packuswb mm1, mm7 michael@0: movd [rdx+rdi], mm1 michael@0: michael@0: movd mm4, [rdx+2*rdi] michael@0: punpcklbw mm4, mm7 michael@0: paddsw mm2, mm4 michael@0: packuswb mm2, mm7 michael@0: movd [rdx+rdi*2], mm2 michael@0: michael@0: add rdx, rdi michael@0: michael@0: movd mm4, [rdx+2*rdi] michael@0: punpcklbw mm4, mm7 michael@0: paddsw mm5, mm4 michael@0: packuswb mm5, mm7 michael@0: movd [rdx+rdi*2], mm5 michael@0: michael@0: ; begin epilog michael@0: pop rdi michael@0: RESTORE_GOT michael@0: UNSHADOW_ARGS michael@0: pop rbp michael@0: ret michael@0: michael@0: SECTION_RODATA michael@0: align 16 michael@0: x_s1sqr2: michael@0: times 4 dw 0x8A8C michael@0: align 16 michael@0: x_c1sqr2less1: michael@0: times 4 dw 0x4E7B michael@0: align 16 michael@0: fours: michael@0: times 4 dw 0x0004