mathhalf.c
上传用户:cxx_68
上传日期:2021-02-21
资源大小:161k
文件大小:56k
源码类别:

语音压缩

开发平台:

Visual C++

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