retdec
Public Member Functions | Private Attributes | List of all members
retdec::bin2llvmir::IdiomsLibgccImpl Class Reference

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
 

Member Function Documentation

◆ addf()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::addf ( llvm::CallInst *  inst)

float: reg0 = reg0 + reg1 double: reg0:reg1 = reg0:reg1 + reg2:reg3

◆ addi()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::addi ( llvm::CallInst *  inst)

i32: reg0 = reg0 + reg1 i64: reg0:reg1 = reg0:reg1 + reg2:reg3

◆ aeabi_idivmod()

template<typename N >
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 ???

◆ ashldi3()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::ashldi3 ( llvm::CallInst *  inst)

i64: reg0:reg1 = reg0:reg1 << reg2

◆ ashrdi3()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::ashrdi3 ( llvm::CallInst *  inst)

i64: reg0:reg1 = reg0:reg1 (arithmetic) >> reg2

◆ cmpdi2()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::cmpdi2 ( llvm::CallInst *  inst)

cmpdi2() if (reg0:reg1 > reg2:reg3) reg0 = 1 else if (reg0:reg1 < reg2:reg3) reg0 = -1 else // equal reg0 = 0

same as cmpf() but with (long?) integers.

TODO: google these functions, it looks like: __aeabi_lcmp() = __cmpdi2() - 1

◆ cmpf()

template<typename N >
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

◆ cmpge()

template<typename N >
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

◆ divf()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::divf ( llvm::CallInst *  inst)

float: reg0 = reg0 / reg0 double: reg0:reg1 = reg0:reg1 / reg2:reg3

◆ divi()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::divi ( llvm::CallInst *  inst)

i32: reg0 = reg0 / reg1 i64: reg0:reg1 = reg0:reg1 / reg2:reg3

◆ double2float()

void retdec::bin2llvmir::IdiomsLibgccImpl::double2float ( llvm::CallInst *  inst)

double -> float

◆ eqf()

template<typename N >
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

◆ float2double()

void retdec::bin2llvmir::IdiomsLibgccImpl::float2double ( llvm::CallInst *  inst)

float -> double

◆ fp2si32()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::fp2si32 ( llvm::CallInst *  inst)

float: float -> i32 (signed) double: double -> i32 (signed)

◆ fp2si64()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::fp2si64 ( llvm::CallInst *  inst)

float: float -> i64 (signed) double: double -> i64 (signed)

◆ fp2ui32()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::fp2ui32 ( llvm::CallInst *  inst)

float: float -> i32 (unsigned) double: double -> i32 (unsigned)

◆ fp2ui64()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::fp2ui64 ( llvm::CallInst *  inst)

float: float -> i64 (unsigned) double: double -> i64 (unsigned)

◆ gef()

template<typename N >
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.

◆ getOp0() [1/3]

template<typename N >
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getOp0 ( llvm::CallInst *  call)
inline

◆ getOp0() [2/3]

template<>
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getOp0 ( llvm::CallInst *  call)

◆ getOp0() [3/3]

template<>
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getOp0 ( llvm::CallInst *  call)

◆ getOp1() [1/3]

template<typename N >
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getOp1 ( llvm::CallInst *  call)
inline

◆ getOp1() [2/3]

template<>
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getOp1 ( llvm::CallInst *  call)

◆ getOp1() [3/3]

template<>
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getOp1 ( llvm::CallInst *  call)

◆ getRes0() [1/3]

template<typename N >
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getRes0 ( llvm::CallInst *  call,
llvm::Value *  res 
)
inline

◆ getRes0() [2/3]

template<>
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getRes0 ( llvm::CallInst *  call,
llvm::Value *  res 
)

◆ getRes0() [3/3]

template<>
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getRes0 ( llvm::CallInst *  call,
llvm::Value *  res 
)

◆ getRes1()

template<typename N >
llvm::Value* retdec::bin2llvmir::IdiomsLibgccImpl::getRes1 ( llvm::CallInst *  call,
llvm::Value *  res 
)
inline

◆ gtf()

template<typename N >
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

◆ ldivmoddi()

template<typename N >
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 ???

◆ lef()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::lef ( llvm::CallInst *  inst)

ledf2()/lesf2()

◆ log()

void retdec::bin2llvmir::IdiomsLibgccImpl::log ( llvm::Instruction *  orig,
std::initializer_list< llvm::Value * >  news 
)

◆ lshrdi3()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::lshrdi3 ( llvm::CallInst *  inst)

i64: reg0:reg1 = reg0:reg1 (logical) >> reg2

◆ ltf()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::ltf ( llvm::CallInst *  inst)

ltdf2()/ltsf2()

◆ modi()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::modi ( llvm::CallInst *  inst)

i32: reg0 = reg0 % reg1 i64: reg0:reg1 = reg0:reg1 % reg2:reg3

◆ mulf()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::mulf ( llvm::CallInst *  inst)

float: reg0 = reg0 * reg0 double: reg0:reg1 = reg0:reg1 * reg2:reg3

◆ muli()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::muli ( llvm::CallInst *  inst)

i64: reg0:reg1 = reg0:reg1 * reg2:reg3

◆ nef()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::nef ( llvm::CallInst *  inst)

nedf2()/nesf2()

◆ negf()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::negf ( llvm::CallInst *  inst)

float: reg0 = - reg0 double: reg0:regs1 = - reg0:regs1

◆ negi()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::negi ( llvm::CallInst *  inst)

i32: reg0 = - reg0 i64: reg0:reg1 = - reg0:reg1

◆ rcmpge()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::rcmpge ( llvm::CallInst *  inst)

◆ replaceResultUses()

void retdec::bin2llvmir::IdiomsLibgccImpl::replaceResultUses ( llvm::CallInst *  c,
llvm::Instruction *  r 
)

◆ si2double()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::si2double ( llvm::CallInst *  inst)

i32 (signed): i32 -> double i64 (signed): i64 -> double

◆ si2float()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::si2float ( llvm::CallInst *  inst)

i32 (signed): i32 -> float i64 (signed): i64 -> float

◆ subf()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::subf ( llvm::CallInst *  inst)

float: reg0 = reg0 - reg1 double: reg0:reg1 = reg0:reg1 - reg2:reg3

◆ subi()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::subi ( llvm::CallInst *  inst)

i32: reg0 = reg0 - reg1 i64: reg0:reg1 = reg0:reg1 - reg2:reg3

◆ subrf()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::subrf ( llvm::CallInst *  inst)

float: reg0 = reg1 - reg0 double: reg0:reg1 = reg2:reg3 - reg0:reg1

◆ testArchAndInitialize()

bool retdec::bin2llvmir::IdiomsLibgccImpl::testArchAndInitialize ( common::Architecture arch,
Abi abi 
)
Returns
True if analysis should continue, false if there is nothing to do for the current architecture.

◆ ucmpdi2()

template<typename N >
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

◆ udivi()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::udivi ( llvm::CallInst *  inst)

i32: reg0 = reg0 / reg1 i64: reg0:reg1 = reg0:reg1 / reg2:reg3

◆ ui2double()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::ui2double ( llvm::CallInst *  inst)

i32 (unsigned): i32 -> double i64 (unsigned): i64 -> double

◆ ui2float()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::ui2float ( llvm::CallInst *  inst)

i32 (unsigned): i32 -> float i64 (unsigned): i64 -> float

◆ umodi()

template<typename N >
void retdec::bin2llvmir::IdiomsLibgccImpl::umodi ( llvm::CallInst *  inst)

i32: reg0 = reg0 % reg1 i64: reg0:reg01 = reg0:reg01 % reg2:reg03

Member Data Documentation

◆ op0Double

llvm::GlobalVariable* retdec::bin2llvmir::IdiomsLibgccImpl::op0Double = nullptr
private

◆ op0Single

llvm::GlobalVariable* retdec::bin2llvmir::IdiomsLibgccImpl::op0Single = nullptr
private

◆ op1Double

llvm::GlobalVariable* retdec::bin2llvmir::IdiomsLibgccImpl::op1Double = nullptr
private

◆ op1Single

llvm::GlobalVariable* retdec::bin2llvmir::IdiomsLibgccImpl::op1Single = nullptr
private

◆ res0Double

llvm::GlobalVariable* retdec::bin2llvmir::IdiomsLibgccImpl::res0Double = nullptr
private

◆ res0Single

llvm::GlobalVariable* retdec::bin2llvmir::IdiomsLibgccImpl::res0Single = nullptr
private

◆ res1Double

llvm::GlobalVariable* retdec::bin2llvmir::IdiomsLibgccImpl::res1Double = nullptr
private

◆ res1Single

llvm::GlobalVariable* retdec::bin2llvmir::IdiomsLibgccImpl::res1Single = nullptr
private

The documentation for this class was generated from the following file: