Skip to content

Commit 6bbf17b

Browse files
committed
Add FCQWORD16 basic implementation
1 parent 0a7c4a8 commit 6bbf17b

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

Classes/FCryptoQWORD.uc

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,19 @@ struct FCQWORD
3333
var int B; // Low.
3434
};
3535

36+
// 64-bit unsigned integer simulated as four 16-bit signed words.
37+
struct FCQWORD16
38+
{
39+
var int A; // High.
40+
var int B;
41+
var int C;
42+
var int D; // Low.
43+
};
44+
45+
// TODO: need conversion functions between FCQWORD <-> FCQWORD16!
46+
// TODO: need variants of all comparison functions also for FCQWORD16?
47+
// TODO: make FCQWORD_Mul with the help of FCQWORD16_Mul?
48+
3649
// Return A > B.
3750
final static function bool IsGt(const out FCQWORD A, const out FCQWORD B)
3851
{
@@ -127,3 +140,53 @@ final static function bool IsLte_AsUInt32(int A, int B)
127140
Msb = Msb - (Msb >>> 1);
128141
return !bool((B & Msb) ^ Msb);
129142
}
143+
144+
// Calculate QW *= Mul, return carry.
145+
final static function FCQWORD16_Mul(out FCQWORD16 QW, FCQWORD16 Mul)
146+
{
147+
local FCQWORD16 Res;
148+
local int Tmp;
149+
local int Carry;
150+
local int Carry_Hi16;
151+
152+
Tmp = QW.D * Mul.D;
153+
Carry = (Tmp >>> 16) & 0xffff;
154+
Res.D = Tmp & 0xffff;
155+
156+
Tmp = Carry + (QW.D * Mul.C) + (QW.C * Mul.D);
157+
Carry = (Tmp >>> 16) & 0xffff;
158+
Res.C = Tmp & 0xffff;
159+
160+
Tmp = Carry + (QW.D * Mul.B) + (QW.C * Mul.C) + (QW.B * Mul.D);
161+
Carry = (Tmp >>> 16) & 0xffff;
162+
Res.B = Tmp & 0xffff;
163+
164+
Tmp = Carry + (QW.D * Mul.A) + (QW.C * Mul.B) + (QW.B * Mul.C) + (QW.A * Mul.D);
165+
Carry_Hi16 = ((QW.A * Mul.B) + (QW.B * Mul.A)) << 16;
166+
Carry = Carry_Hi16 | (((Tmp >>> 16) & 0xffff) + ((QW.A * Mul.C) + (QW.B * Mul.B) + (QW.C * Mul.A)));
167+
Res.A = Tmp & 0xffff;
168+
169+
QW = Res;
170+
return Carry;
171+
}
172+
173+
// Calculate QW += X, return carry.
174+
final static function int FCQWORD16_AddInt(out FCQWORD16 Qw, int X)
175+
{
176+
local int Carry;
177+
178+
QW.D += X;
179+
180+
QW.C += (QW.D >>> 16) & 0xffff;
181+
QW.D = QW.D & 0xffff;
182+
183+
QW.B += (QW.C >>> 16) & 0xffff;
184+
QW.C = QW.C & 0xffff;
185+
186+
QW.A += (QW.B >>> 16) & 0xffff;
187+
QW.B = QW.B & 0xffff;
188+
Carry = (QW.A >>> 16) & 0xffff;
189+
QW.A = QW.A & 0xffff;
190+
191+
return Carry;
192+
}

0 commit comments

Comments
 (0)