]> git.sesse.net Git - ffmpeg/blob - libswresample/x86/rematrix.asm
swr: mix_1_1_int16_sse
[ffmpeg] / 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 lenq    , 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 INIT_MMX mmx
162 MIX1_INT16 u
163 MIX1_INT16 a
164
165 INIT_XMM sse
166 MIX2_FLT u
167 MIX2_FLT a
168 MIX1_FLT u
169 MIX1_FLT a
170 MIX1_INT16 u
171 MIX1_INT16 a
172
173 %if HAVE_AVX
174 INIT_YMM avx
175 MIX2_FLT u
176 MIX2_FLT a
177 MIX1_FLT u
178 MIX1_FLT a
179 %endif