1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* 2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc. 3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License"); 5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License. 6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at 7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** http://www.apache.org/licenses/LICENSE-2.0 9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software 11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS, 12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and 14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License. 15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */ 16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifndef __BASIC_OP_H__ 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define __BASIC_OP_H__ 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <stdio.h> 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <stdlib.h> 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h" 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define MAX_32 (Word32)0x7fffffffL 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define MIN_32 (Word32)0x80000000L 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define MAX_16 (Word16)+32767 /* 0x7fff */ 295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define MIN_16 (Word16)-32768 /* 0x8000 */ 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define static_vo static __inline 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define saturate(L_var1) (((L_var1) > 0X00007fffL) ? (MAX_16): (((L_var1) < (Word32) 0xffff8000L) ? (MIN_16): ((L_var1) & 0xffff))) 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define abs_s(x) ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16)) /* Short abs, 1 */ 37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define L_deposit_h(x) (((Word32)(x)) << 16) /* 16 bit var1 -> MSB, 2 */ 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define L_deposit_l(x) ((Word32)(x)) /* 16 bit var1 -> LSB, 2 */ 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32) /* Long abs, 3*/ 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1)))) /* Short negate, 1*/ 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1))) /* Long negate, 2*/ 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define extract_h(a) ((Word16)(a >> 16)) 455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define extract_l(x) (Word16)((x)) 465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define add1(a,b) (a + b) 475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define vo_L_msu(a,b,c) ( a - (( b * c ) << 1) ) 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_mult32(a, b) ((a) * (b)) 495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define vo_mult(a,b) (( a * b ) >> 15 ) 505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define vo_L_mult(a,b) (((a) * (b)) << 1) 515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define vo_shr_r(var1, var2) ((var1+((Word16)(1L<<(var2-1))))>>var2) 525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define vo_sub(a,b) (a - b) 535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define vo_L_deposit_h(a) ((Word32)((a) << 16)) 54a93d5b263f3f374c5d3081297f504504203000daWei Jia#define vo_round(a) ((((a) >> 15) + 1) >> 1) 555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define vo_extract_l(a) ((Word16)(a)) 565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define vo_L_add(a,b) (a + b) 575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define vo_L_sub(a,b) (a - b) 58a93d5b263f3f374c5d3081297f504504203000daWei Jia#define vo_mult_r(a,b) (((( a * b ) >> 14) + 1 ) >> 1 ) 595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define vo_negate(a) (-a) 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_L_shr_r(L_var1, var2) ((L_var1+((Word32)(1L<<(var2-1))))>>var2) 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Prototypes for basic arithmetic operators | 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissenstatic_vo Word16 add (Word16 var1, Word16 var2); /* Short add,1 */ 695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissenstatic_vo Word16 sub (Word16 var1, Word16 var2); /* Short sub,1 */ 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 shl (Word16 var1, Word16 var2); /* Short shift left, 1 */ 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 shr (Word16 var1, Word16 var2); /* Short shift right, 1 */ 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 mult (Word16 var1, Word16 var2); /* Short mult, 1 */ 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_mult (Word16 var1, Word16 var2); /* Long mult, 1 */ 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 voround (Word32 L_var1); /* Round, 1 */ 755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissenstatic_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2); /* Mac, 1 */ 765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissenstatic_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2); /* Msu, 1 */ 775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissenstatic_vo Word32 L_add (Word32 L_var1, Word32 L_var2); /* Long add, 2 */ 785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissenstatic_vo Word32 L_sub (Word32 L_var1, Word32 L_var2); /* Long sub, 2 */ 795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissenstatic_vo Word16 mult_r (Word16 var1, Word16 var2); /* Mult with round, 2 */ 805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissenstatic_vo Word32 L_shl2(Word32 L_var1, Word16 var2); /* var2 > 0*/ 815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissenstatic_vo Word32 L_shl (Word32 L_var1, Word16 var2); /* Long shift left, 2 */ 825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissenstatic_vo Word32 L_shr (Word32 L_var1, Word16 var2); /* Long shift right, 2*/ 835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissenstatic_vo Word32 L_shr_r (Word32 L_var1, Word16 var2); /* Long shift right with round, 3 */ 845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissenstatic_vo Word16 norm_s (Word16 var1); /* Short norm, 15 */ 855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissenstatic_vo Word16 div_s (Word16 var1, Word16 var2); /* Short division, 18 */ 865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissenstatic_vo Word16 norm_l (Word32 L_var1); /* Long norm, 30 */ 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Functions | 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : add | 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Performs the addition (var1+var2) with overflow control and saturation;| 100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| the 16 bit result is set at +32767 when overflow occurs or at -32768 | 101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| when underflow occurs. | 102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 add (Word16 var1, Word16 var2) 127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 1285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 var_out; 1295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_sum; 1305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_sum = (Word32) var1 + var2; 1315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = saturate (L_sum); 1325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (var_out); 133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : sub | 138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Performs the subtraction (var1+var2) with overflow control and satu- | 142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| ration; the 16 bit result is set at +32767 when overflow occurs or at | 143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| -32768 when underflow occurs. | 144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 sub (Word16 var1, Word16 var2) 170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 1715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 var_out; 1725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_diff; 1735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_diff = (Word32) var1 - var2; 1745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = saturate (L_diff); 1755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (var_out); 176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : shl | 181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill| 185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| the var2 LSB of the result. If var2 is negative, arithmetically shift | 186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 right by -var2 with sign extension. Saturate the result in case of | 187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| underflows or overflows. | 188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 shl (Word16 var1, Word16 var2) 214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 2155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 var_out; 2165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 result; 2175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var2 < 0) 2185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var2 < -16) 2205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var2 = -16; 2215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = var1 >> ((Word16)-var2); 2225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 2245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 225a87228e3e3f42d3676ced0d38ad9913d7bef9de6Marco Nelissen if (var2 > 15 && var1 != 0) 2265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16); 2285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 2305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 231a87228e3e3f42d3676ced0d38ad9913d7bef9de6Marco Nelissen result = (Word32) var1 *((Word32) 1 << var2); 232a87228e3e3f42d3676ced0d38ad9913d7bef9de6Marco Nelissen if ((result != (Word32) ((Word16) result))) { 233a87228e3e3f42d3676ced0d38ad9913d7bef9de6Marco Nelissen var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16); 234a87228e3e3f42d3676ced0d38ad9913d7bef9de6Marco Nelissen } else { 235a87228e3e3f42d3676ced0d38ad9913d7bef9de6Marco Nelissen var_out = extract_l (result); 236a87228e3e3f42d3676ced0d38ad9913d7bef9de6Marco Nelissen } 2375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (var_out); 240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : shr | 245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Arithmetically shift the 16 bit input var1 right var2 positions with | 249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| sign extension. If var2 is negative, arithmetically shift var1 left by | 250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| -var2 with sign extension. Saturate the result in case of underflows or | 251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| overflows. | 252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 254e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 257e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 261e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 262e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 263e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 264e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 265e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 267e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 268e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 269e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 271e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 272e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 273e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 274e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 275e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 276e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 277e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 shr (Word16 var1, Word16 var2) 278e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 2795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 var_out; 2805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var2 < 0) 2815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var2 < -16) 2835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var2 = -16; 2845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = shl(var1, (Word16)-var2); 2855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 2875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var2 >= 15) 2895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = (Word16)((var1 < 0) ? -1 : 0); 2915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 2935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var1 < 0) 2955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = (Word16)(~((~var1) >> var2)); 2975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 2995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = (Word16)(var1 >> var2); 3015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (var_out); 305e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 306e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 307e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 308e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 309e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : mult | 310e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 311e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 312e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 313e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Performs the multiplication of var1 by var2 and gives a 16 bit result | 314e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| which is scaled i.e.: | 315e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and | 316e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| mult(-32768,-32768) = 32767. | 317e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 318e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 319e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 320e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 321e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 322e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 323e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 324e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 325e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 326e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 327e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 328e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 329e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 330e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 331e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 332e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 333e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 334e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 335e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 336e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 337e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 338e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 339e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 340e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 341e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 342e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 mult (Word16 var1, Word16 var2) 343e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 3445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 var_out; 3455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_product; 3465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_product = (Word32) var1 *(Word32) var2; 3475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_product = (L_product & (Word32) 0xffff8000L) >> 15; 3485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (L_product & (Word32) 0x00010000L) 3495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_product = L_product | (Word32) 0xffff0000L; 3505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = saturate (L_product); 3515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (var_out); 352e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 353e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 354e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 355e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 356e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_mult | 357e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 358e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 359e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 360e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_mult is the 32 bit result of the multiplication of var1 times var2 | 361e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| with one shift left i.e.: | 362e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_mult(var1,var2) = L_shl((var1 times var2),1) and | 363e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_mult(-32768,-32768) = 2147483647. | 364e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 365e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 366e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 367e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 368e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 369e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 370e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 371e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 372e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 373e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 374e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 375e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 376e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 377e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 378e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 379e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 380e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 381e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 382e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 383e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 384e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 385e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 386e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 387e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 388e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 389e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_mult (Word16 var1, Word16 var2) 390e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 3915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_var_out; 3925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = (Word32) var1 *(Word32) var2; 3935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (L_var_out != (Word32) 0x40000000L) 3945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out *= 2; 3965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 3985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = MAX_32; 4005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 4015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (L_var_out); 402e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 403e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 404e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 405e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 406e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : round | 407e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 408e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 409e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 410e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Round the lower 16 bits of the 32 bit input number into the MS 16 bits | 411e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| with saturation. Shift the resulting bits right by 16 and return the 16 | 412e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| bit number: | 413e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| round(L_var1) = extract_h(L_add(L_var1,32768)) | 414e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 415e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 416e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 417e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 418e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 419e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var1 | 420e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32 ) whose value falls in the | 421e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | 422e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 423e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 424e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 425e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 426e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 427e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 428e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 429e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 430e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 431e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 432e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 433e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 434e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 435e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 voround (Word32 L_var1) 436e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 4375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 var_out; 4385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_rounded; 4395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_rounded = L_add (L_var1, (Word32) 0x00008000L); 4405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = extract_h (L_rounded); 4415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (var_out); 442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 443e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 444e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 445e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 446e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_mac | 447e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 448e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 449e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 450e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Multiply var1 by var2 and shift the result left by 1. Add the 32 bit | 451e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| result to L_var3 with saturation, return a 32 bit result: | 452e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)). | 453e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 454e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 455e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 456e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 457e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 458e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var3 32 bit long signed integer (Word32) whose value falls in the | 459e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 460e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 461e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 462e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 463e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 464e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 465e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 466e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 467e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 468e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 469e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 470e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 471e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 472e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 473e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 474e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 475e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 476e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 477e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 478e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 479e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 480e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 481e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2) 482e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 4835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_var_out; 4845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_product; 4855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_product = ((var1 * var2) << 1); 4865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = L_add (L_var3, L_product); 4875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (L_var_out); 488e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 489e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 490e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 491e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 492e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_msu | 493e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 494e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 495e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 496e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Multiply var1 by var2 and shift the result left by 1. Subtract the 32 | 497e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| bit result to L_var3 with saturation, return a 32 bit result: | 498e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)). | 499e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 500e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 1 | 501e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 502e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 503e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 504e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var3 32 bit long signed integer (Word32) whose value falls in the | 505e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 506e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 507e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 508e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 509e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 510e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 511e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 512e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 513e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 514e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 515e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 516e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 517e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 518e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 519e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 520e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 521e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 522e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 523e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 524e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 525e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 526e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 527e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2) 528e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 5295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_var_out; 5305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_product; 5315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_product = (var1 * var2)<<1; 5325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = L_sub (L_var3, L_product); 5335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (L_var_out); 534e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 535e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 536e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 537e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 538e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_add | 539e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 540e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 541e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 542e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bits addition of the two 32 bits variables (L_var1+L_var2) with | 543e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| overflow control and saturation; the result is set at +2147483647 when | 544e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| overflow occurs or at -2147483648 when underflow occurs. | 545e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 546e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 2 | 547e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 548e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 549e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 550e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var1 32 bit long signed integer (Word32) whose value falls in the | 551e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 552e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 553e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var2 32 bit long signed integer (Word32) whose value falls in the | 554e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 555e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 556e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 557e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 558e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 559e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 560e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 561e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 562e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 563e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 564e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 565e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 566e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 567e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 5681d00430722b24499373c40c6521be4eb41916f0eMarco Nelissen__attribute__((no_sanitize("integer"))) 569e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_add (Word32 L_var1, Word32 L_var2) 570e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 5715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_var_out; 5725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = L_var1 + L_var2; 5735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (((L_var1 ^ L_var2) & MIN_32) == 0) 5745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 5755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if ((L_var_out ^ L_var1) & MIN_32) 5765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 5775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32; 5785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 5795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 5805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (L_var_out); 581e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 582e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 583e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 584e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 585e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_sub | 586e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 587e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 588e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 589e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with | 590e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| overflow control and saturation; the result is set at +2147483647 when | 591e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| overflow occurs or at -2147483648 when underflow occurs. | 592e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 593e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 2 | 594e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 595e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 596e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 597e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var1 32 bit long signed integer (Word32) whose value falls in the | 598e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 599e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 600e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var2 32 bit long signed integer (Word32) whose value falls in the | 601e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 602e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 603e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 604e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 605e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 606e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 607e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 608e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 609e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 610e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 611e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 612e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 613e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 614e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 61589a3d233da8c7166e64afe4249130ceda670339cMarco Nelissen__attribute__((no_sanitize("integer"))) 616e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_sub (Word32 L_var1, Word32 L_var2) 617e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 6185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_var_out; 6195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = L_var1 - L_var2; 6205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (((L_var1 ^ L_var2) & MIN_32) != 0) 6215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 6225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if ((L_var_out ^ L_var1) & MIN_32) 6235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 6245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32; 6255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 6265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 6275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (L_var_out); 628e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 629e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 630e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 631e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 632e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 633e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : mult_r | 634e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 635e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 636e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 637e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Same as mult with rounding, i.e.: | 638e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and | 639e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| mult_r(-32768,-32768) = 32767. | 640e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 641e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 2 | 642e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 643e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 644e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 645e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 646e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 647e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 648e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 649e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 650e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 651e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 652e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 653e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 654e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 655e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 656e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 657e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 658e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 659e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 660e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 661e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | 662e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 663e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 664e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 665e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 mult_r (Word16 var1, Word16 var2) 666e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 6675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 var_out; 6685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_product_arr; 6695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_product_arr = (Word32) var1 *(Word32) var2; /* product */ 6705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_product_arr += (Word32) 0x00004000L; /* round */ 6715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_product_arr &= (Word32) 0xffff8000L; 6725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_product_arr >>= 15; /* shift */ 6735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (L_product_arr & (Word32) 0x00010000L) /* sign extend when necessary */ 6745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 6755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_product_arr |= (Word32) 0xffff0000L; 6765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 6775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = saturate (L_product_arr); 6785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (var_out); 679e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 680e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 681e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 682e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 683e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_shl | 684e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 685e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 686e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 687e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero | 688e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| fill the var2 LSB of the result. If var2 is negative, arithmetically | 689e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| shift L_var1 right by -var2 with sign extension. Saturate the result in | 690e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| case of underflows or overflows. | 691e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 692e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 2 | 693e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 694e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 695e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 696e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var1 32 bit long signed integer (Word32) whose value falls in the | 697e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 698e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 699e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 700e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 701e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 702e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 703e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 704e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 705e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 706e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 707e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 708e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 709e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 710e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 711e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 712e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 713e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 714e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 715e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_shl (Word32 L_var1, Word16 var2) 716e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 7175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_var_out = 0L; 7185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var2 <= 0) 7195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 7205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var2 < -32) 7215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var2 = -32; 7225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = (L_var1 >> (Word16)-var2); 7235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 7245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 7255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 7265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (; var2 > 0; var2--) 7275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 7285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (L_var1 > (Word32) 0X3fffffffL) 7295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 7305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = MAX_32; 7315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen break; 7325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 7335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 7345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 7355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (L_var1 < (Word32) 0xc0000000L) 7365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 7375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen //Overflow = 1; 7385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = MIN_32; 7395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen break; 7405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 7415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 7425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var1 *= 2; 7435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = L_var1; 7445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 7455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 7465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (L_var_out); 747e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 748e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 749e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_shl2(Word32 L_var1, Word16 var2) 750e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 7515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_var_out = 0L; 752e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 7535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (; var2 > 0; var2--) 7545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 7555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (L_var1 > (Word32) 0X3fffffffL) 7565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 7575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = MAX_32; 7585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen break; 7595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 7605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 7615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 7625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (L_var1 < (Word32) 0xc0000000L) 7635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 7645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = MIN_32; 7655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen break; 7665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 7675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 7685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var1 <<=1 ; 7695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = L_var1; 7705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 7715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (L_var_out); 772e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 773e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 774e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 775e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 776e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_shr | 777e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 778e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 779e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 780e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Arithmetically shift the 32 bit input L_var1 right var2 positions with | 781e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| sign extension. If var2 is negative, arithmetically shift L_var1 left | 782e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| by -var2 and zero fill the -var2 LSB of the result. Saturate the result | 783e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| in case of underflows or overflows. | 784e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 785e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 2 | 786e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 787e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 788e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 789e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var1 32 bit long signed integer (Word32) whose value falls in the | 790e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | 791e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 792e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 793e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 794e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 795e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 796e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 797e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 798e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 799e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 800e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 801e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 802e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 803e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 804e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | 805e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 806e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 807e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 808e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_shr (Word32 L_var1, Word16 var2) 809e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 8105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_var_out; 8115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var2 < 0) 8125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 8135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var2 < -32) 8145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var2 = -32; 8155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = L_shl2(L_var1, (Word16)-var2); 8165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 8175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 8185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 8195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var2 >= 31) 8205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 8215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = (L_var1 < 0L) ? -1 : 0; 8225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 8235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 8245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 8255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (L_var1 < 0) 8265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 8275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = ~((~L_var1) >> var2); 8285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 8295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 8305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 8315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = L_var1 >> var2; 8325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 8335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 8345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 8355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (L_var_out); 836e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 837e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 838e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 839e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 840e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : L_shr_r | 841e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 842e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 843e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 844e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Same as L_shr(L_var1,var2) but with rounding. Saturate the result in | 845e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| case of underflows or overflows : | 846e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| - If var2 is greater than zero : | 847e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))| 848e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| is equal to zero | 849e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| then | 850e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_shr_r(L_var1,var2) = L_shr(L_var1,var2) | 851e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| else | 852e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1) | 853e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| - If var2 is less than or equal to zero : | 854e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_shr_r(L_var1,var2) = L_shr(L_var1,var2). | 855e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 856e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 3 | 857e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 858e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 859e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 860e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var1 | 861e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 862e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= var1 <= 0x7fff ffff. | 863e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 864e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 865e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 866e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 867e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 868e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 869e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 870e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 871e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 872e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 873e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 874e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var_out | 875e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 876e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= var_out <= 0x7fff ffff. | 877e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 878e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 879e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 880e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word32 L_shr_r (Word32 L_var1, Word16 var2) 881e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 8825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_var_out; 8835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var2 > 31) 8845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 8855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = 0; 8865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 8875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 8885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 8895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out = L_shr (L_var1, var2); 8905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var2 > 0) 8915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 8925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0) 8935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 8945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var_out++; 8955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 8965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 8975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 8985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (L_var_out); 899e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 900e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 901e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 902e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 903e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : norm_s | 904e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 905e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 906e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 907e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Produces the number of left shift needed to normalize the 16 bit varia- | 908e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| ble var1 for positive values on the interval with minimum of 16384 and | 909e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| maximum of 32767, and for negative values on the interval with minimum | 910e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| of -32768 and maximum of -16384; in order to normalize the result, the | 911e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| following operation must be done : | 912e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| norm_var1 = shl(var1,norm_s(var1)). | 913e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 914e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 15 | 915e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 916e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 917e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 918e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 919e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 920e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | 921e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 922e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 923e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 924e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 925e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 926e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 927e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 928e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 929e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 930e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x0000 0000 <= var_out <= 0x0000 000f. | 931e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 932e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 933e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 934e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 norm_s (Word16 var1) 935e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 9365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 var_out = 0; 9375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var1 == 0) 9385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 9395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = 0; 9405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 9415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 9425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 9435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var1 == -1) 9445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 9455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = 15; 9465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 9475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 9485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 9495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var1 < 0) 9505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 9515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var1 = (Word16)~var1; 9525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 9535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (var_out = 0; var1 < 0x4000; var_out++) 9545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 9555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var1 <<= 1; 9565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 9575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 9585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 9595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (var_out); 960e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 961e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 962e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 963e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 964e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : div_s | 965e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 966e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 967e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 968e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Produces a result which is the fractional integer division of var1 by | 969e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2; var1 and var2 must be positive and var2 must be greater or equal | 970e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| to var1; the result is positive (leading bit equal to 0) and truncated | 971e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| to 16 bits. | 972e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| If var1 = var2 then div(var1,var2) = 32767. | 973e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 974e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 18 | 975e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 976e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 977e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 978e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var1 | 979e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 980e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x0000 0000 <= var1 <= var2 and var2 != 0. | 981e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 982e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var2 | 983e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 984e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : var1 <= var2 <= 0x0000 7fff and var2 != 0. | 985e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 986e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 987e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 988e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 989e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 990e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 991e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 992e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 993e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 994e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x0000 0000 <= var_out <= 0x0000 7fff. | 995e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| It's a Q15 value (point between b15 and b14). | 996e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 997e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 998e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 999e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 div_s (Word16 var1, Word16 var2) 1000e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 10015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 var_out = 0; 10025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 iteration; 10035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_num; 10045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_denom; 10055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if ((var1 < 0) || (var2 < 0)) 10065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 10075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = MAX_16; 10085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return var_out; 10095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 10105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var2 == 0) 10115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 10125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = MAX_16; 10135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return var_out; 10145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 10155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var1 == 0) 10165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 10175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = 0; 10185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 10195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 10205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 10215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (var1 == var2) 10225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 10235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = MAX_16; 10245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 10255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen else 10265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 10275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_num = L_deposit_l (var1); 10285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_denom = L_deposit_l(var2); 10295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (iteration = 0; iteration < 15; iteration++) 10305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 10315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out <<= 1; 10325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_num <<= 1; 10335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (L_num >= L_denom) 10345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 10355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_num -= L_denom; 10365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out += 1; 10375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 10385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 10395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 10405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 10415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (var_out); 1042e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 1043e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1044e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*___________________________________________________________________________ 1045e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1046e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Function Name : norm_l | 1047e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1048e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Purpose : | 1049e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1050e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Produces the number of left shifts needed to normalize the 32 bit varia-| 1051e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| ble L_var1 for positive values on the interval with minimum of | 1052e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 1073741824 and maximum of 2147483647, and for negative values on the in-| 1053e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| terval with minimum of -2147483648 and maximum of -1073741824; in order | 1054e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| to normalize the result, the following operation must be done : | 1055e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| norm_L_var1 = L_shl(L_var1,norm_l(L_var1)). | 1056e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1057e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Complexity weight : 30 | 1058e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1059e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Inputs : | 1060e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1061e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| L_var1 | 1062e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 32 bit long signed integer (Word32) whose value falls in the | 1063e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x8000 0000 <= var1 <= 0x7fff ffff. | 1064e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1065e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Outputs : | 1066e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1067e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| none | 1068e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1069e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| Return Value : | 1070e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| | 1071e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| var_out | 1072e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| 16 bit short signed integer (Word16) whose value falls in the | 1073e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard| range : 0x0000 0000 <= var_out <= 0x0000 001f. | 1074e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard|___________________________________________________________________________| 1075e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 1076e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1077e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic_vo Word16 norm_l (Word32 L_var1) 1078e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 10795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 var_out = 0; 10805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (L_var1 != 0) 10815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 10825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen var_out = 31; 10835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (L_var1 != (Word32) 0xffffffffL) 10845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 10855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var1 ^= (L_var1 >>31); 10865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++) 10875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 10885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_var1 <<= 1; 10895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 10905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 10915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 10925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return (var_out); 1093e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 1094e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1095e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif //__BASIC_OP_H__ 1096e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1097