Skip to content

Commit 099bfef

Browse files
committed
Add TestSpeed suite, implement IsLt_AsUInt32
1 parent 3a684dc commit 099bfef

File tree

2 files changed

+200
-179
lines changed

2 files changed

+200
-179
lines changed

Classes/FCryptoQWORD.uc

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,37 @@ final static function bool IsGt_AsUInt32(int A, int B)
7777
// A <= B --> zero.
7878
return bool(Gtb & ~Ltb);
7979
}
80+
81+
final static function bool IsLt_AsUInt32(int A, int B)
82+
{
83+
// This is actually "less-than-or-equal"?
84+
// local int Msb;
85+
86+
// Msb = A ^ B;
87+
// Msb = Msb | (Msb >>> 1);
88+
// Msb = Msb | (Msb >>> 2);
89+
// Msb = Msb | (Msb >>> 4);
90+
// Msb = Msb | (Msb >>> 8);
91+
// Msb = Msb | (Msb >>> 16);
92+
// Msb = Msb - (Msb >>> 1);
93+
// return !bool((B & Msb) ^ Msb);
94+
95+
local int Ltb;
96+
local int Gtb;
97+
98+
// All bits in A that are less than their corresponding bits in B.
99+
Ltb = ~A & B;
100+
101+
// All bits in A that are greater than their corresponding bits in B.
102+
Gtb = A & ~B;
103+
104+
Gtb = Gtb | (Gtb >>> 1);
105+
Gtb = Gtb | (Gtb >>> 2);
106+
Gtb = Gtb | (Gtb >>> 4);
107+
Gtb = Gtb | (Gtb >>> 8);
108+
Gtb = Gtb | (Gtb >>> 16);
109+
110+
// A > B --> non-zero. // TODO: does this work?
111+
// A <= B --> zero. // TODO: does this work?
112+
return bool(Ltb & ~Gtb);
113+
}

0 commit comments

Comments
 (0)