191037db265ecdd914a26e056cf69207b4f50924ehkuang; 291037db265ecdd914a26e056cf69207b4f50924ehkuang; Copyright (c) 2010 The WebM project authors. All Rights Reserved. 391037db265ecdd914a26e056cf69207b4f50924ehkuang; 491037db265ecdd914a26e056cf69207b4f50924ehkuang; Use of this source code is governed by a BSD-style license 591037db265ecdd914a26e056cf69207b4f50924ehkuang; that can be found in the LICENSE file in the root of the source 691037db265ecdd914a26e056cf69207b4f50924ehkuang; tree. An additional intellectual property rights grant can be found 791037db265ecdd914a26e056cf69207b4f50924ehkuang; in the file PATENTS. All contributing project authors may 891037db265ecdd914a26e056cf69207b4f50924ehkuang; be found in the AUTHORS file in the root of the source tree. 991037db265ecdd914a26e056cf69207b4f50924ehkuang; 1091037db265ecdd914a26e056cf69207b4f50924ehkuang 1191037db265ecdd914a26e056cf69207b4f50924ehkuang%include "third_party/x86inc/x86inc.asm" 1291037db265ecdd914a26e056cf69207b4f50924ehkuang 1391037db265ecdd914a26e056cf69207b4f50924ehkuangSECTION_RODATA 1491037db265ecdd914a26e056cf69207b4f50924ehkuangpw_8: times 8 dw 8 1591037db265ecdd914a26e056cf69207b4f50924ehkuangbilin_filter_m_sse2: times 8 dw 16 1691037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 0 1791037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 15 1891037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 1 1991037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 14 2091037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 2 2191037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 13 2291037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 3 2391037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 12 2491037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 4 2591037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 11 2691037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 5 2791037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 10 2891037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 6 2991037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 9 3091037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 7 3191037db265ecdd914a26e056cf69207b4f50924ehkuang times 16 dw 8 3291037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 7 3391037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 9 3491037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 6 3591037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 10 3691037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 5 3791037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 11 3891037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 4 3991037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 12 4091037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 3 4191037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 13 4291037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 2 4391037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 14 4491037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 1 4591037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 dw 15 4691037db265ecdd914a26e056cf69207b4f50924ehkuang 4791037db265ecdd914a26e056cf69207b4f50924ehkuangbilin_filter_m_ssse3: times 8 db 16, 0 4891037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 db 15, 1 4991037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 db 14, 2 5091037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 db 13, 3 5191037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 db 12, 4 5291037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 db 11, 5 5391037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 db 10, 6 5491037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 db 9, 7 5591037db265ecdd914a26e056cf69207b4f50924ehkuang times 16 db 8 5691037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 db 7, 9 5791037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 db 6, 10 5891037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 db 5, 11 5991037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 db 4, 12 6091037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 db 3, 13 6191037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 db 2, 14 6291037db265ecdd914a26e056cf69207b4f50924ehkuang times 8 db 1, 15 6391037db265ecdd914a26e056cf69207b4f50924ehkuang 6491037db265ecdd914a26e056cf69207b4f50924ehkuangSECTION .text 6591037db265ecdd914a26e056cf69207b4f50924ehkuang 6691037db265ecdd914a26e056cf69207b4f50924ehkuang; int vp9_sub_pixel_varianceNxh(const uint8_t *src, ptrdiff_t src_stride, 6791037db265ecdd914a26e056cf69207b4f50924ehkuang; int x_offset, int y_offset, 6891037db265ecdd914a26e056cf69207b4f50924ehkuang; const uint8_t *dst, ptrdiff_t dst_stride, 6991037db265ecdd914a26e056cf69207b4f50924ehkuang; int height, unsigned int *sse); 7091037db265ecdd914a26e056cf69207b4f50924ehkuang; 7191037db265ecdd914a26e056cf69207b4f50924ehkuang; This function returns the SE and stores SSE in the given pointer. 7291037db265ecdd914a26e056cf69207b4f50924ehkuang 7391037db265ecdd914a26e056cf69207b4f50924ehkuang%macro SUM_SSE 6 ; src1, dst1, src2, dst2, sum, sse 7491037db265ecdd914a26e056cf69207b4f50924ehkuang psubw %3, %4 7591037db265ecdd914a26e056cf69207b4f50924ehkuang psubw %1, %2 7691037db265ecdd914a26e056cf69207b4f50924ehkuang paddw %5, %3 7791037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddwd %3, %3 7891037db265ecdd914a26e056cf69207b4f50924ehkuang paddw %5, %1 7991037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddwd %1, %1 8091037db265ecdd914a26e056cf69207b4f50924ehkuang paddd %6, %3 8191037db265ecdd914a26e056cf69207b4f50924ehkuang paddd %6, %1 8291037db265ecdd914a26e056cf69207b4f50924ehkuang%endmacro 8391037db265ecdd914a26e056cf69207b4f50924ehkuang 8491037db265ecdd914a26e056cf69207b4f50924ehkuang%macro STORE_AND_RET 0 8591037db265ecdd914a26e056cf69207b4f50924ehkuang%if mmsize == 16 8691037db265ecdd914a26e056cf69207b4f50924ehkuang ; if H=64 and W=16, we have 8 words of each 2(1bit)x64(6bit)x9bit=16bit 8791037db265ecdd914a26e056cf69207b4f50924ehkuang ; in m6, i.e. it _exactly_ fits in a signed word per word in the xmm reg. 8891037db265ecdd914a26e056cf69207b4f50924ehkuang ; We have to sign-extend it before adding the words within the register 8991037db265ecdd914a26e056cf69207b4f50924ehkuang ; and outputing to a dword. 9091037db265ecdd914a26e056cf69207b4f50924ehkuang pcmpgtw m5, m6 ; mask for 0 > x 9191037db265ecdd914a26e056cf69207b4f50924ehkuang movhlps m3, m7 9291037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklwd m4, m6, m5 9391037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhwd m6, m5 ; sign-extend m6 word->dword 9491037db265ecdd914a26e056cf69207b4f50924ehkuang paddd m7, m3 9591037db265ecdd914a26e056cf69207b4f50924ehkuang paddd m6, m4 9691037db265ecdd914a26e056cf69207b4f50924ehkuang pshufd m3, m7, 0x1 9791037db265ecdd914a26e056cf69207b4f50924ehkuang movhlps m4, m6 9891037db265ecdd914a26e056cf69207b4f50924ehkuang paddd m7, m3 9991037db265ecdd914a26e056cf69207b4f50924ehkuang paddd m6, m4 10091037db265ecdd914a26e056cf69207b4f50924ehkuang mov r1, ssem ; r1 = unsigned int *sse 10191037db265ecdd914a26e056cf69207b4f50924ehkuang pshufd m4, m6, 0x1 10291037db265ecdd914a26e056cf69207b4f50924ehkuang movd [r1], m7 ; store sse 10391037db265ecdd914a26e056cf69207b4f50924ehkuang paddd m6, m4 10491037db265ecdd914a26e056cf69207b4f50924ehkuang movd rax, m6 ; store sum as return value 10591037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; mmsize == 8 10691037db265ecdd914a26e056cf69207b4f50924ehkuang pshufw m4, m6, 0xe 10791037db265ecdd914a26e056cf69207b4f50924ehkuang pshufw m3, m7, 0xe 10891037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m6, m4 10991037db265ecdd914a26e056cf69207b4f50924ehkuang paddd m7, m3 11091037db265ecdd914a26e056cf69207b4f50924ehkuang pcmpgtw m5, m6 ; mask for 0 > x 11191037db265ecdd914a26e056cf69207b4f50924ehkuang mov r1, ssem ; r1 = unsigned int *sse 11291037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklwd m6, m5 ; sign-extend m6 word->dword 11391037db265ecdd914a26e056cf69207b4f50924ehkuang movd [r1], m7 ; store sse 11491037db265ecdd914a26e056cf69207b4f50924ehkuang pshufw m4, m6, 0xe 11591037db265ecdd914a26e056cf69207b4f50924ehkuang paddd m6, m4 11691037db265ecdd914a26e056cf69207b4f50924ehkuang movd rax, m6 ; store sum as return value 11791037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 11891037db265ecdd914a26e056cf69207b4f50924ehkuang RET 11991037db265ecdd914a26e056cf69207b4f50924ehkuang%endmacro 12091037db265ecdd914a26e056cf69207b4f50924ehkuang 12191037db265ecdd914a26e056cf69207b4f50924ehkuang%macro SUBPEL_VARIANCE 1-2 0 ; W 12291037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 12391037db265ecdd914a26e056cf69207b4f50924ehkuang%define bilin_filter_m bilin_filter_m_ssse3 12491037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_idx_shift 4 12591037db265ecdd914a26e056cf69207b4f50924ehkuang%else 12691037db265ecdd914a26e056cf69207b4f50924ehkuang%define bilin_filter_m bilin_filter_m_sse2 12791037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_idx_shift 5 12891037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 12991037db265ecdd914a26e056cf69207b4f50924ehkuang; FIXME(rbultje) only bilinear filters use >8 registers, and ssse3 only uses 13091037db265ecdd914a26e056cf69207b4f50924ehkuang; 11, not 13, if the registers are ordered correctly. May make a minor speed 13191037db265ecdd914a26e056cf69207b4f50924ehkuang; difference on Win64 13291037db265ecdd914a26e056cf69207b4f50924ehkuang%ifdef PIC 13391037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 13491037db265ecdd914a26e056cf69207b4f50924ehkuangcglobal sub_pixel_avg_variance%1xh, 9, 10, 13, src, src_stride, \ 13591037db265ecdd914a26e056cf69207b4f50924ehkuang x_offset, y_offset, \ 13691037db265ecdd914a26e056cf69207b4f50924ehkuang dst, dst_stride, \ 13791037db265ecdd914a26e056cf69207b4f50924ehkuang sec, sec_stride, height, sse 13891037db265ecdd914a26e056cf69207b4f50924ehkuang%define sec_str sec_strideq 13991037db265ecdd914a26e056cf69207b4f50924ehkuang%else 14091037db265ecdd914a26e056cf69207b4f50924ehkuangcglobal sub_pixel_variance%1xh, 7, 8, 13, src, src_stride, x_offset, y_offset, \ 14191037db265ecdd914a26e056cf69207b4f50924ehkuang dst, dst_stride, height, sse 14291037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 14391037db265ecdd914a26e056cf69207b4f50924ehkuang%define h heightd 14491037db265ecdd914a26e056cf69207b4f50924ehkuang%define bilin_filter sseq 14591037db265ecdd914a26e056cf69207b4f50924ehkuang%else 14691037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 14791037db265ecdd914a26e056cf69207b4f50924ehkuangcglobal sub_pixel_avg_variance%1xh, 7 + 2 * ARCH_X86_64, \ 14891037db265ecdd914a26e056cf69207b4f50924ehkuang 7 + 2 * ARCH_X86_64, 13, src, src_stride, \ 14991037db265ecdd914a26e056cf69207b4f50924ehkuang x_offset, y_offset, \ 15091037db265ecdd914a26e056cf69207b4f50924ehkuang dst, dst_stride, \ 15191037db265ecdd914a26e056cf69207b4f50924ehkuang sec, sec_stride, \ 15291037db265ecdd914a26e056cf69207b4f50924ehkuang height, sse 15391037db265ecdd914a26e056cf69207b4f50924ehkuang%if ARCH_X86_64 15491037db265ecdd914a26e056cf69207b4f50924ehkuang%define h heightd 15591037db265ecdd914a26e056cf69207b4f50924ehkuang%define sec_str sec_strideq 15691037db265ecdd914a26e056cf69207b4f50924ehkuang%else 15791037db265ecdd914a26e056cf69207b4f50924ehkuang%define h dword heightm 15891037db265ecdd914a26e056cf69207b4f50924ehkuang%define sec_str sec_stridemp 15991037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 16091037db265ecdd914a26e056cf69207b4f50924ehkuang%else 16191037db265ecdd914a26e056cf69207b4f50924ehkuangcglobal sub_pixel_variance%1xh, 7, 7, 13, src, src_stride, x_offset, y_offset, \ 16291037db265ecdd914a26e056cf69207b4f50924ehkuang dst, dst_stride, height, sse 16391037db265ecdd914a26e056cf69207b4f50924ehkuang%define h heightd 16491037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 16591037db265ecdd914a26e056cf69207b4f50924ehkuang%define bilin_filter bilin_filter_m 16691037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 16791037db265ecdd914a26e056cf69207b4f50924ehkuang ASSERT %1 <= 16 ; m6 overflows if w > 16 16891037db265ecdd914a26e056cf69207b4f50924ehkuang pxor m6, m6 ; sum 16991037db265ecdd914a26e056cf69207b4f50924ehkuang pxor m7, m7 ; sse 17091037db265ecdd914a26e056cf69207b4f50924ehkuang ; FIXME(rbultje) if both filters are bilinear, we don't actually use m5; we 17191037db265ecdd914a26e056cf69207b4f50924ehkuang ; could perhaps use it for something more productive then 17291037db265ecdd914a26e056cf69207b4f50924ehkuang pxor m5, m5 ; dedicated zero register 17391037db265ecdd914a26e056cf69207b4f50924ehkuang%if %1 < 16 17491037db265ecdd914a26e056cf69207b4f50924ehkuang sar h, 1 17591037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 17691037db265ecdd914a26e056cf69207b4f50924ehkuang shl sec_str, 1 17791037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 17891037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 17991037db265ecdd914a26e056cf69207b4f50924ehkuang 18091037db265ecdd914a26e056cf69207b4f50924ehkuang ; FIXME(rbultje) replace by jumptable? 18191037db265ecdd914a26e056cf69207b4f50924ehkuang test x_offsetd, x_offsetd 18291037db265ecdd914a26e056cf69207b4f50924ehkuang jnz .x_nonzero 18391037db265ecdd914a26e056cf69207b4f50924ehkuang ; x_offset == 0 18491037db265ecdd914a26e056cf69207b4f50924ehkuang test y_offsetd, y_offsetd 18591037db265ecdd914a26e056cf69207b4f50924ehkuang jnz .x_zero_y_nonzero 18691037db265ecdd914a26e056cf69207b4f50924ehkuang 18791037db265ecdd914a26e056cf69207b4f50924ehkuang ; x_offset == 0 && y_offset == 0 18891037db265ecdd914a26e056cf69207b4f50924ehkuang.x_zero_y_zero_loop: 18991037db265ecdd914a26e056cf69207b4f50924ehkuang%if %1 == 16 19091037db265ecdd914a26e056cf69207b4f50924ehkuang movu m0, [srcq] 19191037db265ecdd914a26e056cf69207b4f50924ehkuang mova m1, [dstq] 19291037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 19391037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 19491037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m1, m5 19591037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 19691037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 19791037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 19891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 19991037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 0 ; !avg 20091037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m1, m5 20191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 20291037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 20391037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 20491037db265ecdd914a26e056cf69207b4f50924ehkuang 20591037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 20691037db265ecdd914a26e056cf69207b4f50924ehkuang add dstq, dst_strideq 20791037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; %1 < 16 20891037db265ecdd914a26e056cf69207b4f50924ehkuang movh m0, [srcq] 20991037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 21091037db265ecdd914a26e056cf69207b4f50924ehkuang%if mmsize == 16 21191037db265ecdd914a26e056cf69207b4f50924ehkuang movhps m0, [srcq+src_strideq] 21291037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; mmsize == 8 21391037db265ecdd914a26e056cf69207b4f50924ehkuang punpckldq m0, [srcq+src_strideq] 21491037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 21591037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; !avg 21691037db265ecdd914a26e056cf69207b4f50924ehkuang movh m2, [srcq+src_strideq] 21791037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 21891037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 21991037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [dstq+dst_strideq] 22091037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 22191037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 22291037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 22391037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 22491037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 22591037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 22691037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; !avg 22791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 22891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m5 22991037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 23091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 23191037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 23291037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 23391037db265ecdd914a26e056cf69207b4f50924ehkuang 23491037db265ecdd914a26e056cf69207b4f50924ehkuang lea srcq, [srcq+src_strideq*2] 23591037db265ecdd914a26e056cf69207b4f50924ehkuang lea dstq, [dstq+dst_strideq*2] 23691037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 23791037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 23891037db265ecdd914a26e056cf69207b4f50924ehkuang add secq, sec_str 23991037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 24091037db265ecdd914a26e056cf69207b4f50924ehkuang dec h 24191037db265ecdd914a26e056cf69207b4f50924ehkuang jg .x_zero_y_zero_loop 24291037db265ecdd914a26e056cf69207b4f50924ehkuang STORE_AND_RET 24391037db265ecdd914a26e056cf69207b4f50924ehkuang 24491037db265ecdd914a26e056cf69207b4f50924ehkuang.x_zero_y_nonzero: 24591037db265ecdd914a26e056cf69207b4f50924ehkuang cmp y_offsetd, 8 24691037db265ecdd914a26e056cf69207b4f50924ehkuang jne .x_zero_y_nonhalf 24791037db265ecdd914a26e056cf69207b4f50924ehkuang 24891037db265ecdd914a26e056cf69207b4f50924ehkuang ; x_offset == 0 && y_offset == 0.5 24991037db265ecdd914a26e056cf69207b4f50924ehkuang.x_zero_y_half_loop: 25091037db265ecdd914a26e056cf69207b4f50924ehkuang%if %1 == 16 25191037db265ecdd914a26e056cf69207b4f50924ehkuang movu m0, [srcq] 25291037db265ecdd914a26e056cf69207b4f50924ehkuang movu m4, [srcq+src_strideq] 25391037db265ecdd914a26e056cf69207b4f50924ehkuang mova m1, [dstq] 25491037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m4 25591037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m1, m5 25691037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 25791037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 25891037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 25991037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 26091037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 26191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 26291037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 26391037db265ecdd914a26e056cf69207b4f50924ehkuang 26491037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 26591037db265ecdd914a26e056cf69207b4f50924ehkuang add dstq, dst_strideq 26691037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; %1 < 16 26791037db265ecdd914a26e056cf69207b4f50924ehkuang movh m0, [srcq] 26891037db265ecdd914a26e056cf69207b4f50924ehkuang movh m2, [srcq+src_strideq] 26991037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 27091037db265ecdd914a26e056cf69207b4f50924ehkuang%if mmsize == 16 27191037db265ecdd914a26e056cf69207b4f50924ehkuang movhps m2, [srcq+src_strideq*2] 27291037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; mmsize == 8 2731184aebb761cbeac9124c37189a80a1a58f04b6bhkuang%if %1 == 4 2741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang movh m1, [srcq+src_strideq*2] 2751184aebb761cbeac9124c37189a80a1a58f04b6bhkuang punpckldq m2, m1 2761184aebb761cbeac9124c37189a80a1a58f04b6bhkuang%else 27791037db265ecdd914a26e056cf69207b4f50924ehkuang punpckldq m2, [srcq+src_strideq*2] 27891037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 2791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang%endif 28091037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 28191037db265ecdd914a26e056cf69207b4f50924ehkuang%if mmsize == 16 28291037db265ecdd914a26e056cf69207b4f50924ehkuang movlhps m0, m2 28391037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; mmsize == 8 28491037db265ecdd914a26e056cf69207b4f50924ehkuang punpckldq m0, m2 28591037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 28691037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [dstq+dst_strideq] 28791037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m2 28891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 28991037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 29091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 29191037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 29291037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 29391037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; !avg 29491037db265ecdd914a26e056cf69207b4f50924ehkuang movh m4, [srcq+src_strideq*2] 29591037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 29691037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m2 29791037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [dstq+dst_strideq] 29891037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m2, m4 29991037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 30091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m5 30191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 30291037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 30391037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 30491037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 30591037db265ecdd914a26e056cf69207b4f50924ehkuang 30691037db265ecdd914a26e056cf69207b4f50924ehkuang lea srcq, [srcq+src_strideq*2] 30791037db265ecdd914a26e056cf69207b4f50924ehkuang lea dstq, [dstq+dst_strideq*2] 30891037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 30991037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 31091037db265ecdd914a26e056cf69207b4f50924ehkuang add secq, sec_str 31191037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 31291037db265ecdd914a26e056cf69207b4f50924ehkuang dec h 31391037db265ecdd914a26e056cf69207b4f50924ehkuang jg .x_zero_y_half_loop 31491037db265ecdd914a26e056cf69207b4f50924ehkuang STORE_AND_RET 31591037db265ecdd914a26e056cf69207b4f50924ehkuang 31691037db265ecdd914a26e056cf69207b4f50924ehkuang.x_zero_y_nonhalf: 31791037db265ecdd914a26e056cf69207b4f50924ehkuang ; x_offset == 0 && y_offset == bilin interpolation 31891037db265ecdd914a26e056cf69207b4f50924ehkuang%ifdef PIC 31991037db265ecdd914a26e056cf69207b4f50924ehkuang lea bilin_filter, [bilin_filter_m] 32091037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 32191037db265ecdd914a26e056cf69207b4f50924ehkuang shl y_offsetd, filter_idx_shift 32291037db265ecdd914a26e056cf69207b4f50924ehkuang%if ARCH_X86_64 && mmsize == 16 32391037db265ecdd914a26e056cf69207b4f50924ehkuang mova m8, [bilin_filter+y_offsetq] 32491037db265ecdd914a26e056cf69207b4f50924ehkuang%if notcpuflag(ssse3) ; FIXME(rbultje) don't scatter registers on x86-64 32591037db265ecdd914a26e056cf69207b4f50924ehkuang mova m9, [bilin_filter+y_offsetq+16] 32691037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 32791037db265ecdd914a26e056cf69207b4f50924ehkuang mova m10, [pw_8] 32891037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_y_a m8 32991037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_y_b m9 33091037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_rnd m10 33191037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; x86-32 or mmx 33291037db265ecdd914a26e056cf69207b4f50924ehkuang add y_offsetq, bilin_filter 33391037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_y_a [y_offsetq] 33491037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_y_b [y_offsetq+16] 33591037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_rnd [pw_8] 33691037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 33791037db265ecdd914a26e056cf69207b4f50924ehkuang.x_zero_y_other_loop: 33891037db265ecdd914a26e056cf69207b4f50924ehkuang%if %1 == 16 33991037db265ecdd914a26e056cf69207b4f50924ehkuang movu m0, [srcq] 34091037db265ecdd914a26e056cf69207b4f50924ehkuang movu m4, [srcq+src_strideq] 34191037db265ecdd914a26e056cf69207b4f50924ehkuang mova m1, [dstq] 34291037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 34391037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m4 34491037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m4 34591037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m2, filter_y_a 34691037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m0, filter_y_a 34791037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 34891037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 34991037db265ecdd914a26e056cf69207b4f50924ehkuang%else 35091037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 35191037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m4, m5 35291037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 35391037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m4, m5 35491037db265ecdd914a26e056cf69207b4f50924ehkuang ; FIXME(rbultje) instead of out=((num-x)*in1+x*in2+rnd)>>log2(num), we can 35591037db265ecdd914a26e056cf69207b4f50924ehkuang ; also do out=in1+(((num-x)*(in2-in1)+rnd)>>log2(num)). Total number of 35691037db265ecdd914a26e056cf69207b4f50924ehkuang ; instructions is the same (5), but it is 1 mul instead of 2, so might be 35791037db265ecdd914a26e056cf69207b4f50924ehkuang ; slightly faster because of pmullw latency. It would also cut our rodata 35891037db265ecdd914a26e056cf69207b4f50924ehkuang ; tables in half for this function, and save 1-2 registers on x86-64. 35991037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m2, filter_y_a 36091037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m3, filter_y_b 36191037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 36291037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m0, filter_y_a 36391037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m4, filter_y_b 36491037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 36591037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, m3 36691037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, m4 36791037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 36891037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 36991037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m0, 4 37091037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 37191037db265ecdd914a26e056cf69207b4f50924ehkuang ; FIXME(rbultje) pipeline 37291037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m0, m2 37391037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 37491037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 37591037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 37691037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 37791037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m1, m5 37891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 37991037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 38091037db265ecdd914a26e056cf69207b4f50924ehkuang 38191037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 38291037db265ecdd914a26e056cf69207b4f50924ehkuang add dstq, dst_strideq 38391037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; %1 < 16 38491037db265ecdd914a26e056cf69207b4f50924ehkuang movh m0, [srcq] 38591037db265ecdd914a26e056cf69207b4f50924ehkuang movh m2, [srcq+src_strideq] 38691037db265ecdd914a26e056cf69207b4f50924ehkuang movh m4, [srcq+src_strideq*2] 38791037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [dstq+dst_strideq] 38891037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 38991037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 39091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m2 39191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m4 39291037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m0, filter_y_a 39391037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m2, filter_y_a 39491037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 39591037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 39691037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 39791037db265ecdd914a26e056cf69207b4f50924ehkuang%else 39891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 39991037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m5 40091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m4, m5 40191037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m0, filter_y_a 40291037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m1, m2, filter_y_b 40391037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 40491037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 40591037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m2, filter_y_a 40691037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m4, filter_y_b 40791037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, m1 40891037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 40991037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 41091037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, m4 41191037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 41291037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m0, 4 41391037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 41491037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 41591037db265ecdd914a26e056cf69207b4f50924ehkuang ; FIXME(rbultje) pipeline 41691037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m0, m2 41791037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 41891037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 41991037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 42091037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 42191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 42291037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 42391037db265ecdd914a26e056cf69207b4f50924ehkuang 42491037db265ecdd914a26e056cf69207b4f50924ehkuang lea srcq, [srcq+src_strideq*2] 42591037db265ecdd914a26e056cf69207b4f50924ehkuang lea dstq, [dstq+dst_strideq*2] 42691037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 42791037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 42891037db265ecdd914a26e056cf69207b4f50924ehkuang add secq, sec_str 42991037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 43091037db265ecdd914a26e056cf69207b4f50924ehkuang dec h 43191037db265ecdd914a26e056cf69207b4f50924ehkuang jg .x_zero_y_other_loop 43291037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_y_a 43391037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_y_b 43491037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_rnd 43591037db265ecdd914a26e056cf69207b4f50924ehkuang STORE_AND_RET 43691037db265ecdd914a26e056cf69207b4f50924ehkuang 43791037db265ecdd914a26e056cf69207b4f50924ehkuang.x_nonzero: 43891037db265ecdd914a26e056cf69207b4f50924ehkuang cmp x_offsetd, 8 43991037db265ecdd914a26e056cf69207b4f50924ehkuang jne .x_nonhalf 44091037db265ecdd914a26e056cf69207b4f50924ehkuang ; x_offset == 0.5 44191037db265ecdd914a26e056cf69207b4f50924ehkuang test y_offsetd, y_offsetd 44291037db265ecdd914a26e056cf69207b4f50924ehkuang jnz .x_half_y_nonzero 44391037db265ecdd914a26e056cf69207b4f50924ehkuang 44491037db265ecdd914a26e056cf69207b4f50924ehkuang ; x_offset == 0.5 && y_offset == 0 44591037db265ecdd914a26e056cf69207b4f50924ehkuang.x_half_y_zero_loop: 44691037db265ecdd914a26e056cf69207b4f50924ehkuang%if %1 == 16 44791037db265ecdd914a26e056cf69207b4f50924ehkuang movu m0, [srcq] 44891037db265ecdd914a26e056cf69207b4f50924ehkuang movu m4, [srcq+1] 44991037db265ecdd914a26e056cf69207b4f50924ehkuang mova m1, [dstq] 45091037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m4 45191037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m1, m5 45291037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 45391037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 45491037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 45591037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 45691037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 45791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 45891037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 45991037db265ecdd914a26e056cf69207b4f50924ehkuang 46091037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 46191037db265ecdd914a26e056cf69207b4f50924ehkuang add dstq, dst_strideq 46291037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; %1 < 16 46391037db265ecdd914a26e056cf69207b4f50924ehkuang movh m0, [srcq] 46491037db265ecdd914a26e056cf69207b4f50924ehkuang movh m4, [srcq+1] 46591037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 46691037db265ecdd914a26e056cf69207b4f50924ehkuang%if mmsize == 16 46791037db265ecdd914a26e056cf69207b4f50924ehkuang movhps m0, [srcq+src_strideq] 46891037db265ecdd914a26e056cf69207b4f50924ehkuang movhps m4, [srcq+src_strideq+1] 46991037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; mmsize == 8 47091037db265ecdd914a26e056cf69207b4f50924ehkuang punpckldq m0, [srcq+src_strideq] 47191037db265ecdd914a26e056cf69207b4f50924ehkuang punpckldq m4, [srcq+src_strideq+1] 47291037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 47391037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 47491037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [dstq+dst_strideq] 47591037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m4 47691037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 47791037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 47891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 47991037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 48091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 48191037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; !avg 48291037db265ecdd914a26e056cf69207b4f50924ehkuang movh m2, [srcq+src_strideq] 48391037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 48491037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m4 48591037db265ecdd914a26e056cf69207b4f50924ehkuang movh m4, [srcq+src_strideq+1] 48691037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [dstq+dst_strideq] 48791037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m2, m4 48891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 48991037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m5 49091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 49191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 49291037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 49391037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 49491037db265ecdd914a26e056cf69207b4f50924ehkuang 49591037db265ecdd914a26e056cf69207b4f50924ehkuang lea srcq, [srcq+src_strideq*2] 49691037db265ecdd914a26e056cf69207b4f50924ehkuang lea dstq, [dstq+dst_strideq*2] 49791037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 49891037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 49991037db265ecdd914a26e056cf69207b4f50924ehkuang add secq, sec_str 50091037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 50191037db265ecdd914a26e056cf69207b4f50924ehkuang dec h 50291037db265ecdd914a26e056cf69207b4f50924ehkuang jg .x_half_y_zero_loop 50391037db265ecdd914a26e056cf69207b4f50924ehkuang STORE_AND_RET 50491037db265ecdd914a26e056cf69207b4f50924ehkuang 50591037db265ecdd914a26e056cf69207b4f50924ehkuang.x_half_y_nonzero: 50691037db265ecdd914a26e056cf69207b4f50924ehkuang cmp y_offsetd, 8 50791037db265ecdd914a26e056cf69207b4f50924ehkuang jne .x_half_y_nonhalf 50891037db265ecdd914a26e056cf69207b4f50924ehkuang 50991037db265ecdd914a26e056cf69207b4f50924ehkuang ; x_offset == 0.5 && y_offset == 0.5 51091037db265ecdd914a26e056cf69207b4f50924ehkuang%if %1 == 16 51191037db265ecdd914a26e056cf69207b4f50924ehkuang movu m0, [srcq] 51291037db265ecdd914a26e056cf69207b4f50924ehkuang movu m3, [srcq+1] 51391037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 51491037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m3 51591037db265ecdd914a26e056cf69207b4f50924ehkuang.x_half_y_half_loop: 51691037db265ecdd914a26e056cf69207b4f50924ehkuang movu m4, [srcq] 51791037db265ecdd914a26e056cf69207b4f50924ehkuang movu m3, [srcq+1] 51891037db265ecdd914a26e056cf69207b4f50924ehkuang mova m1, [dstq] 51991037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m4, m3 52091037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m1, m5 52191037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m4 52291037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 52391037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 52491037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 52591037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 52691037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 52791037db265ecdd914a26e056cf69207b4f50924ehkuang%else 52891037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 52991037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 53091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 53191037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 53291037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 53391037db265ecdd914a26e056cf69207b4f50924ehkuang mova m0, m4 53491037db265ecdd914a26e056cf69207b4f50924ehkuang 53591037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 53691037db265ecdd914a26e056cf69207b4f50924ehkuang add dstq, dst_strideq 53791037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; %1 < 16 53891037db265ecdd914a26e056cf69207b4f50924ehkuang movh m0, [srcq] 53991037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [srcq+1] 54091037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 54191037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m3 54291037db265ecdd914a26e056cf69207b4f50924ehkuang.x_half_y_half_loop: 54391037db265ecdd914a26e056cf69207b4f50924ehkuang movh m2, [srcq] 54491037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [srcq+1] 54591037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 54691037db265ecdd914a26e056cf69207b4f50924ehkuang%if mmsize == 16 54791037db265ecdd914a26e056cf69207b4f50924ehkuang movhps m2, [srcq+src_strideq] 54891037db265ecdd914a26e056cf69207b4f50924ehkuang movhps m3, [srcq+src_strideq+1] 54991037db265ecdd914a26e056cf69207b4f50924ehkuang%else 5501184aebb761cbeac9124c37189a80a1a58f04b6bhkuang%if %1 == 4 5511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang movh m1, [srcq+src_strideq] 5521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang punpckldq m2, m1 5531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang movh m1, [srcq+src_strideq+1] 5541184aebb761cbeac9124c37189a80a1a58f04b6bhkuang punpckldq m3, m1 5551184aebb761cbeac9124c37189a80a1a58f04b6bhkuang%else 55691037db265ecdd914a26e056cf69207b4f50924ehkuang punpckldq m2, [srcq+src_strideq] 55791037db265ecdd914a26e056cf69207b4f50924ehkuang punpckldq m3, [srcq+src_strideq+1] 55891037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 5591184aebb761cbeac9124c37189a80a1a58f04b6bhkuang%endif 56091037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m2, m3 56191037db265ecdd914a26e056cf69207b4f50924ehkuang%if mmsize == 16 56291037db265ecdd914a26e056cf69207b4f50924ehkuang movlhps m0, m2 56391037db265ecdd914a26e056cf69207b4f50924ehkuang movhlps m4, m2 56491037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; mmsize == 8 56591037db265ecdd914a26e056cf69207b4f50924ehkuang punpckldq m0, m2 56691037db265ecdd914a26e056cf69207b4f50924ehkuang pshufw m4, m2, 0xe 56791037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 56891037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 56991037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m2 57091037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [dstq+dst_strideq] 57191037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 57291037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 57391037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 57491037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 57591037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 57691037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; !avg 57791037db265ecdd914a26e056cf69207b4f50924ehkuang movh m4, [srcq+src_strideq] 57891037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [srcq+src_strideq+1] 57991037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m2, m3 58091037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m4, m1 58191037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m2 58291037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m2, m4 58391037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 58491037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [dstq+dst_strideq] 58591037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 58691037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m5 58791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 58891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 58991037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 59091037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 59191037db265ecdd914a26e056cf69207b4f50924ehkuang mova m0, m4 59291037db265ecdd914a26e056cf69207b4f50924ehkuang 59391037db265ecdd914a26e056cf69207b4f50924ehkuang lea srcq, [srcq+src_strideq*2] 59491037db265ecdd914a26e056cf69207b4f50924ehkuang lea dstq, [dstq+dst_strideq*2] 59591037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 59691037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 59791037db265ecdd914a26e056cf69207b4f50924ehkuang add secq, sec_str 59891037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 59991037db265ecdd914a26e056cf69207b4f50924ehkuang dec h 60091037db265ecdd914a26e056cf69207b4f50924ehkuang jg .x_half_y_half_loop 60191037db265ecdd914a26e056cf69207b4f50924ehkuang STORE_AND_RET 60291037db265ecdd914a26e056cf69207b4f50924ehkuang 60391037db265ecdd914a26e056cf69207b4f50924ehkuang.x_half_y_nonhalf: 60491037db265ecdd914a26e056cf69207b4f50924ehkuang ; x_offset == 0.5 && y_offset == bilin interpolation 60591037db265ecdd914a26e056cf69207b4f50924ehkuang%ifdef PIC 60691037db265ecdd914a26e056cf69207b4f50924ehkuang lea bilin_filter, [bilin_filter_m] 60791037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 60891037db265ecdd914a26e056cf69207b4f50924ehkuang shl y_offsetd, filter_idx_shift 60991037db265ecdd914a26e056cf69207b4f50924ehkuang%if ARCH_X86_64 && mmsize == 16 61091037db265ecdd914a26e056cf69207b4f50924ehkuang mova m8, [bilin_filter+y_offsetq] 61191037db265ecdd914a26e056cf69207b4f50924ehkuang%if notcpuflag(ssse3) ; FIXME(rbultje) don't scatter registers on x86-64 61291037db265ecdd914a26e056cf69207b4f50924ehkuang mova m9, [bilin_filter+y_offsetq+16] 61391037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 61491037db265ecdd914a26e056cf69207b4f50924ehkuang mova m10, [pw_8] 61591037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_y_a m8 61691037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_y_b m9 61791037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_rnd m10 61891037db265ecdd914a26e056cf69207b4f50924ehkuang%else 61991037db265ecdd914a26e056cf69207b4f50924ehkuang add y_offsetq, bilin_filter 62091037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_y_a [y_offsetq] 62191037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_y_b [y_offsetq+16] 62291037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_rnd [pw_8] 62391037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 62491037db265ecdd914a26e056cf69207b4f50924ehkuang%if %1 == 16 62591037db265ecdd914a26e056cf69207b4f50924ehkuang movu m0, [srcq] 62691037db265ecdd914a26e056cf69207b4f50924ehkuang movu m3, [srcq+1] 62791037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 62891037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m3 62991037db265ecdd914a26e056cf69207b4f50924ehkuang.x_half_y_other_loop: 63091037db265ecdd914a26e056cf69207b4f50924ehkuang movu m4, [srcq] 63191037db265ecdd914a26e056cf69207b4f50924ehkuang movu m2, [srcq+1] 63291037db265ecdd914a26e056cf69207b4f50924ehkuang mova m1, [dstq] 63391037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m4, m2 63491037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 63591037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m4 63691037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m4 63791037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m2, filter_y_a 63891037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m0, filter_y_a 63991037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 64091037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 64191037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 64291037db265ecdd914a26e056cf69207b4f50924ehkuang%else 64391037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 64491037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m4, m5 64591037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m2, filter_y_a 64691037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m3, filter_y_b 64791037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 64891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 64991037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, m3 65091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m4, m5 65191037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m0, filter_y_a 65291037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m3, filter_y_b 65391037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 65491037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 65591037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, m3 65691037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 65791037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m1, m5 65891037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m0, 4 65991037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 66091037db265ecdd914a26e056cf69207b4f50924ehkuang ; FIXME(rbultje) pipeline 66191037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m0, m2 66291037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 66391037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 66491037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 66591037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 66691037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 66791037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 66891037db265ecdd914a26e056cf69207b4f50924ehkuang mova m0, m4 66991037db265ecdd914a26e056cf69207b4f50924ehkuang 67091037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 67191037db265ecdd914a26e056cf69207b4f50924ehkuang add dstq, dst_strideq 67291037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; %1 < 16 67391037db265ecdd914a26e056cf69207b4f50924ehkuang movh m0, [srcq] 67491037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [srcq+1] 67591037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 67691037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m3 67791037db265ecdd914a26e056cf69207b4f50924ehkuang%if notcpuflag(ssse3) 67891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 67991037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 68091037db265ecdd914a26e056cf69207b4f50924ehkuang.x_half_y_other_loop: 68191037db265ecdd914a26e056cf69207b4f50924ehkuang movh m2, [srcq] 68291037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [srcq+1] 68391037db265ecdd914a26e056cf69207b4f50924ehkuang movh m4, [srcq+src_strideq] 68491037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [srcq+src_strideq+1] 68591037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m2, m1 68691037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m4, m3 68791037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [dstq+dst_strideq] 68891037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 68991037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 69091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m2 69191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m4 69291037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m0, filter_y_a 69391037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m2, filter_y_a 69491037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 69591037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 69691037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 69791037db265ecdd914a26e056cf69207b4f50924ehkuang%else 69891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m5 69991037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m4, m5 70091037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m0, filter_y_a 70191037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m1, m2, filter_y_b 70291037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 70391037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 70491037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m2, filter_y_a 70591037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, m1 70691037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m1, m4, filter_y_b 70791037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 70891037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, m1 70991037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 71091037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 71191037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m0, 4 71291037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 71391037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 71491037db265ecdd914a26e056cf69207b4f50924ehkuang ; FIXME(rbultje) pipeline 71591037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m0, m2 71691037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 71791037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 71891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 71991037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 72091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 72191037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 72291037db265ecdd914a26e056cf69207b4f50924ehkuang mova m0, m4 72391037db265ecdd914a26e056cf69207b4f50924ehkuang 72491037db265ecdd914a26e056cf69207b4f50924ehkuang lea srcq, [srcq+src_strideq*2] 72591037db265ecdd914a26e056cf69207b4f50924ehkuang lea dstq, [dstq+dst_strideq*2] 72691037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 72791037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 72891037db265ecdd914a26e056cf69207b4f50924ehkuang add secq, sec_str 72991037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 73091037db265ecdd914a26e056cf69207b4f50924ehkuang dec h 73191037db265ecdd914a26e056cf69207b4f50924ehkuang jg .x_half_y_other_loop 73291037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_y_a 73391037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_y_b 73491037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_rnd 73591037db265ecdd914a26e056cf69207b4f50924ehkuang STORE_AND_RET 73691037db265ecdd914a26e056cf69207b4f50924ehkuang 73791037db265ecdd914a26e056cf69207b4f50924ehkuang.x_nonhalf: 73891037db265ecdd914a26e056cf69207b4f50924ehkuang test y_offsetd, y_offsetd 73991037db265ecdd914a26e056cf69207b4f50924ehkuang jnz .x_nonhalf_y_nonzero 74091037db265ecdd914a26e056cf69207b4f50924ehkuang 74191037db265ecdd914a26e056cf69207b4f50924ehkuang ; x_offset == bilin interpolation && y_offset == 0 74291037db265ecdd914a26e056cf69207b4f50924ehkuang%ifdef PIC 74391037db265ecdd914a26e056cf69207b4f50924ehkuang lea bilin_filter, [bilin_filter_m] 74491037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 74591037db265ecdd914a26e056cf69207b4f50924ehkuang shl x_offsetd, filter_idx_shift 74691037db265ecdd914a26e056cf69207b4f50924ehkuang%if ARCH_X86_64 && mmsize == 16 74791037db265ecdd914a26e056cf69207b4f50924ehkuang mova m8, [bilin_filter+x_offsetq] 74891037db265ecdd914a26e056cf69207b4f50924ehkuang%if notcpuflag(ssse3) ; FIXME(rbultje) don't scatter registers on x86-64 74991037db265ecdd914a26e056cf69207b4f50924ehkuang mova m9, [bilin_filter+x_offsetq+16] 75091037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 75191037db265ecdd914a26e056cf69207b4f50924ehkuang mova m10, [pw_8] 75291037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_x_a m8 75391037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_x_b m9 75491037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_rnd m10 75591037db265ecdd914a26e056cf69207b4f50924ehkuang%else 75691037db265ecdd914a26e056cf69207b4f50924ehkuang add x_offsetq, bilin_filter 75791037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_x_a [x_offsetq] 75891037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_x_b [x_offsetq+16] 75991037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_rnd [pw_8] 76091037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 76191037db265ecdd914a26e056cf69207b4f50924ehkuang.x_other_y_zero_loop: 76291037db265ecdd914a26e056cf69207b4f50924ehkuang%if %1 == 16 76391037db265ecdd914a26e056cf69207b4f50924ehkuang movu m0, [srcq] 76491037db265ecdd914a26e056cf69207b4f50924ehkuang movu m4, [srcq+1] 76591037db265ecdd914a26e056cf69207b4f50924ehkuang mova m1, [dstq] 76691037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 76791037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m4 76891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m4 76991037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m2, filter_x_a 77091037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m0, filter_x_a 77191037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 77291037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 77391037db265ecdd914a26e056cf69207b4f50924ehkuang%else 77491037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 77591037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m4, m5 77691037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 77791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m4, m5 77891037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m2, filter_x_a 77991037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m3, filter_x_b 78091037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 78191037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m0, filter_x_a 78291037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m4, filter_x_b 78391037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 78491037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, m3 78591037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, m4 78691037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 78791037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 78891037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m0, 4 78991037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 79091037db265ecdd914a26e056cf69207b4f50924ehkuang ; FIXME(rbultje) pipeline 79191037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m0, m2 79291037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 79391037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 79491037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 79591037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 79691037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m1, m5 79791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 79891037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 79991037db265ecdd914a26e056cf69207b4f50924ehkuang 80091037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 80191037db265ecdd914a26e056cf69207b4f50924ehkuang add dstq, dst_strideq 80291037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; %1 < 16 80391037db265ecdd914a26e056cf69207b4f50924ehkuang movh m0, [srcq] 80491037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [srcq+1] 80591037db265ecdd914a26e056cf69207b4f50924ehkuang movh m2, [srcq+src_strideq] 80691037db265ecdd914a26e056cf69207b4f50924ehkuang movh m4, [srcq+src_strideq+1] 80791037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [dstq+dst_strideq] 80891037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 80991037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m1 81091037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 81191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m4 81291037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m0, filter_x_a 81391037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m2, filter_x_a 81491037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 81591037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 81691037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 81791037db265ecdd914a26e056cf69207b4f50924ehkuang%else 81891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 81991037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 82091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m5 82191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m4, m5 82291037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m0, filter_x_a 82391037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m1, filter_x_b 82491037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 82591037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 82691037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m2, filter_x_a 82791037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m4, filter_x_b 82891037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, m1 82991037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 83091037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 83191037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, m4 83291037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 83391037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m0, 4 83491037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 83591037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 83691037db265ecdd914a26e056cf69207b4f50924ehkuang ; FIXME(rbultje) pipeline 83791037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m0, m2 83891037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 83991037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 84091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 84191037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 84291037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 84391037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 84491037db265ecdd914a26e056cf69207b4f50924ehkuang 84591037db265ecdd914a26e056cf69207b4f50924ehkuang lea srcq, [srcq+src_strideq*2] 84691037db265ecdd914a26e056cf69207b4f50924ehkuang lea dstq, [dstq+dst_strideq*2] 84791037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 84891037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 84991037db265ecdd914a26e056cf69207b4f50924ehkuang add secq, sec_str 85091037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 85191037db265ecdd914a26e056cf69207b4f50924ehkuang dec h 85291037db265ecdd914a26e056cf69207b4f50924ehkuang jg .x_other_y_zero_loop 85391037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_x_a 85491037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_x_b 85591037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_rnd 85691037db265ecdd914a26e056cf69207b4f50924ehkuang STORE_AND_RET 85791037db265ecdd914a26e056cf69207b4f50924ehkuang 85891037db265ecdd914a26e056cf69207b4f50924ehkuang.x_nonhalf_y_nonzero: 85991037db265ecdd914a26e056cf69207b4f50924ehkuang cmp y_offsetd, 8 86091037db265ecdd914a26e056cf69207b4f50924ehkuang jne .x_nonhalf_y_nonhalf 86191037db265ecdd914a26e056cf69207b4f50924ehkuang 86291037db265ecdd914a26e056cf69207b4f50924ehkuang ; x_offset == bilin interpolation && y_offset == 0.5 86391037db265ecdd914a26e056cf69207b4f50924ehkuang%ifdef PIC 86491037db265ecdd914a26e056cf69207b4f50924ehkuang lea bilin_filter, [bilin_filter_m] 86591037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 86691037db265ecdd914a26e056cf69207b4f50924ehkuang shl x_offsetd, filter_idx_shift 86791037db265ecdd914a26e056cf69207b4f50924ehkuang%if ARCH_X86_64 && mmsize == 16 86891037db265ecdd914a26e056cf69207b4f50924ehkuang mova m8, [bilin_filter+x_offsetq] 86991037db265ecdd914a26e056cf69207b4f50924ehkuang%if notcpuflag(ssse3) ; FIXME(rbultje) don't scatter registers on x86-64 87091037db265ecdd914a26e056cf69207b4f50924ehkuang mova m9, [bilin_filter+x_offsetq+16] 87191037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 87291037db265ecdd914a26e056cf69207b4f50924ehkuang mova m10, [pw_8] 87391037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_x_a m8 87491037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_x_b m9 87591037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_rnd m10 87691037db265ecdd914a26e056cf69207b4f50924ehkuang%else 87791037db265ecdd914a26e056cf69207b4f50924ehkuang add x_offsetq, bilin_filter 87891037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_x_a [x_offsetq] 87991037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_x_b [x_offsetq+16] 88091037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_rnd [pw_8] 88191037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 88291037db265ecdd914a26e056cf69207b4f50924ehkuang%if %1 == 16 88391037db265ecdd914a26e056cf69207b4f50924ehkuang movu m0, [srcq] 88491037db265ecdd914a26e056cf69207b4f50924ehkuang movu m1, [srcq+1] 88591037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 88691037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m1 88791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m1 88891037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m2, filter_x_a 88991037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m0, filter_x_a 89091037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 89191037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 89291037db265ecdd914a26e056cf69207b4f50924ehkuang%else 89391037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 89491037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m1, m5 89591037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 89691037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 89791037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m0, filter_x_a 89891037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m1, filter_x_b 89991037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 90091037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m2, filter_x_a 90191037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m3, filter_x_b 90291037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 90391037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, m1 90491037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, m3 90591037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 90691037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m0, 4 90791037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 90891037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 90991037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m0, m2 91091037db265ecdd914a26e056cf69207b4f50924ehkuang.x_other_y_half_loop: 91191037db265ecdd914a26e056cf69207b4f50924ehkuang movu m4, [srcq] 91291037db265ecdd914a26e056cf69207b4f50924ehkuang movu m3, [srcq+1] 91391037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 91491037db265ecdd914a26e056cf69207b4f50924ehkuang mova m1, [dstq] 91591037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m4, m3 91691037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m4, m3 91791037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m2, filter_x_a 91891037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m4, filter_x_a 91991037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 92091037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m4, filter_rnd 92191037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 92291037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m4, 4 92391037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m4, m2 92491037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m4 92591037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m1, m5 92691037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 92791037db265ecdd914a26e056cf69207b4f50924ehkuang%else 92891037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m4, m5 92991037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m1, m3, m5 93091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m4, m5 93191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 93291037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m4, filter_x_a 93391037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m3, filter_x_b 93491037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m4, filter_rnd 93591037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m2, filter_x_a 93691037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m1, filter_x_b 93791037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 93891037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m4, m3 93991037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, m1 94091037db265ecdd914a26e056cf69207b4f50924ehkuang mova m1, [dstq] 94191037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m4, 4 94291037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 94391037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m1, m5 94491037db265ecdd914a26e056cf69207b4f50924ehkuang ; FIXME(rbultje) the repeated pack/unpack here around m0/m2 is because we 94591037db265ecdd914a26e056cf69207b4f50924ehkuang ; have a 1-register shortage to be able to store the backup of the bilin 94691037db265ecdd914a26e056cf69207b4f50924ehkuang ; filtered second line as words as cache for the next line. Packing into 94791037db265ecdd914a26e056cf69207b4f50924ehkuang ; a byte costs 1 pack and 2 unpacks, but saves a register. 94891037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m4, m2 94991037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 95091037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, m4 95191037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 95291037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 95391037db265ecdd914a26e056cf69207b4f50924ehkuang ; FIXME(rbultje) pipeline 95491037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 95591037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 95691037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 95791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 95891037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 95991037db265ecdd914a26e056cf69207b4f50924ehkuang mova m0, m4 96091037db265ecdd914a26e056cf69207b4f50924ehkuang 96191037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 96291037db265ecdd914a26e056cf69207b4f50924ehkuang add dstq, dst_strideq 96391037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; %1 < 16 96491037db265ecdd914a26e056cf69207b4f50924ehkuang movh m0, [srcq] 96591037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [srcq+1] 96691037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 96791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m1 96891037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m0, filter_x_a 96991037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 97091037db265ecdd914a26e056cf69207b4f50924ehkuang%else 97191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 97291037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 97391037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m0, filter_x_a 97491037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m1, filter_x_b 97591037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 97691037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, m1 97791037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 97891037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 97991037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m0, 4 98091037db265ecdd914a26e056cf69207b4f50924ehkuang.x_other_y_half_loop: 98191037db265ecdd914a26e056cf69207b4f50924ehkuang movh m2, [srcq] 98291037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [srcq+1] 98391037db265ecdd914a26e056cf69207b4f50924ehkuang movh m4, [srcq+src_strideq] 98491037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [srcq+src_strideq+1] 98591037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 98691037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m1 98791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m4, m3 98891037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m2, filter_x_a 98991037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m4, filter_x_a 99091037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 99191037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [dstq+dst_strideq] 99291037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 99391037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m4, filter_rnd 99491037db265ecdd914a26e056cf69207b4f50924ehkuang%else 99591037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m5 99691037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 99791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m4, m5 99891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 99991037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m2, filter_x_a 100091037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m1, filter_x_b 100191037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 100291037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m4, filter_x_a 100391037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m3, filter_x_b 100491037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m4, filter_rnd 100591037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, m1 100691037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 100791037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m4, m3 100891037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [dstq+dst_strideq] 100991037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 101091037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 101191037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m4, 4 101291037db265ecdd914a26e056cf69207b4f50924ehkuang pavgw m0, m2 101391037db265ecdd914a26e056cf69207b4f50924ehkuang pavgw m2, m4 101491037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 101591037db265ecdd914a26e056cf69207b4f50924ehkuang ; FIXME(rbultje) pipeline - also consider going to bytes here 101691037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m0, m2 101791037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 101891037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 101991037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 102091037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 102191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 102291037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 102391037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 102491037db265ecdd914a26e056cf69207b4f50924ehkuang mova m0, m4 102591037db265ecdd914a26e056cf69207b4f50924ehkuang 102691037db265ecdd914a26e056cf69207b4f50924ehkuang lea srcq, [srcq+src_strideq*2] 102791037db265ecdd914a26e056cf69207b4f50924ehkuang lea dstq, [dstq+dst_strideq*2] 102891037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 102991037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 103091037db265ecdd914a26e056cf69207b4f50924ehkuang add secq, sec_str 103191037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 103291037db265ecdd914a26e056cf69207b4f50924ehkuang dec h 103391037db265ecdd914a26e056cf69207b4f50924ehkuang jg .x_other_y_half_loop 103491037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_x_a 103591037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_x_b 103691037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_rnd 103791037db265ecdd914a26e056cf69207b4f50924ehkuang STORE_AND_RET 103891037db265ecdd914a26e056cf69207b4f50924ehkuang 103991037db265ecdd914a26e056cf69207b4f50924ehkuang.x_nonhalf_y_nonhalf: 104091037db265ecdd914a26e056cf69207b4f50924ehkuang%ifdef PIC 104191037db265ecdd914a26e056cf69207b4f50924ehkuang lea bilin_filter, [bilin_filter_m] 104291037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 104391037db265ecdd914a26e056cf69207b4f50924ehkuang shl x_offsetd, filter_idx_shift 104491037db265ecdd914a26e056cf69207b4f50924ehkuang shl y_offsetd, filter_idx_shift 104591037db265ecdd914a26e056cf69207b4f50924ehkuang%if ARCH_X86_64 && mmsize == 16 104691037db265ecdd914a26e056cf69207b4f50924ehkuang mova m8, [bilin_filter+x_offsetq] 104791037db265ecdd914a26e056cf69207b4f50924ehkuang%if notcpuflag(ssse3) ; FIXME(rbultje) don't scatter registers on x86-64 104891037db265ecdd914a26e056cf69207b4f50924ehkuang mova m9, [bilin_filter+x_offsetq+16] 104991037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 105091037db265ecdd914a26e056cf69207b4f50924ehkuang mova m10, [bilin_filter+y_offsetq] 105191037db265ecdd914a26e056cf69207b4f50924ehkuang%if notcpuflag(ssse3) ; FIXME(rbultje) don't scatter registers on x86-64 105291037db265ecdd914a26e056cf69207b4f50924ehkuang mova m11, [bilin_filter+y_offsetq+16] 105391037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 105491037db265ecdd914a26e056cf69207b4f50924ehkuang mova m12, [pw_8] 105591037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_x_a m8 105691037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_x_b m9 105791037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_y_a m10 105891037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_y_b m11 105991037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_rnd m12 106091037db265ecdd914a26e056cf69207b4f50924ehkuang%else 106191037db265ecdd914a26e056cf69207b4f50924ehkuang add x_offsetq, bilin_filter 106291037db265ecdd914a26e056cf69207b4f50924ehkuang add y_offsetq, bilin_filter 106391037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_x_a [x_offsetq] 106491037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_x_b [x_offsetq+16] 106591037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_y_a [y_offsetq] 106691037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_y_b [y_offsetq+16] 106791037db265ecdd914a26e056cf69207b4f50924ehkuang%define filter_rnd [pw_8] 106891037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 106991037db265ecdd914a26e056cf69207b4f50924ehkuang ; x_offset == bilin interpolation && y_offset == bilin interpolation 107091037db265ecdd914a26e056cf69207b4f50924ehkuang%if %1 == 16 107191037db265ecdd914a26e056cf69207b4f50924ehkuang movu m0, [srcq] 107291037db265ecdd914a26e056cf69207b4f50924ehkuang movu m1, [srcq+1] 107391037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 107491037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m1 107591037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m1 107691037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m2, filter_x_a 107791037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m0, filter_x_a 107891037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 107991037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 108091037db265ecdd914a26e056cf69207b4f50924ehkuang%else 108191037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 108291037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m1, m5 108391037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 108491037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 108591037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m0, filter_x_a 108691037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m1, filter_x_b 108791037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 108891037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m2, filter_x_a 108991037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m3, filter_x_b 109091037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 109191037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, m1 109291037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, m3 109391037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 109491037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m0, 4 109591037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 109691037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 109791037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m0, m2 109891037db265ecdd914a26e056cf69207b4f50924ehkuang.x_other_y_other_loop: 109991037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 110091037db265ecdd914a26e056cf69207b4f50924ehkuang movu m4, [srcq] 110191037db265ecdd914a26e056cf69207b4f50924ehkuang movu m3, [srcq+1] 110291037db265ecdd914a26e056cf69207b4f50924ehkuang mova m1, [dstq] 110391037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m4, m3 110491037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m4, m3 110591037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m2, filter_x_a 110691037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m4, filter_x_a 110791037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m1, m5 110891037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 110991037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m4, filter_rnd 111091037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 111191037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m4, 4 111291037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m4, m2 111391037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m4 111491037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m4 111591037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m2, filter_y_a 111691037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m0, filter_y_a 111791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 111891037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 111991037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 112091037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 112191037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m0, 4 112291037db265ecdd914a26e056cf69207b4f50924ehkuang%else 112391037db265ecdd914a26e056cf69207b4f50924ehkuang movu m3, [srcq] 112491037db265ecdd914a26e056cf69207b4f50924ehkuang movu m4, [srcq+1] 112591037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m1, m3, m5 112691037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m4, m5 112791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 112891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m4, m5 112991037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m3, filter_x_a 113091037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m4, filter_x_b 113191037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m3, filter_rnd 113291037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m1, filter_x_a 113391037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m2, filter_x_b 113491037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m1, filter_rnd 113591037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m3, m4 113691037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m1, m2 113791037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m3, 4 113891037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m1, 4 113991037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m4, m3, m1 114091037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 114191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 114291037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m2, filter_y_a 114391037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m1, filter_y_b 114491037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 114591037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m0, filter_y_a 114691037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m3, filter_y_b 114791037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, m1 114891037db265ecdd914a26e056cf69207b4f50924ehkuang mova m1, [dstq] 114991037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 115091037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 115191037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, m3 115291037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m3, m1, m5 115391037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m0, 4 115491037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 115591037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 115691037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 115791037db265ecdd914a26e056cf69207b4f50924ehkuang ; FIXME(rbultje) pipeline 115891037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m0, m2 115991037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 116091037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 116191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 116291037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 116391037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 116491037db265ecdd914a26e056cf69207b4f50924ehkuang mova m0, m4 116591037db265ecdd914a26e056cf69207b4f50924ehkuang 116691037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 116791037db265ecdd914a26e056cf69207b4f50924ehkuang add dstq, dst_strideq 116891037db265ecdd914a26e056cf69207b4f50924ehkuang%else ; %1 < 16 116991037db265ecdd914a26e056cf69207b4f50924ehkuang movh m0, [srcq] 117091037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [srcq+1] 117191037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 117291037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m1 117391037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m0, filter_x_a 117491037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 117591037db265ecdd914a26e056cf69207b4f50924ehkuang%else 117691037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 117791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 117891037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m0, filter_x_a 117991037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m1, filter_x_b 118091037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 118191037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, m1 118291037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 118391037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m0, 4 118491037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 118591037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m0, m0 118691037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 118791037db265ecdd914a26e056cf69207b4f50924ehkuang add srcq, src_strideq 118891037db265ecdd914a26e056cf69207b4f50924ehkuang.x_other_y_other_loop: 118991037db265ecdd914a26e056cf69207b4f50924ehkuang movh m2, [srcq] 119091037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [srcq+1] 119191037db265ecdd914a26e056cf69207b4f50924ehkuang movh m4, [srcq+src_strideq] 119291037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [srcq+src_strideq+1] 119391037db265ecdd914a26e056cf69207b4f50924ehkuang%if cpuflag(ssse3) 119491037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m1 119591037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m4, m3 119691037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m2, filter_x_a 119791037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m4, filter_x_a 119891037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [dstq+dst_strideq] 119991037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 120091037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 120191037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m4, filter_rnd 120291037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 120391037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m4, 4 120491037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m2, m2 120591037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m4, m4 120691037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m2 120791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m4 120891037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m0, filter_y_a 120991037db265ecdd914a26e056cf69207b4f50924ehkuang pmaddubsw m2, filter_y_a 121091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 121191037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 121291037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 121391037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m0, 4 121491037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 121591037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 121691037db265ecdd914a26e056cf69207b4f50924ehkuang%else 121791037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m2, m5 121891037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 121991037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m4, m5 122091037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 122191037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m2, filter_x_a 122291037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m1, filter_x_b 122391037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 122491037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m4, filter_x_a 122591037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m3, filter_x_b 122691037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m4, filter_rnd 122791037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, m1 122891037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m4, m3 122991037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 123091037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m4, 4 123191037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m0, filter_y_a 123291037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m3, m2, filter_y_b 123391037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, filter_rnd 123491037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m2, filter_y_a 123591037db265ecdd914a26e056cf69207b4f50924ehkuang pmullw m1, m4, filter_y_b 123691037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, filter_rnd 123791037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m0, m3 123891037db265ecdd914a26e056cf69207b4f50924ehkuang movh m3, [dstq+dst_strideq] 123991037db265ecdd914a26e056cf69207b4f50924ehkuang paddw m2, m1 124091037db265ecdd914a26e056cf69207b4f50924ehkuang movh m1, [dstq] 124191037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m0, 4 124291037db265ecdd914a26e056cf69207b4f50924ehkuang psraw m2, 4 124391037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m3, m5 124491037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m1, m5 124591037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 124691037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 124791037db265ecdd914a26e056cf69207b4f50924ehkuang ; FIXME(rbultje) pipeline 124891037db265ecdd914a26e056cf69207b4f50924ehkuang packuswb m0, m2 124991037db265ecdd914a26e056cf69207b4f50924ehkuang pavgb m0, [secq] 125091037db265ecdd914a26e056cf69207b4f50924ehkuang punpckhbw m2, m0, m5 125191037db265ecdd914a26e056cf69207b4f50924ehkuang punpcklbw m0, m5 125291037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 125391037db265ecdd914a26e056cf69207b4f50924ehkuang SUM_SSE m0, m1, m2, m3, m6, m7 125491037db265ecdd914a26e056cf69207b4f50924ehkuang mova m0, m4 125591037db265ecdd914a26e056cf69207b4f50924ehkuang 125691037db265ecdd914a26e056cf69207b4f50924ehkuang lea srcq, [srcq+src_strideq*2] 125791037db265ecdd914a26e056cf69207b4f50924ehkuang lea dstq, [dstq+dst_strideq*2] 125891037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 125991037db265ecdd914a26e056cf69207b4f50924ehkuang%if %2 == 1 ; avg 126091037db265ecdd914a26e056cf69207b4f50924ehkuang add secq, sec_str 126191037db265ecdd914a26e056cf69207b4f50924ehkuang%endif 126291037db265ecdd914a26e056cf69207b4f50924ehkuang dec h 126391037db265ecdd914a26e056cf69207b4f50924ehkuang jg .x_other_y_other_loop 126491037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_x_a 126591037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_x_b 126691037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_y_a 126791037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_y_b 126891037db265ecdd914a26e056cf69207b4f50924ehkuang%undef filter_rnd 126991037db265ecdd914a26e056cf69207b4f50924ehkuang STORE_AND_RET 127091037db265ecdd914a26e056cf69207b4f50924ehkuang%endmacro 127191037db265ecdd914a26e056cf69207b4f50924ehkuang 127291037db265ecdd914a26e056cf69207b4f50924ehkuang; FIXME(rbultje) the non-bilinear versions (i.e. x=0,8&&y=0,8) are identical 127391037db265ecdd914a26e056cf69207b4f50924ehkuang; between the ssse3 and non-ssse3 version. It may make sense to merge their 127491037db265ecdd914a26e056cf69207b4f50924ehkuang; code in the sense that the ssse3 version would jump to the appropriate 127591037db265ecdd914a26e056cf69207b4f50924ehkuang; location in the sse/2 version, rather than duplicating that code in the 127691037db265ecdd914a26e056cf69207b4f50924ehkuang; binary. 127791037db265ecdd914a26e056cf69207b4f50924ehkuang 127891037db265ecdd914a26e056cf69207b4f50924ehkuangINIT_MMX sse 127991037db265ecdd914a26e056cf69207b4f50924ehkuangSUBPEL_VARIANCE 4 128091037db265ecdd914a26e056cf69207b4f50924ehkuangINIT_XMM sse2 128191037db265ecdd914a26e056cf69207b4f50924ehkuangSUBPEL_VARIANCE 8 128291037db265ecdd914a26e056cf69207b4f50924ehkuangSUBPEL_VARIANCE 16 128391037db265ecdd914a26e056cf69207b4f50924ehkuang 128491037db265ecdd914a26e056cf69207b4f50924ehkuangINIT_MMX ssse3 128591037db265ecdd914a26e056cf69207b4f50924ehkuangSUBPEL_VARIANCE 4 128691037db265ecdd914a26e056cf69207b4f50924ehkuangINIT_XMM ssse3 128791037db265ecdd914a26e056cf69207b4f50924ehkuangSUBPEL_VARIANCE 8 128891037db265ecdd914a26e056cf69207b4f50924ehkuangSUBPEL_VARIANCE 16 128991037db265ecdd914a26e056cf69207b4f50924ehkuang 129091037db265ecdd914a26e056cf69207b4f50924ehkuangINIT_MMX sse 129191037db265ecdd914a26e056cf69207b4f50924ehkuangSUBPEL_VARIANCE 4, 1 129291037db265ecdd914a26e056cf69207b4f50924ehkuangINIT_XMM sse2 129391037db265ecdd914a26e056cf69207b4f50924ehkuangSUBPEL_VARIANCE 8, 1 129491037db265ecdd914a26e056cf69207b4f50924ehkuangSUBPEL_VARIANCE 16, 1 129591037db265ecdd914a26e056cf69207b4f50924ehkuang 129691037db265ecdd914a26e056cf69207b4f50924ehkuangINIT_MMX ssse3 129791037db265ecdd914a26e056cf69207b4f50924ehkuangSUBPEL_VARIANCE 4, 1 129891037db265ecdd914a26e056cf69207b4f50924ehkuangINIT_XMM ssse3 129991037db265ecdd914a26e056cf69207b4f50924ehkuangSUBPEL_VARIANCE 8, 1 130091037db265ecdd914a26e056cf69207b4f50924ehkuangSUBPEL_VARIANCE 16, 1 1301