546 lines
13 KiB
C
Executable File
546 lines
13 KiB
C
Executable File
/*
|
|
===========================================================================
|
|
File: ENH1632.H v.2.3 - 30.Nov.2009
|
|
===========================================================================
|
|
|
|
ITU-T STL BASIC OPERATORS
|
|
|
|
ENHANCED 16-BIT & 32-BIT ARITHMETIC OPERATORS
|
|
|
|
History:
|
|
07 Nov 04 v2.0 Incorporation of new 32-bit / 40-bit / control
|
|
operators for the ITU-T Standard Tool Library as
|
|
described in Geneva, 20-30 January 2004 WP 3/16 Q10/16
|
|
TD 11 document and subsequent discussions on the
|
|
wp3audio@yahoogroups.com email reflector.
|
|
March 06 v2.1 Changed to improve portability.
|
|
Some counters incrementations were missing (s_and,
|
|
s_or, s_xor).
|
|
30 Nov 09 v2.3 saturate() removed
|
|
|
|
============================================================================
|
|
*/
|
|
|
|
|
|
#ifndef _ENH1632_H
|
|
#define _ENH1632_H
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Constants and Globals
|
|
*
|
|
*****************************************************************************/
|
|
|
|
|
|
#include "stl.h"
|
|
|
|
|
|
#if (WMOPS)
|
|
#include "count.h"
|
|
extern BASIC_OP multiCounter[MAXCOUNTERS];
|
|
extern int currCounter;
|
|
#endif /* if WMOPS */
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Prototypes for enhanced 16/32 bit arithmetic operators
|
|
*
|
|
*****************************************************************************/
|
|
Word16 shl_r( Word16 var1, Word16 var2);
|
|
Word32 L_shl_r( Word32 L_var1, Word16 var2);
|
|
|
|
|
|
Word16 lshl( Word16 var1, Word16 var2);
|
|
Word16 lshr( Word16 var1, Word16 var2);
|
|
Word32 L_lshl( Word32 L_var1, Word16 var2);
|
|
Word32 L_lshr( Word32 L_var1, Word16 var2);
|
|
|
|
Word16 rotr( Word16 var1, Word16 var2, Word16 *var3);
|
|
Word16 rotl( Word16 var1, Word16 var2, Word16 *var3);
|
|
Word32 L_rotr( Word32 var1, Word16 var2, Word16 *var3);
|
|
Word32 L_rotl( Word32 var1, Word16 var2, Word16 *var3);
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Functions
|
|
*
|
|
*****************************************************************************/
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Function Name : s_max
|
|
*
|
|
* Purpose :
|
|
*
|
|
* Compares var1 and var2 and returns the maximum value.
|
|
*
|
|
* Complexity weight : 1
|
|
*
|
|
* Inputs :
|
|
*
|
|
* var1 16 bit short signed integer (Word16) whose value falls in
|
|
* the range : 0x8000 <= var1 <= 0x7fff.
|
|
*
|
|
* var2 16 bit short signed integer (Word16) whose value falls in
|
|
* the range : 0x8000 <= var2 <= 0x7fff.
|
|
*
|
|
* Outputs :
|
|
*
|
|
* none
|
|
*
|
|
* Return Value :
|
|
*
|
|
* var_out 16 bit short signed integer (Word16) whose value falls in
|
|
* the range : 0x8000 <= L_var_out <= 0x7fff.
|
|
*
|
|
*****************************************************************************/
|
|
static __inline Word16 s_max( Word16 var1, Word16 var2) {
|
|
Word16 var_out;
|
|
|
|
if( var1 >= var2)
|
|
var_out = var1;
|
|
else
|
|
var_out = var2;
|
|
|
|
#if (WMOPS)
|
|
multiCounter[currCounter].s_max++;
|
|
#endif /* if WMOPS */
|
|
|
|
return( var_out);
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Function Name : s_min
|
|
*
|
|
* Purpose :
|
|
*
|
|
* Compares var1 and var2 and returns the minimum value.
|
|
*
|
|
* Complexity weight : 1
|
|
*
|
|
* Inputs :
|
|
*
|
|
* var1 16 bit short signed integer (Word16) whose value falls in
|
|
* the range : 0x8000 <= var1 <= 0x7fff.
|
|
*
|
|
* var2 16 bit short signed integer (Word16) whose value falls in
|
|
* the range : 0x8000 <= var2 <= 0x7fff.
|
|
*
|
|
* Outputs :
|
|
*
|
|
* none
|
|
*
|
|
* Return Value :
|
|
*
|
|
* var_out 16 bit short signed integer (Word16) whose value falls in
|
|
* the range : 0x8000 <= var_out <= 0x7fff.
|
|
*
|
|
*****************************************************************************/
|
|
static __inline Word16 s_min( Word16 var1, Word16 var2) {
|
|
Word16 var_out;
|
|
|
|
if( var1 <= var2)
|
|
var_out = var1;
|
|
else
|
|
var_out = var2;
|
|
|
|
#if (WMOPS)
|
|
multiCounter[currCounter].s_min++;
|
|
#endif /* if WMOPS */
|
|
|
|
return( var_out);
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Function Name : L_max
|
|
*
|
|
* Purpose :
|
|
*
|
|
* Compares L_var1 and L_var2 and returns the maximum value.
|
|
*
|
|
* Complexity weight : 1
|
|
*
|
|
* Inputs :
|
|
*
|
|
* L_var1 32 bit long signed integer (Word32) whose value falls in the
|
|
* range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
|
|
*
|
|
* L_var2 32 bit long signed integer (Word32) whose value falls in the
|
|
* range : 0x8000 0000 <= L_var2 <= 0x7fff ffff.
|
|
*
|
|
* Outputs :
|
|
*
|
|
* none
|
|
*
|
|
* Return Value :
|
|
*
|
|
* L_var_out 32 bit long signed integer (Word32) whose value falls in the
|
|
* range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
|
|
*
|
|
*****************************************************************************/
|
|
static __inline Word32 L_max( Word32 L_var1, Word32 L_var2) {
|
|
Word32 L_var_out;
|
|
|
|
if( L_var1 >= L_var2)
|
|
L_var_out = L_var1;
|
|
else
|
|
L_var_out = L_var2;
|
|
|
|
#if (WMOPS)
|
|
multiCounter[currCounter].L_max++;
|
|
#endif /* if WMOPS */
|
|
|
|
return( L_var_out);
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Function Name : L_min
|
|
*
|
|
* Purpose :
|
|
*
|
|
* Compares L_var1 and L_var2 and returns the minimum value.
|
|
*
|
|
* Complexity weight : 1
|
|
*
|
|
* Inputs :
|
|
*
|
|
* L_var1 32 bit long signed integer (Word32) whose value falls in the
|
|
* range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
|
|
*
|
|
* L_var2 32 bit long signed integer (Word32) whose value falls in the
|
|
* range : 0x8000 0000 <= L_var2 <= 0x7fff ffff.
|
|
*
|
|
* Outputs :
|
|
*
|
|
* none
|
|
*
|
|
* Return Value :
|
|
*
|
|
* L_var_out 32 bit long signed integer (Word32) whose value falls in the
|
|
* range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
|
|
*
|
|
*****************************************************************************/
|
|
static __inline Word32 L_min( Word32 L_var1, Word32 L_var2) {
|
|
Word32 L_var_out;
|
|
|
|
if( L_var1 <= L_var2)
|
|
L_var_out = L_var1;
|
|
else
|
|
L_var_out = L_var2;
|
|
|
|
#if (WMOPS)
|
|
multiCounter[currCounter].L_min++;
|
|
#endif /* if WMOPS */
|
|
|
|
return( L_var_out);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Function Name : s_and
|
|
*
|
|
* Purpose :
|
|
*
|
|
* Performs logical AND of the two 16 bit input variables.
|
|
* var_out = var1 & var2
|
|
*
|
|
* Complexity weight : 1
|
|
*
|
|
* Inputs :
|
|
*
|
|
* var1 16 bit short signed integer (Word16) whose value
|
|
* falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
|
|
*
|
|
* var2 16 bit short signed integer (Word16) whose value
|
|
* falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
|
|
*
|
|
* 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 s_and( Word16 var1, Word16 var2) {
|
|
Word16 var_out;
|
|
|
|
var_out = var1 & var2;
|
|
|
|
#if (WMOPS)
|
|
multiCounter[currCounter].s_and++;
|
|
#endif /* if WMOPS */
|
|
|
|
return( var_out);
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Function Name : L_and
|
|
*
|
|
* Purpose :
|
|
*
|
|
* Performs logical AND of the two 32 bit input variables.
|
|
* L_var_out = L_var1 & L_var2
|
|
*
|
|
* Complexity weight : 1
|
|
*
|
|
* Inputs :
|
|
*
|
|
* L_var1 32 bit long signed integer (Word32) whose value
|
|
* falls in the range 0x8000 0000 <= L_var1 <= 0x7fff ffff.
|
|
*
|
|
* L_var2 32 bit long signed integer (Word32) whose value
|
|
* falls in the range 0x8000 0000 <= L_var2 <= 0x7fff ffff.
|
|
*
|
|
* Outputs :
|
|
*
|
|
* none
|
|
*
|
|
* Return Value :
|
|
*
|
|
* L_var_out 32 bit long signed integer (Word32) whose value
|
|
* falls in the range 0x8000 0000 <= L_var_out <= 0x7fff ffff.
|
|
*
|
|
*****************************************************************************/
|
|
static __inline Word32 L_and( Word32 L_var1, Word32 L_var2) {
|
|
Word32 L_var_out;
|
|
|
|
L_var_out = L_var1 & L_var2;
|
|
|
|
#if (WMOPS)
|
|
multiCounter[currCounter].L_and++;
|
|
#endif /* if WMOPS */
|
|
|
|
return( L_var_out);
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Function Name : s_or
|
|
*
|
|
* Purpose :
|
|
*
|
|
* Performs logical OR of the two 16 bit input variables.
|
|
* var_out = var1 | var2
|
|
*
|
|
* Complexity weight : 1
|
|
*
|
|
* Inputs :
|
|
*
|
|
* var1 16 bit short signed integer (Word16) whose value
|
|
* falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
|
|
*
|
|
* var2 16 bit short signed integer (Word16) whose value
|
|
* falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
|
|
*
|
|
* 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 s_or( Word16 var1, Word16 var2) {
|
|
Word16 var_out;
|
|
|
|
var_out = var1 | var2;
|
|
|
|
#if (WMOPS)
|
|
multiCounter[currCounter].s_or++;
|
|
#endif /* if WMOPS */
|
|
|
|
return( var_out);
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Function Name : L_or
|
|
*
|
|
* Purpose :
|
|
*
|
|
* Performs logical OR of the two 32 bit input variables.
|
|
* L_var_out = L_var1 | L_var2
|
|
*
|
|
* Complexity weight : 1
|
|
*
|
|
* Inputs :
|
|
*
|
|
* L_var1 32 bit long signed integer (Word32) whose value
|
|
* falls in the range 0x8000 0000 <= L_var1 <= 0x7fff ffff.
|
|
*
|
|
* L_var2 32 bit long signed integer (Word32) whose value
|
|
* falls in the range 0x8000 0000 <= L_var2 <= 0x7fff ffff.
|
|
*
|
|
* Outputs :
|
|
*
|
|
* none
|
|
*
|
|
* Return Value :
|
|
*
|
|
* L_var_out 32 bit long signed integer (Word32) whose value
|
|
* falls in the range 0x8000 0000 <= L_var_out <= 0x7fff ffff.
|
|
*
|
|
*****************************************************************************/
|
|
static __inline Word32 L_or( Word32 L_var1, Word32 L_var2) {
|
|
|
|
Word32 L_var_out;
|
|
|
|
L_var_out = L_var1 | L_var2;
|
|
|
|
#if (WMOPS)
|
|
multiCounter[currCounter].L_or++;
|
|
#endif /* if WMOPS */
|
|
|
|
return( L_var_out);
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Function Name : s_xor
|
|
*
|
|
* Purpose :
|
|
*
|
|
* Performs logical XOR of the two 16 bit input variables.
|
|
* var_out = var1 ^ var2
|
|
*
|
|
* Complexity weight : 1
|
|
*
|
|
* Inputs :
|
|
*
|
|
* var1 16 bit short signed integer (Word16) whose value
|
|
* falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
|
|
*
|
|
* var2 16 bit short signed integer (Word16) whose value
|
|
* falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
|
|
*
|
|
* 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 s_xor( Word16 var1, Word16 var2) {
|
|
Word16 var_out;
|
|
|
|
var_out = var1 ^ var2;
|
|
|
|
#if (WMOPS)
|
|
multiCounter[currCounter].s_xor++;
|
|
#endif /* if WMOPS */
|
|
|
|
return( var_out);
|
|
}
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* Function Name : L_xor
|
|
*
|
|
* Purpose :
|
|
*
|
|
* Performs logical OR of the two 32 bit input variables.
|
|
* L_var_out = L_var1 ^ L_var2
|
|
*
|
|
* Complexity weight : 1
|
|
*
|
|
* Inputs :
|
|
*
|
|
* L_var1 32 bit long signed integer (Word32) whose value
|
|
* falls in the range 0x8000 0000 <= L_var1 <= 0x7fff ffff.
|
|
*
|
|
* L_var2 32 bit long signed integer (Word32) whose value
|
|
* falls in the range 0x8000 0000 <= L_var2 <= 0x7fff ffff.
|
|
*
|
|
* Outputs :
|
|
*
|
|
* none
|
|
*
|
|
* Return Value :
|
|
*
|
|
* L_var_out 32 bit long signed integer (Word32) whose value
|
|
* falls in the range 0x8000 0000 <= L_var_out <= 0x7fff ffff.
|
|
*
|
|
*****************************************************************************/
|
|
static __inline Word32 L_xor( Word32 L_var1, Word32 L_var2) {
|
|
Word32 L_var_out;
|
|
|
|
L_var_out = L_var1 ^ L_var2;
|
|
|
|
#if (WMOPS)
|
|
multiCounter[currCounter].L_xor++;
|
|
#endif /* if WMOPS */
|
|
|
|
return( L_var_out);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif /*_ENH1632_H*/
|
|
|
|
/* end of file */
|