x86util: Port all macros to cpuflags
[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 (SSE2 version)
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 VECTOR_CLIP_INT32 0, 1, 0, 0
126 INIT_XMM sse2
127 VECTOR_CLIP_INT32 6, 1, 0, 0, _int
128 VECTOR_CLIP_INT32 6, 2, 0, 1
129 INIT_XMM sse4
130 %ifdef m8
131 VECTOR_CLIP_INT32 11, 1, 1, 0
132 %else
133 VECTOR_CLIP_INT32 6, 1, 0, 0
134 %endif
135
136 ; void ff_vector_clipf_sse(float *dst, const float *src,
137 ;                          int len, float min, float max)
138 INIT_XMM sse
139 cglobal vector_clipf, 3, 3, 6, dst, src, len, min, max
140 %if ARCH_X86_32
141     VBROADCASTSS m0, minm
142     VBROADCASTSS m1, maxm
143 %elif WIN64
144     VBROADCASTSS m0, m3
145     VBROADCASTSS m1, maxm
146 %else ; 64bit sysv
147     VBROADCASTSS m0, m0
148     VBROADCASTSS m1, m1
149 %endif
150
151     movsxdifnidn lenq, lend
152
153 .loop:
154     mova m2, [srcq + 4 * lenq - 4 * mmsize]
155     mova m3, [srcq + 4 * lenq - 3 * mmsize]
156     mova m4, [srcq + 4 * lenq - 2 * mmsize]
157     mova m5, [srcq + 4 * lenq - 1 * mmsize]
158
159     maxps m2, m0
160     maxps m3, m0
161     maxps m4, m0
162     maxps m5, m0
163
164     minps m2, m1
165     minps m3, m1
166     minps m4, m1
167     minps m5, m1
168
169     mova [dstq + 4 * lenq - 4 * mmsize], m2
170     mova [dstq + 4 * lenq - 3 * mmsize], m3
171     mova [dstq + 4 * lenq - 2 * mmsize], m4
172     mova [dstq + 4 * lenq - 1 * mmsize], m5
173
174     sub lenq, mmsize
175     jg .loop
176
177     RET