avcodec/x86/lossless_audiodsp: support len %16 == 8 in scalarproduct_and_madd_int16()
[ffmpeg.git] / libavcodec / x86 / lossless_audiodsp.asm
1 ;******************************************************************************
2 ;* Copyright (c) 2008 Loren Merritt
3 ;*
4 ;* This file is part of FFmpeg.
5 ;*
6 ;* FFmpeg is free software; you can redistribute it and/or
7 ;* modify it under the terms of the GNU Lesser General Public
8 ;* License as published by the Free Software Foundation; either
9 ;* version 2.1 of the License, or (at your option) any later version.
10 ;*
11 ;* FFmpeg is distributed in the hope that it will be useful,
12 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 ;* Lesser General Public License for more details.
15 ;*
16 ;* You should have received a copy of the GNU Lesser General Public
17 ;* License along with FFmpeg; if not, write to the Free Software
18 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 ;******************************************************************************
20
21 %include "libavutil/x86/x86util.asm"
22
23 SECTION_TEXT
24
25 %macro SCALARPRODUCT 0
26 ; int ff_scalarproduct_and_madd_int16(int16_t *v1, int16_t *v2, int16_t *v3,
27 ;                                     int order, int mul)
28 cglobal scalarproduct_and_madd_int16, 4,4,8, v1, v2, v3, order, mul
29 %if mmsize == 16
30     test orderq, 8
31         jnz scalarproduct_and_madd_int16_mmxext;
32 %endif
33     shl orderq, 1
34     movd    m7, mulm
35 %if mmsize == 16
36     pshuflw m7, m7, 0
37     punpcklqdq m7, m7
38 %else
39     pshufw  m7, m7, 0
40 %endif
41     pxor    m6, m6
42     add v1q, orderq
43     add v2q, orderq
44     add v3q, orderq
45     neg orderq
46 .loop:
47     movu    m0, [v2q + orderq]
48     movu    m1, [v2q + orderq + mmsize]
49     mova    m4, [v1q + orderq]
50     mova    m5, [v1q + orderq + mmsize]
51     movu    m2, [v3q + orderq]
52     movu    m3, [v3q + orderq + mmsize]
53     pmaddwd m0, m4
54     pmaddwd m1, m5
55     pmullw  m2, m7
56     pmullw  m3, m7
57     paddd   m6, m0
58     paddd   m6, m1
59     paddw   m2, m4
60     paddw   m3, m5
61     mova    [v1q + orderq], m2
62     mova    [v1q + orderq + mmsize], m3
63     add     orderq, mmsize*2
64     jl .loop
65     HADDD   m6, m0
66     movd   eax, m6
67     RET
68 %endmacro
69
70 INIT_MMX mmxext
71 SCALARPRODUCT
72 INIT_XMM sse2
73 SCALARPRODUCT
74
75 %macro SCALARPRODUCT_LOOP 1
76 align 16
77 .loop%1:
78     sub     orderq, mmsize*2
79 %if %1
80     mova    m1, m4
81     mova    m4, [v2q + orderq]
82     mova    m0, [v2q + orderq + mmsize]
83     palignr m1, m0, %1
84     palignr m0, m4, %1
85     mova    m3, m5
86     mova    m5, [v3q + orderq]
87     mova    m2, [v3q + orderq + mmsize]
88     palignr m3, m2, %1
89     palignr m2, m5, %1
90 %else
91     mova    m0, [v2q + orderq]
92     mova    m1, [v2q + orderq + mmsize]
93     mova    m2, [v3q + orderq]
94     mova    m3, [v3q + orderq + mmsize]
95 %endif
96     %define t0  [v1q + orderq]
97     %define t1  [v1q + orderq + mmsize]
98 %if ARCH_X86_64
99     mova    m8, t0
100     mova    m9, t1
101     %define t0  m8
102     %define t1  m9
103 %endif
104     pmaddwd m0, t0
105     pmaddwd m1, t1
106     pmullw  m2, m7
107     pmullw  m3, m7
108     paddw   m2, t0
109     paddw   m3, t1
110     paddd   m6, m0
111     paddd   m6, m1
112     mova    [v1q + orderq], m2
113     mova    [v1q + orderq + mmsize], m3
114     jg .loop%1
115 %if %1
116     jmp .end
117 %endif
118 %endmacro
119
120 ; int ff_scalarproduct_and_madd_int16(int16_t *v1, int16_t *v2, int16_t *v3,
121 ;                                     int order, int mul)
122 INIT_XMM ssse3
123 cglobal scalarproduct_and_madd_int16, 4,5,10, v1, v2, v3, order, mul
124     test orderq, 8
125         jnz scalarproduct_and_madd_int16_mmxext;
126     shl orderq, 1
127     movd    m7, mulm
128     pshuflw m7, m7, 0
129     punpcklqdq m7, m7
130     pxor    m6, m6
131     mov    r4d, v2d
132     and    r4d, 15
133     and    v2q, ~15
134     and    v3q, ~15
135     mova    m4, [v2q + orderq]
136     mova    m5, [v3q + orderq]
137     ; linear is faster than branch tree or jump table, because the branches taken are cyclic (i.e. predictable)
138     cmp    r4d, 0
139     je .loop0
140     cmp    r4d, 2
141     je .loop2
142     cmp    r4d, 4
143     je .loop4
144     cmp    r4d, 6
145     je .loop6
146     cmp    r4d, 8
147     je .loop8
148     cmp    r4d, 10
149     je .loop10
150     cmp    r4d, 12
151     je .loop12
152 SCALARPRODUCT_LOOP 14
153 SCALARPRODUCT_LOOP 12
154 SCALARPRODUCT_LOOP 10
155 SCALARPRODUCT_LOOP 8
156 SCALARPRODUCT_LOOP 6
157 SCALARPRODUCT_LOOP 4
158 SCALARPRODUCT_LOOP 2
159 SCALARPRODUCT_LOOP 0
160 .end:
161     HADDD   m6, m0
162     movd   eax, m6
163     RET