mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
added RulePositiveDiv
This commit is contained in:
parent
165377aad7
commit
992d32dd87
3 changed files with 39 additions and 0 deletions
|
@ -4542,6 +4542,7 @@ void universal_action(Architecture *conf)
|
||||||
actprop->addRule( new RuleHumptyOr("analysis") );
|
actprop->addRule( new RuleHumptyOr("analysis") );
|
||||||
actprop->addRule( new RuleNegateIdentity("analysis") );
|
actprop->addRule( new RuleNegateIdentity("analysis") );
|
||||||
actprop->addRule( new RuleSubNormal("analysis") );
|
actprop->addRule( new RuleSubNormal("analysis") );
|
||||||
|
actprop->addRule( new RulePositiveDiv("analysis") );
|
||||||
actprop->addRule( new RuleDivTermAdd("analysis") );
|
actprop->addRule( new RuleDivTermAdd("analysis") );
|
||||||
actprop->addRule( new RuleDivTermAdd2("analysis") );
|
actprop->addRule( new RuleDivTermAdd2("analysis") );
|
||||||
actprop->addRule( new RuleDivOpt("analysis") );
|
actprop->addRule( new RuleDivOpt("analysis") );
|
||||||
|
|
|
@ -6448,6 +6448,33 @@ int4 RuleSubNormal::applyOp(PcodeOp *op,Funcdata &data)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// \class RulePositiveDiv
|
||||||
|
/// \brief Signed division of positive values is unsigned division
|
||||||
|
///
|
||||||
|
/// If the sign bit of both the numerator and denominator of a signed division (or remainder)
|
||||||
|
/// are zero, then convert to the unsigned form of the operation.
|
||||||
|
void RulePositiveDiv::getOpList(vector<uint4> &oplist) const
|
||||||
|
|
||||||
|
{
|
||||||
|
oplist.push_back(CPUI_INT_SDIV);
|
||||||
|
oplist.push_back(CPUI_INT_SREM);
|
||||||
|
}
|
||||||
|
|
||||||
|
int4 RulePositiveDiv::applyOp(PcodeOp *op,Funcdata &data)
|
||||||
|
|
||||||
|
{
|
||||||
|
int4 sa = op->getOut()->getSize();
|
||||||
|
if (sa > sizeof(uintb)) return 0;
|
||||||
|
sa = sa * 8 - 1;
|
||||||
|
if (((op->getIn(0)->getNZMask() >> sa) & 1) != 0)
|
||||||
|
return 0; // Input 0 may be negative
|
||||||
|
if (((op->getIn(1)->getNZMask() >> sa) & 1) != 0)
|
||||||
|
return 0; // Input 1 may be negative
|
||||||
|
OpCode opc = (op->code() == CPUI_INT_SDIV) ? CPUI_INT_DIV : CPUI_INT_REM;
|
||||||
|
data.opSetOpcode(op, opc);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/// \class RuleDivTermAdd
|
/// \class RuleDivTermAdd
|
||||||
/// \brief Simplify expressions associated with optimized division expressions
|
/// \brief Simplify expressions associated with optimized division expressions
|
||||||
///
|
///
|
||||||
|
|
|
@ -1115,6 +1115,17 @@ public:
|
||||||
// virtual int4 applyOp(PcodeOp *op,Funcdata &data);
|
// virtual int4 applyOp(PcodeOp *op,Funcdata &data);
|
||||||
// };
|
// };
|
||||||
|
|
||||||
|
class RulePositiveDiv : public Rule {
|
||||||
|
public:
|
||||||
|
RulePositiveDiv(const string &g) : Rule( g, 0, "positivediv") {} ///< Constructor
|
||||||
|
virtual Rule *clone(const ActionGroupList &grouplist) const {
|
||||||
|
if (!grouplist.contains(getGroup())) return (Rule *)0;
|
||||||
|
return new RulePositiveDiv(getGroup());
|
||||||
|
}
|
||||||
|
virtual void getOpList(vector<uint4> &oplist) const;
|
||||||
|
virtual int4 applyOp(PcodeOp *op,Funcdata &data);
|
||||||
|
};
|
||||||
|
|
||||||
class RuleDivTermAdd : public Rule {
|
class RuleDivTermAdd : public Rule {
|
||||||
public:
|
public:
|
||||||
RuleDivTermAdd(const string &g) : Rule( g, 0, "divtermadd") {} ///< Constructor
|
RuleDivTermAdd(const string &g) : Rule( g, 0, "divtermadd") {} ///< Constructor
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue