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 File: basicop2.c 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 19b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard Content: Basic arithmetic operators. 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*******************************************************************************/ 22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 23956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "typedef.h" 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h" 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Functions | 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : saturate | 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Limit the 32 bit input to the range of a 16 bit word. | 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var1 | 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | 46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!SATRUATE_IS_INLINE) 60e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 saturate(Word32 L_var1) 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var1 > 0X00007fffL) 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = MAX_16; 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else if (L_var1 < (Word32) 0xffff8000L) 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = MIN_16; 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = extract_l(L_var1); 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : add | 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Performs the addition (var1+var2) with overflow control and saturation;| 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | the 16 bit result is set at +32767 when overflow occurs or at -32768 | 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | when underflow occurs. | 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 1 | 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!ADD_IS_INLINE) 116e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 add (Word16 var1, Word16 var2) 117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_sum; 120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_sum = (Word32)var1 + (Word32)var2; 122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = saturate(L_sum); 123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : sub | 131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Performs the subtraction (var1+var2) with overflow control and satu- | 135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | ration; the 16 bit result is set at +32767 when overflow occurs or at | 136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | -32768 when underflow occurs. | 137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 1 | 139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!SUB_IS_INLINE) 162e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 sub(Word16 var1, Word16 var2) 163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_diff; 166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_diff = (Word32) var1 - var2; 168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = saturate(L_diff); 169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : abs_s | 177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Absolute value of var1; abs_s(-32768) = 32767. | 181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 1 | 183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x0000 0000 <= var_out <= 0x0000 7fff. | 199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//Word16 abs_s (Word16 var1) 202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//{ 203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// Word16 var_out; 204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// 205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// if (var1 == MIN_16) 206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// { 207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// var_out = MAX_16; 208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// } 209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// else 210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// { 211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// if (var1 < 0) 212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// { 213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// var_out = (Word16)-var1; 214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// } 215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// else 216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// { 217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// var_out = var1; 218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// } 219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// } 220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// 221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// return (var_out); 222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//} 223e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 224e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 225e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 226e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 227e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : shl | 228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill| 232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | the var2 LSB of the result. If var2 is negative, arithmetically shift | 233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 right by -var2 with sign extension. Saturate the result in case of | 234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | underflows or overflows. | 235e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 236e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 1 | 237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 254e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 257e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!SHL_IS_INLINE) 261e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 shl (Word16 var1, Word16 var2) 262e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 263e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 264e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 result; 265e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 < 0) 267e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 268e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 < -16) 269e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var2 = -16; 270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = shr (var1, (Word16)-var2); 271e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 272e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 273e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 274e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard result = (Word32) var1 *((Word32) 1 << var2); 275e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 276e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result))) 277e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 278e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard //Overflow = 1; 279e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16); 280e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 281e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 282e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 283e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = extract_l(result); 284e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 285e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 286e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 287e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 288e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 289e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 290e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// end 291e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 292e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 293e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 294e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : shr | 295e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 296e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 297e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 298e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Arithmetically shift the 16 bit input var1 right var2 positions with | 299e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | sign extension. If var2 is negative, arithmetically shift var1 left by | 300e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | -var2 with sign extension. Saturate the result in case of underflows or | 301e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | overflows. | 302e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 303e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 1 | 304e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 305e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 306e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 307e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 308e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 309e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 310e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 311e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 312e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 313e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 314e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 315e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 316e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 317e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 318e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 319e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 320e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 321e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 322e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 323e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 324e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 325e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 326e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 327e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!SHR_IS_INLINE) 328e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 shr (Word16 var1, Word16 var2) 329e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 330e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 331e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 332e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 < 0) 333e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 334e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 < -16) 335e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var2 = -16; 336e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = shl (var1, (Word16)-var2); 337e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 338e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 339e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 340e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 >= 15) 341e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 342e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = (Word16)((var1 < 0) ? -1 : 0); 343e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 344e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 345e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 346e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var1 < 0) 347e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 348e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = (Word16)(~((~var1) >> var2)); 349e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 350e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 351e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 352e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = (Word16)(var1 >> var2); 353e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 354e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 355e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 356e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 357e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 358e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 359e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 360e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 361e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 362e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 363e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 364e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : mult | 365e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 366e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 367e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 368e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Performs the multiplication of var1 by var2 and gives a 16 bit result | 369e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | which is scaled i.e.: | 370e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and | 371e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | mult(-32768,-32768) = 32767. | 372e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 373e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 1 | 374e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 375e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 376e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 377e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 378e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 379e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 380e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 381e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 382e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 383e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 384e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 385e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 386e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 387e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 388e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 389e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 390e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 391e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 392e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 393e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 394e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 395e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 396e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!MULT_IS_INLINE) 397e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 mult (Word16 var1, Word16 var2) 398e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 399e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 400e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_product; 401e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 402e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product = (Word32) var1 *(Word32) var2; 403e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 404e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product = (L_product & (Word32) 0xffff8000L) >> 15; 405e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 406e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_product & (Word32) 0x00010000L) 407e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product = L_product | (Word32) 0xffff0000L; 408e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 409e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = saturate(L_product); 410e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 411e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 412e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 413e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 414e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 415e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 416e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 417e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : L_mult | 418e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 419e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 420e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 421e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_mult is the 32 bit result of the multiplication of var1 times var2 | 422e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | with one shift left i.e.: | 423e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_mult(var1,var2) = L_shl((var1 times var2),1) and | 424e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_mult(-32768,-32768) = 2147483647. | 425e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 426e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 1 | 427e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 428e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 429e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 430e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 431e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 432e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 433e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 434e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 435e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 436e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 437e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 438e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 439e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 440e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 443e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 444e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var_out | 445e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 446e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 447e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 448e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 449e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 450e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!L_MULT_IS_INLINE) 451e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_mult(Word16 var1, Word16 var2) 452e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 453e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out; 454e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 455e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = (Word32) var1 *(Word32) var2; 456e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 457e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var_out != (Word32) 0x40000000L) 458e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 459e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out <<= 1; 460e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 461e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 462e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 463e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = MAX_32; 464e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 465b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 466e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 467e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 468e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 469e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// end 470e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 471e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 472e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 473e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : negate | 474e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 475e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 476e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 477e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Negate var1 with saturation, saturate in the case where input is -32768:| 478e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | negate(var1) = sub(0,var1). | 479e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 480e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 1 | 481e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 482e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 483e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 484e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 485e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 486e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 487e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 488e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 489e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 490e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 491e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 492e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 493e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 494e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 495e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 496e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 497e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 498e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 499e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//Word16 negate (Word16 var1) 500e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//{ 501e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// Word16 var_out; 502e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// 503e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// var_out = (Word16)((var1 == MIN_16) ? MAX_16 : -var1); 504e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// 505e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// return (var_out); 506e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//} 507e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 508e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 509e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 510e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 511e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : extract_h | 512e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 513e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 514e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 515e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return the 16 MSB of L_var1. | 516e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 517e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 1 | 518e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 519e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 520e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 521e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var1 | 522e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32 ) whose value falls in the | 523e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | 524e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 525e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 526e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 527e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 528e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 529e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 530e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 531e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 532e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 533e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 534e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 535e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 536e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!EXTRACT_H_IS_INLINE) 537e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 extract_h (Word32 L_var1) 538e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 539e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 540e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 541e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = (Word16) (L_var1 >> 16); 542e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 543e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 544e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 545e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 546e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 547e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 548e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 549e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : extract_l | 550e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 551e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 552e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 553e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return the 16 LSB of L_var1. | 554e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 555e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 1 | 556e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 557e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 558e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 559e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var1 | 560e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32 ) whose value falls in the | 561e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | 562e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 563e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 564e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 565e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 566e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 567e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 568e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 569e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 570e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 571e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 572e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 573e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 574e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!EXTRACT_L_IS_INLINE) 575e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 extract_l(Word32 L_var1) 576e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 577e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 578e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 579e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = (Word16) L_var1; 580e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 581e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 582e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 583e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 584e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 585e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 586e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 587e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : round | 588e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 589e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 590e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 591e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Round the lower 16 bits of the 32 bit input number into the MS 16 bits | 592e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | with saturation. Shift the resulting bits right by 16 and return the 16 | 593e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | bit number: | 594e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | round(L_var1) = extract_h(L_add(L_var1,32768)) | 595e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 596e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 1 | 597e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 598e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 599e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 600e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var1 | 601e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32 ) whose value falls in the | 602e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | 603e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 604e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 605e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 606e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 607e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 608e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 609e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 610e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 611e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 612e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 613e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 614e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 615e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 616e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!ROUND_IS_INLINE) 617e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 round16(Word32 L_var1) 618e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 619e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 620e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_rounded; 621e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 622e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_rounded = L_add (L_var1, (Word32) 0x00008000L); 623e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = extract_h (L_rounded); 624e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 625e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 626e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 627e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 628e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// end 629e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 630e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 631e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 632e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : L_mac | 633e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 634e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 635e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 636e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Multiply var1 by var2 and shift the result left by 1. Add the 32 bit | 637e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | result to L_var3 with saturation, return a 32 bit result: | 638e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)). | 639e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 640e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 1 | 641e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 642e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 643e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 644e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var3 32 bit long signed integer (Word32) whose value falls in the | 645e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 646e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 647e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 648e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 649e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 650e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 651e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 652e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 653e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 654e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 655e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 656e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 657e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 658e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 659e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 660e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 661e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var_out | 662e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 663e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 664e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 665e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 666e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!L_MSU_IS_INLINE) 667e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_mac (Word32 L_var3, Word16 var1, Word16 var2) 668e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 669e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out; 670e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_product; 671e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 672e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product = L_mult(var1, var2); 673e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_add (L_var3, L_product); 674e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 675e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 676e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 677e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 678e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 679e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 680e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 681e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : L_msu | 682e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 683e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 684e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 685e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Multiply var1 by var2 and shift the result left by 1. Subtract the 32 | 686e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | bit result to L_var3 with saturation, return a 32 bit result: | 687e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)). | 688e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 689e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 1 | 690e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 691e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 692e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 693e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var3 32 bit long signed integer (Word32) whose value falls in the | 694e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 695e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 696e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 697e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 698e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 699e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 700e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 701e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 702e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 703e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 704e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 705e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 706e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 707e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 708e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 709e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 710e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var_out | 711e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 712e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 713e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 714e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 715e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 716e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!L_MSU_IS_INLINE) 717e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_msu (Word32 L_var3, Word16 var1, Word16 var2) 718e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 719e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out; 720e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_product; 721e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 722e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product = L_mult(var1, var2); 723e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_sub (L_var3, L_product); 724e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 725e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 726e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 727e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 728e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 729e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 730e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 731e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 732e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : L_add | 733e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 734e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 735e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 736e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bits addition of the two 32 bits variables (L_var1+L_var2) with | 737e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | overflow control and saturation; the result is set at +2147483647 when | 738e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | overflow occurs or at -2147483648 when underflow occurs. | 739e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 740e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 2 | 741e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 742e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 743e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 744e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var1 32 bit long signed integer (Word32) whose value falls in the | 745e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 746e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 747e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var2 32 bit long signed integer (Word32) whose value falls in the | 748e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 749e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 750e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 751e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 752e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 753e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 754e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 755e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 756e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var_out | 757e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 758e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 759e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 760e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 761e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!L_ADD_IS_INLINE) 762e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_add (Word32 L_var1, Word32 L_var2) 763e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 764e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out; 765e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 766e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_var1 + L_var2; 767e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 768e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (((L_var1 ^ L_var2) & MIN_32) == 0) 769e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 770e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if ((L_var_out ^ L_var1) & MIN_32) 771e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 772e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32; 773e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard //Overflow = 1; 774e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 775e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 776e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 777e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 778e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 779e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 780e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 781e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 782e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 783e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : L_sub | 784e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 785e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 786e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 787e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with | 788e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | overflow control and saturation; the result is set at +2147483647 when | 789e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | overflow occurs or at -2147483648 when underflow occurs. | 790e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 791e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 2 | 792e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 793e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 794e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 795e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var1 32 bit long signed integer (Word32) whose value falls in the | 796e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 797e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 798e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var2 32 bit long signed integer (Word32) whose value falls in the | 799e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 800e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 801e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 802e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 803e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 804e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 805e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 806e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 807e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var_out | 808e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 809e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 810e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 811e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 812e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!L_SUB_IS_INLINE) 813e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_sub(Word32 L_var1, Word32 L_var2) 814e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 815e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out; 816e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 817e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_var1 - L_var2; 818e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 819e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (((L_var1 ^ L_var2) & MIN_32) != 0) 820e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 821e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if ((L_var_out ^ L_var1) & MIN_32) 822e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 823e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32; 824e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard //Overflow = 1; 825e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 826e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 827e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 828e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 829e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 830e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 831e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 832e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 833e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 834e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 835e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : L_negate | 836e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 837e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 838e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 839e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Negate the 32 bit variable L_var1 with saturation; saturate in the case | 840e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | where input is -2147483648 (0x8000 0000). | 841e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 842e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 2 | 843e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 844e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 845e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 846e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var1 32 bit long signed integer (Word32) whose value falls in the | 847e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 848e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 849e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 850e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 851e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 852e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 853e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 854e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 855e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var_out | 856e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 857e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 858e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 859e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 860e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//Word32 L_negate (Word32 L_var1) 861e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//{ 862e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// Word32 L_var_out; 863e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// 864e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// L_var_out = (L_var1 == MIN_32) ? MAX_32 : -L_var1; 865e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// 866e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// return (L_var_out); 867e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//} 868e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 869e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 870e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 871e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 872e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : mult_r | 873e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 874e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 875e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 876e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Same as mult with rounding, i.e.: | 877e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and | 878e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | mult_r(-32768,-32768) = 32767. | 879e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 880e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 2 | 881e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 882e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 883e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 884e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 885e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 886e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 887e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 888e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 889e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 890e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 891e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 892e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 893e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 894e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 895e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 896e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 897e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 898e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 899e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 900e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 901e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 902e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 903e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!MULT_R_IS_INLINE) 904e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 mult_r (Word16 var1, Word16 var2) 905e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 906e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 907e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_product_arr; 908e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 909e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product_arr = (Word32) var1 *(Word32) var2; /* product */ 910e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product_arr += (Word32) 0x00004000L; /* round */ 911e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product_arr &= (Word32) 0xffff8000L; 912e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product_arr >>= 15; /* shift */ 913e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 914e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_product_arr & (Word32) 0x00010000L) /* sign extend when necessary */ 915e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 916e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_product_arr |= (Word32) 0xffff0000L; 917e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 918e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = saturate(L_product_arr); 919e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 920e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 921e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 922e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 923e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 924e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 925e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 926e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : L_shl | 927e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 928e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 929e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 930e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero | 931e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | fill the var2 LSB of the result. If var2 is negative, arithmetically | 932e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | shift L_var1 right by -var2 with sign extension. Saturate the result in | 933e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | case of underflows or overflows. | 934e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 935e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 2 | 936e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 937e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 938e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 939e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var1 32 bit long signed integer (Word32) whose value falls in the | 940e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 941e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 942e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 943e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 944e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 945e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 946e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 947e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 948e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 949e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 950e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 951e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 952e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var_out | 953e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 954e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 955e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 956e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 957e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 958e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!L_SHL_IS_INLINE) 959e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_shl (Word32 L_var1, Word16 var2) 960e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 961e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out = 0L; 962e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 963e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 <= 0) 964e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 965e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var1 = L_shr(L_var1, (Word16)-var2); 966e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 967e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 968e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 969e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (; var2 > 0; var2--) 970e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 971e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var1 > (Word32) 0X3fffffffL) 972e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 973e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return MAX_32; 974e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 975e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 976e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 977e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var1 < (Word32) 0xc0000000L) 978e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 979e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return MIN_32; 980e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 981e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 982e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var1 <<= 1; 983e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 984e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 985e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var1); 986e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 987e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 988e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 989e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 990e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 991e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : L_shr | 992e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 993e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 994e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 995e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Arithmetically shift the 32 bit input L_var1 right var2 positions with | 996e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | sign extension. If var2 is negative, arithmetically shift L_var1 left | 997e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | by -var2 and zero fill the -var2 LSB of the result. Saturate the result | 998e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | in case of underflows or overflows. | 999e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1000e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 2 | 1001e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1002e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 1003e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1004e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var1 32 bit long signed integer (Word32) whose value falls in the | 1005e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 1006e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1007e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 1008e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1009e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 1010e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1011e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 1012e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1013e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 1014e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1015e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 1016e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1017e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var_out | 1018e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 1019e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 1020e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 1021e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 1022e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1023e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!L_SHR_IS_INLINE) 1024e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_shr (Word32 L_var1, Word16 var2) 1025e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 1026e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out; 1027e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1028e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 < 0) 1029e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1030e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_shl (L_var1, (Word16)-var2); 1031e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1032e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 1033e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1034e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 >= 31) 1035e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1036e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = (L_var1 < 0L) ? -1 : 0; 1037e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1038e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 1039e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1040e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var1 < 0) 1041e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1042e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = ~((~L_var1) >> var2); 1043e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1044e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 1045e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1046e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_var1 >> var2; 1047e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1048e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1049e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1050e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 1051e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 1052e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 1053e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1054e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 1055e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1056e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : shr_r | 1057e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1058e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 1059e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1060e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Same as shr(var1,var2) but with rounding. Saturate the result in case of| 1061e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | underflows or overflows : | 1062e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | - If var2 is greater than zero : | 1063e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | if (sub(shl(shr(var1,var2),1),shr(var1,sub(var2,1)))) | 1064e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | is equal to zero | 1065e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | then | 1066e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | shr_r(var1,var2) = shr(var1,var2) | 1067e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | else | 1068e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | shr_r(var1,var2) = add(shr(var1,var2),1) | 1069e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | - If var2 is less than or equal to zero : | 1070e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | shr_r(var1,var2) = shr(var1,var2). | 1071e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1072e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 2 | 1073e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1074e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 1075e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1076e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 1077e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1078e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 1079e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1080e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 1081e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1082e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 1083e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1084e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 1085e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1086e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 1087e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1088e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 1089e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1090e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 1091e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1092e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 1093e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 1094e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 1095e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!SHR_R_IS_INLINE) 1096e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 shr_r (Word16 var1, Word16 var2) 1097e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 1098e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 1099e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 > 15) 1101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = 0; 1103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 1105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = shr (var1, var2); 1107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 > 0) 1109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if ((var1 & ((Word16) 1 << (var2 - 1))) != 0) 1111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out++; 1113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 1118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 1119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 1120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 1122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : mac_r | 1124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 1126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Multiply var1 by var2 and shift the result left by 1. Add the 32 bit | 1128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | result to L_var3 with saturation. Round the LS 16 bits of the result | 1129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | into the MS 16 bits with saturation and shift the result right by 16. | 1130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return a 16 bit result. | 1131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | mac_r(L_var3,var1,var2) = round(L_mac(L_var3,var1,var2)) | 1132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 2 | 1134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 1136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var3 32 bit long signed integer (Word32) whose value falls in the | 1138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 1139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 1141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 1143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 1145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 1147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 1149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 1151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 1153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 1155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x0000 8000 <= L_var_out <= 0x0000 7fff. | 1157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 1158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 1159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!MAC_R_IS_INLINE) 1160e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 mac_r (Word32 L_var3, Word16 var1, Word16 var2) 1161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 1162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 1163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var3 = L_mac (L_var3, var1, var2); 1165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var3 = L_add (L_var3, (Word32) 0x00008000L); 1166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = extract_h (L_var3); 1167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 1169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 1170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 1171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 1173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : msu_r | 1175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 1177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Multiply var1 by var2 and shift the result left by 1. Subtract the 32 | 1179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | bit result to L_var3 with saturation. Round the LS 16 bits of the res- | 1180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | ult into the MS 16 bits with saturation and shift the result right by | 1181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16. Return a 16 bit result. | 1182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | msu_r(L_var3,var1,var2) = round(L_msu(L_var3,var1,var2)) | 1183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 2 | 1185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 1187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var3 32 bit long signed integer (Word32) whose value falls in the | 1189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 1190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 1192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 1194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 1196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 1198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 1200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 1202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 1204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 1206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x0000 8000 <= L_var_out <= 0x0000 7fff. | 1208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 1209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 1210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!MSU_R_IS_INLINE) 1211e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 msu_r (Word32 L_var3, Word16 var1, Word16 var2) 1212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 1213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 1214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var3 = L_msu (L_var3, var1, var2); 1216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var3 = L_add (L_var3, (Word32) 0x00008000L); 1217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = extract_h (L_var3); 1218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 1220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 1221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 1222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1223e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 1224e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1225e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : L_deposit_h | 1226e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1227e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 1228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Deposit the 16 bit var1 into the 16 MS bits of the 32 bit output. The | 1230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 LS bits of the output are zeroed. | 1231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 2 | 1233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 1235e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1236e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 1237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 1239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 1241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 1243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 1245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var_out | 1247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 1248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= var_out <= 0x7fff 0000. | 1249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 1250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 1251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//Word32 L_deposit_h (Word16 var1) 1252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//{ 1253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// Word32 L_var_out; 1254e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// 1255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// L_var_out = (Word32) var1 << 16; 1256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// 1257e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// return (L_var_out); 1258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//} 1259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1261e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 1262e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1263e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : L_deposit_l | 1264e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1265e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 1266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1267e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Deposit the 16 bit var1 into the 16 LS bits of the 32 bit output. The | 1268e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 MS bits of the output are sign extended. | 1269e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 2 | 1271e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1272e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 1273e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1274e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 1275e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1276e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 1277e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1278e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 1279e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1280e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 1281e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1282e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 1283e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1284e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var_out | 1285e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 1286e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xFFFF 8000 <= var_out <= 0x0000 7fff. | 1287e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 1288e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 1289e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//Word32 L_deposit_l (Word16 var1) 1290e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//{ 1291e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// Word32 L_var_out; 1292e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// 1293e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// L_var_out = (Word32) var1; 1294e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// 1295e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// return (L_var_out); 1296e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//} 1297e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1298e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1299e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 1300e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1301e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : L_shr_r | 1302e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1303e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 1304e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1305e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Same as L_shr(L_var1,var2) but with rounding. Saturate the result in | 1306e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | case of underflows or overflows : | 1307e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | - If var2 is greater than zero : | 1308e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))| 1309e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | is equal to zero | 1310e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | then | 1311e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_shr_r(L_var1,var2) = L_shr(L_var1,var2) | 1312e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | else | 1313e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1) | 1314e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | - If var2 is less than or equal to zero : | 1315e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_shr_r(L_var1,var2) = L_shr(L_var1,var2). | 1316e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1317e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 3 | 1318e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1319e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 1320e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1321e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var1 | 1322e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 1323e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= var1 <= 0x7fff ffff. | 1324e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1325e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 1326e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1327e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 1328e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1329e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 1330e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1331e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 1332e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1333e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 1334e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1335e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var_out | 1336e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 1337e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= var_out <= 0x7fff ffff. | 1338e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 1339e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 1340e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!L_SHR_R_IS_INLINE) 1341e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord32 L_shr_r (Word32 L_var1, Word16 var2) 1342e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 1343e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_var_out; 1344e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1345e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 > 31) 1346e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1347e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = 0; 1348e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1349e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 1350e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1351e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out = L_shr (L_var1, var2); 1352e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1353e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var2 > 0) 1354e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1355e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0) 1356e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1357e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var_out++; 1358e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1359e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1360e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1361e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1362e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (L_var_out); 1363e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 1364e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 1365e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1366e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 1367e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1368e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : L_abs | 1369e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1370e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 1371e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1372e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Absolute value of L_var1; Saturate in case where the input is | 1373e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | -214783648 | 1374e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1375e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 3 | 1376e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1377e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 1378e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1379e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var1 | 1380e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 1381e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= var1 <= 0x7fff ffff. | 1382e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1383e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 1384e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1385e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 1386e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1387e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 1388e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1389e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var_out | 1390e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 1391e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x0000 0000 <= var_out <= 0x7fff ffff. | 1392e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 1393e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 1394e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//Word32 L_abs (Word32 L_var1) 1395e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//{ 1396e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// Word32 L_var_out; 1397e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// 1398e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// if (L_var1 == MIN_32) 1399e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// { 1400e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// L_var_out = MAX_32; 1401e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// } 1402e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// else 1403e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// { 1404e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// if (L_var1 < 0) 1405e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// { 1406e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// L_var_out = -L_var1; 1407e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// } 1408e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// else 1409e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// { 1410e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// L_var_out = L_var1; 1411e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// } 1412e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// } 1413e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// 1414e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// return (L_var_out); 1415e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard//} 1416e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1417e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 1418e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1419e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : norm_s | 1420e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1421e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 1422e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1423e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Produces the number of left shift needed to normalize the 16 bit varia- | 1424e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | ble var1 for positive values on the interval with minimum of 16384 and | 1425e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | maximum of 32767, and for negative values on the interval with minimum | 1426e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | of -32768 and maximum of -16384; in order to normalize the result, the | 1427e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | following operation must be done : | 1428e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | norm_var1 = shl(var1,norm_s(var1)). | 1429e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1430e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 15 | 1431e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1432e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 1433e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1434e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 1435e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1436e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 1437e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1438e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 1439e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1440e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 1441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 1443e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1444e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 1445e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1446e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x0000 0000 <= var_out <= 0x0000 000f. | 1447e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 1448e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 1449e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1450e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!NORM_S_IS_INLINE) 1451e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 norm_s (Word16 var1) 1452e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 1453e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 1454e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1455e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var1 == 0) 1456e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1457e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = 0; 1458e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1459e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 1460e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1461e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var1 == -1) 1462e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1463e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = 15; 1464e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1465e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 1466e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1467e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var1 < 0) 1468e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1469e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var1 = (Word16)~var1; 1470e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1471e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (var_out = 0; var1 < 0x4000; var_out++) 1472e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1473e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var1 <<= 1; 1474e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1475e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1476e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1477e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1478e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 1479e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 1480e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 1481e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1482e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 1483e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1484e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : div_s | 1485e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1486e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 1487e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1488e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Produces a result which is the fractional integer division of var1 by | 1489e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2; var1 and var2 must be positive and var2 must be greater or equal | 1490e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | to var1; the result is positive (leading bit equal to 0) and truncated | 1491e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | to 16 bits. | 1492e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | If var1 = var2 then div(var1,var2) = 32767. | 1493e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1494e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 18 | 1495e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1496e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 1497e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1498e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var1 | 1499e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1500e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x0000 0000 <= var1 <= var2 and var2 != 0. | 1501e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1502e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var2 | 1503e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1504e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : var1 <= var2 <= 0x0000 7fff and var2 != 0. | 1505e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1506e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 1507e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1508e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 1509e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1510e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 1511e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1512e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 1513e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1514e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x0000 0000 <= var_out <= 0x0000 7fff. | 1515e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | It's a Q15 value (point between b15 and b14). | 1516e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 1517e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 1518e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1519e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!DIV_S_IS_INLINE) 1520e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 div_s (Word16 var1, Word16 var2) 1521e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 1522e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out = 0; 1523e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 iteration; 1524e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_num; 1525e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 L_denom; 1526e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1527e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var1 == 0) 1528e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1529e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = 0; 1530e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1531e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 1532e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1533e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (var1 == var2) 1534e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1535e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = MAX_16; 1536e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1537e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 1538e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1539e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_num = L_deposit_l (var1); 1540e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_denom = L_deposit_l (var2); 1541e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1542e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (iteration = 0; iteration < 15; iteration++) 1543e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1544e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out <<= 1; 1545e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_num <<= 1; 1546e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1547e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_num >= L_denom) 1548e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1549e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_num = L_sub(L_num, L_denom); 1550e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = add (var_out, 1); 1551e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1552e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1553e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1554e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1555e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1556e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 1557e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 1558e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 1559e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1560e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 1561e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1562e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Function Name : norm_l | 1563e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1564e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Purpose : | 1565e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1566e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Produces the number of left shifts needed to normalize the 32 bit varia-| 1567e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | ble L_var1 for positive values on the interval with minimum of | 1568e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 1073741824 and maximum of 2147483647, and for negative values on the in-| 1569e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | terval with minimum of -2147483648 and maximum of -1073741824; in order | 1570e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | to normalize the result, the following operation must be done : | 1571e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | norm_L_var1 = L_shl(L_var1,norm_l(L_var1)). | 1572e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1573e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Complexity weight : 30 | 1574e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1575e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Inputs : | 1576e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1577e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | L_var1 | 1578e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 32 bit long signed integer (Word32) whose value falls in the | 1579e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x8000 0000 <= var1 <= 0x7fff ffff. | 1580e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1581e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Outputs : | 1582e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1583e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | none | 1584e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1585e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | Return Value : | 1586e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | | 1587e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | var_out | 1588e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | 16 bit short signed integer (Word16) whose value falls in the | 1589e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard | range : 0x0000 0000 <= var_out <= 0x0000 001f. | 1590e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard |___________________________________________________________________________| 1591e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 1592e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1593e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#if (!NORM_L_IS_INLINE) 1594e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 norm_l (Word32 L_var1) 1595e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 1596e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 var_out; 1597e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1598e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var1 == 0) 1599e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1600e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = 0; 1601e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1602e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 1603e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1604e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var1 == (Word32) 0xffffffffL) 1605e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1606e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard var_out = 31; 1607e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1608e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 1609e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1610e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (L_var1 < 0) 1611e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1612e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var1 = ~L_var1; 1613e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1614e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++) 1615e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 1616e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_var1 <<= 1; 1617e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1618e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1619e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 1620e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1621e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (var_out); 1622e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 1623e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 1624956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 1625