retdec
idioms_magicdivmod.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_BIN2LLVMIR_OPTIMIZATIONS_IDIOMS_IDIOMS_MAGICDIVMOD_H
8 #define RETDEC_BIN2LLVMIR_OPTIMIZATIONS_IDIOMS_IDIOMS_MAGICDIVMOD_H
9 
11 
12 namespace retdec {
13 namespace bin2llvmir {
14 
23 class IdiomsMagicDivMod: virtual public IdiomsAbstract {
24  friend class IdiomsAnalysis;
25 
26 private:
27  static unsigned divisorByMagicNumberUnsigned(unsigned magic_number, unsigned sh_pre, unsigned sh_post);
28  static unsigned divisorByMagicNumberUnsigned2(unsigned magic_number, unsigned sh_post);
29  static int divisorByMagicNumberSigned(int magic_number, unsigned sh_post);
30  static int divisorByMagicNumberSigned2(int magic_number, unsigned sh_post);
31  static unsigned divisorByMagicNumberSigned3(unsigned magic_number, unsigned shift);
32  static unsigned divisorByMagicNumberSigned4(unsigned magic_number, unsigned shift);
33 
34  llvm::Instruction * magicSignedDiv7(llvm::BasicBlock::iterator iter, bool negative) const;
35  llvm::Instruction * magicSignedDiv8(llvm::BasicBlock::iterator iter, bool negative) const;
36 protected:
37  llvm::Instruction * magicUnsignedDiv1(llvm::BasicBlock::iterator iter) const;
38  llvm::Instruction * magicUnsignedDiv2(llvm::BasicBlock::iterator iter) const;
39  llvm::Instruction * magicSignedDiv1(llvm::BasicBlock::iterator iter) const;
40  llvm::Instruction * magicSignedDiv2(llvm::BasicBlock::iterator iter) const;
41  llvm::Instruction * magicSignedDiv3(llvm::BasicBlock::iterator iter) const;
42  llvm::Instruction * magicSignedDiv4(llvm::BasicBlock::iterator iter) const;
43  llvm::Instruction * magicSignedDiv5(llvm::BasicBlock::iterator iter) const;
44  llvm::Instruction * magicSignedDiv6(llvm::BasicBlock::iterator iter) const;
45  llvm::Instruction * magicSignedDiv7pos(llvm::BasicBlock::iterator iter) const;
46  llvm::Instruction * magicSignedDiv7neg(llvm::BasicBlock::iterator iter) const;
47  llvm::Instruction * magicSignedDiv8pos(llvm::BasicBlock::iterator iter) const;
48  llvm::Instruction * magicSignedDiv8neg(llvm::BasicBlock::iterator iter) const;
49 
50  llvm::Instruction * signedMod1(llvm::BasicBlock::iterator iter) const;
51  llvm::Instruction * signedMod2(llvm::BasicBlock::iterator iter) const;
52  llvm::Instruction * unsignedMod(llvm::BasicBlock::iterator iter) const;
53 };
54 
55 } // namespace bin2llvmir
56 } // namespace retdec
57 
58 #endif
Instruction idiom analysis abstract class.
Definition: idioms_abstract.h:22
Definition: idioms_analysis.h:41
Division and modulo using magic number.
Definition: idioms_magicdivmod.h:23
static unsigned divisorByMagicNumberUnsigned(unsigned magic_number, unsigned sh_pre, unsigned sh_post)
Definition: idioms_magicdivmod.cpp:25
static unsigned divisorByMagicNumberSigned4(unsigned magic_number, unsigned shift)
Definition: idioms_magicdivmod.cpp:164
static unsigned divisorByMagicNumberUnsigned2(unsigned magic_number, unsigned sh_post)
Definition: idioms_magicdivmod.cpp:66
llvm::Instruction * magicSignedDiv3(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:595
llvm::Instruction * magicSignedDiv8pos(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:1440
llvm::Instruction * magicUnsignedDiv2(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:264
llvm::Instruction * signedMod2(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:1595
llvm::Instruction * magicSignedDiv2(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:493
llvm::Instruction * magicSignedDiv8neg(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:1456
static int divisorByMagicNumberSigned(int magic_number, unsigned sh_post)
Definition: idioms_magicdivmod.cpp:105
llvm::Instruction * magicUnsignedDiv1(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:187
llvm::Instruction * magicSignedDiv7pos(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:1284
static int divisorByMagicNumberSigned2(int magic_number, unsigned sh_post)
Definition: idioms_magicdivmod.cpp:123
llvm::Instruction * magicSignedDiv1(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:386
llvm::Instruction * magicSignedDiv5(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:810
llvm::Instruction * signedMod1(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:1474
llvm::Instruction * magicSignedDiv7(llvm::BasicBlock::iterator iter, bool negative) const
Definition: idioms_magicdivmod.cpp:994
llvm::Instruction * magicSignedDiv8(llvm::BasicBlock::iterator iter, bool negative) const
Definition: idioms_magicdivmod.cpp:1321
llvm::Instruction * magicSignedDiv4(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:700
static unsigned divisorByMagicNumberSigned3(unsigned magic_number, unsigned shift)
Definition: idioms_magicdivmod.cpp:142
llvm::Instruction * magicSignedDiv7neg(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:1300
llvm::Instruction * unsignedMod(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:1712
llvm::Instruction * magicSignedDiv6(llvm::BasicBlock::iterator iter) const
Definition: idioms_magicdivmod.cpp:903
Instruction idioms analysis abstract class.
The frontend-end part of the decompiler.
Definition: archive_wrapper.h:19