retdec
|
Public Member Functions | |
bool | testArchAndInitialize (common::Architecture &arch, Abi *abi) |
void | log (llvm::Instruction *orig, std::initializer_list< llvm::Value * > news) |
void | replaceResultUses (llvm::CallInst *c, llvm::Instruction *r) |
template<typename N > | |
llvm::Value * | getOp0 (llvm::CallInst *call) |
template<typename N > | |
llvm::Value * | getOp1 (llvm::CallInst *call) |
template<typename N > | |
llvm::Value * | getRes0 (llvm::CallInst *call, llvm::Value *res) |
template<typename N > | |
llvm::Value * | getRes1 (llvm::CallInst *call, llvm::Value *res) |
template<typename N > | |
void | aeabi_idivmod (llvm::CallInst *inst) |
template<typename N > | |
void | ldivmoddi (llvm::CallInst *inst) |
template<typename N > | |
void | modi (llvm::CallInst *inst) |
template<typename N > | |
void | divi (llvm::CallInst *inst) |
template<typename N > | |
void | udivi (llvm::CallInst *inst) |
template<typename N > | |
void | addi (llvm::CallInst *inst) |
template<typename N > | |
void | ashldi3 (llvm::CallInst *inst) |
template<typename N > | |
void | ashrdi3 (llvm::CallInst *inst) |
template<typename N > | |
void | lshrdi3 (llvm::CallInst *inst) |
template<typename N > | |
void | muli (llvm::CallInst *inst) |
template<typename N > | |
void | negi (llvm::CallInst *inst) |
template<typename N > | |
void | subi (llvm::CallInst *inst) |
template<typename N > | |
void | umodi (llvm::CallInst *inst) |
template<typename N > | |
void | addf (llvm::CallInst *inst) |
template<typename N > | |
void | divf (llvm::CallInst *inst) |
template<typename N > | |
void | mulf (llvm::CallInst *inst) |
template<typename N > | |
void | subf (llvm::CallInst *inst) |
template<typename N > | |
void | subrf (llvm::CallInst *inst) |
template<typename N > | |
void | negf (llvm::CallInst *inst) |
template<typename N > | |
void | fp2si32 (llvm::CallInst *inst) |
template<typename N > | |
void | fp2si64 (llvm::CallInst *inst) |
template<typename N > | |
void | fp2ui32 (llvm::CallInst *inst) |
template<typename N > | |
void | fp2ui64 (llvm::CallInst *inst) |
template<typename N > | |
void | si2float (llvm::CallInst *inst) |
template<typename N > | |
void | si2double (llvm::CallInst *inst) |
template<typename N > | |
void | ui2float (llvm::CallInst *inst) |
template<typename N > | |
void | ui2double (llvm::CallInst *inst) |
void | float2double (llvm::CallInst *inst) |
void | double2float (llvm::CallInst *inst) |
template<typename N > | |
void | cmpf (llvm::CallInst *inst, bool revert=false) |
template<typename N > | |
void | gef (llvm::CallInst *inst) |
template<typename N > | |
void | lef (llvm::CallInst *inst) |
template<typename N > | |
void | cmpdi2 (llvm::CallInst *inst) |
template<typename N > | |
void | ucmpdi2 (llvm::CallInst *inst) |
template<typename N > | |
void | eqf (llvm::CallInst *inst) |
template<typename N > | |
void | gtf (llvm::CallInst *inst, bool reverse=false) |
template<typename N > | |
void | ltf (llvm::CallInst *inst) |
template<typename N > | |
void | nef (llvm::CallInst *inst) |
template<typename N > | |
void | cmpge (llvm::CallInst *inst, bool reverse=false) |
template<typename N > | |
void | rcmpge (llvm::CallInst *inst) |
template<> | |
llvm::Value * | getOp0 (llvm::CallInst *call) |
template<> | |
llvm::Value * | getOp0 (llvm::CallInst *call) |
template<> | |
llvm::Value * | getOp1 (llvm::CallInst *call) |
template<> | |
llvm::Value * | getOp1 (llvm::CallInst *call) |
template<> | |
llvm::Value * | getRes0 (llvm::CallInst *call, llvm::Value *res) |
template<> | |
llvm::Value * | getRes0 (llvm::CallInst *call, llvm::Value *res) |
Private Attributes | |
llvm::GlobalVariable * | op0Single = nullptr |
llvm::GlobalVariable * | op0Double = nullptr |
llvm::GlobalVariable * | op1Single = nullptr |
llvm::GlobalVariable * | op1Double = nullptr |
llvm::GlobalVariable * | res0Single = nullptr |
llvm::GlobalVariable * | res0Double = nullptr |
llvm::GlobalVariable * | res1Single = nullptr |
llvm::GlobalVariable * | res1Double = nullptr |
void retdec::bin2llvmir::IdiomsLibgccImpl::addf | ( | llvm::CallInst * | inst | ) |
float: reg0 = reg0 + reg1 double: reg0:reg1 = reg0:reg1 + reg2:reg3
void retdec::bin2llvmir::IdiomsLibgccImpl::addi | ( | llvm::CallInst * | inst | ) |
i32: reg0 = reg0 + reg1 i64: reg0:reg1 = reg0:reg1 + reg2:reg3
void retdec::bin2llvmir::IdiomsLibgccImpl::aeabi_idivmod | ( | llvm::CallInst * | inst | ) |
i32 (unsigned): reg0 = reg0 / reg1 reg1 = reg0 % reg1 i64 (unsigned): reg0:reg1 = reg0:reg1 / reg2:reg3 reg2:reg3 = reg0:reg1 % reg2:reg3 // result reg4:reg5 ???
void retdec::bin2llvmir::IdiomsLibgccImpl::ashldi3 | ( | llvm::CallInst * | inst | ) |
i64: reg0:reg1 = reg0:reg1 << reg2
void retdec::bin2llvmir::IdiomsLibgccImpl::ashrdi3 | ( | llvm::CallInst * | inst | ) |
i64: reg0:reg1 = reg0:reg1 (arithmetic) >> reg2
void retdec::bin2llvmir::IdiomsLibgccImpl::cmpdi2 | ( | llvm::CallInst * | inst | ) |
void retdec::bin2llvmir::IdiomsLibgccImpl::cmpf | ( | llvm::CallInst * | inst, |
bool | revert = false |
||
) |
float: if (reg0 > reg1) reg0 = 1 else if (reg0 < reg1) reg0 = -1 else // equal reg0 = 0
double: if (reg0:reg1 > reg2:reg3) reg0 = 1 else if (reg0:reg1 < reg2:reg3) reg0 = -1 else // equal reg0 = 0
==>
a = (reg0 > reg1) b = (reg0 == reg1) c = select a, 1, -1 d = select b, 0, c store d, reg0
void retdec::bin2llvmir::IdiomsLibgccImpl::cmpge | ( | llvm::CallInst * | inst, |
bool | reverse = false |
||
) |
aeabi_fcmpge()/aeabi_dcmpge()/aeabi_fcmple()/aeabi_dcmple()
if (a ?? b) a = 1 else b = 0
where a, b is reg or reg pair depending on df and ?? is >= or <= for reverse == true
void retdec::bin2llvmir::IdiomsLibgccImpl::divf | ( | llvm::CallInst * | inst | ) |
float: reg0 = reg0 / reg0 double: reg0:reg1 = reg0:reg1 / reg2:reg3
void retdec::bin2llvmir::IdiomsLibgccImpl::divi | ( | llvm::CallInst * | inst | ) |
i32: reg0 = reg0 / reg1 i64: reg0:reg1 = reg0:reg1 / reg2:reg3
void retdec::bin2llvmir::IdiomsLibgccImpl::double2float | ( | llvm::CallInst * | inst | ) |
double -> float
void retdec::bin2llvmir::IdiomsLibgccImpl::eqf | ( | llvm::CallInst * | inst | ) |
eqdf2()/eqsf2() df: if (reg0:reg1 == reg2:reg3) reg0 = 1 else reg0 = 0 sf: if (reg0 == reg1) reg0 = 1 else reg0 = 0
void retdec::bin2llvmir::IdiomsLibgccImpl::float2double | ( | llvm::CallInst * | inst | ) |
float -> double
void retdec::bin2llvmir::IdiomsLibgccImpl::fp2si32 | ( | llvm::CallInst * | inst | ) |
float: float -> i32 (signed) double: double -> i32 (signed)
void retdec::bin2llvmir::IdiomsLibgccImpl::fp2si64 | ( | llvm::CallInst * | inst | ) |
float: float -> i64 (signed) double: double -> i64 (signed)
void retdec::bin2llvmir::IdiomsLibgccImpl::fp2ui32 | ( | llvm::CallInst * | inst | ) |
float: float -> i32 (unsigned) double: double -> i32 (unsigned)
void retdec::bin2llvmir::IdiomsLibgccImpl::fp2ui64 | ( | llvm::CallInst * | inst | ) |
float: float -> i64 (unsigned) double: double -> i64 (unsigned)
void retdec::bin2llvmir::IdiomsLibgccImpl::gef | ( | llvm::CallInst * | inst | ) |
gedf2()/gesf2() df: if (reg0:reg1 == reg2:reg3) reg0 = 0 else if (reg0:reg1 > reg2:reg3) reg0 = 1 else if (reg0:reg1 < reg2:reg3) reg0 = -1 sf: if (reg0 == reg1) reg0 = 0 else if (reg0 > reg1) reg0 = 1 else if (reg0 < reg1) reg0 = -1
same as cmpf() but reverted operands.
|
inline |
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getOp0 | ( | llvm::CallInst * | call | ) |
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getOp0 | ( | llvm::CallInst * | call | ) |
|
inline |
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getOp1 | ( | llvm::CallInst * | call | ) |
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getOp1 | ( | llvm::CallInst * | call | ) |
|
inline |
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getRes0 | ( | llvm::CallInst * | call, |
llvm::Value * | res | ||
) |
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getRes0 | ( | llvm::CallInst * | call, |
llvm::Value * | res | ||
) |
|
inline |
void retdec::bin2llvmir::IdiomsLibgccImpl::gtf | ( | llvm::CallInst * | inst, |
bool | reverse = false |
||
) |
gtdf2()/gtsf2() df: if (reg0:reg1 > reg2:reg3) reg0 = 1 else reg0 = 0 sf: if (reg0 > reg1) reg0 = 1 else reg0 = 0
void retdec::bin2llvmir::IdiomsLibgccImpl::ldivmoddi | ( | llvm::CallInst * | inst | ) |
i32 (signed): reg0 = reg0 / reg1 reg1 = reg0 % reg1 i64 (signed): reg0:reg1 = reg0:reg1 / reg2:reg3 reg2:reg3 = reg0:reg1 % reg2:reg3 // result reg4:reg5 ???
void retdec::bin2llvmir::IdiomsLibgccImpl::lef | ( | llvm::CallInst * | inst | ) |
ledf2()/lesf2()
void retdec::bin2llvmir::IdiomsLibgccImpl::log | ( | llvm::Instruction * | orig, |
std::initializer_list< llvm::Value * > | news | ||
) |
void retdec::bin2llvmir::IdiomsLibgccImpl::lshrdi3 | ( | llvm::CallInst * | inst | ) |
i64: reg0:reg1 = reg0:reg1 (logical) >> reg2
void retdec::bin2llvmir::IdiomsLibgccImpl::ltf | ( | llvm::CallInst * | inst | ) |
ltdf2()/ltsf2()
void retdec::bin2llvmir::IdiomsLibgccImpl::modi | ( | llvm::CallInst * | inst | ) |
i32: reg0 = reg0 % reg1 i64: reg0:reg1 = reg0:reg1 % reg2:reg3
void retdec::bin2llvmir::IdiomsLibgccImpl::mulf | ( | llvm::CallInst * | inst | ) |
float: reg0 = reg0 * reg0 double: reg0:reg1 = reg0:reg1 * reg2:reg3
void retdec::bin2llvmir::IdiomsLibgccImpl::muli | ( | llvm::CallInst * | inst | ) |
i64: reg0:reg1 = reg0:reg1 * reg2:reg3
void retdec::bin2llvmir::IdiomsLibgccImpl::nef | ( | llvm::CallInst * | inst | ) |
nedf2()/nesf2()
void retdec::bin2llvmir::IdiomsLibgccImpl::negf | ( | llvm::CallInst * | inst | ) |
float: reg0 = - reg0 double: reg0:regs1 = - reg0:regs1
void retdec::bin2llvmir::IdiomsLibgccImpl::negi | ( | llvm::CallInst * | inst | ) |
i32: reg0 = - reg0 i64: reg0:reg1 = - reg0:reg1
void retdec::bin2llvmir::IdiomsLibgccImpl::rcmpge | ( | llvm::CallInst * | inst | ) |
void retdec::bin2llvmir::IdiomsLibgccImpl::replaceResultUses | ( | llvm::CallInst * | c, |
llvm::Instruction * | r | ||
) |
void retdec::bin2llvmir::IdiomsLibgccImpl::si2double | ( | llvm::CallInst * | inst | ) |
i32 (signed): i32 -> double i64 (signed): i64 -> double
void retdec::bin2llvmir::IdiomsLibgccImpl::si2float | ( | llvm::CallInst * | inst | ) |
i32 (signed): i32 -> float i64 (signed): i64 -> float
void retdec::bin2llvmir::IdiomsLibgccImpl::subf | ( | llvm::CallInst * | inst | ) |
float: reg0 = reg0 - reg1 double: reg0:reg1 = reg0:reg1 - reg2:reg3
void retdec::bin2llvmir::IdiomsLibgccImpl::subi | ( | llvm::CallInst * | inst | ) |
i32: reg0 = reg0 - reg1 i64: reg0:reg1 = reg0:reg1 - reg2:reg3
void retdec::bin2llvmir::IdiomsLibgccImpl::subrf | ( | llvm::CallInst * | inst | ) |
float: reg0 = reg1 - reg0 double: reg0:reg1 = reg2:reg3 - reg0:reg1
bool retdec::bin2llvmir::IdiomsLibgccImpl::testArchAndInitialize | ( | common::Architecture & | arch, |
Abi * | abi | ||
) |
True
if analysis should continue, false
if there is nothing to do for the current architecture. void retdec::bin2llvmir::IdiomsLibgccImpl::ucmpdi2 | ( | llvm::CallInst * | inst | ) |
ucmpdi2() if (reg0:reg1 < reg2:reg3) reg0 = 0 else if (reg0:reg1 == reg2:reg3) reg0 = 1 else if (reg0:reg1 > reg2:reg3) reg0 = 2
void retdec::bin2llvmir::IdiomsLibgccImpl::udivi | ( | llvm::CallInst * | inst | ) |
i32: reg0 = reg0 / reg1 i64: reg0:reg1 = reg0:reg1 / reg2:reg3
void retdec::bin2llvmir::IdiomsLibgccImpl::ui2double | ( | llvm::CallInst * | inst | ) |
i32 (unsigned): i32 -> double i64 (unsigned): i64 -> double
void retdec::bin2llvmir::IdiomsLibgccImpl::ui2float | ( | llvm::CallInst * | inst | ) |
i32 (unsigned): i32 -> float i64 (unsigned): i64 -> float
void retdec::bin2llvmir::IdiomsLibgccImpl::umodi | ( | llvm::CallInst * | inst | ) |
i32: reg0 = reg0 % reg1 i64: reg0:reg01 = reg0:reg01 % reg2:reg03
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |