1- use int:: Int ;
2- use int:: LargeInt ;
1+ use int:: { DInt , Int } ;
32
4- trait UAddSub : LargeInt {
3+ trait UAddSub : DInt {
54 fn uadd ( self , other : Self ) -> Self {
6- let ( low, carry) = self . low ( ) . overflowing_add ( other. low ( ) ) ;
7- let high = self . high ( ) . wrapping_add ( other. high ( ) ) ;
8- let carry = if carry {
9- Self :: HighHalf :: ONE
10- } else {
11- Self :: HighHalf :: ZERO
12- } ;
13- Self :: from_parts ( low, high. wrapping_add ( carry) )
5+ let ( lo, carry) = self . lo ( ) . overflowing_add ( other. lo ( ) ) ;
6+ let hi = self . hi ( ) . wrapping_add ( other. hi ( ) ) ;
7+ let carry = if carry { Self :: H :: ONE } else { Self :: H :: ZERO } ;
8+ Self :: from_lo_hi ( lo, hi. wrapping_add ( carry) )
149 }
1510 fn uadd_one ( self ) -> Self {
16- let ( low, carry) = self . low ( ) . overflowing_add ( Self :: LowHalf :: ONE ) ;
17- let carry = if carry {
18- Self :: HighHalf :: ONE
19- } else {
20- Self :: HighHalf :: ZERO
21- } ;
22- Self :: from_parts ( low, self . high ( ) . wrapping_add ( carry) )
11+ let ( lo, carry) = self . lo ( ) . overflowing_add ( Self :: H :: ONE ) ;
12+ let carry = if carry { Self :: H :: ONE } else { Self :: H :: ZERO } ;
13+ Self :: from_lo_hi ( lo, self . hi ( ) . wrapping_add ( carry) )
2314 }
2415 fn usub ( self , other : Self ) -> Self {
2516 let uneg = ( !other) . uadd_one ( ) ;
@@ -48,19 +39,9 @@ trait Addo: AddSub
4839where
4940 <Self as Int >:: UnsignedInt : UAddSub ,
5041{
51- fn addo ( self , other : Self , overflow : & mut i32 ) -> Self {
52- * overflow = 0 ;
53- let result = AddSub :: add ( self , other) ;
54- if other >= Self :: ZERO {
55- if result < self {
56- * overflow = 1 ;
57- }
58- } else {
59- if result >= self {
60- * overflow = 1 ;
61- }
62- }
63- result
42+ fn addo ( self , other : Self ) -> ( Self , bool ) {
43+ let sum = AddSub :: add ( self , other) ;
44+ ( sum, ( other < Self :: ZERO ) != ( sum < self ) )
6445 }
6546}
6647
@@ -71,19 +52,9 @@ trait Subo: AddSub
7152where
7253 <Self as Int >:: UnsignedInt : UAddSub ,
7354{
74- fn subo ( self , other : Self , overflow : & mut i32 ) -> Self {
75- * overflow = 0 ;
76- let result = AddSub :: sub ( self , other) ;
77- if other >= Self :: ZERO {
78- if result > self {
79- * overflow = 1 ;
80- }
81- } else {
82- if result <= self {
83- * overflow = 1 ;
84- }
85- }
86- result
55+ fn subo ( self , other : Self ) -> ( Self , bool ) {
56+ let sum = AddSub :: sub ( self , other) ;
57+ ( sum, ( other < Self :: ZERO ) != ( self < sum) )
8758 }
8859}
8960
@@ -92,43 +63,34 @@ impl Subo for u128 {}
9263
9364intrinsics ! {
9465 pub extern "C" fn __rust_i128_add( a: i128 , b: i128 ) -> i128 {
95- __rust_u128_add ( a as _ , b as _ ) as _
66+ AddSub :: add ( a , b )
9667 }
9768
9869 pub extern "C" fn __rust_i128_addo( a: i128 , b: i128 ) -> ( i128 , bool ) {
99- let mut oflow = 0 ;
100- let r = a. addo( b, & mut oflow) ;
101- ( r, oflow != 0 )
70+ a. addo( b)
10271 }
10372
10473 pub extern "C" fn __rust_u128_add( a: u128 , b: u128 ) -> u128 {
105- a . add( b)
74+ AddSub :: add( a , b)
10675 }
10776
10877 pub extern "C" fn __rust_u128_addo( a: u128 , b: u128 ) -> ( u128 , bool ) {
109- let mut oflow = 0 ;
110- let r = a. addo( b, & mut oflow) ;
111- ( r, oflow != 0 )
78+ a. addo( b)
11279 }
11380
114-
11581 pub extern "C" fn __rust_i128_sub( a: i128 , b: i128 ) -> i128 {
116- __rust_u128_sub ( a as _ , b as _ ) as _
82+ AddSub :: sub ( a , b )
11783 }
11884
11985 pub extern "C" fn __rust_i128_subo( a: i128 , b: i128 ) -> ( i128 , bool ) {
120- let mut oflow = 0 ;
121- let r = a. subo( b, & mut oflow) ;
122- ( r, oflow != 0 )
86+ a. subo( b)
12387 }
12488
12589 pub extern "C" fn __rust_u128_sub( a: u128 , b: u128 ) -> u128 {
126- a . sub( b)
90+ AddSub :: sub( a , b)
12791 }
12892
12993 pub extern "C" fn __rust_u128_subo( a: u128 , b: u128 ) -> ( u128 , bool ) {
130- let mut oflow = 0 ;
131- let r = a. subo( b, & mut oflow) ;
132- ( r, oflow != 0 )
94+ a. subo( b)
13395 }
13496}
0 commit comments