@@ -8,13 +8,17 @@ use core::ops;
8
8
const WORD_LO_MASK : u64 = 0x00000000ffffffff ;
9
9
const WORD_HI_MASK : u64 = 0xffffffff00000000 ;
10
10
const 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 ;
11
13
12
14
// Stored little endian
13
15
#[ allow( non_camel_case_types) ]
14
16
#[ derive( Clone , Copy , Debug , PartialEq , PartialOrd ) ]
15
17
pub struct u256 ( pub [ u64 ; 4 ] ) ;
16
18
17
19
impl u256 {
20
+ pub const MAX : Self = Self ( [ u64:: MAX , u64:: MAX , u64:: MAX , u64:: MAX ] ) ;
21
+
18
22
/// Reinterpret as a signed integer
19
23
pub fn signed ( self ) -> i256 {
20
24
i256 ( self . 0 )
@@ -256,7 +260,7 @@ impl HInt for u128 {
256
260
let r1: u128 = ( sum0 >> 64 )
257
261
+ ( ( sum1 >> 32 ) & u128:: from ( WORD_FULL_MASK ) )
258
262
+ ( sum2 & u128:: from ( WORD_FULL_MASK ) )
259
- + ( ( sum3 << 32 ) & u128:: from ( WORD_FULL_MASK ) ) ;
263
+ + ( ( sum3 << 32 ) & u128:: from ( WORD_HI_MASK ) ) ;
260
264
261
265
let lo = r0 + ( r1 << 64 ) ;
262
266
let hi = ( r1 >> 64 )
@@ -267,7 +271,12 @@ impl HInt for u128 {
267
271
+ ( sum5 << 32 )
268
272
+ ( sum6 << 64 ) ;
269
273
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
+ ] )
271
280
}
272
281
273
282
fn widen_mul ( self , rhs : Self ) -> Self :: D {
@@ -302,8 +311,8 @@ impl HInt for i128 {
302
311
let zeroes = word. leading_zeros ( ) ;
303
312
let leading = u64:: MAX << ( 64 - zeroes) ;
304
313
* word |= leading;
305
- if zeroes != 64 {
306
- break
314
+ if zeroes != 64 {
315
+ break ;
307
316
}
308
317
}
309
318
}
0 commit comments