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
13242b1ea8a934ee13899663ad7e1551b658d48e6d6Marco Nelissen__attribute__((no_sanitize("integer")))
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubervoid pvmp3_mdct_18(int32 vec[], int32 *history, const int32 *window)
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 i;
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 tmp;
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 tmp1;
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 tmp2;
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 tmp3;
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 tmp4;
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    const int32 *pt_cos_split = cosTerms_dct18;
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    const int32 *pt_cos       = cosTerms_1_ov_cos_phi;
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    const int32 *pt_cos_x     = &cosTerms_1_ov_cos_phi[17];
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *pt_vec   =  vec;
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 *pt_vec_o = &vec[17];
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    for (i = 9; i != 0; i--)
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp  = *(pt_vec);
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp1 = *(pt_vec_o);
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp  = fxp_mul32_Q32(tmp << 1,  *(pt_cos++));
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp1 = fxp_mul32_Q27(tmp1, *(pt_cos_x--));
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_vec++)   =   tmp + tmp1 ;
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *(pt_vec_o--) = fxp_mul32_Q28((tmp - tmp1), *(pt_cos_split++));
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pvmp3_dct_9(vec);         // Even terms
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    pvmp3_dct_9(&vec[9]);     // Odd  terms
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3     = vec[16];  //
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[16]  = vec[ 8];
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp4     = vec[14];  //
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[14]  = vec[ 7];
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp      = vec[12];
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[12]  = vec[ 6];
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2     = vec[10];  // vec[10]
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[10]  = vec[ 5];
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 8]  = vec[ 4];
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 6]  = vec[ 3];
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 4]  = vec[ 2];
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 2]  = vec[ 1];
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 1]  = vec[ 9] - tmp2; //  vec[9] +  vec[10]
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 3]  = vec[11] - tmp2;
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 5]  = vec[11] - tmp;
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 7]  = vec[13] - tmp;
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 9]  = vec[13] - tmp4;
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[11]  = vec[15] - tmp4;
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[13]  = vec[15] - tmp3;
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[15]  = vec[17] - tmp3;
186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* overlap and add */
189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 = vec[0];
191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3 = vec[9];
192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    for (i = 0; i < 6; i++)
194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp  = history[ i];
196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp4 = vec[i+10];
197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        vec[i+10] = tmp3 + tmp4;
198d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp1 = vec[i+1];
199d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        vec[ i] =  fxp_mac32_Q32(tmp, (vec[i+10]), window[ i]);
200d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp3 = tmp4;
201d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        history[i  ] = -(tmp2 + tmp1);
202d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        tmp2 = tmp1;
203d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
204d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
205d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  = history[ 6];
206d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp4 = vec[16];
207d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[16] = tmp3 + tmp4;
208d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 = vec[7];
209d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 6] =  fxp_mac32_Q32(tmp, vec[16] << 1, window[ i]);
210d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  = history[ 7];
211d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[6] = -(tmp2 + tmp1);
212d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[7] = -(tmp1 + vec[8]);
213d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
214d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1  = history[ 8];
215d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp4    = vec[17] + tmp4;
216d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 7] =  fxp_mac32_Q32(tmp, tmp4 << 1, window[ 7]);
217d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[8] = -(vec[8] + vec[9]);
218d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 8] =  fxp_mac32_Q32(tmp1, vec[17] << 1, window[ 8]);
219d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
220d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  = history[9];
221d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 = history[17];
222d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 = history[16];
223d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[ 9] =  fxp_mac32_Q32(tmp,  vec[17] << 1, window[ 9]);
224d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
225d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[17] =  fxp_mac32_Q32(tmp1, vec[10] << 1, window[17]);
226d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[10] = -vec[ 16];
227d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[16] =  fxp_mac32_Q32(tmp2, vec[11] << 1, window[16]);
228d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 = history[15];
229d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 = history[14];
230d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[11] = -vec[ 15];
231d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[15] =  fxp_mac32_Q32(tmp1, vec[12] << 1, window[15]);
232d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[12] = -vec[ 14];
233d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[14] =  fxp_mac32_Q32(tmp2, vec[13] << 1, window[14]);
234d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
235d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  = history[13];
236d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 = history[12];
237d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 = history[11];
238d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3 = history[10];
239d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[13] =  fxp_mac32_Q32(tmp,  vec[12] << 1, window[13]);
240d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[12] =  fxp_mac32_Q32(tmp1, vec[11] << 1, window[12]);
241d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[11] =  fxp_mac32_Q32(tmp2, vec[10] << 1, window[11]);
242d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    vec[10] =  fxp_mac32_Q32(tmp3,    tmp4 << 1, window[10]);
243d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
244d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
245d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    /* next iteration overlap */
246d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
247d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 = history[ 8];
248d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3 = history[ 7];
249d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 = history[ 1];
250d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  = history[ 0];
251d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 <<= 1;
252d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3 <<= 1;
253d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
254d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 0] = fxp_mul32_Q32(tmp1, window[18]);
255d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[17] = fxp_mul32_Q32(tmp1, window[35]);
256d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 1] = fxp_mul32_Q32(tmp3, window[19]);
257d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[16] = fxp_mul32_Q32(tmp3, window[34]);
258d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
259d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 <<= 1;
260d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  <<= 1;
261d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 7] = fxp_mul32_Q32(tmp2, window[25]);
262d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[10] = fxp_mul32_Q32(tmp2, window[28]);
263d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 8] = fxp_mul32_Q32(tmp,  window[26]);
264d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 9] = fxp_mul32_Q32(tmp,  window[27]);
265d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
266d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 = history[ 6];
267d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3 = history[ 5];
268d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp4 = history[ 4];
269d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 = history[ 3];
270d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  = history[ 2];
271d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
272d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp1 <<= 1;
273d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp3 <<= 1;
274d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp4 <<= 1;
275d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
276d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 2] = fxp_mul32_Q32(tmp1, window[20]);
277d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[15] = fxp_mul32_Q32(tmp1, window[33]);
278d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 3] = fxp_mul32_Q32(tmp3, window[21]);
279d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[14] = fxp_mul32_Q32(tmp3, window[32]);
280d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 4] = fxp_mul32_Q32(tmp4, window[22]);
281d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[13] = fxp_mul32_Q32(tmp4, window[31]);
282d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp2 <<= 1;
283d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tmp  <<= 1;
284d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 5] = fxp_mul32_Q32(tmp2, window[23]);
285d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[12] = fxp_mul32_Q32(tmp2, window[30]);
286d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[ 6] = fxp_mul32_Q32(tmp,  window[24]);
287d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    history[11] = fxp_mul32_Q32(tmp,  window[29]);
288d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
289d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
290d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#endif // If not assembly
291