about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libcompiler_builtins/lib.rs17
-rw-r--r--src/test/run-pass/i128.rs6
2 files changed, 18 insertions, 5 deletions
diff --git a/src/libcompiler_builtins/lib.rs b/src/libcompiler_builtins/lib.rs
index 1bb84c9fc02..1bc9b660001 100644
--- a/src/libcompiler_builtins/lib.rs
+++ b/src/libcompiler_builtins/lib.rs
@@ -469,16 +469,25 @@ pub mod reimpls {
     }
 
     trait AbsExt: Sized {
-        fn uabs(self) -> u128_;
+        fn uabs(self) -> u128_ {
+            self.iabs() as u128_
+        }
         fn iabs(self) -> i128_;
     }
 
+    #[cfg(stage0)]
     impl AbsExt for i128_ {
-        fn uabs(self) -> u128_ {
-            self.iabs() as u128_
+        fn iabs(self) -> i128_ {
+            let s = self >> 63;
+            ((self ^ s).wrapping_sub(s))
         }
+    }
+
+    #[cfg(not(stage0))]
+    impl AbsExt for i128_ {
         fn iabs(self) -> i128_ {
-            ((self ^ self).wrapping_sub(self))
+            let s = self >> 127;
+            ((self ^ s).wrapping_sub(s))
         }
     }
 
diff --git a/src/test/run-pass/i128.rs b/src/test/run-pass/i128.rs
index 71d3e6491cb..b7aeb21229c 100644
--- a/src/test/run-pass/i128.rs
+++ b/src/test/run-pass/i128.rs
@@ -91,5 +91,9 @@ fn main() {
                format!("{:b}", j));
     assert_eq!("-147573952589676412928", format!("{:?}", j));
     // common traits
-    x.clone();
+    assert_eq!(x, b(x.clone()));
+    // overflow checks
+    assert_eq!((-z).checked_mul(-z), Some(0x734C_C2F2_A521));
+    assert_eq!((z).checked_mul(z), Some(0x734C_C2F2_A521));
+    assert_eq!((k).checked_mul(k), None);
 }