LCOV - code coverage report
Current view: top level - lib_com - enh1632.h (source / functions) Hit Total Coverage
Test: Coverage on main -- dec/rend @ 633e3f2e309758d10805ef21e0436356fe719b7a Lines: 38 38 100.0 %
Date: 2025-08-23 01:22:27 Functions: 10 10 100.0 %

          Line data    Source code
       1             : /*
       2             :   ===========================================================================
       3             :    File: ENH1632.H                                       v.2.3 - 30.Nov.2009
       4             :   ===========================================================================
       5             : 
       6             :             ITU-T        STL        BASIC       OPERATORS
       7             : 
       8             :             ENHANCED 16-BIT & 32-BIT ARITHMETIC OPERATORS
       9             : 
      10             :    History:
      11             :    07 Nov 04   v2.0     Incorporation of new 32-bit / 40-bit / control
      12             :                         operators for the ITU-T Standard Tool Library as
      13             :                         described in Geneva, 20-30 January 2004 WP 3/16 Q10/16
      14             :                         TD 11 document and subsequent discussions on the
      15             :                         wp3audio@yahoogroups.com email reflector.
      16             :    March 06   v2.1      Changed to improve portability.
      17             :                         Some counters incrementations were missing (s_and,
      18             :                         s_or, s_xor).
      19             :    30 Nov 09   v2.3     saturate() removed
      20             : 
      21             :   ============================================================================
      22             : */
      23             : 
      24             : 
      25             : #ifndef _ENH1632_H
      26             : #define _ENH1632_H
      27             : 
      28             : 
      29             : /*****************************************************************************
      30             :  *
      31             :  *  Constants and Globals
      32             :  *
      33             :  *****************************************************************************/
      34             : 
      35             : 
      36             : #include "stl.h"
      37             : 
      38             : /*****************************************************************************
      39             :  *
      40             :  *  Prototypes for enhanced 16/32 bit arithmetic operators
      41             :  *
      42             :  *****************************************************************************/
      43             : Word16 shl_ro( Word16 var1, Word16 var2, Flag *Overflow );
      44             : Word16 shl_r( Word16 var1, Word16 var2 );
      45             : Word32 L_shl_r( Word32 L_var1, Word16 var2 );
      46             : 
      47             : 
      48             : Word16 lshl( Word16 var1, Word16 var2 );
      49             : Word16 lshr( Word16 var1, Word16 var2 );
      50             : Word32 L_lshl( Word32 L_var1, Word16 var2 );
      51             : Word32 L_lshr( Word32 L_var1, Word16 var2 );
      52             : 
      53             : Word16 rotr( Word16 var1, Word16 var2, Word16 *var3 );
      54             : Word16 rotl( Word16 var1, Word16 var2, Word16 *var3 );
      55             : Word32 L_rotr( Word32 var1, Word16 var2, Word16 *var3 );
      56             : Word32 L_rotl( Word32 var1, Word16 var2, Word16 *var3 );
      57             : 
      58             : Word16 norm_ul( UWord32 UL_var1 );
      59             : 
      60             : /*****************************************************************************
      61             :  *
      62             :  *  Functions
      63             :  *
      64             :  *****************************************************************************/
      65             : 
      66             : /*****************************************************************************
      67             :  *
      68             :  *  Function Name : s_max
      69             :  *
      70             :  *  Purpose :
      71             :  *
      72             :  *    Compares var1 and var2 and returns the maximum value.
      73             :  *
      74             :  *  Complexity weight : 1
      75             :  *
      76             :  *  Inputs :
      77             :  *
      78             :  *    var1        16 bit short signed integer (Word16) whose value falls in
      79             :  *                the range : 0x8000 <= var1 <= 0x7fff.
      80             :  *
      81             :  *    var2        16 bit short signed integer (Word16) whose value falls in
      82             :  *                the range : 0x8000 <= var2 <= 0x7fff.
      83             :  *
      84             :  *  Outputs :
      85             :  *
      86             :  *    none
      87             :  *
      88             :  *  Return Value :
      89             :  *
      90             :  *    var_out     16 bit short signed integer (Word16) whose value falls in
      91             :  *                the range : 0x8000 <= L_var_out <= 0x7fff.
      92             :  *
      93             :  *****************************************************************************/
      94 14964633336 : static __inline Word16 s_max( Word16 var1, Word16 var2 )
      95             : {
      96             :     Word16 var_out;
      97             : 
      98 14964633336 :     if ( var1 >= var2 )
      99 10431426473 :         var_out = var1;
     100             :     else
     101  4533206863 :         var_out = var2;
     102             : 
     103             : #ifdef WMOPS
     104             :     multiCounter[currCounter].s_max++;
     105             : #endif /* ifdef WMOPS */
     106             : 
     107 14964633336 :     return ( var_out );
     108             : }
     109             : 
     110             : 
     111             : /*****************************************************************************
     112             :  *
     113             :  *  Function Name : s_min
     114             :  *
     115             :  *  Purpose :
     116             :  *
     117             :  *    Compares var1 and var2 and returns the minimum value.
     118             :  *
     119             :  *  Complexity weight : 1
     120             :  *
     121             :  *  Inputs :
     122             :  *
     123             :  *    var1        16 bit short signed integer (Word16) whose value falls in
     124             :  *                the range : 0x8000  <= var1 <= 0x7fff.
     125             :  *
     126             :  *    var2        16 bit short signed integer (Word16) whose value falls in
     127             :  *                the range : 0x8000  <= var2 <= 0x7fff.
     128             :  *
     129             :  *  Outputs :
     130             :  *
     131             :  *    none
     132             :  *
     133             :  *  Return Value :
     134             :  *
     135             :  *    var_out     16 bit short signed integer (Word16) whose value falls in
     136             :  *                the range : 0x8000 <= var_out <= 0x7fff.
     137             :  *
     138             :  *****************************************************************************/
     139 21225740100 : static __inline Word16 s_min( Word16 var1, Word16 var2 )
     140             : {
     141             :     Word16 var_out;
     142             : 
     143 21225740100 :     if ( var1 <= var2 )
     144 16894920644 :         var_out = var1;
     145             :     else
     146  4330819456 :         var_out = var2;
     147             : 
     148             : #ifdef WMOPS
     149             :     multiCounter[currCounter].s_min++;
     150             : #endif /* ifdef WMOPS */
     151             : 
     152 21225740100 :     return ( var_out );
     153             : }
     154             : 
     155             : 
     156             : /*****************************************************************************
     157             :  *
     158             :  *  Function Name : L_max
     159             :  *
     160             :  *  Purpose :
     161             :  *
     162             :  *    Compares L_var1 and L_var2 and returns the maximum value.
     163             :  *
     164             :  *  Complexity weight : 1
     165             :  *
     166             :  *  Inputs :
     167             :  *
     168             :  *    L_var1      32 bit long signed integer (Word32) whose value falls in the
     169             :  *                range : 0x8000 0000  <= L_var1 <= 0x7fff ffff.
     170             :  *
     171             :  *    L_var2      32 bit long signed integer (Word32) whose value falls in the
     172             :  *                range : 0x8000 0000  <= L_var2 <= 0x7fff ffff.
     173             :  *
     174             :  *  Outputs :
     175             :  *
     176             :  *    none
     177             :  *
     178             :  *  Return Value :
     179             :  *
     180             :  *    L_var_out   32 bit long signed integer (Word32) whose value falls in the
     181             :  *                range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
     182             :  *
     183             :  *****************************************************************************/
     184 14175614868 : static __inline Word32 L_max( Word32 L_var1, Word32 L_var2 )
     185             : {
     186             :     Word32 L_var_out;
     187             : 
     188 14175614868 :     if ( L_var1 >= L_var2 )
     189 10710807906 :         L_var_out = L_var1;
     190             :     else
     191  3464806962 :         L_var_out = L_var2;
     192             : 
     193             : #ifdef WMOPS
     194             :     multiCounter[currCounter].L_max++;
     195             : #endif /* ifdef WMOPS */
     196             : 
     197 14175614868 :     return ( L_var_out );
     198             : }
     199             : 
     200             : 
     201             : /*****************************************************************************
     202             :  *
     203             :  *  Function Name : L_min
     204             :  *
     205             :  *  Purpose :
     206             :  *
     207             :  *    Compares L_var1 and L_var2 and returns the minimum value.
     208             :  *
     209             :  *  Complexity weight : 1
     210             :  *
     211             :  *  Inputs :
     212             :  *
     213             :  *    L_var1      32 bit long signed integer (Word32) whose value falls in the
     214             :  *                range : 0x8000 0000  <= L_var1 <= 0x7fff ffff.
     215             :  *
     216             :  *    L_var2      32 bit long signed integer (Word32) whose value falls in the
     217             :  *                range : 0x8000 0000  <= L_var2 <= 0x7fff ffff.
     218             :  *
     219             :  *  Outputs :
     220             :  *
     221             :  *    none
     222             :  *
     223             :  *  Return Value :
     224             :  *
     225             :  *    L_var_out   32 bit long signed integer (Word32) whose value falls in the
     226             :  *                range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
     227             :  *
     228             :  *****************************************************************************/
     229  6215466643 : static __inline Word32 L_min( Word32 L_var1, Word32 L_var2 )
     230             : {
     231             :     Word32 L_var_out;
     232             : 
     233  6215466643 :     if ( L_var1 <= L_var2 )
     234  6031767785 :         L_var_out = L_var1;
     235             :     else
     236   183698858 :         L_var_out = L_var2;
     237             : 
     238             : #ifdef WMOPS
     239             :     multiCounter[currCounter].L_min++;
     240             : #endif /* ifdef WMOPS */
     241             : 
     242  6215466643 :     return ( L_var_out );
     243             : }
     244             : 
     245             : 
     246             : /*****************************************************************************
     247             :  *
     248             :  *  Function Name : s_and
     249             :  *
     250             :  *  Purpose :
     251             :  *
     252             :  *    Performs logical AND of the two 16 bit input variables.
     253             :  *    var_out = var1 & var2
     254             :  *
     255             :  *  Complexity weight : 1
     256             :  *
     257             :  *  Inputs :
     258             :  *
     259             :  *    var1        16 bit short signed integer (Word16) whose value
     260             :  *                falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
     261             :  *
     262             :  *    var2        16 bit short signed integer (Word16) whose value
     263             :  *                falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
     264             :  *
     265             :  *  Outputs :
     266             :  *
     267             :  *    none
     268             :  *
     269             :  *  Return Value :
     270             :  *
     271             :  *    var_out     16 bit short signed integer (Word16) whose value
     272             :  *                falls in the range 0xffff 8000 <= var_out <= 0x0000 7fff.
     273             :  *
     274             :  *****************************************************************************/
     275  2936284115 : static __inline Word16 s_and( Word16 var1, Word16 var2 )
     276             : {
     277             :     Word16 var_out;
     278             : 
     279  2936284115 :     var_out = var1 & var2;
     280             : 
     281             : #ifdef WMOPS
     282             :     multiCounter[currCounter].s_and++;
     283             : #endif /* ifdef WMOPS */
     284             : 
     285  2936284115 :     return ( var_out );
     286             : }
     287             : 
     288             : 
     289             : /*****************************************************************************
     290             :  *
     291             :  *  Function Name : L_and
     292             :  *
     293             :  *  Purpose :
     294             :  *
     295             :  *    Performs logical AND of the two 32 bit input variables.
     296             :  *    L_var_out = L_var1 & L_var2
     297             :  *
     298             :  *  Complexity weight : 1
     299             :  *
     300             :  *  Inputs :
     301             :  *
     302             :  *    L_var1      32 bit long signed integer (Word32) whose value
     303             :  *                falls in the range 0x8000 0000 <= L_var1 <= 0x7fff ffff.
     304             :  *
     305             :  *    L_var2      32 bit long signed integer (Word32) whose value
     306             :  *                falls in the range 0x8000 0000 <= L_var2 <= 0x7fff ffff.
     307             :  *
     308             :  *  Outputs :
     309             :  *
     310             :  *    none
     311             :  *
     312             :  *  Return Value :
     313             :  *
     314             :  *    L_var_out   32 bit long signed integer (Word32) whose value
     315             :  *                falls in the range 0x8000 0000 <= L_var_out <= 0x7fff ffff.
     316             :  *
     317             :  *****************************************************************************/
     318   632942444 : static __inline Word32 L_and( Word32 L_var1, Word32 L_var2 )
     319             : {
     320             :     Word32 L_var_out;
     321             : 
     322   632942444 :     L_var_out = L_var1 & L_var2;
     323             : 
     324             : #ifdef WMOPS
     325             :     multiCounter[currCounter].L_and++;
     326             : #endif /* ifdef WMOPS */
     327             : 
     328   632942444 :     return ( L_var_out );
     329             : }
     330             : 
     331             : 
     332             : /*****************************************************************************
     333             :  *
     334             :  *  Function Name : s_or
     335             :  *
     336             :  *  Purpose :
     337             :  *
     338             :  *    Performs logical OR of the two 16 bit input variables.
     339             :  *    var_out = var1 | var2
     340             :  *
     341             :  *  Complexity weight : 1
     342             :  *
     343             :  *  Inputs :
     344             :  *
     345             :  *    var1        16 bit short signed integer (Word16) whose value
     346             :  *                falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
     347             :  *
     348             :  *    var2        16 bit short signed integer (Word16) whose value
     349             :  *                falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
     350             :  *
     351             :  *  Outputs :
     352             :  *
     353             :  *    none
     354             :  *
     355             :  *  Return Value :
     356             :  *
     357             :  *    var_out     16 bit short signed integer (Word16) whose value
     358             :  *                falls in the range 0xffff 8000 <= var_out <= 0x0000 7fff.
     359             :  *
     360             :  *****************************************************************************/
     361   509602060 : static __inline Word16 s_or( Word16 var1, Word16 var2 )
     362             : {
     363             :     Word16 var_out;
     364             : 
     365   509602060 :     var_out = var1 | var2;
     366             : 
     367             : #ifdef WMOPS
     368             :     multiCounter[currCounter].s_or++;
     369             : #endif /* ifdef WMOPS */
     370             : 
     371   509602060 :     return ( var_out );
     372             : }
     373             : 
     374             : 
     375             : /*****************************************************************************
     376             :  *
     377             :  *  Function Name : L_or
     378             :  *
     379             :  *  Purpose :
     380             :  *
     381             :  *    Performs logical OR of the two 32 bit input variables.
     382             :  *    L_var_out = L_var1 | L_var2
     383             :  *
     384             :  *  Complexity weight : 1
     385             :  *
     386             :  *  Inputs :
     387             :  *
     388             :  *    L_var1      32 bit long signed integer (Word32) whose value
     389             :  *                falls in the range 0x8000 0000 <= L_var1 <= 0x7fff ffff.
     390             :  *
     391             :  *    L_var2      32 bit long signed integer (Word32) whose value
     392             :  *                falls in the range 0x8000 0000 <= L_var2 <= 0x7fff ffff.
     393             :  *
     394             :  *  Outputs :
     395             :  *
     396             :  *    none
     397             :  *
     398             :  *  Return Value :
     399             :  *
     400             :  *    L_var_out   32 bit long signed integer (Word32) whose value
     401             :  *                falls in the range 0x8000 0000 <= L_var_out <= 0x7fff ffff.
     402             :  *
     403             :  *****************************************************************************/
     404  1573584958 : static __inline Word32 L_or( Word32 L_var1, Word32 L_var2 )
     405             : {
     406             : 
     407             :     Word32 L_var_out;
     408             : 
     409  1573584958 :     L_var_out = L_var1 | L_var2;
     410             : 
     411             : #ifdef WMOPS
     412             :     multiCounter[currCounter].L_or++;
     413             : #endif /* ifdef WMOPS */
     414             : 
     415  1573584958 :     return ( L_var_out );
     416             : }
     417             : 
     418             : 
     419             : /*****************************************************************************
     420             :  *
     421             :  *  Function Name : s_xor
     422             :  *
     423             :  *  Purpose :
     424             :  *
     425             :  *    Performs logical XOR of the two 16 bit input variables.
     426             :  *    var_out = var1 ^ var2
     427             :  *
     428             :  *  Complexity weight : 1
     429             :  *
     430             :  *  Inputs :
     431             :  *
     432             :  *    var1        16 bit short signed integer (Word16) whose value
     433             :  *                falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
     434             :  *
     435             :  *    var2        16 bit short signed integer (Word16) whose value
     436             :  *                falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
     437             :  *
     438             :  *  Outputs :
     439             :  *
     440             :  *    none
     441             :  *
     442             :  *  Return Value :
     443             :  *
     444             :  *    var_out     16 bit short signed integer (Word16) whose value
     445             :  *                falls in the range 0xffff 8000 <= var_out <= 0x0000 7fff.
     446             :  *
     447             :  *****************************************************************************/
     448   352934537 : static __inline Word16 s_xor( Word16 var1, Word16 var2 )
     449             : {
     450             :     Word16 var_out;
     451             : 
     452   352934537 :     var_out = var1 ^ var2;
     453             : 
     454             : #ifdef WMOPS
     455             :     multiCounter[currCounter].s_xor++;
     456             : #endif /* ifdef WMOPS */
     457             : 
     458   352934537 :     return ( var_out );
     459             : }
     460             : 
     461             : 
     462             : /*****************************************************************************
     463             :  *
     464             :  *  Function Name : L_xor
     465             :  *
     466             :  *  Purpose :
     467             :  *
     468             :  *    Performs logical OR of the two 32 bit input variables.
     469             :  *    L_var_out = L_var1 ^ L_var2
     470             :  *
     471             :  *  Complexity weight : 1
     472             :  *
     473             :  *  Inputs :
     474             :  *
     475             :  *    L_var1      32 bit long signed integer (Word32) whose value
     476             :  *                falls in the range 0x8000 0000 <= L_var1 <= 0x7fff ffff.
     477             :  *
     478             :  *    L_var2      32 bit long signed integer (Word32) whose value
     479             :  *                falls in the range 0x8000 0000 <= L_var2 <= 0x7fff ffff.
     480             :  *
     481             :  *  Outputs :
     482             :  *
     483             :  *    none
     484             :  *
     485             :  *  Return Value :
     486             :  *
     487             :  *    L_var_out   32 bit long signed integer (Word32) whose value
     488             :  *                falls in the range 0x8000 0000 <= L_var_out <= 0x7fff ffff.
     489             :  *
     490             :  *****************************************************************************/
     491    38238903 : static __inline Word32 L_xor( Word32 L_var1, Word32 L_var2 )
     492             : {
     493             :     Word32 L_var_out;
     494             : 
     495    38238903 :     L_var_out = L_var1 ^ L_var2;
     496             : 
     497             : #ifdef WMOPS
     498             :     multiCounter[currCounter].L_xor++;
     499             : #endif /* ifdef WMOPS */
     500             : 
     501    38238903 :     return ( L_var_out );
     502             : }
     503             : 
     504             : 
     505             : #endif /*_ENH1632_H*/
     506             : 
     507             : /* end of file */

Generated by: LCOV version 1.14