117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/* 217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** Copyright 2003-2010, VisualOn, Inc. 317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** 417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** Licensed under the Apache License, Version 2.0 (the "License"); 517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** you may not use this file except in compliance with the License. 617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** You may obtain a copy of the License at 717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** 817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** http://www.apache.org/licenses/LICENSE-2.0 917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** 1017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** Unless required by applicable law or agreed to in writing, software 1117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** distributed under the License is distributed on an "AS IS" BASIS, 1217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** See the License for the specific language governing permissions and 1417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** limitations under the License. 1517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong */ 1617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 1717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 1817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#ifndef __BASIC_OP_H__ 1917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define __BASIC_OP_H__ 2017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 2117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include <stdio.h> 2217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include <stdlib.h> 2317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "typedef.h" 2417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 2517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define MAX_32 (Word32)0x7fffffffL 2617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define MIN_32 (Word32)0x80000000L 2717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 2817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define MAX_16 (Word16)+32767 /* 0x7fff */ 2917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define MIN_16 (Word16)-32768 /* 0x8000 */ 3017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 3117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 3217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#ifdef LINUX 3317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define static_vo static __inline__ 3417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#else 3517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define static_vo static __inline 3617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#endif 3717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 3817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define saturate(L_var1) (((L_var1) > 0X00007fffL) ? (MAX_16): (((L_var1) < (Word32) 0xffff8000L) ? (MIN_16): ((L_var1) & 0xffff))) 3917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 4017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define abs_s(x) ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16)) /* Short abs, 1 */ 4117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define L_deposit_h(x) (((Word32)(x)) << 16) /* 16 bit var1 -> MSB, 2 */ 4217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define L_deposit_l(x) ((Word32)(x)) /* 16 bit var1 -> LSB, 2 */ 4317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32) /* Long abs, 3*/ 4417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1)))) /* Short negate, 1*/ 4517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1))) /* Long negate, 2*/ 4617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 4717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 4817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define extract_h(a) ((Word16)(a >> 16)) 4917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define extract_l(x) (Word16)((x)) 5017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define add1(a,b) (a + b) 5117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define vo_L_msu(a,b,c) ( a - (( b * c ) << 1) ) 5217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define vo_mult32(a, b) ((a) * (b)) 5317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define vo_mult(a,b) (( a * b ) >> 15 ) 5417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define vo_L_mult(a,b) (((a) * (b)) << 1) 5517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define vo_shr_r(var1, var2) ((var1+((Word16)(1L<<(var2-1))))>>var2) 5617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define vo_sub(a,b) (a - b) 5717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define vo_L_deposit_h(a) ((Word32)((a) << 16)) 5817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define vo_round(a) ((a + 0x00008000) >> 16) 5917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define vo_extract_l(a) ((Word16)(a)) 6017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define vo_L_add(a,b) (a + b) 6117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define vo_L_sub(a,b) (a - b) 6217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define vo_mult_r(a,b) ((( a * b ) + 0x4000 ) >> 15 ) 6317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define vo_negate(a) (-a) 6417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#define vo_L_shr_r(L_var1, var2) ((L_var1+((Word32)(1L<<(var2-1))))>>var2) 6517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 6617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 6717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 6817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 6917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Prototypes for basic arithmetic operators | 7017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 7117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 7217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 add (Word16 var1, Word16 var2); /* Short add,1 */ 7317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 sub (Word16 var1, Word16 var2); /* Short sub,1 */ 7417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 shl (Word16 var1, Word16 var2); /* Short shift left, 1 */ 7517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 shr (Word16 var1, Word16 var2); /* Short shift right, 1 */ 7617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 mult (Word16 var1, Word16 var2); /* Short mult, 1 */ 7717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_mult (Word16 var1, Word16 var2); /* Long mult, 1 */ 7817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 voround (Word32 L_var1); /* Round, 1 */ 7917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2); /* Mac, 1 */ 8017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2); /* Msu, 1 */ 8117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_add (Word32 L_var1, Word32 L_var2); /* Long add, 2 */ 8217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_sub (Word32 L_var1, Word32 L_var2); /* Long sub, 2 */ 8317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 mult_r (Word16 var1, Word16 var2); /* Mult with round, 2 */ 8417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_shl2(Word32 L_var1, Word16 var2); /* var2 > 0*/ 8517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_shl (Word32 L_var1, Word16 var2); /* Long shift left, 2 */ 8617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_shr (Word32 L_var1, Word16 var2); /* Long shift right, 2*/ 8717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_shr_r (Word32 L_var1, Word16 var2); /* Long shift right with round, 3 */ 8817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 norm_s (Word16 var1); /* Short norm, 15 */ 8917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 div_s (Word16 var1, Word16 var2); /* Short division, 18 */ 9017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 norm_l (Word32 L_var1); /* Long norm, 30 */ 9117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 9217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 9317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 9417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Functions | 9517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 9617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 9717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 9817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 9917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : add | 10017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 10117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 10217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 10317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Performs the addition (var1+var2) with overflow control and saturation;| 10417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| the 16 bit result is set at +32767 when overflow occurs or at -32768 | 10517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| when underflow occurs. | 10617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 10717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 1 | 10817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 10917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 11017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 11117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var1 | 11217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 11317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 11417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 11517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var2 | 11617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 11717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 11817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 11917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 12017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 12117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 12217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 12317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 12417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 12517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var_out | 12617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 12717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 12817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 12917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 13017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 add (Word16 var1, Word16 var2) 13117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 13217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 var_out; 13317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_sum; 13417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_sum = (Word32) var1 + var2; 13517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = saturate (L_sum); 13617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (var_out); 13717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 13817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 13917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 14017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 14117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : sub | 14217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 14317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 14417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 14517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Performs the subtraction (var1+var2) with overflow control and satu- | 14617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| ration; the 16 bit result is set at +32767 when overflow occurs or at | 14717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| -32768 when underflow occurs. | 14817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 14917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 1 | 15017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 15117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 15217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 15317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var1 | 15417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 15517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 15617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 15717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var2 | 15817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 15917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 16017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 16117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 16217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 16317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 16417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 16517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 16617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 16717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var_out | 16817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 16917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 17017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 17117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 17217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 17317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 sub (Word16 var1, Word16 var2) 17417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 17517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 var_out; 17617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_diff; 17717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_diff = (Word32) var1 - var2; 17817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = saturate (L_diff); 17917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (var_out); 18017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 18117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 18217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 18317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 18417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : shl | 18517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 18617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 18717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 18817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill| 18917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| the var2 LSB of the result. If var2 is negative, arithmetically shift | 19017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var1 right by -var2 with sign extension. Saturate the result in case of | 19117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| underflows or overflows. | 19217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 19317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 1 | 19417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 19517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 19617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 19717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var1 | 19817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 19917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 20017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 20117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var2 | 20217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 20317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 20417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 20517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 20617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 20717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 20817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 20917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 21017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 21117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var_out | 21217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 21317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 21417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 21517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 21617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 21717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 shl (Word16 var1, Word16 var2) 21817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 21917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 var_out; 22017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 result; 22117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var2 < 0) 22217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 22317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var2 < -16) 22417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var2 = -16; 22517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = var1 >> ((Word16)-var2); 22617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 22717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 22817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 22917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong result = (Word32) var1 *((Word32) 1 << var2); 23017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result))) 23117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 23217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16); 23317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 23417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 23517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 23617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = extract_l (result); 23717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 23817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 23917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (var_out); 24017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 24117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 24217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 24317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 24417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : shr | 24517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 24617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 24717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 24817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Arithmetically shift the 16 bit input var1 right var2 positions with | 24917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| sign extension. If var2 is negative, arithmetically shift var1 left by | 25017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| -var2 with sign extension. Saturate the result in case of underflows or | 25117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| overflows. | 25217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 25317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 1 | 25417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 25517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 25617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 25717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var1 | 25817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 25917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 26017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 26117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var2 | 26217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 26317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 26417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 26517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 26617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 26717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 26817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 26917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 27017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 27117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var_out | 27217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 27317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 27417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 27517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 27617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 27717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 shr (Word16 var1, Word16 var2) 27817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 27917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 var_out; 28017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var2 < 0) 28117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 28217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var2 < -16) 28317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var2 = -16; 28417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = shl(var1, (Word16)-var2); 28517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 28617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 28717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 28817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var2 >= 15) 28917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 29017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = (Word16)((var1 < 0) ? -1 : 0); 29117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 29217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 29317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 29417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var1 < 0) 29517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 29617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = (Word16)(~((~var1) >> var2)); 29717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 29817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 29917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 30017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = (Word16)(var1 >> var2); 30117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 30217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 30317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 30417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (var_out); 30517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 30617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 30717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 30817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 30917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : mult | 31017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 31117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 31217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 31317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Performs the multiplication of var1 by var2 and gives a 16 bit result | 31417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| which is scaled i.e.: | 31517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and | 31617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| mult(-32768,-32768) = 32767. | 31717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 31817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 1 | 31917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 32017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 32117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 32217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var1 | 32317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 32417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 32517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 32617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var2 | 32717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 32817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 32917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 33017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 33117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 33217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 33317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 33417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 33517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 33617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var_out | 33717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 33817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 33917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 34017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 34117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 34217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 mult (Word16 var1, Word16 var2) 34317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 34417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 var_out; 34517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_product; 34617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_product = (Word32) var1 *(Word32) var2; 34717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_product = (L_product & (Word32) 0xffff8000L) >> 15; 34817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (L_product & (Word32) 0x00010000L) 34917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_product = L_product | (Word32) 0xffff0000L; 35017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = saturate (L_product); 35117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (var_out); 35217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 35317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 35417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 35517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 35617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : L_mult | 35717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 35817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 35917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 36017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_mult is the 32 bit result of the multiplication of var1 times var2 | 36117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| with one shift left i.e.: | 36217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_mult(var1,var2) = L_shl((var1 times var2),1) and | 36317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_mult(-32768,-32768) = 2147483647. | 36417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 36517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 1 | 36617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 36717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 36817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 36917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var1 | 37017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 37117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 37217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 37317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var2 | 37417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 37517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 37617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 37717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 37817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 37917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 38017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 38117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 38217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 38317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var_out | 38417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 32 bit long signed integer (Word32) whose value falls in the | 38517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 38617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 38717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 38817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 38917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_mult (Word16 var1, Word16 var2) 39017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 39117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_var_out; 39217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = (Word32) var1 *(Word32) var2; 39317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (L_var_out != (Word32) 0x40000000L) 39417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 39517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out *= 2; 39617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 39717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 39817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 39917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = MAX_32; 40017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 40117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (L_var_out); 40217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 40317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 40417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 40517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 40617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : round | 40717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 40817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 40917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 41017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Round the lower 16 bits of the 32 bit input number into the MS 16 bits | 41117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| with saturation. Shift the resulting bits right by 16 and return the 16 | 41217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| bit number: | 41317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| round(L_var1) = extract_h(L_add(L_var1,32768)) | 41417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 41517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 1 | 41617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 41717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 41817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 41917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var1 | 42017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 32 bit long signed integer (Word32 ) whose value falls in the | 42117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | 42217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 42317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 42417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 42517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 42617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 42717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 42817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 42917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var_out | 43017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 43117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 43217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 43317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 43417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 43517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 voround (Word32 L_var1) 43617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 43717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 var_out; 43817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_rounded; 43917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_rounded = L_add (L_var1, (Word32) 0x00008000L); 44017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = extract_h (L_rounded); 44117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (var_out); 44217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 44317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 44417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 44517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 44617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : L_mac | 44717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 44817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 44917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 45017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Multiply var1 by var2 and shift the result left by 1. Add the 32 bit | 45117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| result to L_var3 with saturation, return a 32 bit result: | 45217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)). | 45317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 45417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 1 | 45517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 45617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 45717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 45817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var3 32 bit long signed integer (Word32) whose value falls in the | 45917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 46017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 46117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var1 | 46217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 46317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 46417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 46517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var2 | 46617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 46717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 46817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 46917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 47017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 47117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 47217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 47317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 47417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 47517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var_out | 47617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 32 bit long signed integer (Word32) whose value falls in the | 47717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 47817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 47917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 48017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 48117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2) 48217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 48317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_var_out; 48417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_product; 48517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_product = ((var1 * var2) << 1); 48617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = L_add (L_var3, L_product); 48717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (L_var_out); 48817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 48917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 49017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 49117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 49217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : L_msu | 49317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 49417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 49517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 49617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Multiply var1 by var2 and shift the result left by 1. Subtract the 32 | 49717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| bit result to L_var3 with saturation, return a 32 bit result: | 49817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)). | 49917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 50017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 1 | 50117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 50217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 50317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 50417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var3 32 bit long signed integer (Word32) whose value falls in the | 50517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 50617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 50717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var1 | 50817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 50917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 51017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 51117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var2 | 51217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 51317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 51417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 51517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 51617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 51717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 51817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 51917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 52017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 52117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var_out | 52217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 32 bit long signed integer (Word32) whose value falls in the | 52317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 52417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 52517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 52617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 52717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2) 52817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 52917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_var_out; 53017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_product; 53117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_product = (var1 * var2)<<1; 53217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = L_sub (L_var3, L_product); 53317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (L_var_out); 53417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 53517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 53617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 53717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 53817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : L_add | 53917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 54017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 54117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 54217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 32 bits addition of the two 32 bits variables (L_var1+L_var2) with | 54317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| overflow control and saturation; the result is set at +2147483647 when | 54417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| overflow occurs or at -2147483648 when underflow occurs. | 54517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 54617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 2 | 54717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 54817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 54917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 55017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var1 32 bit long signed integer (Word32) whose value falls in the | 55117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 55217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 55317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var2 32 bit long signed integer (Word32) whose value falls in the | 55417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 55517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 55617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 55717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 55817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 55917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 56017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 56117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 56217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var_out | 56317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 32 bit long signed integer (Word32) whose value falls in the | 56417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 56517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 56617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 56717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 56817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_add (Word32 L_var1, Word32 L_var2) 56917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 57017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_var_out; 57117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = L_var1 + L_var2; 57217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (((L_var1 ^ L_var2) & MIN_32) == 0) 57317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 57417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if ((L_var_out ^ L_var1) & MIN_32) 57517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 57617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32; 57717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 57817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 57917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (L_var_out); 58017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 58117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 58217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 58317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 58417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : L_sub | 58517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 58617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 58717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 58817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with | 58917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| overflow control and saturation; the result is set at +2147483647 when | 59017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| overflow occurs or at -2147483648 when underflow occurs. | 59117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 59217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 2 | 59317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 59417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 59517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 59617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var1 32 bit long signed integer (Word32) whose value falls in the | 59717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 59817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 59917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var2 32 bit long signed integer (Word32) whose value falls in the | 60017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 60117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 60217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 60317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 60417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 60517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 60617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 60717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 60817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var_out | 60917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 32 bit long signed integer (Word32) whose value falls in the | 61017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 61117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 61217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 61317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 61417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_sub (Word32 L_var1, Word32 L_var2) 61517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 61617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_var_out; 61717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = L_var1 - L_var2; 61817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (((L_var1 ^ L_var2) & MIN_32) != 0) 61917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 62017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if ((L_var_out ^ L_var1) & MIN_32) 62117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 62217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32; 62317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 62417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 62517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (L_var_out); 62617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 62717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 62817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 62917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 63017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 63117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : mult_r | 63217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 63317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 63417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 63517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Same as mult with rounding, i.e.: | 63617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and | 63717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| mult_r(-32768,-32768) = 32767. | 63817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 63917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 2 | 64017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 64117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 64217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 64317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var1 | 64417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 64517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 64617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 64717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var2 | 64817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 64917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 65017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 65117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 65217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 65317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 65417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 65517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 65617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 65717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var_out | 65817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 65917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 66017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 66117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 66217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 66317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 mult_r (Word16 var1, Word16 var2) 66417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 66517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 var_out; 66617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_product_arr; 66717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_product_arr = (Word32) var1 *(Word32) var2; /* product */ 66817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_product_arr += (Word32) 0x00004000L; /* round */ 66917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_product_arr &= (Word32) 0xffff8000L; 67017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_product_arr >>= 15; /* shift */ 67117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (L_product_arr & (Word32) 0x00010000L) /* sign extend when necessary */ 67217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 67317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_product_arr |= (Word32) 0xffff0000L; 67417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 67517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = saturate (L_product_arr); 67617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (var_out); 67717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 67817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 67917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 68017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 68117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : L_shl | 68217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 68317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 68417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 68517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero | 68617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| fill the var2 LSB of the result. If var2 is negative, arithmetically | 68717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| shift L_var1 right by -var2 with sign extension. Saturate the result in | 68817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| case of underflows or overflows. | 68917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 69017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 2 | 69117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 69217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 69317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 69417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var1 32 bit long signed integer (Word32) whose value falls in the | 69517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 69617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 69717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var2 | 69817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 69917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 70017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 70117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 70217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 70317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 70417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 70517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 70617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 70717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var_out | 70817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 32 bit long signed integer (Word32) whose value falls in the | 70917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 71017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 71117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 71217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 71317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_shl (Word32 L_var1, Word16 var2) 71417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 71517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_var_out = 0L; 71617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var2 <= 0) 71717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 71817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var2 < -32) 71917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var2 = -32; 72017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = (L_var1 >> (Word16)-var2); 72117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 72217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 72317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 72417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for (; var2 > 0; var2--) 72517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 72617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (L_var1 > (Word32) 0X3fffffffL) 72717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 72817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = MAX_32; 72917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong break; 73017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 73117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 73217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 73317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (L_var1 < (Word32) 0xc0000000L) 73417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 73517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong //Overflow = 1; 73617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = MIN_32; 73717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong break; 73817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 73917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 74017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var1 *= 2; 74117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = L_var1; 74217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 74317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 74417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (L_var_out); 74517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 74617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 74717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_shl2(Word32 L_var1, Word16 var2) 74817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 74917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_var_out = 0L; 75017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 75117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for (; var2 > 0; var2--) 75217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 75317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (L_var1 > (Word32) 0X3fffffffL) 75417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 75517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = MAX_32; 75617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong break; 75717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 75817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 75917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 76017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (L_var1 < (Word32) 0xc0000000L) 76117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 76217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = MIN_32; 76317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong break; 76417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 76517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 76617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var1 <<=1 ; 76717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = L_var1; 76817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 76917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (L_var_out); 77017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 77117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 77217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 77317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 77417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : L_shr | 77517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 77617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 77717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 77817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Arithmetically shift the 32 bit input L_var1 right var2 positions with | 77917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| sign extension. If var2 is negative, arithmetically shift L_var1 left | 78017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| by -var2 and zero fill the -var2 LSB of the result. Saturate the result | 78117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| in case of underflows or overflows. | 78217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 78317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 2 | 78417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 78517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 78617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 78717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var1 32 bit long signed integer (Word32) whose value falls in the | 78817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 78917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 79017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var2 | 79117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 79217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 79317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 79417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 79517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 79617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 79717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 79817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 79917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 80017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var_out | 80117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 32 bit long signed integer (Word32) whose value falls in the | 80217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 80317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 80417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 80517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 80617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_shr (Word32 L_var1, Word16 var2) 80717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 80817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_var_out; 80917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var2 < 0) 81017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 81117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var2 < -32) 81217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var2 = -32; 81317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = L_shl2(L_var1, (Word16)-var2); 81417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 81517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 81617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 81717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var2 >= 31) 81817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 81917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = (L_var1 < 0L) ? -1 : 0; 82017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 82117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 82217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 82317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (L_var1 < 0) 82417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 82517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = ~((~L_var1) >> var2); 82617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 82717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 82817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 82917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = L_var1 >> var2; 83017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 83117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 83217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 83317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (L_var_out); 83417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 83517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 83617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 83717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 83817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : L_shr_r | 83917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 84017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 84117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 84217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Same as L_shr(L_var1,var2) but with rounding. Saturate the result in | 84317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| case of underflows or overflows : | 84417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| - If var2 is greater than zero : | 84517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))| 84617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| is equal to zero | 84717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| then | 84817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_shr_r(L_var1,var2) = L_shr(L_var1,var2) | 84917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| else | 85017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1) | 85117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| - If var2 is less than or equal to zero : | 85217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_shr_r(L_var1,var2) = L_shr(L_var1,var2). | 85317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 85417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 3 | 85517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 85617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 85717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 85817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var1 | 85917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 32 bit long signed integer (Word32) whose value falls in the | 86017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= var1 <= 0x7fff ffff. | 86117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 86217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var2 | 86317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 86417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 86517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 86617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 86717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 86817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 86917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 87017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 87117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 87217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var_out | 87317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 32 bit long signed integer (Word32) whose value falls in the | 87417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= var_out <= 0x7fff ffff. | 87517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 87617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 87717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 87817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word32 L_shr_r (Word32 L_var1, Word16 var2) 87917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 88017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_var_out; 88117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var2 > 31) 88217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 88317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = 0; 88417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 88517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 88617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 88717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out = L_shr (L_var1, var2); 88817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var2 > 0) 88917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 89017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0) 89117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 89217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var_out++; 89317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 89417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 89517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 89617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (L_var_out); 89717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 89817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 89917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 90017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 90117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : norm_s | 90217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 90317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 90417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 90517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Produces the number of left shift needed to normalize the 16 bit varia- | 90617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| ble var1 for positive values on the interval with minimum of 16384 and | 90717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| maximum of 32767, and for negative values on the interval with minimum | 90817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| of -32768 and maximum of -16384; in order to normalize the result, the | 90917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| following operation must be done : | 91017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| norm_var1 = shl(var1,norm_s(var1)). | 91117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 91217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 15 | 91317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 91417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 91517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 91617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var1 | 91717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 91817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 91917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 92017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 92117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 92217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 92317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 92417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 92517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 92617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var_out | 92717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 92817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x0000 0000 <= var_out <= 0x0000 000f. | 92917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 93017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 93117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 93217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 norm_s (Word16 var1) 93317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 93417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 var_out = 0; 93517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var1 == 0) 93617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 93717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = 0; 93817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 93917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 94017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 94117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var1 == -1) 94217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 94317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = 15; 94417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 94517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 94617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 94717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var1 < 0) 94817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 94917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var1 = (Word16)~var1; 95017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 95117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for (var_out = 0; var1 < 0x4000; var_out++) 95217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 95317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var1 <<= 1; 95417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 95517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 95617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 95717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (var_out); 95817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 95917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 96017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 96117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 96217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : div_s | 96317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 96417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 96517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 96617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Produces a result which is the fractional integer division of var1 by | 96717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var2; var1 and var2 must be positive and var2 must be greater or equal | 96817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| to var1; the result is positive (leading bit equal to 0) and truncated | 96917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| to 16 bits. | 97017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| If var1 = var2 then div(var1,var2) = 32767. | 97117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 97217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 18 | 97317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 97417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 97517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 97617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var1 | 97717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 97817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x0000 0000 <= var1 <= var2 and var2 != 0. | 97917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 98017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var2 | 98117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 98217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : var1 <= var2 <= 0x0000 7fff and var2 != 0. | 98317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 98417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 98517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 98617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 98717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 98817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 98917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 99017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var_out | 99117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 99217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x0000 0000 <= var_out <= 0x0000 7fff. | 99317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| It's a Q15 value (point between b15 and b14). | 99417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 99517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 99617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 99717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 div_s (Word16 var1, Word16 var2) 99817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 99917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 var_out = 0; 100017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 iteration; 100117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_num; 100217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 L_denom; 100317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if ((var1 < 0) || (var2 < 0)) 100417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 100517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = MAX_16; 100617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return var_out; 100717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 100817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var2 == 0) 100917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 101017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = MAX_16; 101117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return var_out; 101217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 101317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var1 == 0) 101417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 101517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = 0; 101617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 101717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 101817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 101917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (var1 == var2) 102017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 102117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = MAX_16; 102217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 102317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong else 102417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 102517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_num = L_deposit_l (var1); 102617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_denom = L_deposit_l(var2); 102717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for (iteration = 0; iteration < 15; iteration++) 102817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 102917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out <<= 1; 103017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_num <<= 1; 103117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (L_num >= L_denom) 103217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 103317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_num -= L_denom; 103417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out += 1; 103517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 103617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 103717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 103817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 103917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (var_out); 104017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 104117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 104217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________ 104317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 104417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Function Name : norm_l | 104517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 104617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Purpose : | 104717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 104817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Produces the number of left shifts needed to normalize the 32 bit varia-| 104917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| ble L_var1 for positive values on the interval with minimum of | 105017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 1073741824 and maximum of 2147483647, and for negative values on the in-| 105117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| terval with minimum of -2147483648 and maximum of -1073741824; in order | 105217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| to normalize the result, the following operation must be done : | 105317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| norm_L_var1 = L_shl(L_var1,norm_l(L_var1)). | 105417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 105517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Complexity weight : 30 | 105617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 105717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Inputs : | 105817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 105917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| L_var1 | 106017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 32 bit long signed integer (Word32) whose value falls in the | 106117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x8000 0000 <= var1 <= 0x7fff ffff. | 106217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 106317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Outputs : | 106417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 106517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| none | 106617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 106717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| Return Value : | 106817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| | 106917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| var_out | 107017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| 16 bit short signed integer (Word16) whose value falls in the | 107117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong| range : 0x0000 0000 <= var_out <= 0x0000 001f. | 107217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________| 107317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/ 107417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 107517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic_vo Word16 norm_l (Word32 L_var1) 107617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 107717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 var_out = 0; 107817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (L_var1 != 0) 107917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 108017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong var_out = 31; 108117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (L_var1 != (Word32) 0xffffffffL) 108217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 108317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var1 ^= (L_var1 >>31); 108417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++) 108517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 108617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong L_var1 <<= 1; 108717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 108817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 108917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 109017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return (var_out); 109117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 109217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 109317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#endif //__BASIC_OP_H__ 109417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 1095