#[cfg(target_endian = "big")]
use crate::bid_internal::BID_SWAP128;
use crate::bid128::{BID_NR_DIGITS, BID_TEN2K128, BID_TEN2K64};
use crate::bid128_string::bid128_from_string;
use crate::bid_internal::*;
use crate::d128::{DEFAULT_ROUNDING_MODE, _IDEC_flags, ClassTypes};
pub (crate) fn bid128_is_signed(x: &BID_UINT128) -> bool {
(x.w[BID_HIGH_128W] & MASK_SIGN) == MASK_SIGN
}
pub (crate) fn bid128_is_normal(x: &BID_UINT128) -> bool {
let x_exp: BID_UINT64;
let C1_hi: BID_UINT64;
let C1_lo: BID_UINT64;
let mut tmp1: BID_UI64DOUBLE = Default::default();
let exp: i32;
let mut q: i32;
let x_nr_bits: i32;
#[cfg(target_endian = "big")]
let mut x = *x;
#[cfg(target_endian = "big")]
BID_SWAP128(&mut x);
if (x.w[1] & MASK_SPECIAL) == MASK_SPECIAL {
return false;
}
x_exp = x.w[1] & MASK_EXP; C1_hi = x.w[1] & MASK_COEFF;
C1_lo = x.w[0];
if C1_hi == 0 && C1_lo == 0 {
return false;
}
if (((C1_hi > 0x0001ed09bead87c0u64)
|| ((C1_hi == 0x0001ed09bead87c0u64)
&& (C1_lo > 0x378d8e63ffffffffu64)))
&& ((x.w[1] & 0x6000000000000000u64) != 0x6000000000000000u64))
|| ((x.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64) {
return false;
}
unsafe {
if C1_hi == 0 {
if C1_lo >= 0x0020000000000000u64 { tmp1.d = (C1_lo >> 32) as f64; x_nr_bits = (33 + ((((tmp1.ui64 >> 52) as u32) & 0x7ff) - 0x3ff)) as i32;
} else { tmp1.d = C1_lo as f64; x_nr_bits = (1 + ((((tmp1.ui64 >> 52) as u32) & 0x7ff) - 0x3ff)) as i32;
}
} else { tmp1.d = C1_hi as f64; x_nr_bits = (65 + ((((tmp1.ui64 >> 52) as u32) & 0x7ff) - 0x3ff)) as i32;
}
}
q = BID_NR_DIGITS[(x_nr_bits - 1) as usize].digits as i32;
if q == 0 {
q = BID_NR_DIGITS[(x_nr_bits - 1) as usize].digits1 as i32;
if C1_hi > BID_NR_DIGITS[(x_nr_bits - 1) as usize].threshold_hi
|| (C1_hi == BID_NR_DIGITS[(x_nr_bits - 1) as usize].threshold_hi
&& C1_lo >= BID_NR_DIGITS[(x_nr_bits - 1) as usize].threshold_lo) {
q += 1;
}
}
exp = (x_exp >> 49) as i32 - 6176;
exp + q > -6143
}
pub (crate) fn bid128_is_subnormal(x: &BID_UINT128) -> bool {
let x_exp: BID_UINT64;
let C1_hi: BID_UINT64;
let C1_lo: BID_UINT64;
let mut tmp1: BID_UI64DOUBLE = Default::default();
let exp: i32;
let mut q: i32;
let x_nr_bits: i32;
#[cfg(target_endian = "big")]
let mut x = *x;
#[cfg(target_endian = "big")]
BID_SWAP128(&mut x);
if (x.w[1] & MASK_SPECIAL) == MASK_SPECIAL {
return false;
}
x_exp = x.w[1] & MASK_EXP; C1_hi = x.w[1] & MASK_COEFF;
C1_lo = x.w[0];
if C1_hi == 0 && C1_lo == 0 {
return false;
}
if (((C1_hi > 0x0001ed09bead87c0u64)
|| ((C1_hi == 0x0001ed09bead87c0u64)
&& (C1_lo > 0x378d8e63ffffffffu64)))
&& ((x.w[1] & 0x6000000000000000u64) != 0x6000000000000000u64))
|| ((x.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64) {
return false;
}
unsafe {
if C1_hi == 0 {
if C1_lo >= 0x0020000000000000u64 { tmp1.d = (C1_lo >> 32) as f64; x_nr_bits = (33 + ((((tmp1.ui64 >> 52) as u32) & 0x7ff) - 0x3ff)) as i32;
} else { tmp1.d = C1_lo as f64; x_nr_bits = (1 + ((((tmp1.ui64 >> 52) as u32) & 0x7ff) - 0x3ff)) as i32;
}
} else { tmp1.d = C1_hi as f64; x_nr_bits = (65 + ((((tmp1.ui64 >> 52) as u32) & 0x7ff) - 0x3ff)) as i32;
}
}
q = BID_NR_DIGITS[(x_nr_bits - 1) as usize].digits as i32;
if q == 0 {
q = BID_NR_DIGITS[(x_nr_bits - 1) as usize].digits1 as i32;
if C1_hi > BID_NR_DIGITS[(x_nr_bits - 1) as usize].threshold_hi
|| (C1_hi == BID_NR_DIGITS[(x_nr_bits - 1) as usize].threshold_hi
&& C1_lo >= BID_NR_DIGITS[(x_nr_bits - 1) as usize].threshold_lo) {
q += 1;
}
}
exp = (x_exp >> 49) as i32 - 6176;
exp + q <= -6143
}
pub (crate) fn bid128_is_finite(x: &BID_UINT128) -> bool {
(x.w[BID_HIGH_128W] & MASK_INF) != MASK_INF
}
pub (crate) fn bid128_is_zero(x: &BID_UINT128) -> bool {
let mut sig_x: BID_UINT128 = Default::default();
#[cfg(target_endian = "big")]
let mut x = *x;
#[cfg(target_endian = "big")]
BID_SWAP128(&mut x);
if (x.w[1] & MASK_INF) == MASK_INF {
return false;
}
sig_x.w[1] = x.w[1] & 0x0001ffffffffffffu64;
sig_x.w[0] = x.w[0];
if (sig_x.w[1] > 0x0001ed09bead87c0u64) || ((sig_x.w[1] == 0x0001ed09bead87c0u64) && (sig_x.w[0] > 0x378d8e63ffffffffu64)) || ((x.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64) || (sig_x.w[1] == 0 && sig_x.w[0] == 0) { return true;
}
false
}
pub (crate) fn bid128_is_inf(x: &BID_UINT128) -> bool {
((x.w[BID_HIGH_128W] & MASK_INF) == MASK_INF) && ((x.w[BID_HIGH_128W] & MASK_NAN) != MASK_NAN)
}
pub (crate) fn bid128_is_signaling(x: &BID_UINT128) -> bool {
(x.w[BID_HIGH_128W] & MASK_SNAN) == MASK_SNAN
}
pub (crate) fn bid128_is_canonical(x: &BID_UINT128) -> bool {
let mut sig_x: BID_UINT128 = Default::default();
#[cfg(target_endian = "big")]
let mut x = *x;
#[cfg(target_endian = "big")]
BID_SWAP128(&mut x);
if (x.w[1] & MASK_NAN) == MASK_NAN { if x.w[1] & 0x01ffc00000000000u64 != 0 {
return false;
}
sig_x.w[1] = x.w[1] & 0x00003fffffffffffu64; sig_x.w[0] = x.w[0]; return sig_x.w[1] < 0x0000314dc6448d93u64
|| (sig_x.w[1] == 0x0000314dc6448d93u64
&& sig_x.w[0] < 0x38c15b0a00000000u64)
} else if (x.w[1] & MASK_INF) == MASK_INF { return !((x.w[1] & 0x03ffffffffffffffu64) != 0 || x.w[0] != 0);
}
sig_x.w[1] = x.w[1] & 0x0001ffffffffffffu64;
sig_x.w[0] = x.w[0];
if (sig_x.w[1] > 0x0001ed09bead87c0u64) || ((sig_x.w[1] == 0x0001ed09bead87c0u64) && (sig_x.w[0] > 0x378d8e63ffffffffu64)) || ((x.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64) {
false
} else {
true
}
}
pub (crate) fn bid128_is_nan(x: &BID_UINT128) -> bool {
(x.w[BID_HIGH_128W] & MASK_NAN) == MASK_NAN
}
pub (crate) fn bid128_copy(x: &BID_UINT128) -> BID_UINT128 {
*x
}
pub (crate) fn bid128_negate(x: &BID_UINT128) -> BID_UINT128 {
let mut res = *x;
res.w[BID_HIGH_128W] ^= MASK_SIGN;
res
}
pub (crate) fn bid128_abs(x: &BID_UINT128) -> BID_UINT128 {
let mut res = *x;
res.w[BID_HIGH_128W] &= !MASK_SIGN;
res
}
pub (crate) fn bid128_copy_sign(x: &BID_UINT128, y: &BID_UINT128) -> BID_UINT128 {
let mut res = *x;
res.w[BID_HIGH_128W] = (x.w[BID_HIGH_128W] & !MASK_SIGN) | y.w[BID_HIGH_128W] & MASK_SIGN;
res
}
pub (crate) fn bid128_class(x: &BID_UINT128) -> ClassTypes {
let sig_x_prime256: BID_UINT256;
let sig_x_prime192: BID_UINT192;
let mut sig_x: BID_UINT128 = Default::default();
let exp_x: i32;
#[cfg(target_endian = "big")]
let mut x = *x;
#[cfg(target_endian = "big")]
BID_SWAP128(&mut x);
if (x.w[1] & MASK_NAN) == MASK_NAN {
return if (x.w[1] & MASK_SNAN) == MASK_SNAN { ClassTypes::SignalingNaN } else { ClassTypes::QuietNaN };
}
if (x.w[1] & MASK_INF) == MASK_INF {
return if (x.w[1] & MASK_SIGN) == MASK_SIGN { ClassTypes::NegativeInfinity } else { ClassTypes::PositiveInfinity };
}
sig_x.w[1] = x.w[1] & 0x0001ffffffffffffu64;
sig_x.w[0] = x.w[0];
if (sig_x.w[1] > 0x0001ed09bead87c0u64)
|| ((sig_x.w[1] == 0x0001ed09bead87c0u64) && (sig_x.w[0] > 0x378d8e63ffffffffu64))
|| ((x.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64)
|| ((sig_x.w[1] == 0) && (sig_x.w[0] == 0)) {
return if (x.w[1] & MASK_SIGN) == MASK_SIGN { ClassTypes::NegativeZero } else { ClassTypes::PositiveZero };
}
exp_x = ((x.w[1] >> 49) & 0x000000000003fffu64) as i32;
if exp_x < 33 { if exp_x > 19 {
sig_x_prime256 = __mul_128x128_to_256(&sig_x, &BID_TEN2K128[(exp_x - 20) as usize]);
if (sig_x_prime256.w[3] == 0) && (sig_x_prime256.w[2] == 0)
&& ((sig_x_prime256.w[1] < 0x0000314dc6448d93u64) || ((sig_x_prime256.w[1] == 0x0000314dc6448d93u64)
&& (sig_x_prime256.w[0] < 0x38c15b0a00000000u64))) {
return if (x.w[1] & MASK_SIGN) == MASK_SIGN {
ClassTypes::NegativeSubnormal
} else {
ClassTypes::PositiveSubnormal
};
}
} else {
sig_x_prime192 = __mul_64x128_to_192(BID_TEN2K64[exp_x as usize], &sig_x);
if (sig_x_prime192.w[2] == 0)
&& ((sig_x_prime192.w[1] < 0x0000314dc6448d93u64) || ((sig_x_prime192.w[1] == 0x0000314dc6448d93u64)
&& (sig_x_prime192.w[0] < 0x38c15b0a00000000u64))) {
return if (x.w[1] & MASK_SIGN) == MASK_SIGN {
ClassTypes::NegativeSubnormal
} else {
ClassTypes::PositiveSubnormal
}
}
}
}
if (x.w[1] & MASK_SIGN) == MASK_SIGN { ClassTypes::NegativeNormal } else { ClassTypes::PositiveNormal }
}
pub (crate) fn bid128_same_quantum(x: &BID_UINT128, y: &BID_UINT128) -> bool {
let x_exp: BID_UINT64;
let y_exp: BID_UINT64;
#[cfg(target_endian = "big")]
let mut x = *x;
#[cfg(target_endian = "big")]
BID_SWAP128(&mut x);
#[cfg(target_endian = "big")]
let mut y = *y;
#[cfg(target_endian = "big")]
BID_SWAP128(&mut y);
if (x.w[1] & MASK_NAN) == MASK_NAN || ((y.w[1] & MASK_NAN) == MASK_NAN) {
return (x.w[1] & MASK_NAN) == MASK_NAN && (y.w[1] & MASK_NAN) == MASK_NAN;
}
if (x.w[1] & MASK_INF) == MASK_INF || (y.w[1] & MASK_INF) == MASK_INF {
return ((x.w[1] & MASK_INF) == MASK_INF) && ((y.w[1] & MASK_INF) == MASK_INF);
}
if (x.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64 { x_exp = (x.w[1] << 2) & MASK_EXP; } else { x_exp = x.w[1] & MASK_EXP; }
if (y.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64 { y_exp = (y.w[1] << 2) & MASK_EXP; } else { y_exp = y.w[1] & MASK_EXP; }
x_exp == y_exp
}
pub (crate) fn bid128_total_order(x: &BID_UINT128, y: &BID_UINT128) -> bool {
let mut exp_x: i32;
let mut exp_y: i32;
let mut sig_x: BID_UINT128 = Default::default();
let mut sig_y: BID_UINT128 = Default::default();
let mut pyld_y: BID_UINT128 = Default::default();
let mut pyld_x: BID_UINT128 = Default::default();
let sig_n_prime192: BID_UINT192;
let sig_n_prime256: BID_UINT256;
let mut x_is_zero = false;
let mut y_is_zero = false;
#[cfg(target_endian = "big")]
let mut x = *x;
#[cfg(target_endian = "big")]
BID_SWAP128(&mut x);
#[cfg(target_endian = "big")]
let mut y = *y;
#[cfg(target_endian = "big")]
BID_SWAP128(&mut y);
if (x.w[1] & MASK_NAN) == MASK_NAN {
return if (x.w[1] & MASK_SIGN) == MASK_SIGN {
if (y.w[1] & MASK_NAN) != MASK_NAN || (y.w[1] & MASK_SIGN) != MASK_SIGN {
true } else { pyld_x.w[1] = x.w[1] & 0x00003fffffffffffu64;
pyld_x.w[0] = x.w[0];
pyld_y.w[1] = y.w[1] & 0x00003fffffffffffu64;
pyld_y.w[0] = y.w[0];
if (pyld_x.w[1] > 0x0000314dc6448d93u64)
|| ((pyld_x.w[1] == 0x0000314dc6448d93u64) && (pyld_x.w[0] > 0x38c15b09ffffffffu64)) {
pyld_x.w[1] = 0;
pyld_x.w[0] = 0;
}
if (pyld_y.w[1] > 0x0000314dc6448d93u64)
|| ((pyld_y.w[1] == 0x0000314dc6448d93u64) && (pyld_y.w[0] > 0x38c15b09ffffffffu64)) {
pyld_y.w[1] = 0;
pyld_y.w[0] = 0;
}
if !(((y.w[1] & MASK_SNAN) == MASK_SNAN) ^ ((x.w[1] & MASK_SNAN) == MASK_SNAN)) {
(pyld_x.w[1] > pyld_y.w[1]) || ((pyld_x.w[1] == pyld_y.w[1]) && (pyld_x.w[0] >= pyld_y.w[0]))
} else {
(y.w[1] & MASK_SNAN) == MASK_SNAN
}
}
} else { if (y.w[1] & MASK_NAN) != MASK_NAN || (y.w[1] & MASK_SIGN) == MASK_SIGN {
false } else {
pyld_x.w[1] = x.w[1] & 0x00003fffffffffffu64;
pyld_x.w[0] = x.w[0];
pyld_y.w[1] = y.w[1] & 0x00003fffffffffffu64;
pyld_y.w[0] = y.w[0];
if (pyld_x.w[1] > 0x0000314dc6448d93u64)
|| ((pyld_x.w[1] == 0x0000314dc6448d93u64) && (pyld_x.w[0] > 0x38c15b09ffffffffu64)) {
pyld_x.w[1] = 0;
pyld_x.w[0] = 0;
}
if (pyld_y.w[1] > 0x0000314dc6448d93u64)
|| ((pyld_y.w[1] == 0x0000314dc6448d93u64) && (pyld_y.w[0] > 0x38c15b09ffffffffu64)) {
pyld_y.w[1] = 0;
pyld_y.w[0] = 0;
}
if !(((y.w[1] & MASK_SNAN) == MASK_SNAN) ^ ((x.w[1] & MASK_SNAN) == MASK_SNAN)) {
(pyld_x.w[1] < pyld_y.w[1]) || ((pyld_x.w[1] == pyld_y.w[1]) && (pyld_x.w[0] <= pyld_y.w[0]))
} else {
(x.w[1] & MASK_SNAN) == MASK_SNAN
}
}
}
} else if (y.w[1] & MASK_NAN) == MASK_NAN {
return (y.w[1] & MASK_SIGN) != MASK_SIGN;
}
if (x.w[1] == y.w[1]) && (x.w[0] == y.w[0]) {
return true;
}
if ((x.w[1] & MASK_SIGN) == MASK_SIGN) ^ ((y.w[1] & MASK_SIGN) == MASK_SIGN) {
return (x.w[1] & MASK_SIGN) == MASK_SIGN;
}
if (x.w[1] & MASK_INF) == MASK_INF {
return if (x.w[1] & MASK_SIGN) == MASK_SIGN {
true
} else {
(y.w[1] & MASK_INF) == MASK_INF
}
} else if (y.w[1] & MASK_INF) == MASK_INF {
return (y.w[1] & MASK_SIGN) != MASK_SIGN;
}
sig_x.w[1] = x.w[1] & 0x0001ffffffffffffu64;
sig_x.w[0] = x.w[0];
exp_x = ((x.w[1] >> 49) & 0x000000000003fffu64) as i32;
if (((sig_x.w[1] > 0x0001ed09bead87c0u64)
|| ((sig_x.w[1] == 0x0001ed09bead87c0u64)
&& (sig_x.w[0] > 0x378d8e63ffffffffu64)))
&& ((x.w[1] & 0x6000000000000000u64) != 0x6000000000000000u64))
|| ((x.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64)
|| ((sig_x.w[1] == 0) && (sig_x.w[0] == 0)) {
x_is_zero = true;
if (x.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64 {
exp_x = ((x.w[1] >> 47) & 0x000000000003fffu64) as i32;
}
}
exp_y = ((y.w[1] >> 49) & 0x0000000000003fffu64) as i32;
sig_y.w[1] = y.w[1] & 0x0001ffffffffffffu64;
sig_y.w[0] = y.w[0];
if (((sig_y.w[1] > 0x0001ed09bead87c0u64)
|| ((sig_y.w[1] == 0x0001ed09bead87c0u64)
&& (sig_y.w[0] > 0x378d8e63ffffffffu64)))
&& ((y.w[1] & 0x6000000000000000u64) != 0x6000000000000000u64))
|| ((y.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64)
|| ((sig_y.w[1] == 0) && (sig_y.w[0] == 0)) {
y_is_zero = true;
if (y.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64 {
exp_y = ((y.w[1] >> 47) & 0x000000000003fffu64) as i32;
}
}
if x_is_zero && y_is_zero {
if exp_x == exp_y {
return true;
}
return (exp_x <= exp_y) ^ ((x.w[1] & MASK_SIGN) == MASK_SIGN);
}
if x_is_zero {
return (y.w[1] & MASK_SIGN) != MASK_SIGN;
}
if y_is_zero {
return (x.w[1] & MASK_SIGN) == MASK_SIGN;
}
if ((sig_x.w[1] > sig_y.w[1]) || (sig_x.w[1] == sig_y.w[1] && sig_x.w[0] > sig_y.w[0])) && exp_x >= exp_y {
return (x.w[1] & MASK_SIGN) == MASK_SIGN;
}
if ((sig_x.w[1] < sig_y.w[1]) || (sig_x.w[1] == sig_y.w[1] && sig_x.w[0] < sig_y.w[0])) && exp_x <= exp_y {
return (x.w[1] & MASK_SIGN) != MASK_SIGN;
}
if exp_x > exp_y {
if exp_x - exp_y > 33 {
return (x.w[1] & MASK_SIGN) == MASK_SIGN;
}
if exp_x - exp_y > 19 {
sig_n_prime256 = __mul_128x128_to_256(&sig_x, &BID_TEN2K128[(exp_x - exp_y - 20) as usize]);
if (sig_n_prime256.w[3] == 0) && (sig_n_prime256.w[2] == 0)
&& (sig_n_prime256.w[1] == sig_y.w[1])
&& (sig_n_prime256.w[0] == sig_y.w[0]) {
return (exp_x <= exp_y) ^ ((x.w[1] & MASK_SIGN) == MASK_SIGN);
}
return ((sig_n_prime256.w[3] == 0) && (sig_n_prime256.w[2] == 0)
&& ((sig_n_prime256.w[1] < sig_y.w[1])
|| (sig_n_prime256.w[1] == sig_y.w[1]
&& sig_n_prime256.w[0] < sig_y.w[0]))) ^ ((x.w[1] & MASK_SIGN) == MASK_SIGN);
}
sig_n_prime192 = __mul_64x128_to_192(BID_TEN2K64[(exp_x - exp_y) as usize], &sig_x);
if (sig_n_prime192.w[2] == 0) && sig_n_prime192.w[1] == sig_y.w[1] && (sig_n_prime192.w[0] == sig_y.w[0]) {
return (exp_x <= exp_y) ^ ((x.w[1] & MASK_SIGN) == MASK_SIGN);
}
return ((sig_n_prime192.w[2] == 0)
&& ((sig_n_prime192.w[1] < sig_y.w[1])
|| (sig_n_prime192.w[1] == sig_y.w[1]
&& sig_n_prime192.w[0] < sig_y.w[0]))) ^ ((x.w[1] & MASK_SIGN) == MASK_SIGN);
}
if exp_y - exp_x > 33 {
return (x.w[1] & MASK_SIGN) != MASK_SIGN;
}
if exp_y - exp_x > 19 {
sig_n_prime256 = __mul_128x128_to_256(&sig_y, &BID_TEN2K128[(exp_y - exp_x - 20) as usize]);
if (sig_n_prime256.w[3] == 0)
&& (sig_n_prime256.w[2] == 0)
&& (sig_n_prime256.w[1] == sig_x.w[1])
&& (sig_n_prime256.w[0] == sig_x.w[0]) {
return (exp_x <= exp_y) ^ ((x.w[1] & MASK_SIGN) == MASK_SIGN);
}
return ((sig_n_prime256.w[3] != 0) ||
(sig_n_prime256.w[2] != 0) ||
(sig_n_prime256.w[1] > sig_x.w[1]) ||
(sig_n_prime256.w[1] == sig_x.w[1]
&& sig_n_prime256.w[0] > sig_x.w[0])) ^ ((x.w[1] & MASK_SIGN) == MASK_SIGN);
}
sig_n_prime192 = __mul_64x128_to_192(BID_TEN2K64[(exp_y - exp_x) as usize], &sig_y);
if (sig_n_prime192.w[2] == 0) && (sig_n_prime192.w[1] == sig_x.w[1])
&& (sig_n_prime192.w[0] == sig_x.w[0]) {
return (exp_x <= exp_y) ^ ((x.w[1] & MASK_SIGN) == MASK_SIGN);
}
((sig_n_prime192.w[2] != 0)
|| (sig_n_prime192.w[1] > sig_x.w[1])
|| (sig_n_prime192.w[1] == sig_x.w[1] && sig_n_prime192.w[0] > sig_x.w[0])) ^ ((x.w[1] & MASK_SIGN) == MASK_SIGN)
}
pub (crate) fn bid128_total_order_mag(x: &BID_UINT128, y: &BID_UINT128) -> bool {
let mut exp_x: i32;
let mut exp_y: i32;
let mut sig_x: BID_UINT128 = Default::default();
let mut sig_y: BID_UINT128 = Default::default();
let mut pyld_y: BID_UINT128 = Default::default();
let mut pyld_x: BID_UINT128 = Default::default();
let sig_n_prime192: BID_UINT192;
let sig_n_prime256: BID_UINT256;
let mut x_is_zero = false;
let mut y_is_zero = false;
let mut x = *x;
let mut y = *y;
#[cfg(target_endian = "big")]
BID_SWAP128(&mut x);
#[cfg(target_endian = "big")]
BID_SWAP128(&mut y);
x.w[1] &= 0x7fffffffffffffffu64;
y.w[1] &= 0x7fffffffffffffffu64;
if (x.w[1] & MASK_NAN) == MASK_NAN {
return if (y.w[1] & MASK_NAN) != MASK_NAN {
false } else {
pyld_x.w[1] = x.w[1] & 0x00003fffffffffffu64;
pyld_x.w[0] = x.w[0];
pyld_y.w[1] = y.w[1] & 0x00003fffffffffffu64;
pyld_y.w[0] = y.w[0];
if (pyld_x.w[1] > 0x0000314dc6448d93u64)
|| ((pyld_x.w[1] == 0x0000314dc6448d93u64) && (pyld_x.w[0] > 0x38c15b09ffffffffu64)) {
pyld_x.w[1] = 0;
pyld_x.w[0] = 0;
}
if (pyld_y.w[1] > 0x0000314dc6448d93u64)
|| ((pyld_y.w[1] == 0x0000314dc6448d93u64) && (pyld_y.w[0] > 0x38c15b09ffffffffu64)) {
pyld_y.w[1] = 0;
pyld_y.w[0] = 0;
}
if !(((y.w[1] & MASK_SNAN) == MASK_SNAN) ^ ((x.w[1] & MASK_SNAN) == MASK_SNAN)) {
(pyld_x.w[1] < pyld_y.w[1]) || ((pyld_x.w[1] == pyld_y.w[1]) && (pyld_x.w[0] <= pyld_y.w[0]))
} else {
(x.w[1] & MASK_SNAN) == MASK_SNAN
}
}
} else if (y.w[1] & MASK_NAN) == MASK_NAN {
return true;
}
if (x.w[1] == y.w[1]) && (x.w[0] == y.w[0]) {
return true;
}
if (x.w[1] & MASK_INF) == MASK_INF {
return (y.w[1] & MASK_INF) == MASK_INF;
} else if (y.w[1] & MASK_INF) == MASK_INF {
return true;
} else {
}
sig_x.w[1] = x.w[1] & 0x0001ffffffffffffu64;
sig_x.w[0] = x.w[0];
exp_x = ((x.w[1] >> 49) & 0x000000000003fffu64) as i32;
if (((sig_x.w[1] > 0x0001ed09bead87c0u64)
|| ((sig_x.w[1] == 0x0001ed09bead87c0u64)
&& (sig_x.w[0] > 0x378d8e63ffffffffu64)))
&& ((x.w[1] & 0x6000000000000000u64) != 0x6000000000000000u64))
|| ((x.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64)
|| ((sig_x.w[1] == 0) && (sig_x.w[0] == 0)) {
x_is_zero = true;
if (x.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64 {
exp_x = ((x.w[1] >> 47) & 0x000000000003fffu64) as i32;
}
}
exp_y = ((y.w[1] >> 49) & 0x0000000000003fffu64) as i32;
sig_y.w[1] = y.w[1] & 0x0001ffffffffffffu64;
sig_y.w[0] = y.w[0];
if (((sig_y.w[1] > 0x0001ed09bead87c0u64)
|| ((sig_y.w[1] == 0x0001ed09bead87c0u64)
&& (sig_y.w[0] > 0x378d8e63ffffffffu64)))
&& ((y.w[1] & 0x6000000000000000u64) != 0x6000000000000000u64))
|| ((y.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64)
|| ((sig_y.w[1] == 0) && (sig_y.w[0] == 0)) {
y_is_zero = true;
if (y.w[1] & 0x6000000000000000u64) == 0x6000000000000000u64 {
exp_y = ((y.w[1] >> 47) & 0x000000000003fffu64) as i32;
}
}
if x_is_zero && y_is_zero {
if exp_x == exp_y {
return true;
}
return exp_x <= exp_y;
}
if x_is_zero {
return true;
}
if y_is_zero {
return false;
}
if ((sig_x.w[1] > sig_y.w[1]) || (sig_x.w[1] == sig_y.w[1] && sig_x.w[0] > sig_y.w[0])) && exp_x >= exp_y {
return false;
}
if ((sig_x.w[1] < sig_y.w[1]) || (sig_x.w[1] == sig_y.w[1] && sig_x.w[0] < sig_y.w[0])) && exp_x <= exp_y {
return true;
}
if exp_x > exp_y {
if exp_x - exp_y > 33 {
return false; }
if exp_x - exp_y > 19 {
sig_n_prime256 = __mul_128x128_to_256(&sig_x, &BID_TEN2K128[(exp_x - exp_y - 20) as usize]);
if (sig_n_prime256.w[3] == 0) && (sig_n_prime256.w[2] == 0)
&& (sig_n_prime256.w[1] == sig_y.w[1])
&& (sig_n_prime256.w[0] == sig_y.w[0]) {
return false; }
return (sig_n_prime256.w[3] == 0) && (sig_n_prime256.w[2] == 0)
&& ((sig_n_prime256.w[1] < sig_y.w[1])
|| (sig_n_prime256.w[1] == sig_y.w[1] && sig_n_prime256.w[0] < sig_y.w[0]));
}
sig_n_prime192 = __mul_64x128_to_192(BID_TEN2K64[(exp_x - exp_y) as usize], &sig_x);
if (sig_n_prime192.w[2] == 0) && sig_n_prime192.w[1] == sig_y.w[1] && (sig_n_prime192.w[0] == sig_y.w[0]) {
return false; }
return (sig_n_prime192.w[2] == 0)
&& ((sig_n_prime192.w[1] < sig_y.w[1])
|| (sig_n_prime192.w[1] == sig_y.w[1] && sig_n_prime192.w[0] < sig_y.w[0]));
}
if exp_y - exp_x > 33 {
return true;
} if exp_y - exp_x > 19 {
sig_n_prime256 = __mul_128x128_to_256(&sig_y, &BID_TEN2K128[(exp_y - exp_x - 20) as usize]);
if (sig_n_prime256.w[3] == 0) && (sig_n_prime256.w[2] == 0)
&& (sig_n_prime256.w[1] == sig_x.w[1])
&& (sig_n_prime256.w[0] == sig_x.w[0]) {
return true; }
return (sig_n_prime256.w[3] != 0) ||
(sig_n_prime256.w[2] != 0) ||
(sig_n_prime256.w[1] > sig_x.w[1]) ||
(sig_n_prime256.w[1] == sig_x.w[1] && sig_n_prime256.w[0] > sig_x.w[0]);
} sig_n_prime192 = __mul_64x128_to_192(BID_TEN2K64[(exp_y - exp_x) as usize], &sig_y);
if (sig_n_prime192.w[2] == 0) && (sig_n_prime192.w[1] == sig_x.w[1]) && (sig_n_prime192.w[0] == sig_x.w[0]) {
return true; }
(sig_n_prime192.w[2] != 0)
|| (sig_n_prime192.w[1] > sig_x.w[1])
|| (sig_n_prime192.w[1] == sig_x.w[1] && sig_n_prime192.w[0] > sig_x.w[0])
}
pub (crate) fn bid128_nan(tagp: &str, pfpsf: &mut _IDEC_flags) -> BID_UINT128 {
let mut res: BID_UINT128 = Default::default();
res.w[BID_HIGH_128W] = 0x7c00000000000000u64; res.w[BID_LOW_128W] = 0x0000000000000000u64;
if tagp.is_empty() {
return res;
}
let mut x: BID_UINT128 = bid128_from_string(tagp, DEFAULT_ROUNDING_MODE, pfpsf);
x.w[BID_HIGH_128W] &= 0x0000cfffffffffffu64; res.w[BID_HIGH_128W] |= x.w[BID_HIGH_128W];
res.w[BID_LOW_128W] = x.w[BID_LOW_128W];
res
}