@@ -156,113 +156,65 @@ intrinsics! {
156
156
#[ arm_aeabi_alias = __aeabi_uidiv]
157
157
/// Returns `n / d`
158
158
pub extern "C" fn __udivsi3( n: u32 , d: u32 ) -> u32 {
159
- // Special cases
160
- if d == 0 {
161
- // NOTE This should be unreachable in safe Rust because the program will panic before
162
- // this intrinsic is called
163
- :: abort( ) ;
164
- }
165
-
166
- if n == 0 {
167
- return 0 ;
168
- }
169
-
170
- let mut sr = d. leading_zeros( ) . wrapping_sub( n. leading_zeros( ) ) ;
171
-
172
- // d > n
173
- if sr > u32 :: BITS - 1 {
174
- return 0 ;
175
- }
176
-
177
- // d == 1
178
- if sr == u32 :: BITS - 1 {
179
- return n;
180
- }
181
-
182
- sr += 1 ;
183
-
184
- // 1 <= sr <= u32::BITS - 1
185
- let mut q = n << ( u32 :: BITS - sr) ;
186
- let mut r = n >> sr;
187
-
188
- let mut carry = 0 ;
189
-
190
- // Don't use a range because they may generate references to memcpy in unoptimized code
191
- let mut i = 0 ;
192
- while i < sr {
193
- i += 1 ;
194
-
195
- // r:q = ((r:q) << 1) | carry
196
- r = ( r << 1 ) | ( q >> ( u32 :: BITS - 1 ) ) ;
197
- q = ( q << 1 ) | carry;
198
-
199
- // carry = 0;
200
- // if r > d {
201
- // r -= d;
202
- // carry = 1;
203
- // }
204
-
205
- let s = ( d. wrapping_sub( r) . wrapping_sub( 1 ) ) as i32 >> ( u32 :: BITS - 1 ) ;
206
- carry = ( s & 1 ) as u32 ;
207
- r -= d & s as u32 ;
208
- }
209
-
210
- ( q << 1 ) | carry
159
+ u32_div_rem( n, d) . 0
211
160
}
212
161
213
162
#[ maybe_use_optimized_c_shim]
214
163
/// Returns `n % d`
215
164
pub extern "C" fn __umodsi3( n: u32 , d: u32 ) -> u32 {
216
- let q = __udivsi3( n, d) ;
217
- n - q * d
165
+ u32_div_rem( n, d) . 1
218
166
}
219
167
220
168
#[ maybe_use_optimized_c_shim]
221
169
/// Returns `n / d` and sets `*rem = n % d`
222
170
pub extern "C" fn __udivmodsi4( n: u32 , d: u32 , rem: Option <& mut u32 >) -> u32 {
223
- let q = __udivsi3 ( n, d) ;
171
+ let quo_rem = u32_div_rem ( n, d) ;
224
172
if let Some ( rem) = rem {
225
- * rem = n - ( q * d ) ;
173
+ * rem = quo_rem . 1 ;
226
174
}
227
- q
175
+ quo_rem . 0
228
176
}
229
177
230
178
#[ maybe_use_optimized_c_shim]
231
179
/// Returns `n / d`
232
180
pub extern "C" fn __udivdi3( n: u64 , d: u64 ) -> u64 {
233
- __udivmoddi4 ( n, d, None )
181
+ u64_div_rem ( n, d) . 0
234
182
}
235
183
236
184
#[ maybe_use_optimized_c_shim]
237
185
/// Returns `n % d`
238
186
pub extern "C" fn __umoddi3( n: u64 , d: u64 ) -> u64 {
239
- let mut rem = 0 ;
240
- __udivmoddi4( n, d, Some ( & mut rem) ) ;
241
- rem
187
+ u64_div_rem( n, d) . 1
242
188
}
243
189
244
190
/// Returns `n / d` and sets `*rem = n % d`
245
191
pub extern "C" fn __udivmoddi4( n: u64 , d: u64 , rem: Option <& mut u64 >) -> u64 {
246
- udivmod_inner!( n, d, rem, u64 )
192
+ let quo_rem = u64_div_rem( n, d) ;
193
+ if let Some ( rem) = rem {
194
+ * rem = quo_rem. 1 ;
195
+ }
196
+ quo_rem. 0
247
197
}
248
198
249
199
#[ win64_128bit_abi_hack]
250
200
/// Returns `n / d`
251
201
pub extern "C" fn __udivti3( n: u128 , d: u128 ) -> u128 {
252
- __udivmodti4 ( n, d, None )
202
+ u128_div_rem ( n, d) . 0
253
203
}
254
204
255
205
#[ win64_128bit_abi_hack]
256
206
/// Returns `n % d`
257
207
pub extern "C" fn __umodti3( n: u128 , d: u128 ) -> u128 {
258
- let mut rem = 0 ;
259
- __udivmodti4( n, d, Some ( & mut rem) ) ;
260
- rem
208
+ u128_div_rem( n, d) . 1
261
209
}
262
210
263
211
#[ win64_128bit_abi_hack]
264
212
/// Returns `n / d` and sets `*rem = n % d`
265
213
pub extern "C" fn __udivmodti4( n: u128 , d: u128 , rem: Option <& mut u128 >) -> u128 {
266
- udivmod_inner!( n, d, rem, u128 )
214
+ let quo_rem = u128_div_rem( n, d) ;
215
+ if let Some ( rem) = rem {
216
+ * rem = quo_rem. 1 ;
217
+ }
218
+ quo_rem. 0
267
219
}
268
220
}
0 commit comments