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
45 extern "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 
fxp_mul32_Q30(const Int32 L_var1,const Int32 L_var2)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 
fxp_mac32_Q30(const Int32 L_var1,const Int32 L_var2,Int32 L_add)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 
fxp_mul32_Q32(Int32 L_var1,const Int32 L_var2)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 
fxp_mul32_Q28(const Int32 L_var1,const Int32 L_var2)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 
fxp_mul32_Q27(const Int32 L_var1,const Int32 L_var2)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 
fxp_mul32_Q26(Int32 L_var1,Int32 L_var2)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 
fxp_mac32_Q32(Int32 L_add,Int32 L_var1,const Int32 L_var2)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 
fxp_msb32_Q32(Int32 L_sub,Int32 L_var1,Int32 L_var2)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 
fxp_mul32_Q29(const Int32 L_var1,const Int32 L_var2)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 
pv_abs(int32 a)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