swr/x86: 16bit integer mix functions need SSE2 not SSE
[ffmpeg.git] / libswresample / x86 / rematrix.asm
1 ;******************************************************************************
2 ;* Copyright (c) 2012 Michael Niedermayer
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/x86inc.asm"
22 %include "libavutil/x86/x86util.asm"
23
24
25 SECTION_RODATA
26 align 32
27 dw1: times 8  dd 1
28 w1 : times 16 dw 1
29
30 SECTION .text
31
32 %macro MIX2_FLT 1
33 cglobal mix_2_1_%1_float, 7, 7, 6, out, in1, in2, coeffp, index1, index2, len
34 %ifidn %1, a
35     test in1q, mmsize-1
36         jne mix_2_1_float_u_int %+ SUFFIX
37     test in2q, mmsize-1
38         jne mix_2_1_float_u_int %+ SUFFIX
39     test outq, mmsize-1
40         jne mix_2_1_float_u_int %+ SUFFIX
41 %else
42 mix_2_1_float_u_int %+ SUFFIX
43 %endif
44     VBROADCASTSS m4, [coeffpq + 4*index1q]
45     VBROADCASTSS m5, [coeffpq + 4*index2q]
46     shl lend    , 2
47     add in1q    , lenq
48     add in2q    , lenq
49     add outq    , lenq
50     neg lenq
51 .next:
52 %ifidn %1, a
53     mulps        m0, m4, [in1q + lenq         ]
54     mulps        m1, m5, [in2q + lenq         ]
55     mulps        m2, m4, [in1q + lenq + mmsize]
56     mulps        m3, m5, [in2q + lenq + mmsize]
57 %else
58     movu         m0, [in1q + lenq         ]
59     movu         m1, [in2q + lenq         ]
60     movu         m2, [in1q + lenq + mmsize]
61     movu         m3, [in2q + lenq + mmsize]
62     mulps        m0, m0, m4
63     mulps        m1, m1, m5
64     mulps        m2, m2, m4
65     mulps        m3, m3, m5
66 %endif
67     addps        m0, m0, m1
68     addps        m2, m2, m3
69     mov%1  [outq + lenq         ], m0
70     mov%1  [outq + lenq + mmsize], m2
71     add        lenq, mmsize*2
72         jl .next
73     REP_RET
74 %endmacro
75
76 %macro MIX1_FLT 1
77 cglobal mix_1_1_%1_float, 5, 5, 3, out, in, coeffp, index, len
78 %ifidn %1, a
79     test inq, mmsize-1
80         jne mix_1_1_float_u_int %+ SUFFIX
81     test outq, mmsize-1
82         jne mix_1_1_float_u_int %+ SUFFIX
83 %else
84 mix_1_1_float_u_int %+ SUFFIX
85 %endif
86     VBROADCASTSS m2, [coeffpq + 4*indexq]
87     shl lenq    , 2
88     add inq     , lenq
89     add outq    , lenq
90     neg lenq
91 .next:
92 %ifidn %1, a
93     mulps        m0, m2, [inq + lenq         ]
94     mulps        m1, m2, [inq + lenq + mmsize]
95 %else
96     movu         m0, [inq + lenq         ]
97     movu         m1, [inq + lenq + mmsize]
98     mulps        m0, m0, m2
99     mulps        m1, m1, m2
100 %endif
101     mov%1  [outq + lenq         ], m0
102     mov%1  [outq + lenq + mmsize], m1
103     add        lenq, mmsize*2
104         jl .next
105     REP_RET
106 %endmacro
107
108 %macro MIX1_INT16 1
109 cglobal mix_1_1_%1_int16, 5, 5, 6, out, in, coeffp, index, len
110 %ifidn %1, a
111     test inq, mmsize-1
112         jne mix_1_1_int16_u_int %+ SUFFIX
113     test outq, mmsize-1
114         jne mix_1_1_int16_u_int %+ SUFFIX
115 %else
116 mix_1_1_int16_u_int %+ SUFFIX
117 %endif
118     movd   m4, [coeffpq + 4*indexq]
119     SPLATW m5, m4
120     psllq  m4, 32
121     psrlq  m4, 48
122     mova   m0, [w1]
123     psllw  m0, m4
124     psrlw  m0, 1
125     punpcklwd m5, m0
126     add lenq    , lenq
127     add inq     , lenq
128     add outq    , lenq
129     neg lenq
130 .next:
131     mov%1        m0, [inq + lenq         ]
132     mov%1        m2, [inq + lenq + mmsize]
133     mova         m1, m0
134     mova         m3, m2
135     punpcklwd    m0, [w1]
136     punpckhwd    m1, [w1]
137     punpcklwd    m2, [w1]
138     punpckhwd    m3, [w1]
139     pmaddwd      m0, m5
140     pmaddwd      m1, m5
141     pmaddwd      m2, m5
142     pmaddwd      m3, m5
143     psrad        m0, m4
144     psrad        m1, m4
145     psrad        m2, m4
146     psrad        m3, m4
147     packssdw     m0, m1
148     packssdw     m2, m3
149     mov%1  [outq + lenq         ], m0
150     mov%1  [outq + lenq + mmsize], m2
151     add        lenq, mmsize*2
152         jl .next
153 %if mmsize == 8
154     emms
155     RET
156 %else
157     REP_RET
158 %endif
159 %endmacro
160
161 %macro MIX2_INT16 1
162 cglobal mix_2_1_%1_int16, 7, 7, 8, out, in1, in2, coeffp, index1, index2, len
163 %ifidn %1, a
164     test in1q, mmsize-1
165         jne mix_2_1_int16_u_int %+ SUFFIX
166     test in2q, mmsize-1
167         jne mix_2_1_int16_u_int %+ SUFFIX
168     test outq, mmsize-1
169         jne mix_2_1_int16_u_int %+ SUFFIX
170 %else
171 mix_2_1_int16_u_int %+ SUFFIX
172 %endif
173     movd   m4, [coeffpq + 4*index1q]
174     movd   m6, [coeffpq + 4*index2q]
175     SPLATW m5, m4
176     SPLATW m6, m6
177     psllq  m4, 32
178     psrlq  m4, 48
179     mova   m7, [dw1]
180     pslld  m7, m4
181     psrld  m7, 1
182     punpcklwd m5, m6
183     add lend    , lend
184     add in1q    , lenq
185     add in2q    , lenq
186     add outq    , lenq
187     neg lenq
188 .next:
189     mov%1        m0, [in1q + lenq         ]
190     mov%1        m2, [in2q + lenq         ]
191     mova         m1, m0
192     punpcklwd    m0, m2
193     punpckhwd    m1, m2
194
195     mov%1        m2, [in1q + lenq + mmsize]
196     mov%1        m6, [in2q + lenq + mmsize]
197     mova         m3, m2
198     punpcklwd    m2, m6
199     punpckhwd    m3, m6
200
201     pmaddwd      m0, m5
202     pmaddwd      m1, m5
203     pmaddwd      m2, m5
204     pmaddwd      m3, m5
205     paddd        m0, m7
206     paddd        m1, m7
207     paddd        m2, m7
208     paddd        m3, m7
209     psrad        m0, m4
210     psrad        m1, m4
211     psrad        m2, m4
212     psrad        m3, m4
213     packssdw     m0, m1
214     packssdw     m2, m3
215     mov%1  [outq + lenq         ], m0
216     mov%1  [outq + lenq + mmsize], m2
217     add        lenq, mmsize*2
218         jl .next
219 %if mmsize == 8
220     emms
221     RET
222 %else
223     REP_RET
224 %endif
225 %endmacro
226
227
228 INIT_MMX mmx
229 MIX1_INT16 u
230 MIX1_INT16 a
231 MIX2_INT16 u
232 MIX2_INT16 a
233
234 INIT_XMM sse
235 MIX2_FLT u
236 MIX2_FLT a
237 MIX1_FLT u
238 MIX1_FLT a
239
240 INIT_XMM sse2
241 MIX1_INT16 u
242 MIX1_INT16 a
243 MIX2_INT16 u
244 MIX2_INT16 a
245
246 %if HAVE_AVX
247 INIT_YMM avx
248 MIX2_FLT u
249 MIX2_FLT a
250 MIX1_FLT u
251 MIX1_FLT a
252 %endif