1250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/* ------------------------------------------------------------------
2250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Copyright (C) 1998-2009 PacketVideo
3250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *
4250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * you may not use this file except in compliance with the License.
6250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * You may obtain a copy of the License at
7250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *
8250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber *
10250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * Unless required by applicable law or agreed to in writing, software
11250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * express or implied.
14250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * See the License for the specific language governing permissions
15250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * and limitations under the License.
16250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber * -------------------------------------------------------------------
17250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber */
18250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*
19250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
20250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
21250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   PacketVideo Corp.
22250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   MP3 Decoder Library
23250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
24250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber   Filename: mdct_18.cpp
25250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
26250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber     Date: 09/21/2007
27250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
28250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
29250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REVISION HISTORY
30250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
31250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
32250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber Description:
33250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
34250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
35250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber INPUT AND OUTPUT DEFINITIONS
36250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
37250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas HuberInput
38250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 vec[],        input vector of length 18
39250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 *history      input for overlap and add, vector updated with
40250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        next overlap and add values
41250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    const int32 *window sine window used in the mdct, three types are allowed
42250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber                        noraml, start and stop
43250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas HuberReturns
44250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    none                mdct computation in-place
45250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
46250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
47250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
48250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber FUNCTION DESCRIPTION
49250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
50250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Returns the mdct of length 18 of the input vector, as well as the overlap
51250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vector for next iteration ( on history[])
52250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
53250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
54250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REQUIREMENTS
55250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
56250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
57250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
58250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber REFERENCES
59250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
60250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
61250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber PSEUDO-CODE
62250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
63250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber------------------------------------------------------------------------------
64250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber*/
65250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
66250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#if ( !defined(PV_ARM_GCC_V5) && !defined(PV_ARM_GCC_V4) && !defined(PV_ARM_V5) && !defined(PV_ARM_V4) )
67250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
68250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; INCLUDES
69250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
70250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
71250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pv_mp3dec_fxd_op.h"
72250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#include "pvmp3_mdct_18.h"
73250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
74250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
75250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
76250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; MACROS
77250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Define module specific macros here
78250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
79250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
80250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
81250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
82250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; DEFINES
83250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Include all pre-processor statements here. Include conditional
84250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; compile variables also.
85250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
86250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
87250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
88250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; LOCAL FUNCTION DEFINITIONS
89250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Function Prototype declaration
90250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
91250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
92250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
93250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
94250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Variable declaration - defined here and used outside this module
95250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
96250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huberconst int32 cosTerms_dct18[9] =
97250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
98250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Qfmt(0.50190991877167f),   Qfmt(0.51763809020504f),   Qfmt(0.55168895948125f),
99250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Qfmt(0.61038729438073f),   Qfmt(0.70710678118655f),   Qfmt(0.87172339781055f),
100250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Qfmt(1.18310079157625f),   Qfmt(1.93185165257814f),   Qfmt(5.73685662283493f)
101250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber};
102250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
103250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
104250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huberconst int32 cosTerms_1_ov_cos_phi[18] =
105250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
106250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
107250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Qfmt1(0.50047634258166f),  Qfmt1(0.50431448029008f),  Qfmt1(0.51213975715725f),
108250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Qfmt1(0.52426456257041f),  Qfmt1(0.54119610014620f),  Qfmt1(0.56369097343317f),
109250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Qfmt1(0.59284452371708f),  Qfmt1(0.63023620700513f),  Qfmt1(0.67817085245463f),
110250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
111250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Qfmt2(0.74009361646113f),  Qfmt2(0.82133981585229f),  Qfmt2(0.93057949835179f),
112250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Qfmt2(1.08284028510010f),  Qfmt2(1.30656296487638f),  Qfmt2(1.66275476171152f),
113250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    Qfmt2(2.31011315767265f),  Qfmt2(3.83064878777019f),  Qfmt2(11.46279281302667f)
114250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber};
115250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
116250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
117250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; EXTERNAL FUNCTION REFERENCES
118250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Declare functions defined elsewhere and referenced in this module
119250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
120250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
121250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
122250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
123250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; Declare variables used in this module but defined elsewhere
124250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
125250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
126250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber/*----------------------------------------------------------------------------
127250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber; FUNCTION CODE
128250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber----------------------------------------------------------------------------*/
129250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
130250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
131250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
132250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Hubervoid pvmp3_mdct_18(int32 vec[], int32 *history, const int32 *window)
133250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber{
134250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 i;
135250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 tmp;
136250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 tmp1;
137250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 tmp2;
138250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 tmp3;
139250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 tmp4;
140250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
141250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
142250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
143250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    const int32 *pt_cos_split = cosTerms_dct18;
144250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    const int32 *pt_cos       = cosTerms_1_ov_cos_phi;
145250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    const int32 *pt_cos_x     = &cosTerms_1_ov_cos_phi[17];
146250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 *pt_vec   =  vec;
147250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    int32 *pt_vec_o = &vec[17];
148250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
149250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
150250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    for (i = 9; i != 0; i--)
151250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
152250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        tmp  = *(pt_vec);
153250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        tmp1 = *(pt_vec_o);
154250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        tmp  = fxp_mul32_Q32(tmp << 1,  *(pt_cos++));
155250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        tmp1 = fxp_mul32_Q27(tmp1, *(pt_cos_x--));
156250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        *(pt_vec++)   =   tmp + tmp1 ;
157250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        *(pt_vec_o--) = fxp_mul32_Q28((tmp - tmp1), *(pt_cos_split++));
158250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
159250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
160250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
161250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    pvmp3_dct_9(vec);         // Even terms
162250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    pvmp3_dct_9(&vec[9]);     // Odd  terms
163250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
164250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
165250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp3     = vec[16];  //
166250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[16]  = vec[ 8];
167250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp4     = vec[14];  //
168250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[14]  = vec[ 7];
169250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp      = vec[12];
170250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[12]  = vec[ 6];
171250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp2     = vec[10];  // vec[10]
172250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[10]  = vec[ 5];
173250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[ 8]  = vec[ 4];
174250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[ 6]  = vec[ 3];
175250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[ 4]  = vec[ 2];
176250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[ 2]  = vec[ 1];
177250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[ 1]  = vec[ 9] - tmp2; //  vec[9] +  vec[10]
178250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[ 3]  = vec[11] - tmp2;
179250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[ 5]  = vec[11] - tmp;
180250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[ 7]  = vec[13] - tmp;
181250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[ 9]  = vec[13] - tmp4;
182250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[11]  = vec[15] - tmp4;
183250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[13]  = vec[15] - tmp3;
184250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[15]  = vec[17] - tmp3;
185250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
186250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
187250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* overlap and add */
188250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
189250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp2 = vec[0];
190250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp3 = vec[9];
191250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
192250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    for (i = 0; i < 6; i++)
193250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    {
194250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        tmp  = history[ i];
195250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        tmp4 = vec[i+10];
196250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        vec[i+10] = tmp3 + tmp4;
197250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        tmp1 = vec[i+1];
198250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        vec[ i] =  fxp_mac32_Q32(tmp, (vec[i+10]), window[ i]);
199250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        tmp3 = tmp4;
200250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        history[i  ] = -(tmp2 + tmp1);
201250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber        tmp2 = tmp1;
202250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    }
203250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
204250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp  = history[ 6];
205250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp4 = vec[16];
206250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[16] = tmp3 + tmp4;
207250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp1 = vec[7];
208250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[ 6] =  fxp_mac32_Q32(tmp, vec[16] << 1, window[ i]);
209250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp  = history[ 7];
210250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[6] = -(tmp2 + tmp1);
211250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[7] = -(tmp1 + vec[8]);
212250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
213250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp1  = history[ 8];
214250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp4    = vec[17] + tmp4;
215250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[ 7] =  fxp_mac32_Q32(tmp, tmp4 << 1, window[ 7]);
216250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[8] = -(vec[8] + vec[9]);
217250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[ 8] =  fxp_mac32_Q32(tmp1, vec[17] << 1, window[ 8]);
218250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
219250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp  = history[9];
220250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp1 = history[17];
221250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp2 = history[16];
222250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[ 9] =  fxp_mac32_Q32(tmp,  vec[17] << 1, window[ 9]);
223250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
224250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[17] =  fxp_mac32_Q32(tmp1, vec[10] << 1, window[17]);
225250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[10] = -vec[ 16];
226250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[16] =  fxp_mac32_Q32(tmp2, vec[11] << 1, window[16]);
227250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp1 = history[15];
228250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp2 = history[14];
229250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[11] = -vec[ 15];
230250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[15] =  fxp_mac32_Q32(tmp1, vec[12] << 1, window[15]);
231250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[12] = -vec[ 14];
232250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[14] =  fxp_mac32_Q32(tmp2, vec[13] << 1, window[14]);
233250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
234250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp  = history[13];
235250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp1 = history[12];
236250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp2 = history[11];
237250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp3 = history[10];
238250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[13] =  fxp_mac32_Q32(tmp,  vec[12] << 1, window[13]);
239250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[12] =  fxp_mac32_Q32(tmp1, vec[11] << 1, window[12]);
240250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[11] =  fxp_mac32_Q32(tmp2, vec[10] << 1, window[11]);
241250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    vec[10] =  fxp_mac32_Q32(tmp3,    tmp4 << 1, window[10]);
242250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
243250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
244250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    /* next iteration overlap */
245250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
246250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp1 = history[ 8];
247250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp3 = history[ 7];
248250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp2 = history[ 1];
249250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp  = history[ 0];
250250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp1 <<= 1;
251250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp3 <<= 1;
252250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
253250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[ 0] = fxp_mul32_Q32(tmp1, window[18]);
254250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[17] = fxp_mul32_Q32(tmp1, window[35]);
255250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[ 1] = fxp_mul32_Q32(tmp3, window[19]);
256250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[16] = fxp_mul32_Q32(tmp3, window[34]);
257250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
258250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp2 <<= 1;
259250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp  <<= 1;
260250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[ 7] = fxp_mul32_Q32(tmp2, window[25]);
261250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[10] = fxp_mul32_Q32(tmp2, window[28]);
262250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[ 8] = fxp_mul32_Q32(tmp,  window[26]);
263250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[ 9] = fxp_mul32_Q32(tmp,  window[27]);
264250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
265250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp1 = history[ 6];
266250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp3 = history[ 5];
267250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp4 = history[ 4];
268250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp2 = history[ 3];
269250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp  = history[ 2];
270250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
271250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp1 <<= 1;
272250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp3 <<= 1;
273250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp4 <<= 1;
274250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
275250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[ 2] = fxp_mul32_Q32(tmp1, window[20]);
276250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[15] = fxp_mul32_Q32(tmp1, window[33]);
277250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[ 3] = fxp_mul32_Q32(tmp3, window[21]);
278250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[14] = fxp_mul32_Q32(tmp3, window[32]);
279250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[ 4] = fxp_mul32_Q32(tmp4, window[22]);
280250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[13] = fxp_mul32_Q32(tmp4, window[31]);
281250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp2 <<= 1;
282250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    tmp  <<= 1;
283250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[ 5] = fxp_mul32_Q32(tmp2, window[23]);
284250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[12] = fxp_mul32_Q32(tmp2, window[30]);
285250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[ 6] = fxp_mul32_Q32(tmp,  window[24]);
286250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber    history[11] = fxp_mul32_Q32(tmp,  window[29]);
287250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber}
288250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber
289250f2433c6e1cf2727a79971fdc6ce0f8677037aAndreas Huber#endif // If not assembly
290