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
28183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define MAX_16 ((Word16)+32767)   /* 0x7fff */
29183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#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
44183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define extract_h(a)            ((Word16)((a) >> 16))
45183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define extract_l(x)            (Word16)((x))
46183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define add1(a,b)               ((a) + (b))
47183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define vo_L_msu(a,b,c)         ((a) - (((b) * (c)) << 1))
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define vo_mult32(a, b)         ((a) * (b))
49183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define vo_mult(a,b)            (((a) * (b)) >> 15)
50183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define vo_L_mult(a,b)          (((a) * (b)) << 1)
51183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define vo_shr_r(var1, var2)    (((var1)+((Word16)(1L<<((var2)-1))))>>(var2))
52183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define vo_sub(a,b)             ((a) - (b))
535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define vo_L_deposit_h(a)       ((Word32)((a) << 16))
54183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define vo_round(a)             ((((a) >> 15) + 1) >> 1)
555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#define vo_extract_l(a)         ((Word16)(a))
56183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define vo_L_add(a,b)           ((a) + (b))
57183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define vo_L_sub(a,b)           ((a) - (b))
58183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define vo_mult_r(a,b)          (((( (a) * (b) ) >> 14) + 1 ) >> 1 )
59183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define vo_negate(a)            (-(a))
60183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#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        }
768f47c471d74f7f7565bd46305a5c14bd1c4daa96bMarco Nelissen        L_var1 *= 2 ;
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