OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
BigNumWordMul64.c
Go to the documentation of this file.
1
14#include "../BigNumLib.h"
15
16#if defined (_MSC_VER) && !defined (__clang__)
17 #include <intrin.h>
18 #pragma intrinsic(_umul128)
19#endif
20
23 OUT OC_BN_WORD *Hi,
24 IN OC_BN_WORD A,
25 IN OC_BN_WORD B
26 )
27{
28 ASSERT (OC_BN_WORD_SIZE == sizeof (UINT64));
29 ASSERT (Hi != NULL);
30
31 #if !defined (_MSC_VER) || defined (__clang__)
32 //
33 // Clang and GCC support the __int128 type for edk2 builds.
34 //
35 unsigned __int128 Result = (unsigned __int128)A * B;
36 *Hi = (OC_BN_WORD)(Result >> OC_BN_WORD_NUM_BITS);
37 return (OC_BN_WORD)Result;
38 #else
39 //
40 // MSVC does not support the __int128 type for edk2 builds, but a proprietary
41 // intrinsic function declared above.
42 //
43 return _umul128 (A, B, Hi);
44 #endif
45}
UINTN OC_BN_WORD
Definition BigNumLib.h:26
#define OC_BN_WORD_SIZE
Definition BigNumLib.h:30
#define OC_BN_WORD_NUM_BITS
Definition BigNumLib.h:31
OC_BN_WORD BigNumWordMul64(OUT OC_BN_WORD *Hi, IN OC_BN_WORD A, IN OC_BN_WORD B)
#define ASSERT(x)
Definition coder.h:55