Divmul to shift

This commit is contained in:
Alex Beregszaszi 2019-02-21 14:07:59 +00:00
parent 23f03e1b61
commit 35fe5cde06

View File

@ -305,6 +305,36 @@ std::vector<SimplificationRule<Pattern>> simplificationRuleListPart5(
[=]() { return A.d() >= Pattern::WordSize / 8; }
});
// Replace DIV X, 2^m -> SHR m, X
for (size_t i = 1; i < 255; ++i)
{
rules.push_back({
{Instruction::DIV, {X, u256(1) << i}},
[=]() -> Pattern { return { Instruction::SHR, {u256(i), X}}; },
false
});
}
// Replace MUL X, 2^m -> SHL m, X
for (size_t i = 1; i < 255; ++i)
{
rules.push_back({
{Instruction::MUL, {X, u256(1) << i}},
[=]() -> Pattern { return {Instruction::SHL, {u256(i), X}}; },
false
});
}
// Replace MUL 2^m, X -> SHL m, X
for (size_t i = 1; i < 255; ++i)
{
rules.push_back({
{Instruction::MUL, {u256(1) << i, X}},
[=]() -> Pattern { return {Instruction::SHL, {u256(i), X}}; },
false
});
}
for (auto instr: {
Instruction::ADDRESS,
Instruction::CALLER,