Add support for a.out object format to assembler macros.
[ffmpeg.git] / libavcodec / x86 / fmtconvert.asm
1 ;******************************************************************************
2 ;* x86 optimized Format Conversion Utils
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 "x86inc.asm"
23 %include "x86util.asm"
24
25 SECTION_TEXT
26
27 %macro PSWAPD_SSE 2
28     pshufw %1, %2, 0x4e
29 %endmacro
30 %macro PSWAPD_3DN1 2
31     movq  %1, %2
32     psrlq %1, 32
33     punpckldq %1, %2
34 %endmacro
35
36 %macro FLOAT_TO_INT16_INTERLEAVE6 1
37 ; void float_to_int16_interleave6_sse(int16_t *dst, const float **src, int len)
38 cglobal float_to_int16_interleave6_%1, 2,7,0, dst, src, src1, src2, src3, src4, src5
39 %ifdef ARCH_X86_64
40     %define lend r10d
41     mov     lend, r2d
42 %else
43     %define lend dword r2m
44 %endif
45     mov src1q, [srcq+1*gprsize]
46     mov src2q, [srcq+2*gprsize]
47     mov src3q, [srcq+3*gprsize]
48     mov src4q, [srcq+4*gprsize]
49     mov src5q, [srcq+5*gprsize]
50     mov srcq,  [srcq]
51     sub src1q, srcq
52     sub src2q, srcq
53     sub src3q, srcq
54     sub src4q, srcq
55     sub src5q, srcq
56 .loop:
57     cvtps2pi   mm0, [srcq]
58     cvtps2pi   mm1, [srcq+src1q]
59     cvtps2pi   mm2, [srcq+src2q]
60     cvtps2pi   mm3, [srcq+src3q]
61     cvtps2pi   mm4, [srcq+src4q]
62     cvtps2pi   mm5, [srcq+src5q]
63     packssdw   mm0, mm3
64     packssdw   mm1, mm4
65     packssdw   mm2, mm5
66     pswapd     mm3, mm0
67     punpcklwd  mm0, mm1
68     punpckhwd  mm1, mm2
69     punpcklwd  mm2, mm3
70     pswapd     mm3, mm0
71     punpckldq  mm0, mm2
72     punpckhdq  mm2, mm1
73     punpckldq  mm1, mm3
74     movq [dstq   ], mm0
75     movq [dstq+16], mm2
76     movq [dstq+ 8], mm1
77     add srcq, 8
78     add dstq, 24
79     sub lend, 2
80     jg .loop
81     emms
82     RET
83 %endmacro ; FLOAT_TO_INT16_INTERLEAVE6
84
85 %define pswapd PSWAPD_SSE
86 FLOAT_TO_INT16_INTERLEAVE6 sse
87 %define cvtps2pi pf2id
88 %define pswapd PSWAPD_3DN1
89 FLOAT_TO_INT16_INTERLEAVE6 3dnow
90 %undef pswapd
91 FLOAT_TO_INT16_INTERLEAVE6 3dn2
92 %undef cvtps2pi
93
94 ;-----------------------------------------------------------------------------
95 ; void ff_float_interleave6(float *dst, const float **src, unsigned int len);
96 ;-----------------------------------------------------------------------------
97
98 %macro BUTTERFLYPS 3
99     movaps    m%3, m%1
100     unpcklps  m%1, m%2
101     unpckhps  m%3, m%2
102     SWAP %2, %3
103 %endmacro
104
105 %macro FLOAT_INTERLEAVE6 2
106 cglobal float_interleave6_%1, 2,7,%2, dst, src, src1, src2, src3, src4, src5
107 %ifdef ARCH_X86_64
108     %define lend r10d
109     mov     lend, r2d
110 %else
111     %define lend dword r2m
112 %endif
113     mov    src1q, [srcq+1*gprsize]
114     mov    src2q, [srcq+2*gprsize]
115     mov    src3q, [srcq+3*gprsize]
116     mov    src4q, [srcq+4*gprsize]
117     mov    src5q, [srcq+5*gprsize]
118     mov     srcq, [srcq]
119     sub    src1q, srcq
120     sub    src2q, srcq
121     sub    src3q, srcq
122     sub    src4q, srcq
123     sub    src5q, srcq
124 .loop:
125 %ifidn %1, sse
126     movaps    m0, [srcq]
127     movaps    m1, [srcq+src1q]
128     movaps    m2, [srcq+src2q]
129     movaps    m3, [srcq+src3q]
130     movaps    m4, [srcq+src4q]
131     movaps    m5, [srcq+src5q]
132
133     BUTTERFLYPS 0, 1, 6
134     BUTTERFLYPS 2, 3, 6
135     BUTTERFLYPS 4, 5, 6
136
137     movaps    m6, m4
138     shufps    m4, m0, 0xe4
139     movlhps   m0, m2
140     movhlps   m6, m2
141     movaps [dstq   ], m0
142     movaps [dstq+16], m4
143     movaps [dstq+32], m6
144
145     movaps    m6, m5
146     shufps    m5, m1, 0xe4
147     movlhps   m1, m3
148     movhlps   m6, m3
149     movaps [dstq+48], m1
150     movaps [dstq+64], m5
151     movaps [dstq+80], m6
152 %else ; mmx
153     movq       m0, [srcq]
154     movq       m1, [srcq+src1q]
155     movq       m2, [srcq+src2q]
156     movq       m3, [srcq+src3q]
157     movq       m4, [srcq+src4q]
158     movq       m5, [srcq+src5q]
159
160     SBUTTERFLY dq, 0, 1, 6
161     SBUTTERFLY dq, 2, 3, 6
162     SBUTTERFLY dq, 4, 5, 6
163     movq [dstq   ], m0
164     movq [dstq+ 8], m2
165     movq [dstq+16], m4
166     movq [dstq+24], m1
167     movq [dstq+32], m3
168     movq [dstq+40], m5
169 %endif
170     add      srcq, mmsize
171     add      dstq, mmsize*6
172     sub      lend, mmsize/4
173     jg .loop
174 %ifidn %1, mmx
175     emms
176 %endif
177     REP_RET
178 %endmacro
179
180 INIT_MMX
181 FLOAT_INTERLEAVE6 mmx, 0
182 INIT_XMM
183 FLOAT_INTERLEAVE6 sse, 7
184
185 ;-----------------------------------------------------------------------------
186 ; void ff_float_interleave2(float *dst, const float **src, unsigned int len);
187 ;-----------------------------------------------------------------------------
188
189 %macro FLOAT_INTERLEAVE2 2
190 cglobal float_interleave2_%1, 3,4,%2, dst, src, len, src1
191     mov     src1q, [srcq+gprsize]
192     mov      srcq, [srcq        ]
193     sub     src1q, srcq
194 .loop
195     MOVPS      m0, [srcq             ]
196     MOVPS      m1, [srcq+src1q       ]
197     MOVPS      m3, [srcq      +mmsize]
198     MOVPS      m4, [srcq+src1q+mmsize]
199
200     MOVPS      m2, m0
201     PUNPCKLDQ  m0, m1
202     PUNPCKHDQ  m2, m1
203
204     MOVPS      m1, m3
205     PUNPCKLDQ  m3, m4
206     PUNPCKHDQ  m1, m4
207
208     MOVPS [dstq         ], m0
209     MOVPS [dstq+1*mmsize], m2
210     MOVPS [dstq+2*mmsize], m3
211     MOVPS [dstq+3*mmsize], m1
212
213     add      srcq, mmsize*2
214     add      dstq, mmsize*4
215     sub      lend, mmsize/2
216     jg .loop
217 %ifidn %1, mmx
218     emms
219 %endif
220     REP_RET
221 %endmacro
222
223 INIT_MMX
224 %define MOVPS     movq
225 %define PUNPCKLDQ punpckldq
226 %define PUNPCKHDQ punpckhdq
227 FLOAT_INTERLEAVE2 mmx, 0
228 INIT_XMM
229 %define MOVPS     movaps
230 %define PUNPCKLDQ unpcklps
231 %define PUNPCKHDQ unpckhps
232 FLOAT_INTERLEAVE2 sse, 5