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
18 OUT OC_BN_WORD *Hi,
19 IN OC_BN_WORD A,
20 IN OC_BN_WORD B
21 )
22{
23 ASSERT (OC_BN_WORD_SIZE == sizeof (UINT64));
24 ASSERT (Hi != NULL);
25 //
26 // This is to be used when the used compiler lacks support for both the
27 // __int128 type and a suiting intrinsic to perform the calculation.
28 //
29 // Source: https://stackoverflow.com/a/31662911
30 //
31 CONST OC_BN_WORD SubWordShift = OC_BN_WORD_NUM_BITS / 2;
32 CONST OC_BN_WORD SubWordMask = ((OC_BN_WORD)1U << SubWordShift) - 1;
33
34 OC_BN_WORD ALo;
35 OC_BN_WORD AHi;
36 OC_BN_WORD BLo;
37 OC_BN_WORD BHi;
38
39 OC_BN_WORD P0;
40 OC_BN_WORD P1;
41 OC_BN_WORD P2;
42 OC_BN_WORD P3;
43
44 OC_BN_WORD Cy;
45
46 ALo = A & SubWordMask;
47 AHi = A >> SubWordShift;
48 BLo = B & SubWordMask;
49 BHi = B >> SubWordShift;
50
51 P0 = ALo * BLo;
52 P1 = ALo * BHi;
53 P2 = AHi * BLo;
54 P3 = AHi * BHi;
55
56 Cy = (((P0 >> SubWordShift) + (P1 & SubWordMask) + (P2 & SubWordMask)) >> SubWordShift) & SubWordMask;
57
58 *Hi = P3 + (P1 >> SubWordShift) + (P2 >> SubWordShift) + Cy;
59 return P0 + (P1 << SubWordShift) + (P2 << SubWordShift);
60}
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