mathhalf.c
上传用户:csczyc
上传日期:2021-02-19
资源大小:1051k
文件大小:58k
源码类别:

语音压缩

开发平台:

C/C++

  1. /***************************************************************************
  2.  *
  3.  *   File Name:  mathhalf.c
  4.  *
  5.  *   Purpose:  Contains functions which implement the primitive
  6.  *     arithmetic operations.
  7.  *
  8.  *      The functions in this file are listed below.  Some of them are
  9.  *      defined in terms of other basic operations.  One of the
  10.  *      routines, saturate() is static.  This is not a basic
  11.  *      operation, and is not reference outside the scope of this
  12.  *      file.
  13.  *
  14.  *
  15.  *       abs_s()
  16.  *       add()
  17.  *       divide_s()
  18.  *       extract_h()
  19.  *       extract_l()
  20.  *       L_abs()
  21.  *       L_add()
  22.  *       L_deposit_h()
  23.  *       L_deposit_l()
  24.  *       L_mac()
  25.  *       L_msu()
  26.  *       L_mult()
  27.  *       L_negate()
  28.  *       L_shift_r()
  29.  *       L_shl()
  30.  *       L_shr()
  31.  *       L_sub()
  32.  *       mac_r()
  33.  *       msu_r()
  34.  *       mult()
  35.  *       mult_r()
  36.  *       negate()
  37.  *       norm_l()
  38.  *       norm_s()
  39.  *       round()
  40.  *       saturate()
  41.  *       shift_r()
  42.  *       shl()
  43.  *       shr()
  44.  *       sub()
  45.  *
  46.  **************************************************************************/
  47. #include "typedefs.h"
  48. #include "mathhalf.h"
  49. #include "mathdp31.h"  
  50. /***************************************************************************
  51.  *
  52.  *   FUNCTION NAME: saturate
  53.  *
  54.  *   PURPOSE:
  55.  *
  56.  *     Limit the 32 bit input to the range of a 16 bit word.
  57.  *
  58.  *
  59.  *   INPUTS:
  60.  *
  61.  *     L_var1
  62.  *                     32 bit long signed integer (Longword) whose value
  63.  *                     falls in the range
  64.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  65.  *
  66.  *   OUTPUTS:
  67.  *
  68.  *     none
  69.  *
  70.  *   RETURN VALUE:
  71.  *
  72.  *     swOut
  73.  *                     16 bit short signed integer (Shortword) whose value
  74.  *                     falls in the range
  75.  *                     0xffff 8000 <= swOut <= 0x0000 7fff.
  76.  *
  77.  *   KEYWORDS: saturation, limiting, limit, saturate, 16 bits
  78.  *
  79.  *************************************************************************/
  80. static Shortword saturate(Longword L_var1)
  81. {
  82.   Shortword swOut;
  83.   extern int saturation;
  84.   if (L_var1 > SW_MAX) {
  85.     swOut = SW_MAX;
  86.     saturation = saturation + 1;
  87.   }
  88.   else if (L_var1 < SW_MIN) {
  89.     swOut = SW_MIN;
  90.     saturation = saturation + 1;
  91.   }
  92.   else {
  93.       swOut = (Shortword) L_var1;        /* automatic type conversion */
  94.   }
  95.   return (swOut);
  96. }
  97. /***************************************************************************
  98.  *
  99.  *   FUNCTION NAME: divide_s
  100.  *
  101.  *   PURPOSE:
  102.  *
  103.  *     Divide var1 by var2.  Note that both must be positive, and
  104.  *     var1 >=  var2.  The output is set to 0 if invalid input is
  105.  *     provided.
  106.  *
  107.  *   INPUTS:
  108.  *
  109.  *     var1
  110.  *                     16 bit short signed integer (Shortword) whose value
  111.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  112.  *     var2
  113.  *                     16 bit short signed integer (Shortword) whose value
  114.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  115.  *
  116.  *   OUTPUTS:
  117.  *
  118.  *     none
  119.  *
  120.  *   RETURN VALUE:
  121.  *
  122.  *     swOut
  123.  *                     16 bit short signed integer (Shortword) whose value
  124.  *                     falls in the range
  125.  *                     0xffff 8000 <= swOut <= 0x0000 7fff.
  126.  *
  127.  *   IMPLEMENTATION:
  128.  *
  129.  *     In the case where var1==var2 the function returns 0x7fff.  The output
  130.  *     is undefined for invalid inputs.  This implementation returns zero
  131.  *     and issues a warning via stdio if invalid input is presented.
  132.  *
  133.  *   KEYWORDS: divide
  134.  *
  135.  *************************************************************************/
  136. /* Shortword divide_s(Shortword var1, Shortword var2)             */
  137. /* {                                                              */
  138. /*   Longword L_div;                                              */
  139. /*   Shortword swOut;                                             */
  140. /* //  extern int complexity;mark del                             */
  141. /* //  int old_complexity;mark del                                */
  142. /*                                                                */
  143. /* //  old_complexity = complexity;Longword                       */
  144. /*   if (var1 < 0 || var2 < 0 || var1 > var2) {                   */
  145. /*      undefined output for invalid input into divide_s */    
  146. /*     return ((Shortword)0);                                     */
  147. /*   }                                                            */
  148. /*                                                                */
  149. /*   if (var1 == var2)                                            */
  150. /*     return ((Shortword)0x7fff);                                */
  151. /*                                                                */
  152. /*   L_div = ((0x00008000L * (Longword) var1) / (Longword) var2); */
  153. /*   swOut = saturate(L_div);                                     */
  154. /* //  complexity = old_complexity + 18;mark del                  */
  155. /*   return (swOut);                                              */
  156. /* }                                                              */
  157. /***************************************************************************
  158.  *
  159.  *   FUNCTION NAME: L_deposit_l
  160.  *
  161.  *   PURPOSE:
  162.  *
  163.  *     Put the 16 bit input into the 16 LSB's of the output Longword with
  164.  *     sign extension i.e. the top 16 bits are set to either 0 or 0xffff.
  165.  *
  166.  *   INPUTS:
  167.  *
  168.  *     var1
  169.  *                     16 bit short signed integer (Shortword) whose value
  170.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  171.  *
  172.  *   OUTPUTS:
  173.  *
  174.  *     none
  175.  *
  176.  *   RETURN VALUE:
  177.  *
  178.  *     L_Out
  179.  *                     32 bit long signed integer (Longword) whose value
  180.  *                     falls in the range
  181.  *                     0xffff 8000 <= L_var1 <= 0x0000 7fff.
  182.  *
  183.  *   KEYWORDS: deposit, assign
  184.  *
  185.  *************************************************************************/
  186. Longword L_deposit_l(Shortword var1)
  187. {
  188.   Longword L_Out;
  189. //  extern int complexity;mark del
  190. //  int old_complexity;mark del
  191.   
  192. //  old_complexity = complexity;mark del
  193.   L_Out = var1;
  194. //  complexity = old_complexity + 2;mark del
  195.   return (L_Out);
  196. }
  197. /***************************************************************************
  198.  *
  199.  *   FUNCTION NAME: L_deposit_h
  200.  *
  201.  *   PURPOSE:
  202.  *
  203.  *     Put the 16 bit input into the 16 MSB's of the output Longword.  The
  204.  *     LS 16 bits are zeroed.
  205.  *
  206.  *   INPUTS:
  207.  *
  208.  *     var1
  209.  *                     16 bit short signed integer (Shortword) whose value
  210.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  211.  *
  212.  *   OUTPUTS:
  213.  *
  214.  *     none
  215.  *
  216.  *   RETURN VALUE:
  217.  *
  218.  *     L_Out
  219.  *                     32 bit long signed integer (Longword) whose value
  220.  *                     falls in the range
  221.  *                     0x8000 0000 <= L_var1 <= 0x7fff 0000.
  222.  *
  223.  *
  224.  *   KEYWORDS: deposit, assign, fractional assign
  225.  *
  226.  *************************************************************************/
  227. Longword L_deposit_h(Shortword var1)
  228. {
  229.   Longword L_var2;
  230. //  extern int complexity;mark del
  231. //  int old_complexity;mark del
  232.   
  233. //  old_complexity = complexity;mark del
  234.   L_var2 = (Longword) var1 << 16;
  235. //  complexity = old_complexity + 2;mark del
  236.   return (L_var2);
  237. }
  238. /***************************************************************************
  239.  *
  240.  *   FUNCTION NAME: extract_l
  241.  *
  242.  *   PURPOSE:
  243.  *
  244.  *     Extract the 16 LS bits of a 32 bit Longword.  Return the 16 bit
  245.  *     number as a Shortword.  The upper portion of the input Longword
  246.  *     has no impact whatsoever on the output.
  247.  *
  248.  *   INPUTS:
  249.  *
  250.  *     L_var1
  251.  *                     32 bit long signed integer (Longword) whose value
  252.  *                     falls in the range
  253.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  254.  *
  255.  *   OUTPUTS:
  256.  *
  257.  *     none
  258.  *
  259.  *   RETURN VALUE:
  260.  *
  261.  *     swOut
  262.  *                     16 bit short signed integer (Shortword) whose value
  263.  *                     falls in the range
  264.  *                     0xffff 8000 <= swOut <= 0x0000 7fff.
  265.  *
  266.  *
  267.  *   KEYWORDS: extract, assign
  268.  *
  269.  *************************************************************************/
  270. Shortword extract_l(Longword L_var1)
  271. {
  272.   Shortword var2;
  273. //  extern int complexity;mark del
  274. //  int old_complexity;mark del
  275.   
  276. //  old_complexity = complexity;mark del
  277.   var2 = (Shortword) (0x0000ffffL & L_var1);
  278. //  complexity = old_complexity + 1;mark del
  279.   return (var2);
  280. }
  281. /***************************************************************************
  282.  *
  283.  *   FUNCTION NAME: extract_h
  284.  *
  285.  *   PURPOSE:
  286.  *
  287.  *     Extract the 16 MS bits of a 32 bit Longword.  Return the 16 bit
  288.  *     number as a Shortword.  This is used as a "truncation" of a fractional
  289.  *     number.
  290.  *
  291.  *   INPUTS:
  292.  *
  293.  *     L_var1
  294.  *                     32 bit long signed integer (Longword) whose value
  295.  *                     falls in the range
  296.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  297.  *
  298.  *   OUTPUTS:
  299.  *
  300.  *     none
  301.  *
  302.  *   RETURN VALUE:
  303.  *
  304.  *     swOut
  305.  *                     16 bit short signed integer (Shortword) whose value
  306.  *                     falls in the range
  307.  *                     0xffff 8000 <= swOut <= 0x0000 7fff.
  308.  *
  309.  *   IMPLEMENTATION:
  310.  *
  311.  *   KEYWORDS: assign, truncate
  312.  *
  313.  *************************************************************************/
  314. Shortword extract_h(Longword L_var1)
  315. {
  316.   Shortword var2;
  317. //  extern int complexity;  mark del
  318.  // int old_complexity;mark del
  319.   
  320.  // old_complexity = complexity;mark del
  321.   var2 = (Shortword) (0x0000ffffL & (L_var1 >> 16));
  322. //  complexity = old_complexity + 1;mark del
  323.   return (var2);
  324. }
  325. /***************************************************************************
  326.  *
  327.  *   FUNCTION NAME: round
  328.  *
  329.  *   PURPOSE:
  330.  *
  331.  *     Round the 32 bit Longword into a 16 bit shortword with saturation.
  332.  *
  333.  *   INPUTS:
  334.  *
  335.  *     L_var1
  336.  *                     32 bit long signed integer (Longword) whose value
  337.  *                     falls in the range
  338.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  339.  *   OUTPUTS:
  340.  *
  341.  *     none
  342.  *
  343.  *   RETURN VALUE:
  344.  *
  345.  *     swOut
  346.  *                     16 bit short signed integer (Shortword) whose value
  347.  *                     falls in the range
  348.  *                     0xffff 8000 <= swOut <= 0x0000 7fff.
  349.  *
  350.  *   IMPLEMENTATION:
  351.  *
  352.  *     Perform a two's complement round on the input Longword with
  353.  *     saturation.
  354.  *
  355.  *     This is equivalent to adding 0x0000 8000 to the input.  The
  356.  *     result may overflow due to the add.  If so, the result is
  357.  *     saturated.  The 32 bit rounded number is then shifted down
  358.  *     16 bits and returned as a Shortword.
  359.  *
  360.  *
  361.  *   KEYWORDS: round
  362.  *
  363.  *************************************************************************/
  364. Shortword round(Longword L_var1)
  365. {
  366.   Longword L_Prod;
  367.   Shortword var2;
  368. //  extern int complexity;  mark del
  369.  // int old_complexity;  mark del
  370.   
  371. //  old_complexity = complexity;  mark del
  372.   L_Prod = L_add(L_var1, 0x00008000L); /* round MSP */
  373.   var2 = extract_h(L_Prod);
  374. //  complexity = old_complexity + 1;  mark del
  375.   return (var2);
  376. }
  377. /***************************************************************************
  378.  *
  379.  *   FUNCTION NAME: negate
  380.  *
  381.  *   PURPOSE:
  382.  *
  383.  *     Negate the 16 bit input. 0x8000's negated value is 0x7fff.
  384.  *
  385.  *   INPUTS:
  386.  *
  387.  *     var1
  388.  *                     16 bit short signed integer (Shortword) whose value
  389.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  390.  *
  391.  *   OUTPUTS:
  392.  *
  393.  *     none
  394.  *
  395.  *   RETURN VALUE:
  396.  *
  397.  *     swOut
  398.  *                     16 bit short signed integer (Shortword) whose value
  399.  *                     falls in the range
  400.  *                     0xffff 8001 <= swOut <= 0x0000 7fff.
  401.  *
  402.  *   KEYWORDS: negate, negative, invert
  403.  *
  404.  *************************************************************************/
  405. /* Shortword negate(Shortword var1)             */
  406. /* {                                            */
  407. /*   Shortword swOut;                           */
  408. /*  // extern int complexity;mark del           */
  409. /*   extern int saturation;                     */
  410. /*  // int old_complexity;mark del              */
  411. /*                                              */
  412. /* //  old_complexity = complexity;mark del     */
  413. /*   if (var1 == SW_MIN) {                      */
  414. /*       saturation = saturation + 1;           */
  415. /*       swOut = SW_MAX;                        */
  416. /*   }                                          */
  417. /*   else {                                     */
  418. /*       swOut = -var1;                         */
  419. /*   }                                          */
  420. /* //  complexity = old_complexity + 1;mark del */
  421. /*   return (swOut);                            */
  422. /* }                                            */
  423. /***************************************************************************
  424.  *
  425.  *   FUNCTION NAME: L_negate
  426.  *
  427.  *   PURPOSE:
  428.  *
  429.  *     Negate the 32 bit input. 0x8000 0000's negated value is
  430.  *     0x7fff ffff.
  431.  *
  432.  *   INPUTS:
  433.  *
  434.  *     L_var1
  435.  *                     32 bit long signed integer (Longword) whose value
  436.  *                     falls in the range
  437.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  438.  *
  439.  *   OUTPUTS:
  440.  *
  441.  *     none
  442.  *
  443.  *   RETURN VALUE:
  444.  *
  445.  *     L_Out
  446.  *                     32 bit long signed integer (Longword) whose value
  447.  *                     falls in the range
  448.  *                     0x8000 0001 <= L_var1 <= 0x7fff ffff.
  449.  *
  450.  *   KEYWORDS: negate, negative
  451.  *
  452.  *************************************************************************/
  453. Longword L_negate(Longword L_var1)
  454. {
  455.   Longword L_Out;
  456. //  extern int complexity;mark del
  457.   extern int saturation;
  458. //  int old_complexity;mark del
  459.   
  460. //  old_complexity = complexity;mark del
  461.   if (L_var1 == LW_MIN) {
  462.       saturation = saturation + 1;
  463.       L_Out = LW_MAX;
  464.   }
  465.   else {
  466.       L_Out = -L_var1;
  467.   }
  468.  // complexity = old_complexity + 2;mark del
  469.   return (L_Out);
  470. }
  471. /***************************************************************************
  472.  *
  473.  *   FUNCTION NAME: add
  474.  *
  475.  *   PURPOSE:
  476.  *
  477.  *     Perform the addition of the two 16 bit input variable with
  478.  *     saturation.
  479.  *
  480.  *   INPUTS:
  481.  *
  482.  *     var1
  483.  *                     16 bit short signed integer (Shortword) whose value
  484.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  485.  *     var2
  486.  *                     16 bit short signed integer (Shortword) whose value
  487.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  488.  *
  489.  *   OUTPUTS:
  490.  *
  491.  *     none
  492.  *
  493.  *   RETURN VALUE:
  494.  *
  495.  *     swOut
  496.  *                     16 bit short signed integer (Shortword) whose value
  497.  *                     falls in the range
  498.  *                     0xffff 8000 <= swOut <= 0x0000 7fff.
  499.  *
  500.  *   IMPLEMENTATION:
  501.  *
  502.  *     Perform the addition of the two 16 bit input variable with
  503.  *     saturation.
  504.  *
  505.  *     swOut = var1 + var2
  506.  *
  507.  *     swOut is set to 0x7fff if the operation results in an
  508.  *     overflow.  swOut is set to 0x8000 if the operation results
  509.  *     in an underflow.
  510.  *
  511.  *   KEYWORDS: add, addition
  512.  *
  513.  *************************************************************************/
  514. Shortword add(Shortword var1, Shortword var2)
  515. {
  516.   Longword L_sum;
  517.   Shortword swOut;
  518.  // extern int complexity;mark del
  519.  // int old_complexity;mark del
  520.   
  521. //  old_complexity = complexity;mark del
  522.   L_sum = (Longword) var1 + var2;
  523.   swOut = saturate(L_sum);
  524. //  complexity = old_complexity + 1;mark del
  525.   return (swOut);
  526. }
  527. /***************************************************************************
  528.  *
  529.  *   FUNCTION NAME: L_add
  530.  *
  531.  *   PURPOSE:
  532.  *
  533.  *     Perform the addition of the two 32 bit input variables with
  534.  *     saturation.
  535.  *
  536.  *   INPUTS:
  537.  *
  538.  *     L_var1
  539.  *                     32 bit long signed integer (Longword) whose value
  540.  *                     falls in the range
  541.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  542.  *     L_var2
  543.  *                     32 bit long signed integer (Longword) whose value
  544.  *                     falls in the range
  545.  *                     0x8000 0000 <= L_var2 <= 0x7fff ffff.
  546.  *
  547.  *   OUTPUTS:
  548.  *
  549.  *     none
  550.  *
  551.  *   RETURN VALUE:
  552.  *
  553.  *     L_Out
  554.  *                     32 bit long signed integer (Longword) whose value
  555.  *                     falls in the range
  556.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  557.  *
  558.  *   IMPLEMENTATION:
  559.  *
  560.  *     Perform the addition of the two 32 bit input variables with
  561.  *     saturation.
  562.  *
  563.  *     L_Out = L_var1 + L_var2
  564.  *
  565.  *     L_Out is set to 0x7fff ffff if the operation results in an
  566.  *     overflow.  L_Out is set to 0x8000 0000 if the operation
  567.  *     results in an underflow.
  568.  *
  569.  *   KEYWORDS: add, addition
  570.  *
  571.  *************************************************************************/
  572. Longword L_add(Longword L_var1, Longword L_var2)
  573. {
  574.   Longword L_Sum,
  575.          L_SumLow,
  576.          L_SumHigh;
  577. //  extern int complexity;mark del
  578.   extern int saturation;
  579.  // int old_complexity;mark del
  580.   
  581.  // old_complexity = complexity;mark del
  582.   L_Sum = L_var1 + L_var2;
  583.   
  584.   if ((L_var1 > 0 && L_var2 > 0) || (L_var1 < 0 && L_var2 < 0)) {
  585.     /* an overflow is possible */
  586.     L_SumLow = (L_var1 & (Longword)0xffff) + (L_var2 & (Longword)0xffff);
  587.     L_SumHigh = ((L_var1 >> 16) & (Longword)0xffff) + ((L_var2 >> 16) & (Longword)0xffff);
  588.     if (L_SumLow & (Longword)0x10000) {
  589.       /* carry into high word is set */
  590.       L_SumHigh += 1;
  591.     }
  592.     /* update sum only if there is an overflow or underflow */
  593.     /*------------------------------------------------------*/
  594.     if (((Longword)0x10000 & L_SumHigh) && !((Longword)0x8000 & L_SumHigh)) {
  595. saturation = saturation + 1;
  596. L_Sum = LW_MIN;                  /* underflow */
  597.     }
  598.     else if (!((Longword)0x10000 & L_SumHigh) && ((Longword)0x8000 & L_SumHigh)) {
  599. saturation = saturation + 1;
  600. L_Sum = LW_MAX;                  /* overflow */
  601.     }
  602.   }
  603.  // complexity = old_complexity + 2;mark del
  604.   return (L_Sum);
  605. }
  606. /***************************************************************************
  607.  *
  608.  *   FUNCTION NAME: sub
  609.  *
  610.  *   PURPOSE:
  611.  *
  612.  *     Perform the subtraction of the two 16 bit input variable with
  613.  *     saturation.
  614.  *
  615.  *   INPUTS:
  616.  *
  617.  *     var1
  618.  *                     16 bit short signed integer (Shortword) whose value
  619.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  620.  *     var2
  621.  *                     16 bit short signed integer (Shortword) whose value
  622.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  623.  *
  624.  *   OUTPUTS:
  625.  *
  626.  *     none
  627.  *
  628.  *   RETURN VALUE:
  629.  *
  630.  *     swOut
  631.  *                     16 bit short signed integer (Shortword) whose value
  632.  *                     falls in the range
  633.  *                     0xffff 8000 <= swOut <= 0x0000 7fff.
  634.  *
  635.  *   IMPLEMENTATION:
  636.  *
  637.  *     Perform the subtraction of the two 16 bit input variable with
  638.  *     saturation.
  639.  *
  640.  *     swOut = var1 - var2
  641.  *
  642.  *     swOut is set to 0x7fff if the operation results in an
  643.  *     overflow.  swOut is set to 0x8000 if the operation results
  644.  *     in an underflow.
  645.  *
  646.  *   KEYWORDS: sub, subtraction
  647.  *
  648.  *************************************************************************/
  649. /* Shortword sub(Shortword var1, Shortword var2) */
  650. /* {                                             */
  651. /*   Longword L_diff;                            */
  652. /*   Shortword swOut;                            */
  653. /* //  extern int complexity;mark del            */
  654. /*  // int old_complexity;mark del               */
  655. /*                                               */
  656. /* //  old_complexity = complexity;mark del      */
  657. /*   L_diff = (Longword) var1 - var2;            */
  658. /*   swOut = saturate(L_diff);                   */
  659. /*                                               */
  660. /* //  complexity = old_complexity + 1;mark del  */
  661. /*   return (swOut);                             */
  662. /* }                                             */
  663. /***************************************************************************
  664.  *
  665.  *   FUNCTION NAME: L_sub
  666.  *
  667.  *   PURPOSE:
  668.  *
  669.  *     Perform the subtraction of the two 32 bit input variables with
  670.  *     saturation.
  671.  *
  672.  *   INPUTS:
  673.  *
  674.  *     L_var1
  675.  *                     32 bit long signed integer (Longword) whose value
  676.  *                     falls in the range
  677.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  678.  *     L_var2
  679.  *                     32 bit long signed integer (Longword) whose value
  680.  *                     falls in the range
  681.  *                     0x8000 0000 <= L_var2 <= 0x7fff ffff.
  682.  *
  683.  *   OUTPUTS:
  684.  *
  685.  *     none
  686.  *
  687.  *   RETURN VALUE:
  688.  *
  689.  *     L_Out
  690.  *                     32 bit long signed integer (Longword) whose value
  691.  *                     falls in the range
  692.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  693.  *
  694.  *   IMPLEMENTATION:
  695.  *
  696.  *     Perform the subtraction of the two 32 bit input variables with
  697.  *     saturation.
  698.  *
  699.  *     L_Out = L_var1 - L_var2
  700.  *
  701.  *     L_Out is set to 0x7fff ffff if the operation results in an
  702.  *     overflow.  L_Out is set to 0x8000 0000 if the operation
  703.  *     results in an underflow.
  704.  *
  705.  *   KEYWORDS: sub, subtraction
  706.  *
  707.  *************************************************************************/
  708. Longword L_sub(Longword L_var1, Longword L_var2)
  709. {
  710.   Longword L_Sum;
  711. //  extern int complexity;mark del
  712.  // int old_complexity;mark del
  713.   
  714.  // old_complexity = complexity;mark del
  715.   /* check for overflow */
  716.   if ((L_var1 > 0 && L_var2 < 0) || (L_var1 < 0 && L_var2 > 0)) {
  717.     if (L_var2 == LW_MIN) {
  718.       L_Sum = L_add(L_var1, LW_MAX);
  719.       L_Sum = L_add(L_Sum, 1);
  720.     }
  721.     else
  722.       L_Sum = L_add(L_var1, -L_var2);
  723.   }
  724.   else {                               /* no overflow possible */
  725.     L_Sum = L_var1 - L_var2;
  726.   }
  727.  // complexity = old_complexity + 2;mark del
  728.   return (L_Sum);
  729. }
  730. /***************************************************************************
  731.  *
  732.  *   FUNCTION NAME: shr
  733.  *
  734.  *   PURPOSE:
  735.  *
  736.  *     Arithmetic shift right (or left).
  737.  *     Arithmetically shift the input right by var2.   If var2 is
  738.  *     negative then an arithmetic shift left (shl) of var1 by
  739.  *     -var2 is performed.
  740.  *
  741.  *   INPUTS:
  742.  *
  743.  *     var1
  744.  *                     16 bit short signed integer (Shortword) whose value
  745.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  746.  *     var2
  747.  *                     16 bit short signed integer (Shortword) whose value
  748.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  749.  *
  750.  *   OUTPUTS:
  751.  *
  752.  *     none
  753.  *
  754.  *   RETURN VALUE:
  755.  *
  756.  *     swOut
  757.  *                     16 bit short signed integer (Shortword) whose value
  758.  *                     falls in the range
  759.  *                     0xffff 8000 <= swOut <= 0x0000 7fff.
  760.  *
  761.  *   IMPLEMENTATION:
  762.  *
  763.  *     Arithmetically shift the input right by var2.  This
  764.  *     operation maintains the sign of the input number. If var2 is
  765.  *     negative then an arithmetic shift left (shl) of var1 by
  766.  *     -var2 is performed.  See description of shl for details.
  767.  *
  768.  *     Equivalent to the Full-Rate GSM ">> n" operation.  Note that
  769.  *     ANSI-C does not guarantee operation of the C ">>" or "<<"
  770.  *     operator for negative numbers.
  771.  *
  772.  *   KEYWORDS: shift, arithmetic shift right,
  773.  *
  774.  *************************************************************************/
  775. Shortword shr(Shortword var1, Shortword var2)
  776. {
  777.   Shortword swMask,
  778.          swOut;
  779. //  extern int complexity;mark del
  780.   extern int saturation;
  781. //  int old_complexity;mark del
  782.   
  783. //  old_complexity = complexity;mark del
  784.   if (var2 == 0 || var1 == 0)
  785.     swOut = var1;
  786.   else if (var2 < 0) {
  787.     /* perform an arithmetic left shift */
  788.     /*----------------------------------*/
  789.       if (var2 <= -15) 
  790.       {
  791.   swOut = (var1 > 0) ? SW_MAX : SW_MIN;     /* saturate */
  792.   saturation = saturation + 1;
  793.       }
  794.     else
  795.       swOut = shl(var1, (Shortword)-var2);
  796.   }
  797.   else {
  798.     /* positive shift count */
  799.     /*----------------------*/
  800.     if (var2 >= 15)
  801.       swOut = (var1 < 0) ? (Shortword) 0xffff : 0x0;
  802.     else {
  803.       /* take care of sign extension */
  804.       /*-----------------------------*/
  805.       swMask = 0;
  806.       if (var1 < 0) {
  807.         swMask = ~swMask << (16 - var2);
  808.       }
  809.       var1 >>= var2;
  810.       swOut = swMask | var1;
  811.     }
  812.   }
  813.  // complexity = old_complexity + 1;mark del
  814.   return (swOut);
  815. }
  816. /***************************************************************************
  817.  *
  818.  *   FUNCTION NAME: shl
  819.  *
  820.  *   PURPOSE:
  821.  *
  822.  *     Arithmetically shift the input left by var2.
  823.  *
  824.  *
  825.  *   INPUTS:
  826.  *
  827.  *     var1
  828.  *                     16 bit short signed integer (Shortword) whose value
  829.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  830.  *     var2
  831.  *                     16 bit short signed integer (Shortword) whose value
  832.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  833.  *
  834.  *   OUTPUTS:
  835.  *
  836.  *     none
  837.  *
  838.  *   RETURN VALUE:
  839.  *
  840.  *     swOut
  841.  *                     16 bit short signed integer (Shortword) whose value
  842.  *                     falls in the range
  843.  *                     0xffff 8000 <= swOut <= 0x0000 7fff.
  844.  *
  845.  *   IMPLEMENTATION:
  846.  *
  847.  *     If Arithmetically shift the input left by var2.  If var2 is
  848.  *     negative then an arithmetic shift right (shr) of var1 by
  849.  *     -var2 is performed.  See description of shr for details.
  850.  *     When an arithmetic shift left is performed the var2 LS bits
  851.  *     are zero filled.
  852.  *
  853.  *     The only exception is if the left shift causes an overflow
  854.  *     or underflow.  In this case the LS bits are not modified.
  855.  *     The number returned is 0x8000 in the case of an underflow or
  856.  *     0x7fff in the case of an overflow.
  857.  *
  858.  *     The shl is equivalent to the Full-Rate GSM "<< n" operation.
  859.  *     Note that ANSI-C does not guarantee operation of the C ">>"
  860.  *     or "<<" operator for negative numbers - it is not specified
  861.  *     whether this shift is an arithmetic or logical shift.
  862.  *
  863.  *   KEYWORDS: asl, arithmetic shift left, shift
  864.  *
  865.  *************************************************************************/
  866. Shortword shl(Shortword var1, Shortword var2)
  867. {
  868.   Shortword swOut;
  869.   Longword L_Out;
  870. //  extern int complexity;mark del
  871.   extern int saturation; 
  872. //  int old_complexity;mark del
  873.   
  874. //  old_complexity = complexity;mark del
  875.   if (var2 == 0 || var1 == 0) {
  876.     swOut = var1;
  877.   }
  878.   else if (var2 < 0) {
  879.     /* perform a right shift */
  880.     /*-----------------------*/
  881.     if (var2 <= -15)
  882.       swOut = (var1 < 0) ? (Shortword) 0xffff : 0x0;
  883.     else
  884.       swOut = shr(var1, (Shortword)-var2);
  885.   }
  886.   else {
  887.     /* var2 > 0 */
  888.     if (var2 >= 15) {
  889.       swOut = (var1 > 0) ? SW_MAX : SW_MIN;     /* saturate */
  890.       saturation = saturation + 1;
  891.     }
  892.     else {
  893.       L_Out = (Longword) var1 *(1 << var2);
  894.       swOut = (Shortword) L_Out;       /* copy low portion to swOut,
  895.                                         * overflow could have hpnd */
  896.       if (swOut != L_Out) {
  897.         /* overflow  */
  898.         swOut = (var1 > 0) ? SW_MAX : SW_MIN;   /* saturate */
  899. saturation = saturation + 1;
  900.       }
  901.     }
  902.   }
  903. //  complexity = old_complexity + 1;mark del
  904.   return (swOut);
  905. }
  906. /***************************************************************************
  907.  *
  908.  *   FUNCTION NAME: L_shr
  909.  *
  910.  *   PURPOSE:
  911.  *
  912.  *     Arithmetic shift right (or left).
  913.  *     Arithmetically shift the input right by var2.   If var2 is
  914.  *     negative then an arithmetic shift left (shl) of var1 by
  915.  *     -var2 is performed.
  916.  *
  917.  *   INPUTS:
  918.  *
  919.  *     var2
  920.  *                     16 bit short signed integer (Shortword) whose value
  921.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  922.  *     L_var1
  923.  *                     32 bit long signed integer (Longword) whose value
  924.  *                     falls in the range
  925.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  926.  *   OUTPUTS:
  927.  *
  928.  *     none
  929.  *
  930.  *   RETURN VALUE:
  931.  *
  932.  *     L_Out
  933.  *                     32 bit long signed integer (Longword) whose value
  934.  *                     falls in the range
  935.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  936.  *
  937.  *
  938.  *   IMPLEMENTATION:
  939.  *
  940.  *     Arithmetically shift the input right by var2.  This
  941.  *     operation maintains the sign of the input number. If var2 is
  942.  *     negative then an arithmetic shift left (shl) of L_var1 by
  943.  *     -var2 is performed.  See description of L_shl for details.
  944.  *
  945.  *     The input is a 32 bit number, as is the output.
  946.  *
  947.  *     Equivalent to the Full-Rate GSM ">> n" operation.  Note that
  948.  *     ANSI-C does not guarantee operation of the C ">>" or "<<"
  949.  *     operator for negative numbers.
  950.  *
  951.  *   KEYWORDS: shift, arithmetic shift right,
  952.  *
  953.  *************************************************************************/
  954. Longword L_shr(Longword L_var1, Shortword var2)
  955. {
  956.   Longword L_Mask,
  957.          L_Out;
  958. //  extern int complexity;mark del
  959.   extern int saturation;
  960. //  int old_complexity;mark del
  961.   
  962. //  old_complexity = complexity;mark del
  963.   if (var2 == 0 || L_var1 == 0) {
  964.     L_Out = L_var1;
  965.   }
  966.   else if (var2 < 0) {
  967.     /* perform a left shift */
  968.     /*----------------------*/
  969.       if (var2 <= -31) {
  970.   L_Out = (L_var1 > 0) ? LW_MAX : LW_MIN;   /* saturate */
  971.   saturation = saturation + 1;
  972.       }   
  973.     else
  974.       L_Out = L_shl(L_var1, (Shortword)-var2);
  975.   }
  976.   else {
  977.     if (var2 >= 31)
  978.       L_Out = (L_var1 > 0) ? 0 : 0xffffffffL;
  979.     else {
  980.       L_Mask = 0;
  981.       if (L_var1 < 0) {
  982.         L_Mask = ~L_Mask << (32 - var2);
  983.       }
  984.       L_var1 >>= var2;
  985.       L_Out = L_Mask | L_var1;
  986.     }
  987.   }
  988. //  complexity = old_complexity + 2;mark del
  989.   return (L_Out);
  990. }
  991. /***************************************************************************
  992.  *
  993.  *   FUNCTION NAME: L_shl
  994.  *
  995.  *   PURPOSE:
  996.  *
  997.  *     Arithmetic shift left (or right).
  998.  *     Arithmetically shift the input left by var2.   If var2 is
  999.  *     negative then an arithmetic shift right (L_shr) of L_var1 by
  1000.  *     -var2 is performed.
  1001.  *
  1002.  *   INPUTS:
  1003.  *
  1004.  *     var2
  1005.  *                     16 bit short signed integer (Shortword) whose value
  1006.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  1007.  *     L_var1
  1008.  *                     32 bit long signed integer (Longword) whose value
  1009.  *                     falls in the range
  1010.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  1011.  *   OUTPUTS:
  1012.  *
  1013.  *     none
  1014.  *
  1015.  *   RETURN VALUE:
  1016.  *
  1017.  *     L_Out
  1018.  *                     32 bit long signed integer (Longword) whose value
  1019.  *                     falls in the range
  1020.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  1021.  *
  1022.  *
  1023.  *   IMPLEMENTATION:
  1024.  *
  1025.  *     Arithmetically shift the 32 bit input left by var2.  This
  1026.  *     operation maintains the sign of the input number. If var2 is
  1027.  *     negative then an arithmetic shift right (L_shr) of L_var1 by
  1028.  *     -var2 is performed.  See description of L_shr for details.
  1029.  *
  1030.  *     Equivalent to the Full-Rate GSM ">> n" operation.  Note that
  1031.  *     ANSI-C does not guarantee operation of the C ">>" or "<<"
  1032.  *     operator for negative numbers.
  1033.  *
  1034.  *   KEYWORDS: shift, arithmetic shift left,
  1035.  *
  1036.  *************************************************************************/
  1037. Longword L_shl(Longword L_var1, Shortword var2)
  1038. {
  1039.   Longword L_Mask,
  1040.            L_Out=0;
  1041.   int    i,
  1042.          iOverflow = 0;
  1043. //  extern int complexity;mark del
  1044.   extern int saturation;
  1045. //  int old_complexity;mark del
  1046.   
  1047. //  old_complexity = complexity;mark del
  1048.   if (var2 == 0 || L_var1 == 0) {
  1049.     L_Out = L_var1;
  1050.   }
  1051.   else if (var2 < 0) {
  1052.     if (var2 <= -31)
  1053.       L_Out = (L_var1 > 0) ? 0 : 0xffffffffL;
  1054.     else
  1055.       L_Out = L_shr(L_var1, (Shortword)-var2);
  1056.   }
  1057.   else {
  1058.     if (var2 >= 31)
  1059.       iOverflow = 1;
  1060.     else {
  1061.       if (L_var1 < 0)
  1062.         L_Mask = LW_SIGN;              /* sign bit mask */
  1063.       else
  1064.         L_Mask = 0x0;
  1065.       L_Out = L_var1;
  1066.       for (i = 0; i < var2 && !iOverflow; i++) {
  1067.         /* check the sign bit */
  1068.         L_Out = (L_Out & 0x7fffffffL) << 1;
  1069.         if ((L_Mask ^ L_Out) & LW_SIGN)
  1070.           iOverflow = 1;
  1071.       }
  1072.     }
  1073.     if (iOverflow) {
  1074. L_Out = (L_var1 > 0) ? LW_MAX : LW_MIN;   /* saturate */
  1075. saturation = saturation + 1;
  1076.     }   
  1077.   }
  1078. //  complexity = old_complexity + 2;mark del
  1079.   return (L_Out);
  1080. }
  1081. /***************************************************************************
  1082.  *
  1083.  *   FUNCTION NAME: shift_r
  1084.  *
  1085.  *   PURPOSE:
  1086.  *
  1087.  *     Shift and round.  Perform a shift right. After shifting, use
  1088.  *     the last bit shifted out of the LSB to round the result up
  1089.  *     or down.
  1090.  *
  1091.  *   INPUTS:
  1092.  *
  1093.  *     var1
  1094.  *                     16 bit short signed integer (Shortword) whose value
  1095.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  1096.  *     var2
  1097.  *                     16 bit short signed integer (Shortword) whose value
  1098.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  1099.  *
  1100.  *   OUTPUTS:
  1101.  *
  1102.  *     none
  1103.  *
  1104.  *   RETURN VALUE:
  1105.  *
  1106.  *     swOut
  1107.  *                     16 bit short signed integer (Shortword) whose value
  1108.  *                     falls in the range
  1109.  *                     0xffff 8000 <= swOut <= 0x0000 7fff.
  1110.  *
  1111.  *
  1112.  *   IMPLEMENTATION:
  1113.  *
  1114.  *     Shift and round.  Perform a shift right. After shifting, use
  1115.  *     the last bit shifted out of the LSB to round the result up
  1116.  *     or down.
  1117.  *
  1118.  *     If var2 is positive perform a arithmetic left shift
  1119.  *     with saturation (see shl() above).
  1120.  *
  1121.  *     If var2 is zero simply return var1.
  1122.  *
  1123.  *     If var2 is negative perform a arithmetic right shift (shr)
  1124.  *     of var1 by (-var2)+1.  Add the LS bit of the result to var1
  1125.  *     shifted right (shr) by -var2.
  1126.  *
  1127.  *     Note that there is no constraint on var2, so if var2 is
  1128.  *     -0xffff 8000 then -var2 is 0x0000 8000, not 0x0000 7fff.
  1129.  *     This is the reason the shl function is used.
  1130.  *
  1131.  *
  1132.  *   KEYWORDS:
  1133.  *
  1134.  *************************************************************************/
  1135. Shortword shift_r(Shortword var1, Shortword var2)
  1136. {
  1137.   Shortword swOut,
  1138.          swRnd;
  1139. //  extern int complexity;mark del
  1140. //  int old_complexity;mark del
  1141.   
  1142. //  old_complexity = complexity;mark del
  1143.   if (var2 >= 0)
  1144.     swOut = shl(var1, var2);
  1145.   else {
  1146.     /* right shift */
  1147.     if (var2 < -15) {
  1148.       swOut = 0;
  1149.     }
  1150.     else {
  1151.       swRnd = (Shortword)(shl(var1, (Shortword)(var2 + 1)) & (Shortword)0x1);
  1152.       swOut = add(shl(var1, var2), swRnd);
  1153.     }
  1154.   }
  1155.  // complexity = old_complexity + 2;mark del
  1156.   return (swOut);
  1157. }
  1158. /***************************************************************************
  1159.  *
  1160.  *   FUNCTION NAME: L_shift_r
  1161.  *
  1162.  *   PURPOSE:
  1163.  *
  1164.  *     Shift and round.  Perform a shift right. After shifting, use
  1165.  *     the last bit shifted out of the LSB to round the result up
  1166.  *     or down.
  1167.  *
  1168.  *   INPUTS:
  1169.  *
  1170.  *     L_var1
  1171.  *                     32 bit long signed integer (Longword) whose value
  1172.  *                     falls in the range
  1173.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  1174.  *     var2
  1175.  *                     16 bit short signed integer (Shortword) whose value
  1176.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  1177.  *
  1178.  *   OUTPUTS:
  1179.  *
  1180.  *     none
  1181.  *
  1182.  *   RETURN VALUE:
  1183.  *
  1184.  *     L_var1
  1185.  *                     32 bit long signed integer (Longword) whose value
  1186.  *                     falls in the range
  1187.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  1188.  *
  1189.  *
  1190.  *   IMPLEMENTATION:
  1191.  *
  1192.  *     Shift and round.  Perform a shift right. After shifting, use
  1193.  *     the last bit shifted out of the LSB to round the result up
  1194.  *     or down.  This is just like shift_r above except that the
  1195.  *     input/output is 32 bits as opposed to 16.
  1196.  *
  1197.  *     if var2 is positve perform a arithmetic left shift
  1198.  *     with saturation (see L_shl() above).
  1199.  *
  1200.  *     If var2 is zero simply return L_var1.
  1201.  *
  1202.  *     If var2 is negative perform a arithmetic right shift (L_shr)
  1203.  *     of L_var1 by (-var2)+1.  Add the LS bit of the result to
  1204.  *     L_var1 shifted right (L_shr) by -var2.
  1205.  *
  1206.  *     Note that there is no constraint on var2, so if var2 is
  1207.  *     -0xffff 8000 then -var2 is 0x0000 8000, not 0x0000 7fff.
  1208.  *     This is the reason the L_shl function is used.
  1209.  *
  1210.  *
  1211.  *   KEYWORDS:
  1212.  *
  1213.  *************************************************************************/
  1214. Longword L_shift_r(Longword L_var1, Shortword var2)
  1215. {
  1216.   Longword L_Out,
  1217.          L_rnd;
  1218. //  extern int complexity;mark del
  1219. //  int old_complexity;mark del
  1220.   
  1221.  // old_complexity = complexity;mark del
  1222.   if (var2 < -31) {
  1223.     L_Out = 0;
  1224.   }
  1225.   else if (var2 < 0) {
  1226.     /* right shift */
  1227.     L_rnd = (Longword)(L_shl(L_var1, (Shortword)(var2 + 1)) & (Longword)0x1);
  1228.     L_Out = L_add(L_shl(L_var1, var2), L_rnd);
  1229.   }
  1230.   else
  1231.     L_Out = L_shl(L_var1, var2);
  1232. //  complexity = old_complexity + 3;mark del
  1233.   return (L_Out);
  1234. }
  1235. /***************************************************************************
  1236.  *
  1237.  *   FUNCTION NAME: norm_l
  1238.  *
  1239.  *   PURPOSE:
  1240.  *
  1241.  *     Get normalize shift count:
  1242.  *
  1243.  *     A 32 bit number is input (possiblly unnormalized).  Output
  1244.  *     the positive (or zero) shift count required to normalize the
  1245.  *     input.
  1246.  *
  1247.  *   INPUTS:
  1248.  *
  1249.  *     L_var1
  1250.  *                     32 bit long signed integer (Longword) whose value
  1251.  *                     falls in the range
  1252.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  1253.  *
  1254.  *   OUTPUTS:
  1255.  *
  1256.  *     none
  1257.  *
  1258.  *   RETURN VALUE:
  1259.  *
  1260.  *     swOut
  1261.  *                     16 bit short signed integer (Shortword) whose value
  1262.  *                     falls in the range
  1263.  *                     0 <= swOut <= 31
  1264.  *
  1265.  *
  1266.  *
  1267.  *   IMPLEMENTATION:
  1268.  *
  1269.  *     Get normalize shift count:
  1270.  *
  1271.  *     A 32 bit number is input (possiblly unnormalized).  Output
  1272.  *     the positive (or zero) shift count required to normalize the
  1273.  *     input.
  1274.  *
  1275.  *     If zero in input, return 0 as the shift count.
  1276.  *
  1277.  *     For non-zero numbers, count the number of left shift
  1278.  *     required to get the number to fall into the range:
  1279.  *
  1280.  *     0x4000 0000 >= normlzd number >= 0x7fff ffff (positive number)
  1281.  *     or
  1282.  *     0x8000 0000 <= normlzd number < 0xc000 0000 (negative number)
  1283.  *
  1284.  *     Return the number of shifts.
  1285.  *
  1286.  *     This instruction corresponds exactly to the Full-Rate "norm"
  1287.  *     instruction.
  1288.  *
  1289.  *   KEYWORDS: norm, normalization
  1290.  *
  1291.  *************************************************************************/
  1292. Shortword norm_l(Longword L_var1)
  1293. {
  1294.   Shortword swShiftCnt;
  1295.  // extern int complexity;mark del
  1296.  // int old_complexity;mark del
  1297.   
  1298.  // old_complexity = complexity;mark del
  1299.   if (L_var1 != 0) {
  1300.     if (!(L_var1 & LW_SIGN)) {
  1301.       /* positive input */
  1302.       for (swShiftCnt = 0; !(L_var1 <= LW_MAX && L_var1 >= 0x40000000L);
  1303.            swShiftCnt++) {
  1304.         L_var1 = L_var1 << 1;
  1305.       }
  1306.     }
  1307.     else {
  1308.       /* negative input */
  1309.       for (swShiftCnt = 0;
  1310.            !(L_var1 >= LW_MIN && L_var1 < (Longword) 0xc0000000L);
  1311.            swShiftCnt++) {
  1312.         L_var1 = L_var1 << 1;
  1313.       }
  1314.     }
  1315.   }
  1316.   else {
  1317.     swShiftCnt = 0;
  1318.   }
  1319. //  complexity = old_complexity + 30;mark del
  1320.   return (swShiftCnt);
  1321. }
  1322. /***************************************************************************
  1323.  *
  1324.  *   FUNCTION NAME: norm_s
  1325.  *
  1326.  *   PURPOSE:
  1327.  *
  1328.  *     Get normalize shift count:
  1329.  *
  1330.  *     A 16 bit number is input (possiblly unnormalized).  Output
  1331.  *     the positive (or zero) shift count required to normalize the
  1332.  *     input.
  1333.  *
  1334.  *   INPUTS:
  1335.  *
  1336.  *     var1
  1337.  *                     16 bit short signed integer (Shortword) whose value
  1338.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  1339.  *
  1340.  *   OUTPUTS:
  1341.  *
  1342.  *     none
  1343.  *
  1344.  *   RETURN VALUE:
  1345.  *     swOut
  1346.  *                     16 bit short signed integer (Shortword) whose value
  1347.  *                     falls in the range
  1348.  *                     0 <= swOut <= 15
  1349.  *
  1350.  *
  1351.  *
  1352.  *   IMPLEMENTATION:
  1353.  *
  1354.  *     Get normalize shift count:
  1355.  *
  1356.  *     A 16 bit number is input (possiblly unnormalized).  Output
  1357.  *     the positive (or zero) shift count required to normalize the
  1358.  *     input.
  1359.  *
  1360.  *     If zero in input, return 0 as the shift count.
  1361.  *
  1362.  *     For non-zero numbers, count the number of left shift
  1363.  *     required to get the number to fall into the range:
  1364.  *
  1365.  *     0x4000 >= normlzd number >= 0x7fff (positive number)
  1366.  *     or
  1367.  *     0x8000 <= normlzd number <  0xc000 (negative number)
  1368.  *
  1369.  *     Return the number of shifts.
  1370.  *
  1371.  *     This instruction corresponds exactly to the Full-Rate "norm"
  1372.  *     instruction.
  1373.  *
  1374.  *   KEYWORDS: norm, normalization
  1375.  *
  1376.  *************************************************************************/
  1377. Shortword norm_s(Shortword var1)
  1378. {
  1379.   short  swShiftCnt;
  1380.   Longword L_var1;
  1381.  // extern int complexity;mark del
  1382.  // int old_complexity;mark del
  1383.   
  1384. //  old_complexity = complexity;mark del
  1385.   L_var1 = L_deposit_h(var1);
  1386.   swShiftCnt = norm_l(L_var1);
  1387. //  complexity = old_complexity + 15;mark del
  1388.   return (swShiftCnt);
  1389. }
  1390. /***************************************************************************
  1391.  *
  1392.  *   FUNCTION NAME: L_mult
  1393.  *
  1394.  *   PURPOSE:
  1395.  *
  1396.  *     Perform a fractional multipy of the two 16 bit input numbers
  1397.  *     with saturation.  Output a 32 bit number.
  1398.  *
  1399.  *   INPUTS:
  1400.  *
  1401.  *     var1
  1402.  *                     16 bit short signed integer (Shortword) whose value
  1403.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  1404.  *     var2
  1405.  *                     16 bit short signed integer (Shortword) whose value
  1406.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  1407.  *
  1408.  *   OUTPUTS:
  1409.  *
  1410.  *     none
  1411.  *
  1412.  *   RETURN VALUE:
  1413.  *
  1414.  *     L_Out
  1415.  *                     32 bit long signed integer (Longword) whose value
  1416.  *                     falls in the range
  1417.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  1418.  *
  1419.  *   IMPLEMENTATION:
  1420.  *
  1421.  *     Multiply the two the two 16 bit input numbers. If the
  1422.  *     result is within this range, left shift the result by one
  1423.  *     and output the 32 bit number.  The only possible overflow
  1424.  *     occurs when var1==var2==-0x8000.  In this case output
  1425.  *     0x7fff ffff.
  1426.  *
  1427.  *   KEYWORDS: multiply, mult, mpy
  1428.  *
  1429.  *************************************************************************/
  1430. Longword L_mult(Shortword var1, Shortword var2)
  1431. {
  1432.   Longword L_product;
  1433. //  extern int complexity;mark del
  1434.   extern int saturation;
  1435. //  int old_complexity;mark del
  1436.   
  1437. //  old_complexity = complexity;mark del
  1438.   if (var1 == SW_MIN && var2 == SW_MIN) {
  1439.       saturation = saturation + 1;
  1440.       L_product = LW_MAX;                /* overflow */
  1441.   }
  1442.   else {
  1443.       L_product = (Longword) var1 *var2; /* integer multiply */
  1444.       
  1445.       L_product = L_product << 1;
  1446.   }
  1447. //  complexity = old_complexity + 1;mark del
  1448.   return (L_product);
  1449. }
  1450. /***************************************************************************
  1451.  *
  1452.  *   FUNCTION NAME: mult
  1453.  *
  1454.  *   PURPOSE:
  1455.  *
  1456.  *     Perform a fractional multipy of the two 16 bit input numbers
  1457.  *     with saturation and truncation.
  1458.  *
  1459.  *   INPUTS:
  1460.  *
  1461.  *     var1
  1462.  *                     16 bit short signed integer (Shortword) whose value
  1463.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  1464.  *     var2
  1465.  *                     16 bit short signed integer (Shortword) whose value
  1466.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  1467.  *
  1468.  *   OUTPUTS:
  1469.  *
  1470.  *     none
  1471.  *
  1472.  *   RETURN VALUE:
  1473.  *
  1474.  *     swOut
  1475.  *                     16 bit short signed integer (Shortword) whose value
  1476.  *                     falls in the range
  1477.  *                     0xffff 8000 <= swOut <= 0x0000 7fff.
  1478.  *
  1479.  *   IMPLEMENTATION:
  1480.  *
  1481.  *     Perform a fractional multipy of the two 16 bit input
  1482.  *     numbers.  If var1 == var2 == -0x8000, output 0x7fff.
  1483.  *     Otherwise output var1*var2 >> 15.  The output is a
  1484.  *     16 bit number.
  1485.  *
  1486.  *   KEYWORDS: mult, mulitply, mpy
  1487.  *
  1488.  *************************************************************************/
  1489. Shortword mult(Shortword var1, Shortword var2)
  1490. {
  1491.   Longword L_product;
  1492.   Shortword swOut;
  1493. //  extern int complexity;mark del
  1494. //  int old_complexity;mark del
  1495.   
  1496. //  old_complexity = complexity;mark del
  1497.   L_product = L_mult(var1, var2);
  1498.   swOut = extract_h(L_product);
  1499.  // complexity = old_complexity + 1;mark del
  1500.   return (swOut);
  1501. }
  1502. /***************************************************************************
  1503.  *
  1504.  *   FUNCTION NAME: mult_r
  1505.  *
  1506.  *   PURPOSE:
  1507.  *
  1508.  *     Perform a fractional multipy and round of the two 16 bit
  1509.  *     input numbers with saturation.
  1510.  *
  1511.  *   INPUTS:
  1512.  *
  1513.  *     var1
  1514.  *                     16 bit short signed integer (Shortword) whose value
  1515.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  1516.  *     var2
  1517.  *                     16 bit short signed integer (Shortword) whose value
  1518.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  1519.  *
  1520.  *   OUTPUTS:
  1521.  *
  1522.  *     none
  1523.  *
  1524.  *   RETURN VALUE:
  1525.  *
  1526.  *     swOut
  1527.  *                     16 bit short signed integer (Shortword) whose value
  1528.  *                     falls in the range
  1529.  *                     0xffff 8000 <= swOut <= 0x0000 7fff.
  1530.  *
  1531.  *   IMPLEMENTATION:
  1532.  *
  1533.  *     This routine is defined as the concatenation of the multiply
  1534.  *     operation and the round operation.
  1535.  *
  1536.  *     The fractional multiply (L_mult) produces a saturated 32 bit
  1537.  *     output.  This is followed by a an add of 0x0000 8000 to the
  1538.  *     32 bit result.  The result may overflow due to the add.  If
  1539.  *     so, the result is saturated.  The 32 bit rounded number is
  1540.  *     then shifted down 16 bits and returned as a Shortword.
  1541.  *
  1542.  *
  1543.  *   KEYWORDS: multiply and round, round, mult_r, mpyr
  1544.  *
  1545.  *************************************************************************/
  1546. Shortword mult_r(Shortword var1, Shortword var2)
  1547. {
  1548.   Shortword swOut;
  1549. //  extern int complexity;mark del
  1550. //  int old_complexity;mark del
  1551.   
  1552. //  old_complexity = complexity;mark del
  1553.   swOut = round(L_mult(var1, var2));
  1554.  // complexity = old_complexity + 2;mark del
  1555.   return (swOut);
  1556. }
  1557. /***************************************************************************
  1558.  *
  1559.  *   FUNCTION NAME: L_mac
  1560.  *
  1561.  *   PURPOSE:
  1562.  *
  1563.  *     Multiply accumulate.  Fractionally multiply two 16 bit
  1564.  *     numbers together with saturation.  Add to that result to the
  1565.  *     32 bit input with saturation.  Return the 32 bit result.
  1566.  *
  1567.  *   INPUTS:
  1568.  *
  1569.  *     var1
  1570.  *                     16 bit short signed integer (Shortword) whose value
  1571.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  1572.  *     var2
  1573.  *                     16 bit short signed integer (Shortword) whose value
  1574.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  1575.  *     L_var3
  1576.  *                     32 bit long signed integer (Longword) whose value
  1577.  *                     falls in the range
  1578.  *                     0x8000 0000 <= L_var2 <= 0x7fff ffff.
  1579.  *
  1580.  *   OUTPUTS:
  1581.  *
  1582.  *     none
  1583.  *
  1584.  *   RETURN VALUE:
  1585.  *
  1586.  *     L_Out
  1587.  *                     32 bit long signed integer (Longword) whose value
  1588.  *                     falls in the range
  1589.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  1590.  *
  1591.  *   IMPLEMENTATION:
  1592.  *
  1593.  *     Fractionally multiply two 16 bit numbers together with
  1594.  *     saturation.  The only numbers which will cause saturation on
  1595.  *     the multiply are 0x8000 * 0x8000.
  1596.  *
  1597.  *     Add to that result to the 32 bit input with saturation.
  1598.  *     Return the 32 bit result.
  1599.  *
  1600.  *     Please note that this is not a true multiply accumulate as
  1601.  *     most processors would implement it.  The 0x8000*0x8000
  1602.  *     causes and overflow for this instruction.  On an most
  1603.  *     processors this would cause an overflow only if the 32 bit
  1604.  *     input added to it were positive or zero.
  1605.  *
  1606.  *   KEYWORDS: mac, multiply accumulate
  1607.  *
  1608.  *************************************************************************/
  1609. Longword L_mac(Longword L_var3, Shortword var1, Shortword var2)
  1610. {
  1611.     Longword L_Out;
  1612.  //   extern int complexity;mark del
  1613.   //  int old_complexity;mark del
  1614.     
  1615.   //  old_complexity = complexity;mark del
  1616.     L_Out = L_add(L_var3, L_mult(var1, var2));
  1617. //    complexity = old_complexity + 1;mark del
  1618.     return (L_Out);
  1619. }
  1620. /***************************************************************************
  1621.  *
  1622.  *   FUNCTION NAME:mac_r
  1623.  *
  1624.  *   PURPOSE:
  1625.  *
  1626.  *     Multiply accumulate and round.  Fractionally multiply two 16
  1627.  *     bit numbers together with saturation.  Add to that result to
  1628.  *     the 32 bit input with saturation.  Finally round the result
  1629.  *     into a 16 bit number.
  1630.  *
  1631.  *
  1632.  *   INPUTS:
  1633.  *
  1634.  *     var1
  1635.  *                     16 bit short signed integer (Shortword) whose value
  1636.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  1637.  *     var2
  1638.  *                     16 bit short signed integer (Shortword) whose value
  1639.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  1640.  *     L_var3
  1641.  *                     32 bit long signed integer (Longword) whose value
  1642.  *                     falls in the range
  1643.  *                     0x8000 0000 <= L_var2 <= 0x7fff ffff.
  1644.  *
  1645.  *   OUTPUTS:
  1646.  *
  1647.  *     none
  1648.  *
  1649.  *   RETURN VALUE:
  1650.  *
  1651.  *     swOut
  1652.  *                     16 bit short signed integer (Shortword) whose value
  1653.  *                     falls in the range
  1654.  *                     0xffff 8000 <= swOut <= 0x0000 7fff.
  1655.  *
  1656.  *   IMPLEMENTATION:
  1657.  *
  1658.  *     Fractionally multiply two 16 bit numbers together with
  1659.  *     saturation.  The only numbers which will cause saturation on
  1660.  *     the multiply are 0x8000 * 0x8000.
  1661.  *
  1662.  *     Add to that result to the 32 bit input with saturation.
  1663.  *     Round the 32 bit result by adding 0x0000 8000 to the input.
  1664.  *     The result may overflow due to the add.  If so, the result
  1665.  *     is saturated.  The 32 bit rounded number is then shifted
  1666.  *     down 16 bits and returned as a Shortword.
  1667.  *
  1668.  *     Please note that this is not a true multiply accumulate as
  1669.  *     most processors would implement it.  The 0x8000*0x8000
  1670.  *     causes and overflow for this instruction.  On an most
  1671.  *     processors this would cause an overflow only if the 32 bit
  1672.  *     input added to it were positive or zero.
  1673.  *
  1674.  *   KEYWORDS: mac, multiply accumulate, macr
  1675.  *
  1676.  *************************************************************************/
  1677. Shortword mac_r(Longword L_var3, Shortword var1, Shortword var2)
  1678. {
  1679.     Shortword swOut;
  1680.  //   extern int complexity;mark del
  1681.  //   int old_complexity;mark del
  1682.     
  1683.  //   old_complexity = complexity;mark del
  1684.     swOut = round(L_add(L_var3,L_mult(var1, var2)));
  1685.   //  complexity = old_complexity + 2;  mark del 
  1686.     return (swOut);
  1687. }
  1688. /***************************************************************************
  1689.  *
  1690.  *   FUNCTION NAME: L_msu
  1691.  *
  1692.  *   PURPOSE:
  1693.  *
  1694.  *     Multiply and subtract.  Fractionally multiply two 16 bit
  1695.  *     numbers together with saturation.  Subtract from that result the
  1696.  *     32 bit input with saturation.  Return the 32 bit result.
  1697.  *
  1698.  *   INPUTS:
  1699.  *
  1700.  *     var1
  1701.  *                     16 bit short signed integer (Shortword) whose value
  1702.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  1703.  *     var2
  1704.  *                     16 bit short signed integer (Shortword) whose value
  1705.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  1706.  *     L_var3
  1707.  *                     32 bit long signed integer (Longword) whose value
  1708.  *                     falls in the range
  1709.  *                     0x8000 0000 <= L_var2 <= 0x7fff ffff.
  1710.  *
  1711.  *   OUTPUTS:
  1712.  *
  1713.  *     none
  1714.  *
  1715.  *   RETURN VALUE:
  1716.  *
  1717.  *     L_Out
  1718.  *                     32 bit long signed integer (Longword) whose value
  1719.  *                     falls in the range
  1720.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  1721.  *
  1722.  *   IMPLEMENTATION:
  1723.  *
  1724.  *     Fractionally multiply two 16 bit numbers together with
  1725.  *     saturation.  The only numbers which will cause saturation on
  1726.  *     the multiply are 0x8000 * 0x8000.
  1727.  *
  1728.  *     Subtract from that result to the 32 bit input with saturation.
  1729.  *     Return the 32 bit result.
  1730.  *
  1731.  *     Please note that this is not a true multiply accumulate as
  1732.  *     most processors would implement it.  The 0x8000*0x8000
  1733.  *     causes and overflow for this instruction.  On an most
  1734.  *     processors this would cause an overflow only if the 32 bit
  1735.  *     input added to it were negative or zero.
  1736.  *
  1737.  *   KEYWORDS: mac, multiply accumulate, msu
  1738.  *
  1739.  *************************************************************************/
  1740. Longword L_msu(Longword L_var3, Shortword var1, Shortword var2)
  1741. {
  1742.     Longword L_Out;
  1743. Longword L_mul;
  1744.   //  extern int complexity;mark del
  1745.   //  int old_complexity;mark del
  1746.     
  1747.   //  old_complexity = complexity;mark del
  1748.    /*  L_Out = L_sub(L_var3, L_mult(var1, var2)); */
  1749.       L_mul = _smpy(var1,var2);
  1750.   L_Out = _lssub(L_var3,L_mul);
  1751.   //  complexity = old_complexity + 1;mark del
  1752.     return (L_Out);
  1753. }
  1754. /***************************************************************************
  1755.  *
  1756.  *   FUNCTION NAME:  msu_r
  1757.  *
  1758.  *   PURPOSE:
  1759.  *
  1760.  *     Multiply subtract and round.  Fractionally multiply two 16
  1761.  *     bit numbers together with saturation.  Subtract from that result
  1762.  *     the 32 bit input with saturation.  Finally round the result
  1763.  *     into a 16 bit number.
  1764.  *
  1765.  *
  1766.  *   INPUTS:
  1767.  *
  1768.  *     var1
  1769.  *                     16 bit short signed integer (Shortword) whose value
  1770.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  1771.  *     var2
  1772.  *                     16 bit short signed integer (Shortword) whose value
  1773.  *                     falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
  1774.  *     L_var3
  1775.  *                     32 bit long signed integer (Longword) whose value
  1776.  *                     falls in the range
  1777.  *                     0x8000 0000 <= L_var2 <= 0x7fff ffff.
  1778.  *
  1779.  *   OUTPUTS:
  1780.  *
  1781.  *     none
  1782.  *
  1783.  *   RETURN VALUE:
  1784.  *
  1785.  *     swOut
  1786.  *                     16 bit short signed integer (Shortword) whose value
  1787.  *                     falls in the range
  1788.  *                     0xffff 8000 <= swOut <= 0x0000 7fff.
  1789.  *
  1790.  *   IMPLEMENTATION:
  1791.  *
  1792.  *     Fractionally multiply two 16 bit numbers together with
  1793.  *     saturation.  The only numbers which will cause saturation on
  1794.  *     the multiply are 0x8000 * 0x8000.
  1795.  *
  1796.  *     Subtract from that result to the 32 bit input with saturation.
  1797.  *     Round the 32 bit result by adding 0x0000 8000 to the input.
  1798.  *     The result may overflow due to the add.  If so, the result
  1799.  *     is saturated.  The 32 bit rounded number is then shifted
  1800.  *     down 16 bits and returned as a Shortword.
  1801.  *
  1802.  *     Please note that this is not a true multiply accumulate as
  1803.  *     most processors would implement it.  The 0x8000*0x8000
  1804.  *     causes and overflow for this instruction.  On an most
  1805.  *     processors this would cause an overflow only if the 32 bit
  1806.  *     input added to it were positive or zero.
  1807.  *
  1808.  *   KEYWORDS: mac, multiply accumulate, macr
  1809.  *
  1810.  *************************************************************************/
  1811. Shortword msu_r(Longword L_var3, Shortword var1, Shortword var2)
  1812. {
  1813.     Shortword swOut;
  1814. //    extern int complexity;mark del
  1815.  //   int old_complexity;mark del
  1816.     
  1817. //    old_complexity = complexity;mark del
  1818.     swOut = round(L_sub(L_var3, L_mult(var1, var2)));
  1819.  //   complexity = old_complexity + 2;mark del
  1820.     return (swOut);
  1821. }
  1822. /***************************************************************************
  1823.  *
  1824.  *   FUNCTION NAME: abs_s
  1825.  *
  1826.  *   PURPOSE:
  1827.  *
  1828.  *     Take the absolute value of the 16 bit input.  An input of
  1829.  *     -0x8000 results in a return value of 0x7fff.
  1830.  *
  1831.  *   INPUTS:
  1832.  *
  1833.  *     var1
  1834.  *                     16 bit short signed integer (Shortword) whose value
  1835.  *                     falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
  1836.  *
  1837.  *   OUTPUTS:
  1838.  *
  1839.  *     none
  1840.  *
  1841.  *   RETURN VALUE:
  1842.  *
  1843.  *     swOut
  1844.  *                     16 bit short signed integer (Shortword) whose value
  1845.  *                     falls in the range
  1846.  *                     0x0000 0000 <= swOut <= 0x0000 7fff.
  1847.  *
  1848.  *   IMPLEMENTATION:
  1849.  *
  1850.  *     Take the absolute value of the 16 bit input.  An input of
  1851.  *     -0x8000 results in a return value of 0x7fff.
  1852.  *
  1853.  *   KEYWORDS: absolute value, abs
  1854.  *
  1855.  *************************************************************************/
  1856. Shortword abs_s(Shortword var1)
  1857. {
  1858.   Shortword swOut;
  1859.  // extern int complexity;mark del
  1860. //  int old_complexity;mark del
  1861.   
  1862. //  old_complexity = complexity;mark del
  1863.   if (var1 == SW_MIN) {
  1864.     swOut = SW_MAX;
  1865.   }
  1866.   else {
  1867.     if (var1 < 0)
  1868.       swOut = -var1;
  1869.     else
  1870.       swOut = var1;
  1871.   }
  1872.  // complexity = old_complexity + 1;mark del
  1873.   return (swOut);
  1874. }
  1875. /***************************************************************************
  1876.  *
  1877.  *   FUNCTION NAME: L_abs
  1878.  *
  1879.  *   PURPOSE:
  1880.  *
  1881.  *     Take the absolute value of the 32 bit input.  An input of
  1882.  *     -0x8000 0000 results in a return value of 0x7fff ffff.
  1883.  *
  1884.  *   INPUTS:
  1885.  *
  1886.  *     L_var1
  1887.  *                     32 bit long signed integer (Longword) whose value
  1888.  *                     falls in the range
  1889.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  1890.  *
  1891.  *   OUTPUTS:
  1892.  *
  1893.  *     none
  1894.  *
  1895.  *   RETURN VALUE:
  1896.  *
  1897.  *     L_Out
  1898.  *                     32 bit long signed integer (Longword) whose value
  1899.  *                     falls in the range
  1900.  *                     0x8000 0000 <= L_var1 <= 0x7fff ffff.
  1901.  *
  1902.  *
  1903.  *
  1904.  *   KEYWORDS: absolute value, abs
  1905.  *
  1906.  *************************************************************************/
  1907. Longword L_abs(Longword L_var1)
  1908. {
  1909.   Longword L_Out;
  1910. //  extern int complexity;mark del
  1911. //  int old_complexity;mark del
  1912.   
  1913.  // old_complexity = complexity;mark del
  1914.   if (L_var1 == LW_MIN) {
  1915.     L_Out = LW_MAX;
  1916.   }
  1917.   else {
  1918.     if (L_var1 < 0)
  1919.       L_Out = -L_var1;
  1920.     else
  1921.       L_Out = L_var1;
  1922.   }
  1923. //  complexity = old_complexity + 3;mark del
  1924.   return (L_Out);
  1925. }