x86inc: Drop SECTION_TEXT macro
[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     shl orderq, 1
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 1
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+1
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