mirror of
https://github.com/acidanthera/OpenCorePkg.git
synced 2025-12-08 19:25:01 +00:00
OcGuardLib: Add U16 arithmetics
This commit is contained in:
parent
990ad449fe
commit
0d0279cc7f
@ -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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user