let product11: u64 = word!(1, self) * word!(1, rhs); |
let product12: u64 = word!(1, self) * word!(2, rhs); |
let product13: u64 = word!(1, self) * word!(3, rhs); |
let product14: u64 = word!(1, self) * word!(4, rhs); |
let product21: u64 = word!(2, self) * word!(1, rhs); |
let product22: u64 = word!(2, self) * word!(2, rhs); |
let product23: u64 = word!(2, self) * word!(3, rhs); |
let product24: u64 = word!(2, self) * word!(4, rhs); |
let product31: u64 = word!(3, self) * word!(1, rhs); |
let product32: u64 = word!(3, self) * word!(2, rhs); |
let product33: u64 = word!(3, self) * word!(3, rhs); |
let product34: u64 = word!(3, self) * word!(4, rhs); |
let product41: u64 = word!(4, self) * word!(1, rhs); |
let product42: u64 = word!(4, self) * word!(2, rhs); |
let product43: u64 = word!(4, self) * word!(3, rhs); |
let product44: u64 = word!(4, self) * word!(4, rhs); |
|
let sum0: u128 = u128::from(product44); |
let sum1: u128 = u128::from(product34) + u128::from(product43); |
let sum2: u128 = u128::from(product24) + u128::from(product33) + u128::from(product42); |
let sum3: u128 = u128::from(product14) |
+ u128::from(product23) |
+ u128::from(product32) |
+ u128::from(product41); |
let sum4: u128 = u128::from(product13) + u128::from(product22) + u128::from(product31); |
let sum5: u128 = u128::from(product12) + u128::from(product21); |
let sum6: u128 = u128::from(product11); |
|
let r0: u128 = |
(sum0 & u128::from(WORD_FULL_MASK)) + ((sum1 & u128::from(WORD_LO_MASK)) << 32); |
let r1: u128 = (sum0 >> 64) |
+ ((sum1 >> 32) & u128::from(WORD_FULL_MASK)) |
+ (sum2 & u128::from(WORD_FULL_MASK)) |
+ ((sum3 << 32) & u128::from(WORD_HI_MASK)); |
|
let lo = r0.wrapping_add(r1 << 64); |
let hi = (r1 >> 64) |
+ (sum1 >> 96) |
+ (sum2 >> 64) |
+ (sum3 >> 32) |
+ sum4 |
+ (sum5 << 32) |
+ (sum6 << 64); |
|
u256([ |
(lo & U128_LO_MASK) as u64, |
((lo >> 64) & U128_LO_MASK) as u64, |
(hi & U128_LO_MASK) as u64, |
((hi >> 64) & U128_LO_MASK) as u64, |
]) |
} |