Add new XOR rules

This commit is contained in:
Boris Batteux
2021-02-18 15:25:53 +01:00
parent 1885f43bf5
commit 49a91daee4

View File

@@ -2,7 +2,7 @@ from ida_hexrays import *
from d810.optimizers.instructions.pattern_matching.handler import PatternMatchingRule from d810.optimizers.instructions.pattern_matching.handler import PatternMatchingRule
from d810.ast import AstLeaf, AstConstant, AstNode from d810.ast import AstLeaf, AstConstant, AstNode
from d810.hexrays_helpers import equal_bnot_mop, SUB_TABLE from d810.hexrays_helpers import equal_bnot_mop, equal_bnot_cst, SUB_TABLE
class Xor_HackersDelightRule_1(PatternMatchingRule): class Xor_HackersDelightRule_1(PatternMatchingRule):
@@ -270,6 +270,48 @@ class Xor_Rule_3(PatternMatchingRule):
REPLACEMENT_PATTERN = AstNode(m_xor, AstNode(m_bnot, AstLeaf('x_0')), AstLeaf('x_1')) REPLACEMENT_PATTERN = AstNode(m_xor, AstNode(m_bnot, AstLeaf('x_0')), AstLeaf('x_1'))
class Xor_Rule_4(PatternMatchingRule):
PATTERN = AstNode(m_or,
AstNode(m_and,
AstLeaf("x_0"),
AstLeaf("bnot_x_1")),
AstNode(m_and,
AstLeaf("bnot_x_0"),
AstLeaf("x_1")))
REPLACEMENT_PATTERN = AstNode(m_xor,
AstLeaf('x_0'),
AstLeaf("x_1"))
def check_candidate(self, candidate):
if not equal_bnot_mop(candidate["x_0"].mop, candidate["bnot_x_0"].mop):
return False
if not equal_bnot_mop(candidate["x_1"].mop, candidate["bnot_x_1"].mop):
return False
return True
class Xor_Rule_4_WithXdu(PatternMatchingRule):
PATTERN = AstNode(m_or,
AstNode(m_and,
AstLeaf("x_0"),
AstConstant("bnot_c_1")),
AstNode(m_and,
AstNode(m_bnot, AstLeaf("x_0")),
AstConstant("c_1")))
REPLACEMENT_PATTERN = AstNode(m_xor,
AstLeaf("x_0"),
AstLeaf("c_1"))
def check_candidate(self, candidate):
if candidate["x_0"].mop.t != mop_d:
return False
if candidate["x_0"].mop.d.opcode != m_xdu:
return False
return equal_bnot_cst(candidate["c_1"].mop, candidate["bnot_c_1"].mop, mop_size=candidate["x_0"].mop.d.l.size)
class XorAlmost_Rule_1(PatternMatchingRule): class XorAlmost_Rule_1(PatternMatchingRule):
PATTERN = AstNode(m_sub, PATTERN = AstNode(m_sub,
AstNode(m_add, AstNode(m_add,