From 35fe5cde06ebaec4abe2e57e366495d2c8f25b21 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 21 Feb 2019 14:07:59 +0000 Subject: [PATCH] Divmul to shift --- libevmasm/RuleList.h | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/libevmasm/RuleList.h b/libevmasm/RuleList.h index c2f2cdbb8..9452b7bad 100644 --- a/libevmasm/RuleList.h +++ b/libevmasm/RuleList.h @@ -305,6 +305,36 @@ std::vector> 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,