1da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com/*
2da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *
4da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *  Use of this source code is governed by a BSD-style license
5da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *  that can be found in the LICENSE file in the root of the source
6da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *  tree. An additional intellectual property rights grant can be found
7da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *  in the file PATENTS.  All contributing project authors may
8da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *  be found in the AUTHORS file in the root of the source tree.
9da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com *
10da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com */
11da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com#include "dl/api/omxtypes.h"
12da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com#include <stdbool.h>
13da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
14da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Fwd_Radix4_fs(
15da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
16da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
17da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n);
18da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
19da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Inv_Radix4_fs(
20da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
21da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
22da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n);
23da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
24da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Fwd_Radix4_fs_sse(
25da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
26da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
27da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n);
28da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
29da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Inv_Radix4_fs_sse(
30da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
31da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
32da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n);
33da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
34da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Fwd_Radix4_ms(
35da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
36da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
37da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
38da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n,
39da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT sub_size,
40da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT sub_num);
41da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
42da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Inv_Radix4_ms(
43da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
44da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
45da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
46da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n,
47da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT sub_size,
48da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT sub_num);
49da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
50da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Fwd_Radix4_ms_sse(
51da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
52da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
53da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
54da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n,
55da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT sub_size,
56da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT sub_num);
57da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
58da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Inv_Radix4_ms_sse(
59da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
60da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
61da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
62da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n,
63da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT sub_size,
64da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT sub_num);
65da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
66da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Fwd_Radix4_ls(
67da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
68da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
69da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
70da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n);
71da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
72da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Inv_Radix4_ls(
73da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
74da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
75da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
76da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n);
77da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
78da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Fwd_Radix4_ls_sse(
79da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
80da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
81da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
82da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n);
83da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
84da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comextern void x86SP_FFT_CToC_FC32_Inv_Radix4_ls_sse(
85da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *in,
86da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *out,
87da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
88da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n);
89da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
9056df947c78b5c65a7d3bc558287602c83ccc793artoy@google.comextern void x86SP_FFT_CToC_FC32_Fwd_Radix2_ls(
9156df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    const OMX_F32 *in,
9256df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    OMX_F32 *out,
9356df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    const OMX_F32 *twiddle,
9456df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    OMX_INT n);
9556df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com
9656df947c78b5c65a7d3bc558287602c83ccc793artoy@google.comextern void x86SP_FFT_CToC_FC32_Inv_Radix2_ls(
9756df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    const OMX_F32 *in,
9856df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    OMX_F32 *out,
9956df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    const OMX_F32 *twiddle,
10056df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    OMX_INT n);
10156df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com
10256df947c78b5c65a7d3bc558287602c83ccc793artoy@google.comextern void x86SP_FFT_CToC_FC32_Fwd_Radix2_ls_sse(
10356df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    const OMX_F32 *in,
10456df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    OMX_F32 *out,
10556df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    const OMX_F32 *twiddle,
10656df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    OMX_INT n);
10756df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com
10856df947c78b5c65a7d3bc558287602c83ccc793artoy@google.comextern void x86SP_FFT_CToC_FC32_Inv_Radix2_ls_sse(
10956df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    const OMX_F32 *in,
11056df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    OMX_F32 *out,
11156df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    const OMX_F32 *twiddle,
11256df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com    OMX_INT n);
11356df947c78b5c65a7d3bc558287602c83ccc793artoy@google.com
114da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comOMX_F32* x86SP_F32_radix4_kernel_OutOfPlace(
115da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *src,
116da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *buf1,
117da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *buf2,
118da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
119da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n,
120da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    bool forward_fft) {
121da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  OMX_INT sub_size;
122da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  OMX_INT sub_num;
123da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  OMX_INT n_by_4 = n >> 2;
124da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  OMX_F32 *in = buf1;
125da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  OMX_F32 *out = buf2;
126da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
127da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  if (forward_fft)
128da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    x86SP_FFT_CToC_FC32_Fwd_Radix4_fs(src, in, n);
129da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  else
130da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    x86SP_FFT_CToC_FC32_Inv_Radix4_fs(src, in, n);
131da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
132da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  for (sub_size = 4, sub_num = n_by_4;
133da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com       sub_size < n_by_4;
134da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com       sub_size = sub_size << 2, sub_num = sub_num >> 2) {
135da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
136da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    if (forward_fft) {
137da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com      x86SP_FFT_CToC_FC32_Fwd_Radix4_ms(in, out, twiddle,
138da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com                                        n, sub_size, sub_num);
139da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    } else {
140da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com      x86SP_FFT_CToC_FC32_Inv_Radix4_ms(in, out, twiddle,
141da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com                                        n, sub_size, sub_num);
142da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    }
143da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
144da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *temp = out;
145da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    out = in;
146da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    in = temp;
147da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  }
148da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
149da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  if (forward_fft) {
150da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    if (sub_num == 2)
151da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com      x86SP_FFT_CToC_FC32_Fwd_Radix2_ls(in, out, twiddle, n);
152da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    else
153da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com      x86SP_FFT_CToC_FC32_Fwd_Radix4_ls(in, out, twiddle, n);
154da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  } else {
155da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    if (sub_num == 2)
156da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com      x86SP_FFT_CToC_FC32_Inv_Radix2_ls(in, out, twiddle, n);
157da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    else
158da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com      x86SP_FFT_CToC_FC32_Inv_Radix4_ls(in, out, twiddle, n);
159da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  }
160da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
161da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  return out;
162da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com}
163da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
164da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.comOMX_F32* x86SP_F32_radix4_kernel_OutOfPlace_sse(
165da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *src,
166da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *buf1,
167da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *buf2,
168da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    const OMX_F32 *twiddle,
169da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_INT n,
170da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    // true for forward, false for inverse.
171da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    bool forward_fft) {
172da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  OMX_INT sub_size, sub_num;
173da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  OMX_INT n_by_4 = n >> 2;
174da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  OMX_F32 *in, *out;
175da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  in = buf1;
176da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  out = buf2;
177da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
178da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  if (forward_fft)
179da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    x86SP_FFT_CToC_FC32_Fwd_Radix4_fs_sse(src, in, n);
180da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  else
181da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    x86SP_FFT_CToC_FC32_Inv_Radix4_fs_sse(src, in, n);
182da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
183da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  for (sub_size = 4, sub_num = n_by_4;
184da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com       sub_size < n_by_4;
185da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com       sub_size = sub_size << 2, sub_num = sub_num >> 2) {
186da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
187da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    if (forward_fft) {
188da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com      x86SP_FFT_CToC_FC32_Fwd_Radix4_ms_sse(in, out, twiddle,
189da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com                                            n, sub_size, sub_num);
190da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    } else {
191da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com      x86SP_FFT_CToC_FC32_Inv_Radix4_ms_sse(in, out, twiddle,
192da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com                                            n, sub_size, sub_num);
193da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    }
194da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
195da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    OMX_F32 *temp = out;
196da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    out = in;
197da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    in = temp;
198da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  }
199da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
200da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  // If n is not power of 4, sub_num == 2.
201da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  if (forward_fft) {
202da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    if (sub_num == 2)
203da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com      x86SP_FFT_CToC_FC32_Fwd_Radix2_ls_sse(in, out, twiddle, n);
204da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    else
205da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com      x86SP_FFT_CToC_FC32_Fwd_Radix4_ls_sse(in, out, twiddle, n);
206da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  } else {
207da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    if (sub_num == 2)
208da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com      x86SP_FFT_CToC_FC32_Inv_Radix2_ls_sse(in, out, twiddle, n);
209da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com    else
210da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com      x86SP_FFT_CToC_FC32_Inv_Radix4_ls_sse(in, out, twiddle, n);
211da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  }
212da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com
213da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com  return out;
214da04d4f8ef493ab7bf1fbdaffe206899f03681c2rtoy@google.com}
215