os/mm/mmlibs/mmfw/Codecs/Src/Gsm610CodecCommon/basicop.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include "basicop.h"
sl@0
    17
sl@0
    18
/*
sl@0
    19
** int2 add( int2 var1, int2 var2 )
sl@0
    20
**
sl@0
    21
** Function performs the addition (var1+var2) with overflow control
sl@0
    22
** and saturation; the result is set at +32767 when overflow occurs
sl@0
    23
** or at -32768 when underflow occurs
sl@0
    24
**
sl@0
    25
** Input:
sl@0
    26
**   var1, var2
sl@0
    27
**     16-bit variables to be summed
sl@0
    28
**
sl@0
    29
** Output:
sl@0
    30
**   Sum of var and var2, see description above
sl@0
    31
**  
sl@0
    32
** Return value:
sl@0
    33
**   See above
sl@0
    34
*/
sl@0
    35
/*
sl@0
    36
** One way to implement saturation control to add and sub is to
sl@0
    37
** use temporary result that has enough bits to make overflow
sl@0
    38
** impossible and the limit the final result
sl@0
    39
*/
sl@0
    40
int2 add( int2 var1, int2 var2 )
sl@0
    41
{
sl@0
    42
  int4 L_temp;
sl@0
    43
  
sl@0
    44
  L_temp = (int4) var1 + var2;
sl@0
    45
  
sl@0
    46
  if ( L_temp < MININT2 )
sl@0
    47
    return MININT2;
sl@0
    48
  else if ( L_temp > MAXINT2 )
sl@0
    49
    return MAXINT2;
sl@0
    50
  else
sl@0
    51
    return (int2) L_temp;
sl@0
    52
}
sl@0
    53
sl@0
    54
sl@0
    55
/*
sl@0
    56
** int2 sub( int2 var1, int2 var2 )
sl@0
    57
**
sl@0
    58
** Function performs the subtraction (var1-var2) with overflow control
sl@0
    59
** and saturation; the result is set at +32767 when overflow occurs
sl@0
    60
** or at -32768 when underflow occurs
sl@0
    61
**
sl@0
    62
** Input:
sl@0
    63
**   var1, var2
sl@0
    64
**     16-bit variables to be summed
sl@0
    65
**
sl@0
    66
** Output:
sl@0
    67
**   Sum of var and var2, see description above
sl@0
    68
**  
sl@0
    69
** Return value:
sl@0
    70
**   See above
sl@0
    71
*/
sl@0
    72
int2 sub( int2 var1, int2 var2 )
sl@0
    73
{
sl@0
    74
  int4 L_temp;
sl@0
    75
  
sl@0
    76
  L_temp = (int4) var1 - var2;
sl@0
    77
  
sl@0
    78
  if ( L_temp < MININT2 )
sl@0
    79
    return MININT2;
sl@0
    80
  else if ( L_temp > MAXINT2 )
sl@0
    81
    return MAXINT2;
sl@0
    82
  else
sl@0
    83
    return (int2) L_temp;
sl@0
    84
}
sl@0
    85
sl@0
    86
sl@0
    87
sl@0
    88
/*
sl@0
    89
** int2 mult( int2 var1, int2 var2 )
sl@0
    90
**
sl@0
    91
** Function performs the multiplication of var1 by var2 and gives a
sl@0
    92
** 16-bit result which is scaled ie
sl@0
    93
**   mult( var1, var2 ) = (var1 times var2) >> 15
sl@0
    94
** and
sl@0
    95
**   mult( -32768, -32768 ) = 32767 
sl@0
    96
**
sl@0
    97
** Input:
sl@0
    98
**   var1, var2
sl@0
    99
**     16-bit variables to be multiplied
sl@0
   100
**
sl@0
   101
** Output:
sl@0
   102
**   Scaled result of multiplication
sl@0
   103
**  
sl@0
   104
** Return value:
sl@0
   105
**   See above
sl@0
   106
*/
sl@0
   107
int2 mult( int2 var1, int2 var2 )
sl@0
   108
{
sl@0
   109
  if ( ( var1 == MININT2 ) && ( var1 == var2 ) )
sl@0
   110
    return MAXINT2;
sl@0
   111
  else
sl@0
   112
    /* Note int4 cast of var1 to force 32-bit arithmetic */
sl@0
   113
   return( (int2) ( ( (int4) var1 * var2 ) >> 15 ) );
sl@0
   114
}
sl@0
   115
sl@0
   116
sl@0
   117
/*
sl@0
   118
** int2 abs_s( int2 var1 )
sl@0
   119
**
sl@0
   120
** Function returns absolute value of var1 with possible saturation:
sl@0
   121
**   abs( -32768 ) = 32767
sl@0
   122
**
sl@0
   123
** Input:
sl@0
   124
**   var1
sl@0
   125
**     16-bit variable
sl@0
   126
**
sl@0
   127
** Output:
sl@0
   128
**   absolute value of var1
sl@0
   129
**  
sl@0
   130
** Return value:
sl@0
   131
**   See above
sl@0
   132
*/
sl@0
   133
int2 abs_s( int2 var1 )
sl@0
   134
{
sl@0
   135
  if ( var1 == MININT2 )
sl@0
   136
    return MAXINT2;
sl@0
   137
  else
sl@0
   138
    return ( var1 > 0 ) ? var1 : int2 (-var1);
sl@0
   139
}
sl@0
   140
sl@0
   141
sl@0
   142
#ifdef L_MULTF
sl@0
   143
/* else implemented using macro (basicop.h) */
sl@0
   144
sl@0
   145
/*
sl@0
   146
** int4 L_mult( int2 var1, int2 var2 )
sl@0
   147
**
sl@0
   148
** Function performs the multiplication of var1 by var2 and gives a
sl@0
   149
** 32-bit result which is scaled by shifting result one bit left ie
sl@0
   150
**   L_mult( var1, var2 ) = (var1 times var2) << 1
sl@0
   151
**
sl@0
   152
**   L_mult( -32768, -32768 ) does not occur in algorithm
sl@0
   153
**
sl@0
   154
** Input:
sl@0
   155
**   var1, var2
sl@0
   156
**     16-bit variables to be multiplied
sl@0
   157
**
sl@0
   158
** Output:
sl@0
   159
**   Scaled result of multiplication
sl@0
   160
**  
sl@0
   161
** Return value:
sl@0
   162
**   See above
sl@0
   163
*/
sl@0
   164
int4 L_mult( int2 var1, int2 var2 )
sl@0
   165
{
sl@0
   166
  /* Note int4 cast of var1 to force 32-bit arithmetic */
sl@0
   167
  return ( L_shl( (int4) var1 * var2 ), 1 );
sl@0
   168
}
sl@0
   169
#endif /* L_MULTF */
sl@0
   170
sl@0
   171
sl@0
   172
sl@0
   173
/*
sl@0
   174
** int2 shr( int2 var1, int2 var2 )
sl@0
   175
**
sl@0
   176
** Function makes arithmetic var2-bit shift right of var1. If var2 is
sl@0
   177
** less than 0, this operation becomes arithmetic left shift of -var2
sl@0
   178
**
sl@0
   179
** Input:
sl@0
   180
**   var1
sl@0
   181
**     16-bit variable to be shifted
sl@0
   182
**   var2
sl@0
   183
**     amount of bits to be shifted
sl@0
   184
**
sl@0
   185
** Output:
sl@0
   186
**   16-bit value of shifted var1 is returned 
sl@0
   187
**  
sl@0
   188
** Return value:
sl@0
   189
**   See above
sl@0
   190
*/
sl@0
   191
int2 shr( int2 var1, int2 var2 )
sl@0
   192
{
sl@0
   193
  return shl( var1, int2 (-var2) );
sl@0
   194
}
sl@0
   195
sl@0
   196
sl@0
   197
/*
sl@0
   198
** int2 negate( int2 var1 )
sl@0
   199
**
sl@0
   200
** Function negates 16-bit variable var1. 
sl@0
   201
**   negate( -32768 ) = 32767
sl@0
   202
**
sl@0
   203
** Input:
sl@0
   204
**   var1
sl@0
   205
**     16-bit variable to be negated
sl@0
   206
**
sl@0
   207
** Output:
sl@0
   208
**   negated var1
sl@0
   209
**  
sl@0
   210
** Return value:
sl@0
   211
**   See above
sl@0
   212
*/
sl@0
   213
int2 negate( int2 var1 )
sl@0
   214
{
sl@0
   215
  if ( var1 == MININT2 )
sl@0
   216
    return MAXINT2;
sl@0
   217
  else
sl@0
   218
    return int2 (-var1);
sl@0
   219
}
sl@0
   220
sl@0
   221
sl@0
   222
/*
sl@0
   223
** int2 extract_h( int4 L_var1 )
sl@0
   224
**
sl@0
   225
** Function returns upper word (16 most significat bits) of the 
sl@0
   226
** 32-bit variable L_var1
sl@0
   227
**
sl@0
   228
** Input:
sl@0
   229
**   L_var1
sl@0
   230
**     32-bit variable
sl@0
   231
**
sl@0
   232
** Output:
sl@0
   233
**   upper word of the L_var1
sl@0
   234
**  
sl@0
   235
** Return value:
sl@0
   236
**   See above
sl@0
   237
*/
sl@0
   238
int2 extract_h( int4 L_var1 )
sl@0
   239
{
sl@0
   240
  return (int2) ( L_var1 >> 16 );
sl@0
   241
}
sl@0
   242
sl@0
   243
sl@0
   244
/*
sl@0
   245
** int2 extract_l( int4 L_var1 )
sl@0
   246
**
sl@0
   247
** Function returns lower word (16 least significat bits) of the
sl@0
   248
** 32-bit variable L_var1
sl@0
   249
**
sl@0
   250
** Input:
sl@0
   251
**   L_var1
sl@0
   252
**     32-bit variable
sl@0
   253
**
sl@0
   254
** Output:
sl@0
   255
**   lower word of L_var1
sl@0
   256
**  
sl@0
   257
** Return value:
sl@0
   258
**   See above
sl@0
   259
*/
sl@0
   260
int2 extract_l( int4 L_var1 )
sl@0
   261
{
sl@0
   262
  return (int2) (L_var1 & 0x0000ffff);
sl@0
   263
}
sl@0
   264
sl@0
   265
sl@0
   266
/*
sl@0
   267
** int4 L_mac( int4 L_var3, int2 var1, int2 var2 )
sl@0
   268
**
sl@0
   269
** Function multiplies var1 by var2 and shifts result left by one bit.
sl@0
   270
** Shifted result of multiplication is then added to L_var3 and result
sl@0
   271
** is returned. Summation is done with overflow control and saturation;
sl@0
   272
** the result is set at 2147483647 when overflow occurs and at
sl@0
   273
** -2147483648 when underflow occurs
sl@0
   274
**
sl@0
   275
** Input:
sl@0
   276
**   var1
sl@0
   277
**     16-bit multiplicant
sl@0
   278
**   var2
sl@0
   279
**     16-bit multiplier
sl@0
   280
**
sl@0
   281
**   L_var3
sl@0
   282
**     32-bit number that is summed with (var1*var2)<<1
sl@0
   283
**
sl@0
   284
** Output:
sl@0
   285
**   See description above
sl@0
   286
**  
sl@0
   287
** Return value:
sl@0
   288
**   See above
sl@0
   289
*/
sl@0
   290
int4 L_mac( int4 L_var3, int2 var1, int2 var2 )
sl@0
   291
{
sl@0
   292
  int4 L_temp;
sl@0
   293
sl@0
   294
  L_temp = ( (int4) var1 * var2 ) << 1;
sl@0
   295
  return L_add( L_var3, L_temp );
sl@0
   296
}
sl@0
   297
sl@0
   298
sl@0
   299
/*
sl@0
   300
** int4 L_add( int4 L_var1, int4 L_var2 )
sl@0
   301
**
sl@0
   302
** Function performs 32-bit addition of two 32-bit variables
sl@0
   303
** (L_var1 + L_var2) with overflow control and saturation; the
sl@0
   304
** result is set at 2147483647 when overflow occurs and at
sl@0
   305
** -2147483648 when underflow occurs
sl@0
   306
**
sl@0
   307
** Input:
sl@0
   308
**   L_var1, L_var2
sl@0
   309
**     32-bit variables to be summed
sl@0
   310
**
sl@0
   311
** Output:
sl@0
   312
**   32-bit result, see description above
sl@0
   313
**  
sl@0
   314
** Return value:
sl@0
   315
**   See above
sl@0
   316
*/
sl@0
   317
int4 L_add( int4 L_var1, int4 L_var2 )
sl@0
   318
{
sl@0
   319
  int4 L_temp1;
sl@0
   320
  int temp2; /* used for storing sign of L_var1 */
sl@0
   321
  
sl@0
   322
  L_temp1 = L_var1 + L_var2;
sl@0
   323
sl@0
   324
  /*
sl@0
   325
   * Overflow
sl@0
   326
   *   if sign(L_var1)==sign(L_var2) && sign(L_var1)!=sign(L_temp1).
sl@0
   327
   */
sl@0
   328
sl@0
   329
  if ( ( temp2 = (L_var1 < 0) ) == ( L_var2 < 0 ) 
sl@0
   330
    && ( temp2 != ( L_temp1 < 0 ) ) ) {
sl@0
   331
      L_temp1 = temp2 ? MININT4 : MAXINT4;
sl@0
   332
  }
sl@0
   333
sl@0
   334
  return L_temp1;
sl@0
   335
}
sl@0
   336
sl@0
   337
sl@0
   338
/*
sl@0
   339
** int4 L_sub( int4 L_var1, int4 L_var2 )
sl@0
   340
**
sl@0
   341
** Function performs 32-bit subtraction of two 32-bit variables
sl@0
   342
** (L_var1 - L_var2) with overflow control and saturation; the
sl@0
   343
** result is set at 2147483647 when overflow occurs and at
sl@0
   344
** -2147483648 when underflow occurs
sl@0
   345
**
sl@0
   346
** Input:
sl@0
   347
**   L_var1, L_var2
sl@0
   348
**     32-bit variables to be summed
sl@0
   349
**
sl@0
   350
** Output:
sl@0
   351
**   32-bit result, see description above
sl@0
   352
**  
sl@0
   353
** Return value:
sl@0
   354
**   See above
sl@0
   355
*/
sl@0
   356
int4 L_sub( int4 L_var1, int4 L_var2 )
sl@0
   357
{
sl@0
   358
  int4 L_temp1;
sl@0
   359
  int temp2;
sl@0
   360
sl@0
   361
  L_temp1 = L_var1 - L_var2;
sl@0
   362
sl@0
   363
  /*
sl@0
   364
   * Overflow
sl@0
   365
   *   if sign(L_var1)!=sign(L_var2) && sign(L_var1)!=sign(L_temp).
sl@0
   366
   */
sl@0
   367
sl@0
   368
  if ( ( temp2 = ( L_var1 < 0 ) ) != ( L_var2 < 0 ) 
sl@0
   369
    && ( temp2 != ( L_temp1 < 0 ) ) ) {
sl@0
   370
      L_temp1 = temp2 ? MININT4 : MAXINT4;
sl@0
   371
  }
sl@0
   372
sl@0
   373
  return L_temp1;
sl@0
   374
}
sl@0
   375
sl@0
   376
sl@0
   377
/*
sl@0
   378
** int2 mult_r( int2 var1, int2 var2 )
sl@0
   379
**
sl@0
   380
** Function performs the multiplication of var1 by var2 and gives a
sl@0
   381
** 16-bit result which is scaled with rounding ie
sl@0
   382
**   mult_r(var1, var2) = ((var1 times var2) + 16384) >> 15
sl@0
   383
** and
sl@0
   384
**   mult_r( -32768, -32768 ) = 32767 
sl@0
   385
**
sl@0
   386
** Input:
sl@0
   387
**   var1, var2
sl@0
   388
**     16-bit variables to be multiplied
sl@0
   389
**
sl@0
   390
** Output:
sl@0
   391
**   16-bit scaled result of multiplication
sl@0
   392
**  
sl@0
   393
** Return value:
sl@0
   394
**   See above
sl@0
   395
*/
sl@0
   396
int2 mult_r( int2 var1, int2 var2 )
sl@0
   397
{
sl@0
   398
  if ( ( var1 == MININT2 ) && ( var1 == var2 ) )
sl@0
   399
    return MAXINT2;
sl@0
   400
  else
sl@0
   401
    /* Note int4 cast of var1 to force 32-bit arithmetic */
sl@0
   402
    return( (int2) ( ( (int4) var1 * var2 + (int4) 16384 ) >> 15 ) );
sl@0
   403
}
sl@0
   404
sl@0
   405
/*
sl@0
   406
** int4 L_shr( int4 L_var1, int2 var2 )
sl@0
   407
**
sl@0
   408
** Function makes arithmetic var2-bit shift right of var1. If var2 is
sl@0
   409
** less than 0, this operation becomes arithmetic left shift of -var2
sl@0
   410
**
sl@0
   411
** Input:
sl@0
   412
**   L_var1
sl@0
   413
**     32-bit variable to be shifted
sl@0
   414
**   var2
sl@0
   415
**     amount of bits to be shifted
sl@0
   416
**
sl@0
   417
** Output:
sl@0
   418
**   16-bit value of shifted var1
sl@0
   419
**  
sl@0
   420
** Return value:
sl@0
   421
**   See above
sl@0
   422
*/
sl@0
   423
int4 L_shr( int4 L_var1, int2 var2 )
sl@0
   424
{
sl@0
   425
  return L_shl( L_var1, int2 (-var2) );
sl@0
   426
}
sl@0
   427
sl@0
   428
sl@0
   429
/*
sl@0
   430
** int4 L_deposit_h( int2 var1 )
sl@0
   431
**
sl@0
   432
** Function deposits the 16-bit variable var1 into the 16 most
sl@0
   433
** significant bits of the 32-bit word. The 16 least significant
sl@0
   434
** bits of the result are zeroed.
sl@0
   435
**
sl@0
   436
** Input:
sl@0
   437
**   var1
sl@0
   438
**     16-bit variable to be loaded to the upper 16 bits of
sl@0
   439
**     of the 32-bit variable
sl@0
   440
**
sl@0
   441
** Output:
sl@0
   442
**   32-bit number, see description above
sl@0
   443
**  
sl@0
   444
** Return value:
sl@0
   445
**   See above
sl@0
   446
*/
sl@0
   447
int4 L_deposit_h( int2 var1 )
sl@0
   448
{
sl@0
   449
  return ( (int4) var1 ) << 16;
sl@0
   450
}
sl@0
   451
sl@0
   452
sl@0
   453
/*
sl@0
   454
** int4 L_deposit_l( int2 var1 )
sl@0
   455
**
sl@0
   456
** Function deposits the 16-bit variable var1 into the 16 least
sl@0
   457
** significant bits of the 32-bit word. The 16 most significant bits
sl@0
   458
** of the result are sign extended.
sl@0
   459
**
sl@0
   460
** Input:
sl@0
   461
**   var1
sl@0
   462
**     16-bit variable to be converted to 32-bit variable
sl@0
   463
**
sl@0
   464
** Output:
sl@0
   465
**   32-bit variable that has same magnitude than var1
sl@0
   466
**  
sl@0
   467
** Return value:
sl@0
   468
**   See above
sl@0
   469
*/
sl@0
   470
int4 L_deposit_l( int2 var1 )
sl@0
   471
{
sl@0
   472
  return (int4) var1;
sl@0
   473
}
sl@0
   474
sl@0
   475
sl@0
   476
/*
sl@0
   477
** int2 norm_s( int2 var1 )
sl@0
   478
**
sl@0
   479
** Function produces number of left shifts needed to normalize the
sl@0
   480
** 16-bit variable var1 for positive values on the interval with
sl@0
   481
** minimum of 16384 and maximum of 32767 and for negative
sl@0
   482
** values on the interval with minimum of -32768 and maximum of
sl@0
   483
** -16384; in order to normalize the result, the following
sl@0
   484
** operation must be done:
sl@0
   485
**   norm_var1 = var1 << norm_s(var1)
sl@0
   486
**
sl@0
   487
** Input:
sl@0
   488
**   var1
sl@0
   489
**     16-bit variable which normalization factor is solved
sl@0
   490
**
sl@0
   491
** Output:
sl@0
   492
**   see description above
sl@0
   493
**  
sl@0
   494
** Return value:
sl@0
   495
**   See above
sl@0
   496
*/
sl@0
   497
int2 norm_s( int2 var1 )
sl@0
   498
{
sl@0
   499
  int2 cntr = 0;
sl@0
   500
sl@0
   501
  /* Special case when L_var1 == -32768: shift leads to underflow */
sl@0
   502
  if ( var1 == MININT2 )
sl@0
   503
    return 0;
sl@0
   504
  /* Special case when var1 == 0: shift does not change the value */
sl@0
   505
  else if ( var1 == 0 )
sl@0
   506
    return 0;
sl@0
   507
  else {
sl@0
   508
    if ( var1 < 0 ) {
sl@0
   509
      for ( ; var1 >= -16384; var1 *= 2 )
sl@0
   510
	cntr++;      
sl@0
   511
    }
sl@0
   512
    else {
sl@0
   513
      for ( ; var1 < 16384; var1 <<= 1 )
sl@0
   514
	cntr++;
sl@0
   515
    }
sl@0
   516
sl@0
   517
    return cntr;
sl@0
   518
  }
sl@0
   519
}
sl@0
   520
sl@0
   521
sl@0
   522
/*
sl@0
   523
** int2 norm_l( int4 L_var1 )
sl@0
   524
**
sl@0
   525
** Function produces number of left shifts needed to normalize the
sl@0
   526
** 32-bit variable L_var1 for positive values on the interval with
sl@0
   527
** minimum of 1073741824 and maximum of 2147483647 and for negative
sl@0
   528
** values on the interval with minimum of -2147483648 and maximum of
sl@0
   529
** -1073741824; in order to normalize the result, the following
sl@0
   530
** operation must be done:
sl@0
   531
**   L_norm_var1 = L_var1 << norm_l(L_var1)
sl@0
   532
**
sl@0
   533
** Input:
sl@0
   534
**   L_var1
sl@0
   535
**     32-bit variable which normalization factor is solved
sl@0
   536
**
sl@0
   537
** Output:
sl@0
   538
**   see description above
sl@0
   539
**  
sl@0
   540
** Return value:
sl@0
   541
**   See above
sl@0
   542
*/
sl@0
   543
int2 norm_l( int4 L_var1 )
sl@0
   544
{
sl@0
   545
  int2 cntr = 0;
sl@0
   546
sl@0
   547
  /* Special case when L_var1 == -2147483648: shift leads to underflow */
sl@0
   548
  if ( L_var1 == MININT4 )
sl@0
   549
    return 0;
sl@0
   550
  /* Special case when L_var1 == 0: shift does not change the value */
sl@0
   551
  else if ( L_var1 == 0 )
sl@0
   552
    return 0;
sl@0
   553
  else {
sl@0
   554
    if ( L_var1 < 0 ) {
sl@0
   555
      for ( ; L_var1 >= (int4) -1073741824L; L_var1 *= 2 )
sl@0
   556
	cntr++;
sl@0
   557
    }
sl@0
   558
    else {
sl@0
   559
      for ( ; L_var1 < (int4) 1073741824L; L_var1 <<= 1 )
sl@0
   560
	cntr++;
sl@0
   561
    }
sl@0
   562
sl@0
   563
    return cntr;
sl@0
   564
  }
sl@0
   565
}
sl@0
   566
sl@0
   567
sl@0
   568
/*
sl@0
   569
** int2 div_s( int2 num, int2 denum )
sl@0
   570
**
sl@0
   571
** Function produces a result which is the fractional integer division
sl@0
   572
** of var1 by var2; var1 and var2 must be positive and var2 must be
sl@0
   573
** greater or equal to var1; The result is positive (leading bit equal
sl@0
   574
** to 0) and truncated to 16 bits. If var1 == var2 then
sl@0
   575
**   div_s( var1, var2 ) = 32767
sl@0
   576
**
sl@0
   577
** Input:
sl@0
   578
**   L_var1
sl@0
   579
**     32-bit variable which normalization factor is solved
sl@0
   580
**
sl@0
   581
** Output:
sl@0
   582
**   16-bit result, see description above
sl@0
   583
**  
sl@0
   584
** Return value:
sl@0
   585
**   See above
sl@0
   586
*/
sl@0
   587
int2 div_s( int2 num, int2 denum )
sl@0
   588
{
sl@0
   589
  if ( num == denum )
sl@0
   590
    return MAXINT2;
sl@0
   591
  else
sl@0
   592
    return (int2) ( ( ( (int4) num ) << 15 ) / denum );
sl@0
   593
}
sl@0
   594
sl@0
   595
sl@0
   596
/*
sl@0
   597
** int2 shl( int2 var1, int2 var2 )
sl@0
   598
**
sl@0
   599
** Function makes arithmetic var2-bit shift left of var1. If var2 is
sl@0
   600
** less than 0, this operation becomes arithmetic right shift of -var2
sl@0
   601
**
sl@0
   602
** Input:
sl@0
   603
**   var1
sl@0
   604
**     16-bit variable to be shifted
sl@0
   605
**   var2
sl@0
   606
**     amount of bits to be shifted
sl@0
   607
**
sl@0
   608
** Output:
sl@0
   609
**   16-bit value of shifted var1 is retuned 
sl@0
   610
**  
sl@0
   611
** Return value:
sl@0
   612
**   See above
sl@0
   613
**
sl@0
   614
** Notes:
sl@0
   615
**   ANSI C does not guarantee that right shift is arithmetical
sl@0
   616
**   (that sign extension is done during shifting). That is why in this
sl@0
   617
**   routine negative values are complemented before shifting.
sl@0
   618
*/
sl@0
   619
int2 shl( int2 var1, int2 var2 )
sl@0
   620
{
sl@0
   621
  int2 result;
sl@0
   622
sl@0
   623
  if ( ( var1 == 0 ) || ( var2 == 0 ) ) {
sl@0
   624
    result = var1;
sl@0
   625
  }
sl@0
   626
  
sl@0
   627
  /* var2 > 0: Perform left shift */
sl@0
   628
  else if ( var2 > 0 ) {
sl@0
   629
    if ( var2 >= 15 ) {
sl@0
   630
      result = ( var1 < 0 ) ? int2(MININT2) : int2(MAXINT2);
sl@0
   631
    }
sl@0
   632
    else {
sl@0
   633
sl@0
   634
      int4 L_temp;
sl@0
   635
      
sl@0
   636
      L_temp = (int4) var1 << var2;
sl@0
   637
      if ( L_temp < MININT2 ) {
sl@0
   638
	result = MININT2;
sl@0
   639
      }
sl@0
   640
      else if ( L_temp > MAXINT2 ) {
sl@0
   641
	result = MAXINT2;
sl@0
   642
      }
sl@0
   643
      else {
sl@0
   644
	result = (int2) L_temp;
sl@0
   645
      }
sl@0
   646
    }
sl@0
   647
  }
sl@0
   648
  /* var2 < 0: Perform right shift */
sl@0
   649
  else {
sl@0
   650
    if ( -var2 >= 15 ) {
sl@0
   651
      result = ( var1 < 0 ) ? int2 (-1) : int2 (0);
sl@0
   652
    }
sl@0
   653
    else if ( var1 < 0 ) {
sl@0
   654
      result = int2 (~( (~var1) >> -var2 )); /* ~ used to ensure arith. shift */
sl@0
   655
    }
sl@0
   656
    else {
sl@0
   657
      result = int2 (var1 >> -var2);
sl@0
   658
    }
sl@0
   659
  }
sl@0
   660
sl@0
   661
  return result;
sl@0
   662
  
sl@0
   663
}
sl@0
   664
sl@0
   665
sl@0
   666
/*
sl@0
   667
** int4 L_shl( int4 L_var1, int2 var2 )
sl@0
   668
**
sl@0
   669
** Function makes arithmetic var2-bit shift left of var1. If var2 is
sl@0
   670
** less than 0, this operation becomes arithmetic right shift of -var2
sl@0
   671
**
sl@0
   672
** Input:
sl@0
   673
**   L_var1
sl@0
   674
**     32-bit variable to be shifted
sl@0
   675
**   var2
sl@0
   676
**     amount of bits to be shifted
sl@0
   677
**
sl@0
   678
** Output:
sl@0
   679
**   32-bit value of shifted var1 is retuned 
sl@0
   680
**  
sl@0
   681
** Return value:
sl@0
   682
**   See above
sl@0
   683
**
sl@0
   684
** Notes:
sl@0
   685
**   ANSI C does not guarantee that right shift is arithmetical
sl@0
   686
**   (that sign extension is done during shifting). That is why in this
sl@0
   687
**   routine negative values are complemented before shifting.
sl@0
   688
*/
sl@0
   689
sl@0
   690
int4 L_shl(int4 L_var1, int2 var2 )
sl@0
   691
{
sl@0
   692
  if ( ( L_var1 == 0L ) || ( var2 == 0 ) ) {
sl@0
   693
    return L_var1;
sl@0
   694
  }
sl@0
   695
  /* var2 > 0: Perform left shift */
sl@0
   696
  else if ( var2 > 0 ) {
sl@0
   697
    if ( var2 >= 31 ) {
sl@0
   698
      return ( L_var1 < 0 ) ? MININT4 : MAXINT4;
sl@0
   699
    }
sl@0
   700
    else {
sl@0
   701
      for( ; var2 > 0; var2-- ) {
sl@0
   702
	if ( L_var1 > (MAXINT4 >> 1) )
sl@0
   703
	  return MAXINT4;
sl@0
   704
	else if ( L_var1 < (MININT4 / 2) )
sl@0
   705
	  return MININT4;
sl@0
   706
	else
sl@0
   707
	  L_var1 *= 2;
sl@0
   708
      }
sl@0
   709
      return L_var1;
sl@0
   710
    }
sl@0
   711
  }
sl@0
   712
  /* var2 < 0: Perform right shift */
sl@0
   713
  else {
sl@0
   714
    if ( -var2 >= 31 ) {
sl@0
   715
      return ( L_var1 < 0 ) ? -1L : 0L;
sl@0
   716
    }
sl@0
   717
    else if ( L_var1 < 0 ) {
sl@0
   718
      return ~( (~L_var1) >> -var2 ); /* ~ used to ensure arith. shift */
sl@0
   719
    }
sl@0
   720
    else {
sl@0
   721
      return L_var1 >> -var2;
sl@0
   722
    }
sl@0
   723
  }
sl@0
   724
sl@0
   725
}
sl@0
   726