1 /* ------------------------------------------------------------------
2 * Copyright (C) 1998-2010 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 ((PV_CPU_ARCH_VERSION >=5) && (PV_COMPILER == EPV_ARM_GNUC))
53 #include "basic_op_arm_gcc_v5.h"
56 #include "basic_op_c_equivalent.h"
73 #include "l_extract.h"
74 /*--------------------------------------------------------------------------*/
80 /*----------------------------------------------------------------------------
82 ; Define module specific macros here
83 ----------------------------------------------------------------------------*/
85 /*----------------------------------------------------------------------------
87 ; Include all pre-processor statements here.
88 ----------------------------------------------------------------------------*/
90 /*----------------------------------------------------------------------------
91 ; EXTERNAL VARIABLES REFERENCES
92 ; Declare variables used in this module but defined elsewhere
93 ----------------------------------------------------------------------------*/
95 /*----------------------------------------------------------------------------
97 ----------------------------------------------------------------------------*/
99 /*----------------------------------------------------------------------------
100 ; ENUMERATED TYPEDEF'S
101 ----------------------------------------------------------------------------*/
103 /*----------------------------------------------------------------------------
104 ; STRUCTURES TYPEDEF'S
105 ----------------------------------------------------------------------------*/
107 /*----------------------------------------------------------------------------
108 ; GLOBAL FUNCTION DEFINITIONS
109 ; Function Prototype declaration
110 ----------------------------------------------------------------------------*/
112 ------------------------------------------------------------------------------
113 FUNCTION NAME: mac_32
114 ------------------------------------------------------------------------------
115 INPUT AND OUTPUT DEFINITIONS
118 L_var3 = 32 bit long signed integer (Word32) whose value falls
119 in the range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
120 L_var1_hi = 16 bit short signed integer (Word16) whose value falls in
121 the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
122 L_var1_lo = 16 bit short signed integer (Word16) whose value falls in
123 the range : 0xffff 8000 <= var2 <= 0x0000 7fff.
124 L_var2_hi = 16 bit short signed integer (Word16) whose value falls in
125 the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
126 L_var2_lo = 16 bit short signed integer (Word16) whose value falls in
127 the range : 0xffff 8000 <= var2 <= 0x0000 7fff.
129 pOverflow = pointer to overflow (Flag)
132 pOverflow -> 1 if the 32 bit mac operation resulted in overflow
135 L_var3 = 32-bit result of L_var3 + (L_var1 * L_var2)(Word32)
138 static inline Word32 Mac_32(Word32 L_var3,
147 L_var3 = L_mac(L_var3, L_var1_hi, L_var2_hi, pOverflow);
149 product = mult(L_var1_hi, L_var2_lo, pOverflow);
150 L_var3 = L_mac(L_var3, product, 1, pOverflow);
152 product = mult(L_var1_lo, L_var2_hi, pOverflow);
153 L_var3 = L_mac(L_var3, product, 1, pOverflow);
159 ------------------------------------------------------------------------------
160 FUNCTION NAME: mac_32_16
161 ------------------------------------------------------------------------------
162 INPUT AND OUTPUT DEFINITIONS
165 L_var3 = 32 bit long signed integer (Word32) whose value falls
166 in the range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
167 L_var1_hi = 16 bit short signed integer (Word16) whose value falls in
168 the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
169 L_var1_lo = 16 bit short signed integer (Word16) whose value falls in
170 the range : 0xffff 8000 <= var2 <= 0x0000 7fff.
171 var2= 16 bit short signed integer (Word16) whose value falls in
172 the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
173 pOverflow = pointer to overflow (Flag)
176 pOverflow -> 1 if the 32 bit mac operation resulted in overflow
179 L_var3 = 32-bit result of L_var3 + (L_var1 * var2)(Word32)
182 static inline Word32 Mac_32_16(Word32 L_var3,
190 L_var3 = L_mac(L_var3, L_var1_hi, var2, pOverflow);
192 product = mult(L_var1_lo, var2, pOverflow);
193 L_var3 = L_mac(L_var3, product, 1, pOverflow);
199 /*----------------------------------------------------------------------------
200 Function Name : negate
202 Negate var1 with saturation, saturate in the case where input is -32768:
203 negate(var1) = sub(0,var1).
207 16 bit short signed integer (Word16) whose value falls in the
208 range : 0x8000 <= var1 <= 0x7fff.
214 16 bit short signed integer (Word16) whose value falls in the
215 range : 0x8000 <= var_out <= 0x7fff.
216 ----------------------------------------------------------------------------*/
218 static inline Word16 negate(Word16 var1)
220 return (((var1 == MIN_16) ? MAX_16 : -var1));
223 /*----------------------------------------------------------------------------
227 Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill
228 the var2 LSB of the result. If var2 is negative, arithmetically shift
229 var1 right by -var2 with sign extension. Saturate the result in case of
230 underflows or overflows.
234 16 bit short signed integer (Word16) whose value falls in the
235 range : 0x8000 <= var1 <= 0x7fff.
238 16 bit short signed integer (Word16) whose value falls in the
239 range : 0x8000 <= var1 <= 0x7fff.
241 pOverflow : pointer to overflow (Flag)
245 16 bit short signed integer (Word16) whose value falls in the
246 range : 0x8000 <= var_out <= 0x7fff.
247 ----------------------------------------------------------------------------*/
249 static inline Word16 shl(Word16 var1, Word16 var2, Flag *pOverflow)
253 OSCL_UNUSED_ARG(pOverflow);
260 var_out = var1 >> var2;
266 var_out = var1 << var2;
267 if (var_out >> var2 != var1)
269 var_out = (var1 >> 15) ^ MAX_16;
276 /*----------------------------------------------------------------------------
278 Function Name : L_shl
280 Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero
281 fill the var2 LSB of the result. If var2 is negative, arithmetically
282 shift L_var1 right by -var2 with sign extension. Saturate the result in
283 case of underflows or overflows.
286 L_var1 32 bit long signed integer (Word32) whose value falls in the
287 range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
290 16 bit short signed integer (Word16) whose value falls in the
291 range : 8000 <= var2 <= 7fff.
293 pOverflow : pointer to overflow (Flag)
296 32 bit long signed integer (Word32) whose value falls in the
297 range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
299 ----------------------------------------------------------------------------*/
301 static inline Word32 L_shl(Word32 L_var1, Word16 var2, Flag *pOverflow)
303 Word32 L_var_out = 0;
305 OSCL_UNUSED_ARG(pOverflow);
309 L_var_out = L_var1 << var2;
310 if (L_var_out >> var2 != L_var1)
312 L_var_out = (L_var1 >> 31) ^ MAX_32;
320 L_var_out = L_var1 >> var2;
329 /*----------------------------------------------------------------------------
331 Function Name : L_shr
333 Arithmetically shift the 32 bit input L_var1 right var2 positions with
334 sign extension. If var2 is negative, arithmetically shift L_var1 left
335 by -var2 and zero fill the -var2 LSB of the result. Saturate the result
336 in case of underflows or overflows.
339 L_var1 32 bit long signed integer (Word32) whose value falls in the
340 range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
343 16 bit short signed integer (Word16) whose value falls in the
344 range : 8000 <= var2 <= 7fff.
346 pOverflow : pointer to overflow (Flag)
349 32 bit long signed integer (Word32) whose value falls in the
350 range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
352 ----------------------------------------------------------------------------*/
354 static inline Word32 L_shr(Word32 L_var1, Word16 var2, Flag *pOverflow)
356 Word32 L_var_out = 0;
358 OSCL_UNUSED_ARG(pOverflow);
364 L_var_out = L_var1 >> var2;
371 L_var_out = L_var1 << (var2) ;
372 if ((L_var_out >> (var2)) != L_var1)
374 L_var_out = (L_var1 >> 31) ^ MAX_32;
382 /*----------------------------------------------------------------------------
384 Function Name : abs_s
386 Absolute value of var1; abs_s(-32768) = 32767.
390 16 bit short signed integer (Word16) whose value falls in the
391 range : 0x8000 <= var1 <= 0x7fff.
393 pOverflow : pointer to overflow (Flag)
399 16 bit short signed integer (Word16) whose value falls in the
400 range : 0x0000 <= var_out <= 0x7fff.
402 ----------------------------------------------------------------------------*/
404 static inline Word16 abs_s(Word16 var1)
407 Word16 y = var1 - (var1 < 0);
412 /*----------------------------------------------------------------------------
414 ----------------------------------------------------------------------------*/
420 #endif /* BASIC_OP_H */