GP-2292: The Decompiler now supports simplification of more forms of

optimized modulo/remainder calculations
This commit is contained in:
caheckman 2022-09-02 16:23:08 -04:00 committed by Ryan Kurtz
parent a438a1e1ea
commit 7a2810a649
6 changed files with 688 additions and 2 deletions

View file

@ -1237,6 +1237,17 @@ public:
virtual int4 applyOp(PcodeOp *op,Funcdata &data);
};
class RuleDivChain : public Rule {
public:
RuleDivChain(const string &g) : Rule( g, 0, "divchain") {} ///< Constructor
virtual Rule *clone(const ActionGroupList &grouplist) const {
if (!grouplist.contains(getGroup())) return (Rule *)0;
return new RuleDivChain(getGroup());
}
virtual void getOpList(vector<uint4> &oplist) const;
virtual int4 applyOp(PcodeOp *op,Funcdata &data);
};
class RuleSignForm : public Rule {
public:
RuleSignForm(const string &g) : Rule( g, 0, "signform") {} ///< Constructor
@ -1248,6 +1259,17 @@ public:
virtual int4 applyOp(PcodeOp *op,Funcdata &data);
};
class RuleSignForm2 : public Rule {
public:
RuleSignForm2(const string &g) : Rule( g, 0, "signform2") {} ///< Constructor
virtual Rule *clone(const ActionGroupList &grouplist) const {
if (!grouplist.contains(getGroup())) return (Rule *)0;
return new RuleSignForm2(getGroup());
}
virtual void getOpList(vector<uint4> &oplist) const;
virtual int4 applyOp(PcodeOp *op,Funcdata &data);
};
class RuleSignNearMult : public Rule {
public:
RuleSignNearMult(const string &g) : Rule( g, 0, "signnearmult") {} ///< Constructor
@ -1270,6 +1292,42 @@ public:
virtual int4 applyOp(PcodeOp *op,Funcdata &data);
};
class RuleSignMod2nOpt : public Rule {
public:
RuleSignMod2nOpt(const string &g) : Rule( g, 0, "signmod2nopt") {} ///< Constructor
virtual Rule *clone(const ActionGroupList &grouplist) const {
if (!grouplist.contains(getGroup())) return (Rule *)0;
return new RuleSignMod2nOpt(getGroup());
}
virtual void getOpList(vector<uint4> &oplist) const;
virtual int4 applyOp(PcodeOp *op,Funcdata &data);
static Varnode *checkSignExtraction(Varnode *outVn);
};
class RuleSignMod2Opt : public Rule {
public:
RuleSignMod2Opt(const string &g) : Rule( g, 0, "signmod2opt") {} ///< Constructor
virtual Rule *clone(const ActionGroupList &grouplist) const {
if (!grouplist.contains(getGroup())) return (Rule *)0;
return new RuleSignMod2Opt(getGroup());
}
virtual void getOpList(vector<uint4> &oplist) const;
virtual int4 applyOp(PcodeOp *op,Funcdata &data);
};
class RuleSignMod2nOpt2 : public Rule {
static Varnode *checkMultiequalForm(PcodeOp *op,uintb npow);
static Varnode *checkSignExtForm(PcodeOp *op);
public:
RuleSignMod2nOpt2(const string &g) : Rule( g, 0, "signmod2nopt2") {} ///< Constructor
virtual Rule *clone(const ActionGroupList &grouplist) const {
if (!grouplist.contains(getGroup())) return (Rule *)0;
return new RuleSignMod2nOpt2(getGroup());
}
virtual void getOpList(vector<uint4> &oplist) const;
virtual int4 applyOp(PcodeOp *op,Funcdata &data);
};
class RuleSegment : public Rule {
public:
RuleSegment(const string &g) : Rule( g, 0, "segment") {} ///< Constructor