Fix up two functions with tested code
This commit is contained in:
parent
7d35fe36fe
commit
43caccc8b7
1 changed files with 25 additions and 40 deletions
|
@ -85,51 +85,36 @@ unsafe fn residue_sub(x: uint64_t, y: uint64_t) -> uint64_t {
|
||||||
z
|
z
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn __umul128(
|
/// Confirmed working
|
||||||
multiplier: uint64_t,
|
fn umul128(a: u64, b: u64, hi: &mut u64) -> u64 {
|
||||||
multiplicand: uint64_t,
|
let r: u128 = a as u128 * b as u128;
|
||||||
product_hi: *mut uint64_t,
|
*hi = (r >> 64) as u64;
|
||||||
) -> uint64_t {
|
r as u64
|
||||||
let a: uint64_t = multiplier >> 32_i32;
|
|
||||||
let b: uint64_t = multiplier & 0xffffffff_u32 as u64;
|
|
||||||
let c: uint64_t = multiplicand >> 32_i32;
|
|
||||||
let d: uint64_t = multiplicand & 0xffffffff_u32 as u64;
|
|
||||||
let ad: uint64_t = a.wrapping_mul(d);
|
|
||||||
let bd: uint64_t = b.wrapping_mul(d);
|
|
||||||
let adbc: uint64_t = ad.wrapping_add(b.wrapping_mul(c));
|
|
||||||
let adbc_carry: uint64_t = (if adbc < ad { 1_i32 } else { 0_i32 }) as uint64_t;
|
|
||||||
let product_lo: uint64_t = bd.wrapping_add(adbc << 32_i32);
|
|
||||||
let product_lo_carry: uint64_t = (if product_lo < bd { 1_i32 } else { 0_i32 }) as uint64_t;
|
|
||||||
*product_hi = a
|
|
||||||
.wrapping_mul(c)
|
|
||||||
.wrapping_add(adbc >> 32_i32)
|
|
||||||
.wrapping_add(adbc_carry << 32_i32)
|
|
||||||
.wrapping_add(product_lo_carry);
|
|
||||||
product_lo
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn ui128_quotient_mod(lo: uint64_t, hi: uint64_t) -> uint64_t {
|
/// Confirmed working
|
||||||
let mut prod1: uint64_t = 0;
|
fn ui128_quotient_mod(lo: u64, hi: u64) -> u64 {
|
||||||
__umul128(lo, 0x604fa6a1c6346a87_i64 as uint64_t, &mut prod1);
|
let mut prod1: u64 = 0;
|
||||||
let mut part1hi: uint64_t = 0;
|
umul128(lo, 0x604fa6a1c6346a87_i64 as u64, &mut prod1);
|
||||||
let part1lo: uint64_t = __umul128(lo, 0x2d351c6d04f8b_i64 as uint64_t, &mut part1hi);
|
let mut part1hi: u64 = 0;
|
||||||
let mut part2hi: uint64_t = 0;
|
let part1lo: u64 = umul128(lo, 0x2d351c6d04f8b_i64 as u64, &mut part1hi);
|
||||||
let part2lo: uint64_t = __umul128(hi, 0x604fa6a1c6346a87_i64 as uint64_t, &mut part2hi);
|
let mut part2hi: u64 = 0;
|
||||||
let mut sum1: uint64_t = part1lo.wrapping_add(part2lo);
|
let part2lo: u64 = umul128(hi, 0x604fa6a1c6346a87_i64 as u64, &mut part2hi);
|
||||||
|
let mut sum1: u64 = part1lo.wrapping_add(part2lo);
|
||||||
let mut sum1carry: u32 = (sum1 < part1lo) as i32 as u32;
|
let mut sum1carry: u32 = (sum1 < part1lo) as i32 as u32;
|
||||||
sum1 = sum1.wrapping_add(prod1) as uint64_t as uint64_t;
|
sum1 = sum1.wrapping_add(prod1);
|
||||||
sum1carry = sum1carry.wrapping_add((sum1 < prod1) as i32 as u32);
|
sum1carry = sum1carry.wrapping_add((sum1 < prod1) as i32 as u32);
|
||||||
let prod2: uint64_t = part1hi.wrapping_add(part2hi).wrapping_add(sum1carry as u64);
|
let prod2: u64 = part1hi.wrapping_add(part2hi).wrapping_add(sum1carry as u64);
|
||||||
let mut prod3hi: uint64_t = 0;
|
let mut prod3hi: u64 = 0;
|
||||||
let mut prod3lo: uint64_t = __umul128(hi, 0x2d351c6d04f8b_i64 as uint64_t, &mut prod3hi);
|
let mut prod3lo: u64 = umul128(hi, 0x2d351c6d04f8b_i64 as u64, &mut prod3hi);
|
||||||
prod3lo = prod3lo.wrapping_add(prod2) as uint64_t as uint64_t;
|
prod3lo = prod3lo.wrapping_add(prod2);
|
||||||
prod3hi = prod3hi.wrapping_add((prod3lo < prod2) as i32 as u64) as uint64_t as uint64_t;
|
prod3hi = prod3hi.wrapping_add((prod3lo < prod2) as i32 as u64);
|
||||||
prod3lo >> 42_i32 | prod3hi << 22_i32
|
prod3lo >> 42_i32 | prod3hi << 22_i32
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn residue_mul(x: uint64_t, y: uint64_t) -> uint64_t {
|
unsafe fn residue_mul(x: uint64_t, y: uint64_t) -> uint64_t {
|
||||||
let mut hi: uint64_t = 0;
|
let mut hi: uint64_t = 0;
|
||||||
let lo: uint64_t = __umul128(x, y, &mut hi);
|
let lo: uint64_t = umul128(x, y, &mut hi);
|
||||||
let quotient: uint64_t = ui128_quotient_mod(lo, hi);
|
let quotient: uint64_t = ui128_quotient_mod(lo, hi);
|
||||||
lo.wrapping_sub(quotient.wrapping_mul(0x16a6b036d7f2a79_u64)) as uint64_t
|
lo.wrapping_sub(quotient.wrapping_mul(0x16a6b036d7f2a79_u64)) as uint64_t
|
||||||
}
|
}
|
||||||
|
@ -1196,13 +1181,13 @@ unsafe fn Generate(installation_id_str: *const i8, confirmation_id: *mut i8) ->
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
if d_0.u[0_i32 as usize] as u64 == 0xffffffffffffffff_u64 {
|
if d_0.u[0_i32 as usize] as u64 == 0xffffffffffffffff_u64 {
|
||||||
e.c2rust_unnamed.encoded_lo = __umul128(
|
e.c2rust_unnamed.encoded_lo = umul128(
|
||||||
0x16a6b036d7f2a79_u64.wrapping_add(2_i32 as u64) as uint64_t,
|
0x16a6b036d7f2a79_u64.wrapping_add(2_i32 as u64) as uint64_t,
|
||||||
0x16a6b036d7f2a79_u64 as uint64_t,
|
0x16a6b036d7f2a79_u64 as uint64_t,
|
||||||
&mut e.c2rust_unnamed.encoded_hi,
|
&mut e.c2rust_unnamed.encoded_hi,
|
||||||
);
|
);
|
||||||
} else if d_0.u[1_i32 as usize] as u64 == 0xffffffffffffffff_u64 {
|
} else if d_0.u[1_i32 as usize] as u64 == 0xffffffffffffffff_u64 {
|
||||||
e.c2rust_unnamed.encoded_lo = __umul128(
|
e.c2rust_unnamed.encoded_lo = umul128(
|
||||||
0x16a6b036d7f2a79_u64.wrapping_add(1_i32 as u64) as uint64_t,
|
0x16a6b036d7f2a79_u64.wrapping_add(1_i32 as u64) as uint64_t,
|
||||||
d_0.u[0_i32 as usize] as uint64_t,
|
d_0.u[0_i32 as usize] as uint64_t,
|
||||||
&mut e.c2rust_unnamed.encoded_hi,
|
&mut e.c2rust_unnamed.encoded_hi,
|
||||||
|
@ -1228,7 +1213,7 @@ unsafe fn Generate(installation_id_str: *const i8, confirmation_id: *mut i8) ->
|
||||||
let mut x2_0: uint64_t = residue_sqrt(x2sqr);
|
let mut x2_0: uint64_t = residue_sqrt(x2sqr);
|
||||||
if x2_0 == 0xffffffffffffffff_u64 {
|
if x2_0 == 0xffffffffffffffff_u64 {
|
||||||
x2_0 = residue_sqrt(residue_mul(x2sqr, residue_inv(43_i32 as uint64_t)));
|
x2_0 = residue_sqrt(residue_mul(x2sqr, residue_inv(43_i32 as uint64_t)));
|
||||||
e.c2rust_unnamed.encoded_lo = __umul128(
|
e.c2rust_unnamed.encoded_lo = umul128(
|
||||||
0x16a6b036d7f2a79_u64.wrapping_add(1_i32 as u64) as uint64_t,
|
0x16a6b036d7f2a79_u64.wrapping_add(1_i32 as u64) as uint64_t,
|
||||||
0x16a6b036d7f2a79_u64.wrapping_add(x2_0) as uint64_t,
|
0x16a6b036d7f2a79_u64.wrapping_add(x2_0) as uint64_t,
|
||||||
&mut e.c2rust_unnamed.encoded_hi,
|
&mut e.c2rust_unnamed.encoded_hi,
|
||||||
|
@ -1257,7 +1242,7 @@ unsafe fn Generate(installation_id_str: *const i8, confirmation_id: *mut i8) ->
|
||||||
if (y1 ^ y2) & 1_i32 as u64 != 0 {
|
if (y1 ^ y2) & 1_i32 as u64 != 0 {
|
||||||
std::mem::swap(&mut x1a, &mut x2a);
|
std::mem::swap(&mut x1a, &mut x2a);
|
||||||
}
|
}
|
||||||
e.c2rust_unnamed.encoded_lo = __umul128(
|
e.c2rust_unnamed.encoded_lo = umul128(
|
||||||
0x16a6b036d7f2a79_u64.wrapping_add(1_i32 as u64) as uint64_t,
|
0x16a6b036d7f2a79_u64.wrapping_add(1_i32 as u64) as uint64_t,
|
||||||
x1a,
|
x1a,
|
||||||
&mut e.c2rust_unnamed.encoded_hi,
|
&mut e.c2rust_unnamed.encoded_hi,
|
||||||
|
|
Loading…
Add table
Reference in a new issue