1
- use int:: Int ;
2
- use int:: LargeInt ;
1
+ use int:: { DInt , Int } ;
3
2
4
- trait UAddSub : LargeInt {
3
+ trait UAddSub : DInt {
5
4
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) )
14
9
}
15
10
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) )
23
14
}
24
15
fn usub ( self , other : Self ) -> Self {
25
16
let uneg = ( !other) . uadd_one ( ) ;
@@ -48,19 +39,9 @@ trait Addo: AddSub
48
39
where
49
40
<Self as Int >:: UnsignedInt : UAddSub ,
50
41
{
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 ) )
64
45
}
65
46
}
66
47
@@ -71,19 +52,9 @@ trait Subo: AddSub
71
52
where
72
53
<Self as Int >:: UnsignedInt : UAddSub ,
73
54
{
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) )
87
58
}
88
59
}
89
60
@@ -92,43 +63,34 @@ impl Subo for u128 {}
92
63
93
64
intrinsics ! {
94
65
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 )
96
67
}
97
68
98
69
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)
102
71
}
103
72
104
73
pub extern "C" fn __rust_u128_add( a: u128 , b: u128 ) -> u128 {
105
- a . add( b)
74
+ AddSub :: add( a , b)
106
75
}
107
76
108
77
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)
112
79
}
113
80
114
-
115
81
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 )
117
83
}
118
84
119
85
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)
123
87
}
124
88
125
89
pub extern "C" fn __rust_u128_sub( a: u128 , b: u128 ) -> u128 {
126
- a . sub( b)
90
+ AddSub :: sub( a , b)
127
91
}
128
92
129
93
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)
133
95
}
134
96
}
0 commit comments