@@ -8,13 +8,17 @@ use core::ops;
88const WORD_LO_MASK : u64 = 0x00000000ffffffff ;
99const WORD_HI_MASK : u64 = 0xffffffff00000000 ;
1010const WORD_FULL_MASK : u64 = 0xffffffffffffffff ;
11+ const U128_LO_MASK : u128 = u64:: MAX as u128 ;
12+ const U128_HI_MASK : u128 = ( u64:: MAX as u128 ) << 64 ;
1113
1214// Stored little endian
1315#[ allow( non_camel_case_types) ]
1416#[ derive( Clone , Copy , Debug , PartialEq , PartialOrd ) ]
1517pub struct u256 ( pub [ u64 ; 4 ] ) ;
1618
1719impl u256 {
20+ pub const MAX : Self = Self ( [ u64:: MAX , u64:: MAX , u64:: MAX , u64:: MAX ] ) ;
21+
1822 /// Reinterpret as a signed integer
1923 pub fn signed ( self ) -> i256 {
2024 i256 ( self . 0 )
@@ -256,7 +260,7 @@ impl HInt for u128 {
256260 let r1: u128 = ( sum0 >> 64 )
257261 + ( ( sum1 >> 32 ) & u128:: from ( WORD_FULL_MASK ) )
258262 + ( sum2 & u128:: from ( WORD_FULL_MASK ) )
259- + ( ( sum3 << 32 ) & u128:: from ( WORD_FULL_MASK ) ) ;
263+ + ( ( sum3 << 32 ) & u128:: from ( WORD_HI_MASK ) ) ;
260264
261265 let lo = r0 + ( r1 << 64 ) ;
262266 let hi = ( r1 >> 64 )
@@ -267,7 +271,12 @@ impl HInt for u128 {
267271 + ( sum5 << 32 )
268272 + ( sum6 << 64 ) ;
269273
270- u256 ( [ word ! ( 1 , lo) , word ! ( 2 , lo) , word ! ( 1 , hi) , word ! ( 2 , hi) ] )
274+ u256 ( [
275+ ( lo & U128_LO_MASK ) as u64 ,
276+ ( ( lo >> 64 ) & U128_LO_MASK ) as u64 ,
277+ ( hi & U128_LO_MASK ) as u64 ,
278+ ( ( hi >> 64 ) & U128_LO_MASK ) as u64 ,
279+ ] )
271280 }
272281
273282 fn widen_mul ( self , rhs : Self ) -> Self :: D {
@@ -302,8 +311,8 @@ impl HInt for i128 {
302311 let zeroes = word. leading_zeros ( ) ;
303312 let leading = u64:: MAX << ( 64 - zeroes) ;
304313 * word |= leading;
305- if zeroes != 64 {
306- break
314+ if zeroes != 64 {
315+ break ;
307316 }
308317 }
309318 }
0 commit comments