diff options
author | Chris Lattner <sabre@nondot.org> | 2005-01-02 02:28:31 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-01-02 02:28:31 +0000 |
commit | 15f63ad2e59998f0bf1a3a23547582074391f650 (patch) | |
tree | b1d599d1881fe25a275e04e7ded30a811f0ff487 | |
parent | 273f2280f2218dd73e01edbaf09d02000d6726dd (diff) |
Add some bits that can be set on instructions. Renumber existing bits so
they are dense. Add a virtual method that targets can choose to implement.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19242 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Target/TargetInstrInfo.h | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/include/llvm/Target/TargetInstrInfo.h b/include/llvm/Target/TargetInstrInfo.h index 7fddde5a1d..855ce86ed0 100644 --- a/include/llvm/Target/TargetInstrInfo.h +++ b/include/llvm/Target/TargetInstrInfo.h @@ -50,16 +50,27 @@ const unsigned M_RET_FLAG = 1 << 3; const unsigned M_BARRIER_FLAG = 1 << 4; const unsigned M_DELAY_SLOT_FLAG = 1 << 5; const unsigned M_CC_FLAG = 1 << 6; -const unsigned M_LOAD_FLAG = 1 << 10; -const unsigned M_STORE_FLAG = 1 << 12; -// 3-addr instructions which really work like 2-addr ones, eg. X86 add/sub -const unsigned M_2_ADDR_FLAG = 1 << 15; +const unsigned M_LOAD_FLAG = 1 << 7; +const unsigned M_STORE_FLAG = 1 << 8; + +// M_2_ADDR_FLAG - 3-addr instructions which really work like 2-addr ones. +const unsigned M_2_ADDR_FLAG = 1 << 9; + +// M_CONVERTIBLE_TO_3_ADDR - This is a M_2_ADDR_FLAG instruction which can be +// changed into a 3-address instruction if the first two operands cannot be +// assigned to the same register. The target must implement the +// TargetInstrInfo::convertToThreeAddress method for this instruction. +const unsigned M_CONVERTIBLE_TO_3_ADDR = 1 << 10; + +// This M_COMMUTABLE - is a 2- or 3-address instruction (of the form X = op Y, +// Z), which produces the same result if Y and Z are exchanged. +const unsigned M_COMMUTABLE = 1 << 11; // M_TERMINATOR_FLAG - Is this instruction part of the terminator for a basic // block? Typically this is things like return and branch instructions. // Various passes use this to insert code into the bottom of a basic block, but // before control flow occurs. -const unsigned M_TERMINATOR_FLAG = 1 << 16; +const unsigned M_TERMINATOR_FLAG = 1 << 12; class TargetInstrDescriptor { public: @@ -152,6 +163,20 @@ public: return false; } + /// convertToThreeAddress - This method must be implemented by targets that + /// set the M_CONVERTIBLE_TO_3_ADDR flag. When this flag is set, the target + /// may be able to convert a two-address instruction into a true + /// three-address instruction on demand. This allows the X86 target (for + /// example) to convert ADD and SHL instructions into LEA instructions if they + /// would require register copies due to two-addressness. + /// + /// This method returns a null pointer if the transformation cannot be + /// performed, otherwise it returns the new instruction. + /// + virtual MachineInstr *convertToThreeAddress(MachineInstr *TA) const { + return 0; + } + /// Insert a goto (unconditional branch) sequence to TMBB, at the /// end of MBB virtual void insertGoto(MachineBasicBlock& MBB, |