📄 enh40.h
字号:
* * Purpose : * * Rounds the lower 16 bits of the 40 bit input number. Returns the 40 bit * result with bits 15-0 cleared. * Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit. * Calls the macro L40_OVERFLOW_OCCURED() in case of overflow on 40-bit. * * * Complexity weight : 1 * * Inputs : * * L40_var1 40 bit long signed integer (Word40) whose value falls in the * range : MIN_40 <= L40_var1 <= MAX_40. * * * Outputs : * * none * * Return Value : * * L40_var_out 40 bit long signed integer (Word40) whose value falls in * the range : MIN_40 <= L40_var_out <= MAX_40. * *****************************************************************************/static __inline Word40 L40_round( Word40 L40_var1) { Word40 L40_var_out; Word40 L40_constant = L40_set( 0xffffff0000); L40_var_out = L40_add( 0x8000, L40_var1); L40_var_out = L40_var_out & L40_constant; #if (WMOPS) multiCounter[currCounter].L40_set--; multiCounter[currCounter].L40_add--; multiCounter[currCounter].L40_round++; #endif /* ifdef WMOPS */ return( L40_var_out);} /***************************************************************************** * * Function Name : round40 * * Purpose : * * Rounds the lower 16 bits of the 40 bit input number. Saturates the 40 * bit result to 32-bit and returns the resulting higher 16-bit. * round40( L40_var1) = extract_h( L_saturate40( L40_round( L40_var1))) * Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit. * Calls the macro L40_OVERFLOW_OCCURED() in case of overflow on 40-bit. * * * Complexity weight : 1 * * Inputs : * * L40_var1 40 bit long signed integer (Word40) whose value falls in the * range : MIN_40 <= L40_var1 <= MAX_40. * * * Outputs : * * none * * Return Value : * * var_out 16 bit short signed integer (Word16) whose value falls in * the range 0xffff 8000 <= var_out <= 0x0000 7fff. * *****************************************************************************/static __inline Word16 round40( Word40 L40_var1) { Word16 var_out; var_out = extract_h( L_saturate40( L40_round( L40_var1))); #if (WMOPS) multiCounter[currCounter].L40_round--; multiCounter[currCounter].L_saturate40--; multiCounter[currCounter].extract_h--; multiCounter[currCounter].round40++; #endif /* ifdef WMOPS */ return( var_out);} /***************************************************************************** * * Function Name : L40_mult * * Purpose : * * Multiplies var1 by var2 and shifts the result left by 1. Returns the * full precision result on 40-bit. * L40_mult( var1, var2) = shiftleft(( var1 times var2), 1) * * Complexity weight : 1 * * Inputs : * * var1 16 bit short signed integer (Word16) whose value falls in * the range : MIN_16 <= var1 <= MAX_16. * * var2 16 bit short signed integer (Word16) whose value falls in * the range : MIN_16 <= var2 <= MAX_16. * * Outputs : * * none * * Return Value : * * L40_var_out 40 bit long signed integer (Word40) whose value falls in * the range : MIN_40 <= L40_var_out <= MAX_40. * *****************************************************************************/static __inline Word40 L40_mult( Word16 var1, Word16 var2) { Word32 L_var_out; Word40 L40_var_out; L_var_out = ( Word32) var1 * ( Word32) var2; L40_var_out = ( Word40) L_var_out; /* Below line can not overflow, so we can use << instead of L40_shl. */ L40_var_out = L40_var_out << 1; #if (WMOPS) multiCounter[currCounter].L40_mult++; #endif /* ifdef WMOPS */ return( L40_var_out);}/***************************************************************************** * * Function Name : L40_mac * * Purpose : * * Multiplies var2 by var3. Shifts left the 40-bit result by 1 and adds * the result to L40_var1. Returns a 40 bit result. * L40_mac( L40_var1, var2, var3) * = L40_add( L40_var1, L40_mult( var2, var3)) * Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit. * Calls the macro L40_OVERFLOW_OCCURED() in case of overflow on 40-bit. * * Complexity weight : 1 * * Inputs : * * L40_var1 40 bit long signed integer (Word40) whose value falls in the * range : MIN_40 <= L40_var1 <= MAX_40. * * var2 16 bit short signed integer (Word16) whose value falls in * the range : MIN_16 <= var2 <= MAX_16. * * var3 16 bit short signed integer (Word16) whose value falls in * the range : MIN_16 <= var3 <= MAX_16. * * Outputs : * * none * * Return Value : * * L40_var_out 40 bit long signed integer (Word40) whose value falls in * the range : MIN_40 <= L40_var_out <= MAX_40. * *****************************************************************************/static __inline Word40 L40_mac( Word40 L40_var1, Word16 var2, Word16 var3) { Word40 L40_var_out; L40_var_out = L40_mult( var2, var3); L40_var_out = L40_add( L40_var1, L40_var_out); #if (WMOPS) multiCounter[currCounter].L40_mult--; multiCounter[currCounter].L40_add--; multiCounter[currCounter].L40_mac++; #endif /* ifdef WMOPS */ return( L40_var_out);} /***************************************************************************** * * Function Name : mac_r40 * * Purpose : * * Multiplies var2 by var3. Shifts left the 40-bit result by 1 and adds * the result to L40_var1. Rounds the lower 16 bits of the 40 bit result. * Saturates the 40 bit result to 32-bit and returns the resulting higher * 16-bit. * mac_r40( L40_var1, var2, var3) * = round40( L40_mac( L40_var1, var2, var3)) * Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit. * Calls the macro L40_OVERFLOW_OCCURED() in case of overflow on 40-bit. * * Complexity weight : 2 * * Inputs : * * L40_var1 40 bit long signed integer (Word40) whose value falls in the * range : MIN_40 <= L40_var1 <= MAX_40. * * var2 16 bit short signed integer (Word16) whose value falls in * the range : MIN_16 <= var2 <= MAX_16. * * var3 16 bit short signed integer (Word16) whose value falls in * the range : MIN_16 <= var3 <= MAX_16. * * Outputs : * * none * * Return Value : * * var_out 16 bit short signed integer (Word16) whose value falls in * the range : MIN_16 <= var_out <= MAX_16. * *****************************************************************************/static __inline Word16 mac_r40( Word40 L40_var1, Word16 var2, Word16 var3) { Word40 L40_var_out; Word16 var_out; L40_var_out = L40_mac( L40_var1, var2, var3); var_out = round40( L40_var_out); #if (WMOPS) multiCounter[currCounter].L40_mac--; multiCounter[currCounter].round40--; multiCounter[currCounter].mac_r40++; #endif /* ifdef WMOPS */ return( var_out);} /***************************************************************************** * * Function Name : L40_msu * * Purpose : * * Multiplies var2 by var3. Shifts left the 40-bit result by 1 and * subtracts the result from L40_var1. Returns a 40 bit result. * L40_msu( L40_var1, var2, var3) * = L40_sub( L40_var1, L40_mult( var2, var3)) * Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit. * Calls the macro L40_OVERFLOW_OCCURED() in case of overflow on 40-bit. * * Complexity weight : 1 * * Inputs : * * L40_var1 40 bit long signed integer (Word40) whose value falls in the * range : MIN_40 <= L40_var1 <= MAX_40. * * var2 16 bit short signed integer (Word16) whose value falls in * the range : MIN_16 <= var2 <= MAX_16. * * var3 16 bit short signed integer (Word16) whose value falls in * the range : MIN_16 <= var3 <= MAX_16. * * Outputs : * * none * * Return Value : * * L40_var_out 40 bit long signed integer (Word40) whose value falls in * the range : MIN_40 <= L40_var_out <= MAX_40. * *****************************************************************************/static __inline Word40 L40_msu( Word40 L40_var1, Word16 var2, Word16 var3) { Word40 L40_var_out; L40_var_out = L40_mult( var2, var3); L40_var_out = L40_sub( L40_var1, L40_var_out); #if (WMOPS) multiCounter[currCounter].L40_mult--; multiCounter[currCounter].L40_sub--; multiCounter[currCounter].L40_msu++; #endif /* ifdef WMOPS */ return( L40_var_out);} /***************************************************************************** * * Function Name : msu_r40 * * Purpose : * * Multiplies var2 by var3. Shifts left the 40-bit result by 1 and * subtracts the result from L40_var1. Rounds the lower 16 bits of the * 40 bit result. Saturates the 40 bit result to 32-bit and returns the * resulting higher 16-bit. * msu_r40( L40_var1, var2, var3) * = round40( L40_msu( L40_var1, var2, var3)) * Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit. * Calls the macro L40_OVERFLOW_OCCURED() in case of overflow on 40-bit. * * Complexity weight : 2 * * Inputs : * * L40_var1 40 bit long signed integer (Word40) whose value falls in the * range : MIN_40 <= L40_var1 <= MAX_40. * * var2 16 bit short signed integer (Word16) whose value falls in * the range : MIN_16 <= var2 <= MAX_16. * * var3 16 bit short signed integer (Word16) whose value falls in * the range : MIN_16 <= var3 <= MAX_16. * * Outputs : * * none * * Return Value : * * var_out 16 bit short signed integer (Word16) whose value falls in * the range : MIN_16 <= var_out <= MAX_16. * *****************************************************************************/static __inline Word16 msu_r40( Word40 L40_var1, Word16 var2, Word16 var3) { Word40 L40_var_out; Word16 var_out; L40_var_out = L40_msu( L40_var1, var2, var3); var_out = round40( L40_var_out); #if (WMOPS) multiCounter[currCounter].L40_msu--; multiCounter[currCounter].round40--; multiCounter[currCounter].msu_r40++; #endif /* ifdef WMOPS */ return( var_out);} #endif /*_ENH40_H*//* end of file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -