*mut T -> Option<&mut T>
This commit is contained in:
parent
cc9d3e8e5f
commit
0915e15c9a
24
src/lib.rs
24
src/lib.rs
|
@ -100,7 +100,7 @@ absv_i2!(__absvdi2: i64);
|
||||||
// absv_i2!(__absvti2, i128);
|
// absv_i2!(__absvti2, i128);
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn __udivmoddi4(a: u64, b: u64, rem: *mut u64) -> u64 {
|
pub extern "C" fn __udivmoddi4(a: u64, b: u64, rem: Option<&mut u64>) -> u64 {
|
||||||
#[cfg(target_endian = "little")]
|
#[cfg(target_endian = "little")]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -146,7 +146,7 @@ pub extern "C" fn __udivmoddi4(a: u64, b: u64, rem: *mut u64) -> u64 {
|
||||||
// ---
|
// ---
|
||||||
// 0 X
|
// 0 X
|
||||||
|
|
||||||
if let Some(rem) = unsafe { rem.as_mut() } {
|
if let Some(rem) = rem {
|
||||||
*rem = u64::from(n.low % d.low);
|
*rem = u64::from(n.low % d.low);
|
||||||
}
|
}
|
||||||
u64::from(n.low / d.low)
|
u64::from(n.low / d.low)
|
||||||
|
@ -157,7 +157,7 @@ pub extern "C" fn __udivmoddi4(a: u64, b: u64, rem: *mut u64) -> u64 {
|
||||||
// ---
|
// ---
|
||||||
// K X
|
// K X
|
||||||
|
|
||||||
if let Some(rem) = unsafe { rem.as_mut() } {
|
if let Some(rem) = rem {
|
||||||
*rem = u64::from(n.low);
|
*rem = u64::from(n.low);
|
||||||
}
|
}
|
||||||
0
|
0
|
||||||
|
@ -179,7 +179,7 @@ pub extern "C" fn __udivmoddi4(a: u64, b: u64, rem: *mut u64) -> u64 {
|
||||||
// 0 0
|
// 0 0
|
||||||
|
|
||||||
// NOTE copied verbatim from compiler-rt, but does division by zero even make sense?
|
// NOTE copied verbatim from compiler-rt, but does division by zero even make sense?
|
||||||
if let Some(rem) = unsafe { rem.as_mut() } {
|
if let Some(rem) = rem {
|
||||||
*rem = u64::from(n.high % d.low);
|
*rem = u64::from(n.high % d.low);
|
||||||
}
|
}
|
||||||
return u64::from(n.high / d.low);
|
return u64::from(n.high / d.low);
|
||||||
|
@ -191,7 +191,7 @@ pub extern "C" fn __udivmoddi4(a: u64, b: u64, rem: *mut u64) -> u64 {
|
||||||
// ---
|
// ---
|
||||||
// K 0
|
// K 0
|
||||||
|
|
||||||
if let Some(rem) = unsafe { rem.as_mut() } {
|
if let Some(rem) = rem {
|
||||||
*rem = words {
|
*rem = words {
|
||||||
low: 0,
|
low: 0,
|
||||||
high: n.high % d.high,
|
high: n.high % d.high,
|
||||||
|
@ -207,7 +207,7 @@ pub extern "C" fn __udivmoddi4(a: u64, b: u64, rem: *mut u64) -> u64 {
|
||||||
// K 0
|
// K 0
|
||||||
|
|
||||||
if d.high.is_power_of_two() {
|
if d.high.is_power_of_two() {
|
||||||
if let Some(rem) = unsafe { rem.as_mut() } {
|
if let Some(rem) = rem {
|
||||||
*rem = words {
|
*rem = words {
|
||||||
low: n.low,
|
low: n.low,
|
||||||
high: n.high & (d.high - 1),
|
high: n.high & (d.high - 1),
|
||||||
|
@ -222,7 +222,7 @@ pub extern "C" fn __udivmoddi4(a: u64, b: u64, rem: *mut u64) -> u64 {
|
||||||
|
|
||||||
// D > N
|
// D > N
|
||||||
if sr > u32_bits - 2 {
|
if sr > u32_bits - 2 {
|
||||||
if let Some(rem) = unsafe { rem.as_mut() } {
|
if let Some(rem) = rem {
|
||||||
*rem = n.u64();
|
*rem = n.u64();
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -245,7 +245,7 @@ pub extern "C" fn __udivmoddi4(a: u64, b: u64, rem: *mut u64) -> u64 {
|
||||||
// ---
|
// ---
|
||||||
// 0 K
|
// 0 K
|
||||||
if d.low.is_power_of_two() {
|
if d.low.is_power_of_two() {
|
||||||
if let Some(rem) = unsafe { rem.as_mut() } {
|
if let Some(rem) = rem {
|
||||||
*rem = u64::from(n.low & (d.low - 1));
|
*rem = u64::from(n.low & (d.low - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,7 +298,7 @@ pub extern "C" fn __udivmoddi4(a: u64, b: u64, rem: *mut u64) -> u64 {
|
||||||
|
|
||||||
// D > N
|
// D > N
|
||||||
if sr > u32_bits - 1 {
|
if sr > u32_bits - 1 {
|
||||||
if let Some(rem) = unsafe { rem.as_mut() } {
|
if let Some(rem) = rem {
|
||||||
*rem = a;
|
*rem = a;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -347,16 +347,16 @@ pub extern "C" fn __udivmoddi4(a: u64, b: u64, rem: *mut u64) -> u64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
*q.all() = (q.u64() << 1) | carry as u64;
|
*q.all() = (q.u64() << 1) | carry as u64;
|
||||||
if let Some(rem) = unsafe { rem.as_mut() } {
|
if let Some(rem) = rem {
|
||||||
*rem = r.u64();
|
*rem = r.u64();
|
||||||
}
|
}
|
||||||
q.u64()
|
q.u64()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn __udivmodsi4(a: u32, b: u32, rem: *mut u32) -> u32 {
|
pub extern "C" fn __udivmodsi4(a: u32, b: u32, rem: Option<&mut u32>) -> u32 {
|
||||||
let d = __udivsi3(a, b);
|
let d = __udivsi3(a, b);
|
||||||
if let Some(rem) = unsafe {rem.as_mut()} {
|
if let Some(rem) = rem {
|
||||||
*rem = a - (d*b);
|
*rem = a - (d*b);
|
||||||
}
|
}
|
||||||
return d;
|
return d;
|
||||||
|
|
|
@ -36,7 +36,7 @@ quickcheck! {
|
||||||
TestResult::discard()
|
TestResult::discard()
|
||||||
} else {
|
} else {
|
||||||
let mut r = 0;
|
let mut r = 0;
|
||||||
let q = ::__udivmoddi4(a, b, &mut r);
|
let q = ::__udivmoddi4(a, b, Some(&mut r));
|
||||||
|
|
||||||
TestResult::from_bool(q * b + r == a)
|
TestResult::from_bool(q * b + r == a)
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ quickcheck! {
|
||||||
TestResult::discard()
|
TestResult::discard()
|
||||||
} else {
|
} else {
|
||||||
let mut r = 0;
|
let mut r = 0;
|
||||||
let q = ::__udivmodsi4(a, b, &mut r);
|
let q = ::__udivmodsi4(a, b, Some(&mut r));
|
||||||
|
|
||||||
TestResult::from_bool(q * b + r == a)
|
TestResult::from_bool(q * b + r == a)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue