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