diff options
author | Anshuman Dasgupta <adasgupt@codeaurora.org> | 2011-12-01 21:10:21 +0000 |
---|---|---|
committer | Anshuman Dasgupta <adasgupt@codeaurora.org> | 2011-12-01 21:10:21 +0000 |
commit | dc81e5da271ed394e2029c83458773c4ae2fc5f4 (patch) | |
tree | 60e5798064500b46b1da5386e7e2413d73c8855b /include/llvm/CodeGen/DFAPacketizer.h | |
parent | 18c7ec1344b14c9a483b89f7ee73fba1cbdb2a38 (diff) |
Add a deterministic finite automaton based packetizer for VLIW architectures
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145629 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/CodeGen/DFAPacketizer.h')
-rw-r--r-- | include/llvm/CodeGen/DFAPacketizer.h | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/include/llvm/CodeGen/DFAPacketizer.h b/include/llvm/CodeGen/DFAPacketizer.h new file mode 100644 index 0000000000..38a899fa45 --- /dev/null +++ b/include/llvm/CodeGen/DFAPacketizer.h @@ -0,0 +1,78 @@ +//=- llvm/CodeGen/DFAPacketizer.h - DFA Packetizer for VLIW ---*- C++ -*-=====// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// This class implements a deterministic finite automaton (DFA) based +// packetizing mechanism for VLIW architectures. It provides APIs to +// determine whether there exists a legal mapping of instructions to +// functional unit assignments in a packet. The DFA is auto-generated from +// the target's Schedule.td file. +// +// A DFA consists of 3 major elements: states, inputs, and transitions. For +// the packetizing mechanism, the input is the set of instruction classes for +// a target. The state models all possible combinations of functional unit +// consumption for a given set of instructions in a packet. A transition +// models the addition of an instruction to a packet. In the DFA constructed +// by this class, if an instruction can be added to a packet, then a valid +// transition exists from the corresponding state. Invalid transitions +// indicate that the instruction cannot be added to the current packet. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CODEGEN_DFAPACKETIZER_H +#define LLVM_CODEGEN_DFAPACKETIZER_H + +#include "llvm/ADT/DenseMap.h" + +namespace llvm { + +class MCInstrDesc; +class MachineInstr; +class InstrItineraryData; + +class DFAPacketizer { +private: + typedef std::pair<unsigned, unsigned> UnsignPair; + const InstrItineraryData *InstrItins; + int CurrentState; + const int (*DFAStateInputTable)[2]; + const unsigned *DFAStateEntryTable; + + // CachedTable is a map from <FromState, Input> to ToState + DenseMap<UnsignPair, unsigned> CachedTable; + + // ReadTable - Read the DFA transition table and update CachedTable + void ReadTable(unsigned int state); + +public: + DFAPacketizer(const InstrItineraryData* I, const int (*SIT)[2], + const unsigned* SET); + + // Reset the current state to make all resources available + void clearResources() { + CurrentState = 0; + } + + // canReserveResources - Check if the resources occupied by a MCInstrDesc + // are available in the current state + bool canReserveResources(const llvm::MCInstrDesc* MID); + + // reserveResources - Reserve the resources occupied by a MCInstrDesc and + // change the current state to reflect that change + void reserveResources(const llvm::MCInstrDesc* MID); + + // canReserveResources - Check if the resources occupied by a machine + // instruction are available in the current state + bool canReserveResources(llvm::MachineInstr* MI); + + // reserveResources - Reserve the resources occupied by a machine + // instruction and change the current state to reflect that change + void reserveResources(llvm::MachineInstr* MI); +}; +} + +#endif |