avfilter/x86/vf_blend : reorganize DIFFERENCE macro to reduce line duplication betwee...
[ffmpeg.git] / libavfilter / x86 / avf_showcqt.asm
1 ;*****************************************************************************
2 ;* x86-optimized functions for showcqt filter
3 ;*
4 ;* Copyright (C) 2016 Muhammad Faiz <mfcc64@gmail.com>
5 ;*
6 ;* This file is part of FFmpeg.
7 ;*
8 ;* FFmpeg is free software; you can redistribute it and/or
9 ;* modify it under the terms of the GNU Lesser General Public
10 ;* License as published by the Free Software Foundation; either
11 ;* version 2.1 of the License, or (at your option) any later version.
12 ;*
13 ;* FFmpeg is distributed in the hope that it will be useful,
14 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 ;* Lesser General Public License for more details.
17 ;*
18 ;* You should have received a copy of the GNU Lesser General Public
19 ;* License along with FFmpeg; if not, write to the Free Software
20 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 ;******************************************************************************
22
23 %include "libavutil/x86/x86util.asm"
24
25 %if ARCH_X86_64
26 %define pointer resq
27 %else
28 %define pointer resd
29 %endif
30
31 struc Coeffs
32     .val:   pointer 1
33     .start: resd 1
34     .len:   resd 1
35     .sizeof:
36 endstruc
37
38 %macro CQT_CALC 9
39 ; %1 = a_re, %2 = a_im, %3 = b_re, %4 = b_im
40 ; %5 = m_re, %6 = m_im, %7 = tmp, %8 = coeffval, %9 = coeffsq_offset
41     mov     id, xd
42     add     id, [coeffsq + Coeffs.start + %9]
43     movaps  m%5, [srcq + 8 * iq]
44     movaps  m%7, [srcq + 8 * iq + mmsize]
45     shufps  m%6, m%5, m%7, q3131
46     shufps  m%5, m%5, m%7, q2020
47     sub     id, fft_lend
48     FMULADD_PS m%2, m%6, m%8, m%2, m%6
49     neg     id
50     FMULADD_PS m%1, m%5, m%8, m%1, m%5
51     movups  m%5, [srcq + 8 * iq - mmsize + 8]
52     movups  m%7, [srcq + 8 * iq - 2*mmsize + 8]
53     %if mmsize == 32
54     vperm2f128 m%5, m%5, m%5, 1
55     vperm2f128 m%7, m%7, m%7, 1
56     %endif
57     shufps  m%6, m%5, m%7, q1313
58     shufps  m%5, m%5, m%7, q0202
59     FMULADD_PS m%4, m%6, m%8, m%4, m%6
60     FMULADD_PS m%3, m%5, m%8, m%3, m%5
61 %endmacro ; CQT_CALC
62
63 %macro CQT_SEPARATE 6 ; a_re, a_im, b_re, b_im, tmp, tmp2
64     addps   m%5, m%4, m%2
65     subps   m%6, m%3, m%1
66     addps   m%1, m%1, m%3
67     subps   m%2, m%2, m%4
68     HADDPS  m%5, m%6, m%3
69     HADDPS  m%1, m%2, m%3
70     HADDPS  m%1, m%5, m%2
71     %if mmsize == 32
72     vextractf128 xmm%2, m%1, 1
73     addps   xmm%1, xmm%2
74     %endif
75 %endmacro ; CQT_SEPARATE
76
77 %macro DECLARE_CQT_CALC 0
78 ; ff_showcqt_cqt_calc_*(dst, src, coeffs, len, fft_len)
79 %if ARCH_X86_64
80 cglobal showcqt_cqt_calc, 5, 10, 12, dst, src, coeffs, len, fft_len, x, coeffs_val, coeffs_val2, i, coeffs_len
81     align   16
82     .loop_k:
83         mov     xd, [coeffsq + Coeffs.len]
84         xorps   m0, m0, m0
85         movaps  m1, m0
86         movaps  m2, m0
87         mov     coeffs_lend, [coeffsq + Coeffs.len + Coeffs.sizeof]
88         movaps  m3, m0
89         movaps  m8, m0
90         cmp     coeffs_lend, xd
91         movaps  m9, m0
92         movaps  m10, m0
93         movaps  m11, m0
94         cmova   coeffs_lend, xd
95         xor     xd, xd
96         test    coeffs_lend, coeffs_lend
97         jz      .check_loop_b
98         mov     coeffs_valq, [coeffsq + Coeffs.val]
99         mov     coeffs_val2q, [coeffsq + Coeffs.val + Coeffs.sizeof]
100         align   16
101         .loop_ab:
102             movaps  m7, [coeffs_valq + 4 * xq]
103             CQT_CALC 0, 1, 2, 3, 4, 5, 6, 7, 0
104             movaps  m7, [coeffs_val2q + 4 * xq]
105             CQT_CALC 8, 9, 10, 11, 4, 5, 6, 7, Coeffs.sizeof
106             add     xd, mmsize/4
107             cmp     xd, coeffs_lend
108             jb      .loop_ab
109         .check_loop_b:
110         cmp     xd, [coeffsq + Coeffs.len + Coeffs.sizeof]
111         jae     .check_loop_a
112         align   16
113         .loop_b:
114             movaps  m7, [coeffs_val2q + 4 * xq]
115             CQT_CALC 8, 9, 10, 11, 4, 5, 6, 7, Coeffs.sizeof
116             add     xd, mmsize/4
117             cmp     xd, [coeffsq + Coeffs.len + Coeffs.sizeof]
118             jb      .loop_b
119         .loop_end:
120         CQT_SEPARATE 0, 1, 2, 3, 4, 5
121         CQT_SEPARATE 8, 9, 10, 11, 4, 5
122         mulps   xmm0, xmm0
123         mulps   xmm8, xmm8
124         HADDPS  xmm0, xmm8, xmm1
125         movaps  [dstq], xmm0
126         sub     lend, 2
127         lea     dstq, [dstq + 16]
128         lea     coeffsq, [coeffsq + 2*Coeffs.sizeof]
129         jnz     .loop_k
130         REP_RET
131         align   16
132         .check_loop_a:
133         cmp     xd, [coeffsq + Coeffs.len]
134         jae     .loop_end
135         align   16
136         .loop_a:
137             movaps  m7, [coeffs_valq + 4 * xq]
138             CQT_CALC 0, 1, 2, 3, 4, 5, 6, 7, 0
139             add     xd, mmsize/4
140             cmp     xd, [coeffsq + Coeffs.len]
141             jb      .loop_a
142         jmp     .loop_end
143 %else
144 cglobal showcqt_cqt_calc, 4, 7, 8, dst, src, coeffs, len, x, coeffs_val, i
145 %define fft_lend r4m
146     align   16
147     .loop_k:
148         mov     xd, [coeffsq + Coeffs.len]
149         xorps   m0, m0, m0
150         movaps  m1, m0
151         movaps  m2, m0
152         movaps  m3, m0
153         test    xd, xd
154         jz      .store
155         mov     coeffs_valq, [coeffsq + Coeffs.val]
156         xor     xd, xd
157         align   16
158         .loop_x:
159             movaps  m7, [coeffs_valq + 4 * xq]
160             CQT_CALC 0, 1, 2, 3, 4, 5, 6, 7, 0
161             add     xd, mmsize/4
162             cmp     xd, [coeffsq + Coeffs.len]
163             jb      .loop_x
164         CQT_SEPARATE 0, 1, 2, 3, 4, 5
165         mulps   xmm0, xmm0
166         HADDPS  xmm0, xmm0, xmm1
167         .store:
168         movlps  [dstq], xmm0
169         sub     lend, 1
170         lea     dstq, [dstq + 8]
171         lea     coeffsq, [coeffsq + Coeffs.sizeof]
172         jnz     .loop_k
173         REP_RET
174 %endif ; ARCH_X86_64
175 %endmacro ; DECLARE_CQT_CALC
176
177 INIT_XMM sse
178 DECLARE_CQT_CALC
179 INIT_XMM sse3
180 DECLARE_CQT_CALC
181 %if HAVE_AVX_EXTERNAL
182 INIT_YMM avx
183 DECLARE_CQT_CALC
184 %endif
185 %if HAVE_FMA3_EXTERNAL
186 INIT_YMM fma3
187 DECLARE_CQT_CALC
188 %endif
189 %if HAVE_FMA4_EXTERNAL
190 INIT_XMM fma4
191 DECLARE_CQT_CALC
192 %endif