Explorar o código

Auto merge of #181 - TimNN:no-memcpy, r=alexcrichton

Avoid memcpy references in unoptimized code

Fixes rust-lang/rust#43411.
bors %!s(int64=7) %!d(string=hai) anos
pai
achega
6b9281d2b2
Modificáronse 2 ficheiros con 15 adicións e 4 borrados
  1. 4 2
      src/float/add.rs
  2. 11 2
      src/int/udiv.rs

+ 4 - 2
src/float/add.rs

@@ -1,4 +1,3 @@
-use core::mem;
 use core::num::Wrapping;
 
 use float::Float;
@@ -75,7 +74,10 @@ macro_rules! add {
 
         // Swap a and b if necessary so that a has the larger absolute value.
         if b_abs > a_abs {
-            mem::swap(&mut a_rep, &mut b_rep);
+            // Don't use mem::swap because it may generate references to memcpy in unoptimized code.
+            let tmp = a_rep;
+            a_rep = b_rep;
+            b_rep = tmp;
         }
 
         // Extract the exponent and significand from the (possibly swapped) a and b.

+ 11 - 2
src/int/udiv.rs

@@ -125,7 +125,11 @@ macro_rules! udivmod_inner {
         // 1 <= sr <= u64::bits() - 1
         let mut carry = 0;
 
-        for _ in 0..sr {
+        // Don't use a range because they may generate references to memcpy in unoptimized code
+        let mut i = 0;
+        while i < sr {
+            i += 1;
+
             // r:q = ((r:q) << 1) | carry
             r = (r << 1) | (q >> (<$ty>::bits() - 1));
             q = (q << 1) | carry as $ty;
@@ -181,7 +185,12 @@ intrinsics! {
         let mut r = n >> sr;
 
         let mut carry = 0;
-        for _ in 0..sr {
+
+        // Don't use a range because they may generate references to memcpy in unoptimized code
+        let mut i = 0;
+        while i < sr {
+            i += 1;
+
             // r:q = ((r:q) << 1) | carry
             r = (r << 1) | (q >> (u32::bits() - 1));
             q = (q << 1) | carry;