www.pudn.com > SMV_Code.rar > math_ext32.c


/*=========================================================================*/ 
/* Each of the companies; Ericsson, Lucent, Mindspeed, Motorola, Nokia,    */ 
/* Nortel Networks, and Qualcomm (hereinafter referred to individually as  */ 
/* “Source” or collectively as “Sources”) do hereby state:                 */ 
/*                                                                         */ 
/* To the extent to which the Source(s) may legally and freely do so,      */ 
/* the Source(s), upon submission of a Contribution, grant(s) a free,      */ 
/* irrevocable, non-exclusive, license to the Third Generation Partnership */ 
/* Project 2 (3GPP2) and its Organizational Partners: ARIB, CCSA, TIA,     */ 
/* TTA, and TTC, under the Source’s copyright or copyright license rights  */ 
/* in the Contribution, to, in whole or in part, copy, make derivative     */ 
/* works, perform, display and distribute the Contribution and derivative  */ 
/* works thereof consistent with 3GPP2’s and each Organizational Partner’s */ 
/* policies and procedures, with the right to (i) sublicense the foregoing */ 
/* rights consistent with 3GPP2’s and each Organizational Partner’s        */ 
/* policies and procedures and (ii) copyright and sell, if applicable) in  */ 
/* 3GPP2's name or each Organizational Partner’s name any 3GPP2 or         */ 
/* transposed Publication even though this Publication may contain the     */ 
/* Contribution or a derivative work thereof.  The Contribution shall      */ 
/* disclose any known limitations on the Source’s rights to license as     */ 
/* herein provided.                                                        */ 
/*                                                                         */ 
/* When a Contribution is submitted by the Source(s) to assist the         */ 
/* formulating groups of 3GPP2 or any of its Organizational Partners,      */ 
/* it is proposed to the Committee as a basis for discussion and is not    */ 
/* to be construed as a binding proposal on the Source(s).  The Source(s)  */ 
/* specifically reserve(s) the right to amend or modify the material       */ 
/* contained in the Contribution. Nothing contained in the Contribution    */ 
/* shall, except as herein expressly provided, be construed as conferring  */ 
/* by implication, estoppel or otherwise, any license or right under       */ 
/* (i) any existing or later issuing patent, whether or not the use of     */ 
/* information in the document necessarily employs an invention of any     */ 
/* existing or later issued patent, (ii) any copyright, (iii) any          */ 
/* trademark, or (iv) any other intellectual property right.               */ 
/*                                                                         */ 
/* With respect to the Software necessary for the practice of any or all   */ 
/* Normative portions of the Selectable Mode Vocoder (SMV) as it exists on */ 
/* the date of submittal of this form, should the SMV be approved as a     */ 
/* Specification or Report by 3GPP2, or as a transposed Standard by any of */ 
/* the 3GPP2’s Organizational Partners, the Source(s) state(s) that a      */ 
/* worldwide license to reproduce, use and distribute the Software, the    */ 
/* license rights to which are held by the Source(s), will be made         */ 
/* available to applicants under terms and conditions that are reasonable  */ 
/* and non-discriminatory, which may include monetary compensation,        */ 
/* and only to the extent necessary for the practice of any or all of the  */ 
/* Normative portions of the SMV or the field of use of practice of the    */ 
/* SMV Specification, Report, or Standard.  The statement contained above  */ 
/* is irrevocable and shall be binding upon the Source(s).  In the event   */ 
/* the rights of the Source(s) in and to copyright or copyright license    */ 
/* rights subject to such commitment are assigned or transferred,          */ 
/* the Source(s) shall notify the assignee or transferee of the existence  */ 
/* of such commitments.                                                    */ 
/*=========================================================================*/ 
/*                                                                   */ 
/*-------------------------------------------------------------------*/ 
 
/*_________________________________________________________________________ 
 |                                                                         | 
 |                                  Include                                | 
 |_________________________________________________________________________| 
*/ 
 
#include "typedef_fx.h" 
#include "basic_op.h" 
 
#ifdef WMOPS_FX 
#include "main_fx.h" 
#include "const_fx.h" 
#include "ext_var_fx.h" 
#endif 
 
/*_________________________________________________________________________ 
 |                                                                         | 
 |                                  Define                                 | 
 |_________________________________________________________________________| 
*/ 
 
#define SW_MIN (short)0x8000           /* smallest Ram */ 
#define SW_MAX (short)0x7fff           /* largest Ram */ 
 
/*_________________________________________________________________________ 
 |                                                                         | 
 |                                Functions                                | 
 |_________________________________________________________________________| 
*/ 
 
/**************************************************************************** 
 * 
 *     FUNCTION NAME: L_mpy_ll 
 * 
 *     PURPOSE:    Multiply a 32 bit number (L_var1) and a 32 bit number 
 *                 (L_var2), and return a 32 bit result. 
 * 
 *     INPUTS: 
 * 
 *       L_var1             A Word32 input variable 
 * 
 *       L_var2             A Word32 input variable 
 * 
 *     OUTPUTS:             none 
 * 
 *     IMPLEMENTATION: 
 * 
 *        Performs a 31x31 bit multiply, Complexity=24 Ops. 
 * 
 *        Let x1x0, or y1y0, be the two constituent halves 
 *        of a 32 bit number.  This function performs the 
 *        following: 
 * 
 *        low = ((x0 >> 1)*(y0 >> 1)) >> 16     (low * low) 
 *        mid1 = [(x1 * (y0 >> 1)) >> 1 ]       (high * low) 
 *        mid2 = [(y1 * (x0 >> 1)) >> 1]        (high * low) 
 *        mid =  (mid1 + low + mid2) >> 14      (sum so far) 
 *        output = (y1*x1) + mid                (high * high) 
 * 
 * 
 *     RETURN VALUE:        A Word32 value 
 * 
 *     KEYWORDS: mult,mpy,multiplication 
 * 
 ***************************************************************************/ 
 
Word32 L_mpy_ll(Word32 L_var1, Word32 L_var2) 
        { 
	  Word16 swLow1, 
	         swLow2, 
	         swHigh1, 
	         swHigh2; 
	  Word32 L_varOut, 
	         L_low, 
	         L_mid1, 
	         L_mid2, 
	         L_mid; 
	   
#ifdef WMOPS_FX 
	  counter_fx.L_mpy_ll++; 
 
	  counter_fx.shr -= 2;  
	  counter_fx.extract_l -= 2; 
	  counter_fx.extract_h -= 2; 
	  counter_fx.L_mult -= 3; 
	  counter_fx.L_shr -= 4; 
	  counter_fx.L_add -= 2; 
	  counter_fx.L_mac--; 
#endif 
	   
	  swLow1 = shr(extract_l(L_var1), 1); 
	  swLow1 = SW_MAX & swLow1; 
	   
	  swLow2 = shr(extract_l(L_var2), 1); 
	  swLow2 = SW_MAX & swLow2; 
	  swHigh1 = extract_h(L_var1); 
	  swHigh2 = extract_h(L_var2); 
	   
	  L_low = L_mult(swLow1, swLow2); 
	  L_low = L_shr(L_low, 16); 
	   
	  L_mid1 = L_mult(swHigh1, swLow2); 
	  L_mid1 = L_shr(L_mid1, 1); 
	  L_mid = L_add(L_mid1, L_low); 
	   
	  L_mid2 = L_mult(swHigh2, swLow1); 
	  L_mid2 = L_shr(L_mid2, 1); 
	  L_mid = L_add(L_mid, L_mid2); 
	   
	  L_mid = L_shr(L_mid, 14); 
	  L_varOut = L_mac(L_mid, swHigh1, swHigh2); 
	   
	  return (L_varOut); 
	} 
 
/*----------------------------------------------------------------------------*/ 
 
/**************************************************************************** 
 * 
 *     FUNCTION NAME: L_mpy_ls 
 * 
 *     PURPOSE:    Multiply a 32 bit number (L_var2) and a 16 bit 
 *                 number (var1) returning a 32 bit result. L_var2 
 *                 is truncated to 31 bits prior to executing the 
 *                 multiply. 
 * 
 *     INPUTS: 
 * 
 *       L_var2             A Word32 input variable 
 * 
 *       var1               A Word16 input variable 
 * 
 *     OUTPUTS:             none 
 * 
 *     RETURN VALUE:        A Word32 value 
 * 
 *     KEYWORDS: mult,mpy,multiplication 
 * 
 ***************************************************************************/ 
 
Word32 L_mpy_ls(Word32 L_var2, Word16 var1) 
        { 
	  Word32 L_varOut; 
	  Word16 swtemp; 
 
#ifdef WMOPS_FX 
	  counter_fx.L_mpy_ls++; 
 
	  counter_fx.shr--;  
	  counter_fx.extract_l--; 
	  counter_fx.L_mult--; 
	  counter_fx.L_shr--; 
	  counter_fx.L_mac--; 
#endif 
	   
	  swtemp = shr(extract_l(L_var2), 1); 
	  swtemp = (short) 32767 & (short) swtemp; 
	   
	  L_varOut = L_mult(var1, swtemp); 
	  L_varOut = L_shr(L_varOut, 15); 
	  L_varOut = L_mac(L_varOut, var1, extract_h(L_var2)); 
 
	  return (L_varOut); 
 
	}