1/* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18/*
19------------------------------------------------------------------------------
20   PacketVideo Corp.
21   MP3 Decoder Library
22
23   Pathname: ./cpp/include/pv_mp3dec_fxd_op_arm.h
24
25     Date: 08/20/2007
26
27------------------------------------------------------------------------------
28 REVISION HISTORY
29
30 Description:
31------------------------------------------------------------------------------
32 INCLUDE DESCRIPTION
33
34 This file select the associated fixed point functions with the OS/ARCH.
35
36
37------------------------------------------------------------------------------
38*/
39
40#ifndef PV_MP3DEC_FXD_OP_ARM
41#define PV_MP3DEC_FXD_OP_ARM
42
43
44#ifdef __cplusplus
45extern "C"
46{
47#endif
48
49#include "pvmp3_audio_type_defs.h"
50
51
52#if (defined(PV_ARM_V5)||defined(PV_ARM_V4))
53
54
55    __inline  Int32 fxp_mul32_Q30(const Int32 L_var1, const Int32 L_var2)
56    {
57
58        Int32 result64_hi;
59        Int32 result64_lo;
60        __asm
61        {
62            smull result64_lo, result64_hi, L_var2, L_var1
63            mov   result64_lo, result64_lo, lsr #30
64            add   result64_hi, result64_lo, result64_hi, asl  #2
65        }
66        return (result64_hi);
67    }
68
69    __inline  Int32 fxp_mac32_Q30(const Int32 L_var1, const Int32 L_var2, Int32 L_add)
70    {
71        Int32 result64_hi;
72        Int32 result64_lo;
73        __asm
74        {
75            smull result64_lo, result64_hi, L_var2, L_var1
76            add L_add, L_add, result64_hi, asl  #2
77            add L_add, L_add, result64_lo, lsr  #30
78        }
79        return (L_add);
80    }
81
82
83
84#define Qfmt_31(a)   (Int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
85
86
87
88    __inline  Int32 fxp_mul32_Q32(Int32 L_var1, const Int32 L_var2)
89    {
90        Int32 result64_hi;
91        __asm
92        {
93            smull L_var1, result64_hi, L_var2, L_var1
94        }
95        return (result64_hi);
96    }
97
98    __inline  Int32 fxp_mul32_Q28(const Int32 L_var1, const Int32 L_var2)
99    {
100
101        Int32 result64_hi;
102        Int32 result64_lo;
103        __asm
104        {
105            smull result64_lo, result64_hi, L_var2, L_var1
106            mov   result64_lo, result64_lo, lsr #28
107            add   result64_hi, result64_lo, result64_hi, asl  #4
108        }
109        return (result64_hi);
110    }
111
112
113    __inline  Int32 fxp_mul32_Q27(const Int32 L_var1, const Int32 L_var2)
114    {
115
116        Int32 result64_hi;
117        Int32 result64_lo;
118        __asm
119        {
120            smull result64_lo, result64_hi, L_var2, L_var1
121            mov   result64_lo, result64_lo, lsr #27
122            add   result64_hi, result64_lo, result64_hi, asl  #5
123        }
124        return (result64_hi);
125    }
126
127
128    __inline  Int32 fxp_mul32_Q26(Int32 L_var1,  Int32 L_var2)
129    {
130
131        Int32 result64_hi;
132        Int32 result64_lo;
133        __asm
134        {
135            smull result64_lo, result64_hi, L_var2, L_var1
136            mov   result64_lo, result64_lo, lsr #26
137            add   result64_hi, result64_lo, result64_hi, asl  #6
138        }
139        return (result64_hi);
140    }
141
142
143
144    __inline  Int32 fxp_mac32_Q32(Int32 L_add,  Int32 L_var1, const Int32 L_var2)
145    {
146        __asm
147        {
148            smlal L_var1, L_add, L_var2, L_var1
149        }
150        return L_add;
151    }
152
153
154    __inline  Int32 fxp_msb32_Q32(Int32 L_sub,  Int32 L_var1, Int32 L_var2)
155    {
156
157        __asm
158        {
159            smull  L_var2, L_var1, L_var2, L_var1
160            sub  L_sub, L_sub, L_var1
161        }
162        return L_sub;
163    }
164
165
166    __inline  Int32 fxp_mul32_Q29(const Int32 L_var1,  const Int32 L_var2)
167    {
168        Int32 result64_hi;
169        Int32 result64_lo;
170        __asm
171        {
172            smull result64_lo, result64_hi, L_var2, L_var1
173            mov   result64_lo, result64_lo, lsr #29
174            add   result64_hi, result64_lo, result64_hi, asl  #3
175        }
176        return (result64_hi);
177    }
178
179
180    __inline int32 pv_abs(int32 a)
181    {
182        Int32 b;
183        /*
184            b = a - (a<0);
185            a = b ^ sign(b)
186         */
187        __asm
188        {
189            sub  b, a, a, lsr #31
190            eor  a, b, b, asr #31
191        }
192        return (a);
193    }
194
195#endif
196
197#ifdef __cplusplus
198}
199#endif
200
201
202#endif   /*  PV_MP3DEC_FXD_OP_ARM  */
203
204