Skip to content

Commit 6ffb894

Browse files
committed
Implement comparison to 128-bit integers
1 parent 98fb0bd commit 6ffb894

File tree

1 file changed

+64
-4
lines changed

1 file changed

+64
-4
lines changed

src/Nethermind.Int256/UInt256.cs

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1789,16 +1789,76 @@ public static explicit operator UInt128(in UInt256 a) =>
17891789
private static bool LessThan(ulong a, in UInt256 b) => b.u3 != 0 || b.u2 != 0 || b.u1 != 0 || a < b.u0;
17901790

17911791
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1792-
private static bool LessThan(in UInt256 a, Int128 b) => a.u3 == 0 && a.u2 == 0 && a.u1 == 0 && a.u0 < b;
1792+
private static bool LessThan(in UInt256 a, Int128 b)
1793+
{
1794+
if (b < 0 || a.u3 != 0 || a.u2 != 0)
1795+
return false;
1796+
1797+
var bHigh = (ulong)(b >> 64);
1798+
var bLow = (ulong)(b & ulong.MaxValue);
1799+
1800+
if (a.u1 > bHigh)
1801+
return false;
1802+
1803+
if (a.u1 < bHigh)
1804+
return true;
1805+
1806+
return a.u0 < bLow;
1807+
}
17931808

17941809
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1795-
private static bool LessThan(Int128 a, in UInt256 b) => b.u3 != 0 || b.u2 != 0 || b.u1 != 0 || a < b.u0;
1810+
private static bool LessThan(Int128 a, in UInt256 b)
1811+
{
1812+
if (a < 0 || b.u3 != 0 || b.u2 != 0)
1813+
return true;
1814+
1815+
var aHigh = (ulong)(a >> 64);
1816+
var aLow = (ulong)(a & ulong.MaxValue);
1817+
1818+
if (aHigh > b.u1)
1819+
return false;
1820+
1821+
if (aHigh < b.u1)
1822+
return true;
1823+
1824+
return aLow < b.u0;
1825+
}
17961826

17971827
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1798-
private static bool LessThan(in UInt256 a, UInt128 b) => a.u3 == 0 && a.u2 == 0 && a.u1 == 0 && a.u0 < b;
1828+
private static bool LessThan(in UInt256 a, UInt128 b)
1829+
{
1830+
if (a.u3 != 0 || a.u2 != 0)
1831+
return false;
1832+
1833+
var bHigh = (ulong)(b >> 64);
1834+
var bLow = (ulong)(b & ulong.MaxValue);
1835+
1836+
if (a.u1 > bHigh)
1837+
return false;
1838+
1839+
if (a.u1 < bHigh)
1840+
return true;
1841+
1842+
return a.u0 < bLow;
1843+
}
17991844

18001845
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1801-
private static bool LessThan(UInt128 a, in UInt256 b) => b.u3 != 0 || b.u2 != 0 || b.u1 != 0 || a < b.u0;
1846+
private static bool LessThan(UInt128 a, in UInt256 b)
1847+
{
1848+
if (b.u3 != 0 || b.u2 != 0)
1849+
return true;
1850+
1851+
var aHigh = (ulong)(a >> 64);
1852+
var aLow = (ulong)(a & ulong.MaxValue);
1853+
1854+
if (aHigh > b.u1)
1855+
return false;
1856+
1857+
if (aHigh < b.u1)
1858+
return true;
1859+
1860+
return aLow < b.u0;
1861+
}
18021862

18031863
[MethodImpl(MethodImplOptions.AggressiveInlining)]
18041864
private static bool LessThan(in UInt256 a, in UInt256 b)

0 commit comments

Comments
 (0)