mirror of
https://github.com/vtil-project/VTIL-Core
synced 2026-08-17 08:23:03 -04:00
support operator umultiply and multiply
This commit is contained in:
parent
b1009befe4
commit
9cc1a5cc25
1 changed files with 32 additions and 0 deletions
|
|
@ -720,11 +720,43 @@ namespace vtil::math
|
|||
//
|
||||
// ####################################################################################################################################
|
||||
case operator_id::multiply_high:
|
||||
return bit_vector(std::max(rhs.size(), lhs.size()));
|
||||
case operator_id::multiply:
|
||||
// result of imul and mul are same at low operand size bits.
|
||||
return evaluate_partial(operator_id::umultiply, lhs, rhs);
|
||||
case operator_id::divide:
|
||||
case operator_id::remainder:
|
||||
case operator_id::umultiply_high:
|
||||
return bit_vector(std::max(rhs.size(), lhs.size()));
|
||||
case operator_id::umultiply:
|
||||
{
|
||||
bitcnt_t out_size = std::max(lhs.size(), rhs.size());
|
||||
|
||||
bit_vector lhs_sx = bit_vector{ lhs }.resize(out_size, true);
|
||||
bit_vector rhs_sx = bit_vector{ rhs }.resize(out_size, true);
|
||||
bit_vector result = bit_vector(0, out_size);
|
||||
for (int i = 0; i < rhs.size(); i++)
|
||||
{
|
||||
bit_state b = rhs_sx[i];
|
||||
if (b == bit_state::unknown)
|
||||
{
|
||||
result = evaluate_partial(operator_id::add,
|
||||
evaluate_partial(operator_id::shift_left,
|
||||
bit_vector(out_size),
|
||||
bit_vector(i, out_size))
|
||||
, result);
|
||||
}
|
||||
else if (b == bit_state::one)
|
||||
{
|
||||
result = evaluate_partial(operator_id::add,
|
||||
evaluate_partial(operator_id::shift_left,
|
||||
lhs_sx,
|
||||
bit_vector(i, out_size))
|
||||
, result);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
case operator_id::udivide:
|
||||
case operator_id::uremainder:
|
||||
return bit_vector( std::max( rhs.size(), lhs.size() ) );
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue