1d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/* ------------------------------------------------------------------
2d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Copyright (C) 1998-2009 PacketVideo
3d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
4d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * you may not use this file except in compliance with the License.
6d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * You may obtain a copy of the License at
7d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
8d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
10d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Unless required by applicable law or agreed to in writing, software
11d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * express or implied.
14d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * See the License for the specific language governing permissions
15d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * and limitations under the License.
16d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * -------------------------------------------------------------------
17d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */
18d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*
19d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
20d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
21d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   PacketVideo Corp.
22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   MP3 Decoder Library
23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Filename: mdct_18.cpp
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     Date: 09/21/2007
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description:
33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberInput
38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 vec[],        input vector of length 18
39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *history      input for overlap and add, vector updated with
40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        next overlap and add values
41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    const int32 *window sine window used in the mdct, three types are allowed
42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                        noraml, start and stop
43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberReturns
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    none                mdct computation in-place
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Returns the mdct of length 18 of the input vector, as well as the overlap
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vector for next iteration ( on history[])
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#if ( !defined(PV_ARM_GCC_V5) && !defined(PV_ARM_GCC_V4) && !defined(PV_ARM_V5) && !defined(PV_ARM_V4) )
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pv_mp3dec_fxd_op.h"
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_mdct_18.h"
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module specific macros here
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also.
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst int32 cosTerms_dct18[9] =
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt(0.50190991877167f),   Qfmt(0.51763809020504f),   Qfmt(0.55168895948125f),
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt(0.61038729438073f),   Qfmt(0.70710678118655f),   Qfmt(0.87172339781055f),
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt(1.18310079157625f),   Qfmt(1.93185165257814f),   Qfmt(5.73685662283493f)
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber};
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberconst int32 cosTerms_1_ov_cos_phi[18] =
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt1(0.50047634258166f),  Qfmt1(0.50431448029008f),  Qfmt1(0.51213975715725f),
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt1(0.52426456257041f),  Qfmt1(0.54119610014620f),  Qfmt1(0.56369097343317f),
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt1(0.59284452371708f),  Qfmt1(0.63023620700513f),  Qfmt1(0.67817085245463f),
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt2(0.74009361646113f),  Qfmt2(0.82133981585229f),  Qfmt2(0.93057949835179f),
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt2(1.08284028510010f),  Qfmt2(1.30656296487638f),  Qfmt2(1.66275476171152f),
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    Qfmt2(2.31011315767265f),  Qfmt2(3.83064878777019f),  Qfmt2(11.46279281302667f)
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber};
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module but defined elsewhere
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubervoid pvmp3_mdct_18(int32 vec[], int32 *history, const int32 *window)
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 i;
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 tmp;
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 tmp1;
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 tmp2;
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 tmp3;
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 tmp4;
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    const int32 *pt_cos_split = cosTerms_dct18;
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    const int32 *pt_cos       = cosTerms_1_ov_cos_phi;
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    const int32 *pt_cos_x     = &cosTerms_1_ov_cos_phi[17];
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *pt_vec   =  vec;
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *pt_vec_o = &vec[17];
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    for (i = 9; i != 0; i--)
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp  = *(pt_vec);
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp1 = *(pt_vec_o);
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp  = fxp_mul32_Q32(tmp << 1,  *(pt_cos++));
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp1 = fxp_mul32_Q27(tmp1, *(pt_cos_x--));
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_vec++)   =   tmp + tmp1 ;
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_vec_o--) = fxp_mul32_Q28((tmp - tmp1), *(pt_cos_split++));
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pvmp3_dct_9(vec);         // Even terms
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pvmp3_dct_9(&vec[9]);     // Odd  terms
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3     = vec[16];  //
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[16]  = vec[ 8];
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp4     = vec[14];  //
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[14]  = vec[ 7];
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp      = vec[12];
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[12]  = vec[ 6];
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2     = vec[10];  // vec[10]
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[10]  = vec[ 5];
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 8]  = vec[ 4];
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 6]  = vec[ 3];
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 4]  = vec[ 2];
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 2]  = vec[ 1];
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 1]  = vec[ 9] - tmp2; //  vec[9] +  vec[10]
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 3]  = vec[11] - tmp2;
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 5]  = vec[11] - tmp;
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 7]  = vec[13] - tmp;
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 9]  = vec[13] - tmp4;
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[11]  = vec[15] - tmp4;
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[13]  = vec[15] - tmp3;
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[15]  = vec[17] - tmp3;
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* overlap and add */
188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 = vec[0];
190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3 = vec[9];
191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    for (i = 0; i < 6; i++)
193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp  = history[ i];
195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp4 = vec[i+10];
196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        vec[i+10] = tmp3 + tmp4;
197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp1 = vec[i+1];
198d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        vec[ i] =  fxp_mac32_Q32(tmp, (vec[i+10]), window[ i]);
199d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp3 = tmp4;
200d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        history[i  ] = -(tmp2 + tmp1);
201d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp2 = tmp1;
202d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
203d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
204d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  = history[ 6];
205d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp4 = vec[16];
206d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[16] = tmp3 + tmp4;
207d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 = vec[7];
208d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 6] =  fxp_mac32_Q32(tmp, vec[16] << 1, window[ i]);
209d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  = history[ 7];
210d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[6] = -(tmp2 + tmp1);
211d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[7] = -(tmp1 + vec[8]);
212d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
213d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1  = history[ 8];
214d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp4    = vec[17] + tmp4;
215d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 7] =  fxp_mac32_Q32(tmp, tmp4 << 1, window[ 7]);
216d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[8] = -(vec[8] + vec[9]);
217d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 8] =  fxp_mac32_Q32(tmp1, vec[17] << 1, window[ 8]);
218d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
219d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  = history[9];
220d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 = history[17];
221d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 = history[16];
222d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 9] =  fxp_mac32_Q32(tmp,  vec[17] << 1, window[ 9]);
223d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
224d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[17] =  fxp_mac32_Q32(tmp1, vec[10] << 1, window[17]);
225d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[10] = -vec[ 16];
226d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[16] =  fxp_mac32_Q32(tmp2, vec[11] << 1, window[16]);
227d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 = history[15];
228d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 = history[14];
229d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[11] = -vec[ 15];
230d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[15] =  fxp_mac32_Q32(tmp1, vec[12] << 1, window[15]);
231d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[12] = -vec[ 14];
232d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[14] =  fxp_mac32_Q32(tmp2, vec[13] << 1, window[14]);
233d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
234d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  = history[13];
235d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 = history[12];
236d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 = history[11];
237d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3 = history[10];
238d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[13] =  fxp_mac32_Q32(tmp,  vec[12] << 1, window[13]);
239d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[12] =  fxp_mac32_Q32(tmp1, vec[11] << 1, window[12]);
240d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[11] =  fxp_mac32_Q32(tmp2, vec[10] << 1, window[11]);
241d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[10] =  fxp_mac32_Q32(tmp3,    tmp4 << 1, window[10]);
242d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
243d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
244d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* next iteration overlap */
245d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
246d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 = history[ 8];
247d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3 = history[ 7];
248d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 = history[ 1];
249d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  = history[ 0];
250d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 <<= 1;
251d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3 <<= 1;
252d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
253d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 0] = fxp_mul32_Q32(tmp1, window[18]);
254d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[17] = fxp_mul32_Q32(tmp1, window[35]);
255d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 1] = fxp_mul32_Q32(tmp3, window[19]);
256d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[16] = fxp_mul32_Q32(tmp3, window[34]);
257d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
258d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 <<= 1;
259d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  <<= 1;
260d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 7] = fxp_mul32_Q32(tmp2, window[25]);
261d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[10] = fxp_mul32_Q32(tmp2, window[28]);
262d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 8] = fxp_mul32_Q32(tmp,  window[26]);
263d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 9] = fxp_mul32_Q32(tmp,  window[27]);
264d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
265d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 = history[ 6];
266d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3 = history[ 5];
267d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp4 = history[ 4];
268d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 = history[ 3];
269d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  = history[ 2];
270d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
271d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 <<= 1;
272d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3 <<= 1;
273d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp4 <<= 1;
274d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
275d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 2] = fxp_mul32_Q32(tmp1, window[20]);
276d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[15] = fxp_mul32_Q32(tmp1, window[33]);
277d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 3] = fxp_mul32_Q32(tmp3, window[21]);
278d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[14] = fxp_mul32_Q32(tmp3, window[32]);
279d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 4] = fxp_mul32_Q32(tmp4, window[22]);
280d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[13] = fxp_mul32_Q32(tmp4, window[31]);
281d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 <<= 1;
282d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  <<= 1;
283d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 5] = fxp_mul32_Q32(tmp2, window[23]);
284d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[12] = fxp_mul32_Q32(tmp2, window[30]);
285d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 6] = fxp_mul32_Q32(tmp,  window[24]);
286d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[11] = fxp_mul32_Q32(tmp,  window[29]);
287d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
288d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
289d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#endif // If not assembly
290