e038c18bd8371a937bbb59dcb287e6d871504c01
[ffmpeg.git] / libavcodec / x86 / audiodsp.asm
1 ;******************************************************************************
2 ;* optimized audio functions
3 ;* Copyright (c) 2008 Loren Merritt
4 ;*
5 ;* This file is part of Libav.
6 ;*
7 ;* Libav is free software; you can redistribute it and/or
8 ;* modify it under the terms of the GNU Lesser General Public
9 ;* License as published by the Free Software Foundation; either
10 ;* version 2.1 of the License, or (at your option) any later version.
11 ;*
12 ;* Libav is distributed in the hope that it will be useful,
13 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 ;* Lesser General Public License for more details.
16 ;*
17 ;* You should have received a copy of the GNU Lesser General Public
18 ;* License along with Libav; if not, write to the Free Software
19 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 ;******************************************************************************
21
22 %include "libavutil/x86/x86util.asm"
23
24 SECTION .text
25
26 %macro SCALARPRODUCT 0
27 ; int ff_scalarproduct_int16(int16_t *v1, int16_t *v2, int order)
28 cglobal scalarproduct_int16, 3,3,3, v1, v2, order
29     add orderd, orderd
30     add v1q, orderq
31     add v2q, orderq
32     neg orderq
33     pxor    m2, m2
34 .loop:
35     movu    m0, [v1q + orderq]
36     movu    m1, [v1q + orderq + mmsize]
37     pmaddwd m0, [v2q + orderq]
38     pmaddwd m1, [v2q + orderq + mmsize]
39     paddd   m2, m0
40     paddd   m2, m1
41     add     orderq, mmsize*2
42     jl .loop
43 %if mmsize == 16
44     movhlps m0, m2
45     paddd   m2, m0
46     pshuflw m0, m2, 0x4e
47 %else
48     pshufw  m0, m2, 0x4e
49 %endif
50     paddd   m2, m0
51     movd   eax, m2
52     RET
53 %endmacro
54
55 INIT_MMX mmxext
56 SCALARPRODUCT
57 INIT_XMM sse2
58 SCALARPRODUCT
59
60
61 ;-----------------------------------------------------------------------------
62 ; void ff_vector_clip_int32(int32_t *dst, const int32_t *src, int32_t min,
63 ;                           int32_t max, unsigned int len)
64 ;-----------------------------------------------------------------------------
65
66 ; %1 = number of xmm registers used
67 ; %2 = number of inline load/process/store loops per asm loop
68 ; %3 = process 4*mmsize (%3=0) or 8*mmsize (%3=1) bytes per loop
69 ; %4 = CLIPD function takes min/max as float instead of int (CLIPD_SSE2)
70 ; %5 = suffix
71 %macro VECTOR_CLIP_INT32 4-5
72 cglobal vector_clip_int32%5, 5,5,%1, dst, src, min, max, len
73 %if %4
74     cvtsi2ss  m4, minm
75     cvtsi2ss  m5, maxm
76 %else
77     movd      m4, minm
78     movd      m5, maxm
79 %endif
80     SPLATD    m4
81     SPLATD    m5
82 .loop:
83 %assign %%i 0
84 %rep %2
85     mova      m0,  [srcq + mmsize * (0 + %%i)]
86     mova      m1,  [srcq + mmsize * (1 + %%i)]
87     mova      m2,  [srcq + mmsize * (2 + %%i)]
88     mova      m3,  [srcq + mmsize * (3 + %%i)]
89 %if %3
90     mova      m7,  [srcq + mmsize * (4 + %%i)]
91     mova      m8,  [srcq + mmsize * (5 + %%i)]
92     mova      m9,  [srcq + mmsize * (6 + %%i)]
93     mova      m10, [srcq + mmsize * (7 + %%i)]
94 %endif
95     CLIPD  m0,  m4, m5, m6
96     CLIPD  m1,  m4, m5, m6
97     CLIPD  m2,  m4, m5, m6
98     CLIPD  m3,  m4, m5, m6
99 %if %3
100     CLIPD  m7,  m4, m5, m6
101     CLIPD  m8,  m4, m5, m6
102     CLIPD  m9,  m4, m5, m6
103     CLIPD  m10, m4, m5, m6
104 %endif
105     mova  [dstq + mmsize * (0 + %%i)], m0
106     mova  [dstq + mmsize * (1 + %%i)], m1
107     mova  [dstq + mmsize * (2 + %%i)], m2
108     mova  [dstq + mmsize * (3 + %%i)], m3
109 %if %3
110     mova  [dstq + mmsize * (4 + %%i)], m7
111     mova  [dstq + mmsize * (5 + %%i)], m8
112     mova  [dstq + mmsize * (6 + %%i)], m9
113     mova  [dstq + mmsize * (7 + %%i)], m10
114 %endif
115 %assign %%i (%%i + 4 * (1 + %3))
116 %endrep
117     add     srcq, mmsize*4*(%2+%3)
118     add     dstq, mmsize*4*(%2+%3)
119     sub     lend, mmsize*(%2+%3)
120     jg .loop
121     REP_RET
122 %endmacro
123
124 INIT_MMX mmx
125 %define CLIPD CLIPD_MMX
126 VECTOR_CLIP_INT32 0, 1, 0, 0
127 INIT_XMM sse2
128 VECTOR_CLIP_INT32 6, 1, 0, 0, _int
129 %define CLIPD CLIPD_SSE2
130 VECTOR_CLIP_INT32 6, 2, 0, 1
131 INIT_XMM sse4
132 %define CLIPD CLIPD_SSE41
133 %ifdef m8
134 VECTOR_CLIP_INT32 11, 1, 1, 0
135 %else
136 VECTOR_CLIP_INT32 6, 1, 0, 0
137 %endif
138
139 ; void ff_vector_clipf_sse(float *dst, const float *src,
140 ;                          int len, float min, float max)
141 INIT_XMM sse
142 cglobal vector_clipf, 3, 3, 6, dst, src, len, min, max
143 %if ARCH_X86_32
144     VBROADCASTSS m0, minm
145     VBROADCASTSS m1, maxm
146 %elif WIN64
147     VBROADCASTSS m0, m3
148     VBROADCASTSS m1, maxm
149 %else ; 64bit sysv
150     VBROADCASTSS m0, m0
151     VBROADCASTSS m1, m1
152 %endif
153
154     movsxdifnidn lenq, lend
155
156 .loop:
157     mova m2, [srcq + 4 * lenq - 4 * mmsize]
158     mova m3, [srcq + 4 * lenq - 3 * mmsize]
159     mova m4, [srcq + 4 * lenq - 2 * mmsize]
160     mova m5, [srcq + 4 * lenq - 1 * mmsize]
161
162     maxps m2, m0
163     maxps m3, m0
164     maxps m4, m0
165     maxps m5, m0
166
167     minps m2, m1
168     minps m3, m1
169     minps m4, m1
170     minps m5, m1
171
172     mova [dstq + 4 * lenq - 4 * mmsize], m2
173     mova [dstq + 4 * lenq - 3 * mmsize], m3
174     mova [dstq + 4 * lenq - 2 * mmsize], m4
175     mova [dstq + 4 * lenq - 1 * mmsize], m5
176
177     sub lenq, mmsize
178     jg .loop
179
180     RET