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_gcc.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_GCC_H
41 #define PV_MP3DEC_FXD_OP_ARM_GCC_H
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_GCC_V5)||defined(PV_ARM_GCC_V4))
53 
54 #define Qfmt_31(a)   (int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
55 
56 #define Qfmt15(x)   (Int16)(x*((int32)1<<15) + (x>=0?0.5F:-0.5F))
57 
fxp_mul32_Q30(const int32 a,const int32 b)58     static inline int32 fxp_mul32_Q30(const int32 a, const int32 b)
59     {
60         int32 result64_hi;
61         int32 result64_lo;
62         register int32 ra = (int32)a;
63         register int32 rb = (int32)b;
64         asm volatile("smull %1, %0, %2, %3\n\t"
65                      "mov   %1, %1, lsr #30\n\t"
66                      "add   %0, %1, %0, asl #2"
67              : "=&r*i"(result64_hi),
68                      "=&r*i"(result64_lo)
69                              : "r"(ra),
70                              "r"(rb));
71         return (result64_hi);
72     }
73 
74 
fxp_mac32_Q30(const int32 a,const int32 b,int32 L_add)75     static inline int32 fxp_mac32_Q30(const int32 a, const int32 b, int32 L_add)
76 {
77         int32 result64_hi;
78         int32 result64_lo;
79         register int32 ra = (int32)a;
80         register int32 rb = (int32)b;
81         register int32 rc = (int32)L_add;
82 
83         asm volatile("smull %1, %0, %2, %3\n\t"
84                      "add %4, %4, %0, asl #2\n\t"
85                      "add %0, %4, %1, lsr #30"
86              : "=&r*i"(result64_hi),
87                      "=&r*i"(result64_lo)
88                              : "r"(ra),
89                              "r"(rb),
90                              "r"(rc));
91 
92         return (result64_hi);
93     }
94 
95 
96 
fxp_mul32_Q32(const int32 a,const int32 b)97     static inline int32 fxp_mul32_Q32(const int32 a, const int32 b)
98 {
99         int32 result64_hi;
100         int32 result64_lo;
101         register int32 ra = (int32)a;
102         register int32 rb = (int32)b;
103         asm volatile(
104             "smull %1, %0, %2, %3"
105     : "=&r*i"(result64_hi),
106             "=&r*i"(result64_lo)
107                     : "r"(ra),
108                     "r"(rb));
109 
110         return (result64_hi);
111     }
112 
113 
fxp_mul32_Q29(const int32 a,const int32 b)114     static inline int32 fxp_mul32_Q29(const int32 a, const int32 b)
115 {
116         int32 result64_hi;
117         int32 result64_lo;
118         register int32 ra = (int32)a;
119         register int32 rb = (int32)b;
120         asm volatile("smull %1, %0, %2, %3\n\t"
121                      "mov   %1, %1, lsr #29\n\t"
122                      "add   %0, %1, %0, asl #3"
123              : "=&r*i"(result64_hi),
124                      "=&r*i"(result64_lo)
125                              : "r"(ra),
126                              "r"(rb));
127         return (result64_hi);
128 
129     }
130 
fxp_mul32_Q28(const int32 a,const int32 b)131     static inline int32 fxp_mul32_Q28(const int32 a, const int32 b)
132 {
133 
134         int32 result64_hi;
135         int32 result64_lo;
136         register int32 ra = (int32)a;
137         register int32 rb = (int32)b;
138         asm volatile("smull %1, %0, %2, %3\n\t"
139                      "mov   %1, %1, lsr #28\n\t"
140                      "add   %0, %1, %0, asl #4"
141              : "=&r*i"(result64_hi),
142                      "=&r*i"(result64_lo)
143                              : "r"(ra),
144                              "r"(rb));
145         return (result64_hi);
146 
147     }
148 
149 
fxp_mul32_Q27(const int32 a,const int32 b)150     static inline int32 fxp_mul32_Q27(const int32 a, const int32 b)
151 {
152         int32 result64_hi;
153         int32 result64_lo;
154         register int32 ra = (int32)a;
155         register int32 rb = (int32)b;
156         asm volatile("smull %1, %0, %2, %3\n\t"
157                      "mov   %1, %1, lsr #27\n\t"
158                      "add   %0, %1, %0, asl #5"
159              : "=&r*i"(result64_hi),
160                      "=&r*i"(result64_lo)
161                              : "r"(ra),
162                              "r"(rb));
163         return (result64_hi);
164 
165     }
166 
167 
fxp_mul32_Q26(const int32 a,const int32 b)168     static inline int32 fxp_mul32_Q26(const int32 a, const int32 b)
169 {
170         int32 result64_hi;
171         int32 result64_lo;
172         register int32 ra = (int32)a;
173         register int32 rb = (int32)b;
174         asm volatile("smull %1, %0, %2, %3\n\t"
175                      "mov   %1, %1, lsr #26\n\t"
176                      "add   %0, %1, %0, asl #6"
177              : "=&r*i"(result64_hi),
178                      "=&r*i"(result64_lo)
179                              : "r"(ra),
180                              "r"(rb));
181         return (result64_hi);
182 
183     }
184 
185 
186 
fxp_mac32_Q32(int32 L_add,const int32 a,const int32 b)187     static inline int32 fxp_mac32_Q32(int32 L_add, const int32 a, const int32 b)
188 {
189 
190         int32 result64_hi;
191         int32 result64_lo;
192         register int32 ra = (int32)a;
193         register int32 rb = (int32)b;
194         register int32 rc = (int32)L_add;
195 
196         asm volatile("smull %1, %0, %2, %3\n\t"
197                      "add %0, %0, %4"
198              : "=&r*i"(result64_hi),
199                      "=&r*i"(result64_lo)
200                              : "r"(ra),
201                              "r"(rb),
202                              "r"(rc));
203 
204         return (result64_hi);
205     }
206 
fxp_msb32_Q32(int32 L_sub,const int32 a,const int32 b)207     static inline int32 fxp_msb32_Q32(int32 L_sub, const int32 a, const int32 b)
208 {
209         int32 result64_hi;
210         int32 result64_lo;
211         register int32 ra = (int32)a;
212         register int32 rb = (int32)b;
213         register int32 rc = (int32)L_sub;
214 
215         asm volatile("smull %1, %0, %2, %3\n\t"
216                      "sub %0, %4, %0"
217              : "=&r*i"(result64_hi),
218                      "=&r*i"(result64_lo)
219                              : "r"(ra),
220                              "r"(rb),
221                              "r"(rc));
222 
223 
224         return (result64_hi);
225     }
226 
227 
pv_abs(int32 x)228     __inline int32 pv_abs(int32 x)
229 {
230         register int32 z;
231         register int32 y;
232         register int32 ra = x;
233         asm volatile(
234             "sub  %0, %2, %2, lsr #31\n\t"
235             "eor  %1, %0, %0, asr #31"
236     : "=&r*i"(z),
237             "=&r*i"(y)
238                     : "r"(ra));
239 
240         return (y);
241     }
242 
243 
244 #endif
245 
246 #ifdef __cplusplus
247 }
248 #endif
249 
250 
251 #endif   /*  PV_MP3DEC_FXD_OP_ARM_GCC_H  */
252 
253