@@ -1789,16 +1789,76 @@ public static explicit operator UInt128(in UInt256 a) =>
1789
1789
private static bool LessThan ( ulong a , in UInt256 b ) => b . u3 != 0 || b . u2 != 0 || b . u1 != 0 || a < b . u0 ;
1790
1790
1791
1791
[ 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
+ }
1793
1808
1794
1809
[ 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
+ }
1796
1826
1797
1827
[ 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
+ }
1799
1844
1800
1845
[ 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
+ }
1802
1862
1803
1863
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
1804
1864
private static bool LessThan ( in UInt256 a , in UInt256 b )
0 commit comments