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
OC_BN_WORD
17
BigNumWordMul64
(
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
}
BigNumLib.h
OC_BN_WORD
UINTN OC_BN_WORD
Definition
BigNumLib.h:26
OC_BN_WORD_SIZE
#define OC_BN_WORD_SIZE
Definition
BigNumLib.h:30
OC_BN_WORD_NUM_BITS
#define OC_BN_WORD_NUM_BITS
Definition
BigNumLib.h:31
BigNumWordMul64
OC_BN_WORD BigNumWordMul64(OUT OC_BN_WORD *Hi, IN OC_BN_WORD A, IN OC_BN_WORD B)
Definition
BigNumWordMul64.c:17
ASSERT
#define ASSERT(x)
Definition
coder.h:55
Library
OcCryptoLib
Cpu32
BigNumWordMul64.c
Generated by
1.12.0