#![no_std]
pub fn i8_mul_div_128(a: i8, b: i8) -> i8 {
debug_assert_ne!(a, i8::MIN);
debug_assert_ne!(b, i8::MIN);
let au8 = a.unsigned_abs();
let bu8 = b.unsigned_abs();
let mut result = 0u8;
result += if (au8 & 0b00000001) != 0 { bu8 } else { 0 };
result >>= 1;
result += if (au8 & 0b00000010) != 0 { bu8 } else { 0 };
result >>= 1;
result += if (au8 & 0b00000100) != 0 { bu8 } else { 0 };
result >>= 1;
result += if (au8 & 0b00001000) != 0 { bu8 } else { 0 };
result >>= 1;
result += if (au8 & 0b00010000) != 0 { bu8 } else { 0 };
result >>= 1;
result += if (au8 & 0b00100000) != 0 { bu8 } else { 0 };
result >>= 1;
result += if (au8 & 0b01000000) != 0 { bu8 } else { 0 };
result >>= 1;
let result = result as i8;
if (a as u8 & 0x80) ^ (b as u8 & 0x80) == 0 {
result
} else {
-result
}
}
#[doc(hidden)]
pub fn i8_mul_div_128_reference(a: i8, b: i8) -> i8 {
(a as i16 * b as i16 / 128) as i8
}
pub fn saturating_i16_mul_div_1024(a: i16, b: i16) -> i16 {
let au16 = a.unsigned_abs();
let bu16 = b.unsigned_abs();
let mut result = 0u16;
result += if (au16 & 0b0000000000000001) != 0 {
bu16
} else {
0
};
result >>= 1;
result += if (au16 & 0b0000000000000010) != 0 {
bu16
} else {
0
};
result >>= 1;
result += if (au16 & 0b0000000000000100) != 0 {
bu16
} else {
0
};
result >>= 1;
result += if (au16 & 0b0000000000001000) != 0 {
bu16
} else {
0
};
result >>= 1;
result += if (au16 & 0b0000000000010000) != 0 {
bu16
} else {
0
};
result >>= 1;
result += if (au16 & 0b0000000000100000) != 0 {
bu16
} else {
0
};
result >>= 1;
result += if (au16 & 0b0000000001000000) != 0 {
bu16
} else {
0
};
result >>= 1;
result += if (au16 & 0b0000000010000000) != 0 {
bu16
} else {
0
};
result >>= 1;
result += if (au16 & 0b0000000100000000) != 0 {
bu16
} else {
0
};
result >>= 1;
result += if (au16 & 0b0000001000000000) != 0 {
bu16
} else {
0
};
result >>= 1;
result += if (au16 & 0b0000010000000000) != 0 {
bu16
} else {
0
};
result = result.saturating_add(if (au16 & 0b0000100000000000) != 0 {
if bu16 >= 0b1000000000000000 {
u16::MAX
} else {
bu16 << 1
}
} else {
0
});
result = result.saturating_add(if (au16 & 0b0001000000000000) != 0 {
if bu16 >= 0b0100000000000000 {
u16::MAX
} else {
bu16 << 2
}
} else {
0
});
result = result.saturating_add(if (au16 & 0b0010000000000000) != 0 {
if bu16 >= 0b0010000000000000 {
u16::MAX
} else {
bu16 << 3
}
} else {
0
});
result = result.saturating_add(if (au16 & 0b0100000000000000) != 0 {
if bu16 >= 0b0001000000000000 {
u16::MAX
} else {
bu16 << 4
}
} else {
0
});
result = result.saturating_add(if (au16 & 0b1000000000000000) != 0 {
if bu16 >= 0b0000100000000000 {
u16::MAX
} else {
bu16 << 5
}
} else {
0
});
result = core::cmp::min(result, i16::MAX as u16);
let result = result as i16;
if (a as u16 & 0x8000) ^ (b as u16 & 0x8000) == 0 {
result
} else {
-result
}
}
#[doc(hidden)]
pub fn saturating_i16_mul_div_1024_reference(a: i16, b: i16) -> i16 {
let result = a as i32 * b as i32 / 1024;
if result > i16::MAX as i32 {
i16::MAX
} else if result < -i16::MAX as i32 {
-i16::MAX
} else {
result as i16
}
}