提交 0d0279cc 编写于 作者: V vit9696

OcGuardLib: Add U16 arithmetics

上级 990ad449
......@@ -56,6 +56,27 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
// and multiplication with addition (A*B+C) support.
//
BOOLEAN
OcOverflowAddU16 (
UINT16 A,
UINT16 B,
UINT16 *Result
);
BOOLEAN
OcOverflowSubU16 (
UINT16 A,
UINT16 B,
UINT16 *Result
);
BOOLEAN
OcOverflowMulU16 (
UINT16 A,
UINT16 B,
UINT16 *Result
);
BOOLEAN
OcOverflowAddU32 (
UINT32 A,
......
......@@ -26,6 +26,73 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
// target C99 compliance rather than performance.
//
BOOLEAN
OcOverflowAddU16 (
UINT16 A,
UINT16 B,
UINT16 *Result
)
{
#if defined(OC_HAS_TYPE_GENERIC_BUILTINS)
return __builtin_add_overflow(A, B, Result);
#else
UINT32 Temp;
//
// I believe casting will be faster on X86 at least.
//
Temp = A + B;
*Result = (UINT16) Temp;
if (Temp <= MAX_UINT16) {
return FALSE;
}
return TRUE;
#endif
}
BOOLEAN
OcOverflowSubU16 (
UINT16 A,
UINT16 B,
UINT16 *Result
)
{
#if defined(OC_HAS_TYPE_GENERIC_BUILTINS)
return __builtin_sub_overflow(A, B, Result);
#else
*Result = (UINT16) (A - B);
if (A >= B) {
return FALSE;
}
return TRUE;
#endif
}
BOOLEAN
OcOverflowMulU16 (
UINT16 A,
UINT16 B,
UINT16 *Result
)
{
#if defined(OC_HAS_TYPE_GENERIC_BUILTINS)
return __builtin_mul_overflow(A, B, Result);
#else
UINT32 Temp;
Temp = (UINT32) A * B;
*Result = (UINT16) Temp;
if (Temp <= MAX_UINT32) {
return FALSE;
}
return TRUE;
#endif
}
BOOLEAN
OcOverflowAddU32 (
UINT32 A,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册