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   PacketVideo Corp.
21d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   MP3 Decoder Library
22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Pathname: ./cpp/include/pv_mp3dec_fxd_op_arm.h
24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     Date: 08/20/2007
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description:
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INCLUDE DESCRIPTION
33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber This file select the associated fixed point functions with the OS/ARCH.
35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#ifndef PV_MP3DEC_FXD_OP_ARM
41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define PV_MP3DEC_FXD_OP_ARM
42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#ifdef __cplusplus
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberextern "C"
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#endif
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_audio_type_defs.h"
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#if (defined(PV_ARM_V5)||defined(PV_ARM_V4))
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    __inline  Int32 fxp_mul32_Q30(const Int32 L_var1, const Int32 L_var2)
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        Int32 result64_hi;
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        Int32 result64_lo;
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        __asm
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            smull result64_lo, result64_hi, L_var2, L_var1
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            mov   result64_lo, result64_lo, lsr #30
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            add   result64_hi, result64_lo, result64_hi, asl  #2
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    __inline  Int32 fxp_mac32_Q30(const Int32 L_var1, const Int32 L_var2, Int32 L_add)
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        Int32 result64_hi;
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        Int32 result64_lo;
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        __asm
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            smull result64_lo, result64_hi, L_var2, L_var1
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            add L_add, L_add, result64_hi, asl  #2
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            add L_add, L_add, result64_lo, lsr  #30
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (L_add);
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#define Qfmt_31(a)   (Int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    __inline  Int32 fxp_mul32_Q32(Int32 L_var1, const Int32 L_var2)
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        Int32 result64_hi;
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        __asm
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            smull L_var1, result64_hi, L_var2, L_var1
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    __inline  Int32 fxp_mul32_Q28(const Int32 L_var1, const Int32 L_var2)
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        Int32 result64_hi;
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        Int32 result64_lo;
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        __asm
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            smull result64_lo, result64_hi, L_var2, L_var1
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            mov   result64_lo, result64_lo, lsr #28
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            add   result64_hi, result64_lo, result64_hi, asl  #4
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    __inline  Int32 fxp_mul32_Q27(const Int32 L_var1, const Int32 L_var2)
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        Int32 result64_hi;
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        Int32 result64_lo;
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        __asm
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            smull result64_lo, result64_hi, L_var2, L_var1
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            mov   result64_lo, result64_lo, lsr #27
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            add   result64_hi, result64_lo, result64_hi, asl  #5
123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    __inline  Int32 fxp_mul32_Q26(Int32 L_var1,  Int32 L_var2)
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        Int32 result64_hi;
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        Int32 result64_lo;
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        __asm
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            smull result64_lo, result64_hi, L_var2, L_var1
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            mov   result64_lo, result64_lo, lsr #26
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            add   result64_hi, result64_lo, result64_hi, asl  #6
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    __inline  Int32 fxp_mac32_Q32(Int32 L_add,  Int32 L_var1, const Int32 L_var2)
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        __asm
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            smlal L_var1, L_add, L_var2, L_var1
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return L_add;
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    __inline  Int32 fxp_msb32_Q32(Int32 L_sub,  Int32 L_var1, Int32 L_var2)
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        __asm
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            smull  L_var2, L_var1, L_var2, L_var1
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sub  L_sub, L_sub, L_var1
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return L_sub;
163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    __inline  Int32 fxp_mul32_Q29(const Int32 L_var1,  const Int32 L_var2)
167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        Int32 result64_hi;
169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        Int32 result64_lo;
170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        __asm
171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            smull result64_lo, result64_hi, L_var2, L_var1
173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            mov   result64_lo, result64_lo, lsr #29
174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            add   result64_hi, result64_lo, result64_hi, asl  #3
175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (result64_hi);
177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    __inline int32 pv_abs(int32 a)
181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        Int32 b;
183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        /*
184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            b = a - (a<0);
185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            a = b ^ sign(b)
186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber         */
187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        __asm
188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            sub  b, a, a, lsr #31
190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            eor  a, b, b, asr #31
191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        return (a);
193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#endif
196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#ifdef __cplusplus
198d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
199d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#endif
200d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
201d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
202d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#endif   /*  PV_MP3DEC_FXD_OP_ARM  */
203d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
204