📄 mathhalf.c
字号:
*************************************************************************/
Longword L_mult(Shortword var1, Shortword var2)
{
Longword L_product;
if (var1 == SW_MIN && var2 == SW_MIN) {
L_product = LW_MAX; /* overflow */
}
else {
L_product = (Longword) var1 *var2; /* integer multiply */
L_product = L_product << 1;
}
return (L_product);
}
/***************************************************************************
*
* FUNCTION NAME: mult
*
* PURPOSE:
*
* Perform a fractional multipy of the two 16 bit input numbers
* with saturation and truncation.
*
* 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 a fractional multipy of the two 16 bit input
* numbers. If var1 == var2 == -0x8000, output 0x7fff.
* Otherwise output var1*var2 >> 15. The output is a
* 16 bit number.
*
* KEYWORDS: mult, mulitply, mpy
*
*************************************************************************/
Shortword mult(Shortword var1, Shortword var2)
{
Longword L_product;
Shortword swOut;
L_product = L_mult(var1, var2);
swOut = extract_h(L_product);
return (swOut);
}
/***************************************************************************
*
* FUNCTION NAME: mult_r
*
* PURPOSE:
*
* Perform a fractional multipy and round of the two 16 bit
* input numbers 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:
*
* This routine is defined as the concatenation of the multiply
* operation and the round operation.
*
* The fractional multiply (L_mult) produces a saturated 32 bit
* output. This is followed by a an add of 0x0000 8000 to the
* 32 bit result. The result may overflow due to the add. If
* so, the result is saturated. The 32 bit rounded number is
* then shifted down 16 bits and returned as a Shortword.
*
*
* KEYWORDS: multiply and round, round, mult_r, mpyr
*
*************************************************************************/
Shortword mult_r(Shortword var1, Shortword var2)
{
Shortword swOut;
swOut = round(L_mult(var1, var2));
return (swOut);
}
/***************************************************************************
*
* FUNCTION NAME: L_mac
*
* PURPOSE:
*
* Multiply accumulate. Fractionally multiply two 16 bit
* numbers together with saturation. Add to that result to the
* 32 bit input with saturation. Return the 32 bit result.
*
* 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.
* L_var3
* 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:
*
* Fractionally multiply two 16 bit numbers together with
* saturation. The only numbers which will cause saturation on
* the multiply are 0x8000 * 0x8000.
*
* Add to that result to the 32 bit input with saturation.
* Return the 32 bit result.
*
* Please note that this is not a true multiply accumulate as
* most processors would implement it. The 0x8000*0x8000
* causes and overflow for this instruction. On an most
* processors this would cause an overflow only if the 32 bit
* input added to it were positive or zero.
*
* KEYWORDS: mac, multiply accumulate
*
*************************************************************************/
Longword L_mac(Longword L_var3, Shortword var1, Shortword var2)
{
Longword L_Out;
L_Out = L_add(L_var3, L_mult(var1, var2));
return (L_Out);
}
/***************************************************************************
*
* FUNCTION NAME:mac_r
*
* PURPOSE:
*
* Multiply accumulate and round. Fractionally multiply two 16
* bit numbers together with saturation. Add to that result to
* the 32 bit input with saturation. Finally round the result
* into a 16 bit number.
*
*
* 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.
* L_var3
* 32 bit long signed integer (Longword) whose value
* falls in the range
* 0x8000 0000 <= L_var2 <= 0x7fff ffff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* swOut
* 16 bit short signed integer (Shortword) whose value
* falls in the range
* 0xffff 8000 <= swOut <= 0x0000 7fff.
*
* IMPLEMENTATION:
*
* Fractionally multiply two 16 bit numbers together with
* saturation. The only numbers which will cause saturation on
* the multiply are 0x8000 * 0x8000.
*
* Add to that result to the 32 bit input with saturation.
* Round the 32 bit result by adding 0x0000 8000 to the input.
* The result may overflow due to the add. If so, the result
* is saturated. The 32 bit rounded number is then shifted
* down 16 bits and returned as a Shortword.
*
* Please note that this is not a true multiply accumulate as
* most processors would implement it. The 0x8000*0x8000
* causes and overflow for this instruction. On an most
* processors this would cause an overflow only if the 32 bit
* input added to it were positive or zero.
*
* KEYWORDS: mac, multiply accumulate, macr
*
*************************************************************************/
Shortword mac_r(Longword L_var3, Shortword var1, Shortword var2)
{
Shortword swOut;
swOut = round(L_add(L_var3,L_mult(var1, var2)));
return (swOut);
}
/***************************************************************************
*
* FUNCTION NAME: L_msu
*
* PURPOSE:
*
* Multiply and subtract. Fractionally multiply two 16 bit
* numbers together with saturation. Subtract from that result the
* 32 bit input with saturation. Return the 32 bit result.
*
* 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.
* L_var3
* 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:
*
* Fractionally multiply two 16 bit numbers together with
* saturation. The only numbers which will cause saturation on
* the multiply are 0x8000 * 0x8000.
*
* Subtract from that result to the 32 bit input with saturation.
* Return the 32 bit result.
*
* Please note that this is not a true multiply accumulate as
* most processors would implement it. The 0x8000*0x8000
* causes and overflow for this instruction. On an most
* processors this would cause an overflow only if the 32 bit
* input added to it were negative or zero.
*
* KEYWORDS: mac, multiply accumulate, msu
*
*************************************************************************/
Longword L_msu(Longword L_var3, Shortword var1, Shortword var2)
{
Longword L_Out;
L_Out = L_sub(L_var3, L_mult(var1, var2));
return (L_Out);
}
/***************************************************************************
*
* FUNCTION NAME: msu_r
*
* PURPOSE:
*
* Multiply subtract and round. Fractionally multiply two 16
* bit numbers together with saturation. Subtract from that result
* the 32 bit input with saturation. Finally round the result
* into a 16 bit number.
*
*
* 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.
* L_var3
* 32 bit long signed integer (Longword) whose value
* falls in the range
* 0x8000 0000 <= L_var2 <= 0x7fff ffff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* swOut
* 16 bit short signed integer (Shortword) whose value
* falls in the range
* 0xffff 8000 <= swOut <= 0x0000 7fff.
*
* IMPLEMENTATION:
*
* Fractionally multiply two 16 bit numbers together with
* saturation. The only numbers which will cause saturation on
* the multiply are 0x8000 * 0x8000.
*
* Subtract from that result to the 32 bit input with saturation.
* Round the 32 bit result by adding 0x0000 8000 to the input.
* The result may overflow due to the add. If so, the result
* is saturated. The 32 bit rounded number is then shifted
* down 16 bits and returned as a Shortword.
*
* Please note that this is not a true multiply accumulate as
* most processors would implement it. The 0x8000*0x8000
* causes and overflow for this instruction. On an most
* processors this would cause an overflow only if the 32 bit
* input added to it were positive or zero.
*
* KEYWORDS: mac, multiply accumulate, macr
*
*************************************************************************/
Shortword msu_r(Longword L_var3, Shortword var1, Shortword var2)
{
Shortword swOut;
swOut = round(L_sub(L_var3, L_mult(var1, var2)));
return (swOut);
}
/***************************************************************************
*
* FUNCTION NAME: abs_s
*
* PURPOSE:
*
* Take the absolute value of the 16 bit input. An input of
* -0x8000 results in a return value of 0x7fff.
*
* INPUTS:
*
* var1
* 16 bit short signed integer (Shortword) whose value
* falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* swOut
* 16 bit short signed integer (Shortword) whose value
* falls in the range
* 0x0000 0000 <= swOut <= 0x0000 7fff.
*
* IMPLEMENTATION:
*
* Take the absolute value of the 16 bit input. An input of
* -0x8000 results in a return value of 0x7fff.
*
* KEYWORDS: absolute value, abs
*
*************************************************************************/
Shortword abs_s(Shortword var1)
{
Shortword swOut;
if (var1 == SW_MIN) {
swOut = SW_MAX;
}
else {
if (var1 < 0)
swOut = -var1;
else
swOut = var1;
}
return (swOut);
}
/***************************************************************************
*
* FUNCTION NAME: L_abs
*
* PURPOSE:
*
* Take the absolute value of the 32 bit input. An input of
* -0x8000 0000 results in a return value of 0x7fff ffff.
*
* INPUTS:
*
* 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.
*
*
*
* KEYWORDS: absolute value, abs
*
*************************************************************************/
Longword L_abs(Longword L_var1)
{
Longword L_Out;
if (L_var1 == LW_MIN) {
L_Out = LW_MAX;
}
else {
if (L_var1 < 0)
L_Out = -L_var1;
else
L_Out = L_var1;
}
return (L_Out);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -