@@ -292,12 +292,12 @@ pub mod reimpls {
292
292
293
293
#[ export_name="__modti3" ]
294
294
pub extern fn i128_mod ( a : i128_ , b : i128_ ) -> i128_ {
295
- let b = b. abs ( ) ;
295
+ let b = b. uabs ( ) ;
296
296
let sa = a. signum ( ) ;
297
- let a = a. abs ( ) ;
297
+ let a = a. uabs ( ) ;
298
298
unsafe {
299
299
let mut r = :: core:: mem:: zeroed ( ) ;
300
- u128_div_mod ( a as u128_ , b as u128_ , & mut r) ;
300
+ u128_div_mod ( a, b, & mut r) ;
301
301
if sa == -1 { -( r as i128_ ) } else { r as i128_ }
302
302
}
303
303
}
@@ -306,13 +306,13 @@ pub mod reimpls {
306
306
pub extern fn i128_div ( a : i128_ , b : i128_ ) -> i128_ {
307
307
let sa = a. signum ( ) ;
308
308
let sb = b. signum ( ) ;
309
- let a = a. abs ( ) ;
310
- let b = b. abs ( ) ;
309
+ let a = a. uabs ( ) ;
310
+ let b = b. uabs ( ) ;
311
311
let sr = sa * sb; // sign of quotient
312
312
if sr == -1 {
313
- -( u128_div_mod ( a as u128_ , b as u128_ , ptr:: null_mut ( ) ) as i128_ )
313
+ -( u128_div_mod ( a, b, ptr:: null_mut ( ) ) as i128_ )
314
314
} else {
315
- u128_div_mod ( a as u128_ , b as u128_ , ptr:: null_mut ( ) ) as i128_
315
+ u128_div_mod ( a, b, ptr:: null_mut ( ) ) as i128_
316
316
}
317
317
}
318
318
@@ -340,9 +340,9 @@ pub mod reimpls {
340
340
}
341
341
342
342
let sa = a. signum( ) ;
343
- let abs_a = a. abs ( ) ;
343
+ let abs_a = a. iabs ( ) ;
344
344
let sb = b. signum( ) ;
345
- let abs_b = b. abs ( ) ;
345
+ let abs_b = b. iabs ( ) ;
346
346
if abs_a < 2 || abs_b < 2 {
347
347
return result;
348
348
}
@@ -473,6 +473,19 @@ pub mod reimpls {
473
473
mul ! ( a, b, i128_, i64 )
474
474
}
475
475
476
+ trait AbsExt : Sized {
477
+ fn uabs ( self ) -> u128_ {
478
+ self . iabs ( ) as u128_
479
+ }
480
+ fn iabs ( self ) -> i128_ ;
481
+ }
482
+
483
+ impl AbsExt for i128_ {
484
+ fn iabs ( self ) -> i128_ {
485
+ ( ( self ^ self ) . wrapping_sub ( self ) )
486
+ }
487
+ }
488
+
476
489
trait FloatStuff : Sized {
477
490
type ToBytes ;
478
491
@@ -579,19 +592,19 @@ pub mod reimpls {
579
592
#[ export_name="__floattidf" ]
580
593
pub extern fn i128_as_f64 ( a : i128_ ) -> f64 {
581
594
match a. signum ( ) {
582
- 1 => u128_as_f64 ( a. abs ( ) as u128_ ) ,
595
+ 1 => u128_as_f64 ( a. uabs ( ) ) ,
583
596
0 => 0.0 ,
584
- -1 => -u128_as_f64 ( a. abs ( ) as u128_ ) ,
597
+ -1 => -u128_as_f64 ( a. uabs ( ) ) ,
585
598
_ => unimplemented ( )
586
599
}
587
600
}
588
601
589
602
#[ export_name="__floattisf" ]
590
603
pub extern fn i128_as_f32 ( a : i128_ ) -> f32 {
591
604
match a. signum ( ) {
592
- 1 => u128_as_f32 ( a. abs ( ) as u128_ ) ,
605
+ 1 => u128_as_f32 ( a. uabs ( ) ) ,
593
606
0 => 0.0 ,
594
- -1 => -u128_as_f32 ( a. abs ( ) as u128_ ) ,
607
+ -1 => -u128_as_f32 ( a. uabs ( ) ) ,
595
608
_ => unimplemented ( )
596
609
}
597
610
}
0 commit comments