📄 mathhalf.c
字号:
L_Out = LW_MAX;
}
else {
L_Out = -L_var1;
}
return (L_Out);
}
/***************************************************************************
*
* FUNCTION NAME: add
*
* PURPOSE:
*
* Perform the addition of the two 16 bit input variable with
* saturation.
*
* INPUTS:
*
* var1
* 16 bit short signed integer (Shortword) whose value
* falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
* var2
* 16 bit short signed integer (Shortword) whose value
* falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* swOut
* 16 bit short signed integer (Shortword) whose value
* falls in the range
* 0xffff 8000 <= swOut <= 0x0000 7fff.
*
* IMPLEMENTATION:
*
* Perform the addition of the two 16 bit input variable with
* saturation.
*
* swOut = var1 + var2
*
* swOut is set to 0x7fff if the operation results in an
* overflow. swOut is set to 0x8000 if the operation results
* in an underflow.
*
* KEYWORDS: add, addition
*
*************************************************************************/
Shortword add(Shortword var1, Shortword var2)
{
Longword L_sum;
Shortword swOut;
L_sum = (Longword) var1 + var2;
swOut = saturate(L_sum);
return (swOut);
}
/***************************************************************************
*
* FUNCTION NAME: L_add
*
* PURPOSE:
*
* Perform the addition of the two 32 bit input variables with
* saturation.
*
* INPUTS:
*
* L_var1
* 32 bit long signed integer (Longword) whose value
* falls in the range
* 0x8000 0000 <= L_var1 <= 0x7fff ffff.
* L_var2
* 32 bit long signed integer (Longword) whose value
* falls in the range
* 0x8000 0000 <= L_var2 <= 0x7fff ffff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* L_Out
* 32 bit long signed integer (Longword) whose value
* falls in the range
* 0x8000 0000 <= L_var1 <= 0x7fff ffff.
*
* IMPLEMENTATION:
*
* Perform the addition of the two 32 bit input variables with
* saturation.
*
* L_Out = L_var1 + L_var2
*
* L_Out is set to 0x7fff ffff if the operation results in an
* overflow. L_Out is set to 0x8000 0000 if the operation
* results in an underflow.
*
* KEYWORDS: add, addition
*
*************************************************************************/
Longword L_add(Longword L_var1, Longword L_var2)
{
Longword L_Sum,
L_SumLow,
L_SumHigh;
L_Sum = L_var1 + L_var2;
if ((L_var1 > 0 && L_var2 > 0) || (L_var1 < 0 && L_var2 < 0)) {
/* an overflow is possible */
L_SumLow = (L_var1 & (Longword)0xffff) + (L_var2 & (Longword)0xffff);
L_SumHigh = ((L_var1 >> 16) & (Longword)0xffff) + ((L_var2 >> 16) & (Longword)0xffff);
if (L_SumLow & (Longword)0x10000) {
/* carry into high word is set */
L_SumHigh += 1;
}
/* update sum only if there is an overflow or underflow */
/*------------------------------------------------------*/
if (((Longword)0x10000 & L_SumHigh) && !((Longword)0x8000 & L_SumHigh)) {
L_Sum = LW_MIN; /* underflow */
}
else if (!((Longword)0x10000 & L_SumHigh) && ((Longword)0x8000 & L_SumHigh)) {
L_Sum = LW_MAX; /* overflow */
}
}
return (L_Sum);
}
/***************************************************************************
*
* FUNCTION NAME: sub
*
* PURPOSE:
*
* Perform the subtraction of the two 16 bit input variable with
* saturation.
*
* INPUTS:
*
* var1
* 16 bit short signed integer (Shortword) whose value
* falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
* var2
* 16 bit short signed integer (Shortword) whose value
* falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* swOut
* 16 bit short signed integer (Shortword) whose value
* falls in the range
* 0xffff 8000 <= swOut <= 0x0000 7fff.
*
* IMPLEMENTATION:
*
* Perform the subtraction of the two 16 bit input variable with
* saturation.
*
* swOut = var1 - var2
*
* swOut is set to 0x7fff if the operation results in an
* overflow. swOut is set to 0x8000 if the operation results
* in an underflow.
*
* KEYWORDS: sub, subtraction
*
*************************************************************************/
Shortword sub(Shortword var1, Shortword var2)
{
Longword L_diff;
Shortword swOut;
L_diff = (Longword) var1 - var2;
swOut = saturate(L_diff);
return (swOut);
}
/***************************************************************************
*
* FUNCTION NAME: L_sub
*
* PURPOSE:
*
* Perform the subtraction of the two 32 bit input variables with
* saturation.
*
* INPUTS:
*
* L_var1
* 32 bit long signed integer (Longword) whose value
* falls in the range
* 0x8000 0000 <= L_var1 <= 0x7fff ffff.
* L_var2
* 32 bit long signed integer (Longword) whose value
* falls in the range
* 0x8000 0000 <= L_var2 <= 0x7fff ffff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* L_Out
* 32 bit long signed integer (Longword) whose value
* falls in the range
* 0x8000 0000 <= L_var1 <= 0x7fff ffff.
*
* IMPLEMENTATION:
*
* Perform the subtraction of the two 32 bit input variables with
* saturation.
*
* L_Out = L_var1 - L_var2
*
* L_Out is set to 0x7fff ffff if the operation results in an
* overflow. L_Out is set to 0x8000 0000 if the operation
* results in an underflow.
*
* KEYWORDS: sub, subtraction
*
*************************************************************************/
Longword L_sub(Longword L_var1, Longword L_var2)
{
Longword L_Sum;
/* check for overflow */
if ((L_var1 > 0 && L_var2 < 0) || (L_var1 < 0 && L_var2 > 0)) {
if (L_var2 == LW_MIN) {
L_Sum = L_add(L_var1, LW_MAX);
L_Sum = L_add(L_Sum, 1);
}
else
L_Sum = L_add(L_var1, -L_var2);
}
else { /* no overflow possible */
L_Sum = L_var1 - L_var2;
}
return (L_Sum);
}
/***************************************************************************
*
* FUNCTION NAME: shr
*
* PURPOSE:
*
* Arithmetic shift right (or left).
* Arithmetically shift the input right by var2. If var2 is
* negative then an arithmetic shift left (shl) of var1 by
* -var2 is performed.
*
* INPUTS:
*
* var1
* 16 bit short signed integer (Shortword) whose value
* falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
* var2
* 16 bit short signed integer (Shortword) whose value
* falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* swOut
* 16 bit short signed integer (Shortword) whose value
* falls in the range
* 0xffff 8000 <= swOut <= 0x0000 7fff.
*
* IMPLEMENTATION:
*
* Arithmetically shift the input right by var2. This
* operation maintains the sign of the input number. If var2 is
* negative then an arithmetic shift left (shl) of var1 by
* -var2 is performed. See description of shl for details.
*
* Equivalent to the Full-Rate GSM ">> n" operation. Note that
* ANSI-C does not guarantee operation of the C ">>" or "<<"
* operator for negative numbers.
*
* KEYWORDS: shift, arithmetic shift right,
*
*************************************************************************/
Shortword shr(Shortword var1, Shortword var2)
{
Shortword swMask,swOut;
if (var2 == 0 || var1 == 0)
swOut = var1;
else if (var2 < 0)
{
if (var2 <= -15)
{
swOut = (var1 > 0) ? SW_MAX : SW_MIN;
}
else
swOut = shl(var1, (Shortword)-var2);
}
else
{
if (var2 >= 15)
swOut = (var1 < 0) ? (Shortword) 0xffff : 0x0;
else
{
swMask = 0;
if (var1 < 0)
{
swMask = ~swMask << (16 - var2);
}
var1 >>= var2;
swOut = swMask | var1;
}
}
return (swOut);
}
/***************************************************************************
*
* FUNCTION NAME: shl
*
* PURPOSE:
*
* Arithmetically shift the input left by var2.
*
*
* INPUTS:
*
* var1
* 16 bit short signed integer (Shortword) whose value
* falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
* var2
* 16 bit short signed integer (Shortword) whose value
* falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* swOut
* 16 bit short signed integer (Shortword) whose value
* falls in the range
* 0xffff 8000 <= swOut <= 0x0000 7fff.
*
* IMPLEMENTATION:
*
* If Arithmetically shift the input left by var2. If var2 is
* negative then an arithmetic shift right (shr) of var1 by
* -var2 is performed. See description of shr for details.
* When an arithmetic shift left is performed the var2 LS bits
* are zero filled.
*
* The only exception is if the left shift causes an overflow
* or underflow. In this case the LS bits are not modified.
* The number returned is 0x8000 in the case of an underflow or
* 0x7fff in the case of an overflow.
*
* The shl is equivalent to the Full-Rate GSM "<< n" operation.
* Note that ANSI-C does not guarantee operation of the C ">>"
* or "<<" operator for negative numbers - it is not specified
* whether this shift is an arithmetic or logical shift.
*
* KEYWORDS: asl, arithmetic shift left, shift
*
*************************************************************************/
Shortword shl(Shortword var1, Shortword var2)
{
Shortword swOut;
Longword L_Out;
if (var2 == 0 || var1 == 0) {
swOut = var1;
}
else if (var2 < 0) {
/* perform a right shift */
/*-----------------------*/
if (var2 <= -15)
swOut = (var1 < 0) ? (Shortword) 0xffff : 0x0;
else
swOut = shr(var1, (Shortword)-var2);
}
else {
/* var2 > 0 */
if (var2 >= 15) {
swOut = (var1 > 0) ? SW_MAX : SW_MIN; /* saturate */
}
else {
L_Out = (Longword) var1 *(1 << var2);
swOut = (Shortword) L_Out; /* copy low portion to swOut,
* overflow could have hpnd */
if (swOut != L_Out) {
/* overflow */
swOut = (var1 > 0) ? SW_MAX : SW_MIN; /* saturate */
}
}
}
return (swOut);
}
/***************************************************************************
*
* FUNCTION NAME: L_shr
*
* PURPOSE:
*
* Arithmetic shift right (or left).
* Arithmetically shift the input right by var2. If var2 is
* negative then an arithmetic shift left (shl) of var1 by
* -var2 is performed.
*
* INPUTS:
*
* var2
* 16 bit short signed integer (Shortword) whose value
* falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
* L_var1
* 32 bit long signed integer (Longword) whose value
* falls in the range
* 0x8000 0000 <= L_var1 <= 0x7fff ffff.
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* L_Out
* 32 bit long signed integer (Longword) whose value
* falls in the range
* 0x8000 0000 <= L_var1 <= 0x7fff ffff.
*
*
* IMPLEMENTATION:
*
* Arithmetically shift the input right by var2. This
* operation maintains the sign of the input number. If var2 is
* negative then an arithmetic shift left (shl) of L_var1 by
* -var2 is performed. See description of L_shl for details.
*
* The input is a 32 bit number, as is the output.
*
* Equivalent to the Full-Rate GSM ">> n" operation. Note that
* ANSI-C does not guarantee operation of the C ">>" or "<<"
* operator for negative numbers.
*
* KEYWORDS: shift, arithmetic shift right,
*
*************************************************************************/
Longword L_shr(Longword L_var1, Shortword var2)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -