📄 basic_op.c
字号:
| |
| Complexity weight : 2 |
| |
| Inputs : |
| |
| L_var1 32 bit long signed integer (Word32) whose value falls in the |
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
| |
| L_var2 32 bit long signed integer (Word32) whose value falls in the |
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
| |
| Outputs : |
| |
| none |
| |
| Return Value : |
| |
| L_var_out |
| 32 bit long signed integer (Word32) whose value falls in the |
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
|___________________________________________________________________________|
*/
/*inline Word32 L_sub(Word32 L_var1, Word32 L_var2)
{
Word32 L_var_out;
L_var_out = L_var1 - L_var2;
if (((L_var1 ^ L_var2) & MIN_32) != 0)
{
if ((L_var_out ^ L_var1) & MIN_32)
{
L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
Overflow = 1;
}
}
return(L_var_out);
}*/
/*___________________________________________________________________________
| |
| Function Name : L_msu |
| |
| Purpose : |
| |
| Multiply var1 by var2 and shift the result left by 1. Subtract the 32 |
| bit result to L_var3 with saturation, return a 32 bit result: |
| L_msu(L_var3,var1,var2) = L_sub(L_var3,(L_mult(var1,var2)). |
| |
| Complexity weight : 1 |
| |
| Inputs : |
| |
| L_var3 32 bit long signed integer (Word32) whose value falls in the |
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
| |
| var1 |
| 16 bit short signed integer (Word16) whose value falls in the |
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
| |
| var2 |
| 16 bit short signed integer (Word16) whose value falls in the |
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
| |
| Outputs : |
| |
| none |
| |
| Return Value : |
| |
| L_var_out |
| 32 bit long signed integer (Word32) whose value falls in the |
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
|___________________________________________________________________________|
*/
/*inline Word32 L_msu(Word32 L_var3, Word16 var1, Word16 var2)
{
Word32 L_var_out;
Word32 L_produit;
L_produit = L_mult(var1,var2);
L_var_out = L_sub(L_var3,L_produit);
return(L_var_out);
}*/
/*___________________________________________________________________________
| |
| Function Name : L_sub_c |
| |
| Purpose : |
| |
| Performs 32 bits subtraction of the two 32 bits variables with carry |
| (borrow) : L_var1-L_var2-C. No saturation. Generate carry and Overflow |
| values. The carry and overflow values are binary variables which can |
| be tested and assigned values. |
| |
| Complexity weight : 2 |
| |
| Inputs : |
| |
| L_var1 32 bit long signed integer (Word32) whose value falls in the |
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
| |
| L_var2 32 bit long signed integer (Word32) whose value falls in the |
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
| |
| Outputs : |
| |
| none |
| |
| Return Value : |
| |
| L_var_out |
| 32 bit long signed integer (Word32) whose value falls in the |
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
| |
| Caution : |
| |
| In some cases the Carry flag has to be cleared or set before using op- |
| rators which take into account its value. |
|___________________________________________________________________________|
*/
inline Word32 L_sub_c(Word32 L_var1, Word32 L_var2)
{
Word32 L_var_out;
Word32 L_test;
Flag carry_int = 0;
if (Carry)
{
Carry = 0;
if (L_var2 != MIN_32)
{
L_var_out = L_add_c(L_var1,-L_var2);
}
else
{
L_var_out = L_var1 - L_var2;
if (L_var1 > 0L)
{
Overflow = 1;
Carry = 0;
}
}
}
else
{
L_var_out = L_var1 - L_var2 - (Word32)0X00000001;
L_test = L_var1 - L_var2;
if ((L_test < 0) && (L_var1 > 0) && (L_var2 < 0))
{
Overflow = 1;
carry_int = 0;
}
else if ((L_test > 0) && (L_var1 < 0) && (L_var2 > 0))
{
Overflow = 1;
carry_int = 1;
}
else if ((L_test > 0) && ((L_var1 ^ L_var2) > 0))
{
Overflow = 0;
carry_int = 1;
}
if (L_test == MIN_32)
{
Overflow = 1;
Carry = carry_int;
}
else
{
Carry = carry_int;
}
}
return(L_var_out);
}
/*___________________________________________________________________________
| |
| Function Name : L_add_c |
| |
| Purpose : |
| |
| Performs 32 bits addition of the two 32 bits variables (L_var1+L_var2+C)|
| with carry. No saturation. Generate carry and Overflow values. The car- |
| ry and overflow values are binary variables which can be tested and as- |
| signed values. |
| |
| Complexity weight : 2 |
| |
| Inputs : |
| |
| L_var1 32 bit long signed integer (Word32) whose value falls in the |
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
| |
| L_var2 32 bit long signed integer (Word32) whose value falls in the |
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
| |
| Outputs : |
| |
| none |
| |
| Return Value : |
| |
| L_var_out |
| 32 bit long signed integer (Word32) whose value falls in the |
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
| |
| Caution : |
| |
| In some cases the Carry flag has to be cleared or set before using op- |
| rators which take into account its value. |
|___________________________________________________________________________|
*/
inline Word32 L_add_c(Word32 L_var1, Word32 L_var2)
{
Word32 L_var_out;
Word32 L_test;
Flag carry_int = 0;
L_var_out = L_var1 + L_var2 + Carry;
L_test = L_var1 + L_var2;
if ((L_var1>0) && (L_var2 >0) && (L_test < 0))
{
Overflow = 1;
carry_int = 0;
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -