use crate::bid_conf::*;
use crate::bid128_common::*;
use crate::bid128_fma::bid128_fma;
use crate::{BidUint64, BidUint128};
pub fn bid128_mul(x: BidUint128, y: BidUint128, rounding: IdecRound, flags: &mut IdecFlags) -> BidUint128 {
let z = BidUint128 { w: [0x0000000000000000, 0x5ffe000000000000] };
let mut res = BidUint128 { w: [0xbaddbaddbaddbadd, 0xbaddbaddbaddbadd] };
let x_sign: BidUint64;
let y_sign: BidUint64;
let x_exp: BidUint64;
let p_sign: BidUint64;
let y_exp: BidUint64;
let p_exp: BidUint64;
let mut c1 = BidUint128::default();
let mut c2 = BidUint128::default();
let true_p_exp: i32;
if !(((x.w[1] & MASK_NAN) == MASK_NAN) || ((y.w[1] & MASK_NAN) == MASK_NAN) || ((x.w[1] & MASK_ANY_INF) == MASK_INF) || ((y.w[1] & MASK_ANY_INF) == MASK_INF)) {
x_sign = x.w[1] & MASK_SIGN; c1.w[1] = x.w[1] & MASK_COEFF;
c1.w[0] = x.w[0];
if (x.w[1] & 0x6000000000000000) == 0x6000000000000000 {
x_exp = (x.w[1] << 2) & MASK_EXP; c1.w[1] = 0; c1.w[0] = 0; } else {
x_exp = x.w[1] & MASK_EXP; if c1.w[1] > 0x0001ed09bead87c0 || (c1.w[1] == 0x0001ed09bead87c0 && c1.w[0] > 0x378d8e63ffffffff) {
c1.w[1] = 0;
c1.w[0] = 0;
}
}
y_sign = y.w[1] & MASK_SIGN; c2.w[1] = y.w[1] & MASK_COEFF;
c2.w[0] = y.w[0];
if (y.w[1] & 0x6000000000000000) == 0x6000000000000000 {
y_exp = (y.w[1] << 2) & MASK_EXP; c2.w[1] = 0; c2.w[0] = 0; } else {
y_exp = y.w[1] & MASK_EXP; if c2.w[1] > 0x0001ed09bead87c0 || (c2.w[1] == 0x0001ed09bead87c0 && c2.w[0] > 0x378d8e63ffffffff) {
c2.w[1] = 0;
c2.w[0] = 0;
}
}
p_sign = x_sign ^ y_sign;
true_p_exp = (x_exp >> 49) as i32 - 6176 + (y_exp >> 49) as i32 - 6176;
if true_p_exp < -6176 {
p_exp = 0; } else if true_p_exp > 6111 {
p_exp = ((6111 + 6176) as u64) << 49; } else {
p_exp = ((true_p_exp + 6176) as u64) << 49;
}
if (c1.w[1] == 0 && c1.w[0] == 0) || (c2.w[1] == 0 && c2.w[0] == 0) {
res.w[1] = p_sign | p_exp; res.w[0] = 0;
return res;
}
}
bid128_fma(y, x, z, rounding, flags)
}