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