1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* 2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc. 3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License"); 5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License. 6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at 7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** http://www.apache.org/licenses/LICENSE-2.0 9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software 11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS, 12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and 14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License. 15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */ 16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifndef __BASIC_OP_H__ 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define __BASIC_OP_H__ 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <stdio.h> 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <stdlib.h> 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h" 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define MAX_32 (Word32)0x7fffffffL 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define MIN_32 (Word32)0x80000000L 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define MAX_16 (Word16)+32767 /* 0x7fff */ 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define MIN_16 (Word16)-32768 /* 0x8000 */ 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define static_vo static __inline 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define saturate(L_var1) (((L_var1) > 0X00007fffL) ? (MAX_16): (((L_var1) < (Word32) 0xffff8000L) ? (MIN_16): ((L_var1) & 0xffff))) 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define abs_s(x) ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16)) /* Short abs, 1 */ 37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define L_deposit_h(x) (((Word32)(x)) << 16) /* 16 bit var1 -> MSB, 2 */ 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define L_deposit_l(x) ((Word32)(x)) /* 16 bit var1 -> LSB, 2 */ 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32) /* Long abs, 3*/ 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1)))) /* Short negate, 1*/ 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1))) /* Long negate, 2*/ 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define extract_h(a) ((Word16)(a >> 16)) 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define extract_l(x) (Word16)((x)) 46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define add1(a,b) (a + b) 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_L_msu(a,b,c) ( a - (( b * c ) << 1) ) 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_mult32(a, b) ((a) * (b)) 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_mult(a,b) (( a * b ) >> 15 ) 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_L_mult(a,b) (((a) * (b)) << 1) 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_shr_r(var1, var2) ((var1+((Word16)(1L<<(var2-1))))>>var2) 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_sub(a,b) (a - b) 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_L_deposit_h(a) ((Word32)((a) << 16)) 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_round(a) ((a + 0x00008000) >> 16) 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_extract_l(a) ((Word16)(a)) 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_L_add(a,b) (a + b) 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_L_sub(a,b) (a - b) 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_mult_r(a,b) ((( a * b ) + 0x4000 ) >> 15 ) 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_negate(a) (-a) 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_L_shr_r(L_var1, var2) ((L_var1+((Word32)(1L<<(var2-1))))>>var2) 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Prototypes for basic arithmetic operators | 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 add (Word16 var1, Word16 var2); /* Short add,1 */ 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 sub (Word16 var1, Word16 var2); /* Short sub,1 */ 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 shl (Word16 var1, Word16 var2); /* Short shift left, 1 */ 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 shr (Word16 var1, Word16 var2); /* Short shift right, 1 */ 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 mult (Word16 var1, Word16 var2); /* Short mult, 1 */ 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_mult (Word16 var1, Word16 var2); /* Long mult, 1 */ 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 voround (Word32 L_var1); /* Round, 1 */ 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2); /* Mac, 1 */ 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2); /* Msu, 1 */ 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_add (Word32 L_var1, Word32 L_var2); /* Long add, 2 */ 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_sub (Word32 L_var1, Word32 L_var2); /* Long sub, 2 */ 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 mult_r (Word16 var1, Word16 var2); /* Mult with round, 2 */ 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_shl2(Word32 L_var1, Word16 var2); /* var2 > 0*/ 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_shl (Word32 L_var1, Word16 var2); /* Long shift left, 2 */ 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_shr (Word32 L_var1, Word16 var2); /* Long shift right, 2*/ 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_shr_r (Word32 L_var1, Word16 var2); /* Long shift right with round, 3 */ 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 norm_s (Word16 var1); /* Short norm, 15 */ 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 div_s (Word16 var1, Word16 var2); /* Short division, 18 */ 86b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgardstatic_vo Word16 norm_l (Word32 L_var1); /* Long norm, 30 */ 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Functions | 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : add | 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Performs the addition (var1+var2) with overflow control and saturation;| 100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| the 16 bit result is set at +32767 when overflow occurs or at -32768 | 101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| when underflow occurs. | 102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 add (Word16 var1, Word16 var2) 127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_sum; 130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum = (Word32) var1 + var2; 131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = saturate (L_sum); 132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : sub | 138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Performs the subtraction (var1+var2) with overflow control and satu- | 142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| ration; the 16 bit result is set at +32767 when overflow occurs or at | 143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| -32768 when underflow occurs. | 144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 sub (Word16 var1, Word16 var2) 170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_diff; 173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_diff = (Word32) var1 - var2; 174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = saturate (L_diff); 175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : shl | 181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill| 185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| the var2 LSB of the result. If var2 is negative, arithmetically shift | 186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 right by -var2 with sign extension. Saturate the result in case of | 187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| underflows or overflows. | 188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 shl (Word16 var1, Word16 var2) 214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 result; 217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 < 0) 218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 < -16) 220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var2 = -16; 221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = var1 >> ((Word16)-var2); 222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 223e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 224e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 225e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard result = (Word32) var1 *((Word32) 1 << var2); 226e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result))) 227e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16); 229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = extract_l (result); 233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 235e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 236e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : shr | 241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Arithmetically shift the 16 bit input var1 right var2 positions with | 245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| sign extension. If var2 is negative, arithmetically shift var1 left by | 246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| -var2 with sign extension. Saturate the result in case of underflows or | 247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| overflows. | 248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 254e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 257e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 261e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 262e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 263e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 264e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 265e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 267e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 268e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 269e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 271e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 272e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 273e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 shr (Word16 var1, Word16 var2) 274e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 275e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 276e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 < 0) 277e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 278e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 < -16) 279e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var2 = -16; 280e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = shl(var1, (Word16)-var2); 281e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 282e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 283e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 284e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 >= 15) 285e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 286e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = (Word16)((var1 < 0) ? -1 : 0); 287e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 288e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 289e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 290e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var1 < 0) 291e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 292e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = (Word16)(~((~var1) >> var2)); 293e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 294e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 295e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 296e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = (Word16)(var1 >> var2); 297e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 298e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 299e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 300e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 301e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 302e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 303e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 304e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 305e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : mult | 306e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 307e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 308e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 309e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Performs the multiplication of var1 by var2 and gives a 16 bit result | 310e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| which is scaled i.e.: | 311e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and | 312e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| mult(-32768,-32768) = 32767. | 313e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 314e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 315e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 316e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 317e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 318e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 319e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 320e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 321e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 322e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 323e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 324e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 325e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 326e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 327e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 328e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 329e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 330e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 331e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 332e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 333e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 334e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 335e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 336e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 337e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 338e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 mult (Word16 var1, Word16 var2) 339e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 340e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 341e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_product; 342e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product = (Word32) var1 *(Word32) var2; 343e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product = (L_product & (Word32) 0xffff8000L) >> 15; 344e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_product & (Word32) 0x00010000L) 345e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product = L_product | (Word32) 0xffff0000L; 346e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = saturate (L_product); 347e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 348e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 349e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 350e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 351e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 352e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_mult | 353e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 354e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 355e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 356e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_mult is the 32 bit result of the multiplication of var1 times var2 | 357e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| with one shift left i.e.: | 358e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_mult(var1,var2) = L_shl((var1 times var2),1) and | 359e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_mult(-32768,-32768) = 2147483647. | 360e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 361e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 362e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 363e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 364e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 365e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 366e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 367e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 368e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 369e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 370e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 371e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 372e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 373e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 374e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 375e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 376e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 377e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 378e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 379e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 380e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 381e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 382e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 383e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 384e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 385e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_mult (Word16 var1, Word16 var2) 386e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 387e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out; 388e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = (Word32) var1 *(Word32) var2; 389e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var_out != (Word32) 0x40000000L) 390e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 391e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out *= 2; 392e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 393e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 394e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 395e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = MAX_32; 396e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 397e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 398e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 399e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 400e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 401e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 402e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : round | 403e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 404e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 405e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 406e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Round the lower 16 bits of the 32 bit input number into the MS 16 bits | 407e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| with saturation. Shift the resulting bits right by 16 and return the 16 | 408e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| bit number: | 409e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| round(L_var1) = extract_h(L_add(L_var1,32768)) | 410e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 411e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 412e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 413e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 414e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 415e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var1 | 416e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32 ) whose value falls in the | 417e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | 418e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 419e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 420e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 421e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 422e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 423e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 424e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 425e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 426e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 427e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 428e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 429e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 430e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 431e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 voround (Word32 L_var1) 432e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 433e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 434e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_rounded; 435e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_rounded = L_add (L_var1, (Word32) 0x00008000L); 436e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = extract_h (L_rounded); 437e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 438e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 439e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 440e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_mac | 443e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 444e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 445e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 446e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Multiply var1 by var2 and shift the result left by 1. Add the 32 bit | 447e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| result to L_var3 with saturation, return a 32 bit result: | 448e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)). | 449e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 450e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 451e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 452e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 453e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 454e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var3 32 bit long signed integer (Word32) whose value falls in the | 455e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 456e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 457e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 458e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 459e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 460e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 461e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 462e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 463e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 464e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 465e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 466e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 467e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 468e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 469e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 470e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 471e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 472e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 473e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 474e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 475e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 476e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 477e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2) 478e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 479e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out; 480e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_product; 481e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product = ((var1 * var2) << 1); 482e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_add (L_var3, L_product); 483e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 484e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 485e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 486e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 487e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 488e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_msu | 489e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 490e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 491e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 492e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Multiply var1 by var2 and shift the result left by 1. Subtract the 32 | 493e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| bit result to L_var3 with saturation, return a 32 bit result: | 494e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)). | 495e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 496e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 497e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 498e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 499e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 500e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var3 32 bit long signed integer (Word32) whose value falls in the | 501e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 502e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 503e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 504e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 505e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 506e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 507e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 508e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 509e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 510e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 511e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 512e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 513e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 514e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 515e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 516e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 517e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 518e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 519e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 520e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 521e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 522e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 523e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2) 524e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 525e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out; 526e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_product; 527e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product = (var1 * var2)<<1; 528e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_sub (L_var3, L_product); 529e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 530e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 531e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 532e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 533e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 534e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_add | 535e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 536e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 537e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 538e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bits addition of the two 32 bits variables (L_var1+L_var2) with | 539e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| overflow control and saturation; the result is set at +2147483647 when | 540e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| overflow occurs or at -2147483648 when underflow occurs. | 541e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 542e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 2 | 543e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 544e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 545e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 546e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var1 32 bit long signed integer (Word32) whose value falls in the | 547e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 548e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 549e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var2 32 bit long signed integer (Word32) whose value falls in the | 550e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 551e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 552e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 553e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 554e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 555e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 556e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 557e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 558e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 559e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 560e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 561e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 562e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 563e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 564e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_add (Word32 L_var1, Word32 L_var2) 565e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 566e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out; 567e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_var1 + L_var2; 568e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (((L_var1 ^ L_var2) & MIN_32) == 0) 569e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 570e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if ((L_var_out ^ L_var1) & MIN_32) 571e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 572e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32; 573e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 574e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 575e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 576e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 577e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 578e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 579e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 580e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_sub | 581e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 582e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 583e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 584e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with | 585e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| overflow control and saturation; the result is set at +2147483647 when | 586e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| overflow occurs or at -2147483648 when underflow occurs. | 587e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 588e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 2 | 589e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 590e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 591e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 592e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var1 32 bit long signed integer (Word32) whose value falls in the | 593e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 594e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 595e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var2 32 bit long signed integer (Word32) whose value falls in the | 596e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 597e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 598e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 599e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 600e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 601e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 602e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 603e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 604e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 605e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 606e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 607e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 608e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 609e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 610e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_sub (Word32 L_var1, Word32 L_var2) 611e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 612e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out; 613e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_var1 - L_var2; 614e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (((L_var1 ^ L_var2) & MIN_32) != 0) 615e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 616e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if ((L_var_out ^ L_var1) & MIN_32) 617e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 618e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32; 619e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 620e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 621e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 622e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 623e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 624e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 625e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 626e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 627e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : mult_r | 628e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 629e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 630e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 631e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Same as mult with rounding, i.e.: | 632e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and | 633e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| mult_r(-32768,-32768) = 32767. | 634e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 635e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 2 | 636e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 637e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 638e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 639e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 640e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 641e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 642e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 643e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 644e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 645e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 646e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 647e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 648e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 649e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 650e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 651e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 652e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 653e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 654e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 655e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 656e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 657e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 658e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 659e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 mult_r (Word16 var1, Word16 var2) 660e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 661e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 662e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_product_arr; 663e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product_arr = (Word32) var1 *(Word32) var2; /* product */ 664e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product_arr += (Word32) 0x00004000L; /* round */ 665e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product_arr &= (Word32) 0xffff8000L; 666e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product_arr >>= 15; /* shift */ 667e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_product_arr & (Word32) 0x00010000L) /* sign extend when necessary */ 668e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 669e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product_arr |= (Word32) 0xffff0000L; 670e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 671e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = saturate (L_product_arr); 672e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 673e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 674e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 675e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 676e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 677e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_shl | 678e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 679e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 680e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 681e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero | 682e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| fill the var2 LSB of the result. If var2 is negative, arithmetically | 683e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| shift L_var1 right by -var2 with sign extension. Saturate the result in | 684e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| case of underflows or overflows. | 685e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 686e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 2 | 687e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 688e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 689e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 690e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var1 32 bit long signed integer (Word32) whose value falls in the | 691e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 692e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 693e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 694e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 695e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 696e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 697e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 698e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 699e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 700e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 701e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 702e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 703e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 704e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 705e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 706e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 707e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 708e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 709e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_shl (Word32 L_var1, Word16 var2) 710e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 711e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out = 0L; 712e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 <= 0) 713e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 714e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 < -32) 715e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var2 = -32; 716e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = (L_var1 >> (Word16)-var2); 717e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 718e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 719e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 720e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (; var2 > 0; var2--) 721e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 722e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var1 > (Word32) 0X3fffffffL) 723e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 724e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = MAX_32; 725e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard break; 726e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 727e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 728e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 729e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var1 < (Word32) 0xc0000000L) 730e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 731e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard //Overflow = 1; 732e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = MIN_32; 733e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard break; 734e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 735e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 736e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var1 *= 2; 737e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_var1; 738e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 739e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 740e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 741e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 742e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 743e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_shl2(Word32 L_var1, Word16 var2) 744e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 745e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out = 0L; 746e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 747e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (; var2 > 0; var2--) 748e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 749e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var1 > (Word32) 0X3fffffffL) 750e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 751e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = MAX_32; 752e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard break; 753e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 754e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 755e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 756e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var1 < (Word32) 0xc0000000L) 757e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 758e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = MIN_32; 759e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard break; 760e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 761e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 762e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var1 <<=1 ; 763e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_var1; 764e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 765e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 766e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 767e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 768e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 769e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 770e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_shr | 771e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 772e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 773e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 774e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Arithmetically shift the 32 bit input L_var1 right var2 positions with | 775e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| sign extension. If var2 is negative, arithmetically shift L_var1 left | 776e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| by -var2 and zero fill the -var2 LSB of the result. Saturate the result | 777e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| in case of underflows or overflows. | 778e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 779e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 2 | 780e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 781e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 782e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 783e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var1 32 bit long signed integer (Word32) whose value falls in the | 784e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 785e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 786e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 787e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 788e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 789e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 790e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 791e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 792e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 793e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 794e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 795e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 796e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 797e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 798e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 799e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 800e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 801e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 802e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_shr (Word32 L_var1, Word16 var2) 803e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 804e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out; 805e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 < 0) 806e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 807e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 < -32) 808e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var2 = -32; 809e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_shl2(L_var1, (Word16)-var2); 810e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 811e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 812e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 813e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 >= 31) 814e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 815e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = (L_var1 < 0L) ? -1 : 0; 816e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 817e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 818e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 819e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var1 < 0) 820e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 821e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = ~((~L_var1) >> var2); 822e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 823e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 824e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 825e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_var1 >> var2; 826e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 827e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 828e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 829e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 830e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 831e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 832e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 833e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 834e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_shr_r | 835e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 836e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 837e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 838e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Same as L_shr(L_var1,var2) but with rounding. Saturate the result in | 839e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| case of underflows or overflows : | 840e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| - If var2 is greater than zero : | 841e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))| 842e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| is equal to zero | 843e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| then | 844e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_shr_r(L_var1,var2) = L_shr(L_var1,var2) | 845e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| else | 846e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1) | 847e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| - If var2 is less than or equal to zero : | 848e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_shr_r(L_var1,var2) = L_shr(L_var1,var2). | 849e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 850e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 3 | 851e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 852e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 853e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 854e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var1 | 855e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 856e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= var1 <= 0x7fff ffff. | 857e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 858e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 859e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 860e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 861e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 862e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 863e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 864e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 865e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 866e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 867e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 868e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 869e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 870e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= var_out <= 0x7fff ffff. | 871e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 872e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 873e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 874e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_shr_r (Word32 L_var1, Word16 var2) 875e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 876e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out; 877e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 > 31) 878e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 879e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = 0; 880e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 881e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 882e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 883e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_shr (L_var1, var2); 884e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 > 0) 885e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 886e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0) 887e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 888e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out++; 889e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 890e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 891e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 892e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 893e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 894e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 895e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 896e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 897e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : norm_s | 898e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 899e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 900e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 901e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Produces the number of left shift needed to normalize the 16 bit varia- | 902e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| ble var1 for positive values on the interval with minimum of 16384 and | 903e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| maximum of 32767, and for negative values on the interval with minimum | 904e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| of -32768 and maximum of -16384; in order to normalize the result, the | 905e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| following operation must be done : | 906e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| norm_var1 = shl(var1,norm_s(var1)). | 907e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 908e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 15 | 909e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 910e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 911e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 912e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 913e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 914e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 915e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 916e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 917e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 918e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 919e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 920e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 921e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 922e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 923e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 924e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x0000 0000 <= var_out <= 0x0000 000f. | 925e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 926e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 927e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 928e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 norm_s (Word16 var1) 929e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 930e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out = 0; 931e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var1 == 0) 932e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 933e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = 0; 934e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 935e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 936e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 937e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var1 == -1) 938e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 939e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = 15; 940e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 941e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 942e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 943e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var1 < 0) 944e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 945e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var1 = (Word16)~var1; 946e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 947e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (var_out = 0; var1 < 0x4000; var_out++) 948e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 949e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var1 <<= 1; 950e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 951e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 952e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 953e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 954e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 955e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 956e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 957e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 958e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : div_s | 959e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 960e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 961e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 962e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Produces a result which is the fractional integer division of var1 by | 963e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2; var1 and var2 must be positive and var2 must be greater or equal | 964e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| to var1; the result is positive (leading bit equal to 0) and truncated | 965e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| to 16 bits. | 966e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| If var1 = var2 then div(var1,var2) = 32767. | 967e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 968e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 18 | 969e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 970e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 971e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 972e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 973e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 974e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x0000 0000 <= var1 <= var2 and var2 != 0. | 975e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 976e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 977e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 978e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : var1 <= var2 <= 0x0000 7fff and var2 != 0. | 979e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 980e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 981e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 982e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 983e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 984e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 985e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 986e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 987e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 988e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x0000 0000 <= var_out <= 0x0000 7fff. | 989e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| It's a Q15 value (point between b15 and b14). | 990e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 991e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 992e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 993e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 div_s (Word16 var1, Word16 var2) 994e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 995e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out = 0; 996e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 iteration; 997e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_num; 998e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_denom; 999e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if ((var1 < 0) || (var2 < 0)) 1000e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1001e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = MAX_16; 1002e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return var_out; 1003e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1004e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 == 0) 1005e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1006e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = MAX_16; 1007e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return var_out; 1008e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1009e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var1 == 0) 1010e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1011e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = 0; 1012e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1013e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 1014e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1015e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var1 == var2) 1016e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1017e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = MAX_16; 1018e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1019e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 1020e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1021e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_num = L_deposit_l (var1); 1022e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_denom = L_deposit_l(var2); 1023e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (iteration = 0; iteration < 15; iteration++) 1024e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1025e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out <<= 1; 1026e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_num <<= 1; 1027e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_num >= L_denom) 1028e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1029b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard L_num -= L_denom; 1030b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard var_out += 1; 1031e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1032e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1033e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1034e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1035e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 1036e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 1037e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1038e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 1039e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1040e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : norm_l | 1041e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1042e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 1043e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1044e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Produces the number of left shifts needed to normalize the 32 bit varia-| 1045e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| ble L_var1 for positive values on the interval with minimum of | 1046e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 1073741824 and maximum of 2147483647, and for negative values on the in-| 1047e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| terval with minimum of -2147483648 and maximum of -1073741824; in order | 1048e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| to normalize the result, the following operation must be done : | 1049e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| norm_L_var1 = L_shl(L_var1,norm_l(L_var1)). | 1050e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1051e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 30 | 1052e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1053e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 1054e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1055e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var1 | 1056e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 1057e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= var1 <= 0x7fff ffff. | 1058e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1059e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 1060e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1061e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 1062e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1063e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 1064e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1065e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 1066e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 1067e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x0000 0000 <= var_out <= 0x0000 001f. | 1068e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 1069e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 1070e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1071e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 norm_l (Word32 L_var1) 1072e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 1073e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out = 0; 1074e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var1 != 0) 1075e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1076e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = 31; 1077e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var1 != (Word32) 0xffffffffL) 1078e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1079e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var1 ^= (L_var1 >>31); 1080e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++) 1081e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1082e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var1 <<= 1; 1083e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1084e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1085e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1086e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 1087e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 1088e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1089e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif //__BASIC_OP_H__ 1090e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1091