1 /* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
18 /****************************************************************************************
19 Portions of this file are derived from the following 3GPP standard:
22 ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23 Available from http://www.3gpp.org
25 (C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26 Permission to distribute, modify and use this file under the standard license
27 terms listed above has been obtained from the copyright holder.
28 ****************************************************************************************/
33 ------------------------------------------------------------------------------
36 This file includes all the basicop2.c functions' header files.
38 ------------------------------------------------------------------------------
41 /*----------------------------------------------------------------------------
42 ; CONTINUE ONLY IF NOT ALREADY DEFINED
43 ----------------------------------------------------------------------------*/
47 /*----------------------------------------------------------------------------
49 ----------------------------------------------------------------------------*/
50 #include "basicop_malloc.h"
52 #if defined(PV_ARM_V5)
53 #include "basic_op_arm_v5.h"
55 #elif defined(PV_ARM_GCC_V5)
56 #include "basic_op_arm_gcc_v5.h"
59 #include "basic_op_c_equivalent.h"
76 #include "l_extract.h"
77 /*--------------------------------------------------------------------------*/
83 /*----------------------------------------------------------------------------
85 ; Define module specific macros here
86 ----------------------------------------------------------------------------*/
88 /*----------------------------------------------------------------------------
90 ; Include all pre-processor statements here.
91 ----------------------------------------------------------------------------*/
93 /*----------------------------------------------------------------------------
94 ; EXTERNAL VARIABLES REFERENCES
95 ; Declare variables used in this module but defined elsewhere
96 ----------------------------------------------------------------------------*/
98 /*----------------------------------------------------------------------------
100 ----------------------------------------------------------------------------*/
102 /*----------------------------------------------------------------------------
103 ; ENUMERATED TYPEDEF'S
104 ----------------------------------------------------------------------------*/
106 /*----------------------------------------------------------------------------
107 ; STRUCTURES TYPEDEF'S
108 ----------------------------------------------------------------------------*/
110 /*----------------------------------------------------------------------------
111 ; GLOBAL FUNCTION DEFINITIONS
112 ; Function Prototype declaration
113 ----------------------------------------------------------------------------*/
115 ------------------------------------------------------------------------------
116 FUNCTION NAME: mac_32
117 ------------------------------------------------------------------------------
118 INPUT AND OUTPUT DEFINITIONS
121 L_var3 = 32 bit long signed integer (Word32) whose value falls
122 in the range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
123 L_var1_hi = 16 bit short signed integer (Word16) whose value falls in
124 the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
125 L_var1_lo = 16 bit short signed integer (Word16) whose value falls in
126 the range : 0xffff 8000 <= var2 <= 0x0000 7fff.
127 L_var2_hi = 16 bit short signed integer (Word16) whose value falls in
128 the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
129 L_var2_lo = 16 bit short signed integer (Word16) whose value falls in
130 the range : 0xffff 8000 <= var2 <= 0x0000 7fff.
132 pOverflow = pointer to overflow (Flag)
135 pOverflow -> 1 if the 32 bit mac operation resulted in overflow
138 L_var3 = 32-bit result of L_var3 + (L_var1 * L_var2)(Word32)
141 static inline Word32 Mac_32(Word32 L_var3,
150 L_var3 = L_mac(L_var3, L_var1_hi, L_var2_hi, pOverflow);
152 product = mult(L_var1_hi, L_var2_lo, pOverflow);
153 L_var3 = L_mac(L_var3, product, 1, pOverflow);
155 product = mult(L_var1_lo, L_var2_hi, pOverflow);
156 L_var3 = L_mac(L_var3, product, 1, pOverflow);
162 ------------------------------------------------------------------------------
163 FUNCTION NAME: mac_32_16
164 ------------------------------------------------------------------------------
165 INPUT AND OUTPUT DEFINITIONS
168 L_var3 = 32 bit long signed integer (Word32) whose value falls
169 in the range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
170 L_var1_hi = 16 bit short signed integer (Word16) whose value falls in
171 the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
172 L_var1_lo = 16 bit short signed integer (Word16) whose value falls in
173 the range : 0xffff 8000 <= var2 <= 0x0000 7fff.
174 var2= 16 bit short signed integer (Word16) whose value falls in
175 the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
176 pOverflow = pointer to overflow (Flag)
179 pOverflow -> 1 if the 32 bit mac operation resulted in overflow
182 L_var3 = 32-bit result of L_var3 + (L_var1 * var2)(Word32)
185 static inline Word32 Mac_32_16(Word32 L_var3,
193 L_var3 = L_mac(L_var3, L_var1_hi, var2, pOverflow);
195 product = mult(L_var1_lo, var2, pOverflow);
196 L_var3 = L_mac(L_var3, product, 1, pOverflow);
202 /*----------------------------------------------------------------------------
203 Function Name : negate
205 Negate var1 with saturation, saturate in the case where input is -32768:
206 negate(var1) = sub(0,var1).
210 16 bit short signed integer (Word16) whose value falls in the
211 range : 0x8000 <= var1 <= 0x7fff.
217 16 bit short signed integer (Word16) whose value falls in the
218 range : 0x8000 <= var_out <= 0x7fff.
219 ----------------------------------------------------------------------------*/
221 static inline Word16 negate(Word16 var1)
223 return (((var1 == MIN_16) ? MAX_16 : -var1));
226 /*----------------------------------------------------------------------------
230 Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill
231 the var2 LSB of the result. If var2 is negative, arithmetically shift
232 var1 right by -var2 with sign extension. Saturate the result in case of
233 underflows or overflows.
237 16 bit short signed integer (Word16) whose value falls in the
238 range : 0x8000 <= var1 <= 0x7fff.
241 16 bit short signed integer (Word16) whose value falls in the
242 range : 0x8000 <= var1 <= 0x7fff.
244 pOverflow : pointer to overflow (Flag)
248 16 bit short signed integer (Word16) whose value falls in the
249 range : 0x8000 <= var_out <= 0x7fff.
250 ----------------------------------------------------------------------------*/
252 static inline Word16 shl(Word16 var1, Word16 var2, Flag *pOverflow)
256 OSCL_UNUSED_ARG(pOverflow);
263 var_out = var1 >> var2;
269 var_out = var1 << var2;
270 if (var_out >> var2 != var1)
272 var_out = (var1 >> 15) ^ MAX_16;
279 /*----------------------------------------------------------------------------
281 Function Name : L_shl
283 Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero
284 fill the var2 LSB of the result. If var2 is negative, arithmetically
285 shift L_var1 right by -var2 with sign extension. Saturate the result in
286 case of underflows or overflows.
289 L_var1 32 bit long signed integer (Word32) whose value falls in the
290 range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
293 16 bit short signed integer (Word16) whose value falls in the
294 range : 8000 <= var2 <= 7fff.
296 pOverflow : pointer to overflow (Flag)
299 32 bit long signed integer (Word32) whose value falls in the
300 range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
302 ----------------------------------------------------------------------------*/
304 static inline Word32 L_shl(Word32 L_var1, Word16 var2, Flag *pOverflow)
306 Word32 L_var_out = 0;
308 OSCL_UNUSED_ARG(pOverflow);
312 L_var_out = L_var1 << var2;
313 if (L_var_out >> var2 != L_var1)
315 L_var_out = (L_var1 >> 31) ^ MAX_32;
323 L_var_out = L_var1 >> var2;
332 /*----------------------------------------------------------------------------
334 Function Name : L_shr
336 Arithmetically shift the 32 bit input L_var1 right var2 positions with
337 sign extension. If var2 is negative, arithmetically shift L_var1 left
338 by -var2 and zero fill the -var2 LSB of the result. Saturate the result
339 in case of underflows or overflows.
342 L_var1 32 bit long signed integer (Word32) whose value falls in the
343 range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
346 16 bit short signed integer (Word16) whose value falls in the
347 range : 8000 <= var2 <= 7fff.
349 pOverflow : pointer to overflow (Flag)
352 32 bit long signed integer (Word32) whose value falls in the
353 range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
355 ----------------------------------------------------------------------------*/
357 static inline Word32 L_shr(Word32 L_var1, Word16 var2, Flag *pOverflow)
359 Word32 L_var_out = 0;
361 OSCL_UNUSED_ARG(pOverflow);
367 L_var_out = L_var1 >> var2;
374 L_var_out = L_var1 << (var2) ;
375 if ((L_var_out >> (var2)) != L_var1)
377 L_var_out = (L_var1 >> 31) ^ MAX_32;
385 /*----------------------------------------------------------------------------
387 Function Name : abs_s
389 Absolute value of var1; abs_s(-32768) = 32767.
393 16 bit short signed integer (Word16) whose value falls in the
394 range : 0x8000 <= var1 <= 0x7fff.
396 pOverflow : pointer to overflow (Flag)
402 16 bit short signed integer (Word16) whose value falls in the
403 range : 0x0000 <= var_out <= 0x7fff.
405 ----------------------------------------------------------------------------*/
407 static inline Word16 abs_s(Word16 var1)
410 Word16 y = var1 - (var1 < 0);
415 /*----------------------------------------------------------------------------
417 ----------------------------------------------------------------------------*/
423 #endif /* BASIC_OP_H */